16 #ifndef OPENKALMAN_INDEXIBLE_OBJECT_TRAITS_BASE_HPP 17 #define OPENKALMAN_INDEXIBLE_OBJECT_TRAITS_BASE_HPP 19 #include <type_traits> 26 template<Eigen3::eigen_general T>
27 struct indexible_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())>>>
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()};
152 #endif //OPENKALMAN_INDEXIBLE_OBJECT_TRAITS_BASE_HPP constexpr auto count_indices(const T &t)
Get the number of indices available to address the components of an indexible object.
Definition: count_indices.hpp:33
Row-major storage (C or C++ style): contiguous storage in which the right-most index has a stride of ...
Trait object providing get and set routines.
Definition: eigen-forward-declarations.hpp:502
Definition: tuple_reverse.hpp:103
constexpr bool value
T is numerical value or is reducible to a numerical value.
Definition: value.hpp:31
Column-major storage (Fortran, Matlab, or Eigen style): contiguous storage in which the left-most ext...
Definition: eigen-forward-declarations.hpp:22
A generalization of the above: a custom stride is specified for each index.
Layout
The layout format of a multidimensional array.
Definition: global-definitions.hpp:47
constexpr bool index
T is an index value.
Definition: index.hpp:56
constexpr auto get_vector_space_descriptor(const T &t, const N &n)
Get the coordinates::pattern object for index N of indexible object T.
Definition: get_vector_space_descriptor.hpp:56