nCine 2025.10.r509-f5e0959
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
22template <class T>
23struct IteratorTraits<T *>
24{
25 using ValueType = T;
26 using Pointer = T *;
27 using Reference = T &;
29};
30
32template <class T>
34{
35 using ValueType = T;
36 using Pointer = const T *;
37 using Reference = const T &;
39};
40
42// OPERATIONS
44
46template <class Iterator>
47inline void advance(Iterator &it, int n, RandomAccessIteratorTag)
48{
49 it += n;
50}
51
53template <class Iterator>
54inline void advance(Iterator &it, int n, BidirectionalIteratorTag)
55{
56 if (n < 0)
57 {
58 while (n++)
59 --it;
60 }
61 else
62 {
63 while (n--)
64 ++it;
65 }
66}
67
69template <class Iterator>
70inline void advance(Iterator &it, int n, ForwardIteratorTag)
71{
72 if (n > 0)
73 {
74 while (n--)
75 ++it;
76 }
77}
78
80template <class Iterator>
81inline void advance(Iterator &it, int n)
82{
83 advance(it, n, typename IteratorTraits<Iterator>::IteratorCategory());
84}
85
87template <class Iterator>
88inline Iterator next(Iterator it, unsigned int n)
89{
90 advance(it, n);
91 return it;
92}
93
95template <class Iterator>
96inline Iterator next(Iterator it)
97{
98 advance(it, 1);
99 return it;
100}
101
103template <class Iterator>
104inline Iterator prev(Iterator it, unsigned int n)
105{
106 advance(it, -n);
107 return it;
108}
109
111template <class Iterator>
112inline Iterator prev(Iterator it)
113{
114 advance(it, -1);
115 return it;
116}
117
119template <class RandomAccessIterator>
120inline int distance(RandomAccessIterator first, RandomAccessIterator last, RandomAccessIteratorTag)
121{
122 return last - first;
123}
124
126template <class ForwardIterator>
127inline int distance(ForwardIterator first, ForwardIterator last, ForwardIteratorTag)
128{
129 int counter = 0;
130
131 for (; first != last; ++first)
132 counter++;
133
134 return counter;
135}
136
138template <class Iterator>
139inline int distance(Iterator first, Iterator last)
140{
141 return distance(first, last, typename IteratorTraits<Iterator>::IteratorCategory());
142}
143
145// REVERSE RANGE ADAPTER
147
148template <class T>
150{
151 T &iterable;
152};
153
154template <class T>
155auto begin(ReversionWrapper<T> c) -> decltype(rBegin(c.iterable))
156{
157 return rBegin(c.iterable);
158}
159
160template <class T>
161auto end(ReversionWrapper<T> c) -> decltype(rEnd(c.iterable))
162{
163 return rEnd(c.iterable);
164}
165
166template <class T>
167ReversionWrapper<T> reverse(T &&iterable)
168{
169 return { iterable };
170}
171
173// RANGE
175
176template <class Container>
177typename Container::Iterator begin(Container &c)
178{
179 return c.begin();
180}
181
182template <class Container>
183typename Container::ConstIterator cBegin(const Container &c)
184{
185 return c.begin();
186}
187
188template <class Container>
189typename Container::Iterator end(Container &c)
190{
191 return c.end();
192}
193
194template <class Container>
195typename Container::ConstIterator cEnd(const Container &c)
196{
197 return c.end();
198}
199
200template <class Container>
201typename Container::ReverseIterator rBegin(Container &c)
202{
203 return c.rBegin();
204}
205
206template <class Container>
207typename Container::ConstReverseIterator crBegin(const Container &c)
208{
209 return c.rBegin();
210}
211
212template <class Container>
213typename Container::ReverseIterator rEnd(Container &c)
214{
215 return c.rEnd();
216}
217
218template <class Container>
219typename Container::ConstReverseIterator crEnd(const Container &c)
220{
221 return c.rEnd();
222}
223
224}
225
226#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:150