로딩중...
검색중...
일치하는것 없음
smultimap.inl
1#pragma once
2
4
5namespace by {
6
7#define TEMPL template <typename K, typename V>
8#define ME smultimap<K, V>
9
10 TEMPL
11 ME::wrap::wrap(V&& newValue): value(newValue) {}
12
13 TEMPL
14 ME::wrap::wrap(const wrap& rhs): key(rhs.key), value(rhs.value) {}
15
16 TEMPL
17 ME::wrap::wrap(wrap&& rhs): key(rhs.key), value(rhs.value) {}
18
19 TEMPL
20 void ME::wrap::clear() { prev = next = this; }
21
22 TEMPL
23 typename ME::wrap& ME::wrap::operator=(const wrap&) { return *this; }
24
25 TEMPL
26 typename ME::wrap& ME::wrap::operator=(wrap&&) { return *this; }
27
28 TEMPL
29 const K& ME::iterator::_getDummyKey() {
30 static K inner;
31 return inner;
32 }
33
34 TEMPL
35 ME::iterator::iterator(const smultimap* owner, const wrap* pair, nbool isReversed):
36 me(owner, pair, isReversed, nullptr) {}
37
38 TEMPL
39 ME::iterator::iterator(const smultimap* owner, const wrap* pair, nbool isReversed, const K& key):
40 _owner(owner), _wrap(pair), _isReversed(isReversed), _key(key) {}
41
42 TEMPL
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()) {}
45
46 TEMPL
47 V& ME::iterator::operator*() { return *getVal(); }
48
49 TEMPL
50 V* ME::iterator::operator->() { return getVal(); }
51
52 TEMPL
53 typename ME::iterator& ME::iterator::operator++() {
54 WHEN_NUL(_owner).ret(*this);
55 return _step(1, false);
56 }
57
58 TEMPL
59 typename ME::iterator& ME::iterator::_step(ncnt step, nbool isReversed) {
60 const K* key = nullptr;
61 for(ncnt n = 0; n < step; ++n)
62 do {
63 _wrap =
64 isReversed ? (_isReversed ? _wrap->next : _wrap->prev) : (_isReversed ? _wrap->prev : _wrap->next);
65 if(_key == _getDummyKey()) break;
66 key = getKey();
67 if(!key) return *this;
68
69 } while(*key != _key);
70 return *this;
71 }
72
73 TEMPL
74 typename ME::iterator ME::iterator::operator++(int) {
75 iterator ret = *this;
76 operator++();
77 return ret;
78 }
79
80 TEMPL
81 typename ME::iterator& ME::iterator::operator--() {
82 WHEN_NUL(_owner).ret(*this);
83 return _step(1, true);
84 }
85
86 TEMPL
87 typename ME::iterator ME::iterator::operator--(int) {
88 iterator ret = *this;
89 operator--();
90 return ret;
91 }
92
93 TEMPL
94 typename ME::iterator ME::iterator::operator+(ncnt step) {
95 iterator ret = *this;
96 ret._step(step, false);
97 return ret;
98 }
99
100 TEMPL
101 bool ME::iterator::isEnd() const { return _wrap == &_owner->_end; }
102
103 TEMPL
104 const K* ME::iterator::getKey() const { return _wrap->key; }
105
106 TEMPL
107 V* ME::iterator::getVal() {
108 WHEN_NUL(_wrap).ret(nullptr);
109 return (V*) &_wrap->value;
110 }
111
112 TEMPL
113 bool ME::iterator::operator!=(const iterator& rhs) const { return _wrap != rhs._wrap; }
114
115 TEMPL
116 bool ME::iterator::operator==(const iterator& rhs) const { return _wrap == rhs._wrap; }
117
118 TEMPL
119 ncnt ME::size() const { return _map.size(); }
120
121 TEMPL
122 typename ME::iterator ME::begin() const { return iterator(this, _end.next, false); }
123
124 TEMPL
125 typename ME::iterator ME::end() const { return iterator(this, &_end, false); }
126
127 TEMPL
128 typename ME::iterator ME::begin(const K& key) const { return _begin(key, false); }
129
130 TEMPL
131 typename ME::iterator ME::rbegin() const { return iterator(this, _end.prev, true); }
132
133 TEMPL
134 typename ME::iterator ME::rend() const { return iterator(this, &_end, true); }
135
136 TEMPL
137 typename ME::iterator ME::rbegin(const K& key) const { return _begin(key, true); }
138
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;
143
144 _link(e->second);
145 }
146
147 TEMPL
148 void ME::erase(const K& key) {
149 auto range = _map.equal_range(key);
150 for(auto e = range.first; e != range.second;)
151 e = _erase(e);
152 }
153
154 TEMPL
155 void ME::erase(const iterator& it) {
156 const auto& key = it.getKey() OR.ret();
157 auto range = _map.equal_range(key);
158
159 for(auto e = range.first; e != range.second; ++e)
160 if(&(e->second) == it._wrap) return _erase(e), void();
161 // not found.
162 }
163
164 TEMPL
165 void ME::erase(const iterator& from, const iterator& to) {
166 for(auto e = from; e != to && e != end();)
167 _erase(e++);
168 }
169
170 TEMPL
171 void ME::clear() {
172 _end.clear();
173 _map.clear();
174 }
175
176 TEMPL
177 typename ME::stlMap::iterator ME::_erase(const typename stlMap::iterator& e) {
178 WHEN(e == _map.end()) .ret(_map.end()); // not found.
179
180 _unlink(e->second);
181 return _map.erase(e);
182 }
183
184 TEMPL
185 void ME::_erase(const iterator& e) {
186 WHEN(e.isEnd()) .ret(); // not found.
187
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();
192 }
193
194 TEMPL
195 void ME::_link(wrap& newTail) {
196 newTail.next = &_end;
197 auto*& curTail = _end.prev;
198 curTail->next = &newTail;
199 newTail.prev = curTail;
200 curTail = &newTail;
201 }
202
203 TEMPL
204 void ME::_unlink(wrap& toDelete) {
205 toDelete.prev->next = toDelete.next;
206 toDelete.next->prev = toDelete.prev;
207 }
208
209 TEMPL
210 typename ME::iterator ME::_begin(const K& key, nbool isReversed) const {
211 auto ret = iterator(this, &_end, isReversed, key);
212 ++ret;
213 return ret;
214 }
215
216#undef TEMPL
217#undef ME
218} // namespace by
to Top