blob: cfd828058709754a1da09b7778d49c4067988c49 [file] [log] [blame]
Howard Hinnantc51e1022010-05-11 19:42:16 +00001// -*- C++ -*-
2//===----------------------------- map ------------------------------------===//
3//
Howard Hinnantc566dc32010-05-11 21:36:01 +00004// The LLVM Compiler Infrastructure
Howard Hinnantc51e1022010-05-11 19:42:16 +00005//
Howard Hinnantee11c312010-11-16 22:09:02 +00006// This file is dual licensed under the MIT and the University of Illinois Open
7// Source Licenses. See LICENSE.TXT for details.
Howard Hinnantc51e1022010-05-11 19:42:16 +00008//
9//===----------------------------------------------------------------------===//
10
11#ifndef _LIBCPP_MAP
12#define _LIBCPP_MAP
13
14/*
15
16 map synopsis
17
18namespace std
19{
20
21template <class Key, class T, class Compare = less<Key>,
22 class Allocator = allocator<pair<const Key, T>>>
23class map
24{
25public:
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;
Erik Pilkingtonc37a3d82018-08-01 01:33:38 +000043 typedef unspecified node_type; // C++17
44 typedef INSERT_RETURN_TYPE<iterator, node_type> insert_return_type; // C++17
Howard Hinnantc51e1022010-05-11 19:42:16 +000045
46 class value_compare
47 : public binary_function<value_type, value_type, bool>
48 {
49 friend class map;
50 protected:
51 key_compare comp;
52
53 value_compare(key_compare c);
54 public:
55 bool operator()(const value_type& x, const value_type& y) const;
56 };
57
58 // construct/copy/destroy:
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +000059 map()
60 noexcept(
61 is_nothrow_default_constructible<allocator_type>::value &&
62 is_nothrow_default_constructible<key_compare>::value &&
63 is_nothrow_copy_constructible<key_compare>::value);
Howard Hinnantc51e1022010-05-11 19:42:16 +000064 explicit map(const key_compare& comp);
65 map(const key_compare& comp, const allocator_type& a);
66 template <class InputIterator>
67 map(InputIterator first, InputIterator last,
68 const key_compare& comp = key_compare());
69 template <class InputIterator>
70 map(InputIterator first, InputIterator last,
71 const key_compare& comp, const allocator_type& a);
72 map(const map& m);
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +000073 map(map&& m)
74 noexcept(
75 is_nothrow_move_constructible<allocator_type>::value &&
76 is_nothrow_move_constructible<key_compare>::value);
Howard Hinnantc51e1022010-05-11 19:42:16 +000077 explicit map(const allocator_type& a);
78 map(const map& m, const allocator_type& a);
79 map(map&& m, const allocator_type& a);
80 map(initializer_list<value_type> il, const key_compare& comp = key_compare());
81 map(initializer_list<value_type> il, const key_compare& comp, const allocator_type& a);
Marshall Clow300abfb2013-09-11 01:15:47 +000082 template <class InputIterator>
83 map(InputIterator first, InputIterator last, const allocator_type& a)
84 : map(first, last, Compare(), a) {} // C++14
85 map(initializer_list<value_type> il, const allocator_type& a)
86 : map(il, Compare(), a) {} // C++14
87 ~map();
Howard Hinnantc51e1022010-05-11 19:42:16 +000088
89 map& operator=(const map& m);
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +000090 map& operator=(map&& m)
91 noexcept(
92 allocator_type::propagate_on_container_move_assignment::value &&
93 is_nothrow_move_assignable<allocator_type>::value &&
Howard Hinnantf95f4f52011-06-04 15:22:34 +000094 is_nothrow_move_assignable<key_compare>::value);
Howard Hinnantc51e1022010-05-11 19:42:16 +000095 map& operator=(initializer_list<value_type> il);
96
97 // iterators:
Howard Hinnantf95f4f52011-06-04 15:22:34 +000098 iterator begin() noexcept;
99 const_iterator begin() const noexcept;
100 iterator end() noexcept;
101 const_iterator end() const noexcept;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000102
Howard Hinnantf95f4f52011-06-04 15:22:34 +0000103 reverse_iterator rbegin() noexcept;
104 const_reverse_iterator rbegin() const noexcept;
105 reverse_iterator rend() noexcept;
106 const_reverse_iterator rend() const noexcept;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000107
Howard Hinnantf95f4f52011-06-04 15:22:34 +0000108 const_iterator cbegin() const noexcept;
109 const_iterator cend() const noexcept;
110 const_reverse_iterator crbegin() const noexcept;
111 const_reverse_iterator crend() const noexcept;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000112
113 // capacity:
Howard Hinnantf95f4f52011-06-04 15:22:34 +0000114 bool empty() const noexcept;
115 size_type size() const noexcept;
116 size_type max_size() const noexcept;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000117
118 // element access:
119 mapped_type& operator[](const key_type& k);
120 mapped_type& operator[](key_type&& k);
121
122 mapped_type& at(const key_type& k);
123 const mapped_type& at(const key_type& k) const;
124
125 // modifiers:
126 template <class... Args>
127 pair<iterator, bool> emplace(Args&&... args);
128 template <class... Args>
129 iterator emplace_hint(const_iterator position, Args&&... args);
130 pair<iterator, bool> insert(const value_type& v);
Marshall Clowd430d022016-01-05 19:32:41 +0000131 pair<iterator, bool> insert( value_type&& v); // C++17
Howard Hinnantc51e1022010-05-11 19:42:16 +0000132 template <class P>
133 pair<iterator, bool> insert(P&& p);
134 iterator insert(const_iterator position, const value_type& v);
Marshall Clowd430d022016-01-05 19:32:41 +0000135 iterator insert(const_iterator position, value_type&& v); // C++17
Howard Hinnantc51e1022010-05-11 19:42:16 +0000136 template <class P>
137 iterator insert(const_iterator position, P&& p);
138 template <class InputIterator>
139 void insert(InputIterator first, InputIterator last);
140 void insert(initializer_list<value_type> il);
141
Erik Pilkingtonc37a3d82018-08-01 01:33:38 +0000142 node_type extract(const_iterator position); // C++17
143 node_type extract(const key_type& x); // C++17
144 insert_return_type insert(node_type&& nh); // C++17
145 iterator insert(const_iterator hint, node_type&& nh); // C++17
146
Marshall Clow3223db82015-07-07 03:37:33 +0000147 template <class... Args>
148 pair<iterator, bool> try_emplace(const key_type& k, Args&&... args); // C++17
149 template <class... Args>
150 pair<iterator, bool> try_emplace(key_type&& k, Args&&... args); // C++17
151 template <class... Args>
152 iterator try_emplace(const_iterator hint, const key_type& k, Args&&... args); // C++17
153 template <class... Args>
154 iterator try_emplace(const_iterator hint, key_type&& k, Args&&... args); // C++17
155 template <class M>
156 pair<iterator, bool> insert_or_assign(const key_type& k, M&& obj); // C++17
157 template <class M>
158 pair<iterator, bool> insert_or_assign(key_type&& k, M&& obj); // C++17
159 template <class M>
160 iterator insert_or_assign(const_iterator hint, const key_type& k, M&& obj); // C++17
161 template <class M>
162 iterator insert_or_assign(const_iterator hint, key_type&& k, M&& obj); // C++17
163
Howard Hinnantc51e1022010-05-11 19:42:16 +0000164 iterator erase(const_iterator position);
Marshall Clow22ea5b82015-05-10 13:35:00 +0000165 iterator erase(iterator position); // C++14
Howard Hinnantc51e1022010-05-11 19:42:16 +0000166 size_type erase(const key_type& k);
167 iterator erase(const_iterator first, const_iterator last);
Howard Hinnantf95f4f52011-06-04 15:22:34 +0000168 void clear() noexcept;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000169
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +0000170 void swap(map& m)
Marshall Clow8982dcd2015-07-13 20:04:56 +0000171 noexcept(allocator_traits<allocator_type>::is_always_equal::value &&
Eric Fiselier6bfed252016-04-21 23:38:59 +0000172 is_nothrow_swappable<key_compare>::value); // C++17
Howard Hinnantc51e1022010-05-11 19:42:16 +0000173
174 // observers:
Howard Hinnantf95f4f52011-06-04 15:22:34 +0000175 allocator_type get_allocator() const noexcept;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000176 key_compare key_comp() const;
177 value_compare value_comp() const;
178
179 // map operations:
180 iterator find(const key_type& k);
181 const_iterator find(const key_type& k) const;
Marshall Clowebb57322013-08-13 22:18:47 +0000182 template<typename K>
183 iterator find(const K& x); // C++14
184 template<typename K>
185 const_iterator find(const K& x) const; // C++14
186 template<typename K>
Marshall Clowe6a5f522014-08-24 23:54:16 +0000187 size_type count(const K& x) const; // C++14
Marshall Clowebb57322013-08-13 22:18:47 +0000188
Howard Hinnantc51e1022010-05-11 19:42:16 +0000189 size_type count(const key_type& k) const;
190 iterator lower_bound(const key_type& k);
191 const_iterator lower_bound(const key_type& k) const;
Marshall Clowebb57322013-08-13 22:18:47 +0000192 template<typename K>
193 iterator lower_bound(const K& x); // C++14
194 template<typename K>
195 const_iterator lower_bound(const K& x) const; // C++14
196
Howard Hinnantc51e1022010-05-11 19:42:16 +0000197 iterator upper_bound(const key_type& k);
198 const_iterator upper_bound(const key_type& k) const;
Marshall Clowebb57322013-08-13 22:18:47 +0000199 template<typename K>
200 iterator upper_bound(const K& x); // C++14
201 template<typename K>
202 const_iterator upper_bound(const K& x) const; // C++14
203
Howard Hinnantc51e1022010-05-11 19:42:16 +0000204 pair<iterator,iterator> equal_range(const key_type& k);
205 pair<const_iterator,const_iterator> equal_range(const key_type& k) const;
Marshall Clowebb57322013-08-13 22:18:47 +0000206 template<typename K>
207 pair<iterator,iterator> equal_range(const K& x); // C++14
208 template<typename K>
209 pair<const_iterator,const_iterator> equal_range(const K& x) const; // C++14
Howard Hinnantc51e1022010-05-11 19:42:16 +0000210};
211
212template <class Key, class T, class Compare, class Allocator>
213bool
214operator==(const map<Key, T, Compare, Allocator>& x,
215 const map<Key, T, Compare, Allocator>& y);
216
217template <class Key, class T, class Compare, class Allocator>
218bool
219operator< (const map<Key, T, Compare, Allocator>& x,
220 const map<Key, T, Compare, Allocator>& y);
221
222template <class Key, class T, class Compare, class Allocator>
223bool
224operator!=(const map<Key, T, Compare, Allocator>& x,
225 const map<Key, T, Compare, Allocator>& y);
226
227template <class Key, class T, class Compare, class Allocator>
228bool
229operator> (const map<Key, T, Compare, Allocator>& x,
230 const map<Key, T, Compare, Allocator>& y);
231
232template <class Key, class T, class Compare, class Allocator>
233bool
234operator>=(const map<Key, T, Compare, Allocator>& x,
235 const map<Key, T, Compare, Allocator>& y);
236
237template <class Key, class T, class Compare, class Allocator>
238bool
239operator<=(const map<Key, T, Compare, Allocator>& x,
240 const map<Key, T, Compare, Allocator>& y);
241
242// specialized algorithms:
243template <class Key, class T, class Compare, class Allocator>
244void
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +0000245swap(map<Key, T, Compare, Allocator>& x, map<Key, T, Compare, Allocator>& y)
246 noexcept(noexcept(x.swap(y)));
Howard Hinnantc51e1022010-05-11 19:42:16 +0000247
248template <class Key, class T, class Compare = less<Key>,
249 class Allocator = allocator<pair<const Key, T>>>
250class multimap
251{
252public:
253 // types:
254 typedef Key key_type;
255 typedef T mapped_type;
256 typedef pair<const key_type,mapped_type> value_type;
257 typedef Compare key_compare;
258 typedef Allocator allocator_type;
259 typedef typename allocator_type::reference reference;
260 typedef typename allocator_type::const_reference const_reference;
261 typedef typename allocator_type::size_type size_type;
262 typedef typename allocator_type::difference_type difference_type;
263 typedef typename allocator_type::pointer pointer;
264 typedef typename allocator_type::const_pointer const_pointer;
265
266 typedef implementation-defined iterator;
267 typedef implementation-defined const_iterator;
268 typedef std::reverse_iterator<iterator> reverse_iterator;
269 typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
Erik Pilkingtonc37a3d82018-08-01 01:33:38 +0000270 typedef unspecified node_type; // C++17
Howard Hinnantc51e1022010-05-11 19:42:16 +0000271
272 class value_compare
273 : public binary_function<value_type,value_type,bool>
274 {
275 friend class multimap;
276 protected:
277 key_compare comp;
278 value_compare(key_compare c);
279 public:
280 bool operator()(const value_type& x, const value_type& y) const;
281 };
282
283 // construct/copy/destroy:
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +0000284 multimap()
285 noexcept(
286 is_nothrow_default_constructible<allocator_type>::value &&
287 is_nothrow_default_constructible<key_compare>::value &&
288 is_nothrow_copy_constructible<key_compare>::value);
289 explicit multimap(const key_compare& comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000290 multimap(const key_compare& comp, const allocator_type& a);
291 template <class InputIterator>
292 multimap(InputIterator first, InputIterator last, const key_compare& comp);
293 template <class InputIterator>
294 multimap(InputIterator first, InputIterator last, const key_compare& comp,
295 const allocator_type& a);
296 multimap(const multimap& m);
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +0000297 multimap(multimap&& m)
298 noexcept(
299 is_nothrow_move_constructible<allocator_type>::value &&
300 is_nothrow_move_constructible<key_compare>::value);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000301 explicit multimap(const allocator_type& a);
302 multimap(const multimap& m, const allocator_type& a);
303 multimap(multimap&& m, const allocator_type& a);
304 multimap(initializer_list<value_type> il, const key_compare& comp = key_compare());
305 multimap(initializer_list<value_type> il, const key_compare& comp,
306 const allocator_type& a);
Marshall Clow300abfb2013-09-11 01:15:47 +0000307 template <class InputIterator>
308 multimap(InputIterator first, InputIterator last, const allocator_type& a)
309 : multimap(first, last, Compare(), a) {} // C++14
310 multimap(initializer_list<value_type> il, const allocator_type& a)
311 : multimap(il, Compare(), a) {} // C++14
Howard Hinnantc51e1022010-05-11 19:42:16 +0000312 ~multimap();
313
314 multimap& operator=(const multimap& m);
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +0000315 multimap& operator=(multimap&& m)
316 noexcept(
317 allocator_type::propagate_on_container_move_assignment::value &&
318 is_nothrow_move_assignable<allocator_type>::value &&
Howard Hinnantf95f4f52011-06-04 15:22:34 +0000319 is_nothrow_move_assignable<key_compare>::value);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000320 multimap& operator=(initializer_list<value_type> il);
321
322 // iterators:
Howard Hinnantf95f4f52011-06-04 15:22:34 +0000323 iterator begin() noexcept;
324 const_iterator begin() const noexcept;
325 iterator end() noexcept;
326 const_iterator end() const noexcept;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000327
Howard Hinnantf95f4f52011-06-04 15:22:34 +0000328 reverse_iterator rbegin() noexcept;
329 const_reverse_iterator rbegin() const noexcept;
330 reverse_iterator rend() noexcept;
331 const_reverse_iterator rend() const noexcept;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000332
Howard Hinnantf95f4f52011-06-04 15:22:34 +0000333 const_iterator cbegin() const noexcept;
334 const_iterator cend() const noexcept;
335 const_reverse_iterator crbegin() const noexcept;
336 const_reverse_iterator crend() const noexcept;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000337
338 // capacity:
Howard Hinnantf95f4f52011-06-04 15:22:34 +0000339 bool empty() const noexcept;
340 size_type size() const noexcept;
341 size_type max_size() const noexcept;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000342
343 // modifiers:
344 template <class... Args>
345 iterator emplace(Args&&... args);
346 template <class... Args>
347 iterator emplace_hint(const_iterator position, Args&&... args);
348 iterator insert(const value_type& v);
Marshall Clowd430d022016-01-05 19:32:41 +0000349 iterator insert( value_type&& v); // C++17
Howard Hinnantc51e1022010-05-11 19:42:16 +0000350 template <class P>
351 iterator insert(P&& p);
352 iterator insert(const_iterator position, const value_type& v);
Marshall Clowd430d022016-01-05 19:32:41 +0000353 iterator insert(const_iterator position, value_type&& v); // C++17
Howard Hinnantc51e1022010-05-11 19:42:16 +0000354 template <class P>
355 iterator insert(const_iterator position, P&& p);
356 template <class InputIterator>
357 void insert(InputIterator first, InputIterator last);
358 void insert(initializer_list<value_type> il);
359
Erik Pilkingtonc37a3d82018-08-01 01:33:38 +0000360 node_type extract(const_iterator position); // C++17
361 node_type extract(const key_type& x); // C++17
362 iterator insert(node_type&& nh); // C++17
363 iterator insert(const_iterator hint, node_type&& nh); // C++17
364
Howard Hinnantc51e1022010-05-11 19:42:16 +0000365 iterator erase(const_iterator position);
Marshall Clow22ea5b82015-05-10 13:35:00 +0000366 iterator erase(iterator position); // C++14
Howard Hinnantc51e1022010-05-11 19:42:16 +0000367 size_type erase(const key_type& k);
368 iterator erase(const_iterator first, const_iterator last);
Howard Hinnantf95f4f52011-06-04 15:22:34 +0000369 void clear() noexcept;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000370
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +0000371 void swap(multimap& m)
Marshall Clow8982dcd2015-07-13 20:04:56 +0000372 noexcept(allocator_traits<allocator_type>::is_always_equal::value &&
Eric Fiselier6bfed252016-04-21 23:38:59 +0000373 is_nothrow_swappable<key_compare>::value); // C++17
Howard Hinnantc51e1022010-05-11 19:42:16 +0000374
375 // observers:
Howard Hinnantf95f4f52011-06-04 15:22:34 +0000376 allocator_type get_allocator() const noexcept;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000377 key_compare key_comp() const;
378 value_compare value_comp() const;
379
380 // map operations:
381 iterator find(const key_type& k);
382 const_iterator find(const key_type& k) const;
Marshall Clowebb57322013-08-13 22:18:47 +0000383 template<typename K>
384 iterator find(const K& x); // C++14
385 template<typename K>
386 const_iterator find(const K& x) const; // C++14
387 template<typename K>
Marshall Clowe6a5f522014-08-24 23:54:16 +0000388 size_type count(const K& x) const; // C++14
Marshall Clowebb57322013-08-13 22:18:47 +0000389
Howard Hinnantc51e1022010-05-11 19:42:16 +0000390 size_type count(const key_type& k) const;
391 iterator lower_bound(const key_type& k);
392 const_iterator lower_bound(const key_type& k) const;
Marshall Clowebb57322013-08-13 22:18:47 +0000393 template<typename K>
394 iterator lower_bound(const K& x); // C++14
395 template<typename K>
396 const_iterator lower_bound(const K& x) const; // C++14
397
Howard Hinnantc51e1022010-05-11 19:42:16 +0000398 iterator upper_bound(const key_type& k);
399 const_iterator upper_bound(const key_type& k) const;
Marshall Clowebb57322013-08-13 22:18:47 +0000400 template<typename K>
401 iterator upper_bound(const K& x); // C++14
402 template<typename K>
403 const_iterator upper_bound(const K& x) const; // C++14
404
Howard Hinnantc51e1022010-05-11 19:42:16 +0000405 pair<iterator,iterator> equal_range(const key_type& k);
406 pair<const_iterator,const_iterator> equal_range(const key_type& k) const;
Marshall Clowebb57322013-08-13 22:18:47 +0000407 template<typename K>
408 pair<iterator,iterator> equal_range(const K& x); // C++14
409 template<typename K>
410 pair<const_iterator,const_iterator> equal_range(const K& x) const; // C++14
Howard Hinnantc51e1022010-05-11 19:42:16 +0000411};
412
413template <class Key, class T, class Compare, class Allocator>
414bool
415operator==(const multimap<Key, T, Compare, Allocator>& x,
416 const multimap<Key, T, Compare, Allocator>& y);
417
418template <class Key, class T, class Compare, class Allocator>
419bool
420operator< (const multimap<Key, T, Compare, Allocator>& x,
421 const multimap<Key, T, Compare, Allocator>& y);
422
423template <class Key, class T, class Compare, class Allocator>
424bool
425operator!=(const multimap<Key, T, Compare, Allocator>& x,
426 const multimap<Key, T, Compare, Allocator>& y);
427
428template <class Key, class T, class Compare, class Allocator>
429bool
430operator> (const multimap<Key, T, Compare, Allocator>& x,
431 const multimap<Key, T, Compare, Allocator>& y);
432
433template <class Key, class T, class Compare, class Allocator>
434bool
435operator>=(const multimap<Key, T, Compare, Allocator>& x,
436 const multimap<Key, T, Compare, Allocator>& y);
437
438template <class Key, class T, class Compare, class Allocator>
439bool
440operator<=(const multimap<Key, T, Compare, Allocator>& x,
441 const multimap<Key, T, Compare, Allocator>& y);
442
443// specialized algorithms:
444template <class Key, class T, class Compare, class Allocator>
445void
446swap(multimap<Key, T, Compare, Allocator>& x,
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +0000447 multimap<Key, T, Compare, Allocator>& y)
448 noexcept(noexcept(x.swap(y)));
Howard Hinnantc51e1022010-05-11 19:42:16 +0000449
450} // std
451
452*/
453
454#include <__config>
455#include <__tree>
Erik Pilkingtonc37a3d82018-08-01 01:33:38 +0000456#include <__node_handle>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000457#include <iterator>
458#include <memory>
459#include <utility>
460#include <functional>
461#include <initializer_list>
Eric Fiselierf7394302015-06-13 07:08:02 +0000462#include <type_traits>
Marshall Clow0a1e7502018-09-12 19:41:40 +0000463#include <version>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000464
Howard Hinnantaaaa52b2011-10-17 20:05:10 +0000465#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000466#pragma GCC system_header
Howard Hinnantaaaa52b2011-10-17 20:05:10 +0000467#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +0000468
469_LIBCPP_BEGIN_NAMESPACE_STD
470
Eric Fiseliera7a14ed2017-01-13 22:02:08 +0000471template <class _Key, class _CP, class _Compare, bool _IsSmall>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000472class __map_value_compare
473 : private _Compare
474{
Howard Hinnantc51e1022010-05-11 19:42:16 +0000475public:
Howard Hinnant756c69b2010-09-22 16:48:34 +0000476 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +0000477 __map_value_compare()
478 _NOEXCEPT_(is_nothrow_default_constructible<_Compare>::value)
479 : _Compare() {}
Howard Hinnant756c69b2010-09-22 16:48:34 +0000480 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +0000481 __map_value_compare(_Compare c)
482 _NOEXCEPT_(is_nothrow_copy_constructible<_Compare>::value)
483 : _Compare(c) {}
Howard Hinnant756c69b2010-09-22 16:48:34 +0000484 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +0000485 const _Compare& key_comp() const _NOEXCEPT {return *this;}
Howard Hinnant756c69b2010-09-22 16:48:34 +0000486 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000487 bool operator()(const _CP& __x, const _CP& __y) const
Erik Pilkingtond3fe2992018-06-04 20:38:23 +0000488 {return static_cast<const _Compare&>(*this)(__x.__get_value().first, __y.__get_value().first);}
Howard Hinnant756c69b2010-09-22 16:48:34 +0000489 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000490 bool operator()(const _CP& __x, const _Key& __y) const
Erik Pilkingtond3fe2992018-06-04 20:38:23 +0000491 {return static_cast<const _Compare&>(*this)(__x.__get_value().first, __y);}
Howard Hinnant756c69b2010-09-22 16:48:34 +0000492 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000493 bool operator()(const _Key& __x, const _CP& __y) const
Erik Pilkingtond3fe2992018-06-04 20:38:23 +0000494 {return static_cast<const _Compare&>(*this)(__x, __y.__get_value().first);}
Marshall Clow8982dcd2015-07-13 20:04:56 +0000495 void swap(__map_value_compare&__y)
496 _NOEXCEPT_(__is_nothrow_swappable<_Compare>::value)
497 {
Eric Fiselier68b5f0b2017-04-13 00:34:24 +0000498 using _VSTD::swap;
499 swap(static_cast<_Compare&>(*this), static_cast<_Compare&>(__y));
Marshall Clow8982dcd2015-07-13 20:04:56 +0000500 }
Marshall Clowebb57322013-08-13 22:18:47 +0000501
502#if _LIBCPP_STD_VER > 11
503 template <typename _K2>
504 _LIBCPP_INLINE_VISIBILITY
505 typename enable_if<__is_transparent<_Compare, _K2>::value, bool>::type
506 operator () ( const _K2& __x, const _CP& __y ) const
Erik Pilkingtond3fe2992018-06-04 20:38:23 +0000507 {return static_cast<const _Compare&>(*this) (__x, __y.__get_value().first);}
Marshall Clowebb57322013-08-13 22:18:47 +0000508
509 template <typename _K2>
510 _LIBCPP_INLINE_VISIBILITY
511 typename enable_if<__is_transparent<_Compare, _K2>::value, bool>::type
512 operator () (const _CP& __x, const _K2& __y) const
Erik Pilkingtond3fe2992018-06-04 20:38:23 +0000513 {return static_cast<const _Compare&>(*this) (__x.__get_value().first, __y);}
Marshall Clowebb57322013-08-13 22:18:47 +0000514#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +0000515};
516
Howard Hinnant90b91592013-07-05 18:06:00 +0000517template <class _Key, class _CP, class _Compare>
518class __map_value_compare<_Key, _CP, _Compare, false>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000519{
520 _Compare comp;
521
Howard Hinnantc51e1022010-05-11 19:42:16 +0000522public:
Howard Hinnant756c69b2010-09-22 16:48:34 +0000523 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +0000524 __map_value_compare()
525 _NOEXCEPT_(is_nothrow_default_constructible<_Compare>::value)
526 : comp() {}
Howard Hinnant756c69b2010-09-22 16:48:34 +0000527 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +0000528 __map_value_compare(_Compare c)
529 _NOEXCEPT_(is_nothrow_copy_constructible<_Compare>::value)
530 : comp(c) {}
Howard Hinnant756c69b2010-09-22 16:48:34 +0000531 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +0000532 const _Compare& key_comp() const _NOEXCEPT {return comp;}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000533
Howard Hinnant756c69b2010-09-22 16:48:34 +0000534 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000535 bool operator()(const _CP& __x, const _CP& __y) const
Erik Pilkingtond3fe2992018-06-04 20:38:23 +0000536 {return comp(__x.__get_value().first, __y.__get_value().first);}
Howard Hinnant756c69b2010-09-22 16:48:34 +0000537 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000538 bool operator()(const _CP& __x, const _Key& __y) const
Erik Pilkingtond3fe2992018-06-04 20:38:23 +0000539 {return comp(__x.__get_value().first, __y);}
Howard Hinnant756c69b2010-09-22 16:48:34 +0000540 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000541 bool operator()(const _Key& __x, const _CP& __y) const
Erik Pilkingtond3fe2992018-06-04 20:38:23 +0000542 {return comp(__x, __y.__get_value().first);}
Marshall Clow8982dcd2015-07-13 20:04:56 +0000543 void swap(__map_value_compare&__y)
544 _NOEXCEPT_(__is_nothrow_swappable<_Compare>::value)
545 {
546 using _VSTD::swap;
547 swap(comp, __y.comp);
548 }
Eric Fiseliercf8c0212017-01-05 06:06:18 +0000549
Marshall Clowebb57322013-08-13 22:18:47 +0000550#if _LIBCPP_STD_VER > 11
551 template <typename _K2>
552 _LIBCPP_INLINE_VISIBILITY
553 typename enable_if<__is_transparent<_Compare, _K2>::value, bool>::type
554 operator () ( const _K2& __x, const _CP& __y ) const
Erik Pilkingtond3fe2992018-06-04 20:38:23 +0000555 {return comp (__x, __y.__get_value().first);}
Marshall Clowebb57322013-08-13 22:18:47 +0000556
557 template <typename _K2>
558 _LIBCPP_INLINE_VISIBILITY
559 typename enable_if<__is_transparent<_Compare, _K2>::value, bool>::type
560 operator () (const _CP& __x, const _K2& __y) const
Erik Pilkingtond3fe2992018-06-04 20:38:23 +0000561 {return comp (__x.__get_value().first, __y);}
Marshall Clowebb57322013-08-13 22:18:47 +0000562#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +0000563};
564
Marshall Clow8982dcd2015-07-13 20:04:56 +0000565template <class _Key, class _CP, class _Compare, bool __b>
566inline _LIBCPP_INLINE_VISIBILITY
567void
568swap(__map_value_compare<_Key, _CP, _Compare, __b>& __x,
569 __map_value_compare<_Key, _CP, _Compare, __b>& __y)
570 _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
571{
572 __x.swap(__y);
573}
574
Howard Hinnantc51e1022010-05-11 19:42:16 +0000575template <class _Allocator>
576class __map_node_destructor
577{
578 typedef _Allocator allocator_type;
579 typedef allocator_traits<allocator_type> __alloc_traits;
Eric Fiseliera00b4842016-02-20 05:28:30 +0000580
Howard Hinnantc51e1022010-05-11 19:42:16 +0000581public:
582 typedef typename __alloc_traits::pointer pointer;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000583
Eric Fiseliera00b4842016-02-20 05:28:30 +0000584private:
Howard Hinnantc51e1022010-05-11 19:42:16 +0000585 allocator_type& __na_;
586
587 __map_node_destructor& operator=(const __map_node_destructor&);
588
589public:
590 bool __first_constructed;
591 bool __second_constructed;
592
Howard Hinnant756c69b2010-09-22 16:48:34 +0000593 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +0000594 explicit __map_node_destructor(allocator_type& __na) _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +0000595 : __na_(__na),
596 __first_constructed(false),
597 __second_constructed(false)
598 {}
599
Eric Fiseliera85b1282017-04-18 21:08:06 +0000600#ifndef _LIBCPP_CXX03_LANG
Howard Hinnant756c69b2010-09-22 16:48:34 +0000601 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +0000602 __map_node_destructor(__tree_node_destructor<allocator_type>&& __x) _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +0000603 : __na_(__x.__na_),
604 __first_constructed(__x.__value_constructed),
605 __second_constructed(__x.__value_constructed)
606 {
607 __x.__value_constructed = false;
608 }
Eric Fiseliera85b1282017-04-18 21:08:06 +0000609#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +0000610
Howard Hinnant756c69b2010-09-22 16:48:34 +0000611 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +0000612 void operator()(pointer __p) _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +0000613 {
614 if (__second_constructed)
Erik Pilkingtond3fe2992018-06-04 20:38:23 +0000615 __alloc_traits::destroy(__na_, _VSTD::addressof(__p->__value_.__get_value().second));
Howard Hinnantc51e1022010-05-11 19:42:16 +0000616 if (__first_constructed)
Erik Pilkingtond3fe2992018-06-04 20:38:23 +0000617 __alloc_traits::destroy(__na_, _VSTD::addressof(__p->__value_.__get_value().first));
Howard Hinnantc51e1022010-05-11 19:42:16 +0000618 if (__p)
619 __alloc_traits::deallocate(__na_, __p, 1);
620 }
621};
622
Howard Hinnant944510a2011-06-14 19:58:17 +0000623template <class _Key, class _Tp, class _Compare, class _Allocator>
624 class map;
625template <class _Key, class _Tp, class _Compare, class _Allocator>
626 class multimap;
627template <class _TreeIterator> class __map_const_iterator;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000628
Eric Fiseliera00b4842016-02-20 05:28:30 +0000629#ifndef _LIBCPP_CXX03_LANG
Howard Hinnant89f8b792013-09-30 19:08:22 +0000630
631template <class _Key, class _Tp>
Erik Pilkingtond3fe2992018-06-04 20:38:23 +0000632struct __value_type
Howard Hinnant89f8b792013-09-30 19:08:22 +0000633{
634 typedef _Key key_type;
635 typedef _Tp mapped_type;
636 typedef pair<const key_type, mapped_type> value_type;
Erik Pilkingtond3fe2992018-06-04 20:38:23 +0000637 typedef pair<key_type&, mapped_type&> __nc_ref_pair_type;
638 typedef pair<key_type&&, mapped_type&&> __nc_rref_pair_type;
Howard Hinnant89f8b792013-09-30 19:08:22 +0000639
Erik Pilkingtond3fe2992018-06-04 20:38:23 +0000640private:
Howard Hinnant89f8b792013-09-30 19:08:22 +0000641 value_type __cc;
Erik Pilkingtond3fe2992018-06-04 20:38:23 +0000642
643public:
644 _LIBCPP_INLINE_VISIBILITY
645 value_type& __get_value()
646 {
647#if _LIBCPP_STD_VER > 14
648 return *_VSTD::launder(_VSTD::addressof(__cc));
649#else
650 return __cc;
651#endif
652 }
653
654 _LIBCPP_INLINE_VISIBILITY
655 const value_type& __get_value() const
656 {
657#if _LIBCPP_STD_VER > 14
658 return *_VSTD::launder(_VSTD::addressof(__cc));
659#else
660 return __cc;
661#endif
662 }
663
664 _LIBCPP_INLINE_VISIBILITY
665 __nc_ref_pair_type __ref()
666 {
667 value_type& __v = __get_value();
668 return __nc_ref_pair_type(const_cast<key_type&>(__v.first), __v.second);
669 }
670
671 _LIBCPP_INLINE_VISIBILITY
672 __nc_rref_pair_type __move()
673 {
674 value_type& __v = __get_value();
675 return __nc_rref_pair_type(
676 _VSTD::move(const_cast<key_type&>(__v.first)),
677 _VSTD::move(__v.second));
678 }
Howard Hinnant89f8b792013-09-30 19:08:22 +0000679
Howard Hinnant89f8b792013-09-30 19:08:22 +0000680 _LIBCPP_INLINE_VISIBILITY
681 __value_type& operator=(const __value_type& __v)
Erik Pilkingtond3fe2992018-06-04 20:38:23 +0000682 {
683 __ref() = __v.__get_value();
684 return *this;
685 }
Howard Hinnant89f8b792013-09-30 19:08:22 +0000686
687 _LIBCPP_INLINE_VISIBILITY
688 __value_type& operator=(__value_type&& __v)
Erik Pilkingtond3fe2992018-06-04 20:38:23 +0000689 {
690 __ref() = __v.__move();
691 return *this;
692 }
Howard Hinnant89f8b792013-09-30 19:08:22 +0000693
Eric Fiselierd06276b2016-03-31 02:15:15 +0000694 template <class _ValueTp,
695 class = typename enable_if<
696 __is_same_uncvref<_ValueTp, value_type>::value
697 >::type
698 >
Howard Hinnant89f8b792013-09-30 19:08:22 +0000699 _LIBCPP_INLINE_VISIBILITY
Erik Pilkingtond3fe2992018-06-04 20:38:23 +0000700 __value_type& operator=(_ValueTp&& __v)
701 {
702 __ref() = _VSTD::forward<_ValueTp>(__v);
703 return *this;
Eric Fiselierd06276b2016-03-31 02:15:15 +0000704 }
705
706private:
707 __value_type() _LIBCPP_EQUAL_DELETE;
708 ~__value_type() _LIBCPP_EQUAL_DELETE;
709 __value_type(const __value_type& __v) _LIBCPP_EQUAL_DELETE;
710 __value_type(__value_type&& __v) _LIBCPP_EQUAL_DELETE;
Howard Hinnant89f8b792013-09-30 19:08:22 +0000711};
712
713#else
714
715template <class _Key, class _Tp>
716struct __value_type
717{
718 typedef _Key key_type;
719 typedef _Tp mapped_type;
720 typedef pair<const key_type, mapped_type> value_type;
721
Erik Pilkingtond3fe2992018-06-04 20:38:23 +0000722private:
Howard Hinnant89f8b792013-09-30 19:08:22 +0000723 value_type __cc;
724
Erik Pilkingtond3fe2992018-06-04 20:38:23 +0000725public:
726 _LIBCPP_INLINE_VISIBILITY
727 value_type& __get_value() { return __cc; }
728 _LIBCPP_INLINE_VISIBILITY
729 const value_type& __get_value() const { return __cc; }
730
Eric Fiselierd06276b2016-03-31 02:15:15 +0000731private:
732 __value_type();
733 __value_type(__value_type const&);
734 __value_type& operator=(__value_type const&);
735 ~__value_type();
Howard Hinnant89f8b792013-09-30 19:08:22 +0000736};
737
Eric Fiseliera85b1282017-04-18 21:08:06 +0000738#endif // _LIBCPP_CXX03_LANG
Howard Hinnant89f8b792013-09-30 19:08:22 +0000739
Eric Fiselier44f9fd02015-03-03 20:10:01 +0000740template <class _Tp>
741struct __extract_key_value_types;
742
743template <class _Key, class _Tp>
744struct __extract_key_value_types<__value_type<_Key, _Tp> >
745{
746 typedef _Key const __key_type;
747 typedef _Tp __mapped_type;
748};
749
Howard Hinnantc51e1022010-05-11 19:42:16 +0000750template <class _TreeIterator>
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000751class _LIBCPP_TEMPLATE_VIS __map_iterator
Howard Hinnantc51e1022010-05-11 19:42:16 +0000752{
Eric Fiseliera00b4842016-02-20 05:28:30 +0000753 typedef typename _TreeIterator::_NodeTypes _NodeTypes;
754 typedef typename _TreeIterator::__pointer_traits __pointer_traits;
755
Howard Hinnantc51e1022010-05-11 19:42:16 +0000756 _TreeIterator __i_;
757
Howard Hinnantc51e1022010-05-11 19:42:16 +0000758public:
759 typedef bidirectional_iterator_tag iterator_category;
Eric Fiseliera00b4842016-02-20 05:28:30 +0000760 typedef typename _NodeTypes::__map_value_type value_type;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000761 typedef typename _TreeIterator::difference_type difference_type;
762 typedef value_type& reference;
Eric Fiseliera00b4842016-02-20 05:28:30 +0000763 typedef typename _NodeTypes::__map_value_type_pointer pointer;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000764
Howard Hinnant756c69b2010-09-22 16:48:34 +0000765 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +0000766 __map_iterator() _NOEXCEPT {}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000767
Howard Hinnant756c69b2010-09-22 16:48:34 +0000768 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +0000769 __map_iterator(_TreeIterator __i) _NOEXCEPT : __i_(__i) {}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000770
Howard Hinnant756c69b2010-09-22 16:48:34 +0000771 _LIBCPP_INLINE_VISIBILITY
Erik Pilkingtond3fe2992018-06-04 20:38:23 +0000772 reference operator*() const {return __i_->__get_value();}
Howard Hinnant756c69b2010-09-22 16:48:34 +0000773 _LIBCPP_INLINE_VISIBILITY
Erik Pilkingtond3fe2992018-06-04 20:38:23 +0000774 pointer operator->() const {return pointer_traits<pointer>::pointer_to(__i_->__get_value());}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000775
Howard Hinnant756c69b2010-09-22 16:48:34 +0000776 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000777 __map_iterator& operator++() {++__i_; return *this;}
Howard Hinnant756c69b2010-09-22 16:48:34 +0000778 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000779 __map_iterator operator++(int)
780 {
781 __map_iterator __t(*this);
782 ++(*this);
783 return __t;
784 }
785
Howard Hinnant756c69b2010-09-22 16:48:34 +0000786 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000787 __map_iterator& operator--() {--__i_; return *this;}
Howard Hinnant756c69b2010-09-22 16:48:34 +0000788 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000789 __map_iterator operator--(int)
790 {
791 __map_iterator __t(*this);
792 --(*this);
793 return __t;
794 }
795
Howard Hinnant756c69b2010-09-22 16:48:34 +0000796 friend _LIBCPP_INLINE_VISIBILITY
797 bool operator==(const __map_iterator& __x, const __map_iterator& __y)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000798 {return __x.__i_ == __y.__i_;}
Eric Fiseliercf8c0212017-01-05 06:06:18 +0000799 friend
Howard Hinnant756c69b2010-09-22 16:48:34 +0000800 _LIBCPP_INLINE_VISIBILITY
801 bool operator!=(const __map_iterator& __x, const __map_iterator& __y)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000802 {return __x.__i_ != __y.__i_;}
803
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000804 template <class, class, class, class> friend class _LIBCPP_TEMPLATE_VIS map;
805 template <class, class, class, class> friend class _LIBCPP_TEMPLATE_VIS multimap;
806 template <class> friend class _LIBCPP_TEMPLATE_VIS __map_const_iterator;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000807};
808
809template <class _TreeIterator>
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000810class _LIBCPP_TEMPLATE_VIS __map_const_iterator
Howard Hinnantc51e1022010-05-11 19:42:16 +0000811{
Eric Fiseliera00b4842016-02-20 05:28:30 +0000812 typedef typename _TreeIterator::_NodeTypes _NodeTypes;
813 typedef typename _TreeIterator::__pointer_traits __pointer_traits;
814
Howard Hinnantc51e1022010-05-11 19:42:16 +0000815 _TreeIterator __i_;
816
Howard Hinnantc51e1022010-05-11 19:42:16 +0000817public:
818 typedef bidirectional_iterator_tag iterator_category;
Eric Fiseliera00b4842016-02-20 05:28:30 +0000819 typedef typename _NodeTypes::__map_value_type value_type;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000820 typedef typename _TreeIterator::difference_type difference_type;
821 typedef const value_type& reference;
Eric Fiseliera00b4842016-02-20 05:28:30 +0000822 typedef typename _NodeTypes::__const_map_value_type_pointer pointer;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000823
Howard Hinnant756c69b2010-09-22 16:48:34 +0000824 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +0000825 __map_const_iterator() _NOEXCEPT {}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000826
Howard Hinnant756c69b2010-09-22 16:48:34 +0000827 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +0000828 __map_const_iterator(_TreeIterator __i) _NOEXCEPT : __i_(__i) {}
Howard Hinnant756c69b2010-09-22 16:48:34 +0000829 _LIBCPP_INLINE_VISIBILITY
Eric Fiselier44f9fd02015-03-03 20:10:01 +0000830 __map_const_iterator(__map_iterator<
831 typename _TreeIterator::__non_const_iterator> __i) _NOEXCEPT
832 : __i_(__i.__i_) {}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000833
Howard Hinnant756c69b2010-09-22 16:48:34 +0000834 _LIBCPP_INLINE_VISIBILITY
Erik Pilkingtond3fe2992018-06-04 20:38:23 +0000835 reference operator*() const {return __i_->__get_value();}
Howard Hinnant756c69b2010-09-22 16:48:34 +0000836 _LIBCPP_INLINE_VISIBILITY
Erik Pilkingtond3fe2992018-06-04 20:38:23 +0000837 pointer operator->() const {return pointer_traits<pointer>::pointer_to(__i_->__get_value());}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000838
Howard Hinnant756c69b2010-09-22 16:48:34 +0000839 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000840 __map_const_iterator& operator++() {++__i_; return *this;}
Howard Hinnant756c69b2010-09-22 16:48:34 +0000841 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000842 __map_const_iterator operator++(int)
843 {
844 __map_const_iterator __t(*this);
845 ++(*this);
846 return __t;
847 }
848
Howard Hinnant756c69b2010-09-22 16:48:34 +0000849 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000850 __map_const_iterator& operator--() {--__i_; return *this;}
Howard Hinnant756c69b2010-09-22 16:48:34 +0000851 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000852 __map_const_iterator operator--(int)
853 {
854 __map_const_iterator __t(*this);
855 --(*this);
856 return __t;
857 }
858
Howard Hinnant756c69b2010-09-22 16:48:34 +0000859 friend _LIBCPP_INLINE_VISIBILITY
860 bool operator==(const __map_const_iterator& __x, const __map_const_iterator& __y)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000861 {return __x.__i_ == __y.__i_;}
Howard Hinnant756c69b2010-09-22 16:48:34 +0000862 friend _LIBCPP_INLINE_VISIBILITY
863 bool operator!=(const __map_const_iterator& __x, const __map_const_iterator& __y)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000864 {return __x.__i_ != __y.__i_;}
865
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000866 template <class, class, class, class> friend class _LIBCPP_TEMPLATE_VIS map;
867 template <class, class, class, class> friend class _LIBCPP_TEMPLATE_VIS multimap;
868 template <class, class, class> friend class _LIBCPP_TEMPLATE_VIS __tree_const_iterator;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000869};
870
871template <class _Key, class _Tp, class _Compare = less<_Key>,
872 class _Allocator = allocator<pair<const _Key, _Tp> > >
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000873class _LIBCPP_TEMPLATE_VIS map
Howard Hinnantc51e1022010-05-11 19:42:16 +0000874{
875public:
876 // types:
877 typedef _Key key_type;
878 typedef _Tp mapped_type;
879 typedef pair<const key_type, mapped_type> value_type;
880 typedef _Compare key_compare;
881 typedef _Allocator allocator_type;
882 typedef value_type& reference;
883 typedef const value_type& const_reference;
884
Marshall Clow5128cf32015-11-26 01:24:04 +0000885 static_assert((is_same<typename allocator_type::value_type, value_type>::value),
886 "Allocator::value_type must be same type as value_type");
887
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000888 class _LIBCPP_TEMPLATE_VIS value_compare
Howard Hinnantc51e1022010-05-11 19:42:16 +0000889 : public binary_function<value_type, value_type, bool>
890 {
891 friend class map;
892 protected:
893 key_compare comp;
894
Howard Hinnant756c69b2010-09-22 16:48:34 +0000895 _LIBCPP_INLINE_VISIBILITY value_compare(key_compare c) : comp(c) {}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000896 public:
Howard Hinnant756c69b2010-09-22 16:48:34 +0000897 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000898 bool operator()(const value_type& __x, const value_type& __y) const
899 {return comp(__x.first, __y.first);}
900 };
901
902private:
Howard Hinnant2d0046b2013-06-19 21:29:40 +0000903
Howard Hinnant89f8b792013-09-30 19:08:22 +0000904 typedef _VSTD::__value_type<key_type, mapped_type> __value_type;
Howard Hinnant90b91592013-07-05 18:06:00 +0000905 typedef __map_value_compare<key_type, __value_type, key_compare> __vc;
Marshall Clow940e01c2015-04-07 05:21:38 +0000906 typedef typename __rebind_alloc_helper<allocator_traits<allocator_type>,
907 __value_type>::type __allocator_type;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000908 typedef __tree<__value_type, __vc, __allocator_type> __base;
909 typedef typename __base::__node_traits __node_traits;
910 typedef allocator_traits<allocator_type> __alloc_traits;
911
912 __base __tree_;
913
914public:
915 typedef typename __alloc_traits::pointer pointer;
916 typedef typename __alloc_traits::const_pointer const_pointer;
917 typedef typename __alloc_traits::size_type size_type;
918 typedef typename __alloc_traits::difference_type difference_type;
Eric Fiselier44f9fd02015-03-03 20:10:01 +0000919 typedef __map_iterator<typename __base::iterator> iterator;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000920 typedef __map_const_iterator<typename __base::const_iterator> const_iterator;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000921 typedef _VSTD::reverse_iterator<iterator> reverse_iterator;
922 typedef _VSTD::reverse_iterator<const_iterator> const_reverse_iterator;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000923
Erik Pilkingtonc37a3d82018-08-01 01:33:38 +0000924#if _LIBCPP_STD_VER > 14
925 typedef __map_node_handle<typename __base::__node, allocator_type> node_type;
926 typedef __insert_return_type<iterator, node_type> insert_return_type;
927#endif
928
Howard Hinnant756c69b2010-09-22 16:48:34 +0000929 _LIBCPP_INLINE_VISIBILITY
Marshall Clow7086a5a2014-03-10 04:50:10 +0000930 map()
931 _NOEXCEPT_(
932 is_nothrow_default_constructible<allocator_type>::value &&
933 is_nothrow_default_constructible<key_compare>::value &&
934 is_nothrow_copy_constructible<key_compare>::value)
935 : __tree_(__vc(key_compare())) {}
936
937 _LIBCPP_INLINE_VISIBILITY
938 explicit map(const key_compare& __comp)
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +0000939 _NOEXCEPT_(
940 is_nothrow_default_constructible<allocator_type>::value &&
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +0000941 is_nothrow_copy_constructible<key_compare>::value)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000942 : __tree_(__vc(__comp)) {}
943
Howard Hinnant756c69b2010-09-22 16:48:34 +0000944 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000945 explicit map(const key_compare& __comp, const allocator_type& __a)
Marshall Clow657cbc42016-08-17 05:58:40 +0000946 : __tree_(__vc(__comp), typename __base::allocator_type(__a)) {}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000947
948 template <class _InputIterator>
Howard Hinnant756c69b2010-09-22 16:48:34 +0000949 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000950 map(_InputIterator __f, _InputIterator __l,
951 const key_compare& __comp = key_compare())
952 : __tree_(__vc(__comp))
953 {
954 insert(__f, __l);
955 }
956
957 template <class _InputIterator>
Howard Hinnant756c69b2010-09-22 16:48:34 +0000958 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000959 map(_InputIterator __f, _InputIterator __l,
960 const key_compare& __comp, const allocator_type& __a)
Marshall Clow657cbc42016-08-17 05:58:40 +0000961 : __tree_(__vc(__comp), typename __base::allocator_type(__a))
Howard Hinnantc51e1022010-05-11 19:42:16 +0000962 {
963 insert(__f, __l);
964 }
965
Marshall Clow300abfb2013-09-11 01:15:47 +0000966#if _LIBCPP_STD_VER > 11
967 template <class _InputIterator>
Eric Fiseliercf8c0212017-01-05 06:06:18 +0000968 _LIBCPP_INLINE_VISIBILITY
Marshall Clow300abfb2013-09-11 01:15:47 +0000969 map(_InputIterator __f, _InputIterator __l, const allocator_type& __a)
970 : map(__f, __l, key_compare(), __a) {}
971#endif
972
Howard Hinnant756c69b2010-09-22 16:48:34 +0000973 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000974 map(const map& __m)
975 : __tree_(__m.__tree_)
976 {
977 insert(__m.begin(), __m.end());
978 }
979
Howard Hinnantd3a657f2011-07-01 19:24:36 +0000980 _LIBCPP_INLINE_VISIBILITY
981 map& operator=(const map& __m)
982 {
Marshall Clow476d3f42016-07-18 13:19:00 +0000983#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantd3a657f2011-07-01 19:24:36 +0000984 __tree_ = __m.__tree_;
Howard Hinnant2d0046b2013-06-19 21:29:40 +0000985#else
Marshall Clowdb3cfcb2014-02-08 04:03:14 +0000986 if (this != &__m) {
987 __tree_.clear();
988 __tree_.value_comp() = __m.__tree_.value_comp();
989 __tree_.__copy_assign_alloc(__m.__tree_);
990 insert(__m.begin(), __m.end());
991 }
Howard Hinnant2d0046b2013-06-19 21:29:40 +0000992#endif
Howard Hinnantd3a657f2011-07-01 19:24:36 +0000993 return *this;
994 }
995
Eric Fiseliera85b1282017-04-18 21:08:06 +0000996#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +0000997
Howard Hinnant756c69b2010-09-22 16:48:34 +0000998 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000999 map(map&& __m)
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001000 _NOEXCEPT_(is_nothrow_move_constructible<__base>::value)
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001001 : __tree_(_VSTD::move(__m.__tree_))
Howard Hinnantc51e1022010-05-11 19:42:16 +00001002 {
1003 }
1004
1005 map(map&& __m, const allocator_type& __a);
1006
Howard Hinnant756c69b2010-09-22 16:48:34 +00001007 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant33711792011-08-12 21:56:02 +00001008 map& operator=(map&& __m)
1009 _NOEXCEPT_(is_nothrow_move_assignable<__base>::value)
1010 {
1011 __tree_ = _VSTD::move(__m.__tree_);
1012 return *this;
1013 }
1014
Howard Hinnant33711792011-08-12 21:56:02 +00001015 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001016 map(initializer_list<value_type> __il, const key_compare& __comp = key_compare())
1017 : __tree_(__vc(__comp))
1018 {
1019 insert(__il.begin(), __il.end());
1020 }
1021
Howard Hinnant756c69b2010-09-22 16:48:34 +00001022 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001023 map(initializer_list<value_type> __il, const key_compare& __comp, const allocator_type& __a)
Marshall Clow657cbc42016-08-17 05:58:40 +00001024 : __tree_(__vc(__comp), typename __base::allocator_type(__a))
Howard Hinnantc51e1022010-05-11 19:42:16 +00001025 {
1026 insert(__il.begin(), __il.end());
1027 }
1028
Marshall Clow300abfb2013-09-11 01:15:47 +00001029#if _LIBCPP_STD_VER > 11
Eric Fiseliercf8c0212017-01-05 06:06:18 +00001030 _LIBCPP_INLINE_VISIBILITY
Marshall Clow300abfb2013-09-11 01:15:47 +00001031 map(initializer_list<value_type> __il, const allocator_type& __a)
1032 : map(__il, key_compare(), __a) {}
1033#endif
1034
Howard Hinnant756c69b2010-09-22 16:48:34 +00001035 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001036 map& operator=(initializer_list<value_type> __il)
1037 {
1038 __tree_.__assign_unique(__il.begin(), __il.end());
1039 return *this;
1040 }
1041
Eric Fiseliera85b1282017-04-18 21:08:06 +00001042#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00001043
Howard Hinnant756c69b2010-09-22 16:48:34 +00001044 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001045 explicit map(const allocator_type& __a)
Marshall Clow657cbc42016-08-17 05:58:40 +00001046 : __tree_(typename __base::allocator_type(__a))
Howard Hinnantc51e1022010-05-11 19:42:16 +00001047 {
1048 }
1049
Howard Hinnant756c69b2010-09-22 16:48:34 +00001050 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001051 map(const map& __m, const allocator_type& __a)
Marshall Clow657cbc42016-08-17 05:58:40 +00001052 : __tree_(__m.__tree_.value_comp(), typename __base::allocator_type(__a))
Howard Hinnantc51e1022010-05-11 19:42:16 +00001053 {
1054 insert(__m.begin(), __m.end());
1055 }
1056
Howard Hinnant756c69b2010-09-22 16:48:34 +00001057 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001058 iterator begin() _NOEXCEPT {return __tree_.begin();}
Howard Hinnant756c69b2010-09-22 16:48:34 +00001059 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001060 const_iterator begin() const _NOEXCEPT {return __tree_.begin();}
Howard Hinnant756c69b2010-09-22 16:48:34 +00001061 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001062 iterator end() _NOEXCEPT {return __tree_.end();}
Howard Hinnant756c69b2010-09-22 16:48:34 +00001063 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001064 const_iterator end() const _NOEXCEPT {return __tree_.end();}
Howard Hinnantc51e1022010-05-11 19:42:16 +00001065
Howard Hinnant756c69b2010-09-22 16:48:34 +00001066 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001067 reverse_iterator rbegin() _NOEXCEPT {return reverse_iterator(end());}
Howard Hinnant756c69b2010-09-22 16:48:34 +00001068 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001069 const_reverse_iterator rbegin() const _NOEXCEPT
1070 {return const_reverse_iterator(end());}
Howard Hinnant756c69b2010-09-22 16:48:34 +00001071 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001072 reverse_iterator rend() _NOEXCEPT
1073 {return reverse_iterator(begin());}
Howard Hinnant756c69b2010-09-22 16:48:34 +00001074 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001075 const_reverse_iterator rend() const _NOEXCEPT
1076 {return const_reverse_iterator(begin());}
Howard Hinnantc51e1022010-05-11 19:42:16 +00001077
Howard Hinnant756c69b2010-09-22 16:48:34 +00001078 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001079 const_iterator cbegin() const _NOEXCEPT {return begin();}
Howard Hinnant756c69b2010-09-22 16:48:34 +00001080 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001081 const_iterator cend() const _NOEXCEPT {return end();}
Howard Hinnant756c69b2010-09-22 16:48:34 +00001082 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001083 const_reverse_iterator crbegin() const _NOEXCEPT {return rbegin();}
Howard Hinnant756c69b2010-09-22 16:48:34 +00001084 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001085 const_reverse_iterator crend() const _NOEXCEPT {return rend();}
Howard Hinnantc51e1022010-05-11 19:42:16 +00001086
Marshall Clow425f5752017-11-15 05:51:26 +00001087 _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001088 bool empty() const _NOEXCEPT {return __tree_.size() == 0;}
Howard Hinnant756c69b2010-09-22 16:48:34 +00001089 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001090 size_type size() const _NOEXCEPT {return __tree_.size();}
Howard Hinnant756c69b2010-09-22 16:48:34 +00001091 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001092 size_type max_size() const _NOEXCEPT {return __tree_.max_size();}
Howard Hinnantc51e1022010-05-11 19:42:16 +00001093
1094 mapped_type& operator[](const key_type& __k);
Eric Fiselierd63f38e2016-03-31 03:13:37 +00001095#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00001096 mapped_type& operator[](key_type&& __k);
1097#endif
1098
1099 mapped_type& at(const key_type& __k);
1100 const mapped_type& at(const key_type& __k) const;
1101
Howard Hinnant756c69b2010-09-22 16:48:34 +00001102 _LIBCPP_INLINE_VISIBILITY
Marshall Clow657cbc42016-08-17 05:58:40 +00001103 allocator_type get_allocator() const _NOEXCEPT {return allocator_type(__tree_.__alloc());}
Howard Hinnant756c69b2010-09-22 16:48:34 +00001104 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001105 key_compare key_comp() const {return __tree_.value_comp().key_comp();}
Howard Hinnant756c69b2010-09-22 16:48:34 +00001106 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001107 value_compare value_comp() const {return value_compare(__tree_.value_comp().key_comp());}
1108
Eric Fiselierd06276b2016-03-31 02:15:15 +00001109#ifndef _LIBCPP_CXX03_LANG
1110 template <class ..._Args>
1111 _LIBCPP_INLINE_VISIBILITY
1112 pair<iterator, bool> emplace(_Args&& ...__args) {
1113 return __tree_.__emplace_unique(_VSTD::forward<_Args>(__args)...);
1114 }
Howard Hinnant74279a52010-09-04 23:28:19 +00001115
Howard Hinnant29eb9b82012-05-25 22:04:21 +00001116 template <class ..._Args>
Eric Fiselierd06276b2016-03-31 02:15:15 +00001117 _LIBCPP_INLINE_VISIBILITY
1118 iterator emplace_hint(const_iterator __p, _Args&& ...__args) {
1119 return __tree_.__emplace_hint_unique(__p.__i_, _VSTD::forward<_Args>(__args)...);
1120 }
Howard Hinnant74279a52010-09-04 23:28:19 +00001121
Howard Hinnantc834c512011-11-29 18:15:50 +00001122 template <class _Pp,
1123 class = typename enable_if<is_constructible<value_type, _Pp>::value>::type>
Howard Hinnant756c69b2010-09-22 16:48:34 +00001124 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc834c512011-11-29 18:15:50 +00001125 pair<iterator, bool> insert(_Pp&& __p)
1126 {return __tree_.__insert_unique(_VSTD::forward<_Pp>(__p));}
Howard Hinnantc51e1022010-05-11 19:42:16 +00001127
Howard Hinnantc834c512011-11-29 18:15:50 +00001128 template <class _Pp,
1129 class = typename enable_if<is_constructible<value_type, _Pp>::value>::type>
Howard Hinnant756c69b2010-09-22 16:48:34 +00001130 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc834c512011-11-29 18:15:50 +00001131 iterator insert(const_iterator __pos, _Pp&& __p)
1132 {return __tree_.__insert_unique(__pos.__i_, _VSTD::forward<_Pp>(__p));}
Howard Hinnantc51e1022010-05-11 19:42:16 +00001133
Eric Fiselierd06276b2016-03-31 02:15:15 +00001134#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00001135
Howard Hinnant756c69b2010-09-22 16:48:34 +00001136 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001137 pair<iterator, bool>
1138 insert(const value_type& __v) {return __tree_.__insert_unique(__v);}
1139
Howard Hinnant756c69b2010-09-22 16:48:34 +00001140 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001141 iterator
1142 insert(const_iterator __p, const value_type& __v)
1143 {return __tree_.__insert_unique(__p.__i_, __v);}
1144
Eric Fiselierd6143132016-04-18 01:40:45 +00001145#ifndef _LIBCPP_CXX03_LANG
Marshall Clowd430d022016-01-05 19:32:41 +00001146 _LIBCPP_INLINE_VISIBILITY
1147 pair<iterator, bool>
Eric Fiselierd06276b2016-03-31 02:15:15 +00001148 insert(value_type&& __v) {return __tree_.__insert_unique(_VSTD::move(__v));}
Marshall Clowd430d022016-01-05 19:32:41 +00001149
1150 _LIBCPP_INLINE_VISIBILITY
Eric Fiselierd06276b2016-03-31 02:15:15 +00001151 iterator insert(const_iterator __p, value_type&& __v)
1152 {return __tree_.__insert_unique(__p.__i_, _VSTD::move(__v));}
Eric Fiseliera85b1282017-04-18 21:08:06 +00001153
1154 _LIBCPP_INLINE_VISIBILITY
1155 void insert(initializer_list<value_type> __il)
1156 {insert(__il.begin(), __il.end());}
Marshall Clowd430d022016-01-05 19:32:41 +00001157#endif
1158
Howard Hinnantc51e1022010-05-11 19:42:16 +00001159 template <class _InputIterator>
Howard Hinnant756c69b2010-09-22 16:48:34 +00001160 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001161 void insert(_InputIterator __f, _InputIterator __l)
1162 {
1163 for (const_iterator __e = cend(); __f != __l; ++__f)
1164 insert(__e.__i_, *__f);
1165 }
1166
Marshall Clow3223db82015-07-07 03:37:33 +00001167#if _LIBCPP_STD_VER > 14
Eric Fiselierd63f38e2016-03-31 03:13:37 +00001168
Marshall Clow3223db82015-07-07 03:37:33 +00001169 template <class... _Args>
1170 _LIBCPP_INLINE_VISIBILITY
1171 pair<iterator, bool> try_emplace(const key_type& __k, _Args&&... __args)
1172 {
Eric Fiselierd63f38e2016-03-31 03:13:37 +00001173 return __tree_.__emplace_unique_key_args(__k,
1174 _VSTD::piecewise_construct,
1175 _VSTD::forward_as_tuple(__k),
1176 _VSTD::forward_as_tuple(_VSTD::forward<_Args>(__args)...));
Marshall Clow3223db82015-07-07 03:37:33 +00001177 }
1178
1179 template <class... _Args>
1180 _LIBCPP_INLINE_VISIBILITY
1181 pair<iterator, bool> try_emplace(key_type&& __k, _Args&&... __args)
1182 {
Eric Fiselierd63f38e2016-03-31 03:13:37 +00001183 return __tree_.__emplace_unique_key_args(__k,
1184 _VSTD::piecewise_construct,
1185 _VSTD::forward_as_tuple(_VSTD::move(__k)),
1186 _VSTD::forward_as_tuple(_VSTD::forward<_Args>(__args)...));
Marshall Clow3223db82015-07-07 03:37:33 +00001187 }
1188
1189 template <class... _Args>
1190 _LIBCPP_INLINE_VISIBILITY
1191 iterator try_emplace(const_iterator __h, const key_type& __k, _Args&&... __args)
1192 {
Eric Fiselierd63f38e2016-03-31 03:13:37 +00001193 return __tree_.__emplace_hint_unique_key_args(__h.__i_, __k,
1194 _VSTD::piecewise_construct,
1195 _VSTD::forward_as_tuple(__k),
1196 _VSTD::forward_as_tuple(_VSTD::forward<_Args>(__args)...));
Marshall Clow3223db82015-07-07 03:37:33 +00001197 }
1198
1199 template <class... _Args>
1200 _LIBCPP_INLINE_VISIBILITY
1201 iterator try_emplace(const_iterator __h, key_type&& __k, _Args&&... __args)
1202 {
Eric Fiselierd63f38e2016-03-31 03:13:37 +00001203 return __tree_.__emplace_hint_unique_key_args(__h.__i_, __k,
1204 _VSTD::piecewise_construct,
1205 _VSTD::forward_as_tuple(_VSTD::move(__k)),
1206 _VSTD::forward_as_tuple(_VSTD::forward<_Args>(__args)...));
Marshall Clow3223db82015-07-07 03:37:33 +00001207 }
1208
1209 template <class _Vp>
1210 _LIBCPP_INLINE_VISIBILITY
1211 pair<iterator, bool> insert_or_assign(const key_type& __k, _Vp&& __v)
1212 {
1213 iterator __p = lower_bound(__k);
1214 if ( __p != end() && !key_comp()(__k, __p->first))
1215 {
1216 __p->second = _VSTD::forward<_Vp>(__v);
1217 return _VSTD::make_pair(__p, false);
1218 }
1219 return _VSTD::make_pair(emplace_hint(__p, __k, _VSTD::forward<_Vp>(__v)), true);
1220 }
Eric Fiselierd63f38e2016-03-31 03:13:37 +00001221
Marshall Clow3223db82015-07-07 03:37:33 +00001222 template <class _Vp>
1223 _LIBCPP_INLINE_VISIBILITY
1224 pair<iterator, bool> insert_or_assign(key_type&& __k, _Vp&& __v)
1225 {
1226 iterator __p = lower_bound(__k);
1227 if ( __p != end() && !key_comp()(__k, __p->first))
1228 {
1229 __p->second = _VSTD::forward<_Vp>(__v);
1230 return _VSTD::make_pair(__p, false);
1231 }
1232 return _VSTD::make_pair(emplace_hint(__p, _VSTD::move(__k), _VSTD::forward<_Vp>(__v)), true);
1233 }
1234
1235 template <class _Vp>
1236 _LIBCPP_INLINE_VISIBILITY
1237 iterator insert_or_assign(const_iterator __h, const key_type& __k, _Vp&& __v)
1238 {
1239 iterator __p = lower_bound(__k);
1240 if ( __p != end() && !key_comp()(__k, __p->first))
1241 {
1242 __p->second = _VSTD::forward<_Vp>(__v);
1243 return __p;
1244 }
1245 return emplace_hint(__h, __k, _VSTD::forward<_Vp>(__v));
1246 }
1247
1248 template <class _Vp>
1249 _LIBCPP_INLINE_VISIBILITY
1250 iterator insert_or_assign(const_iterator __h, key_type&& __k, _Vp&& __v)
1251 {
1252 iterator __p = lower_bound(__k);
1253 if ( __p != end() && !key_comp()(__k, __p->first))
1254 {
1255 __p->second = _VSTD::forward<_Vp>(__v);
1256 return __p;
1257 }
1258 return emplace_hint(__h, _VSTD::move(__k), _VSTD::forward<_Vp>(__v));
1259 }
Eric Fiselierd63f38e2016-03-31 03:13:37 +00001260
Eric Fiseliera85b1282017-04-18 21:08:06 +00001261#endif // _LIBCPP_STD_VER > 14
Marshall Clow3223db82015-07-07 03:37:33 +00001262
Howard Hinnant756c69b2010-09-22 16:48:34 +00001263 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001264 iterator erase(const_iterator __p) {return __tree_.erase(__p.__i_);}
Howard Hinnant756c69b2010-09-22 16:48:34 +00001265 _LIBCPP_INLINE_VISIBILITY
Marshall Clow22ea5b82015-05-10 13:35:00 +00001266 iterator erase(iterator __p) {return __tree_.erase(__p.__i_);}
1267 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001268 size_type erase(const key_type& __k)
1269 {return __tree_.__erase_unique(__k);}
Howard Hinnant756c69b2010-09-22 16:48:34 +00001270 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001271 iterator erase(const_iterator __f, const_iterator __l)
1272 {return __tree_.erase(__f.__i_, __l.__i_);}
Howard Hinnant756c69b2010-09-22 16:48:34 +00001273 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001274 void clear() _NOEXCEPT {__tree_.clear();}
Howard Hinnantc51e1022010-05-11 19:42:16 +00001275
Erik Pilkingtonc37a3d82018-08-01 01:33:38 +00001276#if _LIBCPP_STD_VER > 14
1277 _LIBCPP_INLINE_VISIBILITY
1278 insert_return_type insert(node_type&& __nh)
1279 {
1280 _LIBCPP_ASSERT(__nh.empty() || __nh.get_allocator() == get_allocator(),
1281 "node_type with incompatible allocator passed to map::insert()");
1282 return __tree_.template __node_handle_insert_unique<
1283 node_type, insert_return_type>(_VSTD::move(__nh));
1284 }
1285 _LIBCPP_INLINE_VISIBILITY
1286 iterator insert(const_iterator __hint, node_type&& __nh)
1287 {
1288 _LIBCPP_ASSERT(__nh.empty() || __nh.get_allocator() == get_allocator(),
1289 "node_type with incompatible allocator passed to map::insert()");
1290 return __tree_.template __node_handle_insert_unique<node_type>(
1291 __hint.__i_, _VSTD::move(__nh));
1292 }
1293 _LIBCPP_INLINE_VISIBILITY
1294 node_type extract(key_type const& __key)
1295 {
1296 return __tree_.template __node_handle_extract<node_type>(__key);
1297 }
1298 _LIBCPP_INLINE_VISIBILITY
1299 node_type extract(const_iterator __it)
1300 {
1301 return __tree_.template __node_handle_extract<node_type>(__it.__i_);
1302 }
1303#endif
1304
Howard Hinnant756c69b2010-09-22 16:48:34 +00001305 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001306 void swap(map& __m)
1307 _NOEXCEPT_(__is_nothrow_swappable<__base>::value)
1308 {__tree_.swap(__m.__tree_);}
Howard Hinnantc51e1022010-05-11 19:42:16 +00001309
Howard Hinnant756c69b2010-09-22 16:48:34 +00001310 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001311 iterator find(const key_type& __k) {return __tree_.find(__k);}
Howard Hinnant756c69b2010-09-22 16:48:34 +00001312 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001313 const_iterator find(const key_type& __k) const {return __tree_.find(__k);}
Marshall Clowebb57322013-08-13 22:18:47 +00001314#if _LIBCPP_STD_VER > 11
1315 template <typename _K2>
1316 _LIBCPP_INLINE_VISIBILITY
1317 typename enable_if<__is_transparent<_Compare, _K2>::value,iterator>::type
1318 find(const _K2& __k) {return __tree_.find(__k);}
1319 template <typename _K2>
1320 _LIBCPP_INLINE_VISIBILITY
1321 typename enable_if<__is_transparent<_Compare, _K2>::value,const_iterator>::type
1322 find(const _K2& __k) const {return __tree_.find(__k);}
1323#endif
1324
Howard Hinnant756c69b2010-09-22 16:48:34 +00001325 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001326 size_type count(const key_type& __k) const
1327 {return __tree_.__count_unique(__k);}
Marshall Clowe6a5f522014-08-24 23:54:16 +00001328#if _LIBCPP_STD_VER > 11
1329 template <typename _K2>
1330 _LIBCPP_INLINE_VISIBILITY
1331 typename enable_if<__is_transparent<_Compare, _K2>::value,size_type>::type
Eric Fiseliera85c9e92018-02-10 02:53:47 +00001332 count(const _K2& __k) const {return __tree_.__count_multi(__k);}
Marshall Clowe6a5f522014-08-24 23:54:16 +00001333#endif
Howard Hinnant756c69b2010-09-22 16:48:34 +00001334 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001335 iterator lower_bound(const key_type& __k)
1336 {return __tree_.lower_bound(__k);}
Howard Hinnant756c69b2010-09-22 16:48:34 +00001337 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001338 const_iterator lower_bound(const key_type& __k) const
1339 {return __tree_.lower_bound(__k);}
Marshall Clowebb57322013-08-13 22:18:47 +00001340#if _LIBCPP_STD_VER > 11
1341 template <typename _K2>
1342 _LIBCPP_INLINE_VISIBILITY
1343 typename enable_if<__is_transparent<_Compare, _K2>::value,iterator>::type
1344 lower_bound(const _K2& __k) {return __tree_.lower_bound(__k);}
1345
1346 template <typename _K2>
1347 _LIBCPP_INLINE_VISIBILITY
1348 typename enable_if<__is_transparent<_Compare, _K2>::value,const_iterator>::type
1349 lower_bound(const _K2& __k) const {return __tree_.lower_bound(__k);}
1350#endif
1351
Howard Hinnant756c69b2010-09-22 16:48:34 +00001352 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001353 iterator upper_bound(const key_type& __k)
1354 {return __tree_.upper_bound(__k);}
Howard Hinnant756c69b2010-09-22 16:48:34 +00001355 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001356 const_iterator upper_bound(const key_type& __k) const
1357 {return __tree_.upper_bound(__k);}
Marshall Clowebb57322013-08-13 22:18:47 +00001358#if _LIBCPP_STD_VER > 11
1359 template <typename _K2>
1360 _LIBCPP_INLINE_VISIBILITY
1361 typename enable_if<__is_transparent<_Compare, _K2>::value,iterator>::type
1362 upper_bound(const _K2& __k) {return __tree_.upper_bound(__k);}
1363 template <typename _K2>
1364 _LIBCPP_INLINE_VISIBILITY
1365 typename enable_if<__is_transparent<_Compare, _K2>::value,const_iterator>::type
1366 upper_bound(const _K2& __k) const {return __tree_.upper_bound(__k);}
1367#endif
1368
Howard Hinnant756c69b2010-09-22 16:48:34 +00001369 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001370 pair<iterator,iterator> equal_range(const key_type& __k)
1371 {return __tree_.__equal_range_unique(__k);}
Howard Hinnant756c69b2010-09-22 16:48:34 +00001372 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001373 pair<const_iterator,const_iterator> equal_range(const key_type& __k) const
1374 {return __tree_.__equal_range_unique(__k);}
Marshall Clowebb57322013-08-13 22:18:47 +00001375#if _LIBCPP_STD_VER > 11
1376 template <typename _K2>
1377 _LIBCPP_INLINE_VISIBILITY
1378 typename enable_if<__is_transparent<_Compare, _K2>::value,pair<iterator,iterator>>::type
Eric Fiseliera85c9e92018-02-10 02:53:47 +00001379 equal_range(const _K2& __k) {return __tree_.__equal_range_multi(__k);}
Marshall Clowebb57322013-08-13 22:18:47 +00001380 template <typename _K2>
1381 _LIBCPP_INLINE_VISIBILITY
1382 typename enable_if<__is_transparent<_Compare, _K2>::value,pair<const_iterator,const_iterator>>::type
Eric Fiseliera85c9e92018-02-10 02:53:47 +00001383 equal_range(const _K2& __k) const {return __tree_.__equal_range_multi(__k);}
Marshall Clowebb57322013-08-13 22:18:47 +00001384#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00001385
1386private:
1387 typedef typename __base::__node __node;
1388 typedef typename __base::__node_allocator __node_allocator;
1389 typedef typename __base::__node_pointer __node_pointer;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001390 typedef typename __base::__node_base_pointer __node_base_pointer;
Eric Fiseliercf8c0212017-01-05 06:06:18 +00001391 typedef typename __base::__parent_pointer __parent_pointer;
Eric Fiseliera92b0732016-02-20 07:12:17 +00001392
Howard Hinnantc834c512011-11-29 18:15:50 +00001393 typedef __map_node_destructor<__node_allocator> _Dp;
1394 typedef unique_ptr<__node, _Dp> __node_holder;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001395
Eric Fiselierd63f38e2016-03-31 03:13:37 +00001396#ifdef _LIBCPP_CXX03_LANG
Howard Hinnantac7e7482013-07-04 20:59:16 +00001397 __node_holder __construct_node_with_key(const key_type& __k);
Eric Fiselierd63f38e2016-03-31 03:13:37 +00001398#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00001399};
1400
Eric Fiseliera92b0732016-02-20 07:12:17 +00001401
Eric Fiselierd06276b2016-03-31 02:15:15 +00001402#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00001403template <class _Key, class _Tp, class _Compare, class _Allocator>
1404map<_Key, _Tp, _Compare, _Allocator>::map(map&& __m, const allocator_type& __a)
Marshall Clow657cbc42016-08-17 05:58:40 +00001405 : __tree_(_VSTD::move(__m.__tree_), typename __base::allocator_type(__a))
Howard Hinnantc51e1022010-05-11 19:42:16 +00001406{
1407 if (__a != __m.get_allocator())
1408 {
1409 const_iterator __e = cend();
1410 while (!__m.empty())
1411 __tree_.__insert_unique(__e.__i_,
Erik Pilkingtond3fe2992018-06-04 20:38:23 +00001412 __m.__tree_.remove(__m.begin().__i_)->__value_.__move());
Howard Hinnantc51e1022010-05-11 19:42:16 +00001413 }
1414}
1415
Eric Fiseliera85b1282017-04-18 21:08:06 +00001416template <class _Key, class _Tp, class _Compare, class _Allocator>
1417_Tp&
1418map<_Key, _Tp, _Compare, _Allocator>::operator[](const key_type& __k)
1419{
1420 return __tree_.__emplace_unique_key_args(__k,
1421 _VSTD::piecewise_construct,
1422 _VSTD::forward_as_tuple(__k),
Erik Pilkingtond3fe2992018-06-04 20:38:23 +00001423 _VSTD::forward_as_tuple()).first->__get_value().second;
Eric Fiseliera85b1282017-04-18 21:08:06 +00001424}
Howard Hinnantc51e1022010-05-11 19:42:16 +00001425
Eric Fiseliera85b1282017-04-18 21:08:06 +00001426template <class _Key, class _Tp, class _Compare, class _Allocator>
1427_Tp&
1428map<_Key, _Tp, _Compare, _Allocator>::operator[](key_type&& __k)
1429{
1430 return __tree_.__emplace_unique_key_args(__k,
1431 _VSTD::piecewise_construct,
1432 _VSTD::forward_as_tuple(_VSTD::move(__k)),
Erik Pilkingtond3fe2992018-06-04 20:38:23 +00001433 _VSTD::forward_as_tuple()).first->__get_value().second;
Eric Fiseliera85b1282017-04-18 21:08:06 +00001434}
Eric Fiselierd63f38e2016-03-31 03:13:37 +00001435
Eric Fiseliera85b1282017-04-18 21:08:06 +00001436#else // _LIBCPP_CXX03_LANG
Eric Fiselierd63f38e2016-03-31 03:13:37 +00001437
Howard Hinnantc51e1022010-05-11 19:42:16 +00001438template <class _Key, class _Tp, class _Compare, class _Allocator>
1439typename map<_Key, _Tp, _Compare, _Allocator>::__node_holder
Howard Hinnantac7e7482013-07-04 20:59:16 +00001440map<_Key, _Tp, _Compare, _Allocator>::__construct_node_with_key(const key_type& __k)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001441{
1442 __node_allocator& __na = __tree_.__node_alloc();
Howard Hinnantc834c512011-11-29 18:15:50 +00001443 __node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na));
Erik Pilkingtond3fe2992018-06-04 20:38:23 +00001444 __node_traits::construct(__na, _VSTD::addressof(__h->__value_.__get_value().first), __k);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001445 __h.get_deleter().__first_constructed = true;
Erik Pilkingtond3fe2992018-06-04 20:38:23 +00001446 __node_traits::construct(__na, _VSTD::addressof(__h->__value_.__get_value().second));
Howard Hinnantc51e1022010-05-11 19:42:16 +00001447 __h.get_deleter().__second_constructed = true;
Dimitry Andric830fb602015-08-19 06:43:33 +00001448 return _LIBCPP_EXPLICIT_MOVE(__h); // explicitly moved for C++03
Howard Hinnantc51e1022010-05-11 19:42:16 +00001449}
1450
Howard Hinnantc51e1022010-05-11 19:42:16 +00001451template <class _Key, class _Tp, class _Compare, class _Allocator>
1452_Tp&
1453map<_Key, _Tp, _Compare, _Allocator>::operator[](const key_type& __k)
1454{
Eric Fiseliercf8c0212017-01-05 06:06:18 +00001455 __parent_pointer __parent;
1456 __node_base_pointer& __child = __tree_.__find_equal(__parent, __k);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001457 __node_pointer __r = static_cast<__node_pointer>(__child);
1458 if (__child == nullptr)
1459 {
Howard Hinnantac7e7482013-07-04 20:59:16 +00001460 __node_holder __h = __construct_node_with_key(__k);
Howard Hinnant2d0046b2013-06-19 21:29:40 +00001461 __tree_.__insert_node_at(__parent, __child, static_cast<__node_base_pointer>(__h.get()));
Howard Hinnantc51e1022010-05-11 19:42:16 +00001462 __r = __h.release();
1463 }
Erik Pilkingtond3fe2992018-06-04 20:38:23 +00001464 return __r->__value_.__get_value().second;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001465}
1466
Eric Fiseliera85b1282017-04-18 21:08:06 +00001467#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00001468
1469template <class _Key, class _Tp, class _Compare, class _Allocator>
1470_Tp&
1471map<_Key, _Tp, _Compare, _Allocator>::at(const key_type& __k)
1472{
Eric Fiseliercf8c0212017-01-05 06:06:18 +00001473 __parent_pointer __parent;
1474 __node_base_pointer& __child = __tree_.__find_equal(__parent, __k);
Howard Hinnant72f73582010-08-11 17:04:31 +00001475#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00001476 if (__child == nullptr)
1477 throw out_of_range("map::at: key not found");
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001478#endif // _LIBCPP_NO_EXCEPTIONS
Erik Pilkingtond3fe2992018-06-04 20:38:23 +00001479 return static_cast<__node_pointer>(__child)->__value_.__get_value().second;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001480}
1481
1482template <class _Key, class _Tp, class _Compare, class _Allocator>
1483const _Tp&
1484map<_Key, _Tp, _Compare, _Allocator>::at(const key_type& __k) const
1485{
Eric Fiseliercf8c0212017-01-05 06:06:18 +00001486 __parent_pointer __parent;
1487 __node_base_pointer __child = __tree_.__find_equal(__parent, __k);
Howard Hinnant72f73582010-08-11 17:04:31 +00001488#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00001489 if (__child == nullptr)
1490 throw out_of_range("map::at: key not found");
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001491#endif // _LIBCPP_NO_EXCEPTIONS
Erik Pilkingtond3fe2992018-06-04 20:38:23 +00001492 return static_cast<__node_pointer>(__child)->__value_.__get_value().second;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001493}
1494
Howard Hinnantc51e1022010-05-11 19:42:16 +00001495
1496template <class _Key, class _Tp, class _Compare, class _Allocator>
Howard Hinnant756c69b2010-09-22 16:48:34 +00001497inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001498bool
1499operator==(const map<_Key, _Tp, _Compare, _Allocator>& __x,
1500 const map<_Key, _Tp, _Compare, _Allocator>& __y)
1501{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001502 return __x.size() == __y.size() && _VSTD::equal(__x.begin(), __x.end(), __y.begin());
Howard Hinnantc51e1022010-05-11 19:42:16 +00001503}
1504
1505template <class _Key, class _Tp, class _Compare, class _Allocator>
Howard Hinnant756c69b2010-09-22 16:48:34 +00001506inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001507bool
1508operator< (const map<_Key, _Tp, _Compare, _Allocator>& __x,
1509 const map<_Key, _Tp, _Compare, _Allocator>& __y)
1510{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001511 return _VSTD::lexicographical_compare(__x.begin(), __x.end(), __y.begin(), __y.end());
Howard Hinnantc51e1022010-05-11 19:42:16 +00001512}
1513
1514template <class _Key, class _Tp, class _Compare, class _Allocator>
Howard Hinnant756c69b2010-09-22 16:48:34 +00001515inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001516bool
1517operator!=(const map<_Key, _Tp, _Compare, _Allocator>& __x,
1518 const map<_Key, _Tp, _Compare, _Allocator>& __y)
1519{
1520 return !(__x == __y);
1521}
1522
1523template <class _Key, class _Tp, class _Compare, class _Allocator>
Howard Hinnant756c69b2010-09-22 16:48:34 +00001524inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001525bool
1526operator> (const map<_Key, _Tp, _Compare, _Allocator>& __x,
1527 const map<_Key, _Tp, _Compare, _Allocator>& __y)
1528{
1529 return __y < __x;
1530}
1531
1532template <class _Key, class _Tp, class _Compare, class _Allocator>
Howard Hinnant756c69b2010-09-22 16:48:34 +00001533inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001534bool
1535operator>=(const map<_Key, _Tp, _Compare, _Allocator>& __x,
1536 const map<_Key, _Tp, _Compare, _Allocator>& __y)
1537{
1538 return !(__x < __y);
1539}
1540
1541template <class _Key, class _Tp, class _Compare, class _Allocator>
Howard Hinnant756c69b2010-09-22 16:48:34 +00001542inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001543bool
1544operator<=(const map<_Key, _Tp, _Compare, _Allocator>& __x,
1545 const map<_Key, _Tp, _Compare, _Allocator>& __y)
1546{
1547 return !(__y < __x);
1548}
1549
1550template <class _Key, class _Tp, class _Compare, class _Allocator>
Howard Hinnant756c69b2010-09-22 16:48:34 +00001551inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001552void
1553swap(map<_Key, _Tp, _Compare, _Allocator>& __x,
1554 map<_Key, _Tp, _Compare, _Allocator>& __y)
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001555 _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
Howard Hinnantc51e1022010-05-11 19:42:16 +00001556{
1557 __x.swap(__y);
1558}
1559
1560template <class _Key, class _Tp, class _Compare = less<_Key>,
1561 class _Allocator = allocator<pair<const _Key, _Tp> > >
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +00001562class _LIBCPP_TEMPLATE_VIS multimap
Howard Hinnantc51e1022010-05-11 19:42:16 +00001563{
1564public:
1565 // types:
1566 typedef _Key key_type;
1567 typedef _Tp mapped_type;
1568 typedef pair<const key_type, mapped_type> value_type;
1569 typedef _Compare key_compare;
1570 typedef _Allocator allocator_type;
1571 typedef value_type& reference;
1572 typedef const value_type& const_reference;
1573
Marshall Clow5128cf32015-11-26 01:24:04 +00001574 static_assert((is_same<typename allocator_type::value_type, value_type>::value),
1575 "Allocator::value_type must be same type as value_type");
1576
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +00001577 class _LIBCPP_TEMPLATE_VIS value_compare
Howard Hinnantc51e1022010-05-11 19:42:16 +00001578 : public binary_function<value_type, value_type, bool>
1579 {
1580 friend class multimap;
1581 protected:
1582 key_compare comp;
1583
Howard Hinnant756c69b2010-09-22 16:48:34 +00001584 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001585 value_compare(key_compare c) : comp(c) {}
1586 public:
Howard Hinnant756c69b2010-09-22 16:48:34 +00001587 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001588 bool operator()(const value_type& __x, const value_type& __y) const
1589 {return comp(__x.first, __y.first);}
1590 };
1591
1592private:
Howard Hinnant2d0046b2013-06-19 21:29:40 +00001593
Howard Hinnant89f8b792013-09-30 19:08:22 +00001594 typedef _VSTD::__value_type<key_type, mapped_type> __value_type;
Howard Hinnant90b91592013-07-05 18:06:00 +00001595 typedef __map_value_compare<key_type, __value_type, key_compare> __vc;
Marshall Clow940e01c2015-04-07 05:21:38 +00001596 typedef typename __rebind_alloc_helper<allocator_traits<allocator_type>,
1597 __value_type>::type __allocator_type;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001598 typedef __tree<__value_type, __vc, __allocator_type> __base;
1599 typedef typename __base::__node_traits __node_traits;
1600 typedef allocator_traits<allocator_type> __alloc_traits;
1601
1602 __base __tree_;
1603
1604public:
1605 typedef typename __alloc_traits::pointer pointer;
1606 typedef typename __alloc_traits::const_pointer const_pointer;
1607 typedef typename __alloc_traits::size_type size_type;
1608 typedef typename __alloc_traits::difference_type difference_type;
1609 typedef __map_iterator<typename __base::iterator> iterator;
1610 typedef __map_const_iterator<typename __base::const_iterator> const_iterator;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001611 typedef _VSTD::reverse_iterator<iterator> reverse_iterator;
1612 typedef _VSTD::reverse_iterator<const_iterator> const_reverse_iterator;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001613
Erik Pilkingtonc37a3d82018-08-01 01:33:38 +00001614#if _LIBCPP_STD_VER > 14
1615 typedef __map_node_handle<typename __base::__node, allocator_type> node_type;
1616#endif
1617
Howard Hinnant756c69b2010-09-22 16:48:34 +00001618 _LIBCPP_INLINE_VISIBILITY
Marshall Clow7086a5a2014-03-10 04:50:10 +00001619 multimap()
1620 _NOEXCEPT_(
1621 is_nothrow_default_constructible<allocator_type>::value &&
1622 is_nothrow_default_constructible<key_compare>::value &&
1623 is_nothrow_copy_constructible<key_compare>::value)
1624 : __tree_(__vc(key_compare())) {}
1625
1626 _LIBCPP_INLINE_VISIBILITY
1627 explicit multimap(const key_compare& __comp)
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001628 _NOEXCEPT_(
1629 is_nothrow_default_constructible<allocator_type>::value &&
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001630 is_nothrow_copy_constructible<key_compare>::value)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001631 : __tree_(__vc(__comp)) {}
1632
Howard Hinnant756c69b2010-09-22 16:48:34 +00001633 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001634 explicit multimap(const key_compare& __comp, const allocator_type& __a)
Marshall Clow657cbc42016-08-17 05:58:40 +00001635 : __tree_(__vc(__comp), typename __base::allocator_type(__a)) {}
Howard Hinnantc51e1022010-05-11 19:42:16 +00001636
1637 template <class _InputIterator>
Howard Hinnant756c69b2010-09-22 16:48:34 +00001638 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001639 multimap(_InputIterator __f, _InputIterator __l,
1640 const key_compare& __comp = key_compare())
1641 : __tree_(__vc(__comp))
1642 {
1643 insert(__f, __l);
1644 }
1645
1646 template <class _InputIterator>
Howard Hinnant756c69b2010-09-22 16:48:34 +00001647 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001648 multimap(_InputIterator __f, _InputIterator __l,
1649 const key_compare& __comp, const allocator_type& __a)
Marshall Clow657cbc42016-08-17 05:58:40 +00001650 : __tree_(__vc(__comp), typename __base::allocator_type(__a))
Howard Hinnantc51e1022010-05-11 19:42:16 +00001651 {
1652 insert(__f, __l);
1653 }
1654
Marshall Clow300abfb2013-09-11 01:15:47 +00001655#if _LIBCPP_STD_VER > 11
1656 template <class _InputIterator>
Eric Fiseliercf8c0212017-01-05 06:06:18 +00001657 _LIBCPP_INLINE_VISIBILITY
Marshall Clow300abfb2013-09-11 01:15:47 +00001658 multimap(_InputIterator __f, _InputIterator __l, const allocator_type& __a)
1659 : multimap(__f, __l, key_compare(), __a) {}
1660#endif
1661
Howard Hinnant756c69b2010-09-22 16:48:34 +00001662 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001663 multimap(const multimap& __m)
1664 : __tree_(__m.__tree_.value_comp(),
1665 __alloc_traits::select_on_container_copy_construction(__m.__tree_.__alloc()))
1666 {
1667 insert(__m.begin(), __m.end());
1668 }
1669
Howard Hinnantd3a657f2011-07-01 19:24:36 +00001670 _LIBCPP_INLINE_VISIBILITY
1671 multimap& operator=(const multimap& __m)
1672 {
Marshall Clow476d3f42016-07-18 13:19:00 +00001673#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantd3a657f2011-07-01 19:24:36 +00001674 __tree_ = __m.__tree_;
Howard Hinnant2d0046b2013-06-19 21:29:40 +00001675#else
Marshall Clowdb3cfcb2014-02-08 04:03:14 +00001676 if (this != &__m) {
1677 __tree_.clear();
1678 __tree_.value_comp() = __m.__tree_.value_comp();
1679 __tree_.__copy_assign_alloc(__m.__tree_);
1680 insert(__m.begin(), __m.end());
1681 }
Howard Hinnant2d0046b2013-06-19 21:29:40 +00001682#endif
Howard Hinnantd3a657f2011-07-01 19:24:36 +00001683 return *this;
1684 }
1685
Eric Fiseliera85b1282017-04-18 21:08:06 +00001686#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00001687
Howard Hinnant756c69b2010-09-22 16:48:34 +00001688 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001689 multimap(multimap&& __m)
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001690 _NOEXCEPT_(is_nothrow_move_constructible<__base>::value)
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001691 : __tree_(_VSTD::move(__m.__tree_))
Howard Hinnantc51e1022010-05-11 19:42:16 +00001692 {
1693 }
1694
1695 multimap(multimap&& __m, const allocator_type& __a);
1696
Howard Hinnant756c69b2010-09-22 16:48:34 +00001697 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant33711792011-08-12 21:56:02 +00001698 multimap& operator=(multimap&& __m)
1699 _NOEXCEPT_(is_nothrow_move_assignable<__base>::value)
1700 {
1701 __tree_ = _VSTD::move(__m.__tree_);
1702 return *this;
1703 }
1704
Howard Hinnant33711792011-08-12 21:56:02 +00001705 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001706 multimap(initializer_list<value_type> __il, const key_compare& __comp = key_compare())
1707 : __tree_(__vc(__comp))
1708 {
1709 insert(__il.begin(), __il.end());
1710 }
1711
Howard Hinnant756c69b2010-09-22 16:48:34 +00001712 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001713 multimap(initializer_list<value_type> __il, const key_compare& __comp, const allocator_type& __a)
Marshall Clow657cbc42016-08-17 05:58:40 +00001714 : __tree_(__vc(__comp), typename __base::allocator_type(__a))
Howard Hinnantc51e1022010-05-11 19:42:16 +00001715 {
1716 insert(__il.begin(), __il.end());
1717 }
1718
Marshall Clow300abfb2013-09-11 01:15:47 +00001719#if _LIBCPP_STD_VER > 11
Eric Fiseliercf8c0212017-01-05 06:06:18 +00001720 _LIBCPP_INLINE_VISIBILITY
Marshall Clow300abfb2013-09-11 01:15:47 +00001721 multimap(initializer_list<value_type> __il, const allocator_type& __a)
1722 : multimap(__il, key_compare(), __a) {}
1723#endif
1724
Howard Hinnant756c69b2010-09-22 16:48:34 +00001725 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001726 multimap& operator=(initializer_list<value_type> __il)
1727 {
1728 __tree_.__assign_multi(__il.begin(), __il.end());
1729 return *this;
1730 }
Howard Hinnant33711792011-08-12 21:56:02 +00001731
Eric Fiseliera85b1282017-04-18 21:08:06 +00001732#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00001733
Howard Hinnant756c69b2010-09-22 16:48:34 +00001734 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001735 explicit multimap(const allocator_type& __a)
Marshall Clow657cbc42016-08-17 05:58:40 +00001736 : __tree_(typename __base::allocator_type(__a))
Howard Hinnantc51e1022010-05-11 19:42:16 +00001737 {
1738 }
1739
Howard Hinnant756c69b2010-09-22 16:48:34 +00001740 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001741 multimap(const multimap& __m, const allocator_type& __a)
Marshall Clow657cbc42016-08-17 05:58:40 +00001742 : __tree_(__m.__tree_.value_comp(), typename __base::allocator_type(__a))
Howard Hinnantc51e1022010-05-11 19:42:16 +00001743 {
1744 insert(__m.begin(), __m.end());
1745 }
1746
Howard Hinnant756c69b2010-09-22 16:48:34 +00001747 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001748 iterator begin() _NOEXCEPT {return __tree_.begin();}
Howard Hinnant756c69b2010-09-22 16:48:34 +00001749 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001750 const_iterator begin() const _NOEXCEPT {return __tree_.begin();}
Howard Hinnant756c69b2010-09-22 16:48:34 +00001751 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001752 iterator end() _NOEXCEPT {return __tree_.end();}
Howard Hinnant756c69b2010-09-22 16:48:34 +00001753 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001754 const_iterator end() const _NOEXCEPT {return __tree_.end();}
Howard Hinnantc51e1022010-05-11 19:42:16 +00001755
Howard Hinnant756c69b2010-09-22 16:48:34 +00001756 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001757 reverse_iterator rbegin() _NOEXCEPT {return reverse_iterator(end());}
Howard Hinnant756c69b2010-09-22 16:48:34 +00001758 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001759 const_reverse_iterator rbegin() const _NOEXCEPT
1760 {return const_reverse_iterator(end());}
Howard Hinnant756c69b2010-09-22 16:48:34 +00001761 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001762 reverse_iterator rend() _NOEXCEPT {return reverse_iterator(begin());}
Howard Hinnant756c69b2010-09-22 16:48:34 +00001763 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001764 const_reverse_iterator rend() const _NOEXCEPT
1765 {return const_reverse_iterator(begin());}
Howard Hinnantc51e1022010-05-11 19:42:16 +00001766
Howard Hinnant756c69b2010-09-22 16:48:34 +00001767 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001768 const_iterator cbegin() const _NOEXCEPT {return begin();}
Howard Hinnant756c69b2010-09-22 16:48:34 +00001769 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001770 const_iterator cend() const _NOEXCEPT {return end();}
Howard Hinnant756c69b2010-09-22 16:48:34 +00001771 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001772 const_reverse_iterator crbegin() const _NOEXCEPT {return rbegin();}
Howard Hinnant756c69b2010-09-22 16:48:34 +00001773 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001774 const_reverse_iterator crend() const _NOEXCEPT {return rend();}
Howard Hinnantc51e1022010-05-11 19:42:16 +00001775
Marshall Clow425f5752017-11-15 05:51:26 +00001776 _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001777 bool empty() const _NOEXCEPT {return __tree_.size() == 0;}
Howard Hinnant756c69b2010-09-22 16:48:34 +00001778 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001779 size_type size() const _NOEXCEPT {return __tree_.size();}
Howard Hinnant756c69b2010-09-22 16:48:34 +00001780 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001781 size_type max_size() const _NOEXCEPT {return __tree_.max_size();}
Howard Hinnantc51e1022010-05-11 19:42:16 +00001782
Howard Hinnant756c69b2010-09-22 16:48:34 +00001783 _LIBCPP_INLINE_VISIBILITY
Marshall Clow657cbc42016-08-17 05:58:40 +00001784 allocator_type get_allocator() const _NOEXCEPT {return allocator_type(__tree_.__alloc());}
Howard Hinnant756c69b2010-09-22 16:48:34 +00001785 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001786 key_compare key_comp() const {return __tree_.value_comp().key_comp();}
Howard Hinnant756c69b2010-09-22 16:48:34 +00001787 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001788 value_compare value_comp() const
1789 {return value_compare(__tree_.value_comp().key_comp());}
Howard Hinnantc51e1022010-05-11 19:42:16 +00001790
Eric Fiselierd06276b2016-03-31 02:15:15 +00001791#ifndef _LIBCPP_CXX03_LANG
Howard Hinnant74279a52010-09-04 23:28:19 +00001792
Howard Hinnant29eb9b82012-05-25 22:04:21 +00001793 template <class ..._Args>
Eric Fiselierd06276b2016-03-31 02:15:15 +00001794 _LIBCPP_INLINE_VISIBILITY
1795 iterator emplace(_Args&& ...__args) {
1796 return __tree_.__emplace_multi(_VSTD::forward<_Args>(__args)...);
1797 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00001798
Howard Hinnant29eb9b82012-05-25 22:04:21 +00001799 template <class ..._Args>
Eric Fiselierd06276b2016-03-31 02:15:15 +00001800 _LIBCPP_INLINE_VISIBILITY
1801 iterator emplace_hint(const_iterator __p, _Args&& ...__args) {
1802 return __tree_.__emplace_hint_multi(__p.__i_, _VSTD::forward<_Args>(__args)...);
1803 }
Howard Hinnant74279a52010-09-04 23:28:19 +00001804
Howard Hinnantc834c512011-11-29 18:15:50 +00001805 template <class _Pp,
1806 class = typename enable_if<is_constructible<value_type, _Pp>::value>::type>
Howard Hinnant756c69b2010-09-22 16:48:34 +00001807 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc834c512011-11-29 18:15:50 +00001808 iterator insert(_Pp&& __p)
1809 {return __tree_.__insert_multi(_VSTD::forward<_Pp>(__p));}
Howard Hinnantc51e1022010-05-11 19:42:16 +00001810
Howard Hinnantc834c512011-11-29 18:15:50 +00001811 template <class _Pp,
1812 class = typename enable_if<is_constructible<value_type, _Pp>::value>::type>
Howard Hinnant756c69b2010-09-22 16:48:34 +00001813 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc834c512011-11-29 18:15:50 +00001814 iterator insert(const_iterator __pos, _Pp&& __p)
1815 {return __tree_.__insert_multi(__pos.__i_, _VSTD::forward<_Pp>(__p));}
Howard Hinnantc51e1022010-05-11 19:42:16 +00001816
Eric Fiselierd6143132016-04-18 01:40:45 +00001817 _LIBCPP_INLINE_VISIBILITY
1818 iterator insert(value_type&& __v)
1819 {return __tree_.__insert_multi(_VSTD::move(__v));}
1820
1821 _LIBCPP_INLINE_VISIBILITY
1822 iterator insert(const_iterator __p, value_type&& __v)
1823 {return __tree_.__insert_multi(__p.__i_, _VSTD::move(__v));}
1824
Eric Fiseliera85b1282017-04-18 21:08:06 +00001825
1826 _LIBCPP_INLINE_VISIBILITY
1827 void insert(initializer_list<value_type> __il)
1828 {insert(__il.begin(), __il.end());}
1829
Eric Fiselierd06276b2016-03-31 02:15:15 +00001830#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00001831
Howard Hinnant756c69b2010-09-22 16:48:34 +00001832 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001833 iterator insert(const value_type& __v) {return __tree_.__insert_multi(__v);}
1834
Howard Hinnant756c69b2010-09-22 16:48:34 +00001835 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001836 iterator insert(const_iterator __p, const value_type& __v)
1837 {return __tree_.__insert_multi(__p.__i_, __v);}
1838
1839 template <class _InputIterator>
Howard Hinnant756c69b2010-09-22 16:48:34 +00001840 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001841 void insert(_InputIterator __f, _InputIterator __l)
1842 {
1843 for (const_iterator __e = cend(); __f != __l; ++__f)
1844 __tree_.__insert_multi(__e.__i_, *__f);
1845 }
1846
Howard Hinnant756c69b2010-09-22 16:48:34 +00001847 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001848 iterator erase(const_iterator __p) {return __tree_.erase(__p.__i_);}
Howard Hinnant756c69b2010-09-22 16:48:34 +00001849 _LIBCPP_INLINE_VISIBILITY
Marshall Clow22ea5b82015-05-10 13:35:00 +00001850 iterator erase(iterator __p) {return __tree_.erase(__p.__i_);}
1851 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001852 size_type erase(const key_type& __k) {return __tree_.__erase_multi(__k);}
Howard Hinnant756c69b2010-09-22 16:48:34 +00001853 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001854 iterator erase(const_iterator __f, const_iterator __l)
1855 {return __tree_.erase(__f.__i_, __l.__i_);}
Erik Pilkingtonc37a3d82018-08-01 01:33:38 +00001856
1857#if _LIBCPP_STD_VER > 14
1858 _LIBCPP_INLINE_VISIBILITY
1859 iterator insert(node_type&& __nh)
1860 {
1861 _LIBCPP_ASSERT(__nh.empty() || __nh.get_allocator() == get_allocator(),
1862 "node_type with incompatible allocator passed to multimap::insert()");
1863 return __tree_.template __node_handle_insert_multi<node_type>(
1864 _VSTD::move(__nh));
1865 }
1866 _LIBCPP_INLINE_VISIBILITY
1867 iterator insert(const_iterator __hint, node_type&& __nh)
1868 {
1869 _LIBCPP_ASSERT(__nh.empty() || __nh.get_allocator() == get_allocator(),
1870 "node_type with incompatible allocator passed to multimap::insert()");
1871 return __tree_.template __node_handle_insert_multi<node_type>(
1872 __hint.__i_, _VSTD::move(__nh));
1873 }
1874 _LIBCPP_INLINE_VISIBILITY
1875 node_type extract(key_type const& __key)
1876 {
1877 return __tree_.template __node_handle_extract<node_type>(__key);
1878 }
1879 _LIBCPP_INLINE_VISIBILITY
1880 node_type extract(const_iterator __it)
1881 {
1882 return __tree_.template __node_handle_extract<node_type>(
1883 __it.__i_);
1884 }
1885#endif
1886
Howard Hinnant756c69b2010-09-22 16:48:34 +00001887 _LIBCPP_INLINE_VISIBILITY
Marshall Clowde1312a2018-08-22 04:28:43 +00001888 void clear() _NOEXCEPT {__tree_.clear();}
Howard Hinnantc51e1022010-05-11 19:42:16 +00001889
Howard Hinnant756c69b2010-09-22 16:48:34 +00001890 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001891 void swap(multimap& __m)
1892 _NOEXCEPT_(__is_nothrow_swappable<__base>::value)
1893 {__tree_.swap(__m.__tree_);}
Howard Hinnantc51e1022010-05-11 19:42:16 +00001894
Howard Hinnant756c69b2010-09-22 16:48:34 +00001895 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001896 iterator find(const key_type& __k) {return __tree_.find(__k);}
Howard Hinnant756c69b2010-09-22 16:48:34 +00001897 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001898 const_iterator find(const key_type& __k) const {return __tree_.find(__k);}
Marshall Clowebb57322013-08-13 22:18:47 +00001899#if _LIBCPP_STD_VER > 11
1900 template <typename _K2>
1901 _LIBCPP_INLINE_VISIBILITY
1902 typename enable_if<__is_transparent<_Compare, _K2>::value,iterator>::type
1903 find(const _K2& __k) {return __tree_.find(__k);}
1904 template <typename _K2>
1905 _LIBCPP_INLINE_VISIBILITY
1906 typename enable_if<__is_transparent<_Compare, _K2>::value,const_iterator>::type
1907 find(const _K2& __k) const {return __tree_.find(__k);}
1908#endif
1909
Howard Hinnant756c69b2010-09-22 16:48:34 +00001910 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001911 size_type count(const key_type& __k) const
1912 {return __tree_.__count_multi(__k);}
Marshall Clowe6a5f522014-08-24 23:54:16 +00001913#if _LIBCPP_STD_VER > 11
1914 template <typename _K2>
1915 _LIBCPP_INLINE_VISIBILITY
1916 typename enable_if<__is_transparent<_Compare, _K2>::value,size_type>::type
Marshall Clow141e47b2015-06-30 18:15:41 +00001917 count(const _K2& __k) const {return __tree_.__count_multi(__k);}
Marshall Clowe6a5f522014-08-24 23:54:16 +00001918#endif
Howard Hinnant756c69b2010-09-22 16:48:34 +00001919 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001920 iterator lower_bound(const key_type& __k)
1921 {return __tree_.lower_bound(__k);}
Howard Hinnant756c69b2010-09-22 16:48:34 +00001922 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001923 const_iterator lower_bound(const key_type& __k) const
1924 {return __tree_.lower_bound(__k);}
Marshall Clowebb57322013-08-13 22:18:47 +00001925#if _LIBCPP_STD_VER > 11
1926 template <typename _K2>
1927 _LIBCPP_INLINE_VISIBILITY
1928 typename enable_if<__is_transparent<_Compare, _K2>::value,iterator>::type
1929 lower_bound(const _K2& __k) {return __tree_.lower_bound(__k);}
1930
1931 template <typename _K2>
1932 _LIBCPP_INLINE_VISIBILITY
1933 typename enable_if<__is_transparent<_Compare, _K2>::value,const_iterator>::type
1934 lower_bound(const _K2& __k) const {return __tree_.lower_bound(__k);}
1935#endif
1936
Howard Hinnant756c69b2010-09-22 16:48:34 +00001937 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001938 iterator upper_bound(const key_type& __k)
1939 {return __tree_.upper_bound(__k);}
Howard Hinnant756c69b2010-09-22 16:48:34 +00001940 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001941 const_iterator upper_bound(const key_type& __k) const
1942 {return __tree_.upper_bound(__k);}
Marshall Clowebb57322013-08-13 22:18:47 +00001943#if _LIBCPP_STD_VER > 11
1944 template <typename _K2>
1945 _LIBCPP_INLINE_VISIBILITY
1946 typename enable_if<__is_transparent<_Compare, _K2>::value,iterator>::type
1947 upper_bound(const _K2& __k) {return __tree_.upper_bound(__k);}
1948 template <typename _K2>
1949 _LIBCPP_INLINE_VISIBILITY
1950 typename enable_if<__is_transparent<_Compare, _K2>::value,const_iterator>::type
1951 upper_bound(const _K2& __k) const {return __tree_.upper_bound(__k);}
1952#endif
1953
Howard Hinnant756c69b2010-09-22 16:48:34 +00001954 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001955 pair<iterator,iterator> equal_range(const key_type& __k)
1956 {return __tree_.__equal_range_multi(__k);}
Howard Hinnant756c69b2010-09-22 16:48:34 +00001957 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001958 pair<const_iterator,const_iterator> equal_range(const key_type& __k) const
1959 {return __tree_.__equal_range_multi(__k);}
Marshall Clowebb57322013-08-13 22:18:47 +00001960#if _LIBCPP_STD_VER > 11
1961 template <typename _K2>
1962 _LIBCPP_INLINE_VISIBILITY
1963 typename enable_if<__is_transparent<_Compare, _K2>::value,pair<iterator,iterator>>::type
1964 equal_range(const _K2& __k) {return __tree_.__equal_range_multi(__k);}
1965 template <typename _K2>
1966 _LIBCPP_INLINE_VISIBILITY
1967 typename enable_if<__is_transparent<_Compare, _K2>::value,pair<const_iterator,const_iterator>>::type
1968 equal_range(const _K2& __k) const {return __tree_.__equal_range_multi(__k);}
1969#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00001970
1971private:
1972 typedef typename __base::__node __node;
1973 typedef typename __base::__node_allocator __node_allocator;
1974 typedef typename __base::__node_pointer __node_pointer;
Eric Fiseliera92b0732016-02-20 07:12:17 +00001975
Howard Hinnantc834c512011-11-29 18:15:50 +00001976 typedef __map_node_destructor<__node_allocator> _Dp;
1977 typedef unique_ptr<__node, _Dp> __node_holder;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001978};
1979
Eric Fiselierd06276b2016-03-31 02:15:15 +00001980#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00001981template <class _Key, class _Tp, class _Compare, class _Allocator>
1982multimap<_Key, _Tp, _Compare, _Allocator>::multimap(multimap&& __m, const allocator_type& __a)
Marshall Clow657cbc42016-08-17 05:58:40 +00001983 : __tree_(_VSTD::move(__m.__tree_), typename __base::allocator_type(__a))
Howard Hinnantc51e1022010-05-11 19:42:16 +00001984{
1985 if (__a != __m.get_allocator())
1986 {
1987 const_iterator __e = cend();
1988 while (!__m.empty())
1989 __tree_.__insert_multi(__e.__i_,
Erik Pilkingtond3fe2992018-06-04 20:38:23 +00001990 _VSTD::move(__m.__tree_.remove(__m.begin().__i_)->__value_.__move()));
Howard Hinnantc51e1022010-05-11 19:42:16 +00001991 }
1992}
Eric Fiselierd06276b2016-03-31 02:15:15 +00001993#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00001994
1995template <class _Key, class _Tp, class _Compare, class _Allocator>
Howard Hinnant756c69b2010-09-22 16:48:34 +00001996inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001997bool
1998operator==(const multimap<_Key, _Tp, _Compare, _Allocator>& __x,
1999 const multimap<_Key, _Tp, _Compare, _Allocator>& __y)
2000{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00002001 return __x.size() == __y.size() && _VSTD::equal(__x.begin(), __x.end(), __y.begin());
Howard Hinnantc51e1022010-05-11 19:42:16 +00002002}
2003
2004template <class _Key, class _Tp, class _Compare, class _Allocator>
Howard Hinnant756c69b2010-09-22 16:48:34 +00002005inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002006bool
2007operator< (const multimap<_Key, _Tp, _Compare, _Allocator>& __x,
2008 const multimap<_Key, _Tp, _Compare, _Allocator>& __y)
2009{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00002010 return _VSTD::lexicographical_compare(__x.begin(), __x.end(), __y.begin(), __y.end());
Howard Hinnantc51e1022010-05-11 19:42:16 +00002011}
2012
2013template <class _Key, class _Tp, class _Compare, class _Allocator>
Howard Hinnant756c69b2010-09-22 16:48:34 +00002014inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002015bool
2016operator!=(const multimap<_Key, _Tp, _Compare, _Allocator>& __x,
2017 const multimap<_Key, _Tp, _Compare, _Allocator>& __y)
2018{
2019 return !(__x == __y);
2020}
2021
2022template <class _Key, class _Tp, class _Compare, class _Allocator>
Howard Hinnant756c69b2010-09-22 16:48:34 +00002023inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002024bool
2025operator> (const multimap<_Key, _Tp, _Compare, _Allocator>& __x,
2026 const multimap<_Key, _Tp, _Compare, _Allocator>& __y)
2027{
2028 return __y < __x;
2029}
2030
2031template <class _Key, class _Tp, class _Compare, class _Allocator>
Howard Hinnant756c69b2010-09-22 16:48:34 +00002032inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002033bool
2034operator>=(const multimap<_Key, _Tp, _Compare, _Allocator>& __x,
2035 const multimap<_Key, _Tp, _Compare, _Allocator>& __y)
2036{
2037 return !(__x < __y);
2038}
2039
2040template <class _Key, class _Tp, class _Compare, class _Allocator>
Howard Hinnant756c69b2010-09-22 16:48:34 +00002041inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002042bool
2043operator<=(const multimap<_Key, _Tp, _Compare, _Allocator>& __x,
2044 const multimap<_Key, _Tp, _Compare, _Allocator>& __y)
2045{
2046 return !(__y < __x);
2047}
2048
2049template <class _Key, class _Tp, class _Compare, class _Allocator>
Howard Hinnant756c69b2010-09-22 16:48:34 +00002050inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002051void
2052swap(multimap<_Key, _Tp, _Compare, _Allocator>& __x,
2053 multimap<_Key, _Tp, _Compare, _Allocator>& __y)
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00002054 _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
Howard Hinnantc51e1022010-05-11 19:42:16 +00002055{
2056 __x.swap(__y);
2057}
2058
2059_LIBCPP_END_NAMESPACE_STD
2060
2061#endif // _LIBCPP_MAP