15#ifndef RANGES_V3_DETAIL_RANGE_ACCESS_HPP
16#define RANGES_V3_DETAIL_RANGE_ACCESS_HPP
29#include <range/v3/detail/prologue.hpp>
40 static std::false_type single_pass_2_(
long);
42 static typename T::single_pass single_pass_2_(
int);
47 using type =
decltype(range_access::single_pass_2_<T>(42));
51 static std::false_type contiguous_2_(
long);
53 static typename T::contiguous contiguous_2_(
int);
58 using type =
decltype(range_access::contiguous_2_<T>(42));
62 static basic_mixin<T> mixin_base_2_(
long);
64 static typename T::mixin mixin_base_2_(
int);
66 template<
typename Cur>
69 using type =
decltype(range_access::mixin_base_2_<Cur>(42));
74 template<
typename Cur>
77 template<
typename Cur>
80 template<
typename Cur>
84 template<
typename Rng>
85 static constexpr auto CPP_auto_fun(begin_cursor)(Rng &rng)
87 return rng.begin_cursor()
89 template<typename Rng>
90 static constexpr auto CPP_auto_fun(end_cursor)(Rng &rng)
92 return rng.end_cursor()
95 template<typename Rng>
96 static constexpr auto CPP_auto_fun(begin_adaptor)(Rng &rng)
98 return rng.begin_adaptor()
100 template<typename Rng>
101 static constexpr auto CPP_auto_fun(end_adaptor)(Rng &rng)
103 return rng.end_adaptor()
106 template<typename Cur>
107 static constexpr auto CPP_auto_fun(read)(Cur
const &pos)
111 template<typename Cur>
112 static constexpr auto CPP_auto_fun(arrow)(Cur
const &pos)
116 template<typename Cur>
117 static constexpr auto CPP_auto_fun(move)(Cur
const &pos)
121 template<typename Cur, typename T>
122 static constexpr auto CPP_auto_fun(write)(Cur &pos, T &&t)
124 return pos.write((T &&) t)
126 template<
typename Cur>
127 static constexpr auto CPP_auto_fun(next)(Cur & pos)
131 template<typename Cur, typename O>
132 static constexpr auto CPP_auto_fun(equal)(Cur
const &pos, O
const &other)
134 return pos.equal(other)
136 template<typename Cur>
137 static constexpr auto CPP_auto_fun(prev)(Cur & pos)
141 template<typename Cur, typename D>
142 static constexpr auto CPP_auto_fun(advance)(Cur & pos, D n)
144 return pos.advance(n)
146 template<typename Cur, typename O>
147 static constexpr auto CPP_auto_fun(distance_to)(Cur
const &pos, O
const &other)
149 return pos.distance_to(other)
153 template<typename Cur>
154 using sized_cursor_difference_t = decltype(
155 range_access::distance_to(std::declval<Cur>(), std::declval<Cur>()));
159 static std::ptrdiff_t cursor_difference_2_(detail::ignore_t);
161 static sized_cursor_difference_t<T> cursor_difference_2_(
long);
163 static typename T::difference_type cursor_difference_2_(
int);
166 using cursor_reference_t =
decltype(std::declval<T const &>().read());
173#ifdef RANGES_WORKAROUND_CWG_1554
174 template<
typename Cur>
175 struct cursor_difference
177 using type =
decltype(range_access::cursor_difference_2_<Cur>(42));
180 template<
typename Cur>
181 struct cursor_value : decltype(range_access::cursor_value_2_<Cur>(42))
185#ifdef RANGES_WORKAROUND_CWG_1554
186 template<
typename Cur>
189 template<
typename Cur>
192 template<
typename Cur>
193 using cursor_difference_t =
decltype(range_access::cursor_difference_2_<Cur>(42));
195 template<
typename Cur>
199 template<
typename Cur>
200 static constexpr Cur & pos(basic_iterator<Cur> & it)
noexcept
204 template<
typename Cur>
205 static constexpr Cur
const & pos(basic_iterator<Cur>
const & it)
noexcept
209 template<
typename Cur>
210 static constexpr Cur && pos(basic_iterator<Cur> && it)
noexcept
212 return detail::move(it.pos());
215 template<
typename Cur>
216 static constexpr Cur cursor(basic_iterator<Cur> it)
218 return std::move(it.pos());
235 semiregular<T> && semiregular<range_access::mixin_base_t<T>> &&
236 constructible_from<range_access::mixin_base_t<T>, T> &&
237 constructible_from<range_access::mixin_base_t<T>, T
const &>;
245 CPP_requires(has_cursor_next_,
248 range_access::next(t)
253 CPP_concept has_cursor_next = CPP_requires_ref(detail::has_cursor_next_, T);
257 template<
typename S,
typename C>
258 CPP_requires(sentinel_for_cursor_,
259 requires(S & s, C & c)
261 range_access::equal(c, s),
262 concepts::requires_<convertible_to<
decltype(
263 range_access::equal(c, s)),
bool>>
267 template<
typename S,
typename C>
268 CPP_concept sentinel_for_cursor =
271 CPP_requires_ref(detail::sentinel_for_cursor_, S, C);
276 CPP_requires(readable_cursor_,
279 range_access::read(t)
284 CPP_concept readable_cursor = CPP_requires_ref(detail::readable_cursor_, T);
289 CPP_requires(has_cursor_arrow_,
290 requires(T
const & t)
292 range_access::arrow(t)
297 CPP_concept has_cursor_arrow = CPP_requires_ref(detail::has_cursor_arrow_, T);
301 template<
typename T,
typename U>
302 CPP_requires(writable_cursor_,
303 requires(T & t, U && u)
305 range_access::write(t, (U &&) u)
309 template<
typename T,
typename U>
310 CPP_concept writable_cursor =
311 CPP_requires_ref(detail::writable_cursor_, T, U);
315 template<
typename S,
typename C>
316 CPP_requires(sized_sentinel_for_cursor_,
317 requires(S & s, C & c)
319 range_access::distance_to(c, s),
320 concepts::requires_<signed_integer_like_<
decltype(
321 range_access::distance_to(c, s))>>
326 template<
typename S,
typename C>
327 CPP_concept sized_sentinel_for_cursor =
328 sentinel_for_cursor<S, C> &&
329 CPP_requires_ref(detail::sized_sentinel_for_cursor_, S, C);
333 template<
typename T,
typename U>
334 CPP_concept output_cursor =
335 writable_cursor<T, U> && cursor<T>;
340 CPP_concept input_cursor =
341 readable_cursor<T> && cursor<T> && has_cursor_next<T>;
346 CPP_concept forward_cursor =
347 input_cursor<T> && sentinel_for_cursor<T, T> &&
348 !range_access::single_pass_t<uncvref_t<T>>::value;
353 CPP_requires(bidirectional_cursor_,
356 range_access::prev(t)
361 CPP_concept bidirectional_cursor =
363 CPP_requires_ref(detail::bidirectional_cursor_, T);
368 CPP_requires(random_access_cursor_,
371 range_access::advance(t, range_access::distance_to(t, t))
376 CPP_concept random_access_cursor =
377 bidirectional_cursor<T> &&
378 sized_sentinel_for_cursor<T, T> &&
379 CPP_requires_ref(detail::random_access_cursor_, T);
382 requires std::is_lvalue_reference<T>::value)
383 void is_lvalue_reference(T&&);
388 CPP_requires(contiguous_cursor_,
391 detail::is_lvalue_reference(range_access::read(t))
396 CPP_concept contiguous_cursor =
397 random_access_cursor<T> &&
398 range_access::contiguous_t<uncvref_t<T>>::value &&
399 CPP_requires_ref(detail::contiguous_cursor_, T);
402 template<
typename Cur,
bool IsReadable>
403 RANGES_INLINE_VAR
constexpr bool is_writable_cursor_ =
true;
405 template<
typename Cur>
406 RANGES_INLINE_VAR
constexpr bool is_writable_cursor_<Cur, true> =
407 (bool) writable_cursor<Cur, range_access::cursor_value_t<Cur>>;
409 template<
typename Cur>
410 RANGES_INLINE_VAR
constexpr bool is_writable_cursor_v =
411 is_writable_cursor_<Cur, (bool)readable_cursor<Cur>>;
416#include <range/v3/detail/epilogue.hpp>
typename T::type _t
Type alias for T::type.
Definition meta.hpp:141