Iros
 
Loading...
Searching...
No Matches
counted_iterator.h
Go to the documentation of this file.
1#pragma once
2
10#include "di/types/prelude.h"
11#include "di/util/move.h"
12#include "di/util/to_address.h"
13
14namespace di::container {
15template<concepts::Iterator Iter>
17 : public IteratorBase<CountedIterator<Iter>, meta::IteratorCategory<Iter>, meta::IteratorValue<Iter>,
18 meta::IteratorSSizeType<Iter>> {
19private:
20 using SSizeType = meta::IteratorSSizeType<Iter>;
21
22public:
25 = default;
26
29
30 auto operator=(CountedIterator const&) -> CountedIterator& = default;
32
35 = delete;
37
38 constexpr CountedIterator(Iter iterator, SSizeType n) : m_iterator(util::move(iterator)), m_count(n) {}
39
40 template<typename It>
42 constexpr CountedIterator(CountedIterator<It> const& other) : m_iterator(other.base()), m_count(other.count()) {}
43
44 constexpr auto base() const& -> Iter const& { return m_iterator; }
45 constexpr auto base() && -> Iter { return util::move(m_iterator); }
46
47 constexpr auto count() const -> SSizeType { return m_count; }
48
49 constexpr auto operator*() -> decltype(auto) {
50 DI_ASSERT(count() > 0);
51 return *m_iterator;
52 }
53 constexpr auto operator*() const -> decltype(auto)
54 requires(concepts::Dereferenceable<Iter const>)
55 {
56 DI_ASSERT(count() > 0);
57 return *m_iterator;
58 }
59
60 constexpr auto operator->() const
61 requires(concepts::ContiguousIterator<Iter>)
62 {
63 return util::to_address(m_iterator);
64 }
65
66 constexpr void advance_one() {
67 ++m_iterator;
68 --m_count;
69 }
70
71 constexpr void back_one()
73 {
74 --m_iterator;
75 ++m_count;
76 }
77
78 constexpr void advance_n(SSizeType n)
80 {
81 m_iterator += n;
82 m_count -= n;
83 }
84
85private:
86 constexpr friend auto operator==(CountedIterator const& a, CountedIterator const& b) -> bool {
87 return a.count() == b.count();
88 }
89
90 constexpr friend auto operator==(CountedIterator const& a, DefaultSentinel) -> bool { return a.count() == 0; }
91
92 constexpr friend auto operator<=>(CountedIterator const& a, CountedIterator const& b) -> strong_ordering {
93 return a.count() <=> b.count();
94 }
95
96 constexpr friend auto operator-(CountedIterator const& a, CountedIterator const& b) -> SSizeType {
97 return b.count() - a.count();
98 }
99
100 constexpr friend auto operator-(CountedIterator const& a, DefaultSentinel) -> SSizeType { return -a.count(); }
101
102 constexpr friend auto operator-(DefaultSentinel, CountedIterator const& b) -> SSizeType { return b.count(); }
103
104 constexpr friend auto tag_invoke(types::Tag<iterator_move>, CountedIterator const& self) -> decltype(auto)
106 {
107 DI_ASSERT(self.count() > 0);
108 return iterator_move(self.base());
109 }
110
111 template<concepts::IndirectlySwappable<Iter> It>
112 constexpr friend void tag_invoke(types::Tag<iterator_swap>, CountedIterator const& a,
113 CountedIterator<It> const& b) {
114 DI_ASSERT(a.count() > 0);
115 DI_ASSERT(b.count() > 0);
116 iterator_swap(a.base(), b.base());
117 }
118
119 Iter m_iterator;
120 SSizeType m_count;
121};
122}
#define DI_ASSERT(...)
Definition assert_bool.h:7
auto operator=(CountedIterator &&) -> CountedIterator &=default
constexpr friend auto operator-(CountedIterator const &a, DefaultSentinel) -> SSizeType
Definition counted_iterator.h:100
constexpr auto operator*() const -> decltype(auto) requires(concepts::Dereferenceable< Iter const >)
Definition counted_iterator.h:53
constexpr void back_one()
Definition counted_iterator.h:71
constexpr friend auto operator<=>(CountedIterator const &a, CountedIterator const &b) -> strong_ordering
Definition counted_iterator.h:92
CountedIterator(CountedIterator const &)=default
constexpr friend auto operator-(DefaultSentinel, CountedIterator const &b) -> SSizeType
Definition counted_iterator.h:102
constexpr auto base() const &-> Iter const &
Definition counted_iterator.h:44
constexpr auto base() &&-> Iter
Definition counted_iterator.h:45
CountedIterator(CountedIterator &&)=default
constexpr void advance_one()
Definition counted_iterator.h:66
constexpr friend auto operator==(CountedIterator const &a, DefaultSentinel) -> bool
Definition counted_iterator.h:90
constexpr friend void tag_invoke(types::Tag< iterator_swap >, CountedIterator const &a, CountedIterator< It > const &b)
Definition counted_iterator.h:112
constexpr auto operator->() const
Definition counted_iterator.h:60
constexpr friend auto tag_invoke(types::Tag< iterator_move >, CountedIterator const &self) -> decltype(auto) requires(concepts::InputIterator< Iter >)
Definition counted_iterator.h:104
constexpr friend auto operator-(CountedIterator const &a, CountedIterator const &b) -> SSizeType
Definition counted_iterator.h:96
constexpr void advance_n(SSizeType n)
Definition counted_iterator.h:78
auto operator=(CountedIterator const &) -> CountedIterator &requires(!concepts::ForwardIterator< Iter >)=delete
CountedIterator(CountedIterator const &)=delete
constexpr auto count() const -> SSizeType
Definition counted_iterator.h:47
constexpr CountedIterator(Iter iterator, SSizeType n)
Definition counted_iterator.h:38
constexpr friend auto operator==(CountedIterator const &a, CountedIterator const &b) -> bool
Definition counted_iterator.h:86
constexpr CountedIterator(CountedIterator< It > const &other)
Definition counted_iterator.h:42
constexpr auto operator*() -> decltype(auto)
Definition counted_iterator.h:49
auto operator=(CountedIterator const &) -> CountedIterator &=default
Definition bidirectional_iterator.h:8
Definition operations.h:99
Definition operations.h:27
Definition forward_iterator.h:10
Definition input_iterator.h:9
Definition random_access_iterator.h:12
Definition any_storable.h:9
Definition sequence.h:12
constexpr auto iterator_move
Definition iterator_move.h:56
constexpr auto move
Definition move.h:38
constexpr auto iterator_swap
Definition iterator_swap.h:49
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
constexpr auto to_address
Definition to_address.h:22
Definition default_sentinel.h:4