FastLED 3.9.15
Loading...
Searching...
No Matches
iterator.h
Go to the documentation of this file.
1#pragma once
2
3#include "fl/stl/move.h"
4#include "fl/stl/noexcept.h"
5
6namespace fl {
7
8// Iterator category tags
14
18template<typename Iterator, typename = void>
20 // Try to use nested typedefs if they exist, otherwise provide defaults
21 typedef typename Iterator::value_type value_type;
22 typedef typename Iterator::reference reference;
23 typedef typename Iterator::pointer pointer;
24 typedef typename Iterator::difference_type difference_type;
25 // iterator_category is optional - provide a default forward_iterator_tag if missing
27};
28
30template<typename T>
38
40template<typename T>
41struct iterator_traits<const T*> {
42 typedef T value_type;
43 typedef const T& reference;
44 typedef const T* pointer;
47};
48
74template <typename Container>
76protected:
77 Container* container;
78
79public:
80 // Iterator traits
81 typedef Container container_type;
82 typedef typename Container::value_type container_value_type;
83 typedef void value_type;
84 typedef void difference_type;
85 typedef void pointer;
86 typedef void reference;
87 typedef void iterator_category; // Output iterator
88
89 // Constructor
90 explicit back_insert_iterator(Container& c) FL_NOEXCEPT : container(&c) {}
91
92 // Assignment operator - calls push_back on the container
93 // Uses template to accept any type that the container's push_back accepts
94 template <typename T>
96 container->push_back(value);
97 return *this;
98 }
99
100 // Move assignment operator - calls push_back with move
101 // Uses template to accept any type that the container's push_back accepts
102 template <typename T>
104 container->push_back(fl::move(value));
105 return *this;
106 }
107
108 // Dereference operator (no-op for output iterator)
110 return *this;
111 }
112
113 // Pre-increment operator (no-op for output iterator)
115 return *this;
116 }
117
118 // Post-increment operator (no-op for output iterator)
120 return *this;
121 }
122};
123
138template <typename Container>
142
159template <typename Iterator>
161public:
162 typedef Iterator iterator_type;
163 typedef typename Iterator::value_type value_type;
164 typedef typename Iterator::reference reference;
165 typedef typename Iterator::pointer pointer;
166 typedef typename Iterator::difference_type difference_type;
167
168protected:
169 Iterator current;
170
171public:
172 // Constructors
174
175 explicit reverse_iterator(Iterator it) FL_NOEXCEPT : current(it) {}
176
177 template <typename U>
179
180 // Access to underlying iterator
181 Iterator base() const FL_NOEXCEPT { return current; }
182
183 // Dereference - returns element before current position
185 Iterator tmp = current;
186 --tmp;
187 return *tmp;
188 }
189
191 Iterator tmp = current;
192 --tmp;
193 return &(*tmp);
194 }
195
196 // Pre-increment - moves backwards
198 --current;
199 return *this;
200 }
201
202 // Post-increment
204 reverse_iterator tmp = *this;
205 --current;
206 return tmp;
207 }
208
209 // Pre-decrement - moves forwards
211 ++current;
212 return *this;
213 }
214
215 // Post-decrement
217 reverse_iterator tmp = *this;
218 ++current;
219 return tmp;
220 }
221
222 // Random access operators
226
230
232 current -= n;
233 return *this;
234 }
235
237 current += n;
238 return *this;
239 }
240
242 return other.current - current;
243 }
244
246 return *(*this + n);
247 }
248
249 // Comparison operators
250 bool operator==(const reverse_iterator& other) const FL_NOEXCEPT {
251 return current == other.current;
252 }
253
254 bool operator!=(const reverse_iterator& other) const FL_NOEXCEPT {
255 return current != other.current;
256 }
257
258 bool operator<(const reverse_iterator& other) const FL_NOEXCEPT {
259 return current > other.current;
260 }
261
262 bool operator>(const reverse_iterator& other) const FL_NOEXCEPT {
263 return current < other.current;
264 }
265
266 bool operator<=(const reverse_iterator& other) const FL_NOEXCEPT {
267 return current >= other.current;
268 }
269
270 bool operator>=(const reverse_iterator& other) const FL_NOEXCEPT {
271 return current <= other.current;
272 }
273
274 // For comparing with different iterator types
275 template <typename U>
276 bool operator==(const reverse_iterator<U>& other) const FL_NOEXCEPT {
277 return current == other.base();
278 }
279
280 template <typename U>
281 bool operator!=(const reverse_iterator<U>& other) const FL_NOEXCEPT {
282 return current != other.base();
283 }
284};
285
286} // namespace fl
back_insert_iterator & operator=(T &&value) FL_NOEXCEPT
Definition iterator.h:103
back_insert_iterator & operator++() FL_NOEXCEPT
Definition iterator.h:114
back_insert_iterator(Container &c) FL_NOEXCEPT
Definition iterator.h:90
back_insert_iterator & operator*() FL_NOEXCEPT
Definition iterator.h:109
Container * container
Definition iterator.h:77
Container::value_type container_value_type
Definition iterator.h:82
back_insert_iterator & operator=(const T &value) FL_NOEXCEPT
Definition iterator.h:95
back_insert_iterator operator++(int) FL_NOEXCEPT
Definition iterator.h:119
Back insert iterator - an output iterator that inserts elements at the end of a container.
Definition iterator.h:75
reverse_iterator & operator-=(difference_type n) FL_NOEXCEPT
Definition iterator.h:236
bool operator!=(const reverse_iterator &other) const FL_NOEXCEPT
Definition iterator.h:254
bool operator!=(const reverse_iterator< U > &other) const FL_NOEXCEPT
Definition iterator.h:281
pointer operator->() const FL_NOEXCEPT
Definition iterator.h:190
bool operator<=(const reverse_iterator &other) const FL_NOEXCEPT
Definition iterator.h:266
iterator::reference reference
Definition iterator.h:164
reverse_iterator() FL_NOEXCEPT
Definition iterator.h:173
reverse_iterator & operator--() FL_NOEXCEPT
Definition iterator.h:210
reverse_iterator(Iterator it) FL_NOEXCEPT
Definition iterator.h:175
Iterator base() const FL_NOEXCEPT
Definition iterator.h:181
bool operator>=(const reverse_iterator &other) const FL_NOEXCEPT
Definition iterator.h:270
iterator::difference_type difference_type
Definition iterator.h:166
iterator::value_type value_type
Definition iterator.h:163
reference operator*() const FL_NOEXCEPT
Definition iterator.h:184
reverse_iterator operator--(int) FL_NOEXCEPT
Definition iterator.h:216
bool operator>(const reverse_iterator &other) const FL_NOEXCEPT
Definition iterator.h:262
bool operator<(const reverse_iterator &other) const FL_NOEXCEPT
Definition iterator.h:258
bool operator==(const reverse_iterator &other) const FL_NOEXCEPT
Definition iterator.h:250
reverse_iterator(const reverse_iterator< U > &other) FL_NOEXCEPT
Definition iterator.h:178
reverse_iterator operator-(difference_type n) const FL_NOEXCEPT
Definition iterator.h:227
difference_type operator-(const reverse_iterator &other) const FL_NOEXCEPT
Definition iterator.h:241
reverse_iterator & operator++() FL_NOEXCEPT
Definition iterator.h:197
bool operator==(const reverse_iterator< U > &other) const FL_NOEXCEPT
Definition iterator.h:276
reverse_iterator operator++(int) FL_NOEXCEPT
Definition iterator.h:203
reverse_iterator & operator+=(difference_type n) FL_NOEXCEPT
Definition iterator.h:231
reference operator[](difference_type n) const FL_NOEXCEPT
Definition iterator.h:245
reverse_iterator operator+(difference_type n) const FL_NOEXCEPT
Definition iterator.h:223
constexpr remove_reference< T >::type && move(T &&t) FL_NOEXCEPT
Definition s16x16x4.h:28
constexpr int type_rank< T >::value
back_insert_iterator< Container > back_inserter(Container &c) FL_NOEXCEPT
Helper function to create a back_insert_iterator.
Definition iterator.h:139
fl::ptrdiff ptrdiff_t
Definition s16x16x4.h:226
Base definition for an LED controller.
Definition crgb.hpp:179
forward_iterator_tag iterator_category
Definition iterator.h:26
random_access_iterator_tag iterator_category
Definition iterator.h:36
Iterator::pointer pointer
Definition iterator.h:23
Iterator::reference reference
Definition iterator.h:22
Iterator::difference_type difference_type
Definition iterator.h:24
Iterator::value_type value_type
Definition iterator.h:21
random_access_iterator_tag iterator_category
Definition iterator.h:46
Iterator traits - provides standard typedefs for any iterator type Specializations provided for raw p...
Definition iterator.h:19
#define FL_NOEXCEPT