libpromeki 1.0.0-alpha
PROfessional MEdia toolKIt
 
Loading...
Searching...
No Matches
deque.h
Go to the documentation of this file.
1
8#pragma once
9
10
11#include <promeki/config.h>
12#if PROMEKI_ENABLE_CORE
13#include <cstddef>
14#include <deque>
15#include <initializer_list>
16#include <stdexcept>
17#include <promeki/namespace.h>
18#include <promeki/sharedptr.h>
19
20PROMEKI_NAMESPACE_BEGIN
21
45template <typename T> class Deque {
46 PROMEKI_SHARED_FINAL(Deque)
47 public:
49 using Ptr = SharedPtr<Deque>;
50
52 using Data = std::deque<T>;
53
55 using Value = T;
56
58 using Iterator = typename Data::iterator;
59
61 using ConstIterator = typename Data::const_iterator;
62
64 using RevIterator = typename Data::reverse_iterator;
65
67 using ConstRevIterator = typename Data::const_reverse_iterator;
68
70 Deque() = default;
71
73 Deque(const Deque &other) : d(other.d) {}
74
76 Deque(Deque &&other) noexcept : d(std::move(other.d)) {}
77
82 Deque(std::initializer_list<T> initList) : d(initList) {}
83
85 ~Deque() = default;
86
88 Deque &operator=(const Deque &other) {
89 d = other.d;
90 return *this;
91 }
92
94 Deque &operator=(Deque &&other) noexcept {
95 d = std::move(other.d);
96 return *this;
97 }
98
99 // -- Iterators --
100
102 Iterator begin() noexcept { return d.begin(); }
103
105 ConstIterator begin() const noexcept { return d.cbegin(); }
106
108 ConstIterator cbegin() const noexcept { return d.cbegin(); }
109
111 ConstIterator constBegin() const noexcept { return d.cbegin(); }
112
114 Iterator end() noexcept { return d.end(); }
115
117 ConstIterator end() const noexcept { return d.cend(); }
118
120 ConstIterator cend() const noexcept { return d.cend(); }
121
123 ConstIterator constEnd() const noexcept { return d.cend(); }
124
126 RevIterator rbegin() noexcept { return d.rbegin(); }
127
129 RevIterator revBegin() noexcept { return d.rbegin(); }
130
132 ConstRevIterator crbegin() const noexcept { return d.crbegin(); }
133
135 ConstRevIterator constRevBegin() const noexcept { return d.crbegin(); }
136
138 RevIterator rend() noexcept { return d.rend(); }
139
141 RevIterator revEnd() noexcept { return d.rend(); }
142
144 ConstRevIterator crend() const noexcept { return d.crend(); }
145
147 ConstRevIterator constRevEnd() const noexcept { return d.crend(); }
148
149 // -- Access --
150
156 T &at(size_t index) { return d.at(index); }
157
159 const T &at(size_t index) const { return d.at(index); }
160
166 T &operator[](size_t index) { return d[index]; }
167
169 const T &operator[](size_t index) const { return d[index]; }
170
172 T &front() { return d.front(); }
173
175 const T &front() const { return d.front(); }
176
178 T &back() { return d.back(); }
179
181 const T &back() const { return d.back(); }
182
183 // -- Capacity --
184
186 bool isEmpty() const noexcept { return d.empty(); }
187
189 size_t size() const noexcept { return d.size(); }
190
191 // -- Modifiers --
192
197 void pushToFront(const T &value) {
198 d.push_front(value);
199 return;
200 }
201
206 void pushToFront(T &&value) {
207 d.push_front(std::move(value));
208 return;
209 }
210
215 void pushToBack(const T &value) {
216 d.push_back(value);
217 return;
218 }
219
224 void pushToBack(T &&value) {
225 d.push_back(std::move(value));
226 return;
227 }
228
234 T popFromFront() {
235 if (d.empty()) throw std::logic_error("Deque::popFromFront on empty deque");
236 T val = std::move(d.front());
237 d.pop_front();
238 return val;
239 }
240
246 T popFromBack() {
247 if (d.empty()) throw std::logic_error("Deque::popFromBack on empty deque");
248 T val = std::move(d.back());
249 d.pop_back();
250 return val;
251 }
252
254 void clear() noexcept {
255 d.clear();
256 return;
257 }
258
263 void swap(Deque &other) noexcept {
264 d.swap(other.d);
265 return;
266 }
267
273 template <typename Func> void forEach(Func &&func) const {
274 for (const auto &v : d) func(v);
275 return;
276 }
277
278 // -- Comparison --
279
281 friend bool operator==(const Deque &lhs, const Deque &rhs) { return lhs.d == rhs.d; }
282
284 friend bool operator!=(const Deque &lhs, const Deque &rhs) { return lhs.d != rhs.d; }
285
286 private:
287 Data d;
288};
289
290PROMEKI_NAMESPACE_END
291
292#endif // PROMEKI_ENABLE_CORE