16 #ifndef OPENKALMAN_DIMENSIONS_HPP 17 #define OPENKALMAN_DIMENSIONS_HPP 21 #include "coordinates/interfaces/coordinate_descriptor_traits.hpp" 41 template<std::
size_t N = stdex::dynamic_extent>
50 template<eucl
idean_pattern D> requires
52 (not std::same_as<D, Dimensions>)
54 template<
typename D, std::enable_if_t<
55 euclidean_pattern<D> and
56 values::fixed_value_compares_with<dimension_of<D>, N> and
57 not std::is_same_v<D, Dimensions>,
int> = 0>
62 template<
typename Int>
63 explicit constexpr
operator std::integral_constant<Int, N>()
65 return std::integral_constant<Int, N>{};
70 template<std::
integral Int>
72 template<
typename Int, std::enable_if_t<std::is_
integral_v<Int>,
int> = 0>
74 explicit constexpr
operator Int()
95 template<eucl
idean_pattern D> requires (not std::same_as<D, Dimensions>)
97 template<
typename D, std::enable_if_t<eucl
idean_pattern<D> and (not std::is_same_v<Dimensions, D>),
int> = 0>
104 constexpr
Dimensions(
const std::size_t& d = 0) : runtime_size {
static_cast<std::size_t
>(d)}
111 #ifdef __cpp_concepts 112 template<eucl
idean_pattern D> requires (not std::same_as<D, Dimensions>)
114 template<
typename D, std::enable_if_t<eucl
idean_pattern<D> and (not std::is_same_v<D, Dimensions>),
int> = 0>
123 #ifdef __cpp_concepts 124 template<std::
integral Int>
126 template<
typename Int, std::enable_if_t<std::is_
integral_v<Int>,
int> = 0>
128 explicit constexpr
operator Int()
135 std::size_t runtime_size;
145 #ifdef __cpp_concepts 146 template<fixed_pattern D> requires euclidean_pattern<D>
148 template<
typename D, std::enable_if_t<fixed_pattern<D> and eucl
idean_pattern<D>,
int> = 0>
153 #ifdef __cpp_concepts 154 template<dynamic_pattern D> requires euclidean_pattern<D>
156 template<
typename D, std::enable_if_t<dynamic_pattern<D> and eucl
idean_pattern<D>,
int> = 0>
182 template<std::
size_t N>
191 static constexpr
bool is_specialized =
true;
194 static constexpr
auto 195 dimension = [](
const T& t)
197 if constexpr (N == stdex::dynamic_extent)
return t.runtime_size;
198 else return std::integral_constant<std::size_t, N>{};
202 static constexpr
auto 203 stat_dimension = [](
const T& t) {
return dimension(t); };
206 static constexpr
auto 207 is_euclidean = [](
const T&) {
return std::true_type{}; };
210 static constexpr
auto 211 hash_code = [](
const T& t)
213 if constexpr (N == stdex::dynamic_extent)
214 return static_cast<std::size_t
>(t.runtime_size);
216 return std::integral_constant<std::size_t, N>{};
226 template<std::
size_t M, std::
size_t N>
233 template<std::
size_t N,
typename T>
234 struct common_type<
OpenKalman::coordinates::Dimensions<N>, T>
235 : std::conditional_t<
236 OpenKalman::coordinates::descriptor<T>,
237 std::conditional<OpenKalman::coordinates::euclidean_pattern<T>,
238 OpenKalman::coordinates::Dimensions<N == OpenKalman::coordinates::dimension_of_v<T> ? N : OpenKalman::stdex::dynamic_extent>,
239 OpenKalman::coordinates::Any<>>,
243 template<std::
size_t N,
typename Scalar>
250 template<std::
size_t N,
typename Scalar>
257 #ifdef __cpp_concepts 258 template<OpenKalman::coordinates::eucl
idean_pattern T, std::
size_t N>
259 struct common_type<T, OpenKalman::coordinates::Dimensions<N>> : common_type<OpenKalman::coordinates::Dimensions<N>, T> {};
263 #ifndef __cpp_concepts 264 #define OPENKALMAN_INDEX_STD_COMMON_TYPE_SPECIALIZATION(I) \ 267 template<std::size_t N> \ 268 struct common_type<I, OpenKalman::coordinates::Dimensions<N>> \ 269 : common_type<OpenKalman::coordinates::Dimensions<N>, I> {}; \ 272 OPENKALMAN_INDEX_STD_COMMON_TYPE_SPECIALIZATION(
unsigned char)
273 OPENKALMAN_INDEX_STD_COMMON_TYPE_SPECIALIZATION(
unsigned short)
274 OPENKALMAN_INDEX_STD_COMMON_TYPE_SPECIALIZATION(
unsigned int)
275 OPENKALMAN_INDEX_STD_COMMON_TYPE_SPECIALIZATION(
unsigned long)
276 OPENKALMAN_INDEX_STD_COMMON_TYPE_SPECIALIZATION(
unsigned long long)
280 template<
typename T, auto M, std::
size_t N>
282 : common_type<OpenKalman::coordinates::Dimensions<N>, std::integral_constant<T, M>> {};
285 template<
typename T,
auto...M, std::size_t N>
287 : common_type<OpenKalman::coordinates::Dimensions<N>, OpenKalman::values::fixed_value<T, M...>> {};
290 template<
typename...Args, std::size_t N>
292 : common_type<OpenKalman::coordinates::Dimensions<N>, OpenKalman::values::consteval_operation<Args...>> {};
Definition for coordinates::euclidean_pattern.
Definition: basics.hpp:41
Definition for coordinates::dynamic_pattern.
Definition for coordinates::fixed_pattern.
The size of a coordinates::pattern.
Definition: dimension_of.hpp:36
constexpr Dimensions & operator=(const D &d)
Assign from another coordinates::euclidean_pattern or dynamic_pattern.
Definition: Dimensions.hpp:116
constexpr auto get_dimension(const Arg &arg)
Get the vector dimension of coordinates::pattern Arg.
Definition: get_dimension.hpp:54
constexpr Dimensions(const D &d)
Construct from a coordinates::euclidean_pattern or dynamic_pattern.
Definition: Dimensions.hpp:99
The root namespace for OpenKalman.
Definition: basics.hpp:34
The namespace for features relating to coordinates::pattern object.
Definition: compares_with.hpp:25
constexpr Dimensions(const D &)
Constructor, taking a fixed-dimension euclidean_pattern.
Definition: Dimensions.hpp:59
This is an overloaded member function, provided for convenience. It differs from the above function o...
Definition: Dimensions.hpp:91
Inclusion file for collections.
constexpr Dimensions(const std::size_t &d=0)
Construct from an integral value.
Definition: Dimensions.hpp:104
Traits for coordinates::pattern objects.
Definition: coordinate_descriptor_traits.hpp:36
Definition for coordinates::get_dimension.
A structure representing the dimensions associated with of a particular index.
Definition: Dimensions.hpp:42
constexpr Dimensions()=default
Default constructor.
consteval_operation(const Operation &, const Args &...) -> consteval_operation< Operation, Args... >
Deduction guide.
Definition for coordinates::dimension_of.