16 #ifndef OPENKALMAN_COLLECTIONS_GET_SIZE_HPP 17 #define OPENKALMAN_COLLECTIONS_GET_SIZE_HPP 24 namespace detail_get_size
26 #ifndef __cpp_concepts 27 template<
typename T,
typename =
void>
31 struct has_tuple_size<T,
std::void_t<decltype(std::tuple_size<std::decay_t<T>>::value)>> : std::true_type {};
38 template<
typename T,
typename =
void>
50 : std::tuple_size<T> {};
54 template<
typename T> requires values::fixed<decltype(stdex::ranges::size(std::declval<T>()))> and
84 struct range_extent<T[]> : std::integral_constant<std::size_t, 0> {};
86 template<
typename T, std::
size_t N>
87 struct range_extent<T[N]> : std::integral_constant<std::size_t, N> {};
101 template<
typename V,
typename F>
107 template<
typename...Views>
108 struct range_extent<stdex::ranges::concat_view<Views...>> : std::integral_constant<std::size_t,
109 (... or (range_extent<Views>::value == stdex::dynamic_extent)) ? stdex::dynamic_extent :
110 (0_uz + ... + range_extent<Views>::value)> {};
112 #ifdef __cpp_lib_ranges 116 template<
typename V, std::
size_t N>
120 #ifdef __cpp_lib_ranges_as_rvalue 125 #ifdef __cpp_lib_ranges_as_const 130 #ifdef __cpp_lib_ranges_enumerate 135 #ifdef __cpp_lib_ranges_zip 136 template<
typename...Views>
137 struct range_extent<std::ranges::zip_view<Views...>> : std::integral_constant<std::size_t,
138 (... or (range_extent<Views>::value == stdex::dynamic_extent)) ? stdex::dynamic_extent :
139 std::min({range_extent<Views>::value...})> {};
141 template<
typename F,
typename...Views>
142 struct range_extent<std::ranges::zip_transform_view<F, Views...>> : std::integral_constant<std::size_t,
143 (... or (range_extent<Views>::value == stdex::dynamic_extent)) ? stdex::dynamic_extent :
144 std::min({range_extent<Views>::value...})> {};
146 template<
typename View, std::
size_t N>
147 struct range_extent<std::ranges::adjacent_view<View, N>>: std::integral_constant<std::size_t,
148 range_extent<View>::value == stdex::dynamic_extent ? stdex::dynamic_extent :
151 template<
typename View,
typename F, std::
size_t N>
152 struct range_extent<std::ranges::adjacent_transform_view<View, F, N>> : std::integral_constant<std::size_t,
153 range_extent<View>::value == stdex::dynamic_extent ? stdex::dynamic_extent :
157 #ifdef __cpp_lib_ranges_cartesian_product 158 template<
typename...Vs>
159 struct range_extent<std::ranges::cartesian_product_view<Vs...>> : std::integral_constant<std::size_t,
160 (... or (range_extent<Vs>::value == stdex::dynamic_extent)) ? stdex::dynamic_extent :
161 (1_uz * ... * range_extent<Vs>::value)> {};
164 #ifdef __cpp_lib_ranges_cache_latest 169 #ifdef __cpp_lib_ranges_to_input 181 #ifdef __cpp_concepts 185 template<
typename Arg, std::enable_if_t<sized<Arg>,
int> = 0>
191 if constexpr (
Ex::value != stdex::dynamic_extent) {
return values::cast_to<std::size_t>(Ex {}); }
Namespace for collections.
Definition: collections.hpp:27
Definition: get_size.hpp:40
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
Definition for collections::sized.
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:65
constexpr bool index
T is an index value.
Definition: index.hpp:62
constexpr bool fixed
T is a value that is determinable at compile time.
Definition: fixed.hpp:66
Definition: get_size.hpp:28
Definition: get_size.hpp:81
constexpr auto get_size(Arg &&arg)
Get the size of a sized object (e.g, a collection)
Definition: get_size.hpp:188