libbmb
Modern implementation of STL
Loading...
Searching...
No Matches
iterators.h
Go to the documentation of this file.
1#pragma once
2
9#include <cstddef>
10
11#include "utils/concepts.h"
12#include "utils/move.h"
13#include "utils/type_traits.h"
14
15namespace bmb {
16
29
30namespace detail {
31// NOTE: this makes IteratorTraits SFINAE friendly
32
33template <typename Iter, typename = void_t<>>
35
36template <typename Iter>
38 typename Iter::reference,
39 typename Iter::pointer,
40 typename Iter::difference_type,
41 typename Iter::iterator_category>> {
42 using value_type = Iter::value_type;
43 using reference = Iter::reference;
44 using pointer = Iter::pointer;
45 using difference_type = Iter::difference_type;
46 using iterator_category = Iter::iterator_category;
47};
48
49} // namespace detail
50
52template <typename Iter>
54
55template <typename T>
63
64// TODO: improve these concepts. Now they aren't as general as 'std::' ones.
65// NOTE: for info about requirements see:
66// https://en.cppreference.com/w/cpp/named_req/Iterator.
67
69template <typename Iter>
74
76template <typename Iter, typename T>
81
83template <typename Iter>
85 { it++ } -> SameAs<Iter>;
86};
87
89template <typename Iter>
91 { --it } -> SameAs<Iter&>;
92 { it-- } -> SameAs<Iter>;
93};
94
96template <typename Iter>
99 && requires(Iter i, Iter j, IteratorTraits<Iter>::difference_type n) {
100 { i += n } -> SameAs<Iter&>;
101 { i -= n } -> SameAs<Iter&>;
102
103 { i + n } -> SameAs<Iter>;
104 { n + i } -> SameAs<Iter>;
105
106 { i - n } -> SameAs<Iter>;
107
109
110 { i < j } -> ConvertibleTo<bool>;
111 { i > j } -> ConvertibleTo<bool>;
112 { i <= j } -> ConvertibleTo<bool>;
113 { i >= j } -> ConvertibleTo<bool>;
114 };
115
117template <typename Iter>
119
134template <InputIterator Iter>
138
139 // If can - do it for O(1), otherwise iterate through all range
141 return last - first;
142 }
143
144 diff_t n = 0;
145 while (first != last) {
146 ++first;
147 ++n;
148 }
149 return n;
150}
151
167template <InputIterator Iter, typename Distance>
171
172 auto n = static_cast<diff_t>(dist);
173
174 // Make operations according to the iterator category
176 it += n;
177
178 else {
179 while (n > 0) {
180 --n;
181 ++it;
182 }
183
185 while (n < 0) {
186 ++n;
187 --it;
188 }
189 }
190 }
191}
192
203template <InputIterator Iter>
205 advance(it, n);
206 return it;
207}
208
220template <BidirectionalIterator Iter>
222 advance(it, -n);
223 return it;
224}
225
226} // namespace bmb
BidirectionalIterator.
Definition iterators.h:90
ContiguousIterator.
Definition iterators.h:118
ConvertibleTo.
Definition concepts.h:78
ForwardIterator.
Definition iterators.h:84
InputIterator.
Definition iterators.h:70
OutputIterator.
Definition iterators.h:77
RandomAccessIterator.
Definition iterators.h:98
SameAs.
Definition concepts.h:23
Definition algo_base.h:14
void advance(Iter &it, Distance dist)
Increments given iterator by dist.
Definition iterators.h:168
void void_t
Definition type_traits.h:257
Iter next(Iter it, typename IteratorTraits< Iter >::difference_type n=1)
Returns the n-th successor of given iterator.
Definition iterators.h:204
remove_const< T >::type remove_const_t
remove_const_t
Definition type_traits.h:162
auto distance(Iter first, Iter last) -> IteratorTraits< Iter >::difference_type
Returns the number of elements in [first, last).
Definition iterators.h:135
Iter prev(Iter it, typename IteratorTraits< Iter >::difference_type n=1)
Returns the n-th predecessor of given iterator. If n < 0, will chose n-th successor.
Definition iterators.h:221
constexpr T && forward(remove_ref_t< T > &value) noexcept
Forward a lvalue.
Definition move.h:33
T & reference
Definition iterators.h:58
ptrdiff_t difference_type
Definition iterators.h:60
T * pointer
Definition iterators.h:59
remove_const_t< T > value_type
Definition iterators.h:57
IteratorTraits.
Definition iterators.h:53
bidirectional_iter_tag
Definition iterators.h:24
contiguous_iter_tag
Definition iterators.h:28
Definition iterators.h:34
forward_iter_tag
Definition iterators.h:22
input_iter_tag
Definition iterators.h:18
output_iter_tag
Definition iterators.h:20
random_access_iter_tag
Definition iterators.h:26