16 #ifndef OPENKALMAN_COLLECTIONS_GET_SIZE_HPP 17 #define OPENKALMAN_COLLECTIONS_GET_SIZE_HPP 19 #ifdef __cpp_lib_ranges 29 namespace detail_get_size
31 #ifdef __cpp_lib_remove_cvref 32 using std::remove_cvref_t;
34 #ifdef __cpp_lib_ranges 35 namespace ranges = std::ranges;
39 #ifndef __cpp_concepts 40 template<
typename T,
typename =
void>
44 struct has_tuple_size<T,
std::void_t<decltype(std::tuple_size<std::decay_t<T>>::value)>> : std::true_type {};
51 template<
typename T,
typename =
void>
63 : std::tuple_size<T> {};
67 template<
typename T> requires values::fixed<decltype(ranges::size(std::declval<T>()))> and
82 struct range_extent<T[]> : std::integral_constant<std::size_t, 0> {};
84 template<
typename T, std::
size_t N>
85 struct range_extent<T[N]> : std::integral_constant<std::size_t, N> {};
88 struct range_extent<ranges::empty_view<T>> : std::integral_constant<std::size_t, 0> {};
91 struct range_extent<ranges::single_view<T>> : std::integral_constant<std::size_t, 1> {};
99 template<
typename V,
typename F>
105 #ifdef __cpp_lib_ranges_concat 106 namespace rg = std::ranges;
111 template<
typename...Views>
112 struct range_extent<
rg::concat_view<Views...>> : std::integral_constant<std::size_t,
113 (... or (range_extent<Views>::value == dynamic_size)) ? dynamic_size :
114 (0_uz + ... + range_extent<Views>::value)> {};
116 #ifdef __cpp_lib_ranges 120 template<
typename V, std::
size_t N>
124 #ifdef __cpp_lib_ranges_as_rvalue 129 #ifdef __cpp_lib_ranges_as_const 134 #ifdef __cpp_lib_ranges_enumerate 139 #ifdef __cpp_lib_ranges_zip 140 template<
typename...Views>
141 struct range_extent<std::ranges::zip_view<Views...>> : std::integral_constant<std::size_t,
142 (... or (range_extent<Views>::value == dynamic_size)) ? dynamic_size :
143 std::min({range_extent<Views>::value...})> {};
145 template<
typename F,
typename...Views>
146 struct range_extent<std::ranges::zip_transform_view<F, Views...>> : std::integral_constant<std::size_t,
147 (... or (range_extent<Views>::value == dynamic_size)) ? dynamic_size :
148 std::min({range_extent<Views>::value...})> {};
150 template<
typename View, std::
size_t N>
151 struct range_extent<std::ranges::adjacent_view<View, N>>: std::integral_constant<std::size_t,
152 range_extent<View>::value == dynamic_size ? dynamic_size :
155 template<
typename View,
typename F, std::
size_t N>
156 struct range_extent<std::ranges::adjacent_transform_view<View, F, N>> : std::integral_constant<std::size_t,
157 range_extent<View>::value == dynamic_size ? dynamic_size :
161 #ifdef __cpp_lib_ranges_cartesian_product 162 template<
typename...Vs>
163 struct range_extent<std::ranges::cartesian_product_view<Vs...>> : std::integral_constant<std::size_t,
164 (... or (range_extent<Vs>::value == dynamic_size)) ? dynamic_size :
165 (1_uz * ... * range_extent<Vs>::value)> {};
168 #ifdef __cpp_lib_ranges_cache_latest 173 #ifdef __cpp_lib_ranges_to_input 185 #ifdef __cpp_concepts 188 template<
typename Arg, std::enable_if_t<sized<Arg>,
int> = 0>
193 #ifdef __cpp_lib_remove_cvref 194 using std::remove_cvref_t;
196 #ifdef __cpp_lib_ranges 205 else {
return size(std::forward<Arg>(arg)); }
212 #endif //OPENKALMAN_COLLECTIONS_GET_SIZE_HPP Namespace for collections.
Definition: collections.hpp:27
Definition: get_size.hpp:53
Definition: tuple_reverse.hpp:103
constexpr bool value
T is numerical value or is reducible to a numerical value.
Definition: value.hpp:31
Definition for collections::sized.
Definition: range-access.hpp:25
Definitions relating to the availability of c++ language features.
The fixed number associated with a values::fixed.
Definition: fixed_number_of.hpp:45
constexpr bool size
T is either an index representing a size, or void which represents that there is no size...
Definition: size.hpp:32
constexpr bool fixed
T is a values::value that is determinable at compile time.
Definition: fixed.hpp:60
Definition: get_size.hpp:41
constexpr std::size_t dynamic_size
A constant indicating that a size or index is dynamic.
Definition: global-definitions.hpp:33
Definition: get_size.hpp:79
constexpr auto get_size(Arg &&arg)
Get the size of a sized object (e.g, a collection)
Definition: get_size.hpp:191