root / lab4 / .minix-src / include / c++ / map @ 14
History | View | Annotate | Download (80.7 KB)
1 |
// -*- C++ -*- |
---|---|
2 |
//===----------------------------- map ------------------------------------===// |
3 |
// |
4 |
// The LLVM Compiler Infrastructure |
5 |
// |
6 |
// This file is dual licensed under the MIT and the University of Illinois Open |
7 |
// Source Licenses. See LICENSE.TXT for details. |
8 |
// |
9 |
//===----------------------------------------------------------------------===// |
10 |
|
11 |
#ifndef _LIBCPP_MAP |
12 |
#define _LIBCPP_MAP |
13 |
|
14 |
/* |
15 |
|
16 |
map synopsis |
17 |
|
18 |
namespace std |
19 |
{ |
20 |
|
21 |
template <class Key, class T, class Compare = less<Key>, |
22 |
class Allocator = allocator<pair<const Key, T>>> |
23 |
class map |
24 |
{ |
25 |
public: |
26 |
// types: |
27 |
typedef Key key_type; |
28 |
typedef T mapped_type; |
29 |
typedef pair<const key_type, mapped_type> value_type; |
30 |
typedef Compare key_compare; |
31 |
typedef Allocator allocator_type; |
32 |
typedef typename allocator_type::reference reference; |
33 |
typedef typename allocator_type::const_reference const_reference; |
34 |
typedef typename allocator_type::pointer pointer; |
35 |
typedef typename allocator_type::const_pointer const_pointer; |
36 |
typedef typename allocator_type::size_type size_type; |
37 |
typedef typename allocator_type::difference_type difference_type; |
38 |
|
39 |
typedef implementation-defined iterator; |
40 |
typedef implementation-defined const_iterator; |
41 |
typedef std::reverse_iterator<iterator> reverse_iterator; |
42 |
typedef std::reverse_iterator<const_iterator> const_reverse_iterator; |
43 |
|
44 |
class value_compare |
45 |
: public binary_function<value_type, value_type, bool> |
46 |
{ |
47 |
friend class map; |
48 |
protected: |
49 |
key_compare comp; |
50 |
|
51 |
value_compare(key_compare c); |
52 |
public: |
53 |
bool operator()(const value_type& x, const value_type& y) const; |
54 |
}; |
55 |
|
56 |
// construct/copy/destroy: |
57 |
map() |
58 |
noexcept( |
59 |
is_nothrow_default_constructible<allocator_type>::value && |
60 |
is_nothrow_default_constructible<key_compare>::value && |
61 |
is_nothrow_copy_constructible<key_compare>::value); |
62 |
explicit map(const key_compare& comp); |
63 |
map(const key_compare& comp, const allocator_type& a); |
64 |
template <class InputIterator> |
65 |
map(InputIterator first, InputIterator last, |
66 |
const key_compare& comp = key_compare()); |
67 |
template <class InputIterator> |
68 |
map(InputIterator first, InputIterator last, |
69 |
const key_compare& comp, const allocator_type& a); |
70 |
map(const map& m); |
71 |
map(map&& m) |
72 |
noexcept( |
73 |
is_nothrow_move_constructible<allocator_type>::value && |
74 |
is_nothrow_move_constructible<key_compare>::value); |
75 |
explicit map(const allocator_type& a); |
76 |
map(const map& m, const allocator_type& a); |
77 |
map(map&& m, const allocator_type& a); |
78 |
map(initializer_list<value_type> il, const key_compare& comp = key_compare()); |
79 |
map(initializer_list<value_type> il, const key_compare& comp, const allocator_type& a); |
80 |
template <class InputIterator> |
81 |
map(InputIterator first, InputIterator last, const allocator_type& a) |
82 |
: map(first, last, Compare(), a) {} // C++14 |
83 |
map(initializer_list<value_type> il, const allocator_type& a) |
84 |
: map(il, Compare(), a) {} // C++14 |
85 |
~map(); |
86 |
|
87 |
map& operator=(const map& m); |
88 |
map& operator=(map&& m) |
89 |
noexcept( |
90 |
allocator_type::propagate_on_container_move_assignment::value && |
91 |
is_nothrow_move_assignable<allocator_type>::value && |
92 |
is_nothrow_move_assignable<key_compare>::value); |
93 |
map& operator=(initializer_list<value_type> il); |
94 |
|
95 |
// iterators: |
96 |
iterator begin() noexcept; |
97 |
const_iterator begin() const noexcept; |
98 |
iterator end() noexcept; |
99 |
const_iterator end() const noexcept; |
100 |
|
101 |
reverse_iterator rbegin() noexcept; |
102 |
const_reverse_iterator rbegin() const noexcept; |
103 |
reverse_iterator rend() noexcept; |
104 |
const_reverse_iterator rend() const noexcept; |
105 |
|
106 |
const_iterator cbegin() const noexcept; |
107 |
const_iterator cend() const noexcept; |
108 |
const_reverse_iterator crbegin() const noexcept; |
109 |
const_reverse_iterator crend() const noexcept; |
110 |
|
111 |
// capacity: |
112 |
bool empty() const noexcept; |
113 |
size_type size() const noexcept; |
114 |
size_type max_size() const noexcept; |
115 |
|
116 |
// element access: |
117 |
mapped_type& operator[](const key_type& k); |
118 |
mapped_type& operator[](key_type&& k); |
119 |
|
120 |
mapped_type& at(const key_type& k); |
121 |
const mapped_type& at(const key_type& k) const; |
122 |
|
123 |
// modifiers: |
124 |
template <class... Args> |
125 |
pair<iterator, bool> emplace(Args&&... args); |
126 |
template <class... Args> |
127 |
iterator emplace_hint(const_iterator position, Args&&... args); |
128 |
pair<iterator, bool> insert(const value_type& v); |
129 |
template <class P> |
130 |
pair<iterator, bool> insert(P&& p); |
131 |
iterator insert(const_iterator position, const value_type& v); |
132 |
template <class P> |
133 |
iterator insert(const_iterator position, P&& p); |
134 |
template <class InputIterator> |
135 |
void insert(InputIterator first, InputIterator last); |
136 |
void insert(initializer_list<value_type> il); |
137 |
|
138 |
template <class... Args> |
139 |
pair<iterator, bool> try_emplace(const key_type& k, Args&&... args); // C++17 |
140 |
template <class... Args> |
141 |
pair<iterator, bool> try_emplace(key_type&& k, Args&&... args); // C++17 |
142 |
template <class... Args> |
143 |
iterator try_emplace(const_iterator hint, const key_type& k, Args&&... args); // C++17 |
144 |
template <class... Args> |
145 |
iterator try_emplace(const_iterator hint, key_type&& k, Args&&... args); // C++17 |
146 |
template <class M> |
147 |
pair<iterator, bool> insert_or_assign(const key_type& k, M&& obj); // C++17 |
148 |
template <class M> |
149 |
pair<iterator, bool> insert_or_assign(key_type&& k, M&& obj); // C++17 |
150 |
template <class M> |
151 |
iterator insert_or_assign(const_iterator hint, const key_type& k, M&& obj); // C++17 |
152 |
template <class M> |
153 |
iterator insert_or_assign(const_iterator hint, key_type&& k, M&& obj); // C++17 |
154 |
|
155 |
iterator erase(const_iterator position); |
156 |
iterator erase(iterator position); // C++14 |
157 |
size_type erase(const key_type& k); |
158 |
iterator erase(const_iterator first, const_iterator last); |
159 |
void clear() noexcept; |
160 |
|
161 |
void swap(map& m) |
162 |
noexcept(allocator_traits<allocator_type>::is_always_equal::value && |
163 |
__is_nothrow_swappable<key_compare>::value); // C++17 |
164 |
|
165 |
// observers: |
166 |
allocator_type get_allocator() const noexcept; |
167 |
key_compare key_comp() const; |
168 |
value_compare value_comp() const; |
169 |
|
170 |
// map operations: |
171 |
iterator find(const key_type& k); |
172 |
const_iterator find(const key_type& k) const; |
173 |
template<typename K> |
174 |
iterator find(const K& x); // C++14 |
175 |
template<typename K> |
176 |
const_iterator find(const K& x) const; // C++14 |
177 |
template<typename K> |
178 |
size_type count(const K& x) const; // C++14 |
179 |
|
180 |
size_type count(const key_type& k) const; |
181 |
iterator lower_bound(const key_type& k); |
182 |
const_iterator lower_bound(const key_type& k) const; |
183 |
template<typename K> |
184 |
iterator lower_bound(const K& x); // C++14 |
185 |
template<typename K> |
186 |
const_iterator lower_bound(const K& x) const; // C++14 |
187 |
|
188 |
iterator upper_bound(const key_type& k); |
189 |
const_iterator upper_bound(const key_type& k) const; |
190 |
template<typename K> |
191 |
iterator upper_bound(const K& x); // C++14 |
192 |
template<typename K> |
193 |
const_iterator upper_bound(const K& x) const; // C++14 |
194 |
|
195 |
pair<iterator,iterator> equal_range(const key_type& k); |
196 |
pair<const_iterator,const_iterator> equal_range(const key_type& k) const; |
197 |
template<typename K> |
198 |
pair<iterator,iterator> equal_range(const K& x); // C++14 |
199 |
template<typename K> |
200 |
pair<const_iterator,const_iterator> equal_range(const K& x) const; // C++14 |
201 |
}; |
202 |
|
203 |
template <class Key, class T, class Compare, class Allocator> |
204 |
bool |
205 |
operator==(const map<Key, T, Compare, Allocator>& x, |
206 |
const map<Key, T, Compare, Allocator>& y); |
207 |
|
208 |
template <class Key, class T, class Compare, class Allocator> |
209 |
bool |
210 |
operator< (const map<Key, T, Compare, Allocator>& x, |
211 |
const map<Key, T, Compare, Allocator>& y); |
212 |
|
213 |
template <class Key, class T, class Compare, class Allocator> |
214 |
bool |
215 |
operator!=(const map<Key, T, Compare, Allocator>& x, |
216 |
const map<Key, T, Compare, Allocator>& y); |
217 |
|
218 |
template <class Key, class T, class Compare, class Allocator> |
219 |
bool |
220 |
operator> (const map<Key, T, Compare, Allocator>& x, |
221 |
const map<Key, T, Compare, Allocator>& y); |
222 |
|
223 |
template <class Key, class T, class Compare, class Allocator> |
224 |
bool |
225 |
operator>=(const map<Key, T, Compare, Allocator>& x, |
226 |
const map<Key, T, Compare, Allocator>& y); |
227 |
|
228 |
template <class Key, class T, class Compare, class Allocator> |
229 |
bool |
230 |
operator<=(const map<Key, T, Compare, Allocator>& x, |
231 |
const map<Key, T, Compare, Allocator>& y); |
232 |
|
233 |
// specialized algorithms: |
234 |
template <class Key, class T, class Compare, class Allocator> |
235 |
void |
236 |
swap(map<Key, T, Compare, Allocator>& x, map<Key, T, Compare, Allocator>& y) |
237 |
noexcept(noexcept(x.swap(y))); |
238 |
|
239 |
template <class Key, class T, class Compare = less<Key>, |
240 |
class Allocator = allocator<pair<const Key, T>>> |
241 |
class multimap |
242 |
{ |
243 |
public: |
244 |
// types: |
245 |
typedef Key key_type; |
246 |
typedef T mapped_type; |
247 |
typedef pair<const key_type,mapped_type> value_type; |
248 |
typedef Compare key_compare; |
249 |
typedef Allocator allocator_type; |
250 |
typedef typename allocator_type::reference reference; |
251 |
typedef typename allocator_type::const_reference const_reference; |
252 |
typedef typename allocator_type::size_type size_type; |
253 |
typedef typename allocator_type::difference_type difference_type; |
254 |
typedef typename allocator_type::pointer pointer; |
255 |
typedef typename allocator_type::const_pointer const_pointer; |
256 |
|
257 |
typedef implementation-defined iterator; |
258 |
typedef implementation-defined const_iterator; |
259 |
typedef std::reverse_iterator<iterator> reverse_iterator; |
260 |
typedef std::reverse_iterator<const_iterator> const_reverse_iterator; |
261 |
|
262 |
class value_compare |
263 |
: public binary_function<value_type,value_type,bool> |
264 |
{ |
265 |
friend class multimap; |
266 |
protected: |
267 |
key_compare comp; |
268 |
value_compare(key_compare c); |
269 |
public: |
270 |
bool operator()(const value_type& x, const value_type& y) const; |
271 |
}; |
272 |
|
273 |
// construct/copy/destroy: |
274 |
multimap() |
275 |
noexcept( |
276 |
is_nothrow_default_constructible<allocator_type>::value && |
277 |
is_nothrow_default_constructible<key_compare>::value && |
278 |
is_nothrow_copy_constructible<key_compare>::value); |
279 |
explicit multimap(const key_compare& comp); |
280 |
multimap(const key_compare& comp, const allocator_type& a); |
281 |
template <class InputIterator> |
282 |
multimap(InputIterator first, InputIterator last, const key_compare& comp); |
283 |
template <class InputIterator> |
284 |
multimap(InputIterator first, InputIterator last, const key_compare& comp, |
285 |
const allocator_type& a); |
286 |
multimap(const multimap& m); |
287 |
multimap(multimap&& m) |
288 |
noexcept( |
289 |
is_nothrow_move_constructible<allocator_type>::value && |
290 |
is_nothrow_move_constructible<key_compare>::value); |
291 |
explicit multimap(const allocator_type& a); |
292 |
multimap(const multimap& m, const allocator_type& a); |
293 |
multimap(multimap&& m, const allocator_type& a); |
294 |
multimap(initializer_list<value_type> il, const key_compare& comp = key_compare()); |
295 |
multimap(initializer_list<value_type> il, const key_compare& comp, |
296 |
const allocator_type& a); |
297 |
template <class InputIterator> |
298 |
multimap(InputIterator first, InputIterator last, const allocator_type& a) |
299 |
: multimap(first, last, Compare(), a) {} // C++14 |
300 |
multimap(initializer_list<value_type> il, const allocator_type& a) |
301 |
: multimap(il, Compare(), a) {} // C++14 |
302 |
~multimap(); |
303 |
|
304 |
multimap& operator=(const multimap& m); |
305 |
multimap& operator=(multimap&& m) |
306 |
noexcept( |
307 |
allocator_type::propagate_on_container_move_assignment::value && |
308 |
is_nothrow_move_assignable<allocator_type>::value && |
309 |
is_nothrow_move_assignable<key_compare>::value); |
310 |
multimap& operator=(initializer_list<value_type> il); |
311 |
|
312 |
// iterators: |
313 |
iterator begin() noexcept; |
314 |
const_iterator begin() const noexcept; |
315 |
iterator end() noexcept; |
316 |
const_iterator end() const noexcept; |
317 |
|
318 |
reverse_iterator rbegin() noexcept; |
319 |
const_reverse_iterator rbegin() const noexcept; |
320 |
reverse_iterator rend() noexcept; |
321 |
const_reverse_iterator rend() const noexcept; |
322 |
|
323 |
const_iterator cbegin() const noexcept; |
324 |
const_iterator cend() const noexcept; |
325 |
const_reverse_iterator crbegin() const noexcept; |
326 |
const_reverse_iterator crend() const noexcept; |
327 |
|
328 |
// capacity: |
329 |
bool empty() const noexcept; |
330 |
size_type size() const noexcept; |
331 |
size_type max_size() const noexcept; |
332 |
|
333 |
// modifiers: |
334 |
template <class... Args> |
335 |
iterator emplace(Args&&... args); |
336 |
template <class... Args> |
337 |
iterator emplace_hint(const_iterator position, Args&&... args); |
338 |
iterator insert(const value_type& v); |
339 |
template <class P> |
340 |
iterator insert(P&& p); |
341 |
iterator insert(const_iterator position, const value_type& v); |
342 |
template <class P> |
343 |
iterator insert(const_iterator position, P&& p); |
344 |
template <class InputIterator> |
345 |
void insert(InputIterator first, InputIterator last); |
346 |
void insert(initializer_list<value_type> il); |
347 |
|
348 |
iterator erase(const_iterator position); |
349 |
iterator erase(iterator position); // C++14 |
350 |
size_type erase(const key_type& k); |
351 |
iterator erase(const_iterator first, const_iterator last); |
352 |
void clear() noexcept; |
353 |
|
354 |
void swap(multimap& m) |
355 |
noexcept(allocator_traits<allocator_type>::is_always_equal::value && |
356 |
__is_nothrow_swappable<key_compare>::value); // C++17 |
357 |
|
358 |
// observers: |
359 |
allocator_type get_allocator() const noexcept; |
360 |
key_compare key_comp() const; |
361 |
value_compare value_comp() const; |
362 |
|
363 |
// map operations: |
364 |
iterator find(const key_type& k); |
365 |
const_iterator find(const key_type& k) const; |
366 |
template<typename K> |
367 |
iterator find(const K& x); // C++14 |
368 |
template<typename K> |
369 |
const_iterator find(const K& x) const; // C++14 |
370 |
template<typename K> |
371 |
size_type count(const K& x) const; // C++14 |
372 |
|
373 |
size_type count(const key_type& k) const; |
374 |
iterator lower_bound(const key_type& k); |
375 |
const_iterator lower_bound(const key_type& k) const; |
376 |
template<typename K> |
377 |
iterator lower_bound(const K& x); // C++14 |
378 |
template<typename K> |
379 |
const_iterator lower_bound(const K& x) const; // C++14 |
380 |
|
381 |
iterator upper_bound(const key_type& k); |
382 |
const_iterator upper_bound(const key_type& k) const; |
383 |
template<typename K> |
384 |
iterator upper_bound(const K& x); // C++14 |
385 |
template<typename K> |
386 |
const_iterator upper_bound(const K& x) const; // C++14 |
387 |
|
388 |
pair<iterator,iterator> equal_range(const key_type& k); |
389 |
pair<const_iterator,const_iterator> equal_range(const key_type& k) const; |
390 |
template<typename K> |
391 |
pair<iterator,iterator> equal_range(const K& x); // C++14 |
392 |
template<typename K> |
393 |
pair<const_iterator,const_iterator> equal_range(const K& x) const; // C++14 |
394 |
}; |
395 |
|
396 |
template <class Key, class T, class Compare, class Allocator> |
397 |
bool |
398 |
operator==(const multimap<Key, T, Compare, Allocator>& x, |
399 |
const multimap<Key, T, Compare, Allocator>& y); |
400 |
|
401 |
template <class Key, class T, class Compare, class Allocator> |
402 |
bool |
403 |
operator< (const multimap<Key, T, Compare, Allocator>& x, |
404 |
const multimap<Key, T, Compare, Allocator>& y); |
405 |
|
406 |
template <class Key, class T, class Compare, class Allocator> |
407 |
bool |
408 |
operator!=(const multimap<Key, T, Compare, Allocator>& x, |
409 |
const multimap<Key, T, Compare, Allocator>& y); |
410 |
|
411 |
template <class Key, class T, class Compare, class Allocator> |
412 |
bool |
413 |
operator> (const multimap<Key, T, Compare, Allocator>& x, |
414 |
const multimap<Key, T, Compare, Allocator>& y); |
415 |
|
416 |
template <class Key, class T, class Compare, class Allocator> |
417 |
bool |
418 |
operator>=(const multimap<Key, T, Compare, Allocator>& x, |
419 |
const multimap<Key, T, Compare, Allocator>& y); |
420 |
|
421 |
template <class Key, class T, class Compare, class Allocator> |
422 |
bool |
423 |
operator<=(const multimap<Key, T, Compare, Allocator>& x, |
424 |
const multimap<Key, T, Compare, Allocator>& y); |
425 |
|
426 |
// specialized algorithms: |
427 |
template <class Key, class T, class Compare, class Allocator> |
428 |
void |
429 |
swap(multimap<Key, T, Compare, Allocator>& x, |
430 |
multimap<Key, T, Compare, Allocator>& y) |
431 |
noexcept(noexcept(x.swap(y))); |
432 |
|
433 |
} // std |
434 |
|
435 |
*/ |
436 |
|
437 |
#include <__config> |
438 |
#include <__tree> |
439 |
#include <iterator> |
440 |
#include <memory> |
441 |
#include <utility> |
442 |
#include <functional> |
443 |
#include <initializer_list> |
444 |
#include <type_traits> |
445 |
|
446 |
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) |
447 |
#pragma GCC system_header |
448 |
#endif |
449 |
|
450 |
_LIBCPP_BEGIN_NAMESPACE_STD |
451 |
|
452 |
template <class _Key, class _CP, class _Compare, |
453 |
bool = is_empty<_Compare>::value && !__libcpp_is_final<_Compare>::value |
454 |
> |
455 |
class __map_value_compare |
456 |
: private _Compare |
457 |
{ |
458 |
public: |
459 |
_LIBCPP_INLINE_VISIBILITY |
460 |
__map_value_compare() |
461 |
_NOEXCEPT_(is_nothrow_default_constructible<_Compare>::value) |
462 |
: _Compare() {} |
463 |
_LIBCPP_INLINE_VISIBILITY |
464 |
__map_value_compare(_Compare c) |
465 |
_NOEXCEPT_(is_nothrow_copy_constructible<_Compare>::value) |
466 |
: _Compare(c) {} |
467 |
_LIBCPP_INLINE_VISIBILITY |
468 |
const _Compare& key_comp() const _NOEXCEPT {return *this;} |
469 |
_LIBCPP_INLINE_VISIBILITY |
470 |
bool operator()(const _CP& __x, const _CP& __y) const |
471 |
{return static_cast<const _Compare&>(*this)(__x.__cc.first, __y.__cc.first);} |
472 |
_LIBCPP_INLINE_VISIBILITY |
473 |
bool operator()(const _CP& __x, const _Key& __y) const |
474 |
{return static_cast<const _Compare&>(*this)(__x.__cc.first, __y);} |
475 |
_LIBCPP_INLINE_VISIBILITY |
476 |
bool operator()(const _Key& __x, const _CP& __y) const |
477 |
{return static_cast<const _Compare&>(*this)(__x, __y.__cc.first);} |
478 |
void swap(__map_value_compare&__y) |
479 |
_NOEXCEPT_(__is_nothrow_swappable<_Compare>::value) |
480 |
{ |
481 |
using _VSTD::swap; |
482 |
swap(static_cast<const _Compare&>(*this), static_cast<const _Compare&>(__y)); |
483 |
} |
484 |
|
485 |
#if _LIBCPP_STD_VER > 11 |
486 |
template <typename _K2> |
487 |
_LIBCPP_INLINE_VISIBILITY |
488 |
typename enable_if<__is_transparent<_Compare, _K2>::value, bool>::type |
489 |
operator () ( const _K2& __x, const _CP& __y ) const |
490 |
{return static_cast<const _Compare&>(*this) (__x, __y.__cc.first);} |
491 |
|
492 |
template <typename _K2> |
493 |
_LIBCPP_INLINE_VISIBILITY |
494 |
typename enable_if<__is_transparent<_Compare, _K2>::value, bool>::type |
495 |
operator () (const _CP& __x, const _K2& __y) const |
496 |
{return static_cast<const _Compare&>(*this) (__x.__cc.first, __y);} |
497 |
#endif |
498 |
}; |
499 |
|
500 |
template <class _Key, class _CP, class _Compare> |
501 |
class __map_value_compare<_Key, _CP, _Compare, false> |
502 |
{ |
503 |
_Compare comp; |
504 |
|
505 |
public: |
506 |
_LIBCPP_INLINE_VISIBILITY |
507 |
__map_value_compare() |
508 |
_NOEXCEPT_(is_nothrow_default_constructible<_Compare>::value) |
509 |
: comp() {} |
510 |
_LIBCPP_INLINE_VISIBILITY |
511 |
__map_value_compare(_Compare c) |
512 |
_NOEXCEPT_(is_nothrow_copy_constructible<_Compare>::value) |
513 |
: comp(c) {} |
514 |
_LIBCPP_INLINE_VISIBILITY |
515 |
const _Compare& key_comp() const _NOEXCEPT {return comp;} |
516 |
|
517 |
_LIBCPP_INLINE_VISIBILITY |
518 |
bool operator()(const _CP& __x, const _CP& __y) const |
519 |
{return comp(__x.__cc.first, __y.__cc.first);} |
520 |
_LIBCPP_INLINE_VISIBILITY |
521 |
bool operator()(const _CP& __x, const _Key& __y) const |
522 |
{return comp(__x.__cc.first, __y);} |
523 |
_LIBCPP_INLINE_VISIBILITY |
524 |
bool operator()(const _Key& __x, const _CP& __y) const |
525 |
{return comp(__x, __y.__cc.first);} |
526 |
void swap(__map_value_compare&__y) |
527 |
_NOEXCEPT_(__is_nothrow_swappable<_Compare>::value) |
528 |
{ |
529 |
using _VSTD::swap; |
530 |
swap(comp, __y.comp); |
531 |
} |
532 |
|
533 |
#if _LIBCPP_STD_VER > 11 |
534 |
template <typename _K2> |
535 |
_LIBCPP_INLINE_VISIBILITY |
536 |
typename enable_if<__is_transparent<_Compare, _K2>::value, bool>::type |
537 |
operator () ( const _K2& __x, const _CP& __y ) const |
538 |
{return comp (__x, __y.__cc.first);} |
539 |
|
540 |
template <typename _K2> |
541 |
_LIBCPP_INLINE_VISIBILITY |
542 |
typename enable_if<__is_transparent<_Compare, _K2>::value, bool>::type |
543 |
operator () (const _CP& __x, const _K2& __y) const |
544 |
{return comp (__x.__cc.first, __y);} |
545 |
#endif |
546 |
}; |
547 |
|
548 |
template <class _Key, class _CP, class _Compare, bool __b> |
549 |
inline _LIBCPP_INLINE_VISIBILITY |
550 |
void |
551 |
swap(__map_value_compare<_Key, _CP, _Compare, __b>& __x, |
552 |
__map_value_compare<_Key, _CP, _Compare, __b>& __y) |
553 |
_NOEXCEPT_(_NOEXCEPT_(__x.swap(__y))) |
554 |
{ |
555 |
__x.swap(__y); |
556 |
} |
557 |
|
558 |
template <class _Allocator> |
559 |
class __map_node_destructor |
560 |
{ |
561 |
typedef _Allocator allocator_type; |
562 |
typedef allocator_traits<allocator_type> __alloc_traits; |
563 |
typedef typename __alloc_traits::value_type::value_type value_type; |
564 |
public: |
565 |
typedef typename __alloc_traits::pointer pointer; |
566 |
private: |
567 |
typedef typename value_type::value_type::first_type first_type; |
568 |
typedef typename value_type::value_type::second_type second_type; |
569 |
|
570 |
allocator_type& __na_; |
571 |
|
572 |
__map_node_destructor& operator=(const __map_node_destructor&); |
573 |
|
574 |
public: |
575 |
bool __first_constructed; |
576 |
bool __second_constructed; |
577 |
|
578 |
_LIBCPP_INLINE_VISIBILITY |
579 |
explicit __map_node_destructor(allocator_type& __na) _NOEXCEPT |
580 |
: __na_(__na), |
581 |
__first_constructed(false), |
582 |
__second_constructed(false) |
583 |
{} |
584 |
|
585 |
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES |
586 |
_LIBCPP_INLINE_VISIBILITY |
587 |
__map_node_destructor(__tree_node_destructor<allocator_type>&& __x) _NOEXCEPT |
588 |
: __na_(__x.__na_), |
589 |
__first_constructed(__x.__value_constructed), |
590 |
__second_constructed(__x.__value_constructed) |
591 |
{ |
592 |
__x.__value_constructed = false; |
593 |
} |
594 |
#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES |
595 |
|
596 |
_LIBCPP_INLINE_VISIBILITY |
597 |
void operator()(pointer __p) _NOEXCEPT |
598 |
{ |
599 |
if (__second_constructed) |
600 |
__alloc_traits::destroy(__na_, _VSTD::addressof(__p->__value_.__cc.second)); |
601 |
if (__first_constructed) |
602 |
__alloc_traits::destroy(__na_, _VSTD::addressof(__p->__value_.__cc.first)); |
603 |
if (__p) |
604 |
__alloc_traits::deallocate(__na_, __p, 1); |
605 |
} |
606 |
}; |
607 |
|
608 |
template <class _Key, class _Tp, class _Compare, class _Allocator> |
609 |
class map; |
610 |
template <class _Key, class _Tp, class _Compare, class _Allocator> |
611 |
class multimap; |
612 |
template <class _TreeIterator> class __map_const_iterator; |
613 |
|
614 |
#if __cplusplus >= 201103L |
615 |
|
616 |
template <class _Key, class _Tp> |
617 |
union __value_type |
618 |
{ |
619 |
typedef _Key key_type; |
620 |
typedef _Tp mapped_type; |
621 |
typedef pair<const key_type, mapped_type> value_type; |
622 |
typedef pair<key_type, mapped_type> __nc_value_type; |
623 |
|
624 |
value_type __cc; |
625 |
__nc_value_type __nc; |
626 |
|
627 |
template <class ..._Args> |
628 |
_LIBCPP_INLINE_VISIBILITY |
629 |
__value_type(_Args&& ...__args) |
630 |
: __cc(std::forward<_Args>(__args)...) {} |
631 |
|
632 |
_LIBCPP_INLINE_VISIBILITY |
633 |
__value_type(const __value_type& __v) |
634 |
: __cc(__v.__cc) {} |
635 |
|
636 |
_LIBCPP_INLINE_VISIBILITY |
637 |
__value_type(__value_type& __v) |
638 |
: __cc(__v.__cc) {} |
639 |
|
640 |
_LIBCPP_INLINE_VISIBILITY |
641 |
__value_type(__value_type&& __v) |
642 |
: __nc(std::move(__v.__nc)) {} |
643 |
|
644 |
_LIBCPP_INLINE_VISIBILITY |
645 |
__value_type& operator=(const __value_type& __v) |
646 |
{__nc = __v.__cc; return *this;} |
647 |
|
648 |
_LIBCPP_INLINE_VISIBILITY |
649 |
__value_type& operator=(__value_type&& __v) |
650 |
{__nc = std::move(__v.__nc); return *this;} |
651 |
|
652 |
_LIBCPP_INLINE_VISIBILITY |
653 |
~__value_type() {__cc.~value_type();} |
654 |
}; |
655 |
|
656 |
#else |
657 |
|
658 |
template <class _Key, class _Tp> |
659 |
struct __value_type |
660 |
{ |
661 |
typedef _Key key_type; |
662 |
typedef _Tp mapped_type; |
663 |
typedef pair<const key_type, mapped_type> value_type; |
664 |
|
665 |
value_type __cc; |
666 |
|
667 |
_LIBCPP_INLINE_VISIBILITY |
668 |
__value_type() {} |
669 |
|
670 |
template <class _A0> |
671 |
_LIBCPP_INLINE_VISIBILITY |
672 |
__value_type(const _A0& __a0) |
673 |
: __cc(__a0) {} |
674 |
|
675 |
template <class _A0, class _A1> |
676 |
_LIBCPP_INLINE_VISIBILITY |
677 |
__value_type(const _A0& __a0, const _A1& __a1) |
678 |
: __cc(__a0, __a1) {} |
679 |
}; |
680 |
|
681 |
#endif |
682 |
|
683 |
template <class _Tp> |
684 |
struct __extract_key_value_types; |
685 |
|
686 |
template <class _Key, class _Tp> |
687 |
struct __extract_key_value_types<__value_type<_Key, _Tp> > |
688 |
{ |
689 |
typedef _Key const __key_type; |
690 |
typedef _Tp __mapped_type; |
691 |
}; |
692 |
|
693 |
template <class _TreeIterator> |
694 |
class _LIBCPP_TYPE_VIS_ONLY __map_iterator |
695 |
{ |
696 |
_TreeIterator __i_; |
697 |
|
698 |
typedef typename _TreeIterator::__pointer_traits __pointer_traits; |
699 |
typedef typename _TreeIterator::value_type __value_type; |
700 |
typedef typename __extract_key_value_types<__value_type>::__key_type __key_type; |
701 |
typedef typename __extract_key_value_types<__value_type>::__mapped_type __mapped_type; |
702 |
public: |
703 |
typedef bidirectional_iterator_tag iterator_category; |
704 |
typedef pair<__key_type, __mapped_type> value_type; |
705 |
typedef typename _TreeIterator::difference_type difference_type; |
706 |
typedef value_type& reference; |
707 |
typedef typename __pointer_traits::template |
708 |
#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES |
709 |
rebind<value_type> |
710 |
#else |
711 |
rebind<value_type>::other |
712 |
#endif |
713 |
pointer; |
714 |
|
715 |
_LIBCPP_INLINE_VISIBILITY |
716 |
__map_iterator() _NOEXCEPT {} |
717 |
|
718 |
_LIBCPP_INLINE_VISIBILITY |
719 |
__map_iterator(_TreeIterator __i) _NOEXCEPT : __i_(__i) {} |
720 |
|
721 |
_LIBCPP_INLINE_VISIBILITY |
722 |
reference operator*() const {return __i_->__cc;} |
723 |
_LIBCPP_INLINE_VISIBILITY |
724 |
pointer operator->() const {return pointer_traits<pointer>::pointer_to(__i_->__cc);} |
725 |
|
726 |
_LIBCPP_INLINE_VISIBILITY |
727 |
__map_iterator& operator++() {++__i_; return *this;} |
728 |
_LIBCPP_INLINE_VISIBILITY |
729 |
__map_iterator operator++(int) |
730 |
{ |
731 |
__map_iterator __t(*this); |
732 |
++(*this); |
733 |
return __t; |
734 |
} |
735 |
|
736 |
_LIBCPP_INLINE_VISIBILITY |
737 |
__map_iterator& operator--() {--__i_; return *this;} |
738 |
_LIBCPP_INLINE_VISIBILITY |
739 |
__map_iterator operator--(int) |
740 |
{ |
741 |
__map_iterator __t(*this); |
742 |
--(*this); |
743 |
return __t; |
744 |
} |
745 |
|
746 |
friend _LIBCPP_INLINE_VISIBILITY |
747 |
bool operator==(const __map_iterator& __x, const __map_iterator& __y) |
748 |
{return __x.__i_ == __y.__i_;} |
749 |
friend |
750 |
_LIBCPP_INLINE_VISIBILITY |
751 |
bool operator!=(const __map_iterator& __x, const __map_iterator& __y) |
752 |
{return __x.__i_ != __y.__i_;} |
753 |
|
754 |
template <class, class, class, class> friend class _LIBCPP_TYPE_VIS_ONLY map; |
755 |
template <class, class, class, class> friend class _LIBCPP_TYPE_VIS_ONLY multimap; |
756 |
template <class> friend class _LIBCPP_TYPE_VIS_ONLY __map_const_iterator; |
757 |
}; |
758 |
|
759 |
template <class _TreeIterator> |
760 |
class _LIBCPP_TYPE_VIS_ONLY __map_const_iterator |
761 |
{ |
762 |
_TreeIterator __i_; |
763 |
|
764 |
typedef typename _TreeIterator::__pointer_traits __pointer_traits; |
765 |
typedef typename _TreeIterator::value_type __value_type; |
766 |
typedef typename __extract_key_value_types<__value_type>::__key_type __key_type; |
767 |
typedef typename __extract_key_value_types<__value_type>::__mapped_type __mapped_type; |
768 |
public: |
769 |
typedef bidirectional_iterator_tag iterator_category; |
770 |
typedef pair<__key_type, __mapped_type> value_type; |
771 |
typedef typename _TreeIterator::difference_type difference_type; |
772 |
typedef const value_type& reference; |
773 |
typedef typename __pointer_traits::template |
774 |
#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES |
775 |
rebind<const value_type> |
776 |
#else |
777 |
rebind<const value_type>::other |
778 |
#endif |
779 |
pointer; |
780 |
|
781 |
_LIBCPP_INLINE_VISIBILITY |
782 |
__map_const_iterator() _NOEXCEPT {} |
783 |
|
784 |
_LIBCPP_INLINE_VISIBILITY |
785 |
__map_const_iterator(_TreeIterator __i) _NOEXCEPT : __i_(__i) {} |
786 |
_LIBCPP_INLINE_VISIBILITY |
787 |
__map_const_iterator(__map_iterator< |
788 |
typename _TreeIterator::__non_const_iterator> __i) _NOEXCEPT |
789 |
: __i_(__i.__i_) {} |
790 |
|
791 |
_LIBCPP_INLINE_VISIBILITY |
792 |
reference operator*() const {return __i_->__cc;} |
793 |
_LIBCPP_INLINE_VISIBILITY |
794 |
pointer operator->() const {return pointer_traits<pointer>::pointer_to(__i_->__cc);} |
795 |
|
796 |
_LIBCPP_INLINE_VISIBILITY |
797 |
__map_const_iterator& operator++() {++__i_; return *this;} |
798 |
_LIBCPP_INLINE_VISIBILITY |
799 |
__map_const_iterator operator++(int) |
800 |
{ |
801 |
__map_const_iterator __t(*this); |
802 |
++(*this); |
803 |
return __t; |
804 |
} |
805 |
|
806 |
_LIBCPP_INLINE_VISIBILITY |
807 |
__map_const_iterator& operator--() {--__i_; return *this;} |
808 |
_LIBCPP_INLINE_VISIBILITY |
809 |
__map_const_iterator operator--(int) |
810 |
{ |
811 |
__map_const_iterator __t(*this); |
812 |
--(*this); |
813 |
return __t; |
814 |
} |
815 |
|
816 |
friend _LIBCPP_INLINE_VISIBILITY |
817 |
bool operator==(const __map_const_iterator& __x, const __map_const_iterator& __y) |
818 |
{return __x.__i_ == __y.__i_;} |
819 |
friend _LIBCPP_INLINE_VISIBILITY |
820 |
bool operator!=(const __map_const_iterator& __x, const __map_const_iterator& __y) |
821 |
{return __x.__i_ != __y.__i_;} |
822 |
|
823 |
template <class, class, class, class> friend class _LIBCPP_TYPE_VIS_ONLY map; |
824 |
template <class, class, class, class> friend class _LIBCPP_TYPE_VIS_ONLY multimap; |
825 |
template <class, class, class> friend class _LIBCPP_TYPE_VIS_ONLY __tree_const_iterator; |
826 |
}; |
827 |
|
828 |
template <class _Key, class _Tp, class _Compare = less<_Key>, |
829 |
class _Allocator = allocator<pair<const _Key, _Tp> > > |
830 |
class _LIBCPP_TYPE_VIS_ONLY map |
831 |
{ |
832 |
public: |
833 |
// types: |
834 |
typedef _Key key_type; |
835 |
typedef _Tp mapped_type; |
836 |
typedef pair<const key_type, mapped_type> value_type; |
837 |
typedef pair<key_type, mapped_type> __nc_value_type; |
838 |
typedef _Compare key_compare; |
839 |
typedef _Allocator allocator_type; |
840 |
typedef value_type& reference; |
841 |
typedef const value_type& const_reference; |
842 |
|
843 |
class _LIBCPP_TYPE_VIS_ONLY value_compare |
844 |
: public binary_function<value_type, value_type, bool> |
845 |
{ |
846 |
friend class map; |
847 |
protected: |
848 |
key_compare comp; |
849 |
|
850 |
_LIBCPP_INLINE_VISIBILITY value_compare(key_compare c) : comp(c) {} |
851 |
public: |
852 |
_LIBCPP_INLINE_VISIBILITY |
853 |
bool operator()(const value_type& __x, const value_type& __y) const |
854 |
{return comp(__x.first, __y.first);} |
855 |
}; |
856 |
|
857 |
private: |
858 |
|
859 |
typedef _VSTD::__value_type<key_type, mapped_type> __value_type; |
860 |
typedef __map_value_compare<key_type, __value_type, key_compare> __vc; |
861 |
typedef typename __rebind_alloc_helper<allocator_traits<allocator_type>, |
862 |
__value_type>::type __allocator_type; |
863 |
typedef __tree<__value_type, __vc, __allocator_type> __base; |
864 |
typedef typename __base::__node_traits __node_traits; |
865 |
typedef allocator_traits<allocator_type> __alloc_traits; |
866 |
|
867 |
__base __tree_; |
868 |
|
869 |
public: |
870 |
typedef typename __alloc_traits::pointer pointer; |
871 |
typedef typename __alloc_traits::const_pointer const_pointer; |
872 |
typedef typename __alloc_traits::size_type size_type; |
873 |
typedef typename __alloc_traits::difference_type difference_type; |
874 |
typedef __map_iterator<typename __base::iterator> iterator; |
875 |
typedef __map_const_iterator<typename __base::const_iterator> const_iterator; |
876 |
typedef _VSTD::reverse_iterator<iterator> reverse_iterator; |
877 |
typedef _VSTD::reverse_iterator<const_iterator> const_reverse_iterator; |
878 |
|
879 |
_LIBCPP_INLINE_VISIBILITY |
880 |
map() |
881 |
_NOEXCEPT_( |
882 |
is_nothrow_default_constructible<allocator_type>::value && |
883 |
is_nothrow_default_constructible<key_compare>::value && |
884 |
is_nothrow_copy_constructible<key_compare>::value) |
885 |
: __tree_(__vc(key_compare())) {} |
886 |
|
887 |
_LIBCPP_INLINE_VISIBILITY |
888 |
explicit map(const key_compare& __comp) |
889 |
_NOEXCEPT_( |
890 |
is_nothrow_default_constructible<allocator_type>::value && |
891 |
is_nothrow_copy_constructible<key_compare>::value) |
892 |
: __tree_(__vc(__comp)) {} |
893 |
|
894 |
_LIBCPP_INLINE_VISIBILITY |
895 |
explicit map(const key_compare& __comp, const allocator_type& __a) |
896 |
: __tree_(__vc(__comp), __a) {} |
897 |
|
898 |
template <class _InputIterator> |
899 |
_LIBCPP_INLINE_VISIBILITY |
900 |
map(_InputIterator __f, _InputIterator __l, |
901 |
const key_compare& __comp = key_compare()) |
902 |
: __tree_(__vc(__comp)) |
903 |
{ |
904 |
insert(__f, __l); |
905 |
} |
906 |
|
907 |
template <class _InputIterator> |
908 |
_LIBCPP_INLINE_VISIBILITY |
909 |
map(_InputIterator __f, _InputIterator __l, |
910 |
const key_compare& __comp, const allocator_type& __a) |
911 |
: __tree_(__vc(__comp), __a) |
912 |
{ |
913 |
insert(__f, __l); |
914 |
} |
915 |
|
916 |
#if _LIBCPP_STD_VER > 11 |
917 |
template <class _InputIterator> |
918 |
_LIBCPP_INLINE_VISIBILITY |
919 |
map(_InputIterator __f, _InputIterator __l, const allocator_type& __a) |
920 |
: map(__f, __l, key_compare(), __a) {} |
921 |
#endif |
922 |
|
923 |
_LIBCPP_INLINE_VISIBILITY |
924 |
map(const map& __m) |
925 |
: __tree_(__m.__tree_) |
926 |
{ |
927 |
insert(__m.begin(), __m.end()); |
928 |
} |
929 |
|
930 |
_LIBCPP_INLINE_VISIBILITY |
931 |
map& operator=(const map& __m) |
932 |
{ |
933 |
#if __cplusplus >= 201103L |
934 |
__tree_ = __m.__tree_; |
935 |
#else |
936 |
if (this != &__m) { |
937 |
__tree_.clear(); |
938 |
__tree_.value_comp() = __m.__tree_.value_comp(); |
939 |
__tree_.__copy_assign_alloc(__m.__tree_); |
940 |
insert(__m.begin(), __m.end()); |
941 |
} |
942 |
#endif |
943 |
return *this; |
944 |
} |
945 |
|
946 |
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES |
947 |
|
948 |
_LIBCPP_INLINE_VISIBILITY |
949 |
map(map&& __m) |
950 |
_NOEXCEPT_(is_nothrow_move_constructible<__base>::value) |
951 |
: __tree_(_VSTD::move(__m.__tree_)) |
952 |
{ |
953 |
} |
954 |
|
955 |
map(map&& __m, const allocator_type& __a); |
956 |
|
957 |
_LIBCPP_INLINE_VISIBILITY |
958 |
map& operator=(map&& __m) |
959 |
_NOEXCEPT_(is_nothrow_move_assignable<__base>::value) |
960 |
{ |
961 |
__tree_ = _VSTD::move(__m.__tree_); |
962 |
return *this; |
963 |
} |
964 |
|
965 |
#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES |
966 |
|
967 |
#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS |
968 |
|
969 |
_LIBCPP_INLINE_VISIBILITY |
970 |
map(initializer_list<value_type> __il, const key_compare& __comp = key_compare()) |
971 |
: __tree_(__vc(__comp)) |
972 |
{ |
973 |
insert(__il.begin(), __il.end()); |
974 |
} |
975 |
|
976 |
_LIBCPP_INLINE_VISIBILITY |
977 |
map(initializer_list<value_type> __il, const key_compare& __comp, const allocator_type& __a) |
978 |
: __tree_(__vc(__comp), __a) |
979 |
{ |
980 |
insert(__il.begin(), __il.end()); |
981 |
} |
982 |
|
983 |
#if _LIBCPP_STD_VER > 11 |
984 |
_LIBCPP_INLINE_VISIBILITY |
985 |
map(initializer_list<value_type> __il, const allocator_type& __a) |
986 |
: map(__il, key_compare(), __a) {} |
987 |
#endif |
988 |
|
989 |
_LIBCPP_INLINE_VISIBILITY |
990 |
map& operator=(initializer_list<value_type> __il) |
991 |
{ |
992 |
__tree_.__assign_unique(__il.begin(), __il.end()); |
993 |
return *this; |
994 |
} |
995 |
|
996 |
#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS |
997 |
|
998 |
_LIBCPP_INLINE_VISIBILITY |
999 |
explicit map(const allocator_type& __a) |
1000 |
: __tree_(__a) |
1001 |
{ |
1002 |
} |
1003 |
|
1004 |
_LIBCPP_INLINE_VISIBILITY |
1005 |
map(const map& __m, const allocator_type& __a) |
1006 |
: __tree_(__m.__tree_.value_comp(), __a) |
1007 |
{ |
1008 |
insert(__m.begin(), __m.end()); |
1009 |
} |
1010 |
|
1011 |
_LIBCPP_INLINE_VISIBILITY |
1012 |
iterator begin() _NOEXCEPT {return __tree_.begin();} |
1013 |
_LIBCPP_INLINE_VISIBILITY |
1014 |
const_iterator begin() const _NOEXCEPT {return __tree_.begin();} |
1015 |
_LIBCPP_INLINE_VISIBILITY |
1016 |
iterator end() _NOEXCEPT {return __tree_.end();} |
1017 |
_LIBCPP_INLINE_VISIBILITY |
1018 |
const_iterator end() const _NOEXCEPT {return __tree_.end();} |
1019 |
|
1020 |
_LIBCPP_INLINE_VISIBILITY |
1021 |
reverse_iterator rbegin() _NOEXCEPT {return reverse_iterator(end());} |
1022 |
_LIBCPP_INLINE_VISIBILITY |
1023 |
const_reverse_iterator rbegin() const _NOEXCEPT |
1024 |
{return const_reverse_iterator(end());} |
1025 |
_LIBCPP_INLINE_VISIBILITY |
1026 |
reverse_iterator rend() _NOEXCEPT |
1027 |
{return reverse_iterator(begin());} |
1028 |
_LIBCPP_INLINE_VISIBILITY |
1029 |
const_reverse_iterator rend() const _NOEXCEPT |
1030 |
{return const_reverse_iterator(begin());} |
1031 |
|
1032 |
_LIBCPP_INLINE_VISIBILITY |
1033 |
const_iterator cbegin() const _NOEXCEPT {return begin();} |
1034 |
_LIBCPP_INLINE_VISIBILITY |
1035 |
const_iterator cend() const _NOEXCEPT {return end();} |
1036 |
_LIBCPP_INLINE_VISIBILITY |
1037 |
const_reverse_iterator crbegin() const _NOEXCEPT {return rbegin();} |
1038 |
_LIBCPP_INLINE_VISIBILITY |
1039 |
const_reverse_iterator crend() const _NOEXCEPT {return rend();} |
1040 |
|
1041 |
_LIBCPP_INLINE_VISIBILITY |
1042 |
bool empty() const _NOEXCEPT {return __tree_.size() == 0;} |
1043 |
_LIBCPP_INLINE_VISIBILITY |
1044 |
size_type size() const _NOEXCEPT {return __tree_.size();} |
1045 |
_LIBCPP_INLINE_VISIBILITY |
1046 |
size_type max_size() const _NOEXCEPT {return __tree_.max_size();} |
1047 |
|
1048 |
mapped_type& operator[](const key_type& __k); |
1049 |
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES |
1050 |
mapped_type& operator[](key_type&& __k); |
1051 |
#endif |
1052 |
|
1053 |
mapped_type& at(const key_type& __k); |
1054 |
const mapped_type& at(const key_type& __k) const; |
1055 |
|
1056 |
_LIBCPP_INLINE_VISIBILITY |
1057 |
allocator_type get_allocator() const _NOEXCEPT {return __tree_.__alloc();} |
1058 |
_LIBCPP_INLINE_VISIBILITY |
1059 |
key_compare key_comp() const {return __tree_.value_comp().key_comp();} |
1060 |
_LIBCPP_INLINE_VISIBILITY |
1061 |
value_compare value_comp() const {return value_compare(__tree_.value_comp().key_comp());} |
1062 |
|
1063 |
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES |
1064 |
#ifndef _LIBCPP_HAS_NO_VARIADICS |
1065 |
|
1066 |
template <class ..._Args> |
1067 |
pair<iterator, bool> |
1068 |
emplace(_Args&& ...__args); |
1069 |
|
1070 |
template <class ..._Args> |
1071 |
iterator |
1072 |
emplace_hint(const_iterator __p, _Args&& ...__args); |
1073 |
|
1074 |
#endif // _LIBCPP_HAS_NO_VARIADICS |
1075 |
|
1076 |
template <class _Pp, |
1077 |
class = typename enable_if<is_constructible<value_type, _Pp>::value>::type> |
1078 |
_LIBCPP_INLINE_VISIBILITY |
1079 |
pair<iterator, bool> insert(_Pp&& __p) |
1080 |
{return __tree_.__insert_unique(_VSTD::forward<_Pp>(__p));} |
1081 |
|
1082 |
template <class _Pp, |
1083 |
class = typename enable_if<is_constructible<value_type, _Pp>::value>::type> |
1084 |
_LIBCPP_INLINE_VISIBILITY |
1085 |
iterator insert(const_iterator __pos, _Pp&& __p) |
1086 |
{return __tree_.__insert_unique(__pos.__i_, _VSTD::forward<_Pp>(__p));} |
1087 |
|
1088 |
#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES |
1089 |
|
1090 |
_LIBCPP_INLINE_VISIBILITY |
1091 |
pair<iterator, bool> |
1092 |
insert(const value_type& __v) {return __tree_.__insert_unique(__v);} |
1093 |
|
1094 |
_LIBCPP_INLINE_VISIBILITY |
1095 |
iterator |
1096 |
insert(const_iterator __p, const value_type& __v) |
1097 |
{return __tree_.__insert_unique(__p.__i_, __v);} |
1098 |
|
1099 |
template <class _InputIterator> |
1100 |
_LIBCPP_INLINE_VISIBILITY |
1101 |
void insert(_InputIterator __f, _InputIterator __l) |
1102 |
{ |
1103 |
for (const_iterator __e = cend(); __f != __l; ++__f) |
1104 |
insert(__e.__i_, *__f); |
1105 |
} |
1106 |
|
1107 |
#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS |
1108 |
|
1109 |
_LIBCPP_INLINE_VISIBILITY |
1110 |
void insert(initializer_list<value_type> __il) |
1111 |
{insert(__il.begin(), __il.end());} |
1112 |
|
1113 |
#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS |
1114 |
|
1115 |
#if _LIBCPP_STD_VER > 14 |
1116 |
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES |
1117 |
#ifndef _LIBCPP_HAS_NO_VARIADICS |
1118 |
template <class... _Args> |
1119 |
_LIBCPP_INLINE_VISIBILITY |
1120 |
pair<iterator, bool> try_emplace(const key_type& __k, _Args&&... __args) |
1121 |
{ |
1122 |
iterator __p = lower_bound(__k); |
1123 |
if ( __p != end() && !key_comp()(__k, __p->first)) |
1124 |
return _VSTD::make_pair(__p, false); |
1125 |
else |
1126 |
return _VSTD::make_pair( |
1127 |
emplace_hint(__p, |
1128 |
_VSTD::piecewise_construct, _VSTD::forward_as_tuple(__k), |
1129 |
_VSTD::forward_as_tuple(_VSTD::forward<_Args>(__args)...)), |
1130 |
true); |
1131 |
} |
1132 |
|
1133 |
template <class... _Args> |
1134 |
_LIBCPP_INLINE_VISIBILITY |
1135 |
pair<iterator, bool> try_emplace(key_type&& __k, _Args&&... __args) |
1136 |
{ |
1137 |
iterator __p = lower_bound(__k); |
1138 |
if ( __p != end() && !key_comp()(__k, __p->first)) |
1139 |
return _VSTD::make_pair(__p, false); |
1140 |
else |
1141 |
return _VSTD::make_pair( |
1142 |
emplace_hint(__p, |
1143 |
_VSTD::piecewise_construct, _VSTD::forward_as_tuple(_VSTD::move(__k)), |
1144 |
_VSTD::forward_as_tuple(_VSTD::forward<_Args>(__args)...)), |
1145 |
true); |
1146 |
} |
1147 |
|
1148 |
template <class... _Args> |
1149 |
_LIBCPP_INLINE_VISIBILITY |
1150 |
iterator try_emplace(const_iterator __h, const key_type& __k, _Args&&... __args) |
1151 |
{ |
1152 |
iterator __p = lower_bound(__k); |
1153 |
if ( __p != end() && !key_comp()(__k, __p->first)) |
1154 |
return __p; |
1155 |
else |
1156 |
return emplace_hint(__p, |
1157 |
_VSTD::piecewise_construct, _VSTD::forward_as_tuple(__k), |
1158 |
_VSTD::forward_as_tuple(_VSTD::forward<_Args>(__args)...)); |
1159 |
} |
1160 |
|
1161 |
template <class... _Args> |
1162 |
_LIBCPP_INLINE_VISIBILITY |
1163 |
iterator try_emplace(const_iterator __h, key_type&& __k, _Args&&... __args) |
1164 |
{ |
1165 |
iterator __p = lower_bound(__k); |
1166 |
if ( __p != end() && !key_comp()(__k, __p->first)) |
1167 |
return __p; |
1168 |
else |
1169 |
return emplace_hint(__p, |
1170 |
_VSTD::piecewise_construct, _VSTD::forward_as_tuple(_VSTD::move(__k)), |
1171 |
_VSTD::forward_as_tuple(_VSTD::forward<_Args>(__args)...)); |
1172 |
} |
1173 |
|
1174 |
template <class _Vp> |
1175 |
_LIBCPP_INLINE_VISIBILITY |
1176 |
pair<iterator, bool> insert_or_assign(const key_type& __k, _Vp&& __v) |
1177 |
{ |
1178 |
iterator __p = lower_bound(__k); |
1179 |
if ( __p != end() && !key_comp()(__k, __p->first)) |
1180 |
{ |
1181 |
__p->second = _VSTD::forward<_Vp>(__v); |
1182 |
return _VSTD::make_pair(__p, false); |
1183 |
} |
1184 |
return _VSTD::make_pair(emplace_hint(__p, __k, _VSTD::forward<_Vp>(__v)), true); |
1185 |
} |
1186 |
|
1187 |
template <class _Vp> |
1188 |
_LIBCPP_INLINE_VISIBILITY |
1189 |
pair<iterator, bool> insert_or_assign(key_type&& __k, _Vp&& __v) |
1190 |
{ |
1191 |
iterator __p = lower_bound(__k); |
1192 |
if ( __p != end() && !key_comp()(__k, __p->first)) |
1193 |
{ |
1194 |
__p->second = _VSTD::forward<_Vp>(__v); |
1195 |
return _VSTD::make_pair(__p, false); |
1196 |
} |
1197 |
return _VSTD::make_pair(emplace_hint(__p, _VSTD::move(__k), _VSTD::forward<_Vp>(__v)), true); |
1198 |
} |
1199 |
|
1200 |
template <class _Vp> |
1201 |
_LIBCPP_INLINE_VISIBILITY |
1202 |
iterator insert_or_assign(const_iterator __h, const key_type& __k, _Vp&& __v) |
1203 |
{ |
1204 |
iterator __p = lower_bound(__k); |
1205 |
if ( __p != end() && !key_comp()(__k, __p->first)) |
1206 |
{ |
1207 |
__p->second = _VSTD::forward<_Vp>(__v); |
1208 |
return __p; |
1209 |
} |
1210 |
return emplace_hint(__h, __k, _VSTD::forward<_Vp>(__v)); |
1211 |
} |
1212 |
|
1213 |
template <class _Vp> |
1214 |
_LIBCPP_INLINE_VISIBILITY |
1215 |
iterator insert_or_assign(const_iterator __h, key_type&& __k, _Vp&& __v) |
1216 |
{ |
1217 |
iterator __p = lower_bound(__k); |
1218 |
if ( __p != end() && !key_comp()(__k, __p->first)) |
1219 |
{ |
1220 |
__p->second = _VSTD::forward<_Vp>(__v); |
1221 |
return __p; |
1222 |
} |
1223 |
return emplace_hint(__h, _VSTD::move(__k), _VSTD::forward<_Vp>(__v)); |
1224 |
} |
1225 |
#endif |
1226 |
#endif |
1227 |
#endif |
1228 |
|
1229 |
_LIBCPP_INLINE_VISIBILITY |
1230 |
iterator erase(const_iterator __p) {return __tree_.erase(__p.__i_);} |
1231 |
_LIBCPP_INLINE_VISIBILITY |
1232 |
iterator erase(iterator __p) {return __tree_.erase(__p.__i_);} |
1233 |
_LIBCPP_INLINE_VISIBILITY |
1234 |
size_type erase(const key_type& __k) |
1235 |
{return __tree_.__erase_unique(__k);} |
1236 |
_LIBCPP_INLINE_VISIBILITY |
1237 |
iterator erase(const_iterator __f, const_iterator __l) |
1238 |
{return __tree_.erase(__f.__i_, __l.__i_);} |
1239 |
_LIBCPP_INLINE_VISIBILITY |
1240 |
void clear() _NOEXCEPT {__tree_.clear();} |
1241 |
|
1242 |
_LIBCPP_INLINE_VISIBILITY |
1243 |
void swap(map& __m) |
1244 |
_NOEXCEPT_(__is_nothrow_swappable<__base>::value) |
1245 |
{__tree_.swap(__m.__tree_);} |
1246 |
|
1247 |
_LIBCPP_INLINE_VISIBILITY |
1248 |
iterator find(const key_type& __k) {return __tree_.find(__k);} |
1249 |
_LIBCPP_INLINE_VISIBILITY |
1250 |
const_iterator find(const key_type& __k) const {return __tree_.find(__k);} |
1251 |
#if _LIBCPP_STD_VER > 11 |
1252 |
template <typename _K2> |
1253 |
_LIBCPP_INLINE_VISIBILITY |
1254 |
typename enable_if<__is_transparent<_Compare, _K2>::value,iterator>::type |
1255 |
find(const _K2& __k) {return __tree_.find(__k);} |
1256 |
template <typename _K2> |
1257 |
_LIBCPP_INLINE_VISIBILITY |
1258 |
typename enable_if<__is_transparent<_Compare, _K2>::value,const_iterator>::type |
1259 |
find(const _K2& __k) const {return __tree_.find(__k);} |
1260 |
#endif |
1261 |
|
1262 |
_LIBCPP_INLINE_VISIBILITY |
1263 |
size_type count(const key_type& __k) const |
1264 |
{return __tree_.__count_unique(__k);} |
1265 |
#if _LIBCPP_STD_VER > 11 |
1266 |
template <typename _K2> |
1267 |
_LIBCPP_INLINE_VISIBILITY |
1268 |
typename enable_if<__is_transparent<_Compare, _K2>::value,size_type>::type |
1269 |
count(const _K2& __k) const {return __tree_.__count_unique(__k);} |
1270 |
#endif |
1271 |
_LIBCPP_INLINE_VISIBILITY |
1272 |
iterator lower_bound(const key_type& __k) |
1273 |
{return __tree_.lower_bound(__k);} |
1274 |
_LIBCPP_INLINE_VISIBILITY |
1275 |
const_iterator lower_bound(const key_type& __k) const |
1276 |
{return __tree_.lower_bound(__k);} |
1277 |
#if _LIBCPP_STD_VER > 11 |
1278 |
template <typename _K2> |
1279 |
_LIBCPP_INLINE_VISIBILITY |
1280 |
typename enable_if<__is_transparent<_Compare, _K2>::value,iterator>::type |
1281 |
lower_bound(const _K2& __k) {return __tree_.lower_bound(__k);} |
1282 |
|
1283 |
template <typename _K2> |
1284 |
_LIBCPP_INLINE_VISIBILITY |
1285 |
typename enable_if<__is_transparent<_Compare, _K2>::value,const_iterator>::type |
1286 |
lower_bound(const _K2& __k) const {return __tree_.lower_bound(__k);} |
1287 |
#endif |
1288 |
|
1289 |
_LIBCPP_INLINE_VISIBILITY |
1290 |
iterator upper_bound(const key_type& __k) |
1291 |
{return __tree_.upper_bound(__k);} |
1292 |
_LIBCPP_INLINE_VISIBILITY |
1293 |
const_iterator upper_bound(const key_type& __k) const |
1294 |
{return __tree_.upper_bound(__k);} |
1295 |
#if _LIBCPP_STD_VER > 11 |
1296 |
template <typename _K2> |
1297 |
_LIBCPP_INLINE_VISIBILITY |
1298 |
typename enable_if<__is_transparent<_Compare, _K2>::value,iterator>::type |
1299 |
upper_bound(const _K2& __k) {return __tree_.upper_bound(__k);} |
1300 |
template <typename _K2> |
1301 |
_LIBCPP_INLINE_VISIBILITY |
1302 |
typename enable_if<__is_transparent<_Compare, _K2>::value,const_iterator>::type |
1303 |
upper_bound(const _K2& __k) const {return __tree_.upper_bound(__k);} |
1304 |
#endif |
1305 |
|
1306 |
_LIBCPP_INLINE_VISIBILITY |
1307 |
pair<iterator,iterator> equal_range(const key_type& __k) |
1308 |
{return __tree_.__equal_range_unique(__k);} |
1309 |
_LIBCPP_INLINE_VISIBILITY |
1310 |
pair<const_iterator,const_iterator> equal_range(const key_type& __k) const |
1311 |
{return __tree_.__equal_range_unique(__k);} |
1312 |
#if _LIBCPP_STD_VER > 11 |
1313 |
template <typename _K2> |
1314 |
_LIBCPP_INLINE_VISIBILITY |
1315 |
typename enable_if<__is_transparent<_Compare, _K2>::value,pair<iterator,iterator>>::type |
1316 |
equal_range(const _K2& __k) {return __tree_.__equal_range_unique(__k);} |
1317 |
template <typename _K2> |
1318 |
_LIBCPP_INLINE_VISIBILITY |
1319 |
typename enable_if<__is_transparent<_Compare, _K2>::value,pair<const_iterator,const_iterator>>::type |
1320 |
equal_range(const _K2& __k) const {return __tree_.__equal_range_unique(__k);} |
1321 |
#endif |
1322 |
|
1323 |
private: |
1324 |
typedef typename __base::__node __node; |
1325 |
typedef typename __base::__node_allocator __node_allocator; |
1326 |
typedef typename __base::__node_pointer __node_pointer; |
1327 |
typedef typename __base::__node_const_pointer __node_const_pointer; |
1328 |
typedef typename __base::__node_base_pointer __node_base_pointer; |
1329 |
typedef typename __base::__node_base_const_pointer __node_base_const_pointer; |
1330 |
typedef __map_node_destructor<__node_allocator> _Dp; |
1331 |
typedef unique_ptr<__node, _Dp> __node_holder; |
1332 |
|
1333 |
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES |
1334 |
__node_holder __construct_node(); |
1335 |
template <class _A0> |
1336 |
__node_holder __construct_node(_A0&& __a0); |
1337 |
__node_holder __construct_node_with_key(key_type&& __k); |
1338 |
#ifndef _LIBCPP_HAS_NO_VARIADICS |
1339 |
template <class _A0, class _A1, class ..._Args> |
1340 |
__node_holder __construct_node(_A0&& __a0, _A1&& __a1, _Args&& ...__args); |
1341 |
#endif // _LIBCPP_HAS_NO_VARIADICS |
1342 |
#endif |
1343 |
__node_holder __construct_node_with_key(const key_type& __k); |
1344 |
|
1345 |
__node_base_pointer& |
1346 |
__find_equal_key(__node_base_pointer& __parent, const key_type& __k); |
1347 |
__node_base_const_pointer |
1348 |
__find_equal_key(__node_base_const_pointer& __parent, const key_type& __k) const; |
1349 |
}; |
1350 |
|
1351 |
// Find place to insert if __k doesn't exist |
1352 |
// Set __parent to parent of null leaf |
1353 |
// Return reference to null leaf |
1354 |
// If __k exists, set parent to node of __k and return reference to node of __k |
1355 |
template <class _Key, class _Tp, class _Compare, class _Allocator> |
1356 |
typename map<_Key, _Tp, _Compare, _Allocator>::__node_base_pointer& |
1357 |
map<_Key, _Tp, _Compare, _Allocator>::__find_equal_key(__node_base_pointer& __parent, |
1358 |
const key_type& __k) |
1359 |
{ |
1360 |
__node_pointer __nd = __tree_.__root(); |
1361 |
if (__nd != nullptr) |
1362 |
{ |
1363 |
while (true) |
1364 |
{ |
1365 |
if (__tree_.value_comp().key_comp()(__k, __nd->__value_.__cc.first)) |
1366 |
{ |
1367 |
if (__nd->__left_ != nullptr) |
1368 |
__nd = static_cast<__node_pointer>(__nd->__left_); |
1369 |
else |
1370 |
{ |
1371 |
__parent = static_cast<__node_base_pointer>(__nd); |
1372 |
return __parent->__left_; |
1373 |
} |
1374 |
} |
1375 |
else if (__tree_.value_comp().key_comp()(__nd->__value_.__cc.first, __k)) |
1376 |
{ |
1377 |
if (__nd->__right_ != nullptr) |
1378 |
__nd = static_cast<__node_pointer>(__nd->__right_); |
1379 |
else |
1380 |
{ |
1381 |
__parent = static_cast<__node_base_pointer>(__nd); |
1382 |
return __parent->__right_; |
1383 |
} |
1384 |
} |
1385 |
else |
1386 |
{ |
1387 |
__parent = static_cast<__node_base_pointer>(__nd); |
1388 |
return __parent; |
1389 |
} |
1390 |
} |
1391 |
} |
1392 |
__parent = static_cast<__node_base_pointer>(__tree_.__end_node()); |
1393 |
return __parent->__left_; |
1394 |
} |
1395 |
|
1396 |
// Find __k |
1397 |
// Set __parent to parent of null leaf and |
1398 |
// return reference to null leaf iv __k does not exist. |
1399 |
// If __k exists, set parent to node of __k and return reference to node of __k |
1400 |
template <class _Key, class _Tp, class _Compare, class _Allocator> |
1401 |
typename map<_Key, _Tp, _Compare, _Allocator>::__node_base_const_pointer |
1402 |
map<_Key, _Tp, _Compare, _Allocator>::__find_equal_key(__node_base_const_pointer& __parent, |
1403 |
const key_type& __k) const |
1404 |
{ |
1405 |
__node_const_pointer __nd = __tree_.__root(); |
1406 |
if (__nd != nullptr) |
1407 |
{ |
1408 |
while (true) |
1409 |
{ |
1410 |
if (__tree_.value_comp().key_comp()(__k, __nd->__value_.__cc.first)) |
1411 |
{ |
1412 |
if (__nd->__left_ != nullptr) |
1413 |
__nd = static_cast<__node_pointer>(__nd->__left_); |
1414 |
else |
1415 |
{ |
1416 |
__parent = static_cast<__node_base_pointer>(__nd); |
1417 |
return const_cast<const __node_base_const_pointer&>(__parent->__left_); |
1418 |
} |
1419 |
} |
1420 |
else if (__tree_.value_comp().key_comp()(__nd->__value_.__cc.first, __k)) |
1421 |
{ |
1422 |
if (__nd->__right_ != nullptr) |
1423 |
__nd = static_cast<__node_pointer>(__nd->__right_); |
1424 |
else |
1425 |
{ |
1426 |
__parent = static_cast<__node_base_pointer>(__nd); |
1427 |
return const_cast<const __node_base_const_pointer&>(__parent->__right_); |
1428 |
} |
1429 |
} |
1430 |
else |
1431 |
{ |
1432 |
__parent = static_cast<__node_base_pointer>(__nd); |
1433 |
return __parent; |
1434 |
} |
1435 |
} |
1436 |
} |
1437 |
__parent = static_cast<__node_base_pointer>(__tree_.__end_node()); |
1438 |
return const_cast<const __node_base_const_pointer&>(__parent->__left_); |
1439 |
} |
1440 |
|
1441 |
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES |
1442 |
|
1443 |
template <class _Key, class _Tp, class _Compare, class _Allocator> |
1444 |
map<_Key, _Tp, _Compare, _Allocator>::map(map&& __m, const allocator_type& __a) |
1445 |
: __tree_(_VSTD::move(__m.__tree_), __a) |
1446 |
{ |
1447 |
if (__a != __m.get_allocator()) |
1448 |
{ |
1449 |
const_iterator __e = cend(); |
1450 |
while (!__m.empty()) |
1451 |
__tree_.__insert_unique(__e.__i_, |
1452 |
_VSTD::move(__m.__tree_.remove(__m.begin().__i_)->__value_)); |
1453 |
} |
1454 |
} |
1455 |
|
1456 |
template <class _Key, class _Tp, class _Compare, class _Allocator> |
1457 |
typename map<_Key, _Tp, _Compare, _Allocator>::__node_holder |
1458 |
map<_Key, _Tp, _Compare, _Allocator>::__construct_node() |
1459 |
{ |
1460 |
__node_allocator& __na = __tree_.__node_alloc(); |
1461 |
__node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na)); |
1462 |
__node_traits::construct(__na, _VSTD::addressof(__h->__value_.__cc.first)); |
1463 |
__h.get_deleter().__first_constructed = true; |
1464 |
__node_traits::construct(__na, _VSTD::addressof(__h->__value_.__cc.second)); |
1465 |
__h.get_deleter().__second_constructed = true; |
1466 |
return __h; |
1467 |
} |
1468 |
|
1469 |
template <class _Key, class _Tp, class _Compare, class _Allocator> |
1470 |
template <class _A0> |
1471 |
typename map<_Key, _Tp, _Compare, _Allocator>::__node_holder |
1472 |
map<_Key, _Tp, _Compare, _Allocator>::__construct_node(_A0&& __a0) |
1473 |
{ |
1474 |
__node_allocator& __na = __tree_.__node_alloc(); |
1475 |
__node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na)); |
1476 |
__node_traits::construct(__na, _VSTD::addressof(__h->__value_), _VSTD::forward<_A0>(__a0)); |
1477 |
__h.get_deleter().__first_constructed = true; |
1478 |
__h.get_deleter().__second_constructed = true; |
1479 |
return __h; |
1480 |
} |
1481 |
|
1482 |
template <class _Key, class _Tp, class _Compare, class _Allocator> |
1483 |
typename map<_Key, _Tp, _Compare, _Allocator>::__node_holder |
1484 |
map<_Key, _Tp, _Compare, _Allocator>::__construct_node_with_key(key_type&& __k) |
1485 |
{ |
1486 |
__node_allocator& __na = __tree_.__node_alloc(); |
1487 |
__node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na)); |
1488 |
__node_traits::construct(__na, _VSTD::addressof(__h->__value_.__cc.first), _VSTD::move(__k)); |
1489 |
__h.get_deleter().__first_constructed = true; |
1490 |
__node_traits::construct(__na, _VSTD::addressof(__h->__value_.__cc.second)); |
1491 |
__h.get_deleter().__second_constructed = true; |
1492 |
return __h; |
1493 |
} |
1494 |
|
1495 |
#ifndef _LIBCPP_HAS_NO_VARIADICS |
1496 |
|
1497 |
template <class _Key, class _Tp, class _Compare, class _Allocator> |
1498 |
template <class _A0, class _A1, class ..._Args> |
1499 |
typename map<_Key, _Tp, _Compare, _Allocator>::__node_holder |
1500 |
map<_Key, _Tp, _Compare, _Allocator>::__construct_node(_A0&& __a0, _A1&& __a1, _Args&& ...__args) |
1501 |
{ |
1502 |
__node_allocator& __na = __tree_.__node_alloc(); |
1503 |
__node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na)); |
1504 |
__node_traits::construct(__na, _VSTD::addressof(__h->__value_), |
1505 |
_VSTD::forward<_A0>(__a0), _VSTD::forward<_A1>(__a1), |
1506 |
_VSTD::forward<_Args>(__args)...); |
1507 |
__h.get_deleter().__first_constructed = true; |
1508 |
__h.get_deleter().__second_constructed = true; |
1509 |
return __h; |
1510 |
} |
1511 |
|
1512 |
#endif // _LIBCPP_HAS_NO_VARIADICS |
1513 |
|
1514 |
#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES |
1515 |
|
1516 |
template <class _Key, class _Tp, class _Compare, class _Allocator> |
1517 |
typename map<_Key, _Tp, _Compare, _Allocator>::__node_holder |
1518 |
map<_Key, _Tp, _Compare, _Allocator>::__construct_node_with_key(const key_type& __k) |
1519 |
{ |
1520 |
__node_allocator& __na = __tree_.__node_alloc(); |
1521 |
__node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na)); |
1522 |
__node_traits::construct(__na, _VSTD::addressof(__h->__value_.__cc.first), __k); |
1523 |
__h.get_deleter().__first_constructed = true; |
1524 |
__node_traits::construct(__na, _VSTD::addressof(__h->__value_.__cc.second)); |
1525 |
__h.get_deleter().__second_constructed = true; |
1526 |
return _LIBCPP_EXPLICIT_MOVE(__h); // explicitly moved for C++03 |
1527 |
} |
1528 |
|
1529 |
template <class _Key, class _Tp, class _Compare, class _Allocator> |
1530 |
_Tp& |
1531 |
map<_Key, _Tp, _Compare, _Allocator>::operator[](const key_type& __k) |
1532 |
{ |
1533 |
__node_base_pointer __parent; |
1534 |
__node_base_pointer& __child = __find_equal_key(__parent, __k); |
1535 |
__node_pointer __r = static_cast<__node_pointer>(__child); |
1536 |
if (__child == nullptr) |
1537 |
{ |
1538 |
__node_holder __h = __construct_node_with_key(__k); |
1539 |
__tree_.__insert_node_at(__parent, __child, static_cast<__node_base_pointer>(__h.get())); |
1540 |
__r = __h.release(); |
1541 |
} |
1542 |
return __r->__value_.__cc.second; |
1543 |
} |
1544 |
|
1545 |
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES |
1546 |
|
1547 |
template <class _Key, class _Tp, class _Compare, class _Allocator> |
1548 |
_Tp& |
1549 |
map<_Key, _Tp, _Compare, _Allocator>::operator[](key_type&& __k) |
1550 |
{ |
1551 |
__node_base_pointer __parent; |
1552 |
__node_base_pointer& __child = __find_equal_key(__parent, __k); |
1553 |
__node_pointer __r = static_cast<__node_pointer>(__child); |
1554 |
if (__child == nullptr) |
1555 |
{ |
1556 |
__node_holder __h = __construct_node_with_key(_VSTD::move(__k)); |
1557 |
__tree_.__insert_node_at(__parent, __child, static_cast<__node_base_pointer>(__h.get())); |
1558 |
__r = __h.release(); |
1559 |
} |
1560 |
return __r->__value_.__cc.second; |
1561 |
} |
1562 |
|
1563 |
#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES |
1564 |
|
1565 |
template <class _Key, class _Tp, class _Compare, class _Allocator> |
1566 |
_Tp& |
1567 |
map<_Key, _Tp, _Compare, _Allocator>::at(const key_type& __k) |
1568 |
{ |
1569 |
__node_base_pointer __parent; |
1570 |
__node_base_pointer& __child = __find_equal_key(__parent, __k); |
1571 |
#ifndef _LIBCPP_NO_EXCEPTIONS |
1572 |
if (__child == nullptr) |
1573 |
throw out_of_range("map::at: key not found"); |
1574 |
#endif // _LIBCPP_NO_EXCEPTIONS |
1575 |
return static_cast<__node_pointer>(__child)->__value_.__cc.second; |
1576 |
} |
1577 |
|
1578 |
template <class _Key, class _Tp, class _Compare, class _Allocator> |
1579 |
const _Tp& |
1580 |
map<_Key, _Tp, _Compare, _Allocator>::at(const key_type& __k) const |
1581 |
{ |
1582 |
__node_base_const_pointer __parent; |
1583 |
__node_base_const_pointer __child = __find_equal_key(__parent, __k); |
1584 |
#ifndef _LIBCPP_NO_EXCEPTIONS |
1585 |
if (__child == nullptr) |
1586 |
throw out_of_range("map::at: key not found"); |
1587 |
#endif // _LIBCPP_NO_EXCEPTIONS |
1588 |
return static_cast<__node_const_pointer>(__child)->__value_.__cc.second; |
1589 |
} |
1590 |
|
1591 |
#if !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS) |
1592 |
|
1593 |
template <class _Key, class _Tp, class _Compare, class _Allocator> |
1594 |
template <class ..._Args> |
1595 |
pair<typename map<_Key, _Tp, _Compare, _Allocator>::iterator, bool> |
1596 |
map<_Key, _Tp, _Compare, _Allocator>::emplace(_Args&& ...__args) |
1597 |
{ |
1598 |
__node_holder __h = __construct_node(_VSTD::forward<_Args>(__args)...); |
1599 |
pair<iterator, bool> __r = __tree_.__node_insert_unique(__h.get()); |
1600 |
if (__r.second) |
1601 |
__h.release(); |
1602 |
return __r; |
1603 |
} |
1604 |
|
1605 |
template <class _Key, class _Tp, class _Compare, class _Allocator> |
1606 |
template <class ..._Args> |
1607 |
typename map<_Key, _Tp, _Compare, _Allocator>::iterator |
1608 |
map<_Key, _Tp, _Compare, _Allocator>::emplace_hint(const_iterator __p, |
1609 |
_Args&& ...__args) |
1610 |
{ |
1611 |
__node_holder __h = __construct_node(_VSTD::forward<_Args>(__args)...); |
1612 |
iterator __r = __tree_.__node_insert_unique(__p.__i_, __h.get()); |
1613 |
if (__r.__i_.__ptr_ == __h.get()) |
1614 |
__h.release(); |
1615 |
return __r; |
1616 |
} |
1617 |
|
1618 |
#endif // !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS) |
1619 |
|
1620 |
template <class _Key, class _Tp, class _Compare, class _Allocator> |
1621 |
inline _LIBCPP_INLINE_VISIBILITY |
1622 |
bool |
1623 |
operator==(const map<_Key, _Tp, _Compare, _Allocator>& __x, |
1624 |
const map<_Key, _Tp, _Compare, _Allocator>& __y) |
1625 |
{ |
1626 |
return __x.size() == __y.size() && _VSTD::equal(__x.begin(), __x.end(), __y.begin()); |
1627 |
} |
1628 |
|
1629 |
template <class _Key, class _Tp, class _Compare, class _Allocator> |
1630 |
inline _LIBCPP_INLINE_VISIBILITY |
1631 |
bool |
1632 |
operator< (const map<_Key, _Tp, _Compare, _Allocator>& __x, |
1633 |
const map<_Key, _Tp, _Compare, _Allocator>& __y) |
1634 |
{ |
1635 |
return _VSTD::lexicographical_compare(__x.begin(), __x.end(), __y.begin(), __y.end()); |
1636 |
} |
1637 |
|
1638 |
template <class _Key, class _Tp, class _Compare, class _Allocator> |
1639 |
inline _LIBCPP_INLINE_VISIBILITY |
1640 |
bool |
1641 |
operator!=(const map<_Key, _Tp, _Compare, _Allocator>& __x, |
1642 |
const map<_Key, _Tp, _Compare, _Allocator>& __y) |
1643 |
{ |
1644 |
return !(__x == __y); |
1645 |
} |
1646 |
|
1647 |
template <class _Key, class _Tp, class _Compare, class _Allocator> |
1648 |
inline _LIBCPP_INLINE_VISIBILITY |
1649 |
bool |
1650 |
operator> (const map<_Key, _Tp, _Compare, _Allocator>& __x, |
1651 |
const map<_Key, _Tp, _Compare, _Allocator>& __y) |
1652 |
{ |
1653 |
return __y < __x; |
1654 |
} |
1655 |
|
1656 |
template <class _Key, class _Tp, class _Compare, class _Allocator> |
1657 |
inline _LIBCPP_INLINE_VISIBILITY |
1658 |
bool |
1659 |
operator>=(const map<_Key, _Tp, _Compare, _Allocator>& __x, |
1660 |
const map<_Key, _Tp, _Compare, _Allocator>& __y) |
1661 |
{ |
1662 |
return !(__x < __y); |
1663 |
} |
1664 |
|
1665 |
template <class _Key, class _Tp, class _Compare, class _Allocator> |
1666 |
inline _LIBCPP_INLINE_VISIBILITY |
1667 |
bool |
1668 |
operator<=(const map<_Key, _Tp, _Compare, _Allocator>& __x, |
1669 |
const map<_Key, _Tp, _Compare, _Allocator>& __y) |
1670 |
{ |
1671 |
return !(__y < __x); |
1672 |
} |
1673 |
|
1674 |
template <class _Key, class _Tp, class _Compare, class _Allocator> |
1675 |
inline _LIBCPP_INLINE_VISIBILITY |
1676 |
void |
1677 |
swap(map<_Key, _Tp, _Compare, _Allocator>& __x, |
1678 |
map<_Key, _Tp, _Compare, _Allocator>& __y) |
1679 |
_NOEXCEPT_(_NOEXCEPT_(__x.swap(__y))) |
1680 |
{ |
1681 |
__x.swap(__y); |
1682 |
} |
1683 |
|
1684 |
template <class _Key, class _Tp, class _Compare = less<_Key>, |
1685 |
class _Allocator = allocator<pair<const _Key, _Tp> > > |
1686 |
class _LIBCPP_TYPE_VIS_ONLY multimap |
1687 |
{ |
1688 |
public: |
1689 |
// types: |
1690 |
typedef _Key key_type; |
1691 |
typedef _Tp mapped_type; |
1692 |
typedef pair<const key_type, mapped_type> value_type; |
1693 |
typedef pair<key_type, mapped_type> __nc_value_type; |
1694 |
typedef _Compare key_compare; |
1695 |
typedef _Allocator allocator_type; |
1696 |
typedef value_type& reference; |
1697 |
typedef const value_type& const_reference; |
1698 |
|
1699 |
class _LIBCPP_TYPE_VIS_ONLY value_compare |
1700 |
: public binary_function<value_type, value_type, bool> |
1701 |
{ |
1702 |
friend class multimap; |
1703 |
protected: |
1704 |
key_compare comp; |
1705 |
|
1706 |
_LIBCPP_INLINE_VISIBILITY |
1707 |
value_compare(key_compare c) : comp(c) {} |
1708 |
public: |
1709 |
_LIBCPP_INLINE_VISIBILITY |
1710 |
bool operator()(const value_type& __x, const value_type& __y) const |
1711 |
{return comp(__x.first, __y.first);} |
1712 |
}; |
1713 |
|
1714 |
private: |
1715 |
|
1716 |
typedef _VSTD::__value_type<key_type, mapped_type> __value_type; |
1717 |
typedef __map_value_compare<key_type, __value_type, key_compare> __vc; |
1718 |
typedef typename __rebind_alloc_helper<allocator_traits<allocator_type>, |
1719 |
__value_type>::type __allocator_type; |
1720 |
typedef __tree<__value_type, __vc, __allocator_type> __base; |
1721 |
typedef typename __base::__node_traits __node_traits; |
1722 |
typedef allocator_traits<allocator_type> __alloc_traits; |
1723 |
|
1724 |
__base __tree_; |
1725 |
|
1726 |
public: |
1727 |
typedef typename __alloc_traits::pointer pointer; |
1728 |
typedef typename __alloc_traits::const_pointer const_pointer; |
1729 |
typedef typename __alloc_traits::size_type size_type; |
1730 |
typedef typename __alloc_traits::difference_type difference_type; |
1731 |
typedef __map_iterator<typename __base::iterator> iterator; |
1732 |
typedef __map_const_iterator<typename __base::const_iterator> const_iterator; |
1733 |
typedef _VSTD::reverse_iterator<iterator> reverse_iterator; |
1734 |
typedef _VSTD::reverse_iterator<const_iterator> const_reverse_iterator; |
1735 |
|
1736 |
_LIBCPP_INLINE_VISIBILITY |
1737 |
multimap() |
1738 |
_NOEXCEPT_( |
1739 |
is_nothrow_default_constructible<allocator_type>::value && |
1740 |
is_nothrow_default_constructible<key_compare>::value && |
1741 |
is_nothrow_copy_constructible<key_compare>::value) |
1742 |
: __tree_(__vc(key_compare())) {} |
1743 |
|
1744 |
_LIBCPP_INLINE_VISIBILITY |
1745 |
explicit multimap(const key_compare& __comp) |
1746 |
_NOEXCEPT_( |
1747 |
is_nothrow_default_constructible<allocator_type>::value && |
1748 |
is_nothrow_copy_constructible<key_compare>::value) |
1749 |
: __tree_(__vc(__comp)) {} |
1750 |
|
1751 |
_LIBCPP_INLINE_VISIBILITY |
1752 |
explicit multimap(const key_compare& __comp, const allocator_type& __a) |
1753 |
: __tree_(__vc(__comp), __a) {} |
1754 |
|
1755 |
template <class _InputIterator> |
1756 |
_LIBCPP_INLINE_VISIBILITY |
1757 |
multimap(_InputIterator __f, _InputIterator __l, |
1758 |
const key_compare& __comp = key_compare()) |
1759 |
: __tree_(__vc(__comp)) |
1760 |
{ |
1761 |
insert(__f, __l); |
1762 |
} |
1763 |
|
1764 |
template <class _InputIterator> |
1765 |
_LIBCPP_INLINE_VISIBILITY |
1766 |
multimap(_InputIterator __f, _InputIterator __l, |
1767 |
const key_compare& __comp, const allocator_type& __a) |
1768 |
: __tree_(__vc(__comp), __a) |
1769 |
{ |
1770 |
insert(__f, __l); |
1771 |
} |
1772 |
|
1773 |
#if _LIBCPP_STD_VER > 11 |
1774 |
template <class _InputIterator> |
1775 |
_LIBCPP_INLINE_VISIBILITY |
1776 |
multimap(_InputIterator __f, _InputIterator __l, const allocator_type& __a) |
1777 |
: multimap(__f, __l, key_compare(), __a) {} |
1778 |
#endif |
1779 |
|
1780 |
_LIBCPP_INLINE_VISIBILITY |
1781 |
multimap(const multimap& __m) |
1782 |
: __tree_(__m.__tree_.value_comp(), |
1783 |
__alloc_traits::select_on_container_copy_construction(__m.__tree_.__alloc())) |
1784 |
{ |
1785 |
insert(__m.begin(), __m.end()); |
1786 |
} |
1787 |
|
1788 |
_LIBCPP_INLINE_VISIBILITY |
1789 |
multimap& operator=(const multimap& __m) |
1790 |
{ |
1791 |
#if __cplusplus >= 201103L |
1792 |
__tree_ = __m.__tree_; |
1793 |
#else |
1794 |
if (this != &__m) { |
1795 |
__tree_.clear(); |
1796 |
__tree_.value_comp() = __m.__tree_.value_comp(); |
1797 |
__tree_.__copy_assign_alloc(__m.__tree_); |
1798 |
insert(__m.begin(), __m.end()); |
1799 |
} |
1800 |
#endif |
1801 |
return *this; |
1802 |
} |
1803 |
|
1804 |
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES |
1805 |
|
1806 |
_LIBCPP_INLINE_VISIBILITY |
1807 |
multimap(multimap&& __m) |
1808 |
_NOEXCEPT_(is_nothrow_move_constructible<__base>::value) |
1809 |
: __tree_(_VSTD::move(__m.__tree_)) |
1810 |
{ |
1811 |
} |
1812 |
|
1813 |
multimap(multimap&& __m, const allocator_type& __a); |
1814 |
|
1815 |
_LIBCPP_INLINE_VISIBILITY |
1816 |
multimap& operator=(multimap&& __m) |
1817 |
_NOEXCEPT_(is_nothrow_move_assignable<__base>::value) |
1818 |
{ |
1819 |
__tree_ = _VSTD::move(__m.__tree_); |
1820 |
return *this; |
1821 |
} |
1822 |
|
1823 |
#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES |
1824 |
|
1825 |
#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS |
1826 |
|
1827 |
_LIBCPP_INLINE_VISIBILITY |
1828 |
multimap(initializer_list<value_type> __il, const key_compare& __comp = key_compare()) |
1829 |
: __tree_(__vc(__comp)) |
1830 |
{ |
1831 |
insert(__il.begin(), __il.end()); |
1832 |
} |
1833 |
|
1834 |
_LIBCPP_INLINE_VISIBILITY |
1835 |
multimap(initializer_list<value_type> __il, const key_compare& __comp, const allocator_type& __a) |
1836 |
: __tree_(__vc(__comp), __a) |
1837 |
{ |
1838 |
insert(__il.begin(), __il.end()); |
1839 |
} |
1840 |
|
1841 |
#if _LIBCPP_STD_VER > 11 |
1842 |
_LIBCPP_INLINE_VISIBILITY |
1843 |
multimap(initializer_list<value_type> __il, const allocator_type& __a) |
1844 |
: multimap(__il, key_compare(), __a) {} |
1845 |
#endif |
1846 |
|
1847 |
_LIBCPP_INLINE_VISIBILITY |
1848 |
multimap& operator=(initializer_list<value_type> __il) |
1849 |
{ |
1850 |
__tree_.__assign_multi(__il.begin(), __il.end()); |
1851 |
return *this; |
1852 |
} |
1853 |
|
1854 |
#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS |
1855 |
|
1856 |
_LIBCPP_INLINE_VISIBILITY |
1857 |
explicit multimap(const allocator_type& __a) |
1858 |
: __tree_(__a) |
1859 |
{ |
1860 |
} |
1861 |
|
1862 |
_LIBCPP_INLINE_VISIBILITY |
1863 |
multimap(const multimap& __m, const allocator_type& __a) |
1864 |
: __tree_(__m.__tree_.value_comp(), __a) |
1865 |
{ |
1866 |
insert(__m.begin(), __m.end()); |
1867 |
} |
1868 |
|
1869 |
_LIBCPP_INLINE_VISIBILITY |
1870 |
iterator begin() _NOEXCEPT {return __tree_.begin();} |
1871 |
_LIBCPP_INLINE_VISIBILITY |
1872 |
const_iterator begin() const _NOEXCEPT {return __tree_.begin();} |
1873 |
_LIBCPP_INLINE_VISIBILITY |
1874 |
iterator end() _NOEXCEPT {return __tree_.end();} |
1875 |
_LIBCPP_INLINE_VISIBILITY |
1876 |
const_iterator end() const _NOEXCEPT {return __tree_.end();} |
1877 |
|
1878 |
_LIBCPP_INLINE_VISIBILITY |
1879 |
reverse_iterator rbegin() _NOEXCEPT {return reverse_iterator(end());} |
1880 |
_LIBCPP_INLINE_VISIBILITY |
1881 |
const_reverse_iterator rbegin() const _NOEXCEPT |
1882 |
{return const_reverse_iterator(end());} |
1883 |
_LIBCPP_INLINE_VISIBILITY |
1884 |
reverse_iterator rend() _NOEXCEPT {return reverse_iterator(begin());} |
1885 |
_LIBCPP_INLINE_VISIBILITY |
1886 |
const_reverse_iterator rend() const _NOEXCEPT |
1887 |
{return const_reverse_iterator(begin());} |
1888 |
|
1889 |
_LIBCPP_INLINE_VISIBILITY |
1890 |
const_iterator cbegin() const _NOEXCEPT {return begin();} |
1891 |
_LIBCPP_INLINE_VISIBILITY |
1892 |
const_iterator cend() const _NOEXCEPT {return end();} |
1893 |
_LIBCPP_INLINE_VISIBILITY |
1894 |
const_reverse_iterator crbegin() const _NOEXCEPT {return rbegin();} |
1895 |
_LIBCPP_INLINE_VISIBILITY |
1896 |
const_reverse_iterator crend() const _NOEXCEPT {return rend();} |
1897 |
|
1898 |
_LIBCPP_INLINE_VISIBILITY |
1899 |
bool empty() const _NOEXCEPT {return __tree_.size() == 0;} |
1900 |
_LIBCPP_INLINE_VISIBILITY |
1901 |
size_type size() const _NOEXCEPT {return __tree_.size();} |
1902 |
_LIBCPP_INLINE_VISIBILITY |
1903 |
size_type max_size() const _NOEXCEPT {return __tree_.max_size();} |
1904 |
|
1905 |
_LIBCPP_INLINE_VISIBILITY |
1906 |
allocator_type get_allocator() const _NOEXCEPT {return __tree_.__alloc();} |
1907 |
_LIBCPP_INLINE_VISIBILITY |
1908 |
key_compare key_comp() const {return __tree_.value_comp().key_comp();} |
1909 |
_LIBCPP_INLINE_VISIBILITY |
1910 |
value_compare value_comp() const |
1911 |
{return value_compare(__tree_.value_comp().key_comp());} |
1912 |
|
1913 |
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES |
1914 |
#ifndef _LIBCPP_HAS_NO_VARIADICS |
1915 |
|
1916 |
template <class ..._Args> |
1917 |
iterator |
1918 |
emplace(_Args&& ...__args); |
1919 |
|
1920 |
template <class ..._Args> |
1921 |
iterator |
1922 |
emplace_hint(const_iterator __p, _Args&& ...__args); |
1923 |
|
1924 |
#endif // _LIBCPP_HAS_NO_VARIADICS |
1925 |
|
1926 |
template <class _Pp, |
1927 |
class = typename enable_if<is_constructible<value_type, _Pp>::value>::type> |
1928 |
_LIBCPP_INLINE_VISIBILITY |
1929 |
iterator insert(_Pp&& __p) |
1930 |
{return __tree_.__insert_multi(_VSTD::forward<_Pp>(__p));} |
1931 |
|
1932 |
template <class _Pp, |
1933 |
class = typename enable_if<is_constructible<value_type, _Pp>::value>::type> |
1934 |
_LIBCPP_INLINE_VISIBILITY |
1935 |
iterator insert(const_iterator __pos, _Pp&& __p) |
1936 |
{return __tree_.__insert_multi(__pos.__i_, _VSTD::forward<_Pp>(__p));} |
1937 |
|
1938 |
#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES |
1939 |
|
1940 |
_LIBCPP_INLINE_VISIBILITY |
1941 |
iterator insert(const value_type& __v) {return __tree_.__insert_multi(__v);} |
1942 |
|
1943 |
_LIBCPP_INLINE_VISIBILITY |
1944 |
iterator insert(const_iterator __p, const value_type& __v) |
1945 |
{return __tree_.__insert_multi(__p.__i_, __v);} |
1946 |
|
1947 |
template <class _InputIterator> |
1948 |
_LIBCPP_INLINE_VISIBILITY |
1949 |
void insert(_InputIterator __f, _InputIterator __l) |
1950 |
{ |
1951 |
for (const_iterator __e = cend(); __f != __l; ++__f) |
1952 |
__tree_.__insert_multi(__e.__i_, *__f); |
1953 |
} |
1954 |
|
1955 |
#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS |
1956 |
|
1957 |
_LIBCPP_INLINE_VISIBILITY |
1958 |
void insert(initializer_list<value_type> __il) |
1959 |
{insert(__il.begin(), __il.end());} |
1960 |
|
1961 |
#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS |
1962 |
|
1963 |
_LIBCPP_INLINE_VISIBILITY |
1964 |
iterator erase(const_iterator __p) {return __tree_.erase(__p.__i_);} |
1965 |
_LIBCPP_INLINE_VISIBILITY |
1966 |
iterator erase(iterator __p) {return __tree_.erase(__p.__i_);} |
1967 |
_LIBCPP_INLINE_VISIBILITY |
1968 |
size_type erase(const key_type& __k) {return __tree_.__erase_multi(__k);} |
1969 |
_LIBCPP_INLINE_VISIBILITY |
1970 |
iterator erase(const_iterator __f, const_iterator __l) |
1971 |
{return __tree_.erase(__f.__i_, __l.__i_);} |
1972 |
_LIBCPP_INLINE_VISIBILITY |
1973 |
void clear() {__tree_.clear();} |
1974 |
|
1975 |
_LIBCPP_INLINE_VISIBILITY |
1976 |
void swap(multimap& __m) |
1977 |
_NOEXCEPT_(__is_nothrow_swappable<__base>::value) |
1978 |
{__tree_.swap(__m.__tree_);} |
1979 |
|
1980 |
_LIBCPP_INLINE_VISIBILITY |
1981 |
iterator find(const key_type& __k) {return __tree_.find(__k);} |
1982 |
_LIBCPP_INLINE_VISIBILITY |
1983 |
const_iterator find(const key_type& __k) const {return __tree_.find(__k);} |
1984 |
#if _LIBCPP_STD_VER > 11 |
1985 |
template <typename _K2> |
1986 |
_LIBCPP_INLINE_VISIBILITY |
1987 |
typename enable_if<__is_transparent<_Compare, _K2>::value,iterator>::type |
1988 |
find(const _K2& __k) {return __tree_.find(__k);} |
1989 |
template <typename _K2> |
1990 |
_LIBCPP_INLINE_VISIBILITY |
1991 |
typename enable_if<__is_transparent<_Compare, _K2>::value,const_iterator>::type |
1992 |
find(const _K2& __k) const {return __tree_.find(__k);} |
1993 |
#endif |
1994 |
|
1995 |
_LIBCPP_INLINE_VISIBILITY |
1996 |
size_type count(const key_type& __k) const |
1997 |
{return __tree_.__count_multi(__k);} |
1998 |
#if _LIBCPP_STD_VER > 11 |
1999 |
template <typename _K2> |
2000 |
_LIBCPP_INLINE_VISIBILITY |
2001 |
typename enable_if<__is_transparent<_Compare, _K2>::value,size_type>::type |
2002 |
count(const _K2& __k) const {return __tree_.__count_multi(__k);} |
2003 |
#endif |
2004 |
_LIBCPP_INLINE_VISIBILITY |
2005 |
iterator lower_bound(const key_type& __k) |
2006 |
{return __tree_.lower_bound(__k);} |
2007 |
_LIBCPP_INLINE_VISIBILITY |
2008 |
const_iterator lower_bound(const key_type& __k) const |
2009 |
{return __tree_.lower_bound(__k);} |
2010 |
#if _LIBCPP_STD_VER > 11 |
2011 |
template <typename _K2> |
2012 |
_LIBCPP_INLINE_VISIBILITY |
2013 |
typename enable_if<__is_transparent<_Compare, _K2>::value,iterator>::type |
2014 |
lower_bound(const _K2& __k) {return __tree_.lower_bound(__k);} |
2015 |
|
2016 |
template <typename _K2> |
2017 |
_LIBCPP_INLINE_VISIBILITY |
2018 |
typename enable_if<__is_transparent<_Compare, _K2>::value,const_iterator>::type |
2019 |
lower_bound(const _K2& __k) const {return __tree_.lower_bound(__k);} |
2020 |
#endif |
2021 |
|
2022 |
_LIBCPP_INLINE_VISIBILITY |
2023 |
iterator upper_bound(const key_type& __k) |
2024 |
{return __tree_.upper_bound(__k);} |
2025 |
_LIBCPP_INLINE_VISIBILITY |
2026 |
const_iterator upper_bound(const key_type& __k) const |
2027 |
{return __tree_.upper_bound(__k);} |
2028 |
#if _LIBCPP_STD_VER > 11 |
2029 |
template <typename _K2> |
2030 |
_LIBCPP_INLINE_VISIBILITY |
2031 |
typename enable_if<__is_transparent<_Compare, _K2>::value,iterator>::type |
2032 |
upper_bound(const _K2& __k) {return __tree_.upper_bound(__k);} |
2033 |
template <typename _K2> |
2034 |
_LIBCPP_INLINE_VISIBILITY |
2035 |
typename enable_if<__is_transparent<_Compare, _K2>::value,const_iterator>::type |
2036 |
upper_bound(const _K2& __k) const {return __tree_.upper_bound(__k);} |
2037 |
#endif |
2038 |
|
2039 |
_LIBCPP_INLINE_VISIBILITY |
2040 |
pair<iterator,iterator> equal_range(const key_type& __k) |
2041 |
{return __tree_.__equal_range_multi(__k);} |
2042 |
_LIBCPP_INLINE_VISIBILITY |
2043 |
pair<const_iterator,const_iterator> equal_range(const key_type& __k) const |
2044 |
{return __tree_.__equal_range_multi(__k);} |
2045 |
#if _LIBCPP_STD_VER > 11 |
2046 |
template <typename _K2> |
2047 |
_LIBCPP_INLINE_VISIBILITY |
2048 |
typename enable_if<__is_transparent<_Compare, _K2>::value,pair<iterator,iterator>>::type |
2049 |
equal_range(const _K2& __k) {return __tree_.__equal_range_multi(__k);} |
2050 |
template <typename _K2> |
2051 |
_LIBCPP_INLINE_VISIBILITY |
2052 |
typename enable_if<__is_transparent<_Compare, _K2>::value,pair<const_iterator,const_iterator>>::type |
2053 |
equal_range(const _K2& __k) const {return __tree_.__equal_range_multi(__k);} |
2054 |
#endif |
2055 |
|
2056 |
private: |
2057 |
typedef typename __base::__node __node; |
2058 |
typedef typename __base::__node_allocator __node_allocator; |
2059 |
typedef typename __base::__node_pointer __node_pointer; |
2060 |
typedef typename __base::__node_const_pointer __node_const_pointer; |
2061 |
typedef __map_node_destructor<__node_allocator> _Dp; |
2062 |
typedef unique_ptr<__node, _Dp> __node_holder; |
2063 |
|
2064 |
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES |
2065 |
__node_holder __construct_node(); |
2066 |
template <class _A0> |
2067 |
__node_holder |
2068 |
__construct_node(_A0&& __a0); |
2069 |
#ifndef _LIBCPP_HAS_NO_VARIADICS |
2070 |
template <class _A0, class _A1, class ..._Args> |
2071 |
__node_holder __construct_node(_A0&& __a0, _A1&& __a1, _Args&& ...__args); |
2072 |
#endif // _LIBCPP_HAS_NO_VARIADICS |
2073 |
#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES |
2074 |
}; |
2075 |
|
2076 |
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES |
2077 |
|
2078 |
template <class _Key, class _Tp, class _Compare, class _Allocator> |
2079 |
multimap<_Key, _Tp, _Compare, _Allocator>::multimap(multimap&& __m, const allocator_type& __a) |
2080 |
: __tree_(_VSTD::move(__m.__tree_), __a) |
2081 |
{ |
2082 |
if (__a != __m.get_allocator()) |
2083 |
{ |
2084 |
const_iterator __e = cend(); |
2085 |
while (!__m.empty()) |
2086 |
__tree_.__insert_multi(__e.__i_, |
2087 |
_VSTD::move(__m.__tree_.remove(__m.begin().__i_)->__value_)); |
2088 |
} |
2089 |
} |
2090 |
|
2091 |
template <class _Key, class _Tp, class _Compare, class _Allocator> |
2092 |
typename multimap<_Key, _Tp, _Compare, _Allocator>::__node_holder |
2093 |
multimap<_Key, _Tp, _Compare, _Allocator>::__construct_node() |
2094 |
{ |
2095 |
__node_allocator& __na = __tree_.__node_alloc(); |
2096 |
__node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na)); |
2097 |
__node_traits::construct(__na, _VSTD::addressof(__h->__value_.__cc.first)); |
2098 |
__h.get_deleter().__first_constructed = true; |
2099 |
__node_traits::construct(__na, _VSTD::addressof(__h->__value_.__cc.second)); |
2100 |
__h.get_deleter().__second_constructed = true; |
2101 |
return __h; |
2102 |
} |
2103 |
|
2104 |
template <class _Key, class _Tp, class _Compare, class _Allocator> |
2105 |
template <class _A0> |
2106 |
typename multimap<_Key, _Tp, _Compare, _Allocator>::__node_holder |
2107 |
multimap<_Key, _Tp, _Compare, _Allocator>::__construct_node(_A0&& __a0) |
2108 |
{ |
2109 |
__node_allocator& __na = __tree_.__node_alloc(); |
2110 |
__node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na)); |
2111 |
__node_traits::construct(__na, _VSTD::addressof(__h->__value_), _VSTD::forward<_A0>(__a0)); |
2112 |
__h.get_deleter().__first_constructed = true; |
2113 |
__h.get_deleter().__second_constructed = true; |
2114 |
return __h; |
2115 |
} |
2116 |
|
2117 |
#ifndef _LIBCPP_HAS_NO_VARIADICS |
2118 |
|
2119 |
template <class _Key, class _Tp, class _Compare, class _Allocator> |
2120 |
template <class _A0, class _A1, class ..._Args> |
2121 |
typename multimap<_Key, _Tp, _Compare, _Allocator>::__node_holder |
2122 |
multimap<_Key, _Tp, _Compare, _Allocator>::__construct_node(_A0&& __a0, _A1&& __a1, _Args&& ...__args) |
2123 |
{ |
2124 |
__node_allocator& __na = __tree_.__node_alloc(); |
2125 |
__node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na)); |
2126 |
__node_traits::construct(__na, _VSTD::addressof(__h->__value_), |
2127 |
_VSTD::forward<_A0>(__a0), _VSTD::forward<_A1>(__a1), |
2128 |
_VSTD::forward<_Args>(__args)...); |
2129 |
__h.get_deleter().__first_constructed = true; |
2130 |
__h.get_deleter().__second_constructed = true; |
2131 |
return __h; |
2132 |
} |
2133 |
|
2134 |
#endif // _LIBCPP_HAS_NO_VARIADICS |
2135 |
#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES |
2136 |
|
2137 |
#if !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS) |
2138 |
|
2139 |
template <class _Key, class _Tp, class _Compare, class _Allocator> |
2140 |
template <class ..._Args> |
2141 |
typename multimap<_Key, _Tp, _Compare, _Allocator>::iterator |
2142 |
multimap<_Key, _Tp, _Compare, _Allocator>::emplace(_Args&& ...__args) |
2143 |
{ |
2144 |
__node_holder __h = __construct_node(_VSTD::forward<_Args>(__args)...); |
2145 |
iterator __r = __tree_.__node_insert_multi(__h.get()); |
2146 |
__h.release(); |
2147 |
return __r; |
2148 |
} |
2149 |
|
2150 |
template <class _Key, class _Tp, class _Compare, class _Allocator> |
2151 |
template <class ..._Args> |
2152 |
typename multimap<_Key, _Tp, _Compare, _Allocator>::iterator |
2153 |
multimap<_Key, _Tp, _Compare, _Allocator>::emplace_hint(const_iterator __p, |
2154 |
_Args&& ...__args) |
2155 |
{ |
2156 |
__node_holder __h = __construct_node(_VSTD::forward<_Args>(__args)...); |
2157 |
iterator __r = __tree_.__node_insert_multi(__p.__i_, __h.get()); |
2158 |
__h.release(); |
2159 |
return __r; |
2160 |
} |
2161 |
|
2162 |
#endif // !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS) |
2163 |
|
2164 |
template <class _Key, class _Tp, class _Compare, class _Allocator> |
2165 |
inline _LIBCPP_INLINE_VISIBILITY |
2166 |
bool |
2167 |
operator==(const multimap<_Key, _Tp, _Compare, _Allocator>& __x, |
2168 |
const multimap<_Key, _Tp, _Compare, _Allocator>& __y) |
2169 |
{ |
2170 |
return __x.size() == __y.size() && _VSTD::equal(__x.begin(), __x.end(), __y.begin()); |
2171 |
} |
2172 |
|
2173 |
template <class _Key, class _Tp, class _Compare, class _Allocator> |
2174 |
inline _LIBCPP_INLINE_VISIBILITY |
2175 |
bool |
2176 |
operator< (const multimap<_Key, _Tp, _Compare, _Allocator>& __x, |
2177 |
const multimap<_Key, _Tp, _Compare, _Allocator>& __y) |
2178 |
{ |
2179 |
return _VSTD::lexicographical_compare(__x.begin(), __x.end(), __y.begin(), __y.end()); |
2180 |
} |
2181 |
|
2182 |
template <class _Key, class _Tp, class _Compare, class _Allocator> |
2183 |
inline _LIBCPP_INLINE_VISIBILITY |
2184 |
bool |
2185 |
operator!=(const multimap<_Key, _Tp, _Compare, _Allocator>& __x, |
2186 |
const multimap<_Key, _Tp, _Compare, _Allocator>& __y) |
2187 |
{ |
2188 |
return !(__x == __y); |
2189 |
} |
2190 |
|
2191 |
template <class _Key, class _Tp, class _Compare, class _Allocator> |
2192 |
inline _LIBCPP_INLINE_VISIBILITY |
2193 |
bool |
2194 |
operator> (const multimap<_Key, _Tp, _Compare, _Allocator>& __x, |
2195 |
const multimap<_Key, _Tp, _Compare, _Allocator>& __y) |
2196 |
{ |
2197 |
return __y < __x; |
2198 |
} |
2199 |
|
2200 |
template <class _Key, class _Tp, class _Compare, class _Allocator> |
2201 |
inline _LIBCPP_INLINE_VISIBILITY |
2202 |
bool |
2203 |
operator>=(const multimap<_Key, _Tp, _Compare, _Allocator>& __x, |
2204 |
const multimap<_Key, _Tp, _Compare, _Allocator>& __y) |
2205 |
{ |
2206 |
return !(__x < __y); |
2207 |
} |
2208 |
|
2209 |
template <class _Key, class _Tp, class _Compare, class _Allocator> |
2210 |
inline _LIBCPP_INLINE_VISIBILITY |
2211 |
bool |
2212 |
operator<=(const multimap<_Key, _Tp, _Compare, _Allocator>& __x, |
2213 |
const multimap<_Key, _Tp, _Compare, _Allocator>& __y) |
2214 |
{ |
2215 |
return !(__y < __x); |
2216 |
} |
2217 |
|
2218 |
template <class _Key, class _Tp, class _Compare, class _Allocator> |
2219 |
inline _LIBCPP_INLINE_VISIBILITY |
2220 |
void |
2221 |
swap(multimap<_Key, _Tp, _Compare, _Allocator>& __x, |
2222 |
multimap<_Key, _Tp, _Compare, _Allocator>& __y) |
2223 |
_NOEXCEPT_(_NOEXCEPT_(__x.swap(__y))) |
2224 |
{ |
2225 |
__x.swap(__y); |
2226 |
} |
2227 |
|
2228 |
_LIBCPP_END_NAMESPACE_STD |
2229 |
|
2230 |
#endif // _LIBCPP_MAP |