nCine 2025.06.r503-ff15d8d
A cross-platform 2D game engine
Loading...
Searching...
No Matches
iterator.h
1#ifndef NCTL_ITERATOR
2#define NCTL_ITERATOR
3
4namespace nctl {
5
15
17template <class Iterator>
19{};
20
22// OPERATIONS
24
25namespace {
26
28 template <class Iterator>
29 inline void advance(Iterator &it, int n, RandomAccessIteratorTag)
30 {
31 it += n;
32 }
33
35 template <class Iterator>
36 inline void advance(Iterator &it, int n, BidirectionalIteratorTag)
37 {
38 if (n < 0)
39 {
40 while (n++)
41 --it;
42 }
43 else
44 {
45 while (n--)
46 ++it;
47 }
48 }
49
51 template <class Iterator>
52 inline void advance(Iterator &it, int n, ForwardIteratorTag)
53 {
54 if (n > 0)
55 {
56 while (n--)
57 ++it;
58 }
59 }
60
61}
62
64template <class Iterator>
65inline void advance(Iterator &it, int n)
66{
67 advance(it, n, IteratorTraits<Iterator>::IteratorCategory());
68}
69
71template <class Iterator>
72inline Iterator next(Iterator it, unsigned int n)
73{
74 advance(it, n);
75 return it;
76}
77
79template <class Iterator>
80inline Iterator next(Iterator it)
81{
82 advance(it, 1);
83 return it;
84}
85
87template <class Iterator>
88inline Iterator prev(Iterator it, unsigned int n)
89{
90 advance(it, -n);
91 return it;
92}
93
95template <class Iterator>
96inline Iterator prev(Iterator it)
97{
98 advance(it, -1);
99 return it;
100}
101
102namespace {
103
105 template <class RandomAccessIterator>
106 inline int distance(RandomAccessIterator &first, const RandomAccessIterator &last, RandomAccessIteratorTag)
107 {
108 return last - first;
109 }
110
112 template <class ForwardIterator>
113 inline int distance(ForwardIterator &first, const ForwardIterator &last, ForwardIteratorTag)
114 {
115 int counter = 0;
116
117 for (; first != last; ++first)
118 counter++;
119
120 return counter;
121 }
122
123}
124
126template <class Iterator>
127inline int distance(Iterator first, const Iterator last)
128{
129 return distance(first, last, IteratorTraits<Iterator>::IteratorCategory());
130}
131
133// REVERSE RANGE ADAPTER
135
136template <class T>
138{
139 T &iterable;
140};
141
142template <class T>
143auto begin(ReversionWrapper<T> c) -> decltype(rBegin(c.iterable))
144{
145 return rBegin(c.iterable);
146}
147
148template <class T>
149auto end(ReversionWrapper<T> c) -> decltype(rEnd(c.iterable))
150{
151 return rEnd(c.iterable);
152}
153
154template <class T>
155ReversionWrapper<T> reverse(T &&iterable)
156{
157 return { iterable };
158}
159
161// RANGE
163
164template <class Container>
165typename Container::Iterator begin(Container &c)
166{
167 return c.begin();
168}
169
170template <class Container>
171typename Container::ConstIterator cBegin(const Container &c)
172{
173 return c.begin();
174}
175
176template <class Container>
177typename Container::Iterator end(Container &c)
178{
179 return c.end();
180}
181
182template <class Container>
183typename Container::ConstIterator cEnd(const Container &c)
184{
185 return c.end();
186}
187
188template <class Container>
189typename Container::ReverseIterator rBegin(Container &c)
190{
191 return c.rBegin();
192}
193
194template <class Container>
195typename Container::ConstReverseIterator crBegin(const Container &c)
196{
197 return c.rBegin();
198}
199
200template <class Container>
201typename Container::ReverseIterator rEnd(Container &c)
202{
203 return c.rEnd();
204}
205
206template <class Container>
207typename Container::ConstReverseIterator crEnd(const Container &c)
208{
209 return c.rEnd();
210}
211
212}
213
214#endif
A unique pointer implementation.
Definition UniquePtr.h:118
Dispatching tag for iterators that can move both ways, one element at a time.
Definition iterator.h:11
Dispatching tag for iterators that can only move forward, one element at a time.
Definition iterator.h:8
Base iterator traits structure.
Definition iterator.h:19
Dispatching tag for iterators that can jump arbitrary distances in both ways.
Definition iterator.h:14
Definition iterator.h:138