Loading...
Searching...
No Matches
smultimap.hpp
Go to the documentation of this file.
1
2#pragma once
3
4#include <unordered_map>
5#include "core/common.hpp"
6
7namespace by {
26 template <typename K, typename V> class smultimap {
27 BY(ME(smultimap))
28
29 public:
30 struct wrap;
31 class iterator;
32 typedef std::unordered_multimap<K, wrap> stlMap;
33
34 struct wrap {
35 wrap() = default;
36 wrap(V&& newValue);
37 wrap(const wrap& rhs);
38 wrap(wrap&& rhs);
39
40 public:
41 wrap& operator=(const wrap&);
42 wrap& operator=(wrap&&);
43
44 public:
45 void clear();
46
47 public:
48 const K* key = nullptr;
49 V value;
50 wrap* prev = this;
51 wrap* next = this;
52 };
53
54 class iterator {
55 BY(ME(iterator))
56 typedef smultimap<K, V> owner;
57
58 public:
59 iterator(const smultimap* owner, const wrap* pair, nbool isReversed);
60 iterator(const smultimap* owner, const wrap* pair, nbool isReversed, const K& key);
61 iterator(const smultimap* owner, const wrap* pair, nbool isReversed, const K* key);
62 friend owner;
63
64 public:
65 V& operator*();
66 V* operator->();
67
68 iterator& operator++();
69 iterator operator++(int);
70 iterator& operator--();
71 iterator operator--(int);
72 iterator operator+(ncnt step);
73
74 bool isEnd() const;
75
76 const K* getKey() const;
77 const V* getVal() const BY_CONST_FUNC(getVal())
78 V* getVal();
79
80 bool operator!=(const iterator& rhs) const;
81 bool operator==(const iterator& rhs) const;
82
83 private:
84 iterator& _step(ncnt step, nbool isReversed);
85 static const K& _getDummyKey();
86
87 private:
88 const owner* _owner;
89 const wrap* _wrap;
90 nbool _isReversed;
91 K _key;
92 };
93
94 public:
95 smultimap() = default;
96
97 public:
98 ncnt size() const;
99
100 iterator begin() const;
101 iterator end() const;
102 iterator begin(const K& key) const;
103 iterator begin(const K* key) const BY_SIDE_FUNC(key, begin(*key), begin());
104
105 iterator rbegin() const;
106 iterator rend() const;
107 iterator rbegin(const K& key) const;
108 iterator rbegin(const K* key) const BY_SIDE_FUNC(key, rbegin(*key), rbegin());
109
110 void insert(const K& key, V&& val);
111
115 void erase(const K& key);
116 void erase(const K* it) BY_SIDE_FUNC(erase);
117 void erase(const iterator& it);
118 void erase(const iterator* it) BY_SIDE_FUNC(erase);
119 void erase(const iterator& from, const iterator& to);
120 void erase(const iterator* from, const iterator& to) BY_SIDE_FUNC(from, erase(*from, to), void());
121 void erase(const iterator& from, const iterator* to) BY_SIDE_FUNC(to, erase(from, *to), void());
122 void erase(const iterator* from, const iterator* to) BY_SIDE_FUNC(from&& to, erase(*from, *to), void());
123
124 iterator find(const K& key) const;
125
126 void clear();
127
128 private:
129 typename stlMap::iterator _erase(const typename stlMap::iterator& e);
130 void _erase(const iterator& e);
131 void _link(wrap& newTail);
132 void _unlink(wrap& toDelete);
133 iterator _begin(const K& key, nbool isReversed) const;
134
135 private:
136 stlMap _map;
137 wrap _end;
138 };
139} // namespace by
Definition smultimap.hpp:54
Definition smultimap.hpp:26
void erase(const K &key)
Definition tnarr.hpp:9
Definition smultimap.hpp:34
to Top