11#include <dr/detail/ranges_shim.hpp>
17template <
typename>
inline constexpr bool disable_rank =
false;
23 { t.rank() } -> std::weakly_incrementable;
28 { rank_(r) } -> std::weakly_incrementable;
31template <
typename Iter>
34 !disable_rank<std::remove_cv_t<Iter>>;
47 template <rng::forward_range R>
51 constexpr auto operator()(R &&r)
const {
53 return std::forward<R>(r).rank();
58 return operator()(rng::begin(t));
60 !disable_rank<std::remove_cv_t<R>>) {
61 return rank_(std::forward<R>(r));
65 template <std::forward_iterator Iter>
67 auto operator()(Iter iter)
const {
69 !disable_rank<std::remove_cv_t<Iter>>) {
70 return std::forward<Iter>(iter).rank();
77inline constexpr auto rank = rank_fn_{};
83 rng::forward_range<R> &&
requires(R &r) { dr::ranges::rank(r); };
100 template <rng::forward_range R>
102 constexpr decltype(
auto) operator()(R &&r)
const {
104 return std::forward<R>(r).segments();
105 }
else if constexpr (has_segments_adl<R>) {
106 return segments_(std::forward<R>(r));
110 template <std::forward_iterator I>
111 requires(has_segments_method<I> || has_segments_adl<I>)
112 constexpr decltype(
auto) operator()(I iter)
const {
113 if constexpr (has_segments_method<I>) {
114 return std::forward<I>(iter).segments();
115 }
else if constexpr (has_segments_adl<I>) {
116 return segments_(std::forward<I>(iter));
123inline constexpr auto segments = segments_fn_{};
127template <
typename Iter>
129 { local_(iter) } -> std::forward_iterator;
132template <
typename Iter>
134 std::forward_iterator<Iter> &&
requires(Iter iter) {
135 { iter.local() } -> std::forward_iterator;
138template <
typename T>
struct is_localizable_helper : std::false_type {};
140template <has_local_adl T>
struct is_localizable_helper<T> : std::true_type {};
142template <iter_has_local_method T>
143struct is_localizable_helper<T> : std::true_type {};
145template <rng::forward_iterator Iter>
146 requires(not iter_has_local_method<Iter> && not has_local_adl<Iter>) &&
147 requires() { std::iter_value_t<Iter>(); }
148struct is_localizable_helper<Iter>
149 : is_localizable_helper<std::iter_value_t<Iter>> {};
151template <rng::forward_range R>
152struct is_localizable_helper<R> : is_localizable_helper<rng::iterator_t<R>> {};
157template <
typename Segment>
159 rng::forward_range<Segment> &&
requires(Segment segment) {
160 { segment.local() } -> rng::forward_range;
169 template <
typename Iter>
170 requires rng::forward_range<typename Iter::value_type>
171 struct cursor_over_local_ranges {
173 auto make_begin_for_counted()
const {
175 rng::iterator_t<typename Iter::value_type>>)
176 return rng::begin(*iter).local();
178 return rng::basic_iterator<cursor_over_local_ranges<
179 rng::iterator_t<typename Iter::value_type>>>(rng::begin(*iter));
182 return rng::views::counted(make_begin_for_counted(), rng::size(*iter));
184 bool equal(
const cursor_over_local_ranges &other)
const {
185 return iter == other.iter;
187 void next() { ++iter; }
188 void prev() { --iter; }
189 void advance(std::ptrdiff_t n) { this->iter += n; }
190 std::ptrdiff_t distance_to(
const cursor_over_local_ranges &other)
const {
191 return other.iter - this->iter;
193 cursor_over_local_ranges() =
default;
194 cursor_over_local_ranges(Iter iter) : iter(iter) {}
197 template <std::forward_iterator Iter>
198 requires(has_local_adl<Iter> || iter_has_local_method<Iter> ||
199 std::contiguous_iterator<Iter> || is_localizable<Iter>)
200 auto operator()(Iter iter)
const {
201 if constexpr (iter_has_local_method<Iter>) {
203 }
else if constexpr (has_local_adl<Iter>) {
205 }
else if constexpr (is_localizable<Iter>) {
206 return rng::basic_iterator<cursor_over_local_ranges<Iter>>(iter);
207 }
else if constexpr (std::contiguous_iterator<Iter>) {
212 template <rng::forward_range R>
213 requires(has_local_adl<R> || iter_has_local_method<rng::iterator_t<R>> ||
214 segment_has_local_method<R> ||
215 std::contiguous_iterator<rng::iterator_t<R>> ||
216 is_localizable<R> || rng::contiguous_range<R>)
217 auto operator()(R &&r)
const {
218 if constexpr (segment_has_local_method<R>) {
220 }
else if constexpr (iter_has_local_method<rng::iterator_t<R>>) {
221 return rng::views::counted(rng::begin(r).local(), rng::size(r));
222 }
else if constexpr (has_local_adl<R>) {
223 return local_(std::forward<R>(r));
224 }
else if constexpr (is_localizable<R>) {
225 return rng::views::counted(
226 rng::basic_iterator<cursor_over_local_ranges<rng::iterator_t<R>>>(
229 }
else if constexpr (std::contiguous_iterator<rng::iterator_t<R>>) {
230 return std::span(rng::begin(r), rng::size(r));
237inline constexpr auto local = local_fn_{};
243 { dr::ranges::local(t) } -> std::convertible_to<std::any>;
247 template <
typename T>
249 auto operator()(T &&t)
const {
250 return dr::ranges::local(t);
253 template <
typename T>
decltype(
auto)
operator()(T &&t)
const {
return t; }
256inline constexpr auto local =
local_fn_{};
Definition: ranges.hpp:128
Definition: ranges.hpp:27
Definition: ranges.hpp:22
Definition: ranges.hpp:95
Definition: ranges.hpp:90
Definition: ranges.hpp:155
Definition: ranges.hpp:32
Definition: ranges.hpp:133
Definition: ranges.hpp:82
Definition: ranges.hpp:158
Definition: ranges.hpp:86
Definition: ranges.hpp:242
Definition: ranges.hpp:246