7#define TEMPL template <typename K, typename V>
8#define ME smultimap<K, V>
11 ME::wrap::wrap(V&& newValue): value(newValue) {}
14 ME::wrap::wrap(
const wrap& rhs): key(rhs.key), value(rhs.value) {}
17 ME::wrap::wrap(wrap&& rhs): key(rhs.key), value(rhs.value) {}
20 void ME::wrap::clear() { prev = next =
this; }
23 typename ME::wrap& ME::wrap::operator=(
const wrap&) {
return *
this; }
26 typename ME::wrap& ME::wrap::operator=(wrap&&) {
return *
this; }
29 const K& ME::iterator::_getDummyKey() {
35 ME::iterator::iterator(
const smultimap* owner,
const wrap* pair, nbool isReversed):
36 me(owner, pair, isReversed, nullptr) {}
39 ME::iterator::iterator(
const smultimap* owner,
const wrap* pair, nbool isReversed,
const K& key):
40 _owner(owner), _wrap(pair), _isReversed(isReversed), _key(key) {}
43 ME::iterator::iterator(
const smultimap* owner,
const wrap* pair, nbool isReversed,
const K* key):
44 _owner(owner), _wrap(pair), _isReversed(isReversed), _key(key ? *key : _getDummyKey()) {}
47 V& ME::iterator::operator*() {
return *getVal(); }
50 V* ME::iterator::operator->() {
return getVal(); }
53 typename ME::iterator& ME::iterator::operator++() {
54 WHEN_NUL(_owner).ret(*
this);
55 return _step(1,
false);
59 typename ME::iterator& ME::iterator::_step(ncnt step, nbool isReversed) {
60 const K* key =
nullptr;
61 for(ncnt n = 0; n < step; ++n)
64 isReversed ? (_isReversed ? _wrap->next : _wrap->prev) : (_isReversed ? _wrap->prev : _wrap->next);
65 if(_key == _getDummyKey())
break;
67 if(!key)
return *
this;
69 }
while(*key != _key);
74 typename ME::iterator ME::iterator::operator++(
int) {
81 typename ME::iterator& ME::iterator::operator--() {
82 WHEN_NUL(_owner).ret(*
this);
83 return _step(1,
true);
87 typename ME::iterator ME::iterator::operator--(
int) {
94 typename ME::iterator ME::iterator::operator+(ncnt step) {
96 ret._step(step,
false);
101 bool ME::iterator::isEnd()
const {
return _wrap == &_owner->_end; }
104 const K* ME::iterator::getKey()
const {
return _wrap->key; }
107 V* ME::iterator::getVal() {
108 WHEN_NUL(_wrap).ret(
nullptr);
109 return (V*) &_wrap->value;
113 bool ME::iterator::operator!=(
const iterator& rhs)
const {
return _wrap != rhs._wrap; }
116 bool ME::iterator::operator==(
const iterator& rhs)
const {
return _wrap == rhs._wrap; }
119 ncnt ME::size()
const {
return _map.size(); }
122 typename ME::iterator ME::begin()
const {
return iterator(
this, _end.next,
false); }
125 typename ME::iterator ME::end()
const {
return iterator(
this, &_end,
false); }
128 typename ME::iterator ME::begin(
const K& key)
const {
return _begin(key,
false); }
131 typename ME::iterator ME::rbegin()
const {
return iterator(
this, _end.prev,
true); }
134 typename ME::iterator ME::rend()
const {
return iterator(
this, &_end,
true); }
137 typename ME::iterator ME::rbegin(
const K& key)
const {
return _begin(key,
true); }
139 TEMPL
void ME::insert(
const K& key, V&& val) {
140 auto e = _map.insert(
typename stlMap::value_type(key, wrap(std::forward<V>(val))));
141 WHEN(e == _map.end()) .ret();
142 e->second.key = &e->first;
148 void ME::erase(
const K& key) {
149 auto range = _map.equal_range(key);
150 for(
auto e = range.first; e != range.second;)
155 void ME::erase(
const iterator& it) {
156 const auto& key = it.getKey() OR.ret();
157 auto range = _map.equal_range(key);
159 for(
auto e = range.first; e != range.second; ++e)
160 if(&(e->second) == it._wrap)
return _erase(e), void();
165 void ME::erase(
const iterator& from,
const iterator& to) {
166 for(
auto e = from; e != to && e != end();)
177 typename ME::stlMap::iterator ME::_erase(
const typename stlMap::iterator& e) {
178 WHEN(e == _map.end()) .ret(_map.end());
181 return _map.erase(e);
185 void ME::_erase(
const iterator& e) {
186 WHEN(e.isEnd()) .ret();
188 const K& key = e._wrap->key OR.ret();
189 auto range = _map.equal_range(key);
190 for(
auto stlE = range.first; stlE != range.second; ++stlE)
191 if(&stlE->second == e._wrap)
return _erase(stlE), void();
195 void ME::_link(wrap& newTail) {
196 newTail.next = &_end;
197 auto*& curTail = _end.prev;
198 curTail->next = &newTail;
199 newTail.prev = curTail;
204 void ME::_unlink(wrap& toDelete) {
205 toDelete.prev->next = toDelete.next;
206 toDelete.next->prev = toDelete.prev;
210 typename ME::iterator ME::_begin(
const K& key, nbool isReversed)
const {
211 auto ret = iterator(
this, &_end, isReversed, key);