11#include <promeki/config.h>
12#if PROMEKI_ENABLE_CORE
14#include <initializer_list>
19PROMEKI_NAMESPACE_BEGIN
45template <
typename K,
typename V>
class Map {
46 PROMEKI_SHARED_FINAL(Map)
49 using Ptr = SharedPtr<Map>;
52 using Data = std::map<K, V>;
55 using Iterator =
typename Data::iterator;
58 using ConstIterator =
typename Data::const_iterator;
61 using RevIterator =
typename Data::reverse_iterator;
64 using ConstRevIterator =
typename Data::const_reverse_iterator;
70 Map(
const Map &other) : d(other.d) {}
73 Map(Map &&other) noexcept : d(std::move(other.d)) {}
79 Map(std::initializer_list<std::pair<const K, V>> initList) : d(initList) {}
85 Map &operator=(
const Map &other) {
91 Map &operator=(Map &&other)
noexcept {
92 d = std::move(other.d);
99 Iterator begin() noexcept {
return d.begin(); }
102 ConstIterator begin() const noexcept {
return d.cbegin(); }
105 ConstIterator cbegin() const noexcept {
return d.cbegin(); }
108 ConstIterator constBegin() const noexcept {
return d.cbegin(); }
111 Iterator end() noexcept {
return d.end(); }
114 ConstIterator end() const noexcept {
return d.cend(); }
117 ConstIterator cend() const noexcept {
return d.cend(); }
120 ConstIterator constEnd() const noexcept {
return d.cend(); }
123 RevIterator rbegin() noexcept {
return d.rbegin(); }
126 RevIterator revBegin() noexcept {
return d.rbegin(); }
129 ConstRevIterator crbegin() const noexcept {
return d.crbegin(); }
132 ConstRevIterator constRevBegin() const noexcept {
return d.crbegin(); }
135 RevIterator rend() noexcept {
return d.rend(); }
138 RevIterator revEnd() noexcept {
return d.rend(); }
141 ConstRevIterator crend() const noexcept {
return d.crend(); }
144 ConstRevIterator constRevEnd() const noexcept {
return d.crend(); }
149 bool isEmpty() const noexcept {
return d.empty(); }
152 size_t size() const noexcept {
return d.size(); }
162 V &operator[](
const K &key) {
return d[key]; }
173 const V &operator[](
const K &key)
const {
return d.at(key); }
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;
189 bool contains(
const K &key)
const {
return d.find(key) != d.end(); }
196 Iterator find(
const K &key) {
return d.find(key); }
199 ConstIterator find(
const K &key)
const {
return d.find(key); }
216 void insert(
const K &key,
const V &val) {
217 d.insert_or_assign(key, val);
226 void insert(
const K &key, V &&val) {
227 d.insert_or_assign(key, std::move(val));
243 bool insertNew(
const K &key,
const V &val) {
return d.emplace(key, val).second; }
260 template <
typename... ArgsT> std::pair<Iterator, bool> tryEmplace(
const K &key, ArgsT &&...args) {
261 return d.try_emplace(key, std::forward<ArgsT>(args)...);
269 bool remove(
const K &key) {
return d.erase(key) > 0; }
276 Iterator remove(Iterator pos) {
return d.erase(pos); }
279 void clear() noexcept {
288 void swap(Map &other)
noexcept {
296 List<K> keys()
const {
298 ret.reserve(d.size());
299 for (
const auto &[k, v] : d) ret.pushToBack(k);
304 List<V> values()
const {
306 ret.reserve(d.size());
307 for (
const auto &[k, v] : d) ret.pushToBack(v);
316 template <
typename Func>
void forEach(Func &&func)
const {
317 for (
const auto &[k, v] : d) func(k, v);
324 friend bool operator==(
const Map &lhs,
const Map &rhs) {
return lhs.d == rhs.d; }
327 friend bool operator!=(
const Map &lhs,
const Map &rhs) {
return lhs.d != rhs.d; }