Iros
 
Loading...
Searching...
No Matches
move_iterator.h
Go to the documentation of this file.
1#pragma once
2
10#include "di/meta/compare.h"
11#include "di/meta/core.h"
12#include "di/meta/operations.h"
13#include "di/util/move.h"
14
15namespace di::container {
16template<concepts::InputIterator Iter>
18 : public IteratorBase<
19 MoveIterator<Iter>,
20 meta::Conditional<concepts::RandomAccessIterator<Iter>, RandomAccessIteratorTag,
21 meta::Conditional<concepts::BidirectionalIterator<Iter>, BidirectionalIteratorTag,
22 meta::Conditional<concepts::ForwardIterator<Iter>, ForwardIteratorTag,
23 InputIteratorTag>>>,
24 meta::IteratorValue<Iter>, meta::IteratorSSizeType<Iter>> {
25private:
26 using SSizeType = meta::IteratorSSizeType<Iter>;
27
28public:
29 constexpr MoveIterator()
31 = default;
32
33 constexpr explicit MoveIterator(Iter iterator) : m_iterator(util::move(iterator)) {}
34
35 template<typename Other>
37 constexpr MoveIterator(MoveIterator<Other> const& other) : m_iterator(other.m_iterator) {}
38
39 template<typename Other>
42 constexpr auto operator=(MoveIterator<Other> const& other) -> MoveIterator& {
43 this->m_iterator = other.m_iterator;
44 return *this;
45 }
46
47 constexpr auto base() const& -> Iter const& { return m_iterator; }
48 constexpr auto base() && -> Iter { return util::move(m_iterator); }
49
50 constexpr auto operator*() const -> meta::IteratorRValue<Iter> { return iterator_move(m_iterator); }
51
52 constexpr void advance_one() { ++m_iterator; }
53
54 constexpr void back_one()
56 {
57 --m_iterator;
58 }
59
60 constexpr void advance_n(SSizeType n)
62 {
63 m_iterator += n;
64 }
65
66private:
67 template<concepts::InputIterator Other>
68 friend class MoveIterator;
69
70 constexpr friend auto tag_invoke(types::Tag<iterator_move>, MoveIterator const& self) -> decltype(auto)
71 requires(requires { typename meta::IteratorRValue<Iter>; })
72 {
73 return iterator_move(self.base());
74 }
75
76 template<concepts::IndirectlySwappable<Iter> Other>
77 constexpr friend void tag_invoke(types::Tag<iterator_swap>, MoveIterator const& a, MoveIterator<Other> const& b) {
78 iterator_swap(a.base(), b.base());
79 }
80
81 Iter m_iterator {};
82};
83
84template<typename Iter, concepts::EqualityComparableWith<Iter> U>
85constexpr auto operator==(MoveIterator<Iter> const& a, MoveIterator<U> const& b) -> bool {
86 return a.base() == b.base();
87}
88
89template<typename Iter, concepts::ThreeWayComparableWith<Iter> U>
90constexpr auto operator<=>(MoveIterator<Iter> const& a, MoveIterator<U> const& b) {
91 return a.base() <=> b.base();
92}
93
94template<typename Iter, typename U>
95constexpr auto operator-(MoveIterator<Iter> const& a, MoveIterator<U> const& b) -> decltype(a.base() - b.base()) {
96 return a.base() - b.base();
97}
98
99template<concepts::InputIterator Iter>
100constexpr auto make_move_iterator(Iter iterator) {
101 return MoveIterator<Iter>(util::move(iterator));
102}
103}
Definition move_iterator.h:24
constexpr void back_one()
Definition move_iterator.h:54
constexpr MoveIterator(MoveIterator< Other > const &other)
Definition move_iterator.h:37
constexpr MoveIterator(Iter iterator)
Definition move_iterator.h:33
constexpr friend void tag_invoke(types::Tag< iterator_swap >, MoveIterator const &a, MoveIterator< Other > const &b)
Definition move_iterator.h:77
constexpr auto operator*() const -> meta::IteratorRValue< Iter >
Definition move_iterator.h:50
constexpr auto operator=(MoveIterator< Other > const &other) -> MoveIterator &
Definition move_iterator.h:42
constexpr auto base() const &-> Iter const &
Definition move_iterator.h:47
constexpr friend auto tag_invoke(types::Tag< iterator_move >, MoveIterator const &self) -> decltype(auto) requires(
Definition move_iterator.h:70
constexpr void advance_one()
Definition move_iterator.h:52
constexpr void advance_n(SSizeType n)
Definition move_iterator.h:60
friend class MoveIterator
Definition move_iterator.h:68
constexpr MoveIterator()=default
constexpr auto base() &&-> Iter
Definition move_iterator.h:48
Definition operations.h:19
Definition bidirectional_iterator.h:8
Definition operations.h:99
Definition operations.h:24
Definition random_access_iterator.h:12
Definition core.h:114
Definition sequence.h:12
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 move
Definition move.h:38
constexpr auto make_move_iterator(Iter iterator)
Definition move_iterator.h:100
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
Definition merge_interfaces.h:6
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
Definition vocab.h:96