StormByte C++ Library 0.0.9999
StormByte is a comprehensive, cross-platform C++ library aimed at easing system programming, configuration management, logging, and database handling tasks. This library provides a unified API that abstracts away the complexities and inconsistencies of different platforms (Windows, Linux).
Loading...
Searching...
No Matches
iterable.hxx
1#pragma once
2
3#include <StormByte/exception.hxx>
4
5#include <iterator>
6#include <utility>
7
15namespace StormByte {
24 template <typename Container>
25 class Iterable {
26 protected:
27 Container m_data;
28 public:
29 using value_type = typename Container::value_type;
30 using size_type = typename Container::size_type;
31 using difference_type = typename Container::difference_type;
32 using reference = typename Container::reference;
33 using const_reference = typename Container::const_reference;
34 using pointer = typename Container::pointer;
35 using const_pointer = typename Container::const_pointer;
36
41 class Iterator {
42 friend class Iterable;
43 public:
44 using iterator_category = std::random_access_iterator_tag;
45 using value_type = typename Container::value_type;
46 using difference_type = typename Container::difference_type;
47 using pointer = typename Container::pointer;
48 using reference = typename Container::reference;
49
54 reference operator*() { return *m_it; }
55
60 pointer operator->() { return m_it.operator->(); }
61
66 Iterator& operator++() { ++m_it; return *this; }
67
72 Iterator operator++(int) { Iterator tmp = *this; ++m_it; return tmp; }
73
78 Iterator& operator--() { --m_it; return *this; }
79
84 Iterator operator--(int) { Iterator tmp = *this; --m_it; return tmp; }
85
91 Iterator& operator+=(difference_type n) { m_it += n; return *this; }
92
98 Iterator& operator-=(difference_type n) { m_it -= n; return *this; }
99
105 Iterator operator+(difference_type n) const { return Iterator(m_it + n); }
106
112 Iterator operator-(difference_type n) const { return Iterator(m_it - n); }
113
119 difference_type operator-(const Iterator& other) const { return m_it - other.m_it; }
120
126 bool operator==(const Iterator& other) const { return m_it == other.m_it; }
127
133 bool operator!=(const Iterator& other) const { return m_it != other.m_it; }
134
135 private:
136 typename Container::iterator m_it;
137
142 Iterator(typename Container::iterator it): m_it(it) {}
143 };
144
150 friend class Iterable;
151 public:
152 using iterator_category = std::random_access_iterator_tag;
153 using value_type = typename Container::value_type;
154 using difference_type = typename Container::difference_type;
155 using pointer = typename Container::const_pointer;
156 using reference = typename Container::const_reference;
157
162 reference operator*() const { return *m_it; }
163
168 pointer operator->() const { return m_it.operator->(); }
169
174 ConstIterator& operator++() { ++m_it; return *this; }
175
180 ConstIterator operator++(int) { ConstIterator tmp = *this; ++m_it; return tmp; }
181
186 ConstIterator& operator--() { --m_it; return *this; }
187
192 ConstIterator operator--(int) { ConstIterator tmp = *this; --m_it; return tmp; }
193
199 ConstIterator& operator+=(difference_type n) { m_it += n; return *this; }
200
206 ConstIterator& operator-=(difference_type n) { m_it -= n; return *this; }
207
213 ConstIterator operator+(difference_type n) const { return ConstIterator(m_it + n); }
214
220 ConstIterator operator-(difference_type n) const { return ConstIterator(m_it - n); }
221
227 difference_type operator-(const ConstIterator& other) const { return m_it - other.m_it; }
228
234 bool operator==(const ConstIterator& other) const { return m_it == other.m_it; }
235
241 bool operator!=(const ConstIterator& other) const { return m_it != other.m_it; }
242
243 private:
244 typename Container::const_iterator m_it;
245
250 ConstIterator(typename Container::const_iterator it): m_it(it) {}
251 };
252
253 using iterator = Iterator;
254 using const_iterator = ConstIterator;
255 using reverse_iterator = std::reverse_iterator<iterator>;
256 using const_reverse_iterator = std::reverse_iterator<const_iterator>;
257
261 Iterable() = default;
262
267 explicit Iterable(const Container& data): m_data(data) {}
268
273 explicit Iterable(Container&& data): m_data(std::move(data)) {}
274
278 Iterable(const Iterable&) = default;
279
283 Iterable(Iterable&&) = default;
284
288 virtual ~Iterable() = default;
289
295 Iterable& operator=(const Iterable&) = default;
296
303
308 iterator begin() noexcept { return iterator(m_data.begin()); }
309
314 iterator end() noexcept { return iterator(m_data.end()); }
315
320 const_iterator begin() const noexcept { return const_iterator(m_data.begin()); }
321
326 const_iterator end() const noexcept { return const_iterator(m_data.end()); }
327
332 const_iterator cbegin() const noexcept { return const_iterator(m_data.cbegin()); }
333
338 const_iterator cend() const noexcept { return const_iterator(m_data.cend()); }
339
344 reverse_iterator rbegin() noexcept { return reverse_iterator(end()); }
345
350 reverse_iterator rend() noexcept { return reverse_iterator(begin()); }
351
356 const_reverse_iterator rbegin() const noexcept { return const_reverse_iterator(end()); }
357
362 const_reverse_iterator rend() const noexcept { return const_reverse_iterator(begin()); }
363
368 const_reverse_iterator crbegin() const noexcept { return const_reverse_iterator(cend()); }
369
374 const_reverse_iterator crend() const noexcept { return const_reverse_iterator(cbegin()); }
375
380 size_type size() const noexcept { return m_data.size(); }
381
386 bool empty() const noexcept { return m_data.empty(); }
387
393 reference operator[](size_type i) {
394 if (i >= m_data.size())
395 throw OutOfBoundsError("Index {} out of bounds in Iterable::operator[]", i);
396 return m_data[i];
397 }
398
404 const_reference operator[](size_type i) const {
405 if (i >= m_data.size())
406 throw OutOfBoundsError("Index {} out of bounds in Iterable::operator[]", i);
407 return m_data[i];
408 }
409
414 void add(const value_type& value) { m_data.push_back(value); }
415
420 void add(value_type&& value) { m_data.push_back(std::move(value)); }
421 };
422}
Wrapper const iterator for Iterable.
Definition iterable.hxx:149
ConstIterator operator++(int)
Post-increment operator.
Definition iterable.hxx:180
ConstIterator & operator-=(difference_type n)
Compound subtraction operator.
Definition iterable.hxx:206
ConstIterator & operator--()
Pre-decrement operator.
Definition iterable.hxx:186
ConstIterator operator-(difference_type n) const
Subtraction operator.
Definition iterable.hxx:220
reference operator*() const
Dereference operator.
Definition iterable.hxx:162
pointer operator->() const
Arrow operator.
Definition iterable.hxx:168
ConstIterator operator+(difference_type n) const
Addition operator.
Definition iterable.hxx:213
bool operator!=(const ConstIterator &other) const
Inequality operator.
Definition iterable.hxx:241
ConstIterator & operator++()
Pre-increment operator.
Definition iterable.hxx:174
ConstIterator operator--(int)
Post-decrement operator.
Definition iterable.hxx:192
bool operator==(const ConstIterator &other) const
Subscript operator.
Definition iterable.hxx:234
difference_type operator-(const ConstIterator &other) const
Subtraction operator between two const iterators.
Definition iterable.hxx:227
ConstIterator & operator+=(difference_type n)
Compound addition operator.
Definition iterable.hxx:199
Wrapper iterator for Iterable.
Definition iterable.hxx:41
Iterator & operator++()
Pre-increment operator.
Definition iterable.hxx:66
bool operator!=(const Iterator &other) const
Inequality operator.
Definition iterable.hxx:133
reference operator*()
Dereference operator.
Definition iterable.hxx:54
Iterator & operator+=(difference_type n)
Compound addition operator.
Definition iterable.hxx:91
Iterator operator++(int)
Post-increment operator.
Definition iterable.hxx:72
Iterator operator--(int)
Post-decrement operator.
Definition iterable.hxx:84
Iterator & operator-=(difference_type n)
Compound subtraction operator.
Definition iterable.hxx:98
Iterator operator+(difference_type n) const
Addition operator.
Definition iterable.hxx:105
bool operator==(const Iterator &other) const
Subscript operator.
Definition iterable.hxx:126
Iterator & operator--()
Pre-decrement operator.
Definition iterable.hxx:78
Iterator operator-(difference_type n) const
Subtraction operator.
Definition iterable.hxx:112
pointer operator->()
Arrow operator.
Definition iterable.hxx:60
difference_type operator-(const Iterator &other) const
Subtraction operator between two iterators.
Definition iterable.hxx:119
A generic iterable container wrapper.
Definition iterable.hxx:25
const_reverse_iterator crbegin() const noexcept
Gets const reverse begin iterator.
Definition iterable.hxx:368
const_iterator cend() const noexcept
Gets const end iterator.
Definition iterable.hxx:338
reverse_iterator rend() noexcept
Gets reverse end iterator.
Definition iterable.hxx:350
const_reverse_iterator rbegin() const noexcept
Gets const reverse begin iterator.
Definition iterable.hxx:356
virtual ~Iterable()=default
Virtual destructor.
void add(const value_type &value)
Adds an element to the container.
Definition iterable.hxx:414
void add(value_type &&value)
Adds an element to the container (move version)
Definition iterable.hxx:420
iterator end() noexcept
Gets end iterator.
Definition iterable.hxx:314
Iterable(Container &&data)
Move constructor from existing container.
Definition iterable.hxx:273
const_iterator cbegin() const noexcept
Gets const begin iterator.
Definition iterable.hxx:332
Iterable(Iterable &&)=default
Move constructor.
reverse_iterator rbegin() noexcept
Gets reverse begin iterator.
Definition iterable.hxx:344
reference operator[](size_type i)
Access element at given index.
Definition iterable.hxx:393
Iterable()=default
Default constructor.
bool empty() const noexcept
Checks if the container is empty.
Definition iterable.hxx:386
const_iterator end() const noexcept
Gets const end iterator.
Definition iterable.hxx:326
Iterable(const Iterable &)=default
Copy constructor.
const_reverse_iterator rend() const noexcept
Gets const reverse end iterator.
Definition iterable.hxx:362
size_type size() const noexcept
Gets the size of the container.
Definition iterable.hxx:380
Container m_data
Underlying container.
Definition iterable.hxx:27
Iterable(const Container &data)
Constructor from existing container.
Definition iterable.hxx:267
iterator begin() noexcept
Gets begin iterator.
Definition iterable.hxx:308
const_reference operator[](size_type i) const
Access element at given index (const version)
Definition iterable.hxx:404
const_reverse_iterator crend() const noexcept
Gets const reverse end iterator.
Definition iterable.hxx:374
const_iterator begin() const noexcept
Gets const begin iterator.
Definition iterable.hxx:320
Iterable & operator=(Iterable &&)=default
Move assignment operator.
Iterable & operator=(const Iterable &)=default
Copy assignment operator.
Exception thrown when an out-of-bounds access is attempted.
Definition exception.hxx:130
Main namespace for the StormByte library.