blob: 688e0685748583b492233b5bf8023642f4e1ed4e [file] [log] [blame]
Howard Hinnantc51e1022010-05-11 19:42:16 +00001// -*- C++ -*-
2//===----------------------------- map ------------------------------------===//
3//
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
46 : public binary_function<value_type, value_type, bool>
47 {
48 friend class map;
49 protected:
50 key_compare comp;
51
52 value_compare(key_compare c);
53 public:
54 bool operator()(const value_type& x, const value_type& y) const;
55 };
56
57 // construct/copy/destroy:
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +000058 map()
59 noexcept(
60 is_nothrow_default_constructible<allocator_type>::value &&
61 is_nothrow_default_constructible<key_compare>::value &&
62 is_nothrow_copy_constructible<key_compare>::value);
Howard Hinnantc51e1022010-05-11 19:42:16 +000063 explicit map(const key_compare& comp);
64 map(const key_compare& comp, const allocator_type& a);
65 template <class InputIterator>
66 map(InputIterator first, InputIterator last,
67 const key_compare& comp = key_compare());
68 template <class InputIterator>
69 map(InputIterator first, InputIterator last,
70 const key_compare& comp, const allocator_type& a);
71 map(const map& m);
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +000072 map(map&& m)
73 noexcept(
74 is_nothrow_move_constructible<allocator_type>::value &&
75 is_nothrow_move_constructible<key_compare>::value);
Howard Hinnantc51e1022010-05-11 19:42:16 +000076 explicit map(const allocator_type& a);
77 map(const map& m, const allocator_type& a);
78 map(map&& m, const allocator_type& a);
79 map(initializer_list<value_type> il, const key_compare& comp = key_compare());
80 map(initializer_list<value_type> il, const key_compare& comp, const allocator_type& a);
Marshall Clow300abfb2013-09-11 01:15:47 +000081 template <class InputIterator>
82 map(InputIterator first, InputIterator last, const allocator_type& a)
83 : map(first, last, Compare(), a) {} // C++14
84 map(initializer_list<value_type> il, const allocator_type& a)
85 : map(il, Compare(), a) {} // C++14
86 ~map();
Howard Hinnantc51e1022010-05-11 19:42:16 +000087
88 map& operator=(const map& m);
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +000089 map& operator=(map&& m)
90 noexcept(
91 allocator_type::propagate_on_container_move_assignment::value &&
92 is_nothrow_move_assignable<allocator_type>::value &&
Howard Hinnantf95f4f52011-06-04 15:22:34 +000093 is_nothrow_move_assignable<key_compare>::value);
Howard Hinnantc51e1022010-05-11 19:42:16 +000094 map& operator=(initializer_list<value_type> il);
95
96 // iterators:
Howard Hinnantf95f4f52011-06-04 15:22:34 +000097 iterator begin() noexcept;
98 const_iterator begin() const noexcept;
99 iterator end() noexcept;
100 const_iterator end() const noexcept;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000101
Howard Hinnantf95f4f52011-06-04 15:22:34 +0000102 reverse_iterator rbegin() noexcept;
103 const_reverse_iterator rbegin() const noexcept;
104 reverse_iterator rend() noexcept;
105 const_reverse_iterator rend() const noexcept;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000106
Howard Hinnantf95f4f52011-06-04 15:22:34 +0000107 const_iterator cbegin() const noexcept;
108 const_iterator cend() const noexcept;
109 const_reverse_iterator crbegin() const noexcept;
110 const_reverse_iterator crend() const noexcept;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000111
112 // capacity:
Howard Hinnantf95f4f52011-06-04 15:22:34 +0000113 bool empty() const noexcept;
114 size_type size() const noexcept;
115 size_type max_size() const noexcept;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000116
117 // element access:
118 mapped_type& operator[](const key_type& k);
119 mapped_type& operator[](key_type&& k);
120
121 mapped_type& at(const key_type& k);
122 const mapped_type& at(const key_type& k) const;
123
124 // modifiers:
125 template <class... Args>
126 pair<iterator, bool> emplace(Args&&... args);
127 template <class... Args>
128 iterator emplace_hint(const_iterator position, Args&&... args);
129 pair<iterator, bool> insert(const value_type& v);
Marshall Clowd430d022016-01-05 19:32:41 +0000130 pair<iterator, bool> insert( value_type&& v); // C++17
Howard Hinnantc51e1022010-05-11 19:42:16 +0000131 template <class P>
132 pair<iterator, bool> insert(P&& p);
133 iterator insert(const_iterator position, const value_type& v);
Marshall Clowd430d022016-01-05 19:32:41 +0000134 iterator insert(const_iterator position, value_type&& v); // C++17
Howard Hinnantc51e1022010-05-11 19:42:16 +0000135 template <class P>
136 iterator insert(const_iterator position, P&& p);
137 template <class InputIterator>
138 void insert(InputIterator first, InputIterator last);
139 void insert(initializer_list<value_type> il);
140
Erik Pilkingtonc37a3d82018-08-01 01:33:38 +0000141 node_type extract(const_iterator position); // C++17
142 node_type extract(const key_type& x); // C++17
143 insert_return_type insert(node_type&& nh); // C++17
144 iterator insert(const_iterator hint, node_type&& nh); // C++17
145
Marshall Clow3223db82015-07-07 03:37:33 +0000146 template <class... Args>
147 pair<iterator, bool> try_emplace(const key_type& k, Args&&... args); // C++17
148 template <class... Args>
149 pair<iterator, bool> try_emplace(key_type&& k, Args&&... args); // C++17
150 template <class... Args>
151 iterator try_emplace(const_iterator hint, const key_type& k, Args&&... args); // C++17
152 template <class... Args>
153 iterator try_emplace(const_iterator hint, key_type&& k, Args&&... args); // C++17
154 template <class M>
155 pair<iterator, bool> insert_or_assign(const key_type& k, M&& obj); // C++17
156 template <class M>
157 pair<iterator, bool> insert_or_assign(key_type&& k, M&& obj); // C++17
158 template <class M>
159 iterator insert_or_assign(const_iterator hint, const key_type& k, M&& obj); // C++17
160 template <class M>
161 iterator insert_or_assign(const_iterator hint, key_type&& k, M&& obj); // C++17
162
Howard Hinnantc51e1022010-05-11 19:42:16 +0000163 iterator erase(const_iterator position);
Marshall Clow22ea5b82015-05-10 13:35:00 +0000164 iterator erase(iterator position); // C++14
Howard Hinnantc51e1022010-05-11 19:42:16 +0000165 size_type erase(const key_type& k);
166 iterator erase(const_iterator first, const_iterator last);
Howard Hinnantf95f4f52011-06-04 15:22:34 +0000167 void clear() noexcept;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000168
Erik Pilkington82a65ad2018-10-31 17:31:35 +0000169 template<class C2>
170 void merge(map<Key, T, C2, Allocator>& source); // C++17
171 template<class C2>
172 void merge(map<Key, T, C2, Allocator>&& source); // C++17
173 template<class C2>
174 void merge(multimap<Key, T, C2, Allocator>& source); // C++17
175 template<class C2>
176 void merge(multimap<Key, T, C2, Allocator>&& source); // C++17
177
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +0000178 void swap(map& m)
Marshall Clow8982dcd2015-07-13 20:04:56 +0000179 noexcept(allocator_traits<allocator_type>::is_always_equal::value &&
Eric Fiselier6bfed252016-04-21 23:38:59 +0000180 is_nothrow_swappable<key_compare>::value); // C++17
Howard Hinnantc51e1022010-05-11 19:42:16 +0000181
182 // observers:
Howard Hinnantf95f4f52011-06-04 15:22:34 +0000183 allocator_type get_allocator() const noexcept;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000184 key_compare key_comp() const;
185 value_compare value_comp() const;
186
187 // map operations:
188 iterator find(const key_type& k);
189 const_iterator find(const key_type& k) const;
Marshall Clowebb57322013-08-13 22:18:47 +0000190 template<typename K>
191 iterator find(const K& x); // C++14
192 template<typename K>
193 const_iterator find(const K& x) const; // C++14
Marek Kurdejd7e019e2021-04-13 17:10:55 +0200194
Marshall Clowebb57322013-08-13 22:18:47 +0000195 template<typename K>
Marshall Clowe6a5f522014-08-24 23:54:16 +0000196 size_type count(const K& x) const; // C++14
Howard Hinnantc51e1022010-05-11 19:42:16 +0000197 size_type count(const key_type& k) const;
Marek Kurdejd7e019e2021-04-13 17:10:55 +0200198
199 bool contains(const key_type& x) const; // C++20
200 template<class K> bool contains(const K& x) const; // C++20
201
Howard Hinnantc51e1022010-05-11 19:42:16 +0000202 iterator lower_bound(const key_type& k);
203 const_iterator lower_bound(const key_type& k) const;
Marshall Clowebb57322013-08-13 22:18:47 +0000204 template<typename K>
205 iterator lower_bound(const K& x); // C++14
206 template<typename K>
207 const_iterator lower_bound(const K& x) const; // C++14
208
Howard Hinnantc51e1022010-05-11 19:42:16 +0000209 iterator upper_bound(const key_type& k);
210 const_iterator upper_bound(const key_type& k) const;
Marshall Clowebb57322013-08-13 22:18:47 +0000211 template<typename K>
212 iterator upper_bound(const K& x); // C++14
213 template<typename K>
214 const_iterator upper_bound(const K& x) const; // C++14
215
Howard Hinnantc51e1022010-05-11 19:42:16 +0000216 pair<iterator,iterator> equal_range(const key_type& k);
217 pair<const_iterator,const_iterator> equal_range(const key_type& k) const;
Marshall Clowebb57322013-08-13 22:18:47 +0000218 template<typename K>
219 pair<iterator,iterator> equal_range(const K& x); // C++14
220 template<typename K>
221 pair<const_iterator,const_iterator> equal_range(const K& x) const; // C++14
Howard Hinnantc51e1022010-05-11 19:42:16 +0000222};
223
224template <class Key, class T, class Compare, class Allocator>
225bool
226operator==(const map<Key, T, Compare, Allocator>& x,
227 const map<Key, T, Compare, Allocator>& y);
228
229template <class Key, class T, class Compare, class Allocator>
230bool
231operator< (const map<Key, T, Compare, Allocator>& x,
232 const map<Key, T, Compare, Allocator>& y);
233
234template <class Key, class T, class Compare, class Allocator>
235bool
236operator!=(const map<Key, T, Compare, Allocator>& x,
237 const map<Key, T, Compare, Allocator>& y);
238
239template <class Key, class T, class Compare, class Allocator>
240bool
241operator> (const map<Key, T, Compare, Allocator>& x,
242 const map<Key, T, Compare, Allocator>& y);
243
244template <class Key, class T, class Compare, class Allocator>
245bool
246operator>=(const map<Key, T, Compare, Allocator>& x,
247 const map<Key, T, Compare, Allocator>& y);
248
249template <class Key, class T, class Compare, class Allocator>
250bool
251operator<=(const map<Key, T, Compare, Allocator>& x,
252 const map<Key, T, Compare, Allocator>& y);
253
254// specialized algorithms:
255template <class Key, class T, class Compare, class Allocator>
256void
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +0000257swap(map<Key, T, Compare, Allocator>& x, map<Key, T, Compare, Allocator>& y)
258 noexcept(noexcept(x.swap(y)));
Howard Hinnantc51e1022010-05-11 19:42:16 +0000259
Marshall Clow29b53f22018-12-14 18:49:35 +0000260template <class Key, class T, class Compare, class Allocator, class Predicate>
Marek Kurdeja98b1412020-05-02 13:58:03 +0200261typename map<Key, T, Compare, Allocator>::size_type
262erase_if(map<Key, T, Compare, Allocator>& c, Predicate pred); // C++20
Marshall Clow29b53f22018-12-14 18:49:35 +0000263
264
Howard Hinnantc51e1022010-05-11 19:42:16 +0000265template <class Key, class T, class Compare = less<Key>,
266 class Allocator = allocator<pair<const Key, T>>>
267class multimap
268{
269public:
270 // types:
271 typedef Key key_type;
272 typedef T mapped_type;
273 typedef pair<const key_type,mapped_type> value_type;
274 typedef Compare key_compare;
275 typedef Allocator allocator_type;
276 typedef typename allocator_type::reference reference;
277 typedef typename allocator_type::const_reference const_reference;
278 typedef typename allocator_type::size_type size_type;
279 typedef typename allocator_type::difference_type difference_type;
280 typedef typename allocator_type::pointer pointer;
281 typedef typename allocator_type::const_pointer const_pointer;
282
283 typedef implementation-defined iterator;
284 typedef implementation-defined const_iterator;
285 typedef std::reverse_iterator<iterator> reverse_iterator;
286 typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
Erik Pilkingtonc37a3d82018-08-01 01:33:38 +0000287 typedef unspecified node_type; // C++17
Howard Hinnantc51e1022010-05-11 19:42:16 +0000288
289 class value_compare
290 : public binary_function<value_type,value_type,bool>
291 {
292 friend class multimap;
293 protected:
294 key_compare comp;
295 value_compare(key_compare c);
296 public:
297 bool operator()(const value_type& x, const value_type& y) const;
298 };
299
300 // construct/copy/destroy:
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +0000301 multimap()
302 noexcept(
303 is_nothrow_default_constructible<allocator_type>::value &&
304 is_nothrow_default_constructible<key_compare>::value &&
305 is_nothrow_copy_constructible<key_compare>::value);
306 explicit multimap(const key_compare& comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000307 multimap(const key_compare& comp, const allocator_type& a);
308 template <class InputIterator>
309 multimap(InputIterator first, InputIterator last, const key_compare& comp);
310 template <class InputIterator>
311 multimap(InputIterator first, InputIterator last, const key_compare& comp,
312 const allocator_type& a);
313 multimap(const multimap& m);
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +0000314 multimap(multimap&& m)
315 noexcept(
316 is_nothrow_move_constructible<allocator_type>::value &&
317 is_nothrow_move_constructible<key_compare>::value);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000318 explicit multimap(const allocator_type& a);
319 multimap(const multimap& m, const allocator_type& a);
320 multimap(multimap&& m, const allocator_type& a);
321 multimap(initializer_list<value_type> il, const key_compare& comp = key_compare());
322 multimap(initializer_list<value_type> il, const key_compare& comp,
323 const allocator_type& a);
Marshall Clow300abfb2013-09-11 01:15:47 +0000324 template <class InputIterator>
325 multimap(InputIterator first, InputIterator last, const allocator_type& a)
326 : multimap(first, last, Compare(), a) {} // C++14
327 multimap(initializer_list<value_type> il, const allocator_type& a)
328 : multimap(il, Compare(), a) {} // C++14
Howard Hinnantc51e1022010-05-11 19:42:16 +0000329 ~multimap();
330
331 multimap& operator=(const multimap& m);
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +0000332 multimap& operator=(multimap&& m)
333 noexcept(
334 allocator_type::propagate_on_container_move_assignment::value &&
335 is_nothrow_move_assignable<allocator_type>::value &&
Howard Hinnantf95f4f52011-06-04 15:22:34 +0000336 is_nothrow_move_assignable<key_compare>::value);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000337 multimap& operator=(initializer_list<value_type> il);
338
339 // iterators:
Howard Hinnantf95f4f52011-06-04 15:22:34 +0000340 iterator begin() noexcept;
341 const_iterator begin() const noexcept;
342 iterator end() noexcept;
343 const_iterator end() const noexcept;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000344
Howard Hinnantf95f4f52011-06-04 15:22:34 +0000345 reverse_iterator rbegin() noexcept;
346 const_reverse_iterator rbegin() const noexcept;
347 reverse_iterator rend() noexcept;
348 const_reverse_iterator rend() const noexcept;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000349
Howard Hinnantf95f4f52011-06-04 15:22:34 +0000350 const_iterator cbegin() const noexcept;
351 const_iterator cend() const noexcept;
352 const_reverse_iterator crbegin() const noexcept;
353 const_reverse_iterator crend() const noexcept;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000354
355 // capacity:
Howard Hinnantf95f4f52011-06-04 15:22:34 +0000356 bool empty() const noexcept;
357 size_type size() const noexcept;
358 size_type max_size() const noexcept;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000359
360 // modifiers:
361 template <class... Args>
362 iterator emplace(Args&&... args);
363 template <class... Args>
364 iterator emplace_hint(const_iterator position, Args&&... args);
365 iterator insert(const value_type& v);
Marshall Clowd430d022016-01-05 19:32:41 +0000366 iterator insert( value_type&& v); // C++17
Howard Hinnantc51e1022010-05-11 19:42:16 +0000367 template <class P>
368 iterator insert(P&& p);
369 iterator insert(const_iterator position, const value_type& v);
Marshall Clowd430d022016-01-05 19:32:41 +0000370 iterator insert(const_iterator position, value_type&& v); // C++17
Howard Hinnantc51e1022010-05-11 19:42:16 +0000371 template <class P>
372 iterator insert(const_iterator position, P&& p);
373 template <class InputIterator>
374 void insert(InputIterator first, InputIterator last);
375 void insert(initializer_list<value_type> il);
376
Erik Pilkingtonc37a3d82018-08-01 01:33:38 +0000377 node_type extract(const_iterator position); // C++17
378 node_type extract(const key_type& x); // C++17
379 iterator insert(node_type&& nh); // C++17
380 iterator insert(const_iterator hint, node_type&& nh); // C++17
381
Howard Hinnantc51e1022010-05-11 19:42:16 +0000382 iterator erase(const_iterator position);
Marshall Clow22ea5b82015-05-10 13:35:00 +0000383 iterator erase(iterator position); // C++14
Howard Hinnantc51e1022010-05-11 19:42:16 +0000384 size_type erase(const key_type& k);
385 iterator erase(const_iterator first, const_iterator last);
Howard Hinnantf95f4f52011-06-04 15:22:34 +0000386 void clear() noexcept;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000387
Erik Pilkington82a65ad2018-10-31 17:31:35 +0000388 template<class C2>
389 void merge(multimap<Key, T, C2, Allocator>& source); // C++17
390 template<class C2>
391 void merge(multimap<Key, T, C2, Allocator>&& source); // C++17
392 template<class C2>
393 void merge(map<Key, T, C2, Allocator>& source); // C++17
394 template<class C2>
395 void merge(map<Key, T, C2, Allocator>&& source); // C++17
396
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +0000397 void swap(multimap& m)
Marshall Clow8982dcd2015-07-13 20:04:56 +0000398 noexcept(allocator_traits<allocator_type>::is_always_equal::value &&
Eric Fiselier6bfed252016-04-21 23:38:59 +0000399 is_nothrow_swappable<key_compare>::value); // C++17
Howard Hinnantc51e1022010-05-11 19:42:16 +0000400
401 // observers:
Howard Hinnantf95f4f52011-06-04 15:22:34 +0000402 allocator_type get_allocator() const noexcept;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000403 key_compare key_comp() const;
404 value_compare value_comp() const;
405
406 // map operations:
407 iterator find(const key_type& k);
408 const_iterator find(const key_type& k) const;
Marshall Clowebb57322013-08-13 22:18:47 +0000409 template<typename K>
410 iterator find(const K& x); // C++14
411 template<typename K>
412 const_iterator find(const K& x) const; // C++14
Marek Kurdejd7e019e2021-04-13 17:10:55 +0200413
Marshall Clowebb57322013-08-13 22:18:47 +0000414 template<typename K>
Marshall Clowe6a5f522014-08-24 23:54:16 +0000415 size_type count(const K& x) const; // C++14
Howard Hinnantc51e1022010-05-11 19:42:16 +0000416 size_type count(const key_type& k) const;
Marek Kurdejd7e019e2021-04-13 17:10:55 +0200417
418 bool contains(const key_type& x) const; // C++20
419 template<class K> bool contains(const K& x) const; // C++20
420
Howard Hinnantc51e1022010-05-11 19:42:16 +0000421 iterator lower_bound(const key_type& k);
422 const_iterator lower_bound(const key_type& k) const;
Marshall Clowebb57322013-08-13 22:18:47 +0000423 template<typename K>
424 iterator lower_bound(const K& x); // C++14
425 template<typename K>
426 const_iterator lower_bound(const K& x) const; // C++14
427
Howard Hinnantc51e1022010-05-11 19:42:16 +0000428 iterator upper_bound(const key_type& k);
429 const_iterator upper_bound(const key_type& k) const;
Marshall Clowebb57322013-08-13 22:18:47 +0000430 template<typename K>
431 iterator upper_bound(const K& x); // C++14
432 template<typename K>
433 const_iterator upper_bound(const K& x) const; // C++14
434
Howard Hinnantc51e1022010-05-11 19:42:16 +0000435 pair<iterator,iterator> equal_range(const key_type& k);
436 pair<const_iterator,const_iterator> equal_range(const key_type& k) const;
Marshall Clowebb57322013-08-13 22:18:47 +0000437 template<typename K>
438 pair<iterator,iterator> equal_range(const K& x); // C++14
439 template<typename K>
440 pair<const_iterator,const_iterator> equal_range(const K& x) const; // C++14
Howard Hinnantc51e1022010-05-11 19:42:16 +0000441};
442
443template <class Key, class T, class Compare, class Allocator>
444bool
445operator==(const multimap<Key, T, Compare, Allocator>& x,
446 const multimap<Key, T, Compare, Allocator>& y);
447
448template <class Key, class T, class Compare, class Allocator>
449bool
450operator< (const multimap<Key, T, Compare, Allocator>& x,
451 const multimap<Key, T, Compare, Allocator>& y);
452
453template <class Key, class T, class Compare, class Allocator>
454bool
455operator!=(const multimap<Key, T, Compare, Allocator>& x,
456 const multimap<Key, T, Compare, Allocator>& y);
457
458template <class Key, class T, class Compare, class Allocator>
459bool
460operator> (const multimap<Key, T, Compare, Allocator>& x,
461 const multimap<Key, T, Compare, Allocator>& y);
462
463template <class Key, class T, class Compare, class Allocator>
464bool
465operator>=(const multimap<Key, T, Compare, Allocator>& x,
466 const multimap<Key, T, Compare, Allocator>& y);
467
468template <class Key, class T, class Compare, class Allocator>
469bool
470operator<=(const multimap<Key, T, Compare, Allocator>& x,
471 const multimap<Key, T, Compare, Allocator>& y);
472
473// specialized algorithms:
474template <class Key, class T, class Compare, class Allocator>
475void
476swap(multimap<Key, T, Compare, Allocator>& x,
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +0000477 multimap<Key, T, Compare, Allocator>& y)
478 noexcept(noexcept(x.swap(y)));
Howard Hinnantc51e1022010-05-11 19:42:16 +0000479
Marshall Clow29b53f22018-12-14 18:49:35 +0000480template <class Key, class T, class Compare, class Allocator, class Predicate>
Marek Kurdeja98b1412020-05-02 13:58:03 +0200481typename multimap<Key, T, Compare, Allocator>::size_type
482erase_if(multimap<Key, T, Compare, Allocator>& c, Predicate pred); // C++20
Marshall Clow29b53f22018-12-14 18:49:35 +0000483
Howard Hinnantc51e1022010-05-11 19:42:16 +0000484} // std
485
486*/
487
488#include <__config>
489#include <__tree>
Erik Pilkingtonc37a3d82018-08-01 01:33:38 +0000490#include <__node_handle>
Arthur O'Dwyer7deec122021-03-24 18:19:12 -0400491#include <compare>
492#include <initializer_list>
Arthur O'Dwyerb6738bd2021-03-21 16:53:09 -0400493#include <iterator> // __libcpp_erase_if_container
Howard Hinnantc51e1022010-05-11 19:42:16 +0000494#include <memory>
495#include <utility>
496#include <functional>
497#include <initializer_list>
Eric Fiselierf7394302015-06-13 07:08:02 +0000498#include <type_traits>
Marshall Clow0a1e7502018-09-12 19:41:40 +0000499#include <version>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000500
Howard Hinnantaaaa52b2011-10-17 20:05:10 +0000501#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000502#pragma GCC system_header
Howard Hinnantaaaa52b2011-10-17 20:05:10 +0000503#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +0000504
505_LIBCPP_BEGIN_NAMESPACE_STD
506
Louis Dionne878a3a82018-12-06 21:46:17 +0000507template <class _Key, class _CP, class _Compare,
508 bool = is_empty<_Compare>::value && !__libcpp_is_final<_Compare>::value>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000509class __map_value_compare
510 : private _Compare
511{
Howard Hinnantc51e1022010-05-11 19:42:16 +0000512public:
Howard Hinnant756c69b2010-09-22 16:48:34 +0000513 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +0000514 __map_value_compare()
515 _NOEXCEPT_(is_nothrow_default_constructible<_Compare>::value)
516 : _Compare() {}
Howard Hinnant756c69b2010-09-22 16:48:34 +0000517 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +0000518 __map_value_compare(_Compare c)
519 _NOEXCEPT_(is_nothrow_copy_constructible<_Compare>::value)
520 : _Compare(c) {}
Howard Hinnant756c69b2010-09-22 16:48:34 +0000521 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +0000522 const _Compare& key_comp() const _NOEXCEPT {return *this;}
Howard Hinnant756c69b2010-09-22 16:48:34 +0000523 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000524 bool operator()(const _CP& __x, const _CP& __y) const
Erik Pilkingtond3fe2992018-06-04 20:38:23 +0000525 {return static_cast<const _Compare&>(*this)(__x.__get_value().first, __y.__get_value().first);}
Howard Hinnant756c69b2010-09-22 16:48:34 +0000526 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000527 bool operator()(const _CP& __x, const _Key& __y) const
Erik Pilkingtond3fe2992018-06-04 20:38:23 +0000528 {return static_cast<const _Compare&>(*this)(__x.__get_value().first, __y);}
Howard Hinnant756c69b2010-09-22 16:48:34 +0000529 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000530 bool operator()(const _Key& __x, const _CP& __y) const
Erik Pilkingtond3fe2992018-06-04 20:38:23 +0000531 {return static_cast<const _Compare&>(*this)(__x, __y.__get_value().first);}
Marshall Clow8982dcd2015-07-13 20:04:56 +0000532 void swap(__map_value_compare&__y)
533 _NOEXCEPT_(__is_nothrow_swappable<_Compare>::value)
534 {
Eric Fiselier68b5f0b2017-04-13 00:34:24 +0000535 using _VSTD::swap;
536 swap(static_cast<_Compare&>(*this), static_cast<_Compare&>(__y));
Marshall Clow8982dcd2015-07-13 20:04:56 +0000537 }
Marshall Clowebb57322013-08-13 22:18:47 +0000538
539#if _LIBCPP_STD_VER > 11
540 template <typename _K2>
541 _LIBCPP_INLINE_VISIBILITY
542 typename enable_if<__is_transparent<_Compare, _K2>::value, bool>::type
543 operator () ( const _K2& __x, const _CP& __y ) const
Erik Pilkingtond3fe2992018-06-04 20:38:23 +0000544 {return static_cast<const _Compare&>(*this) (__x, __y.__get_value().first);}
Marshall Clowebb57322013-08-13 22:18:47 +0000545
546 template <typename _K2>
547 _LIBCPP_INLINE_VISIBILITY
548 typename enable_if<__is_transparent<_Compare, _K2>::value, bool>::type
549 operator () (const _CP& __x, const _K2& __y) const
Erik Pilkingtond3fe2992018-06-04 20:38:23 +0000550 {return static_cast<const _Compare&>(*this) (__x.__get_value().first, __y);}
Marshall Clowebb57322013-08-13 22:18:47 +0000551#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +0000552};
553
Howard Hinnant90b91592013-07-05 18:06:00 +0000554template <class _Key, class _CP, class _Compare>
555class __map_value_compare<_Key, _CP, _Compare, false>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000556{
557 _Compare comp;
558
Howard Hinnantc51e1022010-05-11 19:42:16 +0000559public:
Howard Hinnant756c69b2010-09-22 16:48:34 +0000560 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +0000561 __map_value_compare()
562 _NOEXCEPT_(is_nothrow_default_constructible<_Compare>::value)
563 : comp() {}
Howard Hinnant756c69b2010-09-22 16:48:34 +0000564 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +0000565 __map_value_compare(_Compare c)
566 _NOEXCEPT_(is_nothrow_copy_constructible<_Compare>::value)
567 : comp(c) {}
Howard Hinnant756c69b2010-09-22 16:48:34 +0000568 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +0000569 const _Compare& key_comp() const _NOEXCEPT {return comp;}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000570
Howard Hinnant756c69b2010-09-22 16:48:34 +0000571 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000572 bool operator()(const _CP& __x, const _CP& __y) const
Erik Pilkingtond3fe2992018-06-04 20:38:23 +0000573 {return comp(__x.__get_value().first, __y.__get_value().first);}
Howard Hinnant756c69b2010-09-22 16:48:34 +0000574 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000575 bool operator()(const _CP& __x, const _Key& __y) const
Erik Pilkingtond3fe2992018-06-04 20:38:23 +0000576 {return comp(__x.__get_value().first, __y);}
Howard Hinnant756c69b2010-09-22 16:48:34 +0000577 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000578 bool operator()(const _Key& __x, const _CP& __y) const
Erik Pilkingtond3fe2992018-06-04 20:38:23 +0000579 {return comp(__x, __y.__get_value().first);}
Marshall Clow8982dcd2015-07-13 20:04:56 +0000580 void swap(__map_value_compare&__y)
581 _NOEXCEPT_(__is_nothrow_swappable<_Compare>::value)
582 {
583 using _VSTD::swap;
584 swap(comp, __y.comp);
585 }
Eric Fiseliercf8c0212017-01-05 06:06:18 +0000586
Marshall Clowebb57322013-08-13 22:18:47 +0000587#if _LIBCPP_STD_VER > 11
588 template <typename _K2>
589 _LIBCPP_INLINE_VISIBILITY
590 typename enable_if<__is_transparent<_Compare, _K2>::value, bool>::type
591 operator () ( const _K2& __x, const _CP& __y ) const
Erik Pilkingtond3fe2992018-06-04 20:38:23 +0000592 {return comp (__x, __y.__get_value().first);}
Marshall Clowebb57322013-08-13 22:18:47 +0000593
594 template <typename _K2>
595 _LIBCPP_INLINE_VISIBILITY
596 typename enable_if<__is_transparent<_Compare, _K2>::value, bool>::type
597 operator () (const _CP& __x, const _K2& __y) const
Erik Pilkingtond3fe2992018-06-04 20:38:23 +0000598 {return comp (__x.__get_value().first, __y);}
Marshall Clowebb57322013-08-13 22:18:47 +0000599#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +0000600};
601
Marshall Clow8982dcd2015-07-13 20:04:56 +0000602template <class _Key, class _CP, class _Compare, bool __b>
603inline _LIBCPP_INLINE_VISIBILITY
604void
605swap(__map_value_compare<_Key, _CP, _Compare, __b>& __x,
606 __map_value_compare<_Key, _CP, _Compare, __b>& __y)
607 _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
608{
609 __x.swap(__y);
610}
611
Howard Hinnantc51e1022010-05-11 19:42:16 +0000612template <class _Allocator>
613class __map_node_destructor
614{
615 typedef _Allocator allocator_type;
616 typedef allocator_traits<allocator_type> __alloc_traits;
Eric Fiseliera00b4842016-02-20 05:28:30 +0000617
Howard Hinnantc51e1022010-05-11 19:42:16 +0000618public:
619 typedef typename __alloc_traits::pointer pointer;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000620
Eric Fiseliera00b4842016-02-20 05:28:30 +0000621private:
Howard Hinnantc51e1022010-05-11 19:42:16 +0000622 allocator_type& __na_;
623
624 __map_node_destructor& operator=(const __map_node_destructor&);
625
626public:
627 bool __first_constructed;
628 bool __second_constructed;
629
Howard Hinnant756c69b2010-09-22 16:48:34 +0000630 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +0000631 explicit __map_node_destructor(allocator_type& __na) _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +0000632 : __na_(__na),
633 __first_constructed(false),
634 __second_constructed(false)
635 {}
636
Eric Fiseliera85b1282017-04-18 21:08:06 +0000637#ifndef _LIBCPP_CXX03_LANG
Howard Hinnant756c69b2010-09-22 16:48:34 +0000638 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +0000639 __map_node_destructor(__tree_node_destructor<allocator_type>&& __x) _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +0000640 : __na_(__x.__na_),
641 __first_constructed(__x.__value_constructed),
642 __second_constructed(__x.__value_constructed)
643 {
644 __x.__value_constructed = false;
645 }
Eric Fiseliera85b1282017-04-18 21:08:06 +0000646#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +0000647
Howard Hinnant756c69b2010-09-22 16:48:34 +0000648 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +0000649 void operator()(pointer __p) _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +0000650 {
651 if (__second_constructed)
Erik Pilkingtond3fe2992018-06-04 20:38:23 +0000652 __alloc_traits::destroy(__na_, _VSTD::addressof(__p->__value_.__get_value().second));
Howard Hinnantc51e1022010-05-11 19:42:16 +0000653 if (__first_constructed)
Erik Pilkingtond3fe2992018-06-04 20:38:23 +0000654 __alloc_traits::destroy(__na_, _VSTD::addressof(__p->__value_.__get_value().first));
Howard Hinnantc51e1022010-05-11 19:42:16 +0000655 if (__p)
656 __alloc_traits::deallocate(__na_, __p, 1);
657 }
658};
659
Howard Hinnant944510a2011-06-14 19:58:17 +0000660template <class _Key, class _Tp, class _Compare, class _Allocator>
661 class map;
662template <class _Key, class _Tp, class _Compare, class _Allocator>
663 class multimap;
664template <class _TreeIterator> class __map_const_iterator;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000665
Eric Fiseliera00b4842016-02-20 05:28:30 +0000666#ifndef _LIBCPP_CXX03_LANG
Howard Hinnant89f8b792013-09-30 19:08:22 +0000667
668template <class _Key, class _Tp>
Erik Pilkingtond3fe2992018-06-04 20:38:23 +0000669struct __value_type
Howard Hinnant89f8b792013-09-30 19:08:22 +0000670{
671 typedef _Key key_type;
672 typedef _Tp mapped_type;
673 typedef pair<const key_type, mapped_type> value_type;
Erik Pilkingtond3fe2992018-06-04 20:38:23 +0000674 typedef pair<key_type&, mapped_type&> __nc_ref_pair_type;
675 typedef pair<key_type&&, mapped_type&&> __nc_rref_pair_type;
Howard Hinnant89f8b792013-09-30 19:08:22 +0000676
Erik Pilkingtond3fe2992018-06-04 20:38:23 +0000677private:
Howard Hinnant89f8b792013-09-30 19:08:22 +0000678 value_type __cc;
Erik Pilkingtond3fe2992018-06-04 20:38:23 +0000679
680public:
681 _LIBCPP_INLINE_VISIBILITY
682 value_type& __get_value()
683 {
684#if _LIBCPP_STD_VER > 14
685 return *_VSTD::launder(_VSTD::addressof(__cc));
686#else
687 return __cc;
688#endif
689 }
690
691 _LIBCPP_INLINE_VISIBILITY
692 const value_type& __get_value() const
693 {
694#if _LIBCPP_STD_VER > 14
695 return *_VSTD::launder(_VSTD::addressof(__cc));
696#else
697 return __cc;
698#endif
699 }
700
701 _LIBCPP_INLINE_VISIBILITY
702 __nc_ref_pair_type __ref()
703 {
704 value_type& __v = __get_value();
705 return __nc_ref_pair_type(const_cast<key_type&>(__v.first), __v.second);
706 }
707
708 _LIBCPP_INLINE_VISIBILITY
709 __nc_rref_pair_type __move()
710 {
711 value_type& __v = __get_value();
712 return __nc_rref_pair_type(
713 _VSTD::move(const_cast<key_type&>(__v.first)),
714 _VSTD::move(__v.second));
715 }
Howard Hinnant89f8b792013-09-30 19:08:22 +0000716
Howard Hinnant89f8b792013-09-30 19:08:22 +0000717 _LIBCPP_INLINE_VISIBILITY
718 __value_type& operator=(const __value_type& __v)
Erik Pilkingtond3fe2992018-06-04 20:38:23 +0000719 {
720 __ref() = __v.__get_value();
721 return *this;
722 }
Howard Hinnant89f8b792013-09-30 19:08:22 +0000723
724 _LIBCPP_INLINE_VISIBILITY
725 __value_type& operator=(__value_type&& __v)
Erik Pilkingtond3fe2992018-06-04 20:38:23 +0000726 {
727 __ref() = __v.__move();
728 return *this;
729 }
Howard Hinnant89f8b792013-09-30 19:08:22 +0000730
Eric Fiselierd06276b2016-03-31 02:15:15 +0000731 template <class _ValueTp,
732 class = typename enable_if<
733 __is_same_uncvref<_ValueTp, value_type>::value
734 >::type
735 >
Howard Hinnant89f8b792013-09-30 19:08:22 +0000736 _LIBCPP_INLINE_VISIBILITY
Erik Pilkingtond3fe2992018-06-04 20:38:23 +0000737 __value_type& operator=(_ValueTp&& __v)
738 {
739 __ref() = _VSTD::forward<_ValueTp>(__v);
740 return *this;
Eric Fiselierd06276b2016-03-31 02:15:15 +0000741 }
742
743private:
744 __value_type() _LIBCPP_EQUAL_DELETE;
745 ~__value_type() _LIBCPP_EQUAL_DELETE;
746 __value_type(const __value_type& __v) _LIBCPP_EQUAL_DELETE;
747 __value_type(__value_type&& __v) _LIBCPP_EQUAL_DELETE;
Howard Hinnant89f8b792013-09-30 19:08:22 +0000748};
749
750#else
751
752template <class _Key, class _Tp>
753struct __value_type
754{
755 typedef _Key key_type;
756 typedef _Tp mapped_type;
757 typedef pair<const key_type, mapped_type> value_type;
758
Erik Pilkingtond3fe2992018-06-04 20:38:23 +0000759private:
Howard Hinnant89f8b792013-09-30 19:08:22 +0000760 value_type __cc;
761
Erik Pilkingtond3fe2992018-06-04 20:38:23 +0000762public:
763 _LIBCPP_INLINE_VISIBILITY
764 value_type& __get_value() { return __cc; }
765 _LIBCPP_INLINE_VISIBILITY
766 const value_type& __get_value() const { return __cc; }
767
Eric Fiselierd06276b2016-03-31 02:15:15 +0000768private:
769 __value_type();
770 __value_type(__value_type const&);
771 __value_type& operator=(__value_type const&);
772 ~__value_type();
Howard Hinnant89f8b792013-09-30 19:08:22 +0000773};
774
Eric Fiseliera85b1282017-04-18 21:08:06 +0000775#endif // _LIBCPP_CXX03_LANG
Howard Hinnant89f8b792013-09-30 19:08:22 +0000776
Eric Fiselier44f9fd02015-03-03 20:10:01 +0000777template <class _Tp>
778struct __extract_key_value_types;
779
780template <class _Key, class _Tp>
781struct __extract_key_value_types<__value_type<_Key, _Tp> >
782{
783 typedef _Key const __key_type;
784 typedef _Tp __mapped_type;
785};
786
Howard Hinnantc51e1022010-05-11 19:42:16 +0000787template <class _TreeIterator>
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000788class _LIBCPP_TEMPLATE_VIS __map_iterator
Howard Hinnantc51e1022010-05-11 19:42:16 +0000789{
Eric Fiseliera00b4842016-02-20 05:28:30 +0000790 typedef typename _TreeIterator::_NodeTypes _NodeTypes;
791 typedef typename _TreeIterator::__pointer_traits __pointer_traits;
792
Howard Hinnantc51e1022010-05-11 19:42:16 +0000793 _TreeIterator __i_;
794
Howard Hinnantc51e1022010-05-11 19:42:16 +0000795public:
796 typedef bidirectional_iterator_tag iterator_category;
Eric Fiseliera00b4842016-02-20 05:28:30 +0000797 typedef typename _NodeTypes::__map_value_type value_type;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000798 typedef typename _TreeIterator::difference_type difference_type;
799 typedef value_type& reference;
Eric Fiseliera00b4842016-02-20 05:28:30 +0000800 typedef typename _NodeTypes::__map_value_type_pointer pointer;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000801
Howard Hinnant756c69b2010-09-22 16:48:34 +0000802 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +0000803 __map_iterator() _NOEXCEPT {}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000804
Howard Hinnant756c69b2010-09-22 16:48:34 +0000805 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +0000806 __map_iterator(_TreeIterator __i) _NOEXCEPT : __i_(__i) {}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000807
Howard Hinnant756c69b2010-09-22 16:48:34 +0000808 _LIBCPP_INLINE_VISIBILITY
Erik Pilkingtond3fe2992018-06-04 20:38:23 +0000809 reference operator*() const {return __i_->__get_value();}
Howard Hinnant756c69b2010-09-22 16:48:34 +0000810 _LIBCPP_INLINE_VISIBILITY
Erik Pilkingtond3fe2992018-06-04 20:38:23 +0000811 pointer operator->() const {return pointer_traits<pointer>::pointer_to(__i_->__get_value());}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000812
Howard Hinnant756c69b2010-09-22 16:48:34 +0000813 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000814 __map_iterator& operator++() {++__i_; return *this;}
Howard Hinnant756c69b2010-09-22 16:48:34 +0000815 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000816 __map_iterator operator++(int)
817 {
818 __map_iterator __t(*this);
819 ++(*this);
820 return __t;
821 }
822
Howard Hinnant756c69b2010-09-22 16:48:34 +0000823 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000824 __map_iterator& operator--() {--__i_; return *this;}
Howard Hinnant756c69b2010-09-22 16:48:34 +0000825 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000826 __map_iterator operator--(int)
827 {
828 __map_iterator __t(*this);
829 --(*this);
830 return __t;
831 }
832
Howard Hinnant756c69b2010-09-22 16:48:34 +0000833 friend _LIBCPP_INLINE_VISIBILITY
834 bool operator==(const __map_iterator& __x, const __map_iterator& __y)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000835 {return __x.__i_ == __y.__i_;}
Eric Fiseliercf8c0212017-01-05 06:06:18 +0000836 friend
Howard Hinnant756c69b2010-09-22 16:48:34 +0000837 _LIBCPP_INLINE_VISIBILITY
838 bool operator!=(const __map_iterator& __x, const __map_iterator& __y)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000839 {return __x.__i_ != __y.__i_;}
840
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000841 template <class, class, class, class> friend class _LIBCPP_TEMPLATE_VIS map;
842 template <class, class, class, class> friend class _LIBCPP_TEMPLATE_VIS multimap;
843 template <class> friend class _LIBCPP_TEMPLATE_VIS __map_const_iterator;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000844};
845
846template <class _TreeIterator>
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000847class _LIBCPP_TEMPLATE_VIS __map_const_iterator
Howard Hinnantc51e1022010-05-11 19:42:16 +0000848{
Eric Fiseliera00b4842016-02-20 05:28:30 +0000849 typedef typename _TreeIterator::_NodeTypes _NodeTypes;
850 typedef typename _TreeIterator::__pointer_traits __pointer_traits;
851
Howard Hinnantc51e1022010-05-11 19:42:16 +0000852 _TreeIterator __i_;
853
Howard Hinnantc51e1022010-05-11 19:42:16 +0000854public:
855 typedef bidirectional_iterator_tag iterator_category;
Eric Fiseliera00b4842016-02-20 05:28:30 +0000856 typedef typename _NodeTypes::__map_value_type value_type;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000857 typedef typename _TreeIterator::difference_type difference_type;
858 typedef const value_type& reference;
Eric Fiseliera00b4842016-02-20 05:28:30 +0000859 typedef typename _NodeTypes::__const_map_value_type_pointer pointer;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000860
Howard Hinnant756c69b2010-09-22 16:48:34 +0000861 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +0000862 __map_const_iterator() _NOEXCEPT {}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000863
Howard Hinnant756c69b2010-09-22 16:48:34 +0000864 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +0000865 __map_const_iterator(_TreeIterator __i) _NOEXCEPT : __i_(__i) {}
Howard Hinnant756c69b2010-09-22 16:48:34 +0000866 _LIBCPP_INLINE_VISIBILITY
Eric Fiselier44f9fd02015-03-03 20:10:01 +0000867 __map_const_iterator(__map_iterator<
868 typename _TreeIterator::__non_const_iterator> __i) _NOEXCEPT
869 : __i_(__i.__i_) {}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000870
Howard Hinnant756c69b2010-09-22 16:48:34 +0000871 _LIBCPP_INLINE_VISIBILITY
Erik Pilkingtond3fe2992018-06-04 20:38:23 +0000872 reference operator*() const {return __i_->__get_value();}
Howard Hinnant756c69b2010-09-22 16:48:34 +0000873 _LIBCPP_INLINE_VISIBILITY
Erik Pilkingtond3fe2992018-06-04 20:38:23 +0000874 pointer operator->() const {return pointer_traits<pointer>::pointer_to(__i_->__get_value());}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000875
Howard Hinnant756c69b2010-09-22 16:48:34 +0000876 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000877 __map_const_iterator& operator++() {++__i_; return *this;}
Howard Hinnant756c69b2010-09-22 16:48:34 +0000878 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000879 __map_const_iterator operator++(int)
880 {
881 __map_const_iterator __t(*this);
882 ++(*this);
883 return __t;
884 }
885
Howard Hinnant756c69b2010-09-22 16:48:34 +0000886 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000887 __map_const_iterator& operator--() {--__i_; return *this;}
Howard Hinnant756c69b2010-09-22 16:48:34 +0000888 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000889 __map_const_iterator operator--(int)
890 {
891 __map_const_iterator __t(*this);
892 --(*this);
893 return __t;
894 }
895
Howard Hinnant756c69b2010-09-22 16:48:34 +0000896 friend _LIBCPP_INLINE_VISIBILITY
897 bool operator==(const __map_const_iterator& __x, const __map_const_iterator& __y)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000898 {return __x.__i_ == __y.__i_;}
Howard Hinnant756c69b2010-09-22 16:48:34 +0000899 friend _LIBCPP_INLINE_VISIBILITY
900 bool operator!=(const __map_const_iterator& __x, const __map_const_iterator& __y)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000901 {return __x.__i_ != __y.__i_;}
902
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000903 template <class, class, class, class> friend class _LIBCPP_TEMPLATE_VIS map;
904 template <class, class, class, class> friend class _LIBCPP_TEMPLATE_VIS multimap;
905 template <class, class, class> friend class _LIBCPP_TEMPLATE_VIS __tree_const_iterator;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000906};
907
908template <class _Key, class _Tp, class _Compare = less<_Key>,
909 class _Allocator = allocator<pair<const _Key, _Tp> > >
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000910class _LIBCPP_TEMPLATE_VIS map
Howard Hinnantc51e1022010-05-11 19:42:16 +0000911{
912public:
913 // types:
914 typedef _Key key_type;
915 typedef _Tp mapped_type;
916 typedef pair<const key_type, mapped_type> value_type;
Arthur O'Dwyer6a752e12021-03-03 11:10:49 -0500917 typedef __identity_t<_Compare> key_compare;
918 typedef __identity_t<_Allocator> allocator_type;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000919 typedef value_type& reference;
920 typedef const value_type& const_reference;
921
Marshall Clow5128cf32015-11-26 01:24:04 +0000922 static_assert((is_same<typename allocator_type::value_type, value_type>::value),
923 "Allocator::value_type must be same type as value_type");
924
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000925 class _LIBCPP_TEMPLATE_VIS value_compare
Howard Hinnantc51e1022010-05-11 19:42:16 +0000926 : public binary_function<value_type, value_type, bool>
927 {
928 friend class map;
929 protected:
930 key_compare comp;
931
Howard Hinnant756c69b2010-09-22 16:48:34 +0000932 _LIBCPP_INLINE_VISIBILITY value_compare(key_compare c) : comp(c) {}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000933 public:
Howard Hinnant756c69b2010-09-22 16:48:34 +0000934 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000935 bool operator()(const value_type& __x, const value_type& __y) const
936 {return comp(__x.first, __y.first);}
937 };
938
939private:
Howard Hinnant2d0046b2013-06-19 21:29:40 +0000940
Howard Hinnant89f8b792013-09-30 19:08:22 +0000941 typedef _VSTD::__value_type<key_type, mapped_type> __value_type;
Howard Hinnant90b91592013-07-05 18:06:00 +0000942 typedef __map_value_compare<key_type, __value_type, key_compare> __vc;
Marshall Clow940e01c2015-04-07 05:21:38 +0000943 typedef typename __rebind_alloc_helper<allocator_traits<allocator_type>,
944 __value_type>::type __allocator_type;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000945 typedef __tree<__value_type, __vc, __allocator_type> __base;
946 typedef typename __base::__node_traits __node_traits;
947 typedef allocator_traits<allocator_type> __alloc_traits;
948
949 __base __tree_;
950
951public:
952 typedef typename __alloc_traits::pointer pointer;
953 typedef typename __alloc_traits::const_pointer const_pointer;
954 typedef typename __alloc_traits::size_type size_type;
955 typedef typename __alloc_traits::difference_type difference_type;
Eric Fiselier44f9fd02015-03-03 20:10:01 +0000956 typedef __map_iterator<typename __base::iterator> iterator;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000957 typedef __map_const_iterator<typename __base::const_iterator> const_iterator;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000958 typedef _VSTD::reverse_iterator<iterator> reverse_iterator;
959 typedef _VSTD::reverse_iterator<const_iterator> const_reverse_iterator;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000960
Erik Pilkingtonc37a3d82018-08-01 01:33:38 +0000961#if _LIBCPP_STD_VER > 14
962 typedef __map_node_handle<typename __base::__node, allocator_type> node_type;
963 typedef __insert_return_type<iterator, node_type> insert_return_type;
964#endif
965
Erik Pilkington82a65ad2018-10-31 17:31:35 +0000966 template <class _Key2, class _Value2, class _Comp2, class _Alloc2>
967 friend class _LIBCPP_TEMPLATE_VIS map;
968 template <class _Key2, class _Value2, class _Comp2, class _Alloc2>
969 friend class _LIBCPP_TEMPLATE_VIS multimap;
970
Howard Hinnant756c69b2010-09-22 16:48:34 +0000971 _LIBCPP_INLINE_VISIBILITY
Marshall Clow7086a5a2014-03-10 04:50:10 +0000972 map()
973 _NOEXCEPT_(
974 is_nothrow_default_constructible<allocator_type>::value &&
975 is_nothrow_default_constructible<key_compare>::value &&
976 is_nothrow_copy_constructible<key_compare>::value)
977 : __tree_(__vc(key_compare())) {}
978
979 _LIBCPP_INLINE_VISIBILITY
980 explicit map(const key_compare& __comp)
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +0000981 _NOEXCEPT_(
982 is_nothrow_default_constructible<allocator_type>::value &&
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +0000983 is_nothrow_copy_constructible<key_compare>::value)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000984 : __tree_(__vc(__comp)) {}
985
Howard Hinnant756c69b2010-09-22 16:48:34 +0000986 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000987 explicit map(const key_compare& __comp, const allocator_type& __a)
Marshall Clow657cbc42016-08-17 05:58:40 +0000988 : __tree_(__vc(__comp), typename __base::allocator_type(__a)) {}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000989
990 template <class _InputIterator>
Howard Hinnant756c69b2010-09-22 16:48:34 +0000991 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000992 map(_InputIterator __f, _InputIterator __l,
993 const key_compare& __comp = key_compare())
994 : __tree_(__vc(__comp))
995 {
996 insert(__f, __l);
997 }
998
999 template <class _InputIterator>
Howard Hinnant756c69b2010-09-22 16:48:34 +00001000 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001001 map(_InputIterator __f, _InputIterator __l,
1002 const key_compare& __comp, const allocator_type& __a)
Marshall Clow657cbc42016-08-17 05:58:40 +00001003 : __tree_(__vc(__comp), typename __base::allocator_type(__a))
Howard Hinnantc51e1022010-05-11 19:42:16 +00001004 {
1005 insert(__f, __l);
1006 }
1007
Marshall Clow300abfb2013-09-11 01:15:47 +00001008#if _LIBCPP_STD_VER > 11
1009 template <class _InputIterator>
Eric Fiseliercf8c0212017-01-05 06:06:18 +00001010 _LIBCPP_INLINE_VISIBILITY
Marshall Clow300abfb2013-09-11 01:15:47 +00001011 map(_InputIterator __f, _InputIterator __l, const allocator_type& __a)
1012 : map(__f, __l, key_compare(), __a) {}
1013#endif
1014
Howard Hinnant756c69b2010-09-22 16:48:34 +00001015 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001016 map(const map& __m)
1017 : __tree_(__m.__tree_)
1018 {
1019 insert(__m.begin(), __m.end());
1020 }
1021
Howard Hinnantd3a657f2011-07-01 19:24:36 +00001022 _LIBCPP_INLINE_VISIBILITY
1023 map& operator=(const map& __m)
1024 {
Marshall Clow476d3f42016-07-18 13:19:00 +00001025#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantd3a657f2011-07-01 19:24:36 +00001026 __tree_ = __m.__tree_;
Howard Hinnant2d0046b2013-06-19 21:29:40 +00001027#else
Marshall Clowdb3cfcb2014-02-08 04:03:14 +00001028 if (this != &__m) {
1029 __tree_.clear();
1030 __tree_.value_comp() = __m.__tree_.value_comp();
1031 __tree_.__copy_assign_alloc(__m.__tree_);
1032 insert(__m.begin(), __m.end());
1033 }
Howard Hinnant2d0046b2013-06-19 21:29:40 +00001034#endif
Howard Hinnantd3a657f2011-07-01 19:24:36 +00001035 return *this;
1036 }
1037
Eric Fiseliera85b1282017-04-18 21:08:06 +00001038#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00001039
Howard Hinnant756c69b2010-09-22 16:48:34 +00001040 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001041 map(map&& __m)
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001042 _NOEXCEPT_(is_nothrow_move_constructible<__base>::value)
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001043 : __tree_(_VSTD::move(__m.__tree_))
Howard Hinnantc51e1022010-05-11 19:42:16 +00001044 {
1045 }
1046
1047 map(map&& __m, const allocator_type& __a);
1048
Howard Hinnant756c69b2010-09-22 16:48:34 +00001049 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant33711792011-08-12 21:56:02 +00001050 map& operator=(map&& __m)
1051 _NOEXCEPT_(is_nothrow_move_assignable<__base>::value)
1052 {
1053 __tree_ = _VSTD::move(__m.__tree_);
1054 return *this;
1055 }
1056
Howard Hinnant33711792011-08-12 21:56:02 +00001057 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001058 map(initializer_list<value_type> __il, const key_compare& __comp = key_compare())
1059 : __tree_(__vc(__comp))
1060 {
1061 insert(__il.begin(), __il.end());
1062 }
1063
Howard Hinnant756c69b2010-09-22 16:48:34 +00001064 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001065 map(initializer_list<value_type> __il, const key_compare& __comp, const allocator_type& __a)
Marshall Clow657cbc42016-08-17 05:58:40 +00001066 : __tree_(__vc(__comp), typename __base::allocator_type(__a))
Howard Hinnantc51e1022010-05-11 19:42:16 +00001067 {
1068 insert(__il.begin(), __il.end());
1069 }
1070
Marshall Clow300abfb2013-09-11 01:15:47 +00001071#if _LIBCPP_STD_VER > 11
Eric Fiseliercf8c0212017-01-05 06:06:18 +00001072 _LIBCPP_INLINE_VISIBILITY
Marshall Clow300abfb2013-09-11 01:15:47 +00001073 map(initializer_list<value_type> __il, const allocator_type& __a)
1074 : map(__il, key_compare(), __a) {}
1075#endif
1076
Howard Hinnant756c69b2010-09-22 16:48:34 +00001077 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001078 map& operator=(initializer_list<value_type> __il)
1079 {
1080 __tree_.__assign_unique(__il.begin(), __il.end());
1081 return *this;
1082 }
1083
Eric Fiseliera85b1282017-04-18 21:08:06 +00001084#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00001085
Howard Hinnant756c69b2010-09-22 16:48:34 +00001086 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001087 explicit map(const allocator_type& __a)
Marshall Clow657cbc42016-08-17 05:58:40 +00001088 : __tree_(typename __base::allocator_type(__a))
Howard Hinnantc51e1022010-05-11 19:42:16 +00001089 {
1090 }
1091
Howard Hinnant756c69b2010-09-22 16:48:34 +00001092 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001093 map(const map& __m, const allocator_type& __a)
Marshall Clow657cbc42016-08-17 05:58:40 +00001094 : __tree_(__m.__tree_.value_comp(), typename __base::allocator_type(__a))
Howard Hinnantc51e1022010-05-11 19:42:16 +00001095 {
1096 insert(__m.begin(), __m.end());
1097 }
1098
Howard Hinnant756c69b2010-09-22 16:48:34 +00001099 _LIBCPP_INLINE_VISIBILITY
Louis Dionne69c42c02019-04-11 16:14:56 +00001100 ~map() {
1101 static_assert(sizeof(__diagnose_non_const_comparator<_Key, _Compare>()), "");
1102 }
1103
1104 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001105 iterator begin() _NOEXCEPT {return __tree_.begin();}
Howard Hinnant756c69b2010-09-22 16:48:34 +00001106 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001107 const_iterator begin() const _NOEXCEPT {return __tree_.begin();}
Howard Hinnant756c69b2010-09-22 16:48:34 +00001108 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001109 iterator end() _NOEXCEPT {return __tree_.end();}
Howard Hinnant756c69b2010-09-22 16:48:34 +00001110 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001111 const_iterator end() const _NOEXCEPT {return __tree_.end();}
Howard Hinnantc51e1022010-05-11 19:42:16 +00001112
Howard Hinnant756c69b2010-09-22 16:48:34 +00001113 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001114 reverse_iterator rbegin() _NOEXCEPT {return reverse_iterator(end());}
Howard Hinnant756c69b2010-09-22 16:48:34 +00001115 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001116 const_reverse_iterator rbegin() const _NOEXCEPT
1117 {return const_reverse_iterator(end());}
Howard Hinnant756c69b2010-09-22 16:48:34 +00001118 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001119 reverse_iterator rend() _NOEXCEPT
1120 {return reverse_iterator(begin());}
Howard Hinnant756c69b2010-09-22 16:48:34 +00001121 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001122 const_reverse_iterator rend() const _NOEXCEPT
1123 {return const_reverse_iterator(begin());}
Howard Hinnantc51e1022010-05-11 19:42:16 +00001124
Howard Hinnant756c69b2010-09-22 16:48:34 +00001125 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001126 const_iterator cbegin() const _NOEXCEPT {return begin();}
Howard Hinnant756c69b2010-09-22 16:48:34 +00001127 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001128 const_iterator cend() const _NOEXCEPT {return end();}
Howard Hinnant756c69b2010-09-22 16:48:34 +00001129 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001130 const_reverse_iterator crbegin() const _NOEXCEPT {return rbegin();}
Howard Hinnant756c69b2010-09-22 16:48:34 +00001131 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001132 const_reverse_iterator crend() const _NOEXCEPT {return rend();}
Howard Hinnantc51e1022010-05-11 19:42:16 +00001133
Marshall Clow425f5752017-11-15 05:51:26 +00001134 _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001135 bool empty() const _NOEXCEPT {return __tree_.size() == 0;}
Howard Hinnant756c69b2010-09-22 16:48:34 +00001136 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001137 size_type size() const _NOEXCEPT {return __tree_.size();}
Howard Hinnant756c69b2010-09-22 16:48:34 +00001138 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001139 size_type max_size() const _NOEXCEPT {return __tree_.max_size();}
Howard Hinnantc51e1022010-05-11 19:42:16 +00001140
1141 mapped_type& operator[](const key_type& __k);
Eric Fiselierd63f38e2016-03-31 03:13:37 +00001142#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00001143 mapped_type& operator[](key_type&& __k);
1144#endif
1145
1146 mapped_type& at(const key_type& __k);
1147 const mapped_type& at(const key_type& __k) const;
1148
Howard Hinnant756c69b2010-09-22 16:48:34 +00001149 _LIBCPP_INLINE_VISIBILITY
Marshall Clow657cbc42016-08-17 05:58:40 +00001150 allocator_type get_allocator() const _NOEXCEPT {return allocator_type(__tree_.__alloc());}
Howard Hinnant756c69b2010-09-22 16:48:34 +00001151 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001152 key_compare key_comp() const {return __tree_.value_comp().key_comp();}
Howard Hinnant756c69b2010-09-22 16:48:34 +00001153 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001154 value_compare value_comp() const {return value_compare(__tree_.value_comp().key_comp());}
1155
Eric Fiselierd06276b2016-03-31 02:15:15 +00001156#ifndef _LIBCPP_CXX03_LANG
1157 template <class ..._Args>
1158 _LIBCPP_INLINE_VISIBILITY
1159 pair<iterator, bool> emplace(_Args&& ...__args) {
1160 return __tree_.__emplace_unique(_VSTD::forward<_Args>(__args)...);
1161 }
Howard Hinnant74279a52010-09-04 23:28:19 +00001162
Howard Hinnant29eb9b82012-05-25 22:04:21 +00001163 template <class ..._Args>
Eric Fiselierd06276b2016-03-31 02:15:15 +00001164 _LIBCPP_INLINE_VISIBILITY
1165 iterator emplace_hint(const_iterator __p, _Args&& ...__args) {
1166 return __tree_.__emplace_hint_unique(__p.__i_, _VSTD::forward<_Args>(__args)...);
1167 }
Howard Hinnant74279a52010-09-04 23:28:19 +00001168
Howard Hinnantc834c512011-11-29 18:15:50 +00001169 template <class _Pp,
1170 class = typename enable_if<is_constructible<value_type, _Pp>::value>::type>
Howard Hinnant756c69b2010-09-22 16:48:34 +00001171 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc834c512011-11-29 18:15:50 +00001172 pair<iterator, bool> insert(_Pp&& __p)
1173 {return __tree_.__insert_unique(_VSTD::forward<_Pp>(__p));}
Howard Hinnantc51e1022010-05-11 19:42:16 +00001174
Howard Hinnantc834c512011-11-29 18:15:50 +00001175 template <class _Pp,
1176 class = typename enable_if<is_constructible<value_type, _Pp>::value>::type>
Howard Hinnant756c69b2010-09-22 16:48:34 +00001177 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc834c512011-11-29 18:15:50 +00001178 iterator insert(const_iterator __pos, _Pp&& __p)
1179 {return __tree_.__insert_unique(__pos.__i_, _VSTD::forward<_Pp>(__p));}
Howard Hinnantc51e1022010-05-11 19:42:16 +00001180
Eric Fiselierd06276b2016-03-31 02:15:15 +00001181#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00001182
Howard Hinnant756c69b2010-09-22 16:48:34 +00001183 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001184 pair<iterator, bool>
1185 insert(const value_type& __v) {return __tree_.__insert_unique(__v);}
1186
Howard Hinnant756c69b2010-09-22 16:48:34 +00001187 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001188 iterator
1189 insert(const_iterator __p, const value_type& __v)
1190 {return __tree_.__insert_unique(__p.__i_, __v);}
1191
Eric Fiselierd6143132016-04-18 01:40:45 +00001192#ifndef _LIBCPP_CXX03_LANG
Marshall Clowd430d022016-01-05 19:32:41 +00001193 _LIBCPP_INLINE_VISIBILITY
1194 pair<iterator, bool>
Eric Fiselierd06276b2016-03-31 02:15:15 +00001195 insert(value_type&& __v) {return __tree_.__insert_unique(_VSTD::move(__v));}
Marshall Clowd430d022016-01-05 19:32:41 +00001196
1197 _LIBCPP_INLINE_VISIBILITY
Eric Fiselierd06276b2016-03-31 02:15:15 +00001198 iterator insert(const_iterator __p, value_type&& __v)
1199 {return __tree_.__insert_unique(__p.__i_, _VSTD::move(__v));}
Eric Fiseliera85b1282017-04-18 21:08:06 +00001200
1201 _LIBCPP_INLINE_VISIBILITY
1202 void insert(initializer_list<value_type> __il)
1203 {insert(__il.begin(), __il.end());}
Marshall Clowd430d022016-01-05 19:32:41 +00001204#endif
1205
Howard Hinnantc51e1022010-05-11 19:42:16 +00001206 template <class _InputIterator>
Howard Hinnant756c69b2010-09-22 16:48:34 +00001207 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001208 void insert(_InputIterator __f, _InputIterator __l)
1209 {
1210 for (const_iterator __e = cend(); __f != __l; ++__f)
1211 insert(__e.__i_, *__f);
1212 }
1213
Marshall Clow3223db82015-07-07 03:37:33 +00001214#if _LIBCPP_STD_VER > 14
Eric Fiselierd63f38e2016-03-31 03:13:37 +00001215
Marshall Clow3223db82015-07-07 03:37:33 +00001216 template <class... _Args>
1217 _LIBCPP_INLINE_VISIBILITY
1218 pair<iterator, bool> try_emplace(const key_type& __k, _Args&&... __args)
1219 {
Eric Fiselierd63f38e2016-03-31 03:13:37 +00001220 return __tree_.__emplace_unique_key_args(__k,
1221 _VSTD::piecewise_construct,
1222 _VSTD::forward_as_tuple(__k),
1223 _VSTD::forward_as_tuple(_VSTD::forward<_Args>(__args)...));
Marshall Clow3223db82015-07-07 03:37:33 +00001224 }
1225
1226 template <class... _Args>
1227 _LIBCPP_INLINE_VISIBILITY
1228 pair<iterator, bool> try_emplace(key_type&& __k, _Args&&... __args)
1229 {
Eric Fiselierd63f38e2016-03-31 03:13:37 +00001230 return __tree_.__emplace_unique_key_args(__k,
1231 _VSTD::piecewise_construct,
1232 _VSTD::forward_as_tuple(_VSTD::move(__k)),
1233 _VSTD::forward_as_tuple(_VSTD::forward<_Args>(__args)...));
Marshall Clow3223db82015-07-07 03:37:33 +00001234 }
1235
1236 template <class... _Args>
1237 _LIBCPP_INLINE_VISIBILITY
1238 iterator try_emplace(const_iterator __h, const key_type& __k, _Args&&... __args)
1239 {
Eric Fiselierd63f38e2016-03-31 03:13:37 +00001240 return __tree_.__emplace_hint_unique_key_args(__h.__i_, __k,
1241 _VSTD::piecewise_construct,
1242 _VSTD::forward_as_tuple(__k),
Mark de Wever1ba476f2020-09-19 15:39:09 +02001243 _VSTD::forward_as_tuple(_VSTD::forward<_Args>(__args)...)).first;
Marshall Clow3223db82015-07-07 03:37:33 +00001244 }
1245
1246 template <class... _Args>
1247 _LIBCPP_INLINE_VISIBILITY
1248 iterator try_emplace(const_iterator __h, key_type&& __k, _Args&&... __args)
1249 {
Eric Fiselierd63f38e2016-03-31 03:13:37 +00001250 return __tree_.__emplace_hint_unique_key_args(__h.__i_, __k,
1251 _VSTD::piecewise_construct,
1252 _VSTD::forward_as_tuple(_VSTD::move(__k)),
Mark de Wever1ba476f2020-09-19 15:39:09 +02001253 _VSTD::forward_as_tuple(_VSTD::forward<_Args>(__args)...)).first;
Marshall Clow3223db82015-07-07 03:37:33 +00001254 }
1255
1256 template <class _Vp>
1257 _LIBCPP_INLINE_VISIBILITY
1258 pair<iterator, bool> insert_or_assign(const key_type& __k, _Vp&& __v)
1259 {
1260 iterator __p = lower_bound(__k);
1261 if ( __p != end() && !key_comp()(__k, __p->first))
1262 {
1263 __p->second = _VSTD::forward<_Vp>(__v);
1264 return _VSTD::make_pair(__p, false);
1265 }
1266 return _VSTD::make_pair(emplace_hint(__p, __k, _VSTD::forward<_Vp>(__v)), true);
1267 }
Eric Fiselierd63f38e2016-03-31 03:13:37 +00001268
Marshall Clow3223db82015-07-07 03:37:33 +00001269 template <class _Vp>
1270 _LIBCPP_INLINE_VISIBILITY
1271 pair<iterator, bool> insert_or_assign(key_type&& __k, _Vp&& __v)
1272 {
1273 iterator __p = lower_bound(__k);
1274 if ( __p != end() && !key_comp()(__k, __p->first))
1275 {
1276 __p->second = _VSTD::forward<_Vp>(__v);
1277 return _VSTD::make_pair(__p, false);
1278 }
1279 return _VSTD::make_pair(emplace_hint(__p, _VSTD::move(__k), _VSTD::forward<_Vp>(__v)), true);
1280 }
1281
1282 template <class _Vp>
Mark de Wever1ba476f2020-09-19 15:39:09 +02001283 _LIBCPP_INLINE_VISIBILITY iterator insert_or_assign(const_iterator __h,
1284 const key_type& __k,
1285 _Vp&& __v) {
1286 auto [__r, __inserted] = __tree_.__emplace_hint_unique_key_args(
1287 __h.__i_, __k, __k, _VSTD::forward<_Vp>(__v));
1288
1289 if (!__inserted)
1290 __r->__get_value().second = _VSTD::forward<_Vp>(__v);
1291
1292 return __r;
1293 }
Marshall Clow3223db82015-07-07 03:37:33 +00001294
1295 template <class _Vp>
Mark de Wever1ba476f2020-09-19 15:39:09 +02001296 _LIBCPP_INLINE_VISIBILITY iterator insert_or_assign(const_iterator __h,
1297 key_type&& __k,
1298 _Vp&& __v) {
1299 auto [__r, __inserted] = __tree_.__emplace_hint_unique_key_args(
1300 __h.__i_, __k, _VSTD::move(__k), _VSTD::forward<_Vp>(__v));
1301
1302 if (!__inserted)
1303 __r->__get_value().second = _VSTD::forward<_Vp>(__v);
1304
1305 return __r;
1306 }
Eric Fiselierd63f38e2016-03-31 03:13:37 +00001307
Eric Fiseliera85b1282017-04-18 21:08:06 +00001308#endif // _LIBCPP_STD_VER > 14
Marshall Clow3223db82015-07-07 03:37:33 +00001309
Howard Hinnant756c69b2010-09-22 16:48:34 +00001310 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001311 iterator erase(const_iterator __p) {return __tree_.erase(__p.__i_);}
Howard Hinnant756c69b2010-09-22 16:48:34 +00001312 _LIBCPP_INLINE_VISIBILITY
Marshall Clow22ea5b82015-05-10 13:35:00 +00001313 iterator erase(iterator __p) {return __tree_.erase(__p.__i_);}
1314 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001315 size_type erase(const key_type& __k)
1316 {return __tree_.__erase_unique(__k);}
Howard Hinnant756c69b2010-09-22 16:48:34 +00001317 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001318 iterator erase(const_iterator __f, const_iterator __l)
1319 {return __tree_.erase(__f.__i_, __l.__i_);}
Howard Hinnant756c69b2010-09-22 16:48:34 +00001320 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001321 void clear() _NOEXCEPT {__tree_.clear();}
Howard Hinnantc51e1022010-05-11 19:42:16 +00001322
Erik Pilkingtonc37a3d82018-08-01 01:33:38 +00001323#if _LIBCPP_STD_VER > 14
1324 _LIBCPP_INLINE_VISIBILITY
1325 insert_return_type insert(node_type&& __nh)
1326 {
1327 _LIBCPP_ASSERT(__nh.empty() || __nh.get_allocator() == get_allocator(),
1328 "node_type with incompatible allocator passed to map::insert()");
1329 return __tree_.template __node_handle_insert_unique<
1330 node_type, insert_return_type>(_VSTD::move(__nh));
1331 }
1332 _LIBCPP_INLINE_VISIBILITY
1333 iterator insert(const_iterator __hint, node_type&& __nh)
1334 {
1335 _LIBCPP_ASSERT(__nh.empty() || __nh.get_allocator() == get_allocator(),
1336 "node_type with incompatible allocator passed to map::insert()");
1337 return __tree_.template __node_handle_insert_unique<node_type>(
1338 __hint.__i_, _VSTD::move(__nh));
1339 }
1340 _LIBCPP_INLINE_VISIBILITY
1341 node_type extract(key_type const& __key)
1342 {
1343 return __tree_.template __node_handle_extract<node_type>(__key);
1344 }
1345 _LIBCPP_INLINE_VISIBILITY
1346 node_type extract(const_iterator __it)
1347 {
1348 return __tree_.template __node_handle_extract<node_type>(__it.__i_);
1349 }
Louis Dionned2322c82018-11-01 14:41:37 +00001350 template <class _Compare2>
Erik Pilkington82a65ad2018-10-31 17:31:35 +00001351 _LIBCPP_INLINE_VISIBILITY
Louis Dionned2322c82018-11-01 14:41:37 +00001352 void merge(map<key_type, mapped_type, _Compare2, allocator_type>& __source)
Erik Pilkington82a65ad2018-10-31 17:31:35 +00001353 {
1354 _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
1355 "merging container with incompatible allocator");
1356 __tree_.__node_handle_merge_unique(__source.__tree_);
1357 }
Louis Dionned2322c82018-11-01 14:41:37 +00001358 template <class _Compare2>
Erik Pilkington82a65ad2018-10-31 17:31:35 +00001359 _LIBCPP_INLINE_VISIBILITY
Louis Dionned2322c82018-11-01 14:41:37 +00001360 void merge(map<key_type, mapped_type, _Compare2, allocator_type>&& __source)
Erik Pilkington82a65ad2018-10-31 17:31:35 +00001361 {
1362 _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
1363 "merging container with incompatible allocator");
1364 __tree_.__node_handle_merge_unique(__source.__tree_);
1365 }
Louis Dionned2322c82018-11-01 14:41:37 +00001366 template <class _Compare2>
Erik Pilkington82a65ad2018-10-31 17:31:35 +00001367 _LIBCPP_INLINE_VISIBILITY
Louis Dionned2322c82018-11-01 14:41:37 +00001368 void merge(multimap<key_type, mapped_type, _Compare2, allocator_type>& __source)
Erik Pilkington82a65ad2018-10-31 17:31:35 +00001369 {
1370 _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
1371 "merging container with incompatible allocator");
1372 __tree_.__node_handle_merge_unique(__source.__tree_);
1373 }
Louis Dionned2322c82018-11-01 14:41:37 +00001374 template <class _Compare2>
Erik Pilkington82a65ad2018-10-31 17:31:35 +00001375 _LIBCPP_INLINE_VISIBILITY
Louis Dionned2322c82018-11-01 14:41:37 +00001376 void merge(multimap<key_type, mapped_type, _Compare2, allocator_type>&& __source)
Erik Pilkington82a65ad2018-10-31 17:31:35 +00001377 {
1378 _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
1379 "merging container with incompatible allocator");
1380 __tree_.__node_handle_merge_unique(__source.__tree_);
1381 }
Erik Pilkingtonc37a3d82018-08-01 01:33:38 +00001382#endif
1383
Howard Hinnant756c69b2010-09-22 16:48:34 +00001384 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001385 void swap(map& __m)
1386 _NOEXCEPT_(__is_nothrow_swappable<__base>::value)
1387 {__tree_.swap(__m.__tree_);}
Howard Hinnantc51e1022010-05-11 19:42:16 +00001388
Howard Hinnant756c69b2010-09-22 16:48:34 +00001389 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001390 iterator find(const key_type& __k) {return __tree_.find(__k);}
Howard Hinnant756c69b2010-09-22 16:48:34 +00001391 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001392 const_iterator find(const key_type& __k) const {return __tree_.find(__k);}
Marshall Clowebb57322013-08-13 22:18:47 +00001393#if _LIBCPP_STD_VER > 11
1394 template <typename _K2>
1395 _LIBCPP_INLINE_VISIBILITY
1396 typename enable_if<__is_transparent<_Compare, _K2>::value,iterator>::type
1397 find(const _K2& __k) {return __tree_.find(__k);}
1398 template <typename _K2>
1399 _LIBCPP_INLINE_VISIBILITY
1400 typename enable_if<__is_transparent<_Compare, _K2>::value,const_iterator>::type
1401 find(const _K2& __k) const {return __tree_.find(__k);}
1402#endif
1403
Howard Hinnant756c69b2010-09-22 16:48:34 +00001404 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001405 size_type count(const key_type& __k) const
1406 {return __tree_.__count_unique(__k);}
Marshall Clowe6a5f522014-08-24 23:54:16 +00001407#if _LIBCPP_STD_VER > 11
1408 template <typename _K2>
1409 _LIBCPP_INLINE_VISIBILITY
1410 typename enable_if<__is_transparent<_Compare, _K2>::value,size_type>::type
Eric Fiseliera85c9e92018-02-10 02:53:47 +00001411 count(const _K2& __k) const {return __tree_.__count_multi(__k);}
Marshall Clowe6a5f522014-08-24 23:54:16 +00001412#endif
Zoe Carver3ffbab12019-07-16 03:21:01 +00001413
1414#if _LIBCPP_STD_VER > 17
1415 _LIBCPP_INLINE_VISIBILITY
1416 bool contains(const key_type& __k) const {return find(__k) != end();}
Marek Kurdejd7e019e2021-04-13 17:10:55 +02001417 template <typename _K2>
1418 _LIBCPP_INLINE_VISIBILITY
1419 typename enable_if<__is_transparent<_Compare, _K2>::value, bool>::type
1420 contains(const _K2& __k) const { return find(__k) != end(); }
Zoe Carver3ffbab12019-07-16 03:21:01 +00001421#endif // _LIBCPP_STD_VER > 17
1422
Howard Hinnant756c69b2010-09-22 16:48:34 +00001423 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001424 iterator lower_bound(const key_type& __k)
1425 {return __tree_.lower_bound(__k);}
Howard Hinnant756c69b2010-09-22 16:48:34 +00001426 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001427 const_iterator lower_bound(const key_type& __k) const
1428 {return __tree_.lower_bound(__k);}
Marshall Clowebb57322013-08-13 22:18:47 +00001429#if _LIBCPP_STD_VER > 11
1430 template <typename _K2>
1431 _LIBCPP_INLINE_VISIBILITY
1432 typename enable_if<__is_transparent<_Compare, _K2>::value,iterator>::type
1433 lower_bound(const _K2& __k) {return __tree_.lower_bound(__k);}
1434
1435 template <typename _K2>
1436 _LIBCPP_INLINE_VISIBILITY
1437 typename enable_if<__is_transparent<_Compare, _K2>::value,const_iterator>::type
1438 lower_bound(const _K2& __k) const {return __tree_.lower_bound(__k);}
1439#endif
1440
Howard Hinnant756c69b2010-09-22 16:48:34 +00001441 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001442 iterator upper_bound(const key_type& __k)
1443 {return __tree_.upper_bound(__k);}
Howard Hinnant756c69b2010-09-22 16:48:34 +00001444 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001445 const_iterator upper_bound(const key_type& __k) const
1446 {return __tree_.upper_bound(__k);}
Marshall Clowebb57322013-08-13 22:18:47 +00001447#if _LIBCPP_STD_VER > 11
1448 template <typename _K2>
1449 _LIBCPP_INLINE_VISIBILITY
1450 typename enable_if<__is_transparent<_Compare, _K2>::value,iterator>::type
1451 upper_bound(const _K2& __k) {return __tree_.upper_bound(__k);}
1452 template <typename _K2>
1453 _LIBCPP_INLINE_VISIBILITY
1454 typename enable_if<__is_transparent<_Compare, _K2>::value,const_iterator>::type
1455 upper_bound(const _K2& __k) const {return __tree_.upper_bound(__k);}
1456#endif
1457
Howard Hinnant756c69b2010-09-22 16:48:34 +00001458 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001459 pair<iterator,iterator> equal_range(const key_type& __k)
1460 {return __tree_.__equal_range_unique(__k);}
Howard Hinnant756c69b2010-09-22 16:48:34 +00001461 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001462 pair<const_iterator,const_iterator> equal_range(const key_type& __k) const
1463 {return __tree_.__equal_range_unique(__k);}
Marshall Clowebb57322013-08-13 22:18:47 +00001464#if _LIBCPP_STD_VER > 11
1465 template <typename _K2>
1466 _LIBCPP_INLINE_VISIBILITY
1467 typename enable_if<__is_transparent<_Compare, _K2>::value,pair<iterator,iterator>>::type
Eric Fiseliera85c9e92018-02-10 02:53:47 +00001468 equal_range(const _K2& __k) {return __tree_.__equal_range_multi(__k);}
Marshall Clowebb57322013-08-13 22:18:47 +00001469 template <typename _K2>
1470 _LIBCPP_INLINE_VISIBILITY
1471 typename enable_if<__is_transparent<_Compare, _K2>::value,pair<const_iterator,const_iterator>>::type
Eric Fiseliera85c9e92018-02-10 02:53:47 +00001472 equal_range(const _K2& __k) const {return __tree_.__equal_range_multi(__k);}
Marshall Clowebb57322013-08-13 22:18:47 +00001473#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00001474
1475private:
1476 typedef typename __base::__node __node;
1477 typedef typename __base::__node_allocator __node_allocator;
1478 typedef typename __base::__node_pointer __node_pointer;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001479 typedef typename __base::__node_base_pointer __node_base_pointer;
Eric Fiseliercf8c0212017-01-05 06:06:18 +00001480 typedef typename __base::__parent_pointer __parent_pointer;
Eric Fiseliera92b0732016-02-20 07:12:17 +00001481
Howard Hinnantc834c512011-11-29 18:15:50 +00001482 typedef __map_node_destructor<__node_allocator> _Dp;
1483 typedef unique_ptr<__node, _Dp> __node_holder;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001484
Eric Fiselierd63f38e2016-03-31 03:13:37 +00001485#ifdef _LIBCPP_CXX03_LANG
Howard Hinnantac7e7482013-07-04 20:59:16 +00001486 __node_holder __construct_node_with_key(const key_type& __k);
Eric Fiselierd63f38e2016-03-31 03:13:37 +00001487#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00001488};
1489
Louis Dionned23a5f22019-06-20 19:32:00 +00001490#ifndef _LIBCPP_HAS_NO_DEDUCTION_GUIDES
1491template<class _InputIterator, class _Compare = less<__iter_key_type<_InputIterator>>,
1492 class _Allocator = allocator<__iter_to_alloc_type<_InputIterator>>,
Louis Dionne6c7da9a2019-07-19 17:13:39 +00001493 class = _EnableIf<!__is_allocator<_Compare>::value, void>,
1494 class = _EnableIf<__is_allocator<_Allocator>::value, void>>
Louis Dionned23a5f22019-06-20 19:32:00 +00001495map(_InputIterator, _InputIterator, _Compare = _Compare(), _Allocator = _Allocator())
1496 -> map<__iter_key_type<_InputIterator>, __iter_mapped_type<_InputIterator>, _Compare, _Allocator>;
1497
1498template<class _Key, class _Tp, class _Compare = less<remove_const_t<_Key>>,
1499 class _Allocator = allocator<pair<const _Key, _Tp>>,
Louis Dionne6c7da9a2019-07-19 17:13:39 +00001500 class = _EnableIf<!__is_allocator<_Compare>::value, void>,
1501 class = _EnableIf<__is_allocator<_Allocator>::value, void>>
Louis Dionned23a5f22019-06-20 19:32:00 +00001502map(initializer_list<pair<_Key, _Tp>>, _Compare = _Compare(), _Allocator = _Allocator())
1503 -> map<remove_const_t<_Key>, _Tp, _Compare, _Allocator>;
1504
1505template<class _InputIterator, class _Allocator,
Louis Dionne6c7da9a2019-07-19 17:13:39 +00001506 class = _EnableIf<__is_allocator<_Allocator>::value, void>>
Louis Dionned23a5f22019-06-20 19:32:00 +00001507map(_InputIterator, _InputIterator, _Allocator)
1508 -> map<__iter_key_type<_InputIterator>, __iter_mapped_type<_InputIterator>,
1509 less<__iter_key_type<_InputIterator>>, _Allocator>;
1510
1511template<class _Key, class _Tp, class _Allocator,
Louis Dionne6c7da9a2019-07-19 17:13:39 +00001512 class = _EnableIf<__is_allocator<_Allocator>::value, void>>
Louis Dionned23a5f22019-06-20 19:32:00 +00001513map(initializer_list<pair<_Key, _Tp>>, _Allocator)
1514 -> map<remove_const_t<_Key>, _Tp, less<remove_const_t<_Key>>, _Allocator>;
1515#endif
Eric Fiseliera92b0732016-02-20 07:12:17 +00001516
Eric Fiselierd06276b2016-03-31 02:15:15 +00001517#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00001518template <class _Key, class _Tp, class _Compare, class _Allocator>
1519map<_Key, _Tp, _Compare, _Allocator>::map(map&& __m, const allocator_type& __a)
Marshall Clow657cbc42016-08-17 05:58:40 +00001520 : __tree_(_VSTD::move(__m.__tree_), typename __base::allocator_type(__a))
Howard Hinnantc51e1022010-05-11 19:42:16 +00001521{
1522 if (__a != __m.get_allocator())
1523 {
1524 const_iterator __e = cend();
1525 while (!__m.empty())
1526 __tree_.__insert_unique(__e.__i_,
Erik Pilkingtond3fe2992018-06-04 20:38:23 +00001527 __m.__tree_.remove(__m.begin().__i_)->__value_.__move());
Howard Hinnantc51e1022010-05-11 19:42:16 +00001528 }
1529}
1530
Eric Fiseliera85b1282017-04-18 21:08:06 +00001531template <class _Key, class _Tp, class _Compare, class _Allocator>
1532_Tp&
1533map<_Key, _Tp, _Compare, _Allocator>::operator[](const key_type& __k)
1534{
1535 return __tree_.__emplace_unique_key_args(__k,
1536 _VSTD::piecewise_construct,
1537 _VSTD::forward_as_tuple(__k),
Erik Pilkingtond3fe2992018-06-04 20:38:23 +00001538 _VSTD::forward_as_tuple()).first->__get_value().second;
Eric Fiseliera85b1282017-04-18 21:08:06 +00001539}
Howard Hinnantc51e1022010-05-11 19:42:16 +00001540
Eric Fiseliera85b1282017-04-18 21:08:06 +00001541template <class _Key, class _Tp, class _Compare, class _Allocator>
1542_Tp&
1543map<_Key, _Tp, _Compare, _Allocator>::operator[](key_type&& __k)
1544{
1545 return __tree_.__emplace_unique_key_args(__k,
1546 _VSTD::piecewise_construct,
1547 _VSTD::forward_as_tuple(_VSTD::move(__k)),
Erik Pilkingtond3fe2992018-06-04 20:38:23 +00001548 _VSTD::forward_as_tuple()).first->__get_value().second;
Eric Fiseliera85b1282017-04-18 21:08:06 +00001549}
Eric Fiselierd63f38e2016-03-31 03:13:37 +00001550
Eric Fiseliera85b1282017-04-18 21:08:06 +00001551#else // _LIBCPP_CXX03_LANG
Eric Fiselierd63f38e2016-03-31 03:13:37 +00001552
Howard Hinnantc51e1022010-05-11 19:42:16 +00001553template <class _Key, class _Tp, class _Compare, class _Allocator>
1554typename map<_Key, _Tp, _Compare, _Allocator>::__node_holder
Howard Hinnantac7e7482013-07-04 20:59:16 +00001555map<_Key, _Tp, _Compare, _Allocator>::__construct_node_with_key(const key_type& __k)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001556{
1557 __node_allocator& __na = __tree_.__node_alloc();
Howard Hinnantc834c512011-11-29 18:15:50 +00001558 __node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na));
Erik Pilkingtond3fe2992018-06-04 20:38:23 +00001559 __node_traits::construct(__na, _VSTD::addressof(__h->__value_.__get_value().first), __k);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001560 __h.get_deleter().__first_constructed = true;
Erik Pilkingtond3fe2992018-06-04 20:38:23 +00001561 __node_traits::construct(__na, _VSTD::addressof(__h->__value_.__get_value().second));
Howard Hinnantc51e1022010-05-11 19:42:16 +00001562 __h.get_deleter().__second_constructed = true;
Louis Dionne7b844362020-07-30 09:42:23 -04001563 return __h;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001564}
1565
Howard Hinnantc51e1022010-05-11 19:42:16 +00001566template <class _Key, class _Tp, class _Compare, class _Allocator>
1567_Tp&
1568map<_Key, _Tp, _Compare, _Allocator>::operator[](const key_type& __k)
1569{
Eric Fiseliercf8c0212017-01-05 06:06:18 +00001570 __parent_pointer __parent;
1571 __node_base_pointer& __child = __tree_.__find_equal(__parent, __k);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001572 __node_pointer __r = static_cast<__node_pointer>(__child);
1573 if (__child == nullptr)
1574 {
Howard Hinnantac7e7482013-07-04 20:59:16 +00001575 __node_holder __h = __construct_node_with_key(__k);
Howard Hinnant2d0046b2013-06-19 21:29:40 +00001576 __tree_.__insert_node_at(__parent, __child, static_cast<__node_base_pointer>(__h.get()));
Howard Hinnantc51e1022010-05-11 19:42:16 +00001577 __r = __h.release();
1578 }
Erik Pilkingtond3fe2992018-06-04 20:38:23 +00001579 return __r->__value_.__get_value().second;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001580}
1581
Eric Fiseliera85b1282017-04-18 21:08:06 +00001582#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00001583
1584template <class _Key, class _Tp, class _Compare, class _Allocator>
1585_Tp&
1586map<_Key, _Tp, _Compare, _Allocator>::at(const key_type& __k)
1587{
Eric Fiseliercf8c0212017-01-05 06:06:18 +00001588 __parent_pointer __parent;
1589 __node_base_pointer& __child = __tree_.__find_equal(__parent, __k);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001590 if (__child == nullptr)
Louis Dionne2b239162019-02-12 16:06:02 +00001591 __throw_out_of_range("map::at: key not found");
Erik Pilkingtond3fe2992018-06-04 20:38:23 +00001592 return static_cast<__node_pointer>(__child)->__value_.__get_value().second;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001593}
1594
1595template <class _Key, class _Tp, class _Compare, class _Allocator>
1596const _Tp&
1597map<_Key, _Tp, _Compare, _Allocator>::at(const key_type& __k) const
1598{
Eric Fiseliercf8c0212017-01-05 06:06:18 +00001599 __parent_pointer __parent;
1600 __node_base_pointer __child = __tree_.__find_equal(__parent, __k);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001601 if (__child == nullptr)
Louis Dionne2b239162019-02-12 16:06:02 +00001602 __throw_out_of_range("map::at: key not found");
Erik Pilkingtond3fe2992018-06-04 20:38:23 +00001603 return static_cast<__node_pointer>(__child)->__value_.__get_value().second;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001604}
1605
Howard Hinnantc51e1022010-05-11 19:42:16 +00001606
1607template <class _Key, class _Tp, class _Compare, class _Allocator>
Howard Hinnant756c69b2010-09-22 16:48:34 +00001608inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001609bool
1610operator==(const map<_Key, _Tp, _Compare, _Allocator>& __x,
1611 const map<_Key, _Tp, _Compare, _Allocator>& __y)
1612{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001613 return __x.size() == __y.size() && _VSTD::equal(__x.begin(), __x.end(), __y.begin());
Howard Hinnantc51e1022010-05-11 19:42:16 +00001614}
1615
1616template <class _Key, class _Tp, class _Compare, class _Allocator>
Howard Hinnant756c69b2010-09-22 16:48:34 +00001617inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001618bool
1619operator< (const map<_Key, _Tp, _Compare, _Allocator>& __x,
1620 const map<_Key, _Tp, _Compare, _Allocator>& __y)
1621{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001622 return _VSTD::lexicographical_compare(__x.begin(), __x.end(), __y.begin(), __y.end());
Howard Hinnantc51e1022010-05-11 19:42:16 +00001623}
1624
1625template <class _Key, class _Tp, class _Compare, class _Allocator>
Howard Hinnant756c69b2010-09-22 16:48:34 +00001626inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001627bool
1628operator!=(const map<_Key, _Tp, _Compare, _Allocator>& __x,
1629 const map<_Key, _Tp, _Compare, _Allocator>& __y)
1630{
1631 return !(__x == __y);
1632}
1633
1634template <class _Key, class _Tp, class _Compare, class _Allocator>
Howard Hinnant756c69b2010-09-22 16:48:34 +00001635inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001636bool
1637operator> (const map<_Key, _Tp, _Compare, _Allocator>& __x,
1638 const map<_Key, _Tp, _Compare, _Allocator>& __y)
1639{
1640 return __y < __x;
1641}
1642
1643template <class _Key, class _Tp, class _Compare, class _Allocator>
Howard Hinnant756c69b2010-09-22 16:48:34 +00001644inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001645bool
1646operator>=(const map<_Key, _Tp, _Compare, _Allocator>& __x,
1647 const map<_Key, _Tp, _Compare, _Allocator>& __y)
1648{
1649 return !(__x < __y);
1650}
1651
1652template <class _Key, class _Tp, class _Compare, class _Allocator>
Howard Hinnant756c69b2010-09-22 16:48:34 +00001653inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001654bool
1655operator<=(const map<_Key, _Tp, _Compare, _Allocator>& __x,
1656 const map<_Key, _Tp, _Compare, _Allocator>& __y)
1657{
1658 return !(__y < __x);
1659}
1660
1661template <class _Key, class _Tp, class _Compare, class _Allocator>
Howard Hinnant756c69b2010-09-22 16:48:34 +00001662inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001663void
1664swap(map<_Key, _Tp, _Compare, _Allocator>& __x,
1665 map<_Key, _Tp, _Compare, _Allocator>& __y)
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001666 _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
Howard Hinnantc51e1022010-05-11 19:42:16 +00001667{
1668 __x.swap(__y);
1669}
1670
Marshall Clow29b53f22018-12-14 18:49:35 +00001671#if _LIBCPP_STD_VER > 17
Marek Kurdeja98b1412020-05-02 13:58:03 +02001672template <class _Key, class _Tp, class _Compare, class _Allocator,
1673 class _Predicate>
Marshall Clow29b53f22018-12-14 18:49:35 +00001674inline _LIBCPP_INLINE_VISIBILITY
Marek Kurdeja98b1412020-05-02 13:58:03 +02001675 typename map<_Key, _Tp, _Compare, _Allocator>::size_type
1676 erase_if(map<_Key, _Tp, _Compare, _Allocator>& __c, _Predicate __pred) {
Arthur O'Dwyerb6738bd2021-03-21 16:53:09 -04001677 return _VSTD::__libcpp_erase_if_container(__c, __pred);
Marek Kurdeja98b1412020-05-02 13:58:03 +02001678}
Marshall Clow29b53f22018-12-14 18:49:35 +00001679#endif
1680
1681
Howard Hinnantc51e1022010-05-11 19:42:16 +00001682template <class _Key, class _Tp, class _Compare = less<_Key>,
1683 class _Allocator = allocator<pair<const _Key, _Tp> > >
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +00001684class _LIBCPP_TEMPLATE_VIS multimap
Howard Hinnantc51e1022010-05-11 19:42:16 +00001685{
1686public:
1687 // types:
1688 typedef _Key key_type;
1689 typedef _Tp mapped_type;
1690 typedef pair<const key_type, mapped_type> value_type;
Arthur O'Dwyer6a752e12021-03-03 11:10:49 -05001691 typedef __identity_t<_Compare> key_compare;
1692 typedef __identity_t<_Allocator> allocator_type;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001693 typedef value_type& reference;
1694 typedef const value_type& const_reference;
1695
Marshall Clow5128cf32015-11-26 01:24:04 +00001696 static_assert((is_same<typename allocator_type::value_type, value_type>::value),
1697 "Allocator::value_type must be same type as value_type");
1698
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +00001699 class _LIBCPP_TEMPLATE_VIS value_compare
Howard Hinnantc51e1022010-05-11 19:42:16 +00001700 : public binary_function<value_type, value_type, bool>
1701 {
1702 friend class multimap;
1703 protected:
1704 key_compare comp;
1705
Howard Hinnant756c69b2010-09-22 16:48:34 +00001706 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001707 value_compare(key_compare c) : comp(c) {}
1708 public:
Howard Hinnant756c69b2010-09-22 16:48:34 +00001709 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001710 bool operator()(const value_type& __x, const value_type& __y) const
1711 {return comp(__x.first, __y.first);}
1712 };
1713
1714private:
Howard Hinnant2d0046b2013-06-19 21:29:40 +00001715
Howard Hinnant89f8b792013-09-30 19:08:22 +00001716 typedef _VSTD::__value_type<key_type, mapped_type> __value_type;
Howard Hinnant90b91592013-07-05 18:06:00 +00001717 typedef __map_value_compare<key_type, __value_type, key_compare> __vc;
Marshall Clow940e01c2015-04-07 05:21:38 +00001718 typedef typename __rebind_alloc_helper<allocator_traits<allocator_type>,
1719 __value_type>::type __allocator_type;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001720 typedef __tree<__value_type, __vc, __allocator_type> __base;
1721 typedef typename __base::__node_traits __node_traits;
1722 typedef allocator_traits<allocator_type> __alloc_traits;
1723
1724 __base __tree_;
1725
1726public:
1727 typedef typename __alloc_traits::pointer pointer;
1728 typedef typename __alloc_traits::const_pointer const_pointer;
1729 typedef typename __alloc_traits::size_type size_type;
1730 typedef typename __alloc_traits::difference_type difference_type;
1731 typedef __map_iterator<typename __base::iterator> iterator;
1732 typedef __map_const_iterator<typename __base::const_iterator> const_iterator;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001733 typedef _VSTD::reverse_iterator<iterator> reverse_iterator;
1734 typedef _VSTD::reverse_iterator<const_iterator> const_reverse_iterator;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001735
Erik Pilkingtonc37a3d82018-08-01 01:33:38 +00001736#if _LIBCPP_STD_VER > 14
1737 typedef __map_node_handle<typename __base::__node, allocator_type> node_type;
1738#endif
1739
Erik Pilkington82a65ad2018-10-31 17:31:35 +00001740 template <class _Key2, class _Value2, class _Comp2, class _Alloc2>
1741 friend class _LIBCPP_TEMPLATE_VIS map;
1742 template <class _Key2, class _Value2, class _Comp2, class _Alloc2>
1743 friend class _LIBCPP_TEMPLATE_VIS multimap;
1744
Howard Hinnant756c69b2010-09-22 16:48:34 +00001745 _LIBCPP_INLINE_VISIBILITY
Marshall Clow7086a5a2014-03-10 04:50:10 +00001746 multimap()
1747 _NOEXCEPT_(
1748 is_nothrow_default_constructible<allocator_type>::value &&
1749 is_nothrow_default_constructible<key_compare>::value &&
1750 is_nothrow_copy_constructible<key_compare>::value)
1751 : __tree_(__vc(key_compare())) {}
1752
1753 _LIBCPP_INLINE_VISIBILITY
1754 explicit multimap(const key_compare& __comp)
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001755 _NOEXCEPT_(
1756 is_nothrow_default_constructible<allocator_type>::value &&
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001757 is_nothrow_copy_constructible<key_compare>::value)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001758 : __tree_(__vc(__comp)) {}
1759
Howard Hinnant756c69b2010-09-22 16:48:34 +00001760 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001761 explicit multimap(const key_compare& __comp, const allocator_type& __a)
Marshall Clow657cbc42016-08-17 05:58:40 +00001762 : __tree_(__vc(__comp), typename __base::allocator_type(__a)) {}
Howard Hinnantc51e1022010-05-11 19:42:16 +00001763
1764 template <class _InputIterator>
Howard Hinnant756c69b2010-09-22 16:48:34 +00001765 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001766 multimap(_InputIterator __f, _InputIterator __l,
1767 const key_compare& __comp = key_compare())
1768 : __tree_(__vc(__comp))
1769 {
1770 insert(__f, __l);
1771 }
1772
1773 template <class _InputIterator>
Howard Hinnant756c69b2010-09-22 16:48:34 +00001774 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001775 multimap(_InputIterator __f, _InputIterator __l,
1776 const key_compare& __comp, const allocator_type& __a)
Marshall Clow657cbc42016-08-17 05:58:40 +00001777 : __tree_(__vc(__comp), typename __base::allocator_type(__a))
Howard Hinnantc51e1022010-05-11 19:42:16 +00001778 {
1779 insert(__f, __l);
1780 }
1781
Marshall Clow300abfb2013-09-11 01:15:47 +00001782#if _LIBCPP_STD_VER > 11
1783 template <class _InputIterator>
Eric Fiseliercf8c0212017-01-05 06:06:18 +00001784 _LIBCPP_INLINE_VISIBILITY
Marshall Clow300abfb2013-09-11 01:15:47 +00001785 multimap(_InputIterator __f, _InputIterator __l, const allocator_type& __a)
1786 : multimap(__f, __l, key_compare(), __a) {}
1787#endif
1788
Howard Hinnant756c69b2010-09-22 16:48:34 +00001789 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001790 multimap(const multimap& __m)
1791 : __tree_(__m.__tree_.value_comp(),
1792 __alloc_traits::select_on_container_copy_construction(__m.__tree_.__alloc()))
1793 {
1794 insert(__m.begin(), __m.end());
1795 }
1796
Howard Hinnantd3a657f2011-07-01 19:24:36 +00001797 _LIBCPP_INLINE_VISIBILITY
1798 multimap& operator=(const multimap& __m)
1799 {
Marshall Clow476d3f42016-07-18 13:19:00 +00001800#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantd3a657f2011-07-01 19:24:36 +00001801 __tree_ = __m.__tree_;
Howard Hinnant2d0046b2013-06-19 21:29:40 +00001802#else
Marshall Clowdb3cfcb2014-02-08 04:03:14 +00001803 if (this != &__m) {
1804 __tree_.clear();
1805 __tree_.value_comp() = __m.__tree_.value_comp();
1806 __tree_.__copy_assign_alloc(__m.__tree_);
1807 insert(__m.begin(), __m.end());
1808 }
Howard Hinnant2d0046b2013-06-19 21:29:40 +00001809#endif
Howard Hinnantd3a657f2011-07-01 19:24:36 +00001810 return *this;
1811 }
1812
Eric Fiseliera85b1282017-04-18 21:08:06 +00001813#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00001814
Howard Hinnant756c69b2010-09-22 16:48:34 +00001815 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001816 multimap(multimap&& __m)
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001817 _NOEXCEPT_(is_nothrow_move_constructible<__base>::value)
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001818 : __tree_(_VSTD::move(__m.__tree_))
Howard Hinnantc51e1022010-05-11 19:42:16 +00001819 {
1820 }
1821
1822 multimap(multimap&& __m, const allocator_type& __a);
1823
Howard Hinnant756c69b2010-09-22 16:48:34 +00001824 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant33711792011-08-12 21:56:02 +00001825 multimap& operator=(multimap&& __m)
1826 _NOEXCEPT_(is_nothrow_move_assignable<__base>::value)
1827 {
1828 __tree_ = _VSTD::move(__m.__tree_);
1829 return *this;
1830 }
1831
Howard Hinnant33711792011-08-12 21:56:02 +00001832 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001833 multimap(initializer_list<value_type> __il, const key_compare& __comp = key_compare())
1834 : __tree_(__vc(__comp))
1835 {
1836 insert(__il.begin(), __il.end());
1837 }
1838
Howard Hinnant756c69b2010-09-22 16:48:34 +00001839 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001840 multimap(initializer_list<value_type> __il, const key_compare& __comp, const allocator_type& __a)
Marshall Clow657cbc42016-08-17 05:58:40 +00001841 : __tree_(__vc(__comp), typename __base::allocator_type(__a))
Howard Hinnantc51e1022010-05-11 19:42:16 +00001842 {
1843 insert(__il.begin(), __il.end());
1844 }
1845
Marshall Clow300abfb2013-09-11 01:15:47 +00001846#if _LIBCPP_STD_VER > 11
Eric Fiseliercf8c0212017-01-05 06:06:18 +00001847 _LIBCPP_INLINE_VISIBILITY
Marshall Clow300abfb2013-09-11 01:15:47 +00001848 multimap(initializer_list<value_type> __il, const allocator_type& __a)
1849 : multimap(__il, key_compare(), __a) {}
1850#endif
1851
Howard Hinnant756c69b2010-09-22 16:48:34 +00001852 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001853 multimap& operator=(initializer_list<value_type> __il)
1854 {
1855 __tree_.__assign_multi(__il.begin(), __il.end());
1856 return *this;
1857 }
Howard Hinnant33711792011-08-12 21:56:02 +00001858
Eric Fiseliera85b1282017-04-18 21:08:06 +00001859#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00001860
Howard Hinnant756c69b2010-09-22 16:48:34 +00001861 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001862 explicit multimap(const allocator_type& __a)
Marshall Clow657cbc42016-08-17 05:58:40 +00001863 : __tree_(typename __base::allocator_type(__a))
Howard Hinnantc51e1022010-05-11 19:42:16 +00001864 {
1865 }
1866
Howard Hinnant756c69b2010-09-22 16:48:34 +00001867 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001868 multimap(const multimap& __m, const allocator_type& __a)
Marshall Clow657cbc42016-08-17 05:58:40 +00001869 : __tree_(__m.__tree_.value_comp(), typename __base::allocator_type(__a))
Howard Hinnantc51e1022010-05-11 19:42:16 +00001870 {
1871 insert(__m.begin(), __m.end());
1872 }
1873
Howard Hinnant756c69b2010-09-22 16:48:34 +00001874 _LIBCPP_INLINE_VISIBILITY
Louis Dionne69c42c02019-04-11 16:14:56 +00001875 ~multimap() {
1876 static_assert(sizeof(__diagnose_non_const_comparator<_Key, _Compare>()), "");
1877 }
1878
1879 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001880 iterator begin() _NOEXCEPT {return __tree_.begin();}
Howard Hinnant756c69b2010-09-22 16:48:34 +00001881 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001882 const_iterator begin() const _NOEXCEPT {return __tree_.begin();}
Howard Hinnant756c69b2010-09-22 16:48:34 +00001883 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001884 iterator end() _NOEXCEPT {return __tree_.end();}
Howard Hinnant756c69b2010-09-22 16:48:34 +00001885 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001886 const_iterator end() const _NOEXCEPT {return __tree_.end();}
Howard Hinnantc51e1022010-05-11 19:42:16 +00001887
Howard Hinnant756c69b2010-09-22 16:48:34 +00001888 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001889 reverse_iterator rbegin() _NOEXCEPT {return reverse_iterator(end());}
Howard Hinnant756c69b2010-09-22 16:48:34 +00001890 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001891 const_reverse_iterator rbegin() const _NOEXCEPT
1892 {return const_reverse_iterator(end());}
Howard Hinnant756c69b2010-09-22 16:48:34 +00001893 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001894 reverse_iterator rend() _NOEXCEPT {return reverse_iterator(begin());}
Howard Hinnant756c69b2010-09-22 16:48:34 +00001895 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001896 const_reverse_iterator rend() const _NOEXCEPT
1897 {return const_reverse_iterator(begin());}
Howard Hinnantc51e1022010-05-11 19:42:16 +00001898
Howard Hinnant756c69b2010-09-22 16:48:34 +00001899 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001900 const_iterator cbegin() const _NOEXCEPT {return begin();}
Howard Hinnant756c69b2010-09-22 16:48:34 +00001901 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001902 const_iterator cend() const _NOEXCEPT {return end();}
Howard Hinnant756c69b2010-09-22 16:48:34 +00001903 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001904 const_reverse_iterator crbegin() const _NOEXCEPT {return rbegin();}
Howard Hinnant756c69b2010-09-22 16:48:34 +00001905 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001906 const_reverse_iterator crend() const _NOEXCEPT {return rend();}
Howard Hinnantc51e1022010-05-11 19:42:16 +00001907
Marshall Clow425f5752017-11-15 05:51:26 +00001908 _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001909 bool empty() const _NOEXCEPT {return __tree_.size() == 0;}
Howard Hinnant756c69b2010-09-22 16:48:34 +00001910 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001911 size_type size() const _NOEXCEPT {return __tree_.size();}
Howard Hinnant756c69b2010-09-22 16:48:34 +00001912 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001913 size_type max_size() const _NOEXCEPT {return __tree_.max_size();}
Howard Hinnantc51e1022010-05-11 19:42:16 +00001914
Howard Hinnant756c69b2010-09-22 16:48:34 +00001915 _LIBCPP_INLINE_VISIBILITY
Marshall Clow657cbc42016-08-17 05:58:40 +00001916 allocator_type get_allocator() const _NOEXCEPT {return allocator_type(__tree_.__alloc());}
Howard Hinnant756c69b2010-09-22 16:48:34 +00001917 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001918 key_compare key_comp() const {return __tree_.value_comp().key_comp();}
Howard Hinnant756c69b2010-09-22 16:48:34 +00001919 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001920 value_compare value_comp() const
1921 {return value_compare(__tree_.value_comp().key_comp());}
Howard Hinnantc51e1022010-05-11 19:42:16 +00001922
Eric Fiselierd06276b2016-03-31 02:15:15 +00001923#ifndef _LIBCPP_CXX03_LANG
Howard Hinnant74279a52010-09-04 23:28:19 +00001924
Howard Hinnant29eb9b82012-05-25 22:04:21 +00001925 template <class ..._Args>
Eric Fiselierd06276b2016-03-31 02:15:15 +00001926 _LIBCPP_INLINE_VISIBILITY
1927 iterator emplace(_Args&& ...__args) {
1928 return __tree_.__emplace_multi(_VSTD::forward<_Args>(__args)...);
1929 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00001930
Howard Hinnant29eb9b82012-05-25 22:04:21 +00001931 template <class ..._Args>
Eric Fiselierd06276b2016-03-31 02:15:15 +00001932 _LIBCPP_INLINE_VISIBILITY
1933 iterator emplace_hint(const_iterator __p, _Args&& ...__args) {
1934 return __tree_.__emplace_hint_multi(__p.__i_, _VSTD::forward<_Args>(__args)...);
1935 }
Howard Hinnant74279a52010-09-04 23:28:19 +00001936
Howard Hinnantc834c512011-11-29 18:15:50 +00001937 template <class _Pp,
1938 class = typename enable_if<is_constructible<value_type, _Pp>::value>::type>
Howard Hinnant756c69b2010-09-22 16:48:34 +00001939 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc834c512011-11-29 18:15:50 +00001940 iterator insert(_Pp&& __p)
1941 {return __tree_.__insert_multi(_VSTD::forward<_Pp>(__p));}
Howard Hinnantc51e1022010-05-11 19:42:16 +00001942
Howard Hinnantc834c512011-11-29 18:15:50 +00001943 template <class _Pp,
1944 class = typename enable_if<is_constructible<value_type, _Pp>::value>::type>
Howard Hinnant756c69b2010-09-22 16:48:34 +00001945 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc834c512011-11-29 18:15:50 +00001946 iterator insert(const_iterator __pos, _Pp&& __p)
1947 {return __tree_.__insert_multi(__pos.__i_, _VSTD::forward<_Pp>(__p));}
Howard Hinnantc51e1022010-05-11 19:42:16 +00001948
Eric Fiselierd6143132016-04-18 01:40:45 +00001949 _LIBCPP_INLINE_VISIBILITY
1950 iterator insert(value_type&& __v)
1951 {return __tree_.__insert_multi(_VSTD::move(__v));}
1952
1953 _LIBCPP_INLINE_VISIBILITY
1954 iterator insert(const_iterator __p, value_type&& __v)
1955 {return __tree_.__insert_multi(__p.__i_, _VSTD::move(__v));}
1956
Eric Fiseliera85b1282017-04-18 21:08:06 +00001957
1958 _LIBCPP_INLINE_VISIBILITY
1959 void insert(initializer_list<value_type> __il)
1960 {insert(__il.begin(), __il.end());}
1961
Eric Fiselierd06276b2016-03-31 02:15:15 +00001962#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00001963
Howard Hinnant756c69b2010-09-22 16:48:34 +00001964 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001965 iterator insert(const value_type& __v) {return __tree_.__insert_multi(__v);}
1966
Howard Hinnant756c69b2010-09-22 16:48:34 +00001967 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001968 iterator insert(const_iterator __p, const value_type& __v)
1969 {return __tree_.__insert_multi(__p.__i_, __v);}
1970
1971 template <class _InputIterator>
Howard Hinnant756c69b2010-09-22 16:48:34 +00001972 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001973 void insert(_InputIterator __f, _InputIterator __l)
1974 {
1975 for (const_iterator __e = cend(); __f != __l; ++__f)
1976 __tree_.__insert_multi(__e.__i_, *__f);
1977 }
1978
Howard Hinnant756c69b2010-09-22 16:48:34 +00001979 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001980 iterator erase(const_iterator __p) {return __tree_.erase(__p.__i_);}
Howard Hinnant756c69b2010-09-22 16:48:34 +00001981 _LIBCPP_INLINE_VISIBILITY
Marshall Clow22ea5b82015-05-10 13:35:00 +00001982 iterator erase(iterator __p) {return __tree_.erase(__p.__i_);}
1983 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001984 size_type erase(const key_type& __k) {return __tree_.__erase_multi(__k);}
Howard Hinnant756c69b2010-09-22 16:48:34 +00001985 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001986 iterator erase(const_iterator __f, const_iterator __l)
1987 {return __tree_.erase(__f.__i_, __l.__i_);}
Erik Pilkingtonc37a3d82018-08-01 01:33:38 +00001988
1989#if _LIBCPP_STD_VER > 14
1990 _LIBCPP_INLINE_VISIBILITY
1991 iterator insert(node_type&& __nh)
1992 {
1993 _LIBCPP_ASSERT(__nh.empty() || __nh.get_allocator() == get_allocator(),
1994 "node_type with incompatible allocator passed to multimap::insert()");
1995 return __tree_.template __node_handle_insert_multi<node_type>(
1996 _VSTD::move(__nh));
1997 }
1998 _LIBCPP_INLINE_VISIBILITY
1999 iterator insert(const_iterator __hint, node_type&& __nh)
2000 {
2001 _LIBCPP_ASSERT(__nh.empty() || __nh.get_allocator() == get_allocator(),
2002 "node_type with incompatible allocator passed to multimap::insert()");
2003 return __tree_.template __node_handle_insert_multi<node_type>(
2004 __hint.__i_, _VSTD::move(__nh));
2005 }
2006 _LIBCPP_INLINE_VISIBILITY
2007 node_type extract(key_type const& __key)
2008 {
2009 return __tree_.template __node_handle_extract<node_type>(__key);
2010 }
2011 _LIBCPP_INLINE_VISIBILITY
2012 node_type extract(const_iterator __it)
2013 {
2014 return __tree_.template __node_handle_extract<node_type>(
2015 __it.__i_);
2016 }
Louis Dionned2322c82018-11-01 14:41:37 +00002017 template <class _Compare2>
Erik Pilkington82a65ad2018-10-31 17:31:35 +00002018 _LIBCPP_INLINE_VISIBILITY
Louis Dionned2322c82018-11-01 14:41:37 +00002019 void merge(multimap<key_type, mapped_type, _Compare2, allocator_type>& __source)
Erik Pilkington82a65ad2018-10-31 17:31:35 +00002020 {
2021 _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
2022 "merging container with incompatible allocator");
2023 return __tree_.__node_handle_merge_multi(__source.__tree_);
2024 }
Louis Dionned2322c82018-11-01 14:41:37 +00002025 template <class _Compare2>
Erik Pilkington82a65ad2018-10-31 17:31:35 +00002026 _LIBCPP_INLINE_VISIBILITY
Louis Dionned2322c82018-11-01 14:41:37 +00002027 void merge(multimap<key_type, mapped_type, _Compare2, allocator_type>&& __source)
Erik Pilkington82a65ad2018-10-31 17:31:35 +00002028 {
2029 _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
2030 "merging container with incompatible allocator");
2031 return __tree_.__node_handle_merge_multi(__source.__tree_);
2032 }
Louis Dionned2322c82018-11-01 14:41:37 +00002033 template <class _Compare2>
Erik Pilkington82a65ad2018-10-31 17:31:35 +00002034 _LIBCPP_INLINE_VISIBILITY
Louis Dionned2322c82018-11-01 14:41:37 +00002035 void merge(map<key_type, mapped_type, _Compare2, allocator_type>& __source)
Erik Pilkington82a65ad2018-10-31 17:31:35 +00002036 {
2037 _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
2038 "merging container with incompatible allocator");
2039 return __tree_.__node_handle_merge_multi(__source.__tree_);
2040 }
Louis Dionned2322c82018-11-01 14:41:37 +00002041 template <class _Compare2>
Erik Pilkington82a65ad2018-10-31 17:31:35 +00002042 _LIBCPP_INLINE_VISIBILITY
Louis Dionned2322c82018-11-01 14:41:37 +00002043 void merge(map<key_type, mapped_type, _Compare2, allocator_type>&& __source)
Erik Pilkington82a65ad2018-10-31 17:31:35 +00002044 {
2045 _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
2046 "merging container with incompatible allocator");
2047 return __tree_.__node_handle_merge_multi(__source.__tree_);
2048 }
Erik Pilkingtonc37a3d82018-08-01 01:33:38 +00002049#endif
2050
Howard Hinnant756c69b2010-09-22 16:48:34 +00002051 _LIBCPP_INLINE_VISIBILITY
Marshall Clowde1312a2018-08-22 04:28:43 +00002052 void clear() _NOEXCEPT {__tree_.clear();}
Howard Hinnantc51e1022010-05-11 19:42:16 +00002053
Howard Hinnant756c69b2010-09-22 16:48:34 +00002054 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00002055 void swap(multimap& __m)
2056 _NOEXCEPT_(__is_nothrow_swappable<__base>::value)
2057 {__tree_.swap(__m.__tree_);}
Howard Hinnantc51e1022010-05-11 19:42:16 +00002058
Howard Hinnant756c69b2010-09-22 16:48:34 +00002059 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002060 iterator find(const key_type& __k) {return __tree_.find(__k);}
Howard Hinnant756c69b2010-09-22 16:48:34 +00002061 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002062 const_iterator find(const key_type& __k) const {return __tree_.find(__k);}
Marshall Clowebb57322013-08-13 22:18:47 +00002063#if _LIBCPP_STD_VER > 11
2064 template <typename _K2>
2065 _LIBCPP_INLINE_VISIBILITY
2066 typename enable_if<__is_transparent<_Compare, _K2>::value,iterator>::type
2067 find(const _K2& __k) {return __tree_.find(__k);}
2068 template <typename _K2>
2069 _LIBCPP_INLINE_VISIBILITY
2070 typename enable_if<__is_transparent<_Compare, _K2>::value,const_iterator>::type
2071 find(const _K2& __k) const {return __tree_.find(__k);}
2072#endif
2073
Howard Hinnant756c69b2010-09-22 16:48:34 +00002074 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002075 size_type count(const key_type& __k) const
2076 {return __tree_.__count_multi(__k);}
Marshall Clowe6a5f522014-08-24 23:54:16 +00002077#if _LIBCPP_STD_VER > 11
2078 template <typename _K2>
2079 _LIBCPP_INLINE_VISIBILITY
2080 typename enable_if<__is_transparent<_Compare, _K2>::value,size_type>::type
Marshall Clow141e47b2015-06-30 18:15:41 +00002081 count(const _K2& __k) const {return __tree_.__count_multi(__k);}
Marshall Clowe6a5f522014-08-24 23:54:16 +00002082#endif
Zoe Carver3ffbab12019-07-16 03:21:01 +00002083
2084#if _LIBCPP_STD_VER > 17
2085 _LIBCPP_INLINE_VISIBILITY
2086 bool contains(const key_type& __k) const {return find(__k) != end();}
Marek Kurdejd7e019e2021-04-13 17:10:55 +02002087 template <typename _K2>
2088 _LIBCPP_INLINE_VISIBILITY
2089 typename enable_if<__is_transparent<_Compare, _K2>::value, bool>::type
2090 contains(const _K2& __k) const { return find(__k) != end(); }
Zoe Carver3ffbab12019-07-16 03:21:01 +00002091#endif // _LIBCPP_STD_VER > 17
2092
Howard Hinnant756c69b2010-09-22 16:48:34 +00002093 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002094 iterator lower_bound(const key_type& __k)
2095 {return __tree_.lower_bound(__k);}
Howard Hinnant756c69b2010-09-22 16:48:34 +00002096 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002097 const_iterator lower_bound(const key_type& __k) const
2098 {return __tree_.lower_bound(__k);}
Marshall Clowebb57322013-08-13 22:18:47 +00002099#if _LIBCPP_STD_VER > 11
2100 template <typename _K2>
2101 _LIBCPP_INLINE_VISIBILITY
2102 typename enable_if<__is_transparent<_Compare, _K2>::value,iterator>::type
2103 lower_bound(const _K2& __k) {return __tree_.lower_bound(__k);}
2104
2105 template <typename _K2>
2106 _LIBCPP_INLINE_VISIBILITY
2107 typename enable_if<__is_transparent<_Compare, _K2>::value,const_iterator>::type
2108 lower_bound(const _K2& __k) const {return __tree_.lower_bound(__k);}
2109#endif
2110
Howard Hinnant756c69b2010-09-22 16:48:34 +00002111 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002112 iterator upper_bound(const key_type& __k)
2113 {return __tree_.upper_bound(__k);}
Howard Hinnant756c69b2010-09-22 16:48:34 +00002114 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002115 const_iterator upper_bound(const key_type& __k) const
2116 {return __tree_.upper_bound(__k);}
Marshall Clowebb57322013-08-13 22:18:47 +00002117#if _LIBCPP_STD_VER > 11
2118 template <typename _K2>
2119 _LIBCPP_INLINE_VISIBILITY
2120 typename enable_if<__is_transparent<_Compare, _K2>::value,iterator>::type
2121 upper_bound(const _K2& __k) {return __tree_.upper_bound(__k);}
2122 template <typename _K2>
2123 _LIBCPP_INLINE_VISIBILITY
2124 typename enable_if<__is_transparent<_Compare, _K2>::value,const_iterator>::type
2125 upper_bound(const _K2& __k) const {return __tree_.upper_bound(__k);}
2126#endif
2127
Howard Hinnant756c69b2010-09-22 16:48:34 +00002128 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002129 pair<iterator,iterator> equal_range(const key_type& __k)
2130 {return __tree_.__equal_range_multi(__k);}
Howard Hinnant756c69b2010-09-22 16:48:34 +00002131 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002132 pair<const_iterator,const_iterator> equal_range(const key_type& __k) const
2133 {return __tree_.__equal_range_multi(__k);}
Marshall Clowebb57322013-08-13 22:18:47 +00002134#if _LIBCPP_STD_VER > 11
2135 template <typename _K2>
2136 _LIBCPP_INLINE_VISIBILITY
2137 typename enable_if<__is_transparent<_Compare, _K2>::value,pair<iterator,iterator>>::type
2138 equal_range(const _K2& __k) {return __tree_.__equal_range_multi(__k);}
2139 template <typename _K2>
2140 _LIBCPP_INLINE_VISIBILITY
2141 typename enable_if<__is_transparent<_Compare, _K2>::value,pair<const_iterator,const_iterator>>::type
2142 equal_range(const _K2& __k) const {return __tree_.__equal_range_multi(__k);}
2143#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00002144
2145private:
2146 typedef typename __base::__node __node;
2147 typedef typename __base::__node_allocator __node_allocator;
2148 typedef typename __base::__node_pointer __node_pointer;
Eric Fiseliera92b0732016-02-20 07:12:17 +00002149
Howard Hinnantc834c512011-11-29 18:15:50 +00002150 typedef __map_node_destructor<__node_allocator> _Dp;
2151 typedef unique_ptr<__node, _Dp> __node_holder;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002152};
2153
Louis Dionned23a5f22019-06-20 19:32:00 +00002154#ifndef _LIBCPP_HAS_NO_DEDUCTION_GUIDES
2155template<class _InputIterator, class _Compare = less<__iter_key_type<_InputIterator>>,
2156 class _Allocator = allocator<__iter_to_alloc_type<_InputIterator>>,
Louis Dionne6c7da9a2019-07-19 17:13:39 +00002157 class = _EnableIf<!__is_allocator<_Compare>::value, void>,
2158 class = _EnableIf<__is_allocator<_Allocator>::value, void>>
Louis Dionned23a5f22019-06-20 19:32:00 +00002159multimap(_InputIterator, _InputIterator, _Compare = _Compare(), _Allocator = _Allocator())
2160 -> multimap<__iter_key_type<_InputIterator>, __iter_mapped_type<_InputIterator>, _Compare, _Allocator>;
2161
2162template<class _Key, class _Tp, class _Compare = less<remove_const_t<_Key>>,
2163 class _Allocator = allocator<pair<const _Key, _Tp>>,
Louis Dionne6c7da9a2019-07-19 17:13:39 +00002164 class = _EnableIf<!__is_allocator<_Compare>::value, void>,
2165 class = _EnableIf<__is_allocator<_Allocator>::value, void>>
Louis Dionned23a5f22019-06-20 19:32:00 +00002166multimap(initializer_list<pair<_Key, _Tp>>, _Compare = _Compare(), _Allocator = _Allocator())
2167 -> multimap<remove_const_t<_Key>, _Tp, _Compare, _Allocator>;
2168
2169template<class _InputIterator, class _Allocator,
Louis Dionne6c7da9a2019-07-19 17:13:39 +00002170 class = _EnableIf<__is_allocator<_Allocator>::value, void>>
Louis Dionned23a5f22019-06-20 19:32:00 +00002171multimap(_InputIterator, _InputIterator, _Allocator)
2172 -> multimap<__iter_key_type<_InputIterator>, __iter_mapped_type<_InputIterator>,
2173 less<__iter_key_type<_InputIterator>>, _Allocator>;
2174
2175template<class _Key, class _Tp, class _Allocator,
Louis Dionne6c7da9a2019-07-19 17:13:39 +00002176 class = _EnableIf<__is_allocator<_Allocator>::value, void>>
Louis Dionned23a5f22019-06-20 19:32:00 +00002177multimap(initializer_list<pair<_Key, _Tp>>, _Allocator)
2178 -> multimap<remove_const_t<_Key>, _Tp, less<remove_const_t<_Key>>, _Allocator>;
2179#endif
2180
Eric Fiselierd06276b2016-03-31 02:15:15 +00002181#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00002182template <class _Key, class _Tp, class _Compare, class _Allocator>
2183multimap<_Key, _Tp, _Compare, _Allocator>::multimap(multimap&& __m, const allocator_type& __a)
Marshall Clow657cbc42016-08-17 05:58:40 +00002184 : __tree_(_VSTD::move(__m.__tree_), typename __base::allocator_type(__a))
Howard Hinnantc51e1022010-05-11 19:42:16 +00002185{
2186 if (__a != __m.get_allocator())
2187 {
2188 const_iterator __e = cend();
2189 while (!__m.empty())
2190 __tree_.__insert_multi(__e.__i_,
Erik Pilkingtond3fe2992018-06-04 20:38:23 +00002191 _VSTD::move(__m.__tree_.remove(__m.begin().__i_)->__value_.__move()));
Howard Hinnantc51e1022010-05-11 19:42:16 +00002192 }
2193}
Eric Fiselierd06276b2016-03-31 02:15:15 +00002194#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00002195
2196template <class _Key, class _Tp, class _Compare, class _Allocator>
Howard Hinnant756c69b2010-09-22 16:48:34 +00002197inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002198bool
2199operator==(const multimap<_Key, _Tp, _Compare, _Allocator>& __x,
2200 const multimap<_Key, _Tp, _Compare, _Allocator>& __y)
2201{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00002202 return __x.size() == __y.size() && _VSTD::equal(__x.begin(), __x.end(), __y.begin());
Howard Hinnantc51e1022010-05-11 19:42:16 +00002203}
2204
2205template <class _Key, class _Tp, class _Compare, class _Allocator>
Howard Hinnant756c69b2010-09-22 16:48:34 +00002206inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002207bool
2208operator< (const multimap<_Key, _Tp, _Compare, _Allocator>& __x,
2209 const multimap<_Key, _Tp, _Compare, _Allocator>& __y)
2210{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00002211 return _VSTD::lexicographical_compare(__x.begin(), __x.end(), __y.begin(), __y.end());
Howard Hinnantc51e1022010-05-11 19:42:16 +00002212}
2213
2214template <class _Key, class _Tp, class _Compare, class _Allocator>
Howard Hinnant756c69b2010-09-22 16:48:34 +00002215inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002216bool
2217operator!=(const multimap<_Key, _Tp, _Compare, _Allocator>& __x,
2218 const multimap<_Key, _Tp, _Compare, _Allocator>& __y)
2219{
2220 return !(__x == __y);
2221}
2222
2223template <class _Key, class _Tp, class _Compare, class _Allocator>
Howard Hinnant756c69b2010-09-22 16:48:34 +00002224inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002225bool
2226operator> (const multimap<_Key, _Tp, _Compare, _Allocator>& __x,
2227 const multimap<_Key, _Tp, _Compare, _Allocator>& __y)
2228{
2229 return __y < __x;
2230}
2231
2232template <class _Key, class _Tp, class _Compare, class _Allocator>
Howard Hinnant756c69b2010-09-22 16:48:34 +00002233inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002234bool
2235operator>=(const multimap<_Key, _Tp, _Compare, _Allocator>& __x,
2236 const multimap<_Key, _Tp, _Compare, _Allocator>& __y)
2237{
2238 return !(__x < __y);
2239}
2240
2241template <class _Key, class _Tp, class _Compare, class _Allocator>
Howard Hinnant756c69b2010-09-22 16:48:34 +00002242inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002243bool
2244operator<=(const multimap<_Key, _Tp, _Compare, _Allocator>& __x,
2245 const multimap<_Key, _Tp, _Compare, _Allocator>& __y)
2246{
2247 return !(__y < __x);
2248}
2249
2250template <class _Key, class _Tp, class _Compare, class _Allocator>
Howard Hinnant756c69b2010-09-22 16:48:34 +00002251inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002252void
2253swap(multimap<_Key, _Tp, _Compare, _Allocator>& __x,
2254 multimap<_Key, _Tp, _Compare, _Allocator>& __y)
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00002255 _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
Howard Hinnantc51e1022010-05-11 19:42:16 +00002256{
2257 __x.swap(__y);
2258}
2259
Marshall Clow29b53f22018-12-14 18:49:35 +00002260#if _LIBCPP_STD_VER > 17
Marek Kurdeja98b1412020-05-02 13:58:03 +02002261template <class _Key, class _Tp, class _Compare, class _Allocator,
2262 class _Predicate>
Marshall Clow29b53f22018-12-14 18:49:35 +00002263inline _LIBCPP_INLINE_VISIBILITY
Marek Kurdeja98b1412020-05-02 13:58:03 +02002264 typename multimap<_Key, _Tp, _Compare, _Allocator>::size_type
2265 erase_if(multimap<_Key, _Tp, _Compare, _Allocator>& __c,
2266 _Predicate __pred) {
Arthur O'Dwyerb6738bd2021-03-21 16:53:09 -04002267 return _VSTD::__libcpp_erase_if_container(__c, __pred);
Marek Kurdeja98b1412020-05-02 13:58:03 +02002268}
Marshall Clow29b53f22018-12-14 18:49:35 +00002269#endif
2270
Howard Hinnantc51e1022010-05-11 19:42:16 +00002271_LIBCPP_END_NAMESPACE_STD
2272
2273#endif // _LIBCPP_MAP