| 
 | 1 | +#pragma once  | 
 | 2 | + | 
 | 3 | +#include "geometry/expression_template.hpp"  | 
 | 4 | +#include "geometry/src/common_algebra_type.hpp"  | 
 | 5 | +#include "geometry/src/detail/multivector_product.hpp"  | 
 | 6 | +#include "geometry/src/detail/pending_dimensions_list.hpp"  | 
 | 7 | +#include "geometry/type_metaprogramming.hpp"  | 
 | 8 | + | 
 | 9 | +#include <type_traits>  | 
 | 10 | + | 
 | 11 | +namespace geometry {  | 
 | 12 | +namespace detail {  | 
 | 13 | + | 
 | 14 | +inline constexpr class  | 
 | 15 | +{  | 
 | 16 | +public:  | 
 | 17 | +  template <  | 
 | 18 | +      class T1,  | 
 | 19 | +      class T2,  | 
 | 20 | +      class D1 = std::decay_t<typename T1::eval_type>,  | 
 | 21 | +      class D2 = std::decay_t<typename T2::eval_type>,  | 
 | 22 | +      class Algebra = common_algebra_type_t<D1, D2>,  | 
 | 23 | +      class L = detail::pending_dimensions_list_t<D1, D2>,  | 
 | 24 | +      class R =  | 
 | 25 | +          typename tmp::convert_to_sequence_t<L, Algebra::template reified_blade>::type,  | 
 | 26 | +      int k = tmp::convert_to_sequence_t<  | 
 | 27 | +          L,  | 
 | 28 | +          Algebra::template reified_blade_coefficient>::value>  | 
 | 29 | +  constexpr auto  | 
 | 30 | +  operator()(expression_template::op<expression_template::multiplies, T1, T2>)  | 
 | 31 | +      const -> std::bool_constant<  | 
 | 32 | +          (R::grade !=  | 
 | 33 | +           std::max(D1::grade, D2::grade) - std::min(D1::grade, D2::grade)) or  | 
 | 34 | +          (k == 0)>  | 
 | 35 | +  {  | 
 | 36 | +    return {};  | 
 | 37 | +  }  | 
 | 38 | +} non_grade_contracting{};  | 
 | 39 | + | 
 | 40 | +}  // namespace detail  | 
 | 41 | + | 
 | 42 | +/// interior product  | 
 | 43 | +///  | 
 | 44 | +/// @{  | 
 | 45 | + | 
 | 46 | +inline constexpr auto interior_product =  //  | 
 | 47 | +    detail::multivector_product_with(     //  | 
 | 48 | +        detail::non_grade_contracting,  | 
 | 49 | +        [](auto algebra) {  | 
 | 50 | +          return typename decltype(algebra)::template blade<>{};  | 
 | 51 | +        });  | 
 | 52 | + | 
 | 53 | +template <class T1, class T2, class A = common_algebra_type_t<T1, T2>>  | 
 | 54 | +[[nodiscard]]  | 
 | 55 | +constexpr auto  | 
 | 56 | +operator|(const T1& x, const T2& y)  | 
 | 57 | +{  | 
 | 58 | +  return interior_product(x, y);  | 
 | 59 | +}  | 
 | 60 | + | 
 | 61 | +/// @}  | 
 | 62 | + | 
 | 63 | +}  // namespace geometry  | 
0 commit comments