14 #ifndef RANGES_V3_RANGE_CONCEPTS_HPP
15 #define RANGES_V3_RANGE_CONCEPTS_HPP
17 #include <range/v3/detail/config.hpp>
19 #include <initializer_list>
20 #include <type_traits>
24 #if __has_include(<span>) && !defined(RANGES_WORKAROUND_MSVC_UNUSABLE_SPAN)
27 #if __has_include(<string_view>)
28 #include <string_view>
45 #include <range/v3/detail/prologue.hpp>
70 CPP_requires_ref(ranges::_range_, T);
76 range<T> && detail::_borrowed_range<T>;
79 RANGES_DEPRECATED(
"Please use ranges::borrowed_range instead.")
85 concept (output_range_)(T, V),
92 range<T> && CPP_concept_ref(ranges::output_range_, T, V);
97 concept (input_range_)(T),
104 range<T> && CPP_concept_ref(ranges::input_range_, T);
109 concept (forward_range_)(T),
116 input_range<T> && CPP_concept_ref(ranges::forward_range_, T);
121 concept (bidirectional_range_)(T),
128 forward_range<T> && CPP_concept_ref(ranges::bidirectional_range_, T);
133 concept (random_access_range_)(T),
147 template<
typename Rng>
148 using data_t = decltype(ranges::data(std::declval<Rng &>()));
150 template<
typename Rng>
158 template(
typename T)(
159 concept (contiguous_range_)(T),
161 same_as<detail::data_t<T>, std::add_pointer_t<iter_reference_t<iterator_t<T>>>>
168 random_access_range<T> && CPP_concept_ref(ranges::contiguous_range_, T);
172 template(
typename T)(
173 concept (common_range_)(T),
181 range<T> && CPP_concept_ref(ranges::common_range_, T);
187 CPP_concept bounded_range =
201 template(
typename T)(
202 concept (sized_range_)(T),
203 detail::integer_like_<range_size_t<T>>);
210 !disable_sized_range<uncvref_t<T>> &&
211 CPP_requires_ref(ranges::sized_range_, T) &&
212 CPP_concept_ref(ranges::sized_range_, T);
220 : std::is_base_of<view_base, T>
227 RANGES_INLINE_VAR constexpr
bool enable_view =
228 ext::enable_view<T>::value;
230 #if defined(__cpp_lib_string_view) && __cpp_lib_string_view >= 201603L
231 template<
typename Char,
typename Traits>
232 RANGES_INLINE_VAR constexpr
bool enable_view<std::basic_string_view<Char, Traits>> =
238 #if defined(__cpp_lib_span) && __cpp_lib_span >= 202002L && \
239 (!defined(__GLIBCXX__) || defined(__cpp_lib_concepts))
240 template<
typename T, std::
size_t N>
241 RANGES_INLINE_VAR constexpr
bool enable_view<std::span<T, N>> = N + 1 < 2;
262 (borrowed_range<T> || view_<uncvref_t<T>>);
281 template<
typename Rng>
286 contiguous_range<Rng>,
289 random_access_range<Rng>,
292 bidirectional_range<Rng>,
307 template<
typename Rng>
308 using common_range_tag_of =
318 template<
typename Rng>
319 using sized_range_tag_of =
325 namespace view_detail_
343 using ranges::enable_view;
351 using ranges::view_detail_::view;
357 #include <range/v3/detail/epilogue.hpp>
CPP_concept output_iterator
\concept output_iterator
Definition: concepts.hpp:347
CPP_concept input_iterator
\concept input_iterator
Definition: concepts.hpp:362
CPP_concept bidirectional_iterator
\concept bidirectional_iterator
Definition: concepts.hpp:390
CPP_concept contiguous_iterator
\concept contiguous_iterator
Definition: concepts.hpp:435
CPP_concept forward_iterator
\concept forward_iterator
Definition: concepts.hpp:370
CPP_concept random_access_iterator
\concept random_access_iterator
Definition: concepts.hpp:416
template(typename T, typename V)(concept(output_range_)(T
\concept output_range_
CPP_requires(sized_range_, requires(T &t)(ranges::size(t)))
\concept sized_range_
CPP_concept sized_range
\concept sized_range
Definition: concepts.hpp:208
CPP_concept bidirectional_range
\concept bidirectional_range
Definition: concepts.hpp:127
CPP_concept common_range
\concept common_range
Definition: concepts.hpp:180
CPP_concept forward_range
\concept forward_range
Definition: concepts.hpp:115
CPP_concept input_range
\concept input_range
Definition: concepts.hpp:103
CPP_concept viewable_range
\concept viewable_range
Definition: concepts.hpp:260
CPP_concept borrowed_range
\concept borrowed_range
Definition: concepts.hpp:75
CPP_concept output_range
\concept output_range
Definition: concepts.hpp:91
CPP_concept contiguous_range
\concept contiguous_range
Definition: concepts.hpp:167
CPP_concept random_access_range
\concept random_access_range
Definition: concepts.hpp:140
CPP_concept view_
\concept view_
Definition: concepts.hpp:252
CPP_concept range
\concept range
Definition: concepts.hpp:69
decltype(begin(declval(Rng &))) iterator_t
Definition: access.hpp:698
typename T::type _t
Type alias for T::type.
Definition: meta.hpp:141
meta::size_t< L::size()> size
An integral constant wrapper that is the size of the meta::list L.
Definition: meta.hpp:1696
typename detail::_cond< If >::template invoke< Then, Else > conditional_t
Select one type or another depending on a compile-time Boolean.
Definition: meta.hpp:1148
Definition: concepts.hpp:275
Definition: concepts.hpp:305
Definition: concepts.hpp:279
Definition: concepts.hpp:273
Definition: concepts.hpp:277
Definition: concepts.hpp:268
Definition: concepts.hpp:316
Definition: range_fwd.hpp:182