blob: 7654a8fc284776e81cd4238dfe3481b3d5544e71 [file] [log] [blame]
Howard Hinnantc51e1022010-05-11 19:42:16 +00001// -*- C++ -*-
Louis Dionne9bd93882021-11-17 16:25:01 -05002//===----------------------------------------------------------------------===//
Howard Hinnantc51e1022010-05-11 19:42:16 +00003//
Chandler Carruthd2012102019-01-19 10:56:40 +00004// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
5// See https://llvm.org/LICENSE.txt for license information.
6// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
Howard Hinnantc51e1022010-05-11 19:42:16 +00007//
8//===----------------------------------------------------------------------===//
9
10#ifndef _LIBCPP_MAP
11#define _LIBCPP_MAP
12
13/*
14
15 map synopsis
16
17namespace std
18{
19
20template <class Key, class T, class Compare = less<Key>,
21 class Allocator = allocator<pair<const Key, T>>>
22class map
23{
24public:
25 // types:
26 typedef Key key_type;
27 typedef T mapped_type;
28 typedef pair<const key_type, mapped_type> value_type;
29 typedef Compare key_compare;
30 typedef Allocator allocator_type;
31 typedef typename allocator_type::reference reference;
32 typedef typename allocator_type::const_reference const_reference;
33 typedef typename allocator_type::pointer pointer;
34 typedef typename allocator_type::const_pointer const_pointer;
35 typedef typename allocator_type::size_type size_type;
36 typedef typename allocator_type::difference_type difference_type;
37
38 typedef implementation-defined iterator;
39 typedef implementation-defined const_iterator;
40 typedef std::reverse_iterator<iterator> reverse_iterator;
41 typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
Erik Pilkingtonc37a3d82018-08-01 01:33:38 +000042 typedef unspecified node_type; // C++17
43 typedef INSERT_RETURN_TYPE<iterator, node_type> insert_return_type; // C++17
Howard Hinnantc51e1022010-05-11 19:42:16 +000044
45 class value_compare
Howard Hinnantc51e1022010-05-11 19:42:16 +000046 {
47 friend class map;
48 protected:
49 key_compare comp;
50
51 value_compare(key_compare c);
52 public:
Arthur O'Dwyerf5486c82021-05-25 14:34:18 -040053 typedef bool result_type; // deprecated in C++17, removed in C++20
54 typedef value_type first_argument_type; // deprecated in C++17, removed in C++20
55 typedef value_type second_argument_type; // deprecated in C++17, removed in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +000056 bool operator()(const value_type& x, const value_type& y) const;
57 };
58
59 // construct/copy/destroy:
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +000060 map()
61 noexcept(
62 is_nothrow_default_constructible<allocator_type>::value &&
63 is_nothrow_default_constructible<key_compare>::value &&
64 is_nothrow_copy_constructible<key_compare>::value);
Howard Hinnantc51e1022010-05-11 19:42:16 +000065 explicit map(const key_compare& comp);
66 map(const key_compare& comp, const allocator_type& a);
67 template <class InputIterator>
68 map(InputIterator first, InputIterator last,
69 const key_compare& comp = key_compare());
70 template <class InputIterator>
71 map(InputIterator first, InputIterator last,
72 const key_compare& comp, const allocator_type& a);
73 map(const map& m);
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +000074 map(map&& m)
75 noexcept(
76 is_nothrow_move_constructible<allocator_type>::value &&
77 is_nothrow_move_constructible<key_compare>::value);
Howard Hinnantc51e1022010-05-11 19:42:16 +000078 explicit map(const allocator_type& a);
79 map(const map& m, const allocator_type& a);
80 map(map&& m, const allocator_type& a);
81 map(initializer_list<value_type> il, const key_compare& comp = key_compare());
82 map(initializer_list<value_type> il, const key_compare& comp, const allocator_type& a);
Marshall Clow300abfb2013-09-11 01:15:47 +000083 template <class InputIterator>
84 map(InputIterator first, InputIterator last, const allocator_type& a)
85 : map(first, last, Compare(), a) {} // C++14
86 map(initializer_list<value_type> il, const allocator_type& a)
87 : map(il, Compare(), a) {} // C++14
88 ~map();
Howard Hinnantc51e1022010-05-11 19:42:16 +000089
90 map& operator=(const map& m);
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +000091 map& operator=(map&& m)
92 noexcept(
93 allocator_type::propagate_on_container_move_assignment::value &&
94 is_nothrow_move_assignable<allocator_type>::value &&
Howard Hinnantf95f4f52011-06-04 15:22:34 +000095 is_nothrow_move_assignable<key_compare>::value);
Howard Hinnantc51e1022010-05-11 19:42:16 +000096 map& operator=(initializer_list<value_type> il);
97
98 // iterators:
Howard Hinnantf95f4f52011-06-04 15:22:34 +000099 iterator begin() noexcept;
100 const_iterator begin() const noexcept;
101 iterator end() noexcept;
102 const_iterator end() const noexcept;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000103
Howard Hinnantf95f4f52011-06-04 15:22:34 +0000104 reverse_iterator rbegin() noexcept;
105 const_reverse_iterator rbegin() const noexcept;
106 reverse_iterator rend() noexcept;
107 const_reverse_iterator rend() const noexcept;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000108
Howard Hinnantf95f4f52011-06-04 15:22:34 +0000109 const_iterator cbegin() const noexcept;
110 const_iterator cend() const noexcept;
111 const_reverse_iterator crbegin() const noexcept;
112 const_reverse_iterator crend() const noexcept;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000113
114 // capacity:
Howard Hinnantf95f4f52011-06-04 15:22:34 +0000115 bool empty() const noexcept;
116 size_type size() const noexcept;
117 size_type max_size() const noexcept;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000118
119 // element access:
120 mapped_type& operator[](const key_type& k);
121 mapped_type& operator[](key_type&& k);
122
123 mapped_type& at(const key_type& k);
124 const mapped_type& at(const key_type& k) const;
125
126 // modifiers:
127 template <class... Args>
128 pair<iterator, bool> emplace(Args&&... args);
129 template <class... Args>
130 iterator emplace_hint(const_iterator position, Args&&... args);
131 pair<iterator, bool> insert(const value_type& v);
Marshall Clowd430d022016-01-05 19:32:41 +0000132 pair<iterator, bool> insert( value_type&& v); // C++17
Howard Hinnantc51e1022010-05-11 19:42:16 +0000133 template <class P>
134 pair<iterator, bool> insert(P&& p);
135 iterator insert(const_iterator position, const value_type& v);
Marshall Clowd430d022016-01-05 19:32:41 +0000136 iterator insert(const_iterator position, value_type&& v); // C++17
Howard Hinnantc51e1022010-05-11 19:42:16 +0000137 template <class P>
138 iterator insert(const_iterator position, P&& p);
139 template <class InputIterator>
140 void insert(InputIterator first, InputIterator last);
141 void insert(initializer_list<value_type> il);
142
Erik Pilkingtonc37a3d82018-08-01 01:33:38 +0000143 node_type extract(const_iterator position); // C++17
144 node_type extract(const key_type& x); // C++17
145 insert_return_type insert(node_type&& nh); // C++17
146 iterator insert(const_iterator hint, node_type&& nh); // C++17
147
Marshall Clow3223db82015-07-07 03:37:33 +0000148 template <class... Args>
149 pair<iterator, bool> try_emplace(const key_type& k, Args&&... args); // C++17
150 template <class... Args>
151 pair<iterator, bool> try_emplace(key_type&& k, Args&&... args); // C++17
152 template <class... Args>
153 iterator try_emplace(const_iterator hint, const key_type& k, Args&&... args); // C++17
154 template <class... Args>
155 iterator try_emplace(const_iterator hint, key_type&& k, Args&&... args); // C++17
156 template <class M>
157 pair<iterator, bool> insert_or_assign(const key_type& k, M&& obj); // C++17
158 template <class M>
159 pair<iterator, bool> insert_or_assign(key_type&& k, M&& obj); // C++17
160 template <class M>
161 iterator insert_or_assign(const_iterator hint, const key_type& k, M&& obj); // C++17
162 template <class M>
163 iterator insert_or_assign(const_iterator hint, key_type&& k, M&& obj); // C++17
164
Howard Hinnantc51e1022010-05-11 19:42:16 +0000165 iterator erase(const_iterator position);
Marshall Clow22ea5b82015-05-10 13:35:00 +0000166 iterator erase(iterator position); // C++14
Howard Hinnantc51e1022010-05-11 19:42:16 +0000167 size_type erase(const key_type& k);
168 iterator erase(const_iterator first, const_iterator last);
Howard Hinnantf95f4f52011-06-04 15:22:34 +0000169 void clear() noexcept;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000170
Erik Pilkington82a65ad2018-10-31 17:31:35 +0000171 template<class C2>
172 void merge(map<Key, T, C2, Allocator>& source); // C++17
173 template<class C2>
174 void merge(map<Key, T, C2, Allocator>&& source); // C++17
175 template<class C2>
176 void merge(multimap<Key, T, C2, Allocator>& source); // C++17
177 template<class C2>
178 void merge(multimap<Key, T, C2, Allocator>&& source); // C++17
179
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +0000180 void swap(map& m)
Marshall Clow8982dcd2015-07-13 20:04:56 +0000181 noexcept(allocator_traits<allocator_type>::is_always_equal::value &&
Eric Fiselier6bfed252016-04-21 23:38:59 +0000182 is_nothrow_swappable<key_compare>::value); // C++17
Howard Hinnantc51e1022010-05-11 19:42:16 +0000183
184 // observers:
Howard Hinnantf95f4f52011-06-04 15:22:34 +0000185 allocator_type get_allocator() const noexcept;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000186 key_compare key_comp() const;
187 value_compare value_comp() const;
188
189 // map operations:
190 iterator find(const key_type& k);
191 const_iterator find(const key_type& k) const;
Marshall Clowebb57322013-08-13 22:18:47 +0000192 template<typename K>
193 iterator find(const K& x); // C++14
194 template<typename K>
195 const_iterator find(const K& x) const; // C++14
Marek Kurdejd7e019e2021-04-13 17:10:55 +0200196
Marshall Clowebb57322013-08-13 22:18:47 +0000197 template<typename K>
Marshall Clowe6a5f522014-08-24 23:54:16 +0000198 size_type count(const K& x) const; // C++14
Howard Hinnantc51e1022010-05-11 19:42:16 +0000199 size_type count(const key_type& k) const;
Marek Kurdejd7e019e2021-04-13 17:10:55 +0200200
201 bool contains(const key_type& x) const; // C++20
202 template<class K> bool contains(const K& x) const; // C++20
203
Howard Hinnantc51e1022010-05-11 19:42:16 +0000204 iterator lower_bound(const key_type& k);
205 const_iterator lower_bound(const key_type& k) const;
Marshall Clowebb57322013-08-13 22:18:47 +0000206 template<typename K>
207 iterator lower_bound(const K& x); // C++14
208 template<typename K>
209 const_iterator lower_bound(const K& x) const; // C++14
210
Howard Hinnantc51e1022010-05-11 19:42:16 +0000211 iterator upper_bound(const key_type& k);
212 const_iterator upper_bound(const key_type& k) const;
Marshall Clowebb57322013-08-13 22:18:47 +0000213 template<typename K>
214 iterator upper_bound(const K& x); // C++14
215 template<typename K>
216 const_iterator upper_bound(const K& x) const; // C++14
217
Howard Hinnantc51e1022010-05-11 19:42:16 +0000218 pair<iterator,iterator> equal_range(const key_type& k);
219 pair<const_iterator,const_iterator> equal_range(const key_type& k) const;
Marshall Clowebb57322013-08-13 22:18:47 +0000220 template<typename K>
221 pair<iterator,iterator> equal_range(const K& x); // C++14
222 template<typename K>
223 pair<const_iterator,const_iterator> equal_range(const K& x) const; // C++14
Howard Hinnantc51e1022010-05-11 19:42:16 +0000224};
225
Konstantin Varlamov53b543c2021-11-09 09:21:02 -0800226template <class InputIterator,
227 class Compare = less<iter_key_t<InputIterator>>,
228 class Allocator = allocator<iter_to_alloc_t<InputIterator>>>
229map(InputIterator, InputIterator, Compare = Compare(), Allocator = Allocator())
230 -> map<iter_key_t<InputIterator>, iter_val_t<InputIterator>, Compare, Allocator>; // C++17
231
232template<class Key, class T, class Compare = less<Key>,
233 class Allocator = allocator<pair<const Key, T>>>
234map(initializer_list<pair<const Key, T>>, Compare = Compare(), Allocator = Allocator())
235 -> map<Key, T, Compare, Allocator>; // C++17
236
237template <class InputIterator, class Allocator>
238map(InputIterator, InputIterator, Allocator)
239 -> map<iter_key_t<InputIterator>, iter_val_t<InputIterator>, less<iter_key_t<InputIterator>>,
240 Allocator>; // C++17
241
242template<class Key, class T, class Allocator>
243map(initializer_list<pair<const Key, T>>, Allocator) -> map<Key, T, less<Key>, Allocator>; // C++17
244
Howard Hinnantc51e1022010-05-11 19:42:16 +0000245template <class Key, class T, class Compare, class Allocator>
246bool
247operator==(const map<Key, T, Compare, Allocator>& x,
248 const map<Key, T, Compare, Allocator>& y);
249
250template <class Key, class T, class Compare, class Allocator>
251bool
252operator< (const map<Key, T, Compare, Allocator>& x,
253 const map<Key, T, Compare, Allocator>& y);
254
255template <class Key, class T, class Compare, class Allocator>
256bool
257operator!=(const map<Key, T, Compare, Allocator>& x,
258 const map<Key, T, Compare, Allocator>& y);
259
260template <class Key, class T, class Compare, class Allocator>
261bool
262operator> (const map<Key, T, Compare, Allocator>& x,
263 const map<Key, T, Compare, Allocator>& y);
264
265template <class Key, class T, class Compare, class Allocator>
266bool
267operator>=(const map<Key, T, Compare, Allocator>& x,
268 const map<Key, T, Compare, Allocator>& y);
269
270template <class Key, class T, class Compare, class Allocator>
271bool
272operator<=(const map<Key, T, Compare, Allocator>& x,
273 const map<Key, T, Compare, Allocator>& y);
274
275// specialized algorithms:
276template <class Key, class T, class Compare, class Allocator>
277void
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +0000278swap(map<Key, T, Compare, Allocator>& x, map<Key, T, Compare, Allocator>& y)
279 noexcept(noexcept(x.swap(y)));
Howard Hinnantc51e1022010-05-11 19:42:16 +0000280
Marshall Clow29b53f22018-12-14 18:49:35 +0000281template <class Key, class T, class Compare, class Allocator, class Predicate>
Marek Kurdeja98b1412020-05-02 13:58:03 +0200282typename map<Key, T, Compare, Allocator>::size_type
283erase_if(map<Key, T, Compare, Allocator>& c, Predicate pred); // C++20
Marshall Clow29b53f22018-12-14 18:49:35 +0000284
285
Howard Hinnantc51e1022010-05-11 19:42:16 +0000286template <class Key, class T, class Compare = less<Key>,
287 class Allocator = allocator<pair<const Key, T>>>
288class multimap
289{
290public:
291 // types:
292 typedef Key key_type;
293 typedef T mapped_type;
294 typedef pair<const key_type,mapped_type> value_type;
295 typedef Compare key_compare;
296 typedef Allocator allocator_type;
297 typedef typename allocator_type::reference reference;
298 typedef typename allocator_type::const_reference const_reference;
299 typedef typename allocator_type::size_type size_type;
300 typedef typename allocator_type::difference_type difference_type;
301 typedef typename allocator_type::pointer pointer;
302 typedef typename allocator_type::const_pointer const_pointer;
303
304 typedef implementation-defined iterator;
305 typedef implementation-defined const_iterator;
306 typedef std::reverse_iterator<iterator> reverse_iterator;
307 typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
Erik Pilkingtonc37a3d82018-08-01 01:33:38 +0000308 typedef unspecified node_type; // C++17
Howard Hinnantc51e1022010-05-11 19:42:16 +0000309
310 class value_compare
Howard Hinnantc51e1022010-05-11 19:42:16 +0000311 {
312 friend class multimap;
313 protected:
314 key_compare comp;
315 value_compare(key_compare c);
316 public:
Arthur O'Dwyerf5486c82021-05-25 14:34:18 -0400317 typedef bool result_type; // deprecated in C++17, removed in C++20
318 typedef value_type first_argument_type; // deprecated in C++17, removed in C++20
319 typedef value_type second_argument_type; // deprecated in C++17, removed in C++20
Howard Hinnantc51e1022010-05-11 19:42:16 +0000320 bool operator()(const value_type& x, const value_type& y) const;
321 };
322
323 // construct/copy/destroy:
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +0000324 multimap()
325 noexcept(
326 is_nothrow_default_constructible<allocator_type>::value &&
327 is_nothrow_default_constructible<key_compare>::value &&
328 is_nothrow_copy_constructible<key_compare>::value);
329 explicit multimap(const key_compare& comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000330 multimap(const key_compare& comp, const allocator_type& a);
331 template <class InputIterator>
332 multimap(InputIterator first, InputIterator last, const key_compare& comp);
333 template <class InputIterator>
334 multimap(InputIterator first, InputIterator last, const key_compare& comp,
335 const allocator_type& a);
336 multimap(const multimap& m);
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +0000337 multimap(multimap&& m)
338 noexcept(
339 is_nothrow_move_constructible<allocator_type>::value &&
340 is_nothrow_move_constructible<key_compare>::value);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000341 explicit multimap(const allocator_type& a);
342 multimap(const multimap& m, const allocator_type& a);
343 multimap(multimap&& m, const allocator_type& a);
344 multimap(initializer_list<value_type> il, const key_compare& comp = key_compare());
345 multimap(initializer_list<value_type> il, const key_compare& comp,
346 const allocator_type& a);
Marshall Clow300abfb2013-09-11 01:15:47 +0000347 template <class InputIterator>
348 multimap(InputIterator first, InputIterator last, const allocator_type& a)
349 : multimap(first, last, Compare(), a) {} // C++14
350 multimap(initializer_list<value_type> il, const allocator_type& a)
351 : multimap(il, Compare(), a) {} // C++14
Howard Hinnantc51e1022010-05-11 19:42:16 +0000352 ~multimap();
353
354 multimap& operator=(const multimap& m);
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +0000355 multimap& operator=(multimap&& m)
356 noexcept(
357 allocator_type::propagate_on_container_move_assignment::value &&
358 is_nothrow_move_assignable<allocator_type>::value &&
Howard Hinnantf95f4f52011-06-04 15:22:34 +0000359 is_nothrow_move_assignable<key_compare>::value);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000360 multimap& operator=(initializer_list<value_type> il);
361
362 // iterators:
Howard Hinnantf95f4f52011-06-04 15:22:34 +0000363 iterator begin() noexcept;
364 const_iterator begin() const noexcept;
365 iterator end() noexcept;
366 const_iterator end() const noexcept;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000367
Howard Hinnantf95f4f52011-06-04 15:22:34 +0000368 reverse_iterator rbegin() noexcept;
369 const_reverse_iterator rbegin() const noexcept;
370 reverse_iterator rend() noexcept;
371 const_reverse_iterator rend() const noexcept;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000372
Howard Hinnantf95f4f52011-06-04 15:22:34 +0000373 const_iterator cbegin() const noexcept;
374 const_iterator cend() const noexcept;
375 const_reverse_iterator crbegin() const noexcept;
376 const_reverse_iterator crend() const noexcept;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000377
378 // capacity:
Howard Hinnantf95f4f52011-06-04 15:22:34 +0000379 bool empty() const noexcept;
380 size_type size() const noexcept;
381 size_type max_size() const noexcept;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000382
383 // modifiers:
384 template <class... Args>
385 iterator emplace(Args&&... args);
386 template <class... Args>
387 iterator emplace_hint(const_iterator position, Args&&... args);
388 iterator insert(const value_type& v);
Marshall Clowd430d022016-01-05 19:32:41 +0000389 iterator insert( value_type&& v); // C++17
Howard Hinnantc51e1022010-05-11 19:42:16 +0000390 template <class P>
391 iterator insert(P&& p);
392 iterator insert(const_iterator position, const value_type& v);
Marshall Clowd430d022016-01-05 19:32:41 +0000393 iterator insert(const_iterator position, value_type&& v); // C++17
Howard Hinnantc51e1022010-05-11 19:42:16 +0000394 template <class P>
395 iterator insert(const_iterator position, P&& p);
396 template <class InputIterator>
397 void insert(InputIterator first, InputIterator last);
398 void insert(initializer_list<value_type> il);
399
Erik Pilkingtonc37a3d82018-08-01 01:33:38 +0000400 node_type extract(const_iterator position); // C++17
401 node_type extract(const key_type& x); // C++17
402 iterator insert(node_type&& nh); // C++17
403 iterator insert(const_iterator hint, node_type&& nh); // C++17
404
Howard Hinnantc51e1022010-05-11 19:42:16 +0000405 iterator erase(const_iterator position);
Marshall Clow22ea5b82015-05-10 13:35:00 +0000406 iterator erase(iterator position); // C++14
Howard Hinnantc51e1022010-05-11 19:42:16 +0000407 size_type erase(const key_type& k);
408 iterator erase(const_iterator first, const_iterator last);
Howard Hinnantf95f4f52011-06-04 15:22:34 +0000409 void clear() noexcept;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000410
Erik Pilkington82a65ad2018-10-31 17:31:35 +0000411 template<class C2>
412 void merge(multimap<Key, T, C2, Allocator>& source); // C++17
413 template<class C2>
414 void merge(multimap<Key, T, C2, Allocator>&& source); // C++17
415 template<class C2>
416 void merge(map<Key, T, C2, Allocator>& source); // C++17
417 template<class C2>
418 void merge(map<Key, T, C2, Allocator>&& source); // C++17
419
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +0000420 void swap(multimap& m)
Marshall Clow8982dcd2015-07-13 20:04:56 +0000421 noexcept(allocator_traits<allocator_type>::is_always_equal::value &&
Eric Fiselier6bfed252016-04-21 23:38:59 +0000422 is_nothrow_swappable<key_compare>::value); // C++17
Howard Hinnantc51e1022010-05-11 19:42:16 +0000423
424 // observers:
Howard Hinnantf95f4f52011-06-04 15:22:34 +0000425 allocator_type get_allocator() const noexcept;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000426 key_compare key_comp() const;
427 value_compare value_comp() const;
428
429 // map operations:
430 iterator find(const key_type& k);
431 const_iterator find(const key_type& k) const;
Marshall Clowebb57322013-08-13 22:18:47 +0000432 template<typename K>
433 iterator find(const K& x); // C++14
434 template<typename K>
435 const_iterator find(const K& x) const; // C++14
Marek Kurdejd7e019e2021-04-13 17:10:55 +0200436
Marshall Clowebb57322013-08-13 22:18:47 +0000437 template<typename K>
Marshall Clowe6a5f522014-08-24 23:54:16 +0000438 size_type count(const K& x) const; // C++14
Howard Hinnantc51e1022010-05-11 19:42:16 +0000439 size_type count(const key_type& k) const;
Marek Kurdejd7e019e2021-04-13 17:10:55 +0200440
441 bool contains(const key_type& x) const; // C++20
442 template<class K> bool contains(const K& x) const; // C++20
443
Howard Hinnantc51e1022010-05-11 19:42:16 +0000444 iterator lower_bound(const key_type& k);
445 const_iterator lower_bound(const key_type& k) const;
Marshall Clowebb57322013-08-13 22:18:47 +0000446 template<typename K>
447 iterator lower_bound(const K& x); // C++14
448 template<typename K>
449 const_iterator lower_bound(const K& x) const; // C++14
450
Howard Hinnantc51e1022010-05-11 19:42:16 +0000451 iterator upper_bound(const key_type& k);
452 const_iterator upper_bound(const key_type& k) const;
Marshall Clowebb57322013-08-13 22:18:47 +0000453 template<typename K>
454 iterator upper_bound(const K& x); // C++14
455 template<typename K>
456 const_iterator upper_bound(const K& x) const; // C++14
457
Howard Hinnantc51e1022010-05-11 19:42:16 +0000458 pair<iterator,iterator> equal_range(const key_type& k);
459 pair<const_iterator,const_iterator> equal_range(const key_type& k) const;
Marshall Clowebb57322013-08-13 22:18:47 +0000460 template<typename K>
461 pair<iterator,iterator> equal_range(const K& x); // C++14
462 template<typename K>
463 pair<const_iterator,const_iterator> equal_range(const K& x) const; // C++14
Howard Hinnantc51e1022010-05-11 19:42:16 +0000464};
465
Konstantin Varlamov53b543c2021-11-09 09:21:02 -0800466template <class InputIterator,
467 class Compare = less<iter_key_t<InputIterator>>,
468 class Allocator = allocator<iter_to_alloc_t<InputIterator>>>
469multimap(InputIterator, InputIterator, Compare = Compare(), Allocator = Allocator())
470 -> multimap<iter_key_t<InputIterator>, iter_val_t<InputIterator>, Compare, Allocator>; // C++17
471
472template<class Key, class T, class Compare = less<Key>,
473 class Allocator = allocator<pair<const Key, T>>>
474multimap(initializer_list<pair<const Key, T>>, Compare = Compare(), Allocator = Allocator())
475 -> multimap<Key, T, Compare, Allocator>; // C++17
476
477template <class InputIterator, class Allocator>
478multimap(InputIterator, InputIterator, Allocator)
479 -> multimap<iter_key_t<InputIterator>, iter_val_t<InputIterator>,
480 less<iter_key_t<InputIterator>>, Allocator>; // C++17
481
482template<class Key, class T, class Allocator>
483multimap(initializer_list<pair<const Key, T>>, Allocator)
484 -> multimap<Key, T, less<Key>, Allocator>; // C++17
485
Howard Hinnantc51e1022010-05-11 19:42:16 +0000486template <class Key, class T, class Compare, class Allocator>
487bool
488operator==(const multimap<Key, T, Compare, Allocator>& x,
489 const multimap<Key, T, Compare, Allocator>& y);
490
491template <class Key, class T, class Compare, class Allocator>
492bool
493operator< (const multimap<Key, T, Compare, Allocator>& x,
494 const multimap<Key, T, Compare, Allocator>& y);
495
496template <class Key, class T, class Compare, class Allocator>
497bool
498operator!=(const multimap<Key, T, Compare, Allocator>& x,
499 const multimap<Key, T, Compare, Allocator>& y);
500
501template <class Key, class T, class Compare, class Allocator>
502bool
503operator> (const multimap<Key, T, Compare, Allocator>& x,
504 const multimap<Key, T, Compare, Allocator>& y);
505
506template <class Key, class T, class Compare, class Allocator>
507bool
508operator>=(const multimap<Key, T, Compare, Allocator>& x,
509 const multimap<Key, T, Compare, Allocator>& y);
510
511template <class Key, class T, class Compare, class Allocator>
512bool
513operator<=(const multimap<Key, T, Compare, Allocator>& x,
514 const multimap<Key, T, Compare, Allocator>& y);
515
516// specialized algorithms:
517template <class Key, class T, class Compare, class Allocator>
518void
519swap(multimap<Key, T, Compare, Allocator>& x,
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +0000520 multimap<Key, T, Compare, Allocator>& y)
521 noexcept(noexcept(x.swap(y)));
Howard Hinnantc51e1022010-05-11 19:42:16 +0000522
Marshall Clow29b53f22018-12-14 18:49:35 +0000523template <class Key, class T, class Compare, class Allocator, class Predicate>
Marek Kurdeja98b1412020-05-02 13:58:03 +0200524typename multimap<Key, T, Compare, Allocator>::size_type
525erase_if(multimap<Key, T, Compare, Allocator>& c, Predicate pred); // C++20
Marshall Clow29b53f22018-12-14 18:49:35 +0000526
Howard Hinnantc51e1022010-05-11 19:42:16 +0000527} // std
528
529*/
530
531#include <__config>
Arthur O'Dwyer597cac42021-05-12 23:04:03 -0400532#include <__debug>
Christopher Di Bella55d7a822021-07-01 09:25:35 -0400533#include <__functional/is_transparent.h>
Konstantin Varlamov53b543c2021-11-09 09:21:02 -0800534#include <__iterator/iterator_traits.h>
Erik Pilkingtonc37a3d82018-08-01 01:33:38 +0000535#include <__node_handle>
Arthur O'Dwyer597cac42021-05-12 23:04:03 -0400536#include <__tree>
Christopher Di Bella41f26e82021-06-05 02:47:47 +0000537#include <__utility/forward.h>
Arthur O'Dwyer7deec122021-03-24 18:19:12 -0400538#include <compare>
Arthur O'Dwyeref181602021-05-19 11:57:04 -0400539#include <functional>
Arthur O'Dwyer7deec122021-03-24 18:19:12 -0400540#include <initializer_list>
Arthur O'Dwyerb6738bd2021-03-21 16:53:09 -0400541#include <iterator> // __libcpp_erase_if_container
Howard Hinnantc51e1022010-05-11 19:42:16 +0000542#include <memory>
Eric Fiselierf7394302015-06-13 07:08:02 +0000543#include <type_traits>
Arthur O'Dwyeref181602021-05-19 11:57:04 -0400544#include <utility>
Marshall Clow0a1e7502018-09-12 19:41:40 +0000545#include <version>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000546
Howard Hinnantaaaa52b2011-10-17 20:05:10 +0000547#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000548#pragma GCC system_header
Howard Hinnantaaaa52b2011-10-17 20:05:10 +0000549#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +0000550
551_LIBCPP_BEGIN_NAMESPACE_STD
552
Louis Dionne878a3a82018-12-06 21:46:17 +0000553template <class _Key, class _CP, class _Compare,
554 bool = is_empty<_Compare>::value && !__libcpp_is_final<_Compare>::value>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000555class __map_value_compare
556 : private _Compare
557{
Howard Hinnantc51e1022010-05-11 19:42:16 +0000558public:
Howard Hinnant756c69b2010-09-22 16:48:34 +0000559 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +0000560 __map_value_compare()
561 _NOEXCEPT_(is_nothrow_default_constructible<_Compare>::value)
562 : _Compare() {}
Howard Hinnant756c69b2010-09-22 16:48:34 +0000563 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +0000564 __map_value_compare(_Compare c)
565 _NOEXCEPT_(is_nothrow_copy_constructible<_Compare>::value)
566 : _Compare(c) {}
Howard Hinnant756c69b2010-09-22 16:48:34 +0000567 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +0000568 const _Compare& key_comp() const _NOEXCEPT {return *this;}
Howard Hinnant756c69b2010-09-22 16:48:34 +0000569 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000570 bool operator()(const _CP& __x, const _CP& __y) const
Erik Pilkingtond3fe2992018-06-04 20:38:23 +0000571 {return static_cast<const _Compare&>(*this)(__x.__get_value().first, __y.__get_value().first);}
Howard Hinnant756c69b2010-09-22 16:48:34 +0000572 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000573 bool operator()(const _CP& __x, const _Key& __y) const
Erik Pilkingtond3fe2992018-06-04 20:38:23 +0000574 {return static_cast<const _Compare&>(*this)(__x.__get_value().first, __y);}
Howard Hinnant756c69b2010-09-22 16:48:34 +0000575 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000576 bool operator()(const _Key& __x, const _CP& __y) const
Erik Pilkingtond3fe2992018-06-04 20:38:23 +0000577 {return static_cast<const _Compare&>(*this)(__x, __y.__get_value().first);}
Arthur O'Dwyer1e1de502021-08-31 14:29:24 -0400578 void swap(__map_value_compare& __y)
Marshall Clow8982dcd2015-07-13 20:04:56 +0000579 _NOEXCEPT_(__is_nothrow_swappable<_Compare>::value)
580 {
Eric Fiselier68b5f0b2017-04-13 00:34:24 +0000581 using _VSTD::swap;
582 swap(static_cast<_Compare&>(*this), static_cast<_Compare&>(__y));
Marshall Clow8982dcd2015-07-13 20:04:56 +0000583 }
Marshall Clowebb57322013-08-13 22:18:47 +0000584
585#if _LIBCPP_STD_VER > 11
586 template <typename _K2>
587 _LIBCPP_INLINE_VISIBILITY
Arthur O'Dwyer8a615722021-08-31 13:04:29 -0400588 bool operator()(const _K2& __x, const _CP& __y) const
589 {return static_cast<const _Compare&>(*this)(__x, __y.__get_value().first);}
Marshall Clowebb57322013-08-13 22:18:47 +0000590
591 template <typename _K2>
592 _LIBCPP_INLINE_VISIBILITY
Arthur O'Dwyer8a615722021-08-31 13:04:29 -0400593 bool operator()(const _CP& __x, const _K2& __y) const
594 {return static_cast<const _Compare&>(*this)(__x.__get_value().first, __y);}
Marshall Clowebb57322013-08-13 22:18:47 +0000595#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +0000596};
597
Howard Hinnant90b91592013-07-05 18:06:00 +0000598template <class _Key, class _CP, class _Compare>
599class __map_value_compare<_Key, _CP, _Compare, false>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000600{
601 _Compare comp;
602
Howard Hinnantc51e1022010-05-11 19:42:16 +0000603public:
Howard Hinnant756c69b2010-09-22 16:48:34 +0000604 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +0000605 __map_value_compare()
606 _NOEXCEPT_(is_nothrow_default_constructible<_Compare>::value)
607 : comp() {}
Howard Hinnant756c69b2010-09-22 16:48:34 +0000608 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +0000609 __map_value_compare(_Compare c)
610 _NOEXCEPT_(is_nothrow_copy_constructible<_Compare>::value)
611 : comp(c) {}
Howard Hinnant756c69b2010-09-22 16:48:34 +0000612 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +0000613 const _Compare& key_comp() const _NOEXCEPT {return comp;}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000614
Howard Hinnant756c69b2010-09-22 16:48:34 +0000615 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000616 bool operator()(const _CP& __x, const _CP& __y) const
Erik Pilkingtond3fe2992018-06-04 20:38:23 +0000617 {return comp(__x.__get_value().first, __y.__get_value().first);}
Howard Hinnant756c69b2010-09-22 16:48:34 +0000618 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000619 bool operator()(const _CP& __x, const _Key& __y) const
Erik Pilkingtond3fe2992018-06-04 20:38:23 +0000620 {return comp(__x.__get_value().first, __y);}
Howard Hinnant756c69b2010-09-22 16:48:34 +0000621 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000622 bool operator()(const _Key& __x, const _CP& __y) const
Erik Pilkingtond3fe2992018-06-04 20:38:23 +0000623 {return comp(__x, __y.__get_value().first);}
Arthur O'Dwyer1e1de502021-08-31 14:29:24 -0400624 void swap(__map_value_compare& __y)
Marshall Clow8982dcd2015-07-13 20:04:56 +0000625 _NOEXCEPT_(__is_nothrow_swappable<_Compare>::value)
626 {
627 using _VSTD::swap;
628 swap(comp, __y.comp);
629 }
Eric Fiseliercf8c0212017-01-05 06:06:18 +0000630
Marshall Clowebb57322013-08-13 22:18:47 +0000631#if _LIBCPP_STD_VER > 11
632 template <typename _K2>
633 _LIBCPP_INLINE_VISIBILITY
Arthur O'Dwyer8a615722021-08-31 13:04:29 -0400634 bool operator()(const _K2& __x, const _CP& __y) const
635 {return comp(__x, __y.__get_value().first);}
Marshall Clowebb57322013-08-13 22:18:47 +0000636
637 template <typename _K2>
638 _LIBCPP_INLINE_VISIBILITY
Arthur O'Dwyer8a615722021-08-31 13:04:29 -0400639 bool operator()(const _CP& __x, const _K2& __y) const
640 {return comp(__x.__get_value().first, __y);}
Marshall Clowebb57322013-08-13 22:18:47 +0000641#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +0000642};
643
Marshall Clow8982dcd2015-07-13 20:04:56 +0000644template <class _Key, class _CP, class _Compare, bool __b>
645inline _LIBCPP_INLINE_VISIBILITY
646void
647swap(__map_value_compare<_Key, _CP, _Compare, __b>& __x,
648 __map_value_compare<_Key, _CP, _Compare, __b>& __y)
649 _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
650{
651 __x.swap(__y);
652}
653
Howard Hinnantc51e1022010-05-11 19:42:16 +0000654template <class _Allocator>
655class __map_node_destructor
656{
657 typedef _Allocator allocator_type;
658 typedef allocator_traits<allocator_type> __alloc_traits;
Eric Fiseliera00b4842016-02-20 05:28:30 +0000659
Howard Hinnantc51e1022010-05-11 19:42:16 +0000660public:
661 typedef typename __alloc_traits::pointer pointer;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000662
Eric Fiseliera00b4842016-02-20 05:28:30 +0000663private:
Howard Hinnantc51e1022010-05-11 19:42:16 +0000664 allocator_type& __na_;
665
666 __map_node_destructor& operator=(const __map_node_destructor&);
667
668public:
669 bool __first_constructed;
670 bool __second_constructed;
671
Howard Hinnant756c69b2010-09-22 16:48:34 +0000672 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +0000673 explicit __map_node_destructor(allocator_type& __na) _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +0000674 : __na_(__na),
675 __first_constructed(false),
676 __second_constructed(false)
677 {}
678
Eric Fiseliera85b1282017-04-18 21:08:06 +0000679#ifndef _LIBCPP_CXX03_LANG
Howard Hinnant756c69b2010-09-22 16:48:34 +0000680 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +0000681 __map_node_destructor(__tree_node_destructor<allocator_type>&& __x) _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +0000682 : __na_(__x.__na_),
683 __first_constructed(__x.__value_constructed),
684 __second_constructed(__x.__value_constructed)
685 {
686 __x.__value_constructed = false;
687 }
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400688#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +0000689
Howard Hinnant756c69b2010-09-22 16:48:34 +0000690 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +0000691 void operator()(pointer __p) _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +0000692 {
693 if (__second_constructed)
Erik Pilkingtond3fe2992018-06-04 20:38:23 +0000694 __alloc_traits::destroy(__na_, _VSTD::addressof(__p->__value_.__get_value().second));
Howard Hinnantc51e1022010-05-11 19:42:16 +0000695 if (__first_constructed)
Erik Pilkingtond3fe2992018-06-04 20:38:23 +0000696 __alloc_traits::destroy(__na_, _VSTD::addressof(__p->__value_.__get_value().first));
Howard Hinnantc51e1022010-05-11 19:42:16 +0000697 if (__p)
698 __alloc_traits::deallocate(__na_, __p, 1);
699 }
700};
701
Howard Hinnant944510a2011-06-14 19:58:17 +0000702template <class _Key, class _Tp, class _Compare, class _Allocator>
703 class map;
704template <class _Key, class _Tp, class _Compare, class _Allocator>
705 class multimap;
706template <class _TreeIterator> class __map_const_iterator;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000707
Eric Fiseliera00b4842016-02-20 05:28:30 +0000708#ifndef _LIBCPP_CXX03_LANG
Howard Hinnant89f8b792013-09-30 19:08:22 +0000709
710template <class _Key, class _Tp>
Amy Huang63f53b52021-03-15 14:20:49 -0700711struct _LIBCPP_STANDALONE_DEBUG __value_type
Howard Hinnant89f8b792013-09-30 19:08:22 +0000712{
713 typedef _Key key_type;
714 typedef _Tp mapped_type;
715 typedef pair<const key_type, mapped_type> value_type;
Erik Pilkingtond3fe2992018-06-04 20:38:23 +0000716 typedef pair<key_type&, mapped_type&> __nc_ref_pair_type;
717 typedef pair<key_type&&, mapped_type&&> __nc_rref_pair_type;
Howard Hinnant89f8b792013-09-30 19:08:22 +0000718
Erik Pilkingtond3fe2992018-06-04 20:38:23 +0000719private:
Howard Hinnant89f8b792013-09-30 19:08:22 +0000720 value_type __cc;
Erik Pilkingtond3fe2992018-06-04 20:38:23 +0000721
722public:
723 _LIBCPP_INLINE_VISIBILITY
724 value_type& __get_value()
725 {
726#if _LIBCPP_STD_VER > 14
727 return *_VSTD::launder(_VSTD::addressof(__cc));
728#else
729 return __cc;
730#endif
731 }
732
733 _LIBCPP_INLINE_VISIBILITY
734 const value_type& __get_value() const
735 {
736#if _LIBCPP_STD_VER > 14
737 return *_VSTD::launder(_VSTD::addressof(__cc));
738#else
739 return __cc;
740#endif
741 }
742
743 _LIBCPP_INLINE_VISIBILITY
744 __nc_ref_pair_type __ref()
745 {
746 value_type& __v = __get_value();
747 return __nc_ref_pair_type(const_cast<key_type&>(__v.first), __v.second);
748 }
749
750 _LIBCPP_INLINE_VISIBILITY
751 __nc_rref_pair_type __move()
752 {
753 value_type& __v = __get_value();
754 return __nc_rref_pair_type(
755 _VSTD::move(const_cast<key_type&>(__v.first)),
756 _VSTD::move(__v.second));
757 }
Howard Hinnant89f8b792013-09-30 19:08:22 +0000758
Howard Hinnant89f8b792013-09-30 19:08:22 +0000759 _LIBCPP_INLINE_VISIBILITY
760 __value_type& operator=(const __value_type& __v)
Erik Pilkingtond3fe2992018-06-04 20:38:23 +0000761 {
762 __ref() = __v.__get_value();
763 return *this;
764 }
Howard Hinnant89f8b792013-09-30 19:08:22 +0000765
766 _LIBCPP_INLINE_VISIBILITY
767 __value_type& operator=(__value_type&& __v)
Erik Pilkingtond3fe2992018-06-04 20:38:23 +0000768 {
769 __ref() = __v.__move();
770 return *this;
771 }
Howard Hinnant89f8b792013-09-30 19:08:22 +0000772
Eric Fiselierd06276b2016-03-31 02:15:15 +0000773 template <class _ValueTp,
774 class = typename enable_if<
775 __is_same_uncvref<_ValueTp, value_type>::value
776 >::type
777 >
Howard Hinnant89f8b792013-09-30 19:08:22 +0000778 _LIBCPP_INLINE_VISIBILITY
Erik Pilkingtond3fe2992018-06-04 20:38:23 +0000779 __value_type& operator=(_ValueTp&& __v)
780 {
781 __ref() = _VSTD::forward<_ValueTp>(__v);
782 return *this;
Eric Fiselierd06276b2016-03-31 02:15:15 +0000783 }
784
785private:
Arthur O'Dwyer7bcb3852021-09-16 22:47:36 -0400786 __value_type() = delete;
787 ~__value_type() = delete;
788 __value_type(const __value_type&) = delete;
789 __value_type(__value_type&&) = delete;
Howard Hinnant89f8b792013-09-30 19:08:22 +0000790};
791
792#else
793
794template <class _Key, class _Tp>
795struct __value_type
796{
797 typedef _Key key_type;
798 typedef _Tp mapped_type;
799 typedef pair<const key_type, mapped_type> value_type;
800
Erik Pilkingtond3fe2992018-06-04 20:38:23 +0000801private:
Howard Hinnant89f8b792013-09-30 19:08:22 +0000802 value_type __cc;
803
Erik Pilkingtond3fe2992018-06-04 20:38:23 +0000804public:
805 _LIBCPP_INLINE_VISIBILITY
806 value_type& __get_value() { return __cc; }
807 _LIBCPP_INLINE_VISIBILITY
808 const value_type& __get_value() const { return __cc; }
809
Eric Fiselierd06276b2016-03-31 02:15:15 +0000810private:
811 __value_type();
812 __value_type(__value_type const&);
813 __value_type& operator=(__value_type const&);
814 ~__value_type();
Howard Hinnant89f8b792013-09-30 19:08:22 +0000815};
816
Eric Fiseliera85b1282017-04-18 21:08:06 +0000817#endif // _LIBCPP_CXX03_LANG
Howard Hinnant89f8b792013-09-30 19:08:22 +0000818
Eric Fiselier44f9fd02015-03-03 20:10:01 +0000819template <class _Tp>
820struct __extract_key_value_types;
821
822template <class _Key, class _Tp>
823struct __extract_key_value_types<__value_type<_Key, _Tp> >
824{
825 typedef _Key const __key_type;
826 typedef _Tp __mapped_type;
827};
828
Howard Hinnantc51e1022010-05-11 19:42:16 +0000829template <class _TreeIterator>
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000830class _LIBCPP_TEMPLATE_VIS __map_iterator
Howard Hinnantc51e1022010-05-11 19:42:16 +0000831{
Eric Fiseliera00b4842016-02-20 05:28:30 +0000832 typedef typename _TreeIterator::_NodeTypes _NodeTypes;
833 typedef typename _TreeIterator::__pointer_traits __pointer_traits;
834
Howard Hinnantc51e1022010-05-11 19:42:16 +0000835 _TreeIterator __i_;
836
Howard Hinnantc51e1022010-05-11 19:42:16 +0000837public:
838 typedef bidirectional_iterator_tag iterator_category;
Eric Fiseliera00b4842016-02-20 05:28:30 +0000839 typedef typename _NodeTypes::__map_value_type value_type;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000840 typedef typename _TreeIterator::difference_type difference_type;
841 typedef value_type& reference;
Eric Fiseliera00b4842016-02-20 05:28:30 +0000842 typedef typename _NodeTypes::__map_value_type_pointer pointer;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000843
Howard Hinnant756c69b2010-09-22 16:48:34 +0000844 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +0000845 __map_iterator() _NOEXCEPT {}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000846
Howard Hinnant756c69b2010-09-22 16:48:34 +0000847 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +0000848 __map_iterator(_TreeIterator __i) _NOEXCEPT : __i_(__i) {}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000849
Howard Hinnant756c69b2010-09-22 16:48:34 +0000850 _LIBCPP_INLINE_VISIBILITY
Erik Pilkingtond3fe2992018-06-04 20:38:23 +0000851 reference operator*() const {return __i_->__get_value();}
Howard Hinnant756c69b2010-09-22 16:48:34 +0000852 _LIBCPP_INLINE_VISIBILITY
Erik Pilkingtond3fe2992018-06-04 20:38:23 +0000853 pointer operator->() const {return pointer_traits<pointer>::pointer_to(__i_->__get_value());}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000854
Howard Hinnant756c69b2010-09-22 16:48:34 +0000855 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000856 __map_iterator& operator++() {++__i_; return *this;}
Howard Hinnant756c69b2010-09-22 16:48:34 +0000857 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000858 __map_iterator operator++(int)
859 {
860 __map_iterator __t(*this);
861 ++(*this);
862 return __t;
863 }
864
Howard Hinnant756c69b2010-09-22 16:48:34 +0000865 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000866 __map_iterator& operator--() {--__i_; return *this;}
Howard Hinnant756c69b2010-09-22 16:48:34 +0000867 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000868 __map_iterator operator--(int)
869 {
870 __map_iterator __t(*this);
871 --(*this);
872 return __t;
873 }
874
Howard Hinnant756c69b2010-09-22 16:48:34 +0000875 friend _LIBCPP_INLINE_VISIBILITY
876 bool operator==(const __map_iterator& __x, const __map_iterator& __y)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000877 {return __x.__i_ == __y.__i_;}
Eric Fiseliercf8c0212017-01-05 06:06:18 +0000878 friend
Howard Hinnant756c69b2010-09-22 16:48:34 +0000879 _LIBCPP_INLINE_VISIBILITY
880 bool operator!=(const __map_iterator& __x, const __map_iterator& __y)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000881 {return __x.__i_ != __y.__i_;}
882
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000883 template <class, class, class, class> friend class _LIBCPP_TEMPLATE_VIS map;
884 template <class, class, class, class> friend class _LIBCPP_TEMPLATE_VIS multimap;
885 template <class> friend class _LIBCPP_TEMPLATE_VIS __map_const_iterator;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000886};
887
888template <class _TreeIterator>
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000889class _LIBCPP_TEMPLATE_VIS __map_const_iterator
Howard Hinnantc51e1022010-05-11 19:42:16 +0000890{
Eric Fiseliera00b4842016-02-20 05:28:30 +0000891 typedef typename _TreeIterator::_NodeTypes _NodeTypes;
892 typedef typename _TreeIterator::__pointer_traits __pointer_traits;
893
Howard Hinnantc51e1022010-05-11 19:42:16 +0000894 _TreeIterator __i_;
895
Howard Hinnantc51e1022010-05-11 19:42:16 +0000896public:
897 typedef bidirectional_iterator_tag iterator_category;
Eric Fiseliera00b4842016-02-20 05:28:30 +0000898 typedef typename _NodeTypes::__map_value_type value_type;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000899 typedef typename _TreeIterator::difference_type difference_type;
900 typedef const value_type& reference;
Eric Fiseliera00b4842016-02-20 05:28:30 +0000901 typedef typename _NodeTypes::__const_map_value_type_pointer pointer;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000902
Howard Hinnant756c69b2010-09-22 16:48:34 +0000903 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +0000904 __map_const_iterator() _NOEXCEPT {}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000905
Howard Hinnant756c69b2010-09-22 16:48:34 +0000906 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +0000907 __map_const_iterator(_TreeIterator __i) _NOEXCEPT : __i_(__i) {}
Howard Hinnant756c69b2010-09-22 16:48:34 +0000908 _LIBCPP_INLINE_VISIBILITY
Eric Fiselier44f9fd02015-03-03 20:10:01 +0000909 __map_const_iterator(__map_iterator<
910 typename _TreeIterator::__non_const_iterator> __i) _NOEXCEPT
911 : __i_(__i.__i_) {}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000912
Howard Hinnant756c69b2010-09-22 16:48:34 +0000913 _LIBCPP_INLINE_VISIBILITY
Erik Pilkingtond3fe2992018-06-04 20:38:23 +0000914 reference operator*() const {return __i_->__get_value();}
Howard Hinnant756c69b2010-09-22 16:48:34 +0000915 _LIBCPP_INLINE_VISIBILITY
Erik Pilkingtond3fe2992018-06-04 20:38:23 +0000916 pointer operator->() const {return pointer_traits<pointer>::pointer_to(__i_->__get_value());}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000917
Howard Hinnant756c69b2010-09-22 16:48:34 +0000918 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000919 __map_const_iterator& operator++() {++__i_; return *this;}
Howard Hinnant756c69b2010-09-22 16:48:34 +0000920 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000921 __map_const_iterator operator++(int)
922 {
923 __map_const_iterator __t(*this);
924 ++(*this);
925 return __t;
926 }
927
Howard Hinnant756c69b2010-09-22 16:48:34 +0000928 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000929 __map_const_iterator& operator--() {--__i_; return *this;}
Howard Hinnant756c69b2010-09-22 16:48:34 +0000930 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000931 __map_const_iterator operator--(int)
932 {
933 __map_const_iterator __t(*this);
934 --(*this);
935 return __t;
936 }
937
Howard Hinnant756c69b2010-09-22 16:48:34 +0000938 friend _LIBCPP_INLINE_VISIBILITY
939 bool operator==(const __map_const_iterator& __x, const __map_const_iterator& __y)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000940 {return __x.__i_ == __y.__i_;}
Howard Hinnant756c69b2010-09-22 16:48:34 +0000941 friend _LIBCPP_INLINE_VISIBILITY
942 bool operator!=(const __map_const_iterator& __x, const __map_const_iterator& __y)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000943 {return __x.__i_ != __y.__i_;}
944
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000945 template <class, class, class, class> friend class _LIBCPP_TEMPLATE_VIS map;
946 template <class, class, class, class> friend class _LIBCPP_TEMPLATE_VIS multimap;
947 template <class, class, class> friend class _LIBCPP_TEMPLATE_VIS __tree_const_iterator;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000948};
949
950template <class _Key, class _Tp, class _Compare = less<_Key>,
951 class _Allocator = allocator<pair<const _Key, _Tp> > >
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000952class _LIBCPP_TEMPLATE_VIS map
Howard Hinnantc51e1022010-05-11 19:42:16 +0000953{
954public:
955 // types:
956 typedef _Key key_type;
957 typedef _Tp mapped_type;
958 typedef pair<const key_type, mapped_type> value_type;
Arthur O'Dwyer6a752e12021-03-03 11:10:49 -0500959 typedef __identity_t<_Compare> key_compare;
960 typedef __identity_t<_Allocator> allocator_type;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000961 typedef value_type& reference;
962 typedef const value_type& const_reference;
963
Marshall Clow5128cf32015-11-26 01:24:04 +0000964 static_assert((is_same<typename allocator_type::value_type, value_type>::value),
965 "Allocator::value_type must be same type as value_type");
966
Arthur O'Dwyerf5486c82021-05-25 14:34:18 -0400967_LIBCPP_SUPPRESS_DEPRECATED_PUSH
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000968 class _LIBCPP_TEMPLATE_VIS value_compare
Arthur O'Dwyerf5486c82021-05-25 14:34:18 -0400969#if defined(_LIBCPP_ENABLE_CXX20_REMOVED_BINDER_TYPEDEFS)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000970 : public binary_function<value_type, value_type, bool>
Arthur O'Dwyerf5486c82021-05-25 14:34:18 -0400971#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +0000972 {
Arthur O'Dwyerf5486c82021-05-25 14:34:18 -0400973_LIBCPP_SUPPRESS_DEPRECATED_POP
Howard Hinnantc51e1022010-05-11 19:42:16 +0000974 friend class map;
975 protected:
976 key_compare comp;
977
Howard Hinnant756c69b2010-09-22 16:48:34 +0000978 _LIBCPP_INLINE_VISIBILITY value_compare(key_compare c) : comp(c) {}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000979 public:
Arthur O'Dwyerf5486c82021-05-25 14:34:18 -0400980#if _LIBCPP_STD_VER <= 17 || defined(_LIBCPP_ENABLE_CXX20_REMOVED_BINDER_TYPEDEFS)
981 _LIBCPP_DEPRECATED_IN_CXX17 typedef bool result_type;
982 _LIBCPP_DEPRECATED_IN_CXX17 typedef value_type first_argument_type;
983 _LIBCPP_DEPRECATED_IN_CXX17 typedef value_type second_argument_type;
984#endif
Howard Hinnant756c69b2010-09-22 16:48:34 +0000985 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000986 bool operator()(const value_type& __x, const value_type& __y) const
987 {return comp(__x.first, __y.first);}
988 };
989
990private:
Howard Hinnant2d0046b2013-06-19 21:29:40 +0000991
Howard Hinnant89f8b792013-09-30 19:08:22 +0000992 typedef _VSTD::__value_type<key_type, mapped_type> __value_type;
Howard Hinnant90b91592013-07-05 18:06:00 +0000993 typedef __map_value_compare<key_type, __value_type, key_compare> __vc;
Marshall Clow940e01c2015-04-07 05:21:38 +0000994 typedef typename __rebind_alloc_helper<allocator_traits<allocator_type>,
995 __value_type>::type __allocator_type;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000996 typedef __tree<__value_type, __vc, __allocator_type> __base;
997 typedef typename __base::__node_traits __node_traits;
998 typedef allocator_traits<allocator_type> __alloc_traits;
999
1000 __base __tree_;
1001
1002public:
1003 typedef typename __alloc_traits::pointer pointer;
1004 typedef typename __alloc_traits::const_pointer const_pointer;
1005 typedef typename __alloc_traits::size_type size_type;
1006 typedef typename __alloc_traits::difference_type difference_type;
Eric Fiselier44f9fd02015-03-03 20:10:01 +00001007 typedef __map_iterator<typename __base::iterator> iterator;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001008 typedef __map_const_iterator<typename __base::const_iterator> const_iterator;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001009 typedef _VSTD::reverse_iterator<iterator> reverse_iterator;
1010 typedef _VSTD::reverse_iterator<const_iterator> const_reverse_iterator;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001011
Erik Pilkingtonc37a3d82018-08-01 01:33:38 +00001012#if _LIBCPP_STD_VER > 14
1013 typedef __map_node_handle<typename __base::__node, allocator_type> node_type;
1014 typedef __insert_return_type<iterator, node_type> insert_return_type;
1015#endif
1016
Erik Pilkington82a65ad2018-10-31 17:31:35 +00001017 template <class _Key2, class _Value2, class _Comp2, class _Alloc2>
1018 friend class _LIBCPP_TEMPLATE_VIS map;
1019 template <class _Key2, class _Value2, class _Comp2, class _Alloc2>
1020 friend class _LIBCPP_TEMPLATE_VIS multimap;
1021
Howard Hinnant756c69b2010-09-22 16:48:34 +00001022 _LIBCPP_INLINE_VISIBILITY
Marshall Clow7086a5a2014-03-10 04:50:10 +00001023 map()
1024 _NOEXCEPT_(
1025 is_nothrow_default_constructible<allocator_type>::value &&
1026 is_nothrow_default_constructible<key_compare>::value &&
1027 is_nothrow_copy_constructible<key_compare>::value)
1028 : __tree_(__vc(key_compare())) {}
1029
1030 _LIBCPP_INLINE_VISIBILITY
1031 explicit map(const key_compare& __comp)
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001032 _NOEXCEPT_(
1033 is_nothrow_default_constructible<allocator_type>::value &&
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001034 is_nothrow_copy_constructible<key_compare>::value)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001035 : __tree_(__vc(__comp)) {}
1036
Howard Hinnant756c69b2010-09-22 16:48:34 +00001037 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001038 explicit map(const key_compare& __comp, const allocator_type& __a)
Marshall Clow657cbc42016-08-17 05:58:40 +00001039 : __tree_(__vc(__comp), typename __base::allocator_type(__a)) {}
Howard Hinnantc51e1022010-05-11 19:42:16 +00001040
1041 template <class _InputIterator>
Howard Hinnant756c69b2010-09-22 16:48:34 +00001042 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001043 map(_InputIterator __f, _InputIterator __l,
1044 const key_compare& __comp = key_compare())
1045 : __tree_(__vc(__comp))
1046 {
1047 insert(__f, __l);
1048 }
1049
1050 template <class _InputIterator>
Howard Hinnant756c69b2010-09-22 16:48:34 +00001051 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001052 map(_InputIterator __f, _InputIterator __l,
1053 const key_compare& __comp, const allocator_type& __a)
Marshall Clow657cbc42016-08-17 05:58:40 +00001054 : __tree_(__vc(__comp), typename __base::allocator_type(__a))
Howard Hinnantc51e1022010-05-11 19:42:16 +00001055 {
1056 insert(__f, __l);
1057 }
1058
Marshall Clow300abfb2013-09-11 01:15:47 +00001059#if _LIBCPP_STD_VER > 11
1060 template <class _InputIterator>
Eric Fiseliercf8c0212017-01-05 06:06:18 +00001061 _LIBCPP_INLINE_VISIBILITY
Marshall Clow300abfb2013-09-11 01:15:47 +00001062 map(_InputIterator __f, _InputIterator __l, const allocator_type& __a)
1063 : map(__f, __l, key_compare(), __a) {}
1064#endif
1065
Howard Hinnant756c69b2010-09-22 16:48:34 +00001066 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001067 map(const map& __m)
1068 : __tree_(__m.__tree_)
1069 {
1070 insert(__m.begin(), __m.end());
1071 }
1072
Howard Hinnantd3a657f2011-07-01 19:24:36 +00001073 _LIBCPP_INLINE_VISIBILITY
1074 map& operator=(const map& __m)
1075 {
Marshall Clow476d3f42016-07-18 13:19:00 +00001076#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantd3a657f2011-07-01 19:24:36 +00001077 __tree_ = __m.__tree_;
Howard Hinnant2d0046b2013-06-19 21:29:40 +00001078#else
Mark de Wever357a1fc2021-09-28 19:15:18 +02001079 if (this != _VSTD::addressof(__m)) {
Marshall Clowdb3cfcb2014-02-08 04:03:14 +00001080 __tree_.clear();
1081 __tree_.value_comp() = __m.__tree_.value_comp();
1082 __tree_.__copy_assign_alloc(__m.__tree_);
1083 insert(__m.begin(), __m.end());
1084 }
Howard Hinnant2d0046b2013-06-19 21:29:40 +00001085#endif
Howard Hinnantd3a657f2011-07-01 19:24:36 +00001086 return *this;
1087 }
1088
Eric Fiseliera85b1282017-04-18 21:08:06 +00001089#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00001090
Howard Hinnant756c69b2010-09-22 16:48:34 +00001091 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001092 map(map&& __m)
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001093 _NOEXCEPT_(is_nothrow_move_constructible<__base>::value)
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001094 : __tree_(_VSTD::move(__m.__tree_))
Howard Hinnantc51e1022010-05-11 19:42:16 +00001095 {
1096 }
1097
1098 map(map&& __m, const allocator_type& __a);
1099
Howard Hinnant756c69b2010-09-22 16:48:34 +00001100 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant33711792011-08-12 21:56:02 +00001101 map& operator=(map&& __m)
1102 _NOEXCEPT_(is_nothrow_move_assignable<__base>::value)
1103 {
1104 __tree_ = _VSTD::move(__m.__tree_);
1105 return *this;
1106 }
1107
Howard Hinnant33711792011-08-12 21:56:02 +00001108 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001109 map(initializer_list<value_type> __il, const key_compare& __comp = key_compare())
1110 : __tree_(__vc(__comp))
1111 {
1112 insert(__il.begin(), __il.end());
1113 }
1114
Howard Hinnant756c69b2010-09-22 16:48:34 +00001115 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001116 map(initializer_list<value_type> __il, const key_compare& __comp, const allocator_type& __a)
Marshall Clow657cbc42016-08-17 05:58:40 +00001117 : __tree_(__vc(__comp), typename __base::allocator_type(__a))
Howard Hinnantc51e1022010-05-11 19:42:16 +00001118 {
1119 insert(__il.begin(), __il.end());
1120 }
1121
Marshall Clow300abfb2013-09-11 01:15:47 +00001122#if _LIBCPP_STD_VER > 11
Eric Fiseliercf8c0212017-01-05 06:06:18 +00001123 _LIBCPP_INLINE_VISIBILITY
Marshall Clow300abfb2013-09-11 01:15:47 +00001124 map(initializer_list<value_type> __il, const allocator_type& __a)
1125 : map(__il, key_compare(), __a) {}
1126#endif
1127
Howard Hinnant756c69b2010-09-22 16:48:34 +00001128 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001129 map& operator=(initializer_list<value_type> __il)
1130 {
1131 __tree_.__assign_unique(__il.begin(), __il.end());
1132 return *this;
1133 }
1134
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04001135#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00001136
Howard Hinnant756c69b2010-09-22 16:48:34 +00001137 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001138 explicit map(const allocator_type& __a)
Marshall Clow657cbc42016-08-17 05:58:40 +00001139 : __tree_(typename __base::allocator_type(__a))
Howard Hinnantc51e1022010-05-11 19:42:16 +00001140 {
1141 }
1142
Howard Hinnant756c69b2010-09-22 16:48:34 +00001143 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001144 map(const map& __m, const allocator_type& __a)
Marshall Clow657cbc42016-08-17 05:58:40 +00001145 : __tree_(__m.__tree_.value_comp(), typename __base::allocator_type(__a))
Howard Hinnantc51e1022010-05-11 19:42:16 +00001146 {
1147 insert(__m.begin(), __m.end());
1148 }
1149
Howard Hinnant756c69b2010-09-22 16:48:34 +00001150 _LIBCPP_INLINE_VISIBILITY
Louis Dionne69c42c02019-04-11 16:14:56 +00001151 ~map() {
1152 static_assert(sizeof(__diagnose_non_const_comparator<_Key, _Compare>()), "");
1153 }
1154
1155 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001156 iterator begin() _NOEXCEPT {return __tree_.begin();}
Howard Hinnant756c69b2010-09-22 16:48:34 +00001157 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001158 const_iterator begin() const _NOEXCEPT {return __tree_.begin();}
Howard Hinnant756c69b2010-09-22 16:48:34 +00001159 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001160 iterator end() _NOEXCEPT {return __tree_.end();}
Howard Hinnant756c69b2010-09-22 16:48:34 +00001161 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001162 const_iterator end() const _NOEXCEPT {return __tree_.end();}
Howard Hinnantc51e1022010-05-11 19:42:16 +00001163
Howard Hinnant756c69b2010-09-22 16:48:34 +00001164 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001165 reverse_iterator rbegin() _NOEXCEPT {return reverse_iterator(end());}
Howard Hinnant756c69b2010-09-22 16:48:34 +00001166 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001167 const_reverse_iterator rbegin() const _NOEXCEPT
1168 {return const_reverse_iterator(end());}
Howard Hinnant756c69b2010-09-22 16:48:34 +00001169 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001170 reverse_iterator rend() _NOEXCEPT
1171 {return reverse_iterator(begin());}
Howard Hinnant756c69b2010-09-22 16:48:34 +00001172 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001173 const_reverse_iterator rend() const _NOEXCEPT
1174 {return const_reverse_iterator(begin());}
Howard Hinnantc51e1022010-05-11 19:42:16 +00001175
Howard Hinnant756c69b2010-09-22 16:48:34 +00001176 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001177 const_iterator cbegin() const _NOEXCEPT {return begin();}
Howard Hinnant756c69b2010-09-22 16:48:34 +00001178 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001179 const_iterator cend() const _NOEXCEPT {return end();}
Howard Hinnant756c69b2010-09-22 16:48:34 +00001180 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001181 const_reverse_iterator crbegin() const _NOEXCEPT {return rbegin();}
Howard Hinnant756c69b2010-09-22 16:48:34 +00001182 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001183 const_reverse_iterator crend() const _NOEXCEPT {return rend();}
Howard Hinnantc51e1022010-05-11 19:42:16 +00001184
Marshall Clow425f5752017-11-15 05:51:26 +00001185 _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001186 bool empty() const _NOEXCEPT {return __tree_.size() == 0;}
Howard Hinnant756c69b2010-09-22 16:48:34 +00001187 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001188 size_type size() const _NOEXCEPT {return __tree_.size();}
Howard Hinnant756c69b2010-09-22 16:48:34 +00001189 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001190 size_type max_size() const _NOEXCEPT {return __tree_.max_size();}
Howard Hinnantc51e1022010-05-11 19:42:16 +00001191
1192 mapped_type& operator[](const key_type& __k);
Eric Fiselierd63f38e2016-03-31 03:13:37 +00001193#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00001194 mapped_type& operator[](key_type&& __k);
1195#endif
1196
1197 mapped_type& at(const key_type& __k);
1198 const mapped_type& at(const key_type& __k) const;
1199
Howard Hinnant756c69b2010-09-22 16:48:34 +00001200 _LIBCPP_INLINE_VISIBILITY
Marshall Clow657cbc42016-08-17 05:58:40 +00001201 allocator_type get_allocator() const _NOEXCEPT {return allocator_type(__tree_.__alloc());}
Howard Hinnant756c69b2010-09-22 16:48:34 +00001202 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001203 key_compare key_comp() const {return __tree_.value_comp().key_comp();}
Howard Hinnant756c69b2010-09-22 16:48:34 +00001204 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001205 value_compare value_comp() const {return value_compare(__tree_.value_comp().key_comp());}
1206
Eric Fiselierd06276b2016-03-31 02:15:15 +00001207#ifndef _LIBCPP_CXX03_LANG
1208 template <class ..._Args>
1209 _LIBCPP_INLINE_VISIBILITY
1210 pair<iterator, bool> emplace(_Args&& ...__args) {
1211 return __tree_.__emplace_unique(_VSTD::forward<_Args>(__args)...);
1212 }
Howard Hinnant74279a52010-09-04 23:28:19 +00001213
Howard Hinnant29eb9b82012-05-25 22:04:21 +00001214 template <class ..._Args>
Eric Fiselierd06276b2016-03-31 02:15:15 +00001215 _LIBCPP_INLINE_VISIBILITY
1216 iterator emplace_hint(const_iterator __p, _Args&& ...__args) {
1217 return __tree_.__emplace_hint_unique(__p.__i_, _VSTD::forward<_Args>(__args)...);
1218 }
Howard Hinnant74279a52010-09-04 23:28:19 +00001219
Howard Hinnantc834c512011-11-29 18:15:50 +00001220 template <class _Pp,
1221 class = typename enable_if<is_constructible<value_type, _Pp>::value>::type>
Howard Hinnant756c69b2010-09-22 16:48:34 +00001222 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc834c512011-11-29 18:15:50 +00001223 pair<iterator, bool> insert(_Pp&& __p)
1224 {return __tree_.__insert_unique(_VSTD::forward<_Pp>(__p));}
Howard Hinnantc51e1022010-05-11 19:42:16 +00001225
Howard Hinnantc834c512011-11-29 18:15:50 +00001226 template <class _Pp,
1227 class = typename enable_if<is_constructible<value_type, _Pp>::value>::type>
Howard Hinnant756c69b2010-09-22 16:48:34 +00001228 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc834c512011-11-29 18:15:50 +00001229 iterator insert(const_iterator __pos, _Pp&& __p)
1230 {return __tree_.__insert_unique(__pos.__i_, _VSTD::forward<_Pp>(__p));}
Howard Hinnantc51e1022010-05-11 19:42:16 +00001231
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04001232#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00001233
Howard Hinnant756c69b2010-09-22 16:48:34 +00001234 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001235 pair<iterator, bool>
1236 insert(const value_type& __v) {return __tree_.__insert_unique(__v);}
1237
Howard Hinnant756c69b2010-09-22 16:48:34 +00001238 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001239 iterator
1240 insert(const_iterator __p, const value_type& __v)
1241 {return __tree_.__insert_unique(__p.__i_, __v);}
1242
Eric Fiselierd6143132016-04-18 01:40:45 +00001243#ifndef _LIBCPP_CXX03_LANG
Marshall Clowd430d022016-01-05 19:32:41 +00001244 _LIBCPP_INLINE_VISIBILITY
1245 pair<iterator, bool>
Eric Fiselierd06276b2016-03-31 02:15:15 +00001246 insert(value_type&& __v) {return __tree_.__insert_unique(_VSTD::move(__v));}
Marshall Clowd430d022016-01-05 19:32:41 +00001247
1248 _LIBCPP_INLINE_VISIBILITY
Eric Fiselierd06276b2016-03-31 02:15:15 +00001249 iterator insert(const_iterator __p, value_type&& __v)
1250 {return __tree_.__insert_unique(__p.__i_, _VSTD::move(__v));}
Eric Fiseliera85b1282017-04-18 21:08:06 +00001251
1252 _LIBCPP_INLINE_VISIBILITY
1253 void insert(initializer_list<value_type> __il)
1254 {insert(__il.begin(), __il.end());}
Marshall Clowd430d022016-01-05 19:32:41 +00001255#endif
1256
Howard Hinnantc51e1022010-05-11 19:42:16 +00001257 template <class _InputIterator>
Howard Hinnant756c69b2010-09-22 16:48:34 +00001258 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001259 void insert(_InputIterator __f, _InputIterator __l)
1260 {
1261 for (const_iterator __e = cend(); __f != __l; ++__f)
1262 insert(__e.__i_, *__f);
1263 }
1264
Marshall Clow3223db82015-07-07 03:37:33 +00001265#if _LIBCPP_STD_VER > 14
Eric Fiselierd63f38e2016-03-31 03:13:37 +00001266
Marshall Clow3223db82015-07-07 03:37:33 +00001267 template <class... _Args>
1268 _LIBCPP_INLINE_VISIBILITY
1269 pair<iterator, bool> try_emplace(const key_type& __k, _Args&&... __args)
1270 {
Eric Fiselierd63f38e2016-03-31 03:13:37 +00001271 return __tree_.__emplace_unique_key_args(__k,
1272 _VSTD::piecewise_construct,
1273 _VSTD::forward_as_tuple(__k),
1274 _VSTD::forward_as_tuple(_VSTD::forward<_Args>(__args)...));
Marshall Clow3223db82015-07-07 03:37:33 +00001275 }
1276
1277 template <class... _Args>
1278 _LIBCPP_INLINE_VISIBILITY
1279 pair<iterator, bool> try_emplace(key_type&& __k, _Args&&... __args)
1280 {
Eric Fiselierd63f38e2016-03-31 03:13:37 +00001281 return __tree_.__emplace_unique_key_args(__k,
1282 _VSTD::piecewise_construct,
1283 _VSTD::forward_as_tuple(_VSTD::move(__k)),
1284 _VSTD::forward_as_tuple(_VSTD::forward<_Args>(__args)...));
Marshall Clow3223db82015-07-07 03:37:33 +00001285 }
1286
1287 template <class... _Args>
1288 _LIBCPP_INLINE_VISIBILITY
1289 iterator try_emplace(const_iterator __h, const key_type& __k, _Args&&... __args)
1290 {
Eric Fiselierd63f38e2016-03-31 03:13:37 +00001291 return __tree_.__emplace_hint_unique_key_args(__h.__i_, __k,
1292 _VSTD::piecewise_construct,
1293 _VSTD::forward_as_tuple(__k),
Mark de Wever1ba476f2020-09-19 15:39:09 +02001294 _VSTD::forward_as_tuple(_VSTD::forward<_Args>(__args)...)).first;
Marshall Clow3223db82015-07-07 03:37:33 +00001295 }
1296
1297 template <class... _Args>
1298 _LIBCPP_INLINE_VISIBILITY
1299 iterator try_emplace(const_iterator __h, key_type&& __k, _Args&&... __args)
1300 {
Eric Fiselierd63f38e2016-03-31 03:13:37 +00001301 return __tree_.__emplace_hint_unique_key_args(__h.__i_, __k,
1302 _VSTD::piecewise_construct,
1303 _VSTD::forward_as_tuple(_VSTD::move(__k)),
Mark de Wever1ba476f2020-09-19 15:39:09 +02001304 _VSTD::forward_as_tuple(_VSTD::forward<_Args>(__args)...)).first;
Marshall Clow3223db82015-07-07 03:37:33 +00001305 }
1306
1307 template <class _Vp>
1308 _LIBCPP_INLINE_VISIBILITY
1309 pair<iterator, bool> insert_or_assign(const key_type& __k, _Vp&& __v)
1310 {
1311 iterator __p = lower_bound(__k);
1312 if ( __p != end() && !key_comp()(__k, __p->first))
1313 {
1314 __p->second = _VSTD::forward<_Vp>(__v);
1315 return _VSTD::make_pair(__p, false);
1316 }
1317 return _VSTD::make_pair(emplace_hint(__p, __k, _VSTD::forward<_Vp>(__v)), true);
1318 }
Eric Fiselierd63f38e2016-03-31 03:13:37 +00001319
Marshall Clow3223db82015-07-07 03:37:33 +00001320 template <class _Vp>
1321 _LIBCPP_INLINE_VISIBILITY
1322 pair<iterator, bool> insert_or_assign(key_type&& __k, _Vp&& __v)
1323 {
1324 iterator __p = lower_bound(__k);
1325 if ( __p != end() && !key_comp()(__k, __p->first))
1326 {
1327 __p->second = _VSTD::forward<_Vp>(__v);
1328 return _VSTD::make_pair(__p, false);
1329 }
1330 return _VSTD::make_pair(emplace_hint(__p, _VSTD::move(__k), _VSTD::forward<_Vp>(__v)), true);
1331 }
1332
1333 template <class _Vp>
Mark de Wever1ba476f2020-09-19 15:39:09 +02001334 _LIBCPP_INLINE_VISIBILITY iterator insert_or_assign(const_iterator __h,
1335 const key_type& __k,
1336 _Vp&& __v) {
1337 auto [__r, __inserted] = __tree_.__emplace_hint_unique_key_args(
1338 __h.__i_, __k, __k, _VSTD::forward<_Vp>(__v));
1339
1340 if (!__inserted)
1341 __r->__get_value().second = _VSTD::forward<_Vp>(__v);
1342
1343 return __r;
1344 }
Marshall Clow3223db82015-07-07 03:37:33 +00001345
1346 template <class _Vp>
Mark de Wever1ba476f2020-09-19 15:39:09 +02001347 _LIBCPP_INLINE_VISIBILITY iterator insert_or_assign(const_iterator __h,
1348 key_type&& __k,
1349 _Vp&& __v) {
1350 auto [__r, __inserted] = __tree_.__emplace_hint_unique_key_args(
1351 __h.__i_, __k, _VSTD::move(__k), _VSTD::forward<_Vp>(__v));
1352
1353 if (!__inserted)
1354 __r->__get_value().second = _VSTD::forward<_Vp>(__v);
1355
1356 return __r;
1357 }
Eric Fiselierd63f38e2016-03-31 03:13:37 +00001358
Eric Fiseliera85b1282017-04-18 21:08:06 +00001359#endif // _LIBCPP_STD_VER > 14
Marshall Clow3223db82015-07-07 03:37:33 +00001360
Howard Hinnant756c69b2010-09-22 16:48:34 +00001361 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001362 iterator erase(const_iterator __p) {return __tree_.erase(__p.__i_);}
Howard Hinnant756c69b2010-09-22 16:48:34 +00001363 _LIBCPP_INLINE_VISIBILITY
Marshall Clow22ea5b82015-05-10 13:35:00 +00001364 iterator erase(iterator __p) {return __tree_.erase(__p.__i_);}
1365 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001366 size_type erase(const key_type& __k)
1367 {return __tree_.__erase_unique(__k);}
Howard Hinnant756c69b2010-09-22 16:48:34 +00001368 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001369 iterator erase(const_iterator __f, const_iterator __l)
1370 {return __tree_.erase(__f.__i_, __l.__i_);}
Howard Hinnant756c69b2010-09-22 16:48:34 +00001371 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001372 void clear() _NOEXCEPT {__tree_.clear();}
Howard Hinnantc51e1022010-05-11 19:42:16 +00001373
Erik Pilkingtonc37a3d82018-08-01 01:33:38 +00001374#if _LIBCPP_STD_VER > 14
1375 _LIBCPP_INLINE_VISIBILITY
1376 insert_return_type insert(node_type&& __nh)
1377 {
1378 _LIBCPP_ASSERT(__nh.empty() || __nh.get_allocator() == get_allocator(),
1379 "node_type with incompatible allocator passed to map::insert()");
1380 return __tree_.template __node_handle_insert_unique<
1381 node_type, insert_return_type>(_VSTD::move(__nh));
1382 }
1383 _LIBCPP_INLINE_VISIBILITY
1384 iterator insert(const_iterator __hint, node_type&& __nh)
1385 {
1386 _LIBCPP_ASSERT(__nh.empty() || __nh.get_allocator() == get_allocator(),
1387 "node_type with incompatible allocator passed to map::insert()");
1388 return __tree_.template __node_handle_insert_unique<node_type>(
1389 __hint.__i_, _VSTD::move(__nh));
1390 }
1391 _LIBCPP_INLINE_VISIBILITY
1392 node_type extract(key_type const& __key)
1393 {
1394 return __tree_.template __node_handle_extract<node_type>(__key);
1395 }
1396 _LIBCPP_INLINE_VISIBILITY
1397 node_type extract(const_iterator __it)
1398 {
1399 return __tree_.template __node_handle_extract<node_type>(__it.__i_);
1400 }
Louis Dionned2322c82018-11-01 14:41:37 +00001401 template <class _Compare2>
Erik Pilkington82a65ad2018-10-31 17:31:35 +00001402 _LIBCPP_INLINE_VISIBILITY
Louis Dionned2322c82018-11-01 14:41:37 +00001403 void merge(map<key_type, mapped_type, _Compare2, allocator_type>& __source)
Erik Pilkington82a65ad2018-10-31 17:31:35 +00001404 {
1405 _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
1406 "merging container with incompatible allocator");
1407 __tree_.__node_handle_merge_unique(__source.__tree_);
1408 }
Louis Dionned2322c82018-11-01 14:41:37 +00001409 template <class _Compare2>
Erik Pilkington82a65ad2018-10-31 17:31:35 +00001410 _LIBCPP_INLINE_VISIBILITY
Louis Dionned2322c82018-11-01 14:41:37 +00001411 void merge(map<key_type, mapped_type, _Compare2, allocator_type>&& __source)
Erik Pilkington82a65ad2018-10-31 17:31:35 +00001412 {
1413 _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
1414 "merging container with incompatible allocator");
1415 __tree_.__node_handle_merge_unique(__source.__tree_);
1416 }
Louis Dionned2322c82018-11-01 14:41:37 +00001417 template <class _Compare2>
Erik Pilkington82a65ad2018-10-31 17:31:35 +00001418 _LIBCPP_INLINE_VISIBILITY
Louis Dionned2322c82018-11-01 14:41:37 +00001419 void merge(multimap<key_type, mapped_type, _Compare2, allocator_type>& __source)
Erik Pilkington82a65ad2018-10-31 17:31:35 +00001420 {
1421 _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
1422 "merging container with incompatible allocator");
1423 __tree_.__node_handle_merge_unique(__source.__tree_);
1424 }
Louis Dionned2322c82018-11-01 14:41:37 +00001425 template <class _Compare2>
Erik Pilkington82a65ad2018-10-31 17:31:35 +00001426 _LIBCPP_INLINE_VISIBILITY
Louis Dionned2322c82018-11-01 14:41:37 +00001427 void merge(multimap<key_type, mapped_type, _Compare2, allocator_type>&& __source)
Erik Pilkington82a65ad2018-10-31 17:31:35 +00001428 {
1429 _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
1430 "merging container with incompatible allocator");
1431 __tree_.__node_handle_merge_unique(__source.__tree_);
1432 }
Erik Pilkingtonc37a3d82018-08-01 01:33:38 +00001433#endif
1434
Howard Hinnant756c69b2010-09-22 16:48:34 +00001435 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001436 void swap(map& __m)
1437 _NOEXCEPT_(__is_nothrow_swappable<__base>::value)
1438 {__tree_.swap(__m.__tree_);}
Howard Hinnantc51e1022010-05-11 19:42:16 +00001439
Howard Hinnant756c69b2010-09-22 16:48:34 +00001440 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001441 iterator find(const key_type& __k) {return __tree_.find(__k);}
Howard Hinnant756c69b2010-09-22 16:48:34 +00001442 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001443 const_iterator find(const key_type& __k) const {return __tree_.find(__k);}
Marshall Clowebb57322013-08-13 22:18:47 +00001444#if _LIBCPP_STD_VER > 11
1445 template <typename _K2>
1446 _LIBCPP_INLINE_VISIBILITY
1447 typename enable_if<__is_transparent<_Compare, _K2>::value,iterator>::type
1448 find(const _K2& __k) {return __tree_.find(__k);}
1449 template <typename _K2>
1450 _LIBCPP_INLINE_VISIBILITY
1451 typename enable_if<__is_transparent<_Compare, _K2>::value,const_iterator>::type
1452 find(const _K2& __k) const {return __tree_.find(__k);}
1453#endif
1454
Howard Hinnant756c69b2010-09-22 16:48:34 +00001455 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001456 size_type count(const key_type& __k) const
1457 {return __tree_.__count_unique(__k);}
Marshall Clowe6a5f522014-08-24 23:54:16 +00001458#if _LIBCPP_STD_VER > 11
1459 template <typename _K2>
1460 _LIBCPP_INLINE_VISIBILITY
1461 typename enable_if<__is_transparent<_Compare, _K2>::value,size_type>::type
Eric Fiseliera85c9e92018-02-10 02:53:47 +00001462 count(const _K2& __k) const {return __tree_.__count_multi(__k);}
Marshall Clowe6a5f522014-08-24 23:54:16 +00001463#endif
Zoe Carver3ffbab12019-07-16 03:21:01 +00001464
1465#if _LIBCPP_STD_VER > 17
1466 _LIBCPP_INLINE_VISIBILITY
1467 bool contains(const key_type& __k) const {return find(__k) != end();}
Marek Kurdejd7e019e2021-04-13 17:10:55 +02001468 template <typename _K2>
1469 _LIBCPP_INLINE_VISIBILITY
1470 typename enable_if<__is_transparent<_Compare, _K2>::value, bool>::type
1471 contains(const _K2& __k) const { return find(__k) != end(); }
Zoe Carver3ffbab12019-07-16 03:21:01 +00001472#endif // _LIBCPP_STD_VER > 17
1473
Howard Hinnant756c69b2010-09-22 16:48:34 +00001474 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001475 iterator lower_bound(const key_type& __k)
1476 {return __tree_.lower_bound(__k);}
Howard Hinnant756c69b2010-09-22 16:48:34 +00001477 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001478 const_iterator lower_bound(const key_type& __k) const
1479 {return __tree_.lower_bound(__k);}
Marshall Clowebb57322013-08-13 22:18:47 +00001480#if _LIBCPP_STD_VER > 11
1481 template <typename _K2>
1482 _LIBCPP_INLINE_VISIBILITY
1483 typename enable_if<__is_transparent<_Compare, _K2>::value,iterator>::type
1484 lower_bound(const _K2& __k) {return __tree_.lower_bound(__k);}
1485
1486 template <typename _K2>
1487 _LIBCPP_INLINE_VISIBILITY
1488 typename enable_if<__is_transparent<_Compare, _K2>::value,const_iterator>::type
1489 lower_bound(const _K2& __k) const {return __tree_.lower_bound(__k);}
1490#endif
1491
Howard Hinnant756c69b2010-09-22 16:48:34 +00001492 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001493 iterator upper_bound(const key_type& __k)
1494 {return __tree_.upper_bound(__k);}
Howard Hinnant756c69b2010-09-22 16:48:34 +00001495 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001496 const_iterator upper_bound(const key_type& __k) const
1497 {return __tree_.upper_bound(__k);}
Marshall Clowebb57322013-08-13 22:18:47 +00001498#if _LIBCPP_STD_VER > 11
1499 template <typename _K2>
1500 _LIBCPP_INLINE_VISIBILITY
1501 typename enable_if<__is_transparent<_Compare, _K2>::value,iterator>::type
1502 upper_bound(const _K2& __k) {return __tree_.upper_bound(__k);}
1503 template <typename _K2>
1504 _LIBCPP_INLINE_VISIBILITY
1505 typename enable_if<__is_transparent<_Compare, _K2>::value,const_iterator>::type
1506 upper_bound(const _K2& __k) const {return __tree_.upper_bound(__k);}
1507#endif
1508
Howard Hinnant756c69b2010-09-22 16:48:34 +00001509 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001510 pair<iterator,iterator> equal_range(const key_type& __k)
1511 {return __tree_.__equal_range_unique(__k);}
Howard Hinnant756c69b2010-09-22 16:48:34 +00001512 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001513 pair<const_iterator,const_iterator> equal_range(const key_type& __k) const
1514 {return __tree_.__equal_range_unique(__k);}
Marshall Clowebb57322013-08-13 22:18:47 +00001515#if _LIBCPP_STD_VER > 11
1516 template <typename _K2>
1517 _LIBCPP_INLINE_VISIBILITY
1518 typename enable_if<__is_transparent<_Compare, _K2>::value,pair<iterator,iterator>>::type
Eric Fiseliera85c9e92018-02-10 02:53:47 +00001519 equal_range(const _K2& __k) {return __tree_.__equal_range_multi(__k);}
Marshall Clowebb57322013-08-13 22:18:47 +00001520 template <typename _K2>
1521 _LIBCPP_INLINE_VISIBILITY
1522 typename enable_if<__is_transparent<_Compare, _K2>::value,pair<const_iterator,const_iterator>>::type
Eric Fiseliera85c9e92018-02-10 02:53:47 +00001523 equal_range(const _K2& __k) const {return __tree_.__equal_range_multi(__k);}
Marshall Clowebb57322013-08-13 22:18:47 +00001524#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00001525
1526private:
1527 typedef typename __base::__node __node;
1528 typedef typename __base::__node_allocator __node_allocator;
1529 typedef typename __base::__node_pointer __node_pointer;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001530 typedef typename __base::__node_base_pointer __node_base_pointer;
Eric Fiseliercf8c0212017-01-05 06:06:18 +00001531 typedef typename __base::__parent_pointer __parent_pointer;
Eric Fiseliera92b0732016-02-20 07:12:17 +00001532
Howard Hinnantc834c512011-11-29 18:15:50 +00001533 typedef __map_node_destructor<__node_allocator> _Dp;
1534 typedef unique_ptr<__node, _Dp> __node_holder;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001535
Eric Fiselierd63f38e2016-03-31 03:13:37 +00001536#ifdef _LIBCPP_CXX03_LANG
Howard Hinnantac7e7482013-07-04 20:59:16 +00001537 __node_holder __construct_node_with_key(const key_type& __k);
Eric Fiselierd63f38e2016-03-31 03:13:37 +00001538#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00001539};
1540
Louis Dionned59f8a52021-08-17 11:59:07 -04001541#if _LIBCPP_STD_VER >= 17
Louis Dionned23a5f22019-06-20 19:32:00 +00001542template<class _InputIterator, class _Compare = less<__iter_key_type<_InputIterator>>,
1543 class _Allocator = allocator<__iter_to_alloc_type<_InputIterator>>,
Konstantin Varlamov53b543c2021-11-09 09:21:02 -08001544 class = enable_if_t<__is_cpp17_input_iterator<_InputIterator>::value, void>,
Louis Dionne25547162021-08-17 12:26:09 -04001545 class = enable_if_t<!__is_allocator<_Compare>::value, void>,
1546 class = enable_if_t<__is_allocator<_Allocator>::value, void>>
Louis Dionned23a5f22019-06-20 19:32:00 +00001547map(_InputIterator, _InputIterator, _Compare = _Compare(), _Allocator = _Allocator())
1548 -> map<__iter_key_type<_InputIterator>, __iter_mapped_type<_InputIterator>, _Compare, _Allocator>;
1549
1550template<class _Key, class _Tp, class _Compare = less<remove_const_t<_Key>>,
1551 class _Allocator = allocator<pair<const _Key, _Tp>>,
Louis Dionne25547162021-08-17 12:26:09 -04001552 class = enable_if_t<!__is_allocator<_Compare>::value, void>,
1553 class = enable_if_t<__is_allocator<_Allocator>::value, void>>
Louis Dionned23a5f22019-06-20 19:32:00 +00001554map(initializer_list<pair<_Key, _Tp>>, _Compare = _Compare(), _Allocator = _Allocator())
1555 -> map<remove_const_t<_Key>, _Tp, _Compare, _Allocator>;
1556
1557template<class _InputIterator, class _Allocator,
Konstantin Varlamov53b543c2021-11-09 09:21:02 -08001558 class = enable_if_t<__is_cpp17_input_iterator<_InputIterator>::value, void>,
Louis Dionne25547162021-08-17 12:26:09 -04001559 class = enable_if_t<__is_allocator<_Allocator>::value, void>>
Louis Dionned23a5f22019-06-20 19:32:00 +00001560map(_InputIterator, _InputIterator, _Allocator)
1561 -> map<__iter_key_type<_InputIterator>, __iter_mapped_type<_InputIterator>,
1562 less<__iter_key_type<_InputIterator>>, _Allocator>;
1563
1564template<class _Key, class _Tp, class _Allocator,
Louis Dionne25547162021-08-17 12:26:09 -04001565 class = enable_if_t<__is_allocator<_Allocator>::value, void>>
Louis Dionned23a5f22019-06-20 19:32:00 +00001566map(initializer_list<pair<_Key, _Tp>>, _Allocator)
1567 -> map<remove_const_t<_Key>, _Tp, less<remove_const_t<_Key>>, _Allocator>;
1568#endif
Eric Fiseliera92b0732016-02-20 07:12:17 +00001569
Eric Fiselierd06276b2016-03-31 02:15:15 +00001570#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00001571template <class _Key, class _Tp, class _Compare, class _Allocator>
1572map<_Key, _Tp, _Compare, _Allocator>::map(map&& __m, const allocator_type& __a)
Marshall Clow657cbc42016-08-17 05:58:40 +00001573 : __tree_(_VSTD::move(__m.__tree_), typename __base::allocator_type(__a))
Howard Hinnantc51e1022010-05-11 19:42:16 +00001574{
1575 if (__a != __m.get_allocator())
1576 {
1577 const_iterator __e = cend();
1578 while (!__m.empty())
1579 __tree_.__insert_unique(__e.__i_,
Erik Pilkingtond3fe2992018-06-04 20:38:23 +00001580 __m.__tree_.remove(__m.begin().__i_)->__value_.__move());
Howard Hinnantc51e1022010-05-11 19:42:16 +00001581 }
1582}
1583
Eric Fiseliera85b1282017-04-18 21:08:06 +00001584template <class _Key, class _Tp, class _Compare, class _Allocator>
1585_Tp&
1586map<_Key, _Tp, _Compare, _Allocator>::operator[](const key_type& __k)
1587{
1588 return __tree_.__emplace_unique_key_args(__k,
1589 _VSTD::piecewise_construct,
1590 _VSTD::forward_as_tuple(__k),
Erik Pilkingtond3fe2992018-06-04 20:38:23 +00001591 _VSTD::forward_as_tuple()).first->__get_value().second;
Eric Fiseliera85b1282017-04-18 21:08:06 +00001592}
Howard Hinnantc51e1022010-05-11 19:42:16 +00001593
Eric Fiseliera85b1282017-04-18 21:08:06 +00001594template <class _Key, class _Tp, class _Compare, class _Allocator>
1595_Tp&
1596map<_Key, _Tp, _Compare, _Allocator>::operator[](key_type&& __k)
1597{
1598 return __tree_.__emplace_unique_key_args(__k,
1599 _VSTD::piecewise_construct,
1600 _VSTD::forward_as_tuple(_VSTD::move(__k)),
Erik Pilkingtond3fe2992018-06-04 20:38:23 +00001601 _VSTD::forward_as_tuple()).first->__get_value().second;
Eric Fiseliera85b1282017-04-18 21:08:06 +00001602}
Eric Fiselierd63f38e2016-03-31 03:13:37 +00001603
Eric Fiseliera85b1282017-04-18 21:08:06 +00001604#else // _LIBCPP_CXX03_LANG
Eric Fiselierd63f38e2016-03-31 03:13:37 +00001605
Howard Hinnantc51e1022010-05-11 19:42:16 +00001606template <class _Key, class _Tp, class _Compare, class _Allocator>
1607typename map<_Key, _Tp, _Compare, _Allocator>::__node_holder
Howard Hinnantac7e7482013-07-04 20:59:16 +00001608map<_Key, _Tp, _Compare, _Allocator>::__construct_node_with_key(const key_type& __k)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001609{
1610 __node_allocator& __na = __tree_.__node_alloc();
Howard Hinnantc834c512011-11-29 18:15:50 +00001611 __node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na));
Erik Pilkingtond3fe2992018-06-04 20:38:23 +00001612 __node_traits::construct(__na, _VSTD::addressof(__h->__value_.__get_value().first), __k);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001613 __h.get_deleter().__first_constructed = true;
Erik Pilkingtond3fe2992018-06-04 20:38:23 +00001614 __node_traits::construct(__na, _VSTD::addressof(__h->__value_.__get_value().second));
Howard Hinnantc51e1022010-05-11 19:42:16 +00001615 __h.get_deleter().__second_constructed = true;
Louis Dionne7b844362020-07-30 09:42:23 -04001616 return __h;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001617}
1618
Howard Hinnantc51e1022010-05-11 19:42:16 +00001619template <class _Key, class _Tp, class _Compare, class _Allocator>
1620_Tp&
1621map<_Key, _Tp, _Compare, _Allocator>::operator[](const key_type& __k)
1622{
Eric Fiseliercf8c0212017-01-05 06:06:18 +00001623 __parent_pointer __parent;
1624 __node_base_pointer& __child = __tree_.__find_equal(__parent, __k);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001625 __node_pointer __r = static_cast<__node_pointer>(__child);
1626 if (__child == nullptr)
1627 {
Howard Hinnantac7e7482013-07-04 20:59:16 +00001628 __node_holder __h = __construct_node_with_key(__k);
Howard Hinnant2d0046b2013-06-19 21:29:40 +00001629 __tree_.__insert_node_at(__parent, __child, static_cast<__node_base_pointer>(__h.get()));
Howard Hinnantc51e1022010-05-11 19:42:16 +00001630 __r = __h.release();
1631 }
Erik Pilkingtond3fe2992018-06-04 20:38:23 +00001632 return __r->__value_.__get_value().second;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001633}
1634
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04001635#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00001636
1637template <class _Key, class _Tp, class _Compare, class _Allocator>
1638_Tp&
1639map<_Key, _Tp, _Compare, _Allocator>::at(const key_type& __k)
1640{
Eric Fiseliercf8c0212017-01-05 06:06:18 +00001641 __parent_pointer __parent;
1642 __node_base_pointer& __child = __tree_.__find_equal(__parent, __k);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001643 if (__child == nullptr)
Louis Dionne2b239162019-02-12 16:06:02 +00001644 __throw_out_of_range("map::at: key not found");
Erik Pilkingtond3fe2992018-06-04 20:38:23 +00001645 return static_cast<__node_pointer>(__child)->__value_.__get_value().second;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001646}
1647
1648template <class _Key, class _Tp, class _Compare, class _Allocator>
1649const _Tp&
1650map<_Key, _Tp, _Compare, _Allocator>::at(const key_type& __k) const
1651{
Eric Fiseliercf8c0212017-01-05 06:06:18 +00001652 __parent_pointer __parent;
1653 __node_base_pointer __child = __tree_.__find_equal(__parent, __k);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001654 if (__child == nullptr)
Louis Dionne2b239162019-02-12 16:06:02 +00001655 __throw_out_of_range("map::at: key not found");
Erik Pilkingtond3fe2992018-06-04 20:38:23 +00001656 return static_cast<__node_pointer>(__child)->__value_.__get_value().second;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001657}
1658
Howard Hinnantc51e1022010-05-11 19:42:16 +00001659
1660template <class _Key, class _Tp, class _Compare, class _Allocator>
Howard Hinnant756c69b2010-09-22 16:48:34 +00001661inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001662bool
1663operator==(const map<_Key, _Tp, _Compare, _Allocator>& __x,
1664 const map<_Key, _Tp, _Compare, _Allocator>& __y)
1665{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001666 return __x.size() == __y.size() && _VSTD::equal(__x.begin(), __x.end(), __y.begin());
Howard Hinnantc51e1022010-05-11 19:42:16 +00001667}
1668
1669template <class _Key, class _Tp, class _Compare, class _Allocator>
Howard Hinnant756c69b2010-09-22 16:48:34 +00001670inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001671bool
1672operator< (const map<_Key, _Tp, _Compare, _Allocator>& __x,
1673 const map<_Key, _Tp, _Compare, _Allocator>& __y)
1674{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001675 return _VSTD::lexicographical_compare(__x.begin(), __x.end(), __y.begin(), __y.end());
Howard Hinnantc51e1022010-05-11 19:42:16 +00001676}
1677
1678template <class _Key, class _Tp, class _Compare, class _Allocator>
Howard Hinnant756c69b2010-09-22 16:48:34 +00001679inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001680bool
1681operator!=(const map<_Key, _Tp, _Compare, _Allocator>& __x,
1682 const map<_Key, _Tp, _Compare, _Allocator>& __y)
1683{
1684 return !(__x == __y);
1685}
1686
1687template <class _Key, class _Tp, class _Compare, class _Allocator>
Howard Hinnant756c69b2010-09-22 16:48:34 +00001688inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001689bool
1690operator> (const map<_Key, _Tp, _Compare, _Allocator>& __x,
1691 const map<_Key, _Tp, _Compare, _Allocator>& __y)
1692{
1693 return __y < __x;
1694}
1695
1696template <class _Key, class _Tp, class _Compare, class _Allocator>
Howard Hinnant756c69b2010-09-22 16:48:34 +00001697inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001698bool
1699operator>=(const map<_Key, _Tp, _Compare, _Allocator>& __x,
1700 const map<_Key, _Tp, _Compare, _Allocator>& __y)
1701{
1702 return !(__x < __y);
1703}
1704
1705template <class _Key, class _Tp, class _Compare, class _Allocator>
Howard Hinnant756c69b2010-09-22 16:48:34 +00001706inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001707bool
1708operator<=(const map<_Key, _Tp, _Compare, _Allocator>& __x,
1709 const map<_Key, _Tp, _Compare, _Allocator>& __y)
1710{
1711 return !(__y < __x);
1712}
1713
1714template <class _Key, class _Tp, class _Compare, class _Allocator>
Howard Hinnant756c69b2010-09-22 16:48:34 +00001715inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001716void
1717swap(map<_Key, _Tp, _Compare, _Allocator>& __x,
1718 map<_Key, _Tp, _Compare, _Allocator>& __y)
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001719 _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
Howard Hinnantc51e1022010-05-11 19:42:16 +00001720{
1721 __x.swap(__y);
1722}
1723
Marshall Clow29b53f22018-12-14 18:49:35 +00001724#if _LIBCPP_STD_VER > 17
Marek Kurdeja98b1412020-05-02 13:58:03 +02001725template <class _Key, class _Tp, class _Compare, class _Allocator,
1726 class _Predicate>
Marshall Clow29b53f22018-12-14 18:49:35 +00001727inline _LIBCPP_INLINE_VISIBILITY
Marek Kurdeja98b1412020-05-02 13:58:03 +02001728 typename map<_Key, _Tp, _Compare, _Allocator>::size_type
1729 erase_if(map<_Key, _Tp, _Compare, _Allocator>& __c, _Predicate __pred) {
Arthur O'Dwyerb6738bd2021-03-21 16:53:09 -04001730 return _VSTD::__libcpp_erase_if_container(__c, __pred);
Marek Kurdeja98b1412020-05-02 13:58:03 +02001731}
Marshall Clow29b53f22018-12-14 18:49:35 +00001732#endif
1733
1734
Howard Hinnantc51e1022010-05-11 19:42:16 +00001735template <class _Key, class _Tp, class _Compare = less<_Key>,
1736 class _Allocator = allocator<pair<const _Key, _Tp> > >
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +00001737class _LIBCPP_TEMPLATE_VIS multimap
Howard Hinnantc51e1022010-05-11 19:42:16 +00001738{
1739public:
1740 // types:
1741 typedef _Key key_type;
1742 typedef _Tp mapped_type;
1743 typedef pair<const key_type, mapped_type> value_type;
Arthur O'Dwyer6a752e12021-03-03 11:10:49 -05001744 typedef __identity_t<_Compare> key_compare;
1745 typedef __identity_t<_Allocator> allocator_type;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001746 typedef value_type& reference;
1747 typedef const value_type& const_reference;
1748
Marshall Clow5128cf32015-11-26 01:24:04 +00001749 static_assert((is_same<typename allocator_type::value_type, value_type>::value),
1750 "Allocator::value_type must be same type as value_type");
1751
Arthur O'Dwyerf5486c82021-05-25 14:34:18 -04001752_LIBCPP_SUPPRESS_DEPRECATED_PUSH
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +00001753 class _LIBCPP_TEMPLATE_VIS value_compare
Arthur O'Dwyerf5486c82021-05-25 14:34:18 -04001754#if defined(_LIBCPP_ENABLE_CXX20_REMOVED_BINDER_TYPEDEFS)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001755 : public binary_function<value_type, value_type, bool>
Arthur O'Dwyerf5486c82021-05-25 14:34:18 -04001756#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00001757 {
Arthur O'Dwyerf5486c82021-05-25 14:34:18 -04001758_LIBCPP_SUPPRESS_DEPRECATED_POP
Howard Hinnantc51e1022010-05-11 19:42:16 +00001759 friend class multimap;
1760 protected:
1761 key_compare comp;
1762
Howard Hinnant756c69b2010-09-22 16:48:34 +00001763 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001764 value_compare(key_compare c) : comp(c) {}
1765 public:
Arthur O'Dwyerf5486c82021-05-25 14:34:18 -04001766#if _LIBCPP_STD_VER <= 17 || defined(_LIBCPP_ENABLE_CXX20_REMOVED_BINDER_TYPEDEFS)
1767 _LIBCPP_DEPRECATED_IN_CXX17 typedef bool result_type;
1768 _LIBCPP_DEPRECATED_IN_CXX17 typedef value_type first_argument_type;
1769 _LIBCPP_DEPRECATED_IN_CXX17 typedef value_type second_argument_type;
1770#endif
Howard Hinnant756c69b2010-09-22 16:48:34 +00001771 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001772 bool operator()(const value_type& __x, const value_type& __y) const
1773 {return comp(__x.first, __y.first);}
1774 };
1775
1776private:
Howard Hinnant2d0046b2013-06-19 21:29:40 +00001777
Howard Hinnant89f8b792013-09-30 19:08:22 +00001778 typedef _VSTD::__value_type<key_type, mapped_type> __value_type;
Howard Hinnant90b91592013-07-05 18:06:00 +00001779 typedef __map_value_compare<key_type, __value_type, key_compare> __vc;
Marshall Clow940e01c2015-04-07 05:21:38 +00001780 typedef typename __rebind_alloc_helper<allocator_traits<allocator_type>,
1781 __value_type>::type __allocator_type;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001782 typedef __tree<__value_type, __vc, __allocator_type> __base;
1783 typedef typename __base::__node_traits __node_traits;
1784 typedef allocator_traits<allocator_type> __alloc_traits;
1785
1786 __base __tree_;
1787
1788public:
1789 typedef typename __alloc_traits::pointer pointer;
1790 typedef typename __alloc_traits::const_pointer const_pointer;
1791 typedef typename __alloc_traits::size_type size_type;
1792 typedef typename __alloc_traits::difference_type difference_type;
1793 typedef __map_iterator<typename __base::iterator> iterator;
1794 typedef __map_const_iterator<typename __base::const_iterator> const_iterator;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001795 typedef _VSTD::reverse_iterator<iterator> reverse_iterator;
1796 typedef _VSTD::reverse_iterator<const_iterator> const_reverse_iterator;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001797
Erik Pilkingtonc37a3d82018-08-01 01:33:38 +00001798#if _LIBCPP_STD_VER > 14
1799 typedef __map_node_handle<typename __base::__node, allocator_type> node_type;
1800#endif
1801
Erik Pilkington82a65ad2018-10-31 17:31:35 +00001802 template <class _Key2, class _Value2, class _Comp2, class _Alloc2>
1803 friend class _LIBCPP_TEMPLATE_VIS map;
1804 template <class _Key2, class _Value2, class _Comp2, class _Alloc2>
1805 friend class _LIBCPP_TEMPLATE_VIS multimap;
1806
Howard Hinnant756c69b2010-09-22 16:48:34 +00001807 _LIBCPP_INLINE_VISIBILITY
Marshall Clow7086a5a2014-03-10 04:50:10 +00001808 multimap()
1809 _NOEXCEPT_(
1810 is_nothrow_default_constructible<allocator_type>::value &&
1811 is_nothrow_default_constructible<key_compare>::value &&
1812 is_nothrow_copy_constructible<key_compare>::value)
1813 : __tree_(__vc(key_compare())) {}
1814
1815 _LIBCPP_INLINE_VISIBILITY
1816 explicit multimap(const key_compare& __comp)
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001817 _NOEXCEPT_(
1818 is_nothrow_default_constructible<allocator_type>::value &&
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001819 is_nothrow_copy_constructible<key_compare>::value)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001820 : __tree_(__vc(__comp)) {}
1821
Howard Hinnant756c69b2010-09-22 16:48:34 +00001822 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001823 explicit multimap(const key_compare& __comp, const allocator_type& __a)
Marshall Clow657cbc42016-08-17 05:58:40 +00001824 : __tree_(__vc(__comp), typename __base::allocator_type(__a)) {}
Howard Hinnantc51e1022010-05-11 19:42:16 +00001825
1826 template <class _InputIterator>
Howard Hinnant756c69b2010-09-22 16:48:34 +00001827 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001828 multimap(_InputIterator __f, _InputIterator __l,
1829 const key_compare& __comp = key_compare())
1830 : __tree_(__vc(__comp))
1831 {
1832 insert(__f, __l);
1833 }
1834
1835 template <class _InputIterator>
Howard Hinnant756c69b2010-09-22 16:48:34 +00001836 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001837 multimap(_InputIterator __f, _InputIterator __l,
1838 const key_compare& __comp, const allocator_type& __a)
Marshall Clow657cbc42016-08-17 05:58:40 +00001839 : __tree_(__vc(__comp), typename __base::allocator_type(__a))
Howard Hinnantc51e1022010-05-11 19:42:16 +00001840 {
1841 insert(__f, __l);
1842 }
1843
Marshall Clow300abfb2013-09-11 01:15:47 +00001844#if _LIBCPP_STD_VER > 11
1845 template <class _InputIterator>
Eric Fiseliercf8c0212017-01-05 06:06:18 +00001846 _LIBCPP_INLINE_VISIBILITY
Marshall Clow300abfb2013-09-11 01:15:47 +00001847 multimap(_InputIterator __f, _InputIterator __l, const allocator_type& __a)
1848 : multimap(__f, __l, key_compare(), __a) {}
1849#endif
1850
Howard Hinnant756c69b2010-09-22 16:48:34 +00001851 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001852 multimap(const multimap& __m)
1853 : __tree_(__m.__tree_.value_comp(),
1854 __alloc_traits::select_on_container_copy_construction(__m.__tree_.__alloc()))
1855 {
1856 insert(__m.begin(), __m.end());
1857 }
1858
Howard Hinnantd3a657f2011-07-01 19:24:36 +00001859 _LIBCPP_INLINE_VISIBILITY
1860 multimap& operator=(const multimap& __m)
1861 {
Marshall Clow476d3f42016-07-18 13:19:00 +00001862#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantd3a657f2011-07-01 19:24:36 +00001863 __tree_ = __m.__tree_;
Howard Hinnant2d0046b2013-06-19 21:29:40 +00001864#else
Mark de Wever357a1fc2021-09-28 19:15:18 +02001865 if (this != _VSTD::addressof(__m)) {
Marshall Clowdb3cfcb2014-02-08 04:03:14 +00001866 __tree_.clear();
1867 __tree_.value_comp() = __m.__tree_.value_comp();
1868 __tree_.__copy_assign_alloc(__m.__tree_);
1869 insert(__m.begin(), __m.end());
1870 }
Howard Hinnant2d0046b2013-06-19 21:29:40 +00001871#endif
Howard Hinnantd3a657f2011-07-01 19:24:36 +00001872 return *this;
1873 }
1874
Eric Fiseliera85b1282017-04-18 21:08:06 +00001875#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00001876
Howard Hinnant756c69b2010-09-22 16:48:34 +00001877 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001878 multimap(multimap&& __m)
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001879 _NOEXCEPT_(is_nothrow_move_constructible<__base>::value)
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001880 : __tree_(_VSTD::move(__m.__tree_))
Howard Hinnantc51e1022010-05-11 19:42:16 +00001881 {
1882 }
1883
1884 multimap(multimap&& __m, const allocator_type& __a);
1885
Howard Hinnant756c69b2010-09-22 16:48:34 +00001886 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant33711792011-08-12 21:56:02 +00001887 multimap& operator=(multimap&& __m)
1888 _NOEXCEPT_(is_nothrow_move_assignable<__base>::value)
1889 {
1890 __tree_ = _VSTD::move(__m.__tree_);
1891 return *this;
1892 }
1893
Howard Hinnant33711792011-08-12 21:56:02 +00001894 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001895 multimap(initializer_list<value_type> __il, const key_compare& __comp = key_compare())
1896 : __tree_(__vc(__comp))
1897 {
1898 insert(__il.begin(), __il.end());
1899 }
1900
Howard Hinnant756c69b2010-09-22 16:48:34 +00001901 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001902 multimap(initializer_list<value_type> __il, const key_compare& __comp, const allocator_type& __a)
Marshall Clow657cbc42016-08-17 05:58:40 +00001903 : __tree_(__vc(__comp), typename __base::allocator_type(__a))
Howard Hinnantc51e1022010-05-11 19:42:16 +00001904 {
1905 insert(__il.begin(), __il.end());
1906 }
1907
Marshall Clow300abfb2013-09-11 01:15:47 +00001908#if _LIBCPP_STD_VER > 11
Eric Fiseliercf8c0212017-01-05 06:06:18 +00001909 _LIBCPP_INLINE_VISIBILITY
Marshall Clow300abfb2013-09-11 01:15:47 +00001910 multimap(initializer_list<value_type> __il, const allocator_type& __a)
1911 : multimap(__il, key_compare(), __a) {}
1912#endif
1913
Howard Hinnant756c69b2010-09-22 16:48:34 +00001914 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001915 multimap& operator=(initializer_list<value_type> __il)
1916 {
1917 __tree_.__assign_multi(__il.begin(), __il.end());
1918 return *this;
1919 }
Howard Hinnant33711792011-08-12 21:56:02 +00001920
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04001921#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00001922
Howard Hinnant756c69b2010-09-22 16:48:34 +00001923 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001924 explicit multimap(const allocator_type& __a)
Marshall Clow657cbc42016-08-17 05:58:40 +00001925 : __tree_(typename __base::allocator_type(__a))
Howard Hinnantc51e1022010-05-11 19:42:16 +00001926 {
1927 }
1928
Howard Hinnant756c69b2010-09-22 16:48:34 +00001929 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001930 multimap(const multimap& __m, const allocator_type& __a)
Marshall Clow657cbc42016-08-17 05:58:40 +00001931 : __tree_(__m.__tree_.value_comp(), typename __base::allocator_type(__a))
Howard Hinnantc51e1022010-05-11 19:42:16 +00001932 {
1933 insert(__m.begin(), __m.end());
1934 }
1935
Howard Hinnant756c69b2010-09-22 16:48:34 +00001936 _LIBCPP_INLINE_VISIBILITY
Louis Dionne69c42c02019-04-11 16:14:56 +00001937 ~multimap() {
1938 static_assert(sizeof(__diagnose_non_const_comparator<_Key, _Compare>()), "");
1939 }
1940
1941 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001942 iterator begin() _NOEXCEPT {return __tree_.begin();}
Howard Hinnant756c69b2010-09-22 16:48:34 +00001943 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001944 const_iterator begin() const _NOEXCEPT {return __tree_.begin();}
Howard Hinnant756c69b2010-09-22 16:48:34 +00001945 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001946 iterator end() _NOEXCEPT {return __tree_.end();}
Howard Hinnant756c69b2010-09-22 16:48:34 +00001947 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001948 const_iterator end() const _NOEXCEPT {return __tree_.end();}
Howard Hinnantc51e1022010-05-11 19:42:16 +00001949
Howard Hinnant756c69b2010-09-22 16:48:34 +00001950 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001951 reverse_iterator rbegin() _NOEXCEPT {return reverse_iterator(end());}
Howard Hinnant756c69b2010-09-22 16:48:34 +00001952 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001953 const_reverse_iterator rbegin() const _NOEXCEPT
1954 {return const_reverse_iterator(end());}
Howard Hinnant756c69b2010-09-22 16:48:34 +00001955 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001956 reverse_iterator rend() _NOEXCEPT {return reverse_iterator(begin());}
Howard Hinnant756c69b2010-09-22 16:48:34 +00001957 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001958 const_reverse_iterator rend() const _NOEXCEPT
1959 {return const_reverse_iterator(begin());}
Howard Hinnantc51e1022010-05-11 19:42:16 +00001960
Howard Hinnant756c69b2010-09-22 16:48:34 +00001961 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001962 const_iterator cbegin() const _NOEXCEPT {return begin();}
Howard Hinnant756c69b2010-09-22 16:48:34 +00001963 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001964 const_iterator cend() const _NOEXCEPT {return end();}
Howard Hinnant756c69b2010-09-22 16:48:34 +00001965 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001966 const_reverse_iterator crbegin() const _NOEXCEPT {return rbegin();}
Howard Hinnant756c69b2010-09-22 16:48:34 +00001967 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001968 const_reverse_iterator crend() const _NOEXCEPT {return rend();}
Howard Hinnantc51e1022010-05-11 19:42:16 +00001969
Marshall Clow425f5752017-11-15 05:51:26 +00001970 _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001971 bool empty() const _NOEXCEPT {return __tree_.size() == 0;}
Howard Hinnant756c69b2010-09-22 16:48:34 +00001972 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001973 size_type size() const _NOEXCEPT {return __tree_.size();}
Howard Hinnant756c69b2010-09-22 16:48:34 +00001974 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001975 size_type max_size() const _NOEXCEPT {return __tree_.max_size();}
Howard Hinnantc51e1022010-05-11 19:42:16 +00001976
Howard Hinnant756c69b2010-09-22 16:48:34 +00001977 _LIBCPP_INLINE_VISIBILITY
Marshall Clow657cbc42016-08-17 05:58:40 +00001978 allocator_type get_allocator() const _NOEXCEPT {return allocator_type(__tree_.__alloc());}
Howard Hinnant756c69b2010-09-22 16:48:34 +00001979 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001980 key_compare key_comp() const {return __tree_.value_comp().key_comp();}
Howard Hinnant756c69b2010-09-22 16:48:34 +00001981 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001982 value_compare value_comp() const
1983 {return value_compare(__tree_.value_comp().key_comp());}
Howard Hinnantc51e1022010-05-11 19:42:16 +00001984
Eric Fiselierd06276b2016-03-31 02:15:15 +00001985#ifndef _LIBCPP_CXX03_LANG
Howard Hinnant74279a52010-09-04 23:28:19 +00001986
Howard Hinnant29eb9b82012-05-25 22:04:21 +00001987 template <class ..._Args>
Eric Fiselierd06276b2016-03-31 02:15:15 +00001988 _LIBCPP_INLINE_VISIBILITY
1989 iterator emplace(_Args&& ...__args) {
1990 return __tree_.__emplace_multi(_VSTD::forward<_Args>(__args)...);
1991 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00001992
Howard Hinnant29eb9b82012-05-25 22:04:21 +00001993 template <class ..._Args>
Eric Fiselierd06276b2016-03-31 02:15:15 +00001994 _LIBCPP_INLINE_VISIBILITY
1995 iterator emplace_hint(const_iterator __p, _Args&& ...__args) {
1996 return __tree_.__emplace_hint_multi(__p.__i_, _VSTD::forward<_Args>(__args)...);
1997 }
Howard Hinnant74279a52010-09-04 23:28:19 +00001998
Howard Hinnantc834c512011-11-29 18:15:50 +00001999 template <class _Pp,
2000 class = typename enable_if<is_constructible<value_type, _Pp>::value>::type>
Howard Hinnant756c69b2010-09-22 16:48:34 +00002001 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc834c512011-11-29 18:15:50 +00002002 iterator insert(_Pp&& __p)
2003 {return __tree_.__insert_multi(_VSTD::forward<_Pp>(__p));}
Howard Hinnantc51e1022010-05-11 19:42:16 +00002004
Howard Hinnantc834c512011-11-29 18:15:50 +00002005 template <class _Pp,
2006 class = typename enable_if<is_constructible<value_type, _Pp>::value>::type>
Howard Hinnant756c69b2010-09-22 16:48:34 +00002007 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc834c512011-11-29 18:15:50 +00002008 iterator insert(const_iterator __pos, _Pp&& __p)
2009 {return __tree_.__insert_multi(__pos.__i_, _VSTD::forward<_Pp>(__p));}
Howard Hinnantc51e1022010-05-11 19:42:16 +00002010
Eric Fiselierd6143132016-04-18 01:40:45 +00002011 _LIBCPP_INLINE_VISIBILITY
2012 iterator insert(value_type&& __v)
2013 {return __tree_.__insert_multi(_VSTD::move(__v));}
2014
2015 _LIBCPP_INLINE_VISIBILITY
2016 iterator insert(const_iterator __p, value_type&& __v)
2017 {return __tree_.__insert_multi(__p.__i_, _VSTD::move(__v));}
2018
Eric Fiseliera85b1282017-04-18 21:08:06 +00002019
2020 _LIBCPP_INLINE_VISIBILITY
2021 void insert(initializer_list<value_type> __il)
2022 {insert(__il.begin(), __il.end());}
2023
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04002024#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00002025
Howard Hinnant756c69b2010-09-22 16:48:34 +00002026 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002027 iterator insert(const value_type& __v) {return __tree_.__insert_multi(__v);}
2028
Howard Hinnant756c69b2010-09-22 16:48:34 +00002029 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002030 iterator insert(const_iterator __p, const value_type& __v)
2031 {return __tree_.__insert_multi(__p.__i_, __v);}
2032
2033 template <class _InputIterator>
Howard Hinnant756c69b2010-09-22 16:48:34 +00002034 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002035 void insert(_InputIterator __f, _InputIterator __l)
2036 {
2037 for (const_iterator __e = cend(); __f != __l; ++__f)
2038 __tree_.__insert_multi(__e.__i_, *__f);
2039 }
2040
Howard Hinnant756c69b2010-09-22 16:48:34 +00002041 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002042 iterator erase(const_iterator __p) {return __tree_.erase(__p.__i_);}
Howard Hinnant756c69b2010-09-22 16:48:34 +00002043 _LIBCPP_INLINE_VISIBILITY
Marshall Clow22ea5b82015-05-10 13:35:00 +00002044 iterator erase(iterator __p) {return __tree_.erase(__p.__i_);}
2045 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002046 size_type erase(const key_type& __k) {return __tree_.__erase_multi(__k);}
Howard Hinnant756c69b2010-09-22 16:48:34 +00002047 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002048 iterator erase(const_iterator __f, const_iterator __l)
2049 {return __tree_.erase(__f.__i_, __l.__i_);}
Erik Pilkingtonc37a3d82018-08-01 01:33:38 +00002050
2051#if _LIBCPP_STD_VER > 14
2052 _LIBCPP_INLINE_VISIBILITY
2053 iterator insert(node_type&& __nh)
2054 {
2055 _LIBCPP_ASSERT(__nh.empty() || __nh.get_allocator() == get_allocator(),
2056 "node_type with incompatible allocator passed to multimap::insert()");
2057 return __tree_.template __node_handle_insert_multi<node_type>(
2058 _VSTD::move(__nh));
2059 }
2060 _LIBCPP_INLINE_VISIBILITY
2061 iterator insert(const_iterator __hint, node_type&& __nh)
2062 {
2063 _LIBCPP_ASSERT(__nh.empty() || __nh.get_allocator() == get_allocator(),
2064 "node_type with incompatible allocator passed to multimap::insert()");
2065 return __tree_.template __node_handle_insert_multi<node_type>(
2066 __hint.__i_, _VSTD::move(__nh));
2067 }
2068 _LIBCPP_INLINE_VISIBILITY
2069 node_type extract(key_type const& __key)
2070 {
2071 return __tree_.template __node_handle_extract<node_type>(__key);
2072 }
2073 _LIBCPP_INLINE_VISIBILITY
2074 node_type extract(const_iterator __it)
2075 {
2076 return __tree_.template __node_handle_extract<node_type>(
2077 __it.__i_);
2078 }
Louis Dionned2322c82018-11-01 14:41:37 +00002079 template <class _Compare2>
Erik Pilkington82a65ad2018-10-31 17:31:35 +00002080 _LIBCPP_INLINE_VISIBILITY
Louis Dionned2322c82018-11-01 14:41:37 +00002081 void merge(multimap<key_type, mapped_type, _Compare2, allocator_type>& __source)
Erik Pilkington82a65ad2018-10-31 17:31:35 +00002082 {
2083 _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
2084 "merging container with incompatible allocator");
2085 return __tree_.__node_handle_merge_multi(__source.__tree_);
2086 }
Louis Dionned2322c82018-11-01 14:41:37 +00002087 template <class _Compare2>
Erik Pilkington82a65ad2018-10-31 17:31:35 +00002088 _LIBCPP_INLINE_VISIBILITY
Louis Dionned2322c82018-11-01 14:41:37 +00002089 void merge(multimap<key_type, mapped_type, _Compare2, allocator_type>&& __source)
Erik Pilkington82a65ad2018-10-31 17:31:35 +00002090 {
2091 _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
2092 "merging container with incompatible allocator");
2093 return __tree_.__node_handle_merge_multi(__source.__tree_);
2094 }
Louis Dionned2322c82018-11-01 14:41:37 +00002095 template <class _Compare2>
Erik Pilkington82a65ad2018-10-31 17:31:35 +00002096 _LIBCPP_INLINE_VISIBILITY
Louis Dionned2322c82018-11-01 14:41:37 +00002097 void merge(map<key_type, mapped_type, _Compare2, allocator_type>& __source)
Erik Pilkington82a65ad2018-10-31 17:31:35 +00002098 {
2099 _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
2100 "merging container with incompatible allocator");
2101 return __tree_.__node_handle_merge_multi(__source.__tree_);
2102 }
Louis Dionned2322c82018-11-01 14:41:37 +00002103 template <class _Compare2>
Erik Pilkington82a65ad2018-10-31 17:31:35 +00002104 _LIBCPP_INLINE_VISIBILITY
Louis Dionned2322c82018-11-01 14:41:37 +00002105 void merge(map<key_type, mapped_type, _Compare2, allocator_type>&& __source)
Erik Pilkington82a65ad2018-10-31 17:31:35 +00002106 {
2107 _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
2108 "merging container with incompatible allocator");
2109 return __tree_.__node_handle_merge_multi(__source.__tree_);
2110 }
Erik Pilkingtonc37a3d82018-08-01 01:33:38 +00002111#endif
2112
Howard Hinnant756c69b2010-09-22 16:48:34 +00002113 _LIBCPP_INLINE_VISIBILITY
Marshall Clowde1312a2018-08-22 04:28:43 +00002114 void clear() _NOEXCEPT {__tree_.clear();}
Howard Hinnantc51e1022010-05-11 19:42:16 +00002115
Howard Hinnant756c69b2010-09-22 16:48:34 +00002116 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00002117 void swap(multimap& __m)
2118 _NOEXCEPT_(__is_nothrow_swappable<__base>::value)
2119 {__tree_.swap(__m.__tree_);}
Howard Hinnantc51e1022010-05-11 19:42:16 +00002120
Howard Hinnant756c69b2010-09-22 16:48:34 +00002121 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002122 iterator find(const key_type& __k) {return __tree_.find(__k);}
Howard Hinnant756c69b2010-09-22 16:48:34 +00002123 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002124 const_iterator find(const key_type& __k) const {return __tree_.find(__k);}
Marshall Clowebb57322013-08-13 22:18:47 +00002125#if _LIBCPP_STD_VER > 11
2126 template <typename _K2>
2127 _LIBCPP_INLINE_VISIBILITY
2128 typename enable_if<__is_transparent<_Compare, _K2>::value,iterator>::type
2129 find(const _K2& __k) {return __tree_.find(__k);}
2130 template <typename _K2>
2131 _LIBCPP_INLINE_VISIBILITY
2132 typename enable_if<__is_transparent<_Compare, _K2>::value,const_iterator>::type
2133 find(const _K2& __k) const {return __tree_.find(__k);}
2134#endif
2135
Howard Hinnant756c69b2010-09-22 16:48:34 +00002136 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002137 size_type count(const key_type& __k) const
2138 {return __tree_.__count_multi(__k);}
Marshall Clowe6a5f522014-08-24 23:54:16 +00002139#if _LIBCPP_STD_VER > 11
2140 template <typename _K2>
2141 _LIBCPP_INLINE_VISIBILITY
2142 typename enable_if<__is_transparent<_Compare, _K2>::value,size_type>::type
Marshall Clow141e47b2015-06-30 18:15:41 +00002143 count(const _K2& __k) const {return __tree_.__count_multi(__k);}
Marshall Clowe6a5f522014-08-24 23:54:16 +00002144#endif
Zoe Carver3ffbab12019-07-16 03:21:01 +00002145
2146#if _LIBCPP_STD_VER > 17
2147 _LIBCPP_INLINE_VISIBILITY
2148 bool contains(const key_type& __k) const {return find(__k) != end();}
Marek Kurdejd7e019e2021-04-13 17:10:55 +02002149 template <typename _K2>
2150 _LIBCPP_INLINE_VISIBILITY
2151 typename enable_if<__is_transparent<_Compare, _K2>::value, bool>::type
2152 contains(const _K2& __k) const { return find(__k) != end(); }
Zoe Carver3ffbab12019-07-16 03:21:01 +00002153#endif // _LIBCPP_STD_VER > 17
2154
Howard Hinnant756c69b2010-09-22 16:48:34 +00002155 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002156 iterator lower_bound(const key_type& __k)
2157 {return __tree_.lower_bound(__k);}
Howard Hinnant756c69b2010-09-22 16:48:34 +00002158 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002159 const_iterator lower_bound(const key_type& __k) const
2160 {return __tree_.lower_bound(__k);}
Marshall Clowebb57322013-08-13 22:18:47 +00002161#if _LIBCPP_STD_VER > 11
2162 template <typename _K2>
2163 _LIBCPP_INLINE_VISIBILITY
2164 typename enable_if<__is_transparent<_Compare, _K2>::value,iterator>::type
2165 lower_bound(const _K2& __k) {return __tree_.lower_bound(__k);}
2166
2167 template <typename _K2>
2168 _LIBCPP_INLINE_VISIBILITY
2169 typename enable_if<__is_transparent<_Compare, _K2>::value,const_iterator>::type
2170 lower_bound(const _K2& __k) const {return __tree_.lower_bound(__k);}
2171#endif
2172
Howard Hinnant756c69b2010-09-22 16:48:34 +00002173 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002174 iterator upper_bound(const key_type& __k)
2175 {return __tree_.upper_bound(__k);}
Howard Hinnant756c69b2010-09-22 16:48:34 +00002176 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002177 const_iterator upper_bound(const key_type& __k) const
2178 {return __tree_.upper_bound(__k);}
Marshall Clowebb57322013-08-13 22:18:47 +00002179#if _LIBCPP_STD_VER > 11
2180 template <typename _K2>
2181 _LIBCPP_INLINE_VISIBILITY
2182 typename enable_if<__is_transparent<_Compare, _K2>::value,iterator>::type
2183 upper_bound(const _K2& __k) {return __tree_.upper_bound(__k);}
2184 template <typename _K2>
2185 _LIBCPP_INLINE_VISIBILITY
2186 typename enable_if<__is_transparent<_Compare, _K2>::value,const_iterator>::type
2187 upper_bound(const _K2& __k) const {return __tree_.upper_bound(__k);}
2188#endif
2189
Howard Hinnant756c69b2010-09-22 16:48:34 +00002190 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002191 pair<iterator,iterator> equal_range(const key_type& __k)
2192 {return __tree_.__equal_range_multi(__k);}
Howard Hinnant756c69b2010-09-22 16:48:34 +00002193 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002194 pair<const_iterator,const_iterator> equal_range(const key_type& __k) const
2195 {return __tree_.__equal_range_multi(__k);}
Marshall Clowebb57322013-08-13 22:18:47 +00002196#if _LIBCPP_STD_VER > 11
2197 template <typename _K2>
2198 _LIBCPP_INLINE_VISIBILITY
2199 typename enable_if<__is_transparent<_Compare, _K2>::value,pair<iterator,iterator>>::type
2200 equal_range(const _K2& __k) {return __tree_.__equal_range_multi(__k);}
2201 template <typename _K2>
2202 _LIBCPP_INLINE_VISIBILITY
2203 typename enable_if<__is_transparent<_Compare, _K2>::value,pair<const_iterator,const_iterator>>::type
2204 equal_range(const _K2& __k) const {return __tree_.__equal_range_multi(__k);}
2205#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00002206
2207private:
2208 typedef typename __base::__node __node;
2209 typedef typename __base::__node_allocator __node_allocator;
2210 typedef typename __base::__node_pointer __node_pointer;
Eric Fiseliera92b0732016-02-20 07:12:17 +00002211
Howard Hinnantc834c512011-11-29 18:15:50 +00002212 typedef __map_node_destructor<__node_allocator> _Dp;
2213 typedef unique_ptr<__node, _Dp> __node_holder;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002214};
2215
Louis Dionned59f8a52021-08-17 11:59:07 -04002216#if _LIBCPP_STD_VER >= 17
Louis Dionned23a5f22019-06-20 19:32:00 +00002217template<class _InputIterator, class _Compare = less<__iter_key_type<_InputIterator>>,
2218 class _Allocator = allocator<__iter_to_alloc_type<_InputIterator>>,
Konstantin Varlamov53b543c2021-11-09 09:21:02 -08002219 class = enable_if_t<__is_cpp17_input_iterator<_InputIterator>::value, void>,
Louis Dionne25547162021-08-17 12:26:09 -04002220 class = enable_if_t<!__is_allocator<_Compare>::value, void>,
2221 class = enable_if_t<__is_allocator<_Allocator>::value, void>>
Louis Dionned23a5f22019-06-20 19:32:00 +00002222multimap(_InputIterator, _InputIterator, _Compare = _Compare(), _Allocator = _Allocator())
2223 -> multimap<__iter_key_type<_InputIterator>, __iter_mapped_type<_InputIterator>, _Compare, _Allocator>;
2224
2225template<class _Key, class _Tp, class _Compare = less<remove_const_t<_Key>>,
2226 class _Allocator = allocator<pair<const _Key, _Tp>>,
Louis Dionne25547162021-08-17 12:26:09 -04002227 class = enable_if_t<!__is_allocator<_Compare>::value, void>,
2228 class = enable_if_t<__is_allocator<_Allocator>::value, void>>
Louis Dionned23a5f22019-06-20 19:32:00 +00002229multimap(initializer_list<pair<_Key, _Tp>>, _Compare = _Compare(), _Allocator = _Allocator())
2230 -> multimap<remove_const_t<_Key>, _Tp, _Compare, _Allocator>;
2231
2232template<class _InputIterator, class _Allocator,
Konstantin Varlamov53b543c2021-11-09 09:21:02 -08002233 class = enable_if_t<__is_cpp17_input_iterator<_InputIterator>::value, void>,
Louis Dionne25547162021-08-17 12:26:09 -04002234 class = enable_if_t<__is_allocator<_Allocator>::value, void>>
Louis Dionned23a5f22019-06-20 19:32:00 +00002235multimap(_InputIterator, _InputIterator, _Allocator)
2236 -> multimap<__iter_key_type<_InputIterator>, __iter_mapped_type<_InputIterator>,
2237 less<__iter_key_type<_InputIterator>>, _Allocator>;
2238
2239template<class _Key, class _Tp, class _Allocator,
Louis Dionne25547162021-08-17 12:26:09 -04002240 class = enable_if_t<__is_allocator<_Allocator>::value, void>>
Louis Dionned23a5f22019-06-20 19:32:00 +00002241multimap(initializer_list<pair<_Key, _Tp>>, _Allocator)
2242 -> multimap<remove_const_t<_Key>, _Tp, less<remove_const_t<_Key>>, _Allocator>;
2243#endif
2244
Eric Fiselierd06276b2016-03-31 02:15:15 +00002245#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00002246template <class _Key, class _Tp, class _Compare, class _Allocator>
2247multimap<_Key, _Tp, _Compare, _Allocator>::multimap(multimap&& __m, const allocator_type& __a)
Marshall Clow657cbc42016-08-17 05:58:40 +00002248 : __tree_(_VSTD::move(__m.__tree_), typename __base::allocator_type(__a))
Howard Hinnantc51e1022010-05-11 19:42:16 +00002249{
2250 if (__a != __m.get_allocator())
2251 {
2252 const_iterator __e = cend();
2253 while (!__m.empty())
2254 __tree_.__insert_multi(__e.__i_,
Erik Pilkingtond3fe2992018-06-04 20:38:23 +00002255 _VSTD::move(__m.__tree_.remove(__m.begin().__i_)->__value_.__move()));
Howard Hinnantc51e1022010-05-11 19:42:16 +00002256 }
2257}
Eric Fiselierd06276b2016-03-31 02:15:15 +00002258#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00002259
2260template <class _Key, class _Tp, class _Compare, class _Allocator>
Howard Hinnant756c69b2010-09-22 16:48:34 +00002261inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002262bool
2263operator==(const multimap<_Key, _Tp, _Compare, _Allocator>& __x,
2264 const multimap<_Key, _Tp, _Compare, _Allocator>& __y)
2265{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00002266 return __x.size() == __y.size() && _VSTD::equal(__x.begin(), __x.end(), __y.begin());
Howard Hinnantc51e1022010-05-11 19:42:16 +00002267}
2268
2269template <class _Key, class _Tp, class _Compare, class _Allocator>
Howard Hinnant756c69b2010-09-22 16:48:34 +00002270inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002271bool
2272operator< (const multimap<_Key, _Tp, _Compare, _Allocator>& __x,
2273 const multimap<_Key, _Tp, _Compare, _Allocator>& __y)
2274{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00002275 return _VSTD::lexicographical_compare(__x.begin(), __x.end(), __y.begin(), __y.end());
Howard Hinnantc51e1022010-05-11 19:42:16 +00002276}
2277
2278template <class _Key, class _Tp, class _Compare, class _Allocator>
Howard Hinnant756c69b2010-09-22 16:48:34 +00002279inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002280bool
2281operator!=(const multimap<_Key, _Tp, _Compare, _Allocator>& __x,
2282 const multimap<_Key, _Tp, _Compare, _Allocator>& __y)
2283{
2284 return !(__x == __y);
2285}
2286
2287template <class _Key, class _Tp, class _Compare, class _Allocator>
Howard Hinnant756c69b2010-09-22 16:48:34 +00002288inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002289bool
2290operator> (const multimap<_Key, _Tp, _Compare, _Allocator>& __x,
2291 const multimap<_Key, _Tp, _Compare, _Allocator>& __y)
2292{
2293 return __y < __x;
2294}
2295
2296template <class _Key, class _Tp, class _Compare, class _Allocator>
Howard Hinnant756c69b2010-09-22 16:48:34 +00002297inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002298bool
2299operator>=(const multimap<_Key, _Tp, _Compare, _Allocator>& __x,
2300 const multimap<_Key, _Tp, _Compare, _Allocator>& __y)
2301{
2302 return !(__x < __y);
2303}
2304
2305template <class _Key, class _Tp, class _Compare, class _Allocator>
Howard Hinnant756c69b2010-09-22 16:48:34 +00002306inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002307bool
2308operator<=(const multimap<_Key, _Tp, _Compare, _Allocator>& __x,
2309 const multimap<_Key, _Tp, _Compare, _Allocator>& __y)
2310{
2311 return !(__y < __x);
2312}
2313
2314template <class _Key, class _Tp, class _Compare, class _Allocator>
Howard Hinnant756c69b2010-09-22 16:48:34 +00002315inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002316void
2317swap(multimap<_Key, _Tp, _Compare, _Allocator>& __x,
2318 multimap<_Key, _Tp, _Compare, _Allocator>& __y)
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00002319 _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
Howard Hinnantc51e1022010-05-11 19:42:16 +00002320{
2321 __x.swap(__y);
2322}
2323
Marshall Clow29b53f22018-12-14 18:49:35 +00002324#if _LIBCPP_STD_VER > 17
Marek Kurdeja98b1412020-05-02 13:58:03 +02002325template <class _Key, class _Tp, class _Compare, class _Allocator,
2326 class _Predicate>
Marshall Clow29b53f22018-12-14 18:49:35 +00002327inline _LIBCPP_INLINE_VISIBILITY
Marek Kurdeja98b1412020-05-02 13:58:03 +02002328 typename multimap<_Key, _Tp, _Compare, _Allocator>::size_type
2329 erase_if(multimap<_Key, _Tp, _Compare, _Allocator>& __c,
2330 _Predicate __pred) {
Arthur O'Dwyerb6738bd2021-03-21 16:53:09 -04002331 return _VSTD::__libcpp_erase_if_container(__c, __pred);
Marek Kurdeja98b1412020-05-02 13:58:03 +02002332}
Marshall Clow29b53f22018-12-14 18:49:35 +00002333#endif
2334
Howard Hinnantc51e1022010-05-11 19:42:16 +00002335_LIBCPP_END_NAMESPACE_STD
2336
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04002337#endif // _LIBCPP_MAP