Iros
 
Loading...
Searching...
No Matches
reverse_iterator.h
Go to the documentation of this file.
1#pragma once
2
15#include "di/meta/compare.h"
16#include "di/meta/core.h"
17#include "di/meta/language.h"
18#include "di/meta/operations.h"
19
20namespace di::container {
21template<concepts::BidirectionalIterator Iter>
23 : public IteratorBase<
24 ReverseIterator<Iter>,
25 meta::Conditional<concepts::RandomAccessIterator<Iter>, RandomAccessIteratorTag, BidirectionalIteratorTag>,
26 meta::IteratorValue<Iter>, meta::IteratorSSizeType<Iter>> {
27private:
28 using SSizeType = meta::IteratorSSizeType<Iter>;
29
30public:
31 constexpr ReverseIterator()
33 = default;
34
35 constexpr explicit ReverseIterator(Iter iter) : m_base(iter) {}
36
37 template<typename U>
39 constexpr ReverseIterator(ReverseIterator<U> const& other) : m_base(other.base()) {}
40
41 template<typename U>
44 constexpr auto operator=(ReverseIterator<U> const& other) -> ReverseIterator& {
45 m_base = other.base();
46 return *this;
47 }
48
49 constexpr auto base() const -> Iter { return m_base; }
50
51 constexpr auto operator*() const -> decltype(auto) {
52 auto copy = base();
53 return *--copy;
54 }
55
56 constexpr auto operator->() const
57 requires(concepts::Pointer<Iter> || requires(Iter const i) { i.operator->(); })
58 {
59 if constexpr (concepts::Pointer<Iter>) {
60 return m_base - 1;
61 } else {
62 return container::prev(base()).operator->();
63 }
64 }
65
66 constexpr void advance_one() { --m_base; }
67 constexpr void back_one() { ++m_base; }
68
69 constexpr void advance_n(SSizeType n)
71 {
72 m_base -= n;
73 }
74
75private:
76 constexpr friend auto tag_invoke(types::Tag<iterator_move>, ReverseIterator const& self) -> decltype(auto)
77 requires(requires { typename meta::IteratorRValue<Iter>; })
78 {
79 auto temp = self.base();
80 return iterator_move(--temp);
81 }
82
83 template<concepts::IndirectlySwappable<Iter> Other>
84 constexpr friend void tag_invoke(types::Tag<iterator_swap>, ReverseIterator const& a,
85 ReverseIterator<Other> const& b) {
86 auto t = a.base();
87 auto u = b.base();
88 iterator_swap(--t, --u);
89 }
90
91 Iter m_base {};
92};
93
94template<typename Iter, concepts::EqualityComparableWith<Iter> U>
95constexpr auto operator==(ReverseIterator<Iter> const& a, ReverseIterator<U> const& b) -> bool {
96 return a.base() == b.base();
97}
98
99template<typename Iter, concepts::ThreeWayComparableWith<Iter> U>
100constexpr auto operator<=>(ReverseIterator<Iter> const& a, ReverseIterator<U> const& b) {
101 return b.base() <=> a.base();
102}
103
104template<typename Iter, typename U>
105constexpr auto operator-(ReverseIterator<Iter> const& a, ReverseIterator<U> const& b) -> decltype(b.base() - a.base()) {
106 return b.base() - a.base();
107}
108
109template<concepts::BidirectionalIterator Iter>
110constexpr auto make_reverse_iterator(Iter iter) {
112}
113}
Definition reverse_iterator.h:26
constexpr ReverseIterator()=default
constexpr ReverseIterator(ReverseIterator< U > const &other)
Definition reverse_iterator.h:39
constexpr void back_one()
Definition reverse_iterator.h:67
constexpr auto operator=(ReverseIterator< U > const &other) -> ReverseIterator &
Definition reverse_iterator.h:44
constexpr auto base() const -> Iter
Definition reverse_iterator.h:49
constexpr void advance_n(SSizeType n)
Definition reverse_iterator.h:69
constexpr friend auto tag_invoke(types::Tag< iterator_move >, ReverseIterator const &self) -> decltype(auto) requires(
Definition reverse_iterator.h:76
constexpr auto operator*() const -> decltype(auto)
Definition reverse_iterator.h:51
constexpr auto operator->() const
Definition reverse_iterator.h:56
constexpr void advance_one()
Definition reverse_iterator.h:66
constexpr friend void tag_invoke(types::Tag< iterator_swap >, ReverseIterator const &a, ReverseIterator< Other > const &b)
Definition reverse_iterator.h:84
constexpr ReverseIterator(Iter iter)
Definition reverse_iterator.h:35
Definition operations.h:19
Definition operations.h:99
Definition operations.h:27
Definition language.h:61
Definition random_access_iterator.h:12
Definition core.h:114
Definition any_storable.h:9
Definition sequence.h:12
constexpr auto prev
Definition prev.h:28
constexpr auto operator<=>(MoveIterator< Iter > const &a, MoveIterator< U > const &b)
Definition move_iterator.h:90
constexpr auto operator-(MoveIterator< Iter > const &a, MoveIterator< U > const &b) -> decltype(a.base() - b.base())
Definition move_iterator.h:95
constexpr auto iterator_move
Definition iterator_move.h:56
constexpr auto operator==(MoveIterator< Iter > const &a, MoveIterator< U > const &b) -> bool
Definition move_iterator.h:85
constexpr auto iterator_swap
Definition iterator_swap.h:49
constexpr auto make_reverse_iterator(Iter iter)
Definition reverse_iterator.h:110
constexpr auto copy
Definition copy.h:30
decltype(container::iterator_move(util::declval< T & >())) IteratorRValue
Definition iterator_rvalue.h:9
decltype(container::iterator_ssize_type(types::in_place_type< meta::RemoveCVRef< T > >)) IteratorSSizeType
Definition iterator_ssize_type.h:8
di::meta::Decay< decltype(T)> Tag
Definition tag_invoke.h:28