16 #ifndef OPENKALMAN_COLLECTIONS_GET_SIZE_HPP 17 #define OPENKALMAN_COLLECTIONS_GET_SIZE_HPP 21 #include "collections/traits/std-extents.hpp" 25 namespace detail_get_size
29 struct range_extent {};
33 struct range_extent<T> : std::tuple_size<T> {};
36 template<
typename T> requires values::fixed<decltype(stdex::ranges::size(std::declval<T>()))> and
38 struct range_extent<T>
46 struct range_extent<T>
49 template<
typename T,
typename =
void>
53 struct has_tuple_size<T,
std::void_t<decltype(std::tuple_size<std::decay_t<T>>::value)>> : std::true_type {};
56 template<
typename T,
typename =
void>
61 : std::tuple_size<T> {};
64 struct range_extent_impl<T, std::enable_if_t<values::fixed<decltype(stdex::ranges::size(std::declval<T>()))> and
65 not has_tuple_size<T>::value>>
69 struct range_extent_impl<T, std::enable_if_t<std::bool_constant<(std::decay_t<T>::size(), true)>::value and
70 (not values::fixed<decltype(stdex::ranges::size(std::declval<T>()))>) and
71 not has_tuple_size<T>::value>>
72 : std::integral_constant<std::size_t, std::decay_t<T>::size()> {};
75 template<
typename T,
typename =
void>
89 template<
typename IndexType, std::size_t...Extents>
90 struct range_extent<stdex::extents<IndexType, Extents...>> : std::integral_constant<std::size_t, sizeof...(Extents)> {};
94 struct range_extent<T[]> : std::integral_constant<std::size_t, 0> {};
97 template<
typename T, std::
size_t N>
98 struct range_extent<T[N]> : std::integral_constant<std::size_t, N> {};
117 template<
typename V,
typename F>
125 template<
typename...Views>
127 : std::conditional_t<
128 (... and values::index<range_extent<Views>>),
129 std::integral_constant<std::size_t, (0_uz + ... + ext_val<Views>)>,
133 #ifdef __cpp_lib_ranges 137 template<
typename V, std::
size_t N>
142 #ifdef __cpp_lib_ranges_as_rvalue 148 #ifdef __cpp_lib_ranges_as_const 154 #ifdef __cpp_lib_ranges_enumerate 160 #ifdef __cpp_lib_ranges_zip 161 template<
typename...Views>
163 : std::conditional_t<
164 (... and values::index<range_extent<Views>>),
165 std::integral_constant<std::size_t, std::min({ext_val<Views>...})>,
168 template<
typename F,
typename...Views>
169 struct range_extent<std::ranges::zip_transform_view<F, Views...>>
170 : std::conditional_t<
171 (... and values::index<range_extent<Views>>),
172 std::integral_constant<std::size_t, std::min({ext_val<Views>...})>,
175 template<
typename View, std::
size_t N>
176 struct range_extent<std::ranges::adjacent_view<View, N>>
177 : std::conditional_t<
178 values::index<range_extent<View>>,
179 std::integral_constant<std::size_t, ext_val<View> >= N ? ext_val<View> - N + 1 : 0>,
182 template<
typename View,
typename F, std::
size_t N>
183 struct range_extent<std::ranges::adjacent_transform_view<View, F, N>>
184 : std::conditional_t<
185 values::index<range_extent<View>>,
186 std::integral_constant<std::size_t, ext_val<View> >= N ? ext_val<View> - N + 1 : 0>,
191 #ifdef __cpp_lib_ranges_cartesian_product 192 template<
typename...Vs>
193 struct range_extent<std::ranges::cartesian_product_view<Vs...>>
194 : std::conditional_t<
195 (... and values::index<range_extent<Vs>>),
196 std::integral_constant<std::size_t, (1_uz * ... * ext_val<Vs>)>,
201 #ifdef __cpp_lib_ranges_cache_latest 207 #ifdef __cpp_lib_ranges_to_input 218 template<
typename Arg>
219 #ifdef __cpp_concepts 227 if constexpr (values::index<Ex>)
228 return values::cast_to<std::size_t>(Ex{});
229 else if constexpr (stdex::ranges::sized_range<Arg>)
Namespace for collections.
Definition: collections.hpp:27
Definition: get_size.hpp:57
constexpr auto get_size(Arg &&arg)
Get the size of a sized object (e.g, a collection)
Definition: get_size.hpp:224
Header file for code relating to values (e.g., scalars and indices)
The fixed value associated with a fixed.
Definition: fixed_value_of.hpp:44
constexpr bool value
T is a fixed or dynamic value that is reducible to a number.
Definition: value.hpp:45
constexpr bool size
T is either an index representing a size, or unbounded_size_t, which indicates that the size is unbou...
Definition: size.hpp:71
constexpr bool index
T is an index value.
Definition: index.hpp:62
constexpr unbounded_size_t unbounded_size
An instance of unbounded_size_t;.
Definition: size.hpp:60
constexpr bool fixed
T has a value that is determinable at compile time.
Definition: fixed.hpp:65
Definition: get_size.hpp:50
Definition: get_size.hpp:76