16 #ifndef OPENKALMAN_OBJECT_TRAITS_BASE_HPP 17 #define OPENKALMAN_OBJECT_TRAITS_BASE_HPP 19 #include <type_traits> 26 template<Eigen3::eigen_general T>
27 struct object_traits_base<T>
35 using IndexType =
typename T::Index;
39 using scalar_type =
typename T::Scalar;
42 template<
typename Arg>
46 constexpr
bool lin = (Eigen::internal::evaluator<Arg>::Flags & Eigen::LinearAccessBit) != 0x0;
47 if constexpr (Arg::RowsAtCompileTime == 1 and Arg::ColsAtCompileTime == 1)
48 return std::integral_constant<std::size_t, 0_uz>{};
49 else if constexpr (Arg::ColsAtCompileTime == 1 and lin)
50 return std::integral_constant<std::size_t, 1_uz>{};
52 return std::integral_constant<std::size_t, 2_uz>{};
56 template<
typename Arg,
typename N>
60 if constexpr (values::fixed<N>)
62 constexpr
auto dim = n == 0_uz ? Arg::RowsAtCompileTime : Arg::ColsAtCompileTime;
64 if constexpr (dim == Eigen::Dynamic)
66 if constexpr (n == 0_uz)
return static_cast<std::size_t
>(arg.rows());
67 else return static_cast<std::size_t
>(arg.cols());
69 else return Dimensions<static_cast<std::size_t>(dim)>{};
73 if (n == 0_uz)
return static_cast<std::size_t
>(arg.rows());
74 else return static_cast<std::size_t
>(arg.cols());
81 static constexpr
bool row_major = (Eigen::internal::traits<T>::Flags & Eigen::RowMajorBit) != 0x0;
83 static constexpr
bool direct_access = (Eigen::internal::traits<T>::Flags & Eigen::DirectAccessBit) != 0x0;
85 static constexpr
bool lvalue_access = (Eigen::internal::traits<T>::Flags & Eigen::LvalueBit) != 0x0;
90 static constexpr
bool is_writable = lvalue_access and direct_access;
93 #ifdef __cpp_lib_concepts 94 template<
typename Arg> requires requires(Arg&& arg) { {*std::forward<Arg>(arg).data()} -> values::scalar; } and direct_access
96 template<
typename Arg, std::enable_if_t<values::scalar<decltype(*std::declval<Arg&&>().data())> and direct_access,
int> = 0>
98 static constexpr decltype(
auto)
99 raw_data(Arg&& arg) {
return std::forward<Arg>(arg).data(); }
103 #ifdef __cpp_lib_concepts 106 template<
typename U,
typename =
void>
108 struct has_strides : std::false_type {};
111 #ifdef __cpp_lib_concepts 113 struct has_strides<U>
116 struct has_strides<U, std::enable_if_t<values::index<decltype(std::declval<U>().innerStride())> and
117 values::index<decltype(std::declval<U>().outerStride())>>>
123 static constexpr data_layout layout =
has_strides<T>::value and direct_access ? data_layout::stride : row_major ? data_layout::right : data_layout::left;
126 #ifdef __cpp_lib_concepts 129 template<
typename Arg, std::enable_if_t<Eigen3::eigen_dense_general<Arg> and has_str
ides<T>::value,
int> = 0>
134 constexpr
auto outer = Eigen::internal::traits<T>::OuterStrideAtCompileTime;
135 constexpr
auto inner = Eigen::internal::traits<T>::InnerStrideAtCompileTime;
136 if constexpr (outer != Eigen::Dynamic and inner != Eigen::Dynamic)
137 return std::tuple {std::integral_constant<std::ptrdiff_t, outer>{}, std::integral_constant<std::ptrdiff_t, inner>{}};
138 else if constexpr (outer != Eigen::Dynamic and inner == Eigen::Dynamic)
139 return std::tuple {std::integral_constant<std::ptrdiff_t, outer>{}, arg.innerStride()};
140 else if constexpr (outer == Eigen::Dynamic and inner != Eigen::Dynamic)
141 return std::tuple {arg.outerStride(), std::integral_constant<std::ptrdiff_t, inner>{}};
143 return std::tuple {arg.outerStride(), arg.innerStride()};
constexpr auto count_indices(const T &)
Get the number of indices necessary to address all the components of an indexible object...
Definition: count_indices.hpp:51
decltype(auto) constexpr get_pattern_collection(T &&t)
Get the coordinates::pattern_collection associated with indexible object T.
Definition: get_pattern_collection.hpp:59
constexpr bool value
T is a fixed or dynamic value that is reducible to a number.
Definition: value.hpp:45
Trait object providing get and set routines.
Definition: eigen-forward-declarations.hpp:502
Definition: eigen-forward-declarations.hpp:22
constexpr bool index
T is an index value.
Definition: index.hpp:62