16 #ifndef OPENKALMAN_DIMENSIONS_HPP 17 #define OPENKALMAN_DIMENSIONS_HPP 20 #include <type_traits> 21 #include "linear-algebra/coordinates/interfaces/coordinate_descriptor_traits.hpp" 41 template<std::
size_t N = dynamic_size>
50 template<
typename D> requires (not std::same_as<std::decay_t<D>,
Dimensions>) and
51 ((euclidean_pattern<D> and fixed_pattern<D> and dimension_of_v<D> == N) or
54 template<
typename D, std::enable_if_t<
55 (not std::is_same_v<std::decay_t<D>,
Dimensions>) and
57 dynamic_pattern<D>),
int> = 0>
61 if constexpr (dynamic_pattern<D>)
63 if constexpr (not euclidean_pattern<D>)
66 throw std::invalid_argument{
"Argument of dynamic 'Dimensions' constructor must be a euclidean_coordinate_list."};
69 throw std::invalid_argument{
"Dynamic argument to static 'Dimensions' constructor has the wrong size."};
74 template<
typename Int>
75 explicit constexpr
operator std::integral_constant<Int, N>()
77 return std::integral_constant<Int, N>{};
82 template<std::
integral Int>
84 template<
typename Int, std::enable_if_t<std::is_
integral_v<Int>,
int> = 0>
86 explicit constexpr
operator Int()
106 #ifdef __cpp_concepts 107 template<
typename D> requires (euclidean_pattern<D> or dynamic_pattern<D>) and
108 (not std::is_base_of_v<Dimensions, D>)
110 template<
typename D, std::enable_if_t<(eucl
idean_pattern<D> or dynamic_pattern<D>) and
111 (not std::is_base_of_v<Dimensions, D>),
int> = 0>
115 if constexpr (not euclidean_pattern<D>)
117 throw std::invalid_argument{
"Argument of dynamic 'Dimensions' constructor must be a euclidean_coordinate_list."};
122 explicit constexpr
Dimensions(
const std::size_t& d = 0) : runtime_size {
static_cast<std::size_t
>(d)}
129 #ifdef __cpp_concepts 130 template<
typename D> requires (euclidean_pattern<D> or dynamic_pattern<D>) and
131 (not std::is_base_of_v<Dimensions, D>)
133 template<
typename D, std::enable_if_t<(eucl
idean_pattern<D> or dynamic_pattern<D>) and
134 (not std::is_base_of_v<Dimensions, D>),
int> = 0>
138 if constexpr (not euclidean_pattern<D>)
140 throw std::invalid_argument{
"Argument of dynamic 'Dimensions' assignment operator must be a euclidean_coordinate_list."};
146 #ifdef __cpp_concepts 147 template<std::
integral Int>
149 template<
typename Int, std::enable_if_t<std::is_
integral_v<Int>,
int> = 0>
151 explicit constexpr
operator Int()
158 std::size_t runtime_size;
168 #ifdef __cpp_concepts 169 template<fixed_pattern D> requires euclidean_pattern<D>
171 template<
typename D, std::enable_if_t<fixed_pattern<D> and eucl
idean_pattern<D>,
int> = 0>
176 #ifdef __cpp_concepts 177 template<dynamic_pattern D> requires euclidean_pattern<D>
179 template<
typename D, std::enable_if_t<dynamic_pattern<D> and eucl
idean_pattern<D>,
int> = 0>
206 template<std::
size_t N>
215 static constexpr
bool is_specialized =
true;
218 static constexpr
auto 219 dimension = [](
const T& t)
222 else return std::integral_constant<std::size_t, N>{};
226 static constexpr
auto 227 stat_dimension = [](
const T& t) {
return dimension(t); };
230 static constexpr
auto 231 is_euclidean = [](
const T&) {
return std::true_type{}; };
234 static constexpr std::size_t
235 hash_code = [](
const T& t)
237 if constexpr (N ==
dynamic_size)
return static_cast<std::size_t
>(t.runtime_size);
247 #endif //OPENKALMAN_DIMENSIONS_HPP Definition for coordinates::euclidean_pattern.
Definition: basics.hpp:41
Definition for coordinates::dynamic_pattern.
Definition for coordinates::fixed_pattern.
constexpr Dimensions(const std::size_t &d=0)
Construct from an integral value.
Definition: Dimensions.hpp:122
This is an overloaded member function, provided for convenience. It differs from the above function o...
Definition: Dimensions.hpp:103
The size of a coordinates::pattern.
Definition: dimension_of.hpp:37
constexpr Dimensions & operator=(const D &d)
Assign from another coordinates::euclidean_pattern or dynamic_pattern.
Definition: Dimensions.hpp:136
constexpr auto get_dimension(const Arg &arg)
Get the vector dimension of coordinates::pattern Arg.
Definition: get_dimension.hpp:55
Definition: compares_with.hpp:28
constexpr Dimensions(const D &d)
Construct from a coordinates::euclidean_pattern or dynamic_pattern.
Definition: Dimensions.hpp:113
constexpr auto get_is_euclidean(const Arg &arg)
Determine, whether coordinates::pattern Arg is euclidean.
Definition: get_is_euclidean.hpp:70
constexpr Dimensions(D &&d)
Constructor, taking a static coordinates::euclidean_pattern.
Definition: Dimensions.hpp:59
Traits for coordinates::pattern objects.
Definition: coordinate_descriptor_traits.hpp:41
Definition for get_is_euclidean.
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.
constexpr std::size_t dynamic_size
A constant indicating that a size or index is dynamic.
Definition: global-definitions.hpp:33
Definition for coordinates::dimension_of.