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>
24#if __has_include(<span>) && !defined(RANGES_WORKAROUND_MSVC_UNUSABLE_SPAN)
27#if __has_include(<string_view>)
45#include <range/v3/detail/prologue.hpp>
75 CPP_concept borrowed_range =
76 range<T> && detail::_borrowed_range<T>;
79 RANGES_DEPRECATED(
"Please use ranges::borrowed_range instead.")
80 RANGES_INLINE_VAR constexpr
bool safe_range = borrowed_range<R>;
84 template(typename T, typename V)(
85 concept (output_range_)(T, V),
90 template<typename T, typename V>
91 CPP_concept output_range =
92 range<T> && CPP_concept_ref(ranges::output_range_, T, V);
97 concept (input_range_)(T),
103 CPP_concept input_range =
104 range<T> && CPP_concept_ref(ranges::input_range_, T);
108 template(typename T)(
109 concept (forward_range_)(T),
115 CPP_concept forward_range =
116 input_range<T> && CPP_concept_ref(ranges::forward_range_, T);
120 template(typename T)(
121 concept (bidirectional_range_)(T),
127 CPP_concept bidirectional_range =
128 forward_range<T> && CPP_concept_ref(ranges::bidirectional_range_, T);
132 template(typename T)(
133 concept (random_access_range_)(T),
140 CPP_concept random_access_range =
141 bidirectional_range<T> && CPP_concept_ref(ranges::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),
160 contiguous_iterator<iterator_t<T>> AND
161 same_as<detail::data_t<T>, std::add_pointer_t<iter_reference_t<iterator_t<T>>>>
167 CPP_concept contiguous_range =
172 template(
typename T)(
173 concept (common_range_)(T),
174 same_as<iterator_t<T>, sentinel_t<T>>
180 CPP_concept common_range =
187 CPP_concept bounded_range =
194 CPP_requires(sized_range_,
201 template(
typename T)(
202 concept (sized_range_)(T),
203 detail::integer_like_<range_size_t<T>>);
208 CPP_concept sized_range =
210 !disable_sized_range<uncvref_t<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;
260 CPP_concept viewable_range =
262 (borrowed_range<T> || view_<uncvref_t<T>>);
281 template<
typename 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>
The bidirectional_range concept.
The borrowed_range concept.
The common_range_ concept.
The common_range concept.
The contiguous_range_ concept.
The contiguous_range concept.
The forward_range concept.
The output_range concept.
The random_access_range concept.
The sized_range_ concept.
The viewable_range concept.
decltype(begin(declval(Rng &))) iterator_t
Definition access.hpp:698
typename T::type _t
Type alias for T::type.
Definition meta.hpp:141
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