di 0.1.0
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;
38 = delete;
39
40 constexpr CountedIterator(Iter iterator, SSizeType n) : m_iterator(util::move(iterator)), m_count(n) {}
41
42 template<typename It>
44 constexpr CountedIterator(CountedIterator<It> const& other) : m_iterator(other.base()), m_count(other.count()) {}
45
46 constexpr auto base() const& -> Iter const& { return m_iterator; }
47 constexpr auto base() && -> Iter { return util::move(m_iterator); }
48
49 constexpr auto count() const -> SSizeType { return m_count; }
50
51 constexpr auto operator*() -> decltype(auto) {
52 DI_ASSERT(count() > 0);
53 return *m_iterator;
54 }
55 constexpr auto operator*() const -> decltype(auto)
56 requires(concepts::Dereferenceable<Iter const>)
57 {
58 DI_ASSERT(count() > 0);
59 return *m_iterator;
60 }
61
62 constexpr auto operator->() const
63 requires(concepts::ContiguousIterator<Iter>)
64 {
65 return util::to_address(m_iterator);
66 }
67
68 constexpr void advance_one() {
69 ++m_iterator;
70 --m_count;
71 }
72
73 constexpr void back_one()
75 {
76 --m_iterator;
77 ++m_count;
78 }
79
80 constexpr void advance_n(SSizeType n)
82 {
83 m_iterator += n;
84 m_count -= n;
85 }
86
87private:
88 constexpr friend auto operator==(CountedIterator const& a, CountedIterator const& b) -> bool {
89 return a.count() == b.count();
90 }
91
92 constexpr friend auto operator==(CountedIterator const& a, DefaultSentinel) -> bool { return a.count() == 0; }
93
94 constexpr friend auto operator<=>(CountedIterator const& a, CountedIterator const& b) -> strong_ordering {
95 return a.count() <=> b.count();
96 }
97
98 constexpr friend auto operator-(CountedIterator const& a, CountedIterator const& b) -> SSizeType {
99 return b.count() - a.count();
100 }
101
102 constexpr friend auto operator-(CountedIterator const& a, DefaultSentinel) -> SSizeType { return -a.count(); }
103
104 constexpr friend auto operator-(DefaultSentinel, CountedIterator const& b) -> SSizeType { return b.count(); }
105
106 constexpr friend auto tag_invoke(types::Tag<iterator_move>, CountedIterator const& self) -> decltype(auto)
108 {
109 DI_ASSERT(self.count() > 0);
110 return iterator_move(self.base());
111 }
112
113 template<concepts::IndirectlySwappable<Iter> It>
114 constexpr friend void tag_invoke(types::Tag<iterator_swap>, CountedIterator const& a,
115 CountedIterator<It> const& b) {
116 DI_ASSERT(a.count() > 0);
117 DI_ASSERT(b.count() > 0);
118 iterator_swap(a.base(), b.base());
119 }
120
121 Iter m_iterator;
122 SSizeType m_count;
123};
124}
#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:102
constexpr auto operator*() const -> decltype(auto) requires(concepts::Dereferenceable< Iter const >)
Definition counted_iterator.h:55
constexpr void back_one()
Definition counted_iterator.h:73
constexpr friend auto operator<=>(CountedIterator const &a, CountedIterator const &b) -> strong_ordering
Definition counted_iterator.h:94
CountedIterator(CountedIterator const &)=default
constexpr friend auto operator-(DefaultSentinel, CountedIterator const &b) -> SSizeType
Definition counted_iterator.h:104
constexpr auto base() const &-> Iter const &
Definition counted_iterator.h:46
constexpr auto base() &&-> Iter
Definition counted_iterator.h:47
CountedIterator(CountedIterator &&)=default
constexpr void advance_one()
Definition counted_iterator.h:68
constexpr friend auto operator==(CountedIterator const &a, DefaultSentinel) -> bool
Definition counted_iterator.h:92
constexpr friend void tag_invoke(types::Tag< iterator_swap >, CountedIterator const &a, CountedIterator< It > const &b)
Definition counted_iterator.h:114
constexpr auto operator->() const
Definition counted_iterator.h:62
constexpr friend auto tag_invoke(types::Tag< iterator_move >, CountedIterator const &self) -> decltype(auto) requires(concepts::InputIterator< Iter >)
Definition counted_iterator.h:106
constexpr friend auto operator-(CountedIterator const &a, CountedIterator const &b) -> SSizeType
Definition counted_iterator.h:98
constexpr void advance_n(SSizeType n)
Definition counted_iterator.h:80
auto operator=(CountedIterator const &) -> CountedIterator &requires(!concepts::ForwardIterator< Iter >)=delete
CountedIterator(CountedIterator const &)=delete
constexpr auto count() const -> SSizeType
Definition counted_iterator.h:49
constexpr CountedIterator(Iter iterator, SSizeType n)
Definition counted_iterator.h:40
constexpr friend auto operator==(CountedIterator const &a, CountedIterator const &b) -> bool
Definition counted_iterator.h:88
constexpr CountedIterator(CountedIterator< It > const &other)
Definition counted_iterator.h:44
constexpr auto operator*() -> decltype(auto)
Definition counted_iterator.h:51
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