21 #ifndef OPENKALMAN_RANGES_RANGE_CONCEPTS_HPP 22 #define OPENKALMAN_RANGES_RANGE_CONCEPTS_HPP 26 #include "range-access.hpp" 30 #ifdef __cpp_lib_ranges 31 using std::ranges::range;
33 using std::ranges::borrowed_range;
34 using std::ranges::dangling;
35 using std::ranges::borrowed_iterator_t;
36 using std::ranges::borrowed_subrange_t;
38 using std::ranges::sized_range;
39 using std::ranges::input_range;
40 using std::ranges::output_range;
41 using std::ranges::forward_range;
42 using std::ranges::bidirectional_range;
43 using std::ranges::random_access_range;
44 using std::ranges::common_range;
45 using std::ranges::range_size_t;
46 using std::ranges::range_difference_t;
47 using std::ranges::range_value_t;
48 using std::ranges::range_reference_t;
49 using std::ranges::range_rvalue_reference_t;
51 #if __cplusplus >= 202302L 52 using std::ranges::range_const_reference_t;
62 template<
typename T,
typename =
void>
66 struct is_range<T,
std::void_t<iterator_t<T>, sentinel_t<T>>> : std::true_type {};
78 namespace detail_borrowed_range
80 template<
typename R,
typename =
void>
85 (std::is_lvalue_reference_v<R> or enable_borrowed_range<stdex::remove_cvref_t<R>>)>> : std::true_type {};
94 constexpr
dangling() noexcept =
default;
96 template<
typename...Args>
97 constexpr
dangling(Args&&...) noexcept {}
102 using borrowed_iterator_t =
103 std::conditional_t<borrowed_range<R>, iterator_t<R>,
dangling>;
112 template<
typename T,
typename =
void>
116 struct is_sized_range<T,
std::void_t<decltype(stdex::ranges::size(std::declval<T&>()))>> : std::true_type {};
130 template<
typename T,
typename =
void>
148 template<
typename R,
typename T,
typename =
void>
151 template<
typename R,
typename T>
156 template<
typename R,
typename T>
166 template<
typename T,
typename =
void>
184 template<
typename T,
typename =
void>
202 template<
typename T,
typename =
void>
220 template<
typename T,
typename =
void>
224 struct is_common_range<T,
std::enable_if_t<std::is_same_v<iterator_t<T>, sentinel_t<T>>>> : std::true_type {};
237 template<
typename R, std::enable_if_t<sized_range<R>,
int> = 0>
238 using range_size_t = decltype(
size(std::declval<R&>()));
240 template<
typename R, std::enable_if_t<range<R>,
int> = 0>
241 using range_difference_t = iter_difference_t<iterator_t<R>>;
243 template<
typename R, std::enable_if_t<range<R>,
int> = 0>
244 using range_value_t = iter_value_t<iterator_t<R>>;
246 template<
typename R, std::enable_if_t<range<R>,
int> = 0>
247 using range_reference_t = iter_reference_t<iterator_t<R>>;
249 template<
typename R, std::enable_if_t<range<R>,
int> = 0>
250 using range_rvalue_reference_t = iter_rvalue_reference_t<iterator_t<R>>;
255 template<
typename R, std::enable_if_t<range<R>,
int> = 0>
256 using range_common_reference_t = iter_common_reference_t<iterator_t<R>>;
259 #if __cplusplus < 202302L 260 template<
typename R, std::enable_if_t<range<R>,
int> = 0>
261 using range_const_reference_t = iter_const_reference_t<iterator_t<R>>;
Definition: range-concepts.hpp:113
Definition: range-concepts.hpp:149
Definition: range-concepts.hpp:92
Definitions relating to the availability of c++ language features.
Definition: range-concepts.hpp:81
Definition: common.hpp:200
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
Definition: range-concepts.hpp:167
Definition: range-concepts.hpp:203
Definition: range-concepts.hpp:63
Definition: range-concepts.hpp:221
Definition: range-concepts.hpp:185