1#ifndef TATOOINE_ITERATOR_FACADE_H
2#define TATOOINE_ITERATOR_FACADE_H
17template <
typename Iter>
19 using type = std::remove_cvref_t<decltype(*std::declval<Iter>())>;
24requires requires {
typename T::value_type; }
26 using type =
typename T::value_type;
32template <
typename Iter>
34 iter.distance_to(iter);
57 using type = std::ptrdiff_t;
61template <implements_distance_to Iter>
63 using type =
decltype(std::declval<Iter>().distance_to(std::declval<Iter>()));
66template <
typename Iter>
72 it.advance(infer_difference_type<T>{});
75template <
typename Arg,
typename Iter>
77 std::convertible_to<Arg, infer_difference_type<Iter>>;
82 { it.equal(it) } -> std::convertible_to<bool>;
99template <
typename Iter>
101 typename Iter::sentinel_type;
104template <
typename T,
typename Iter>
106 std::same_as<std::decay_t<T>,
typename Iter::sentinel_type>;
114template <
typename Iter>
146template <
typename Iter>
147class iterator_facade;
149template <
typename Iter>
151 std::is_base_of_v<tatooine::iterator_facade<Iter>, Iter>;
153template <
typename Iter>
174 decltype(
auto) ref = **
this;
175 if constexpr (std::is_reference_v<
decltype(ref)>) {
177 return std::addressof(ref);
181 return arrow_proxy<std::decay_t<
decltype(ref)>>{std::move(ref)};
219 self.advance(offset);
226 return right += offset;
239 return left = left - off;
246 left = left - sentinel;
258 return right.distance_to(left);
265 return -left.distance_to(right);
271 return left.distance_to(right);
277 return (left - right) <=> 0;
283 return left.equal(right);
288 return !left.equal(right);
294 return iter.at_end();
300 return !iter.at_end();
306 return iter.at_end();
312 return !iter.at_end();
316template <
typename Range>
317requires requires(Range &&range) { range.begin(); }
320template <
typename Range>
321requires requires(Range &&range) { range.end(); }
324template <derived_from_iterator_facade Iter>
329template <derived_from_iterator_facade Iter>
334 for (
decltype(off) i = 0; i < off; ++i) {
341template <derived_from_iterator_facade Iter>
342requires implements_decrement<Iter>
343auto prev(Iter iter) {
return --iter; }
345template <derived_from_iterator_facade Iter>
346requires implements_decrement<Iter>
351 for (
decltype(off) i = 0; i < off; ++i) {
358template <derived_from_iterator_facade Iter>
359requires implements_advance<Iter>
364template <derived_from_iterator_facade Iter>
365requires implements_advance<Iter>
367 return iter.advance(off);
370template <derived_from_iterator_facade Iter>
371requires implements_distance_to<Iter>
372constexpr auto distance(Iter
const& it0, Iter
const& it1) {
373 return it0.distance_to(it1);
376template <derived_from_iterator_facade Iter>
377requires implements_distance_to<Iter>
379 return it0.distance_to(it1);
382template <derived_from_iterator_facade Iter>
383requires implements_distance_to<Iter>
385 return -it1.distance_to(it0);
390template <tatooine::derived_from_iterator_facade Iter>
391struct std::iterator_traits<Iter> {
400 random_access_iterator_tag,
402 conditional_t<tatooine::meets_bidirectional<Iter>,
404 bidirectional_iterator_tag,
406 conditional_t<tatooine::declares_single_pass<Iter>,
411 forward_iterator_tag>>>;
C++20 implementation of an iterator facade.
Definition: iterator_facade.h:154
auto operator++(int)
Definition: iterator_facade.h:190
friend auto operator+=(iterator_type &self, difference_type_arg< iterator_type > auto const offset) -> auto &
Definition: iterator_facade.h:215
auto operator--(int)
Definition: iterator_facade.h:203
friend auto operator-(iterator_type const &left, iterator_type const &right)
Definition: iterator_facade.h:256
friend auto operator!=(iter_sentinel_arg< iterator_type > auto const, iterator_type const &iter) -> bool
Definition: iterator_facade.h:309
friend auto operator==(iterator_type const &left, iterator_type const &right)
Definition: iterator_facade.h:280
friend auto operator-(iterator_type const &left, iter_sentinel_arg< iterator_type > auto const right)
Definition: iterator_facade.h:261
friend auto operator-=(iterator_type &left, difference_type_arg< iterator_type > auto off) -> auto &
Definition: iterator_facade.h:235
auto as_derived() -> auto &
Definition: iterator_facade.h:160
friend auto operator-(iterator_type left, difference_type_arg< iterator_type > auto off)
Definition: iterator_facade.h:229
friend auto operator-(iter_sentinel_arg< iterator_type > auto const right, iterator_type const &left)
Definition: iterator_facade.h:268
friend auto operator+(iterator_type left, difference_type_arg< iterator_type > auto const off)
Definition: iterator_facade.h:209
auto as_derived() const -> auto const &
Definition: iterator_facade.h:163
friend auto operator==(iterator_type const &iter, iter_sentinel_arg< iterator_type > auto const) -> bool
Definition: iterator_facade.h:291
auto operator--() -> auto &
Definition: iterator_facade.h:196
friend auto operator-=(iterator_type &left, iter_sentinel_arg< iterator_type > auto sentinel) -> auto &
Definition: iterator_facade.h:242
auto operator->() const
Definition: iterator_facade.h:173
friend auto operator==(iter_sentinel_arg< iterator_type > auto const, iterator_type const &iter) -> bool
Definition: iterator_facade.h:303
auto operator[](difference_type_arg< iterator_type > auto pos) -> decltype(auto)
Definition: iterator_facade.h:250
friend auto operator+(difference_type_arg< iterator_type > auto const offset, iterator_type right)
Definition: iterator_facade.h:223
friend auto operator!=(iterator_type const &left, iterator_type const &right)
Definition: iterator_facade.h:286
friend auto operator!=(iterator_type const &iter, iter_sentinel_arg< iterator_type > auto const) -> bool
Definition: iterator_facade.h:297
auto operator*() const -> decltype(auto)
Definition: iterator_facade.h:169
Iter iterator_type
Definition: iterator_facade.h:156
auto operator++() -> auto &
Definition: iterator_facade.h:185
friend auto operator<=>(iterator_type const &left, iterator_type const &right)
Definition: iterator_facade.h:274
Detect if the iterator declares itself to be a single-pass iterator.
Definition: iterator_facade.h:97
Definition: iterator_facade.h:150
Definition: iterator_facade.h:76
Definition: iterator_facade.h:71
Definition: iterator_facade.h:115
Definition: iterator_facade.h:38
Definition: iterator_facade.h:43
Definition: iterator_facade.h:33
Definition: iterator_facade.h:81
Definition: iterator_facade.h:48
Definition: iterator_facade.h:100
Definition: iterator_facade.h:105
We meet bidirectional if we are random_access, OR we have .decrement()
Definition: iterator_facade.h:93
Definition: iterator_facade.h:88
Definition: concepts.h:84
Definition: algorithm.h:6
constexpr auto distance(Iter const &it0, Iter const &it1)
Definition: iterator_facade.h:372
auto begin(Range &&range)
Definition: iterator_facade.h:318
auto advance(Iter &iter)
Definition: iterator_facade.h:360
auto end(Range &&range)
Definition: iterator_facade.h:322
typename infer_difference_type_impl< Iter >::type infer_difference_type
Definition: iterator_facade.h:67
auto next(Iter iter)
Definition: iterator_facade.h:325
typename infer_value_type_impl< T >::type infer_value_type
Definition: iterator_facade.h:30
auto prev(Iter iter)
Definition: iterator_facade.h:343
conditional_t< tatooine::meets_random_access< Iter >, random_access_iterator_tag, conditional_t< tatooine::meets_bidirectional< Iter >, bidirectional_iterator_tag, conditional_t< tatooine::declares_single_pass< Iter >, input_iterator_tag, forward_iterator_tag > > > iterator_category
Definition: iterator_facade.h:411
decltype(*_it) reference
Definition: iterator_facade.h:393
tatooine::infer_difference_type< Iter > difference_type
Definition: iterator_facade.h:396
iterator_category iterator_concept
Definition: iterator_facade.h:414
tatooine::infer_value_type< Iter > value_type
Definition: iterator_facade.h:395
static Iter const & _it
Definition: iterator_facade.h:392
decltype(_it.operator->()) pointer
Definition: iterator_facade.h:394
from https://quuxplusone.github.io/blog/2019/02/06/arrow-proxy/
Definition: arrow_proxy.h:8
decltype(std::declval< Iter >().distance_to(std::declval< Iter >())) type
Definition: iterator_facade.h:63
Base case.
Definition: iterator_facade.h:56
std::ptrdiff_t type
Definition: iterator_facade.h:57
typename T::value_type type
Definition: iterator_facade.h:26
Just use the return type of derefence operator.
Definition: iterator_facade.h:18
std::remove_cvref_t< decltype(*std::declval< Iter >())> type
Definition: iterator_facade.h:19
Definition: iterator_facade.h:12