libpromeki 1.0.0-alpha
PROfessional MEdia toolKIt
 
Loading...
Searching...
No Matches
map.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 <map>
14#include <initializer_list>
15#include <promeki/namespace.h>
16#include <promeki/sharedptr.h>
17#include <promeki/list.h>
18
19PROMEKI_NAMESPACE_BEGIN
20
45template <typename K, typename V> class Map {
46 PROMEKI_SHARED_FINAL(Map)
47 public:
49 using Ptr = SharedPtr<Map>;
50
52 using Data = std::map<K, V>;
53
55 using Iterator = typename Data::iterator;
56
58 using ConstIterator = typename Data::const_iterator;
59
61 using RevIterator = typename Data::reverse_iterator;
62
64 using ConstRevIterator = typename Data::const_reverse_iterator;
65
67 Map() = default;
68
70 Map(const Map &other) : d(other.d) {}
71
73 Map(Map &&other) noexcept : d(std::move(other.d)) {}
74
79 Map(std::initializer_list<std::pair<const K, V>> initList) : d(initList) {}
80
82 ~Map() = default;
83
85 Map &operator=(const Map &other) {
86 d = other.d;
87 return *this;
88 }
89
91 Map &operator=(Map &&other) noexcept {
92 d = std::move(other.d);
93 return *this;
94 }
95
96 // -- Iterators --
97
99 Iterator begin() noexcept { return d.begin(); }
100
102 ConstIterator begin() const noexcept { return d.cbegin(); }
103
105 ConstIterator cbegin() const noexcept { return d.cbegin(); }
106
108 ConstIterator constBegin() const noexcept { return d.cbegin(); }
109
111 Iterator end() noexcept { return d.end(); }
112
114 ConstIterator end() const noexcept { return d.cend(); }
115
117 ConstIterator cend() const noexcept { return d.cend(); }
118
120 ConstIterator constEnd() const noexcept { return d.cend(); }
121
123 RevIterator rbegin() noexcept { return d.rbegin(); }
124
126 RevIterator revBegin() noexcept { return d.rbegin(); }
127
129 ConstRevIterator crbegin() const noexcept { return d.crbegin(); }
130
132 ConstRevIterator constRevBegin() const noexcept { return d.crbegin(); }
133
135 RevIterator rend() noexcept { return d.rend(); }
136
138 RevIterator revEnd() noexcept { return d.rend(); }
139
141 ConstRevIterator crend() const noexcept { return d.crend(); }
142
144 ConstRevIterator constRevEnd() const noexcept { return d.crend(); }
145
146 // -- Capacity --
147
149 bool isEmpty() const noexcept { return d.empty(); }
150
152 size_t size() const noexcept { return d.size(); }
153
154 // -- Lookup --
155
162 V &operator[](const K &key) { return d[key]; }
163
173 const V &operator[](const K &key) const { return d.at(key); }
174
182 V value(const K &key, const V &defaultValue = V{}) const {
183 auto it = d.find(key);
184 if (it != d.end()) return it->second;
185 return defaultValue;
186 }
187
189 bool contains(const K &key) const { return d.find(key) != d.end(); }
190
196 Iterator find(const K &key) { return d.find(key); }
197
199 ConstIterator find(const K &key) const { return d.find(key); }
200
201 // -- Modifiers --
202
216 void insert(const K &key, const V &val) {
217 d.insert_or_assign(key, val);
218 return;
219 }
220
226 void insert(const K &key, V &&val) {
227 d.insert_or_assign(key, std::move(val));
228 return;
229 }
230
243 bool insertNew(const K &key, const V &val) { return d.emplace(key, val).second; }
244
260 template <typename... ArgsT> std::pair<Iterator, bool> tryEmplace(const K &key, ArgsT &&...args) {
261 return d.try_emplace(key, std::forward<ArgsT>(args)...);
262 }
263
269 bool remove(const K &key) { return d.erase(key) > 0; }
270
276 Iterator remove(Iterator pos) { return d.erase(pos); }
277
279 void clear() noexcept {
280 d.clear();
281 return;
282 }
283
288 void swap(Map &other) noexcept {
289 d.swap(other.d);
290 return;
291 }
292
293 // -- Convenience --
294
296 List<K> keys() const {
297 List<K> ret;
298 ret.reserve(d.size());
299 for (const auto &[k, v] : d) ret.pushToBack(k);
300 return ret;
301 }
302
304 List<V> values() const {
305 List<V> ret;
306 ret.reserve(d.size());
307 for (const auto &[k, v] : d) ret.pushToBack(v);
308 return ret;
309 }
310
316 template <typename Func> void forEach(Func &&func) const {
317 for (const auto &[k, v] : d) func(k, v);
318 return;
319 }
320
321 // -- Comparison --
322
324 friend bool operator==(const Map &lhs, const Map &rhs) { return lhs.d == rhs.d; }
325
327 friend bool operator!=(const Map &lhs, const Map &rhs) { return lhs.d != rhs.d; }
328
329 private:
330 Data d;
331};
332
333PROMEKI_NAMESPACE_END
334
335#endif // PROMEKI_ENABLE_CORE