libpromeki main
PROfessional MEdia toolKIt
 
Loading...
Searching...
No Matches
deque.h
Go to the documentation of this file.
1
8#pragma once
9
10#include <cstddef>
11#include <deque>
12#include <initializer_list>
15
17
36template <typename T>
37class Deque {
39 public:
42
44 using Data = std::deque<T>;
45
47 using Value = T;
48
50 using Iterator = typename Data::iterator;
51
53 using ConstIterator = typename Data::const_iterator;
54
56 using RevIterator = typename Data::reverse_iterator;
57
59 using ConstRevIterator = typename Data::const_reverse_iterator;
60
62 Deque() = default;
63
65 Deque(const Deque &other) : d(other.d) {}
66
68 Deque(Deque &&other) noexcept : d(std::move(other.d)) {}
69
74 Deque(std::initializer_list<T> initList) : d(initList) {}
75
77 ~Deque() = default;
78
81 d = other.d;
82 return *this;
83 }
84
86 Deque &operator=(Deque &&other) noexcept {
87 d = std::move(other.d);
88 return *this;
89 }
90
91 // -- Iterators --
92
94 Iterator begin() noexcept { return d.begin(); }
95
97 ConstIterator begin() const noexcept { return d.cbegin(); }
98
100 ConstIterator cbegin() const noexcept { return d.cbegin(); }
101
103 ConstIterator constBegin() const noexcept { return d.cbegin(); }
104
106 Iterator end() noexcept { return d.end(); }
107
109 ConstIterator end() const noexcept { return d.cend(); }
110
112 ConstIterator cend() const noexcept { return d.cend(); }
113
115 ConstIterator constEnd() const noexcept { return d.cend(); }
116
118 RevIterator rbegin() noexcept { return d.rbegin(); }
119
121 RevIterator revBegin() noexcept { return d.rbegin(); }
122
124 ConstRevIterator crbegin() const noexcept { return d.crbegin(); }
125
128
130 RevIterator rend() noexcept { return d.rend(); }
131
133 RevIterator revEnd() noexcept { return d.rend(); }
134
136 ConstRevIterator crend() const noexcept { return d.crend(); }
137
140
141 // -- Access --
142
148 T &at(size_t index) { return d.at(index); }
149
151 const T &at(size_t index) const { return d.at(index); }
152
158 T &operator[](size_t index) { return d[index]; }
159
161 const T &operator[](size_t index) const { return d[index]; }
162
164 T &front() { return d.front(); }
165
167 const T &front() const { return d.front(); }
168
170 T &back() { return d.back(); }
171
173 const T &back() const { return d.back(); }
174
175 // -- Capacity --
176
178 bool isEmpty() const noexcept { return d.empty(); }
179
181 size_t size() const noexcept { return d.size(); }
182
183 // -- Modifiers --
184
189 void pushToFront(const T &value) {
190 d.push_front(value);
191 return;
192 }
193
199 d.push_front(std::move(value));
200 return;
201 }
202
207 void pushToBack(const T &value) {
208 d.push_back(value);
209 return;
210 }
211
217 d.push_back(std::move(value));
218 return;
219 }
220
226 T val = std::move(d.front());
227 d.pop_front();
228 return val;
229 }
230
236 T val = std::move(d.back());
237 d.pop_back();
238 return val;
239 }
240
243 d.clear();
244 return;
245 }
246
251 void swap(Deque &other) noexcept {
252 d.swap(other.d);
253 return;
254 }
255
261 template <typename Func>
262 void forEach(Func &&func) const {
263 for(const auto &v : d) func(v);
264 return;
265 }
266
267 // -- Comparison --
268
270 friend bool operator==(const Deque &lhs, const Deque &rhs) { return lhs.d == rhs.d; }
271
273 friend bool operator!=(const Deque &lhs, const Deque &rhs) { return lhs.d != rhs.d; }
274
275 private:
276 Data d;
277};
278
Double-ended queue container wrapping std::deque.
Definition deque.h:37
Deque(const Deque &other)
Copy constructor.
Definition deque.h:65
friend bool operator!=(const Deque &lhs, const Deque &rhs)
Returns true if the deques differ.
Definition deque.h:273
void swap(Deque &other) noexcept
Swaps contents with another deque.
Definition deque.h:251
T & at(size_t index)
Returns a reference to the element at index with bounds checking.
Definition deque.h:148
ConstIterator begin() const noexcept
Returns a const iterator to the first element.
Definition deque.h:97
const T & at(size_t index) const
Returns a reference to the element at index with bounds checking.
Definition deque.h:151
std::deque< T > Data
Underlying std::deque storage type.
Definition deque.h:44
T & operator[](size_t index)
Returns a reference to the element at index without bounds checking.
Definition deque.h:158
Deque & operator=(const Deque &other)
Copy assignment operator.
Definition deque.h:80
typename Data::reverse_iterator RevIterator
Mutable reverse iterator.
Definition deque.h:56
const T & back() const
Returns a reference to the last element.
Definition deque.h:173
Iterator end() noexcept
Returns a mutable iterator to one past the last element.
Definition deque.h:106
ConstRevIterator constRevEnd() const noexcept
Returns a const reverse iterator to one before the first element.
Definition deque.h:139
size_t size() const noexcept
Returns the number of elements.
Definition deque.h:181
ConstIterator cend() const noexcept
Returns a const iterator to one past the last element.
Definition deque.h:112
T & front()
Returns a reference to the first element.
Definition deque.h:164
typename Data::iterator Iterator
Mutable forward iterator.
Definition deque.h:50
RevIterator rend() noexcept
Returns a mutable reverse iterator to one before the first element.
Definition deque.h:130
ConstIterator end() const noexcept
Returns a const iterator to one past the last element.
Definition deque.h:109
Deque(Deque &&other) noexcept
Move constructor.
Definition deque.h:68
typename Data::const_reverse_iterator ConstRevIterator
Const reverse iterator.
Definition deque.h:59
T popFromFront()
Removes and returns the first element.
Definition deque.h:225
ConstRevIterator crbegin() const noexcept
Returns a const reverse iterator to the last element.
Definition deque.h:124
T & back()
Returns a reference to the last element.
Definition deque.h:170
void pushToBack(T &&value)
Pushes an item onto the back of the deque (move overload).
Definition deque.h:216
ConstIterator constEnd() const noexcept
Returns a const iterator to one past the last element.
Definition deque.h:115
Iterator begin() noexcept
Returns a mutable iterator to the first element.
Definition deque.h:94
Deque & operator=(Deque &&other) noexcept
Move assignment operator.
Definition deque.h:86
ConstIterator cbegin() const noexcept
Returns a const iterator to the first element.
Definition deque.h:100
friend bool operator==(const Deque &lhs, const Deque &rhs)
Returns true if both deques have identical contents.
Definition deque.h:270
Deque(std::initializer_list< T > initList)
Constructs a deque from an initializer list.
Definition deque.h:74
void forEach(Func &&func) const
Calls func for every element.
Definition deque.h:262
const T & operator[](size_t index) const
Returns a reference to the element at index without bounds checking.
Definition deque.h:161
T popFromBack()
Removes and returns the last element.
Definition deque.h:235
RevIterator revBegin() noexcept
Returns a mutable reverse iterator to the last element.
Definition deque.h:121
ConstRevIterator crend() const noexcept
Returns a const reverse iterator to one before the first element.
Definition deque.h:136
void pushToBack(const T &value)
Pushes an item onto the back of the deque.
Definition deque.h:207
ConstRevIterator constRevBegin() const noexcept
Returns a const reverse iterator to the last element.
Definition deque.h:127
~Deque()=default
Destructor.
Deque()=default
Default constructor. Creates an empty deque.
RevIterator rbegin() noexcept
Returns a mutable reverse iterator to the last element.
Definition deque.h:118
const T & front() const
Returns a reference to the first element.
Definition deque.h:167
bool isEmpty() const noexcept
Returns true if the deque has no elements.
Definition deque.h:178
void pushToFront(const T &value)
Pushes an item onto the front of the deque.
Definition deque.h:189
typename Data::const_iterator ConstIterator
Const forward iterator.
Definition deque.h:53
void clear() noexcept
Removes all elements.
Definition deque.h:242
RevIterator revEnd() noexcept
Returns a mutable reverse iterator to one before the first element.
Definition deque.h:133
void pushToFront(T &&value)
Pushes an item onto the front of the deque (move overload).
Definition deque.h:198
ConstIterator constBegin() const noexcept
Returns a const iterator to the first element.
Definition deque.h:103
Dynamic array container wrapping std::vector.
Definition list.h:40
#define PROMEKI_NAMESPACE_BEGIN
Starts a promeki namespace block.
Definition namespace.h:14
#define PROMEKI_NAMESPACE_END
Ends a promeki namespace block.
Definition namespace.h:19
const T & value(const Result< T > &r)
Returns the value from a Result.
Definition result.h:56
#define PROMEKI_SHARED_FINAL(TYPE)
Macro for non-polymorphic native shared objects.
Definition sharedptr.h:88