blob: 6805a513394a3f58f5d86fcf9f7ea98a7dc893a9 [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
194 template<typename K>
Marshall Clowe6a5f522014-08-24 23:54:16 +0000195 size_type count(const K& x) const; // C++14
Marshall Clowebb57322013-08-13 22:18:47 +0000196
Howard Hinnantc51e1022010-05-11 19:42:16 +0000197 size_type count(const key_type& k) const;
198 iterator lower_bound(const key_type& k);
199 const_iterator lower_bound(const key_type& k) const;
Marshall Clowebb57322013-08-13 22:18:47 +0000200 template<typename K>
201 iterator lower_bound(const K& x); // C++14
202 template<typename K>
203 const_iterator lower_bound(const K& x) const; // C++14
204
Howard Hinnantc51e1022010-05-11 19:42:16 +0000205 iterator upper_bound(const key_type& k);
206 const_iterator upper_bound(const key_type& k) const;
Marshall Clowebb57322013-08-13 22:18:47 +0000207 template<typename K>
208 iterator upper_bound(const K& x); // C++14
209 template<typename K>
210 const_iterator upper_bound(const K& x) const; // C++14
211
Howard Hinnantc51e1022010-05-11 19:42:16 +0000212 pair<iterator,iterator> equal_range(const key_type& k);
213 pair<const_iterator,const_iterator> equal_range(const key_type& k) const;
Marshall Clowebb57322013-08-13 22:18:47 +0000214 template<typename K>
215 pair<iterator,iterator> equal_range(const K& x); // C++14
216 template<typename K>
217 pair<const_iterator,const_iterator> equal_range(const K& x) const; // C++14
Howard Hinnantc51e1022010-05-11 19:42:16 +0000218};
219
220template <class Key, class T, class Compare, class Allocator>
221bool
222operator==(const map<Key, T, Compare, Allocator>& x,
223 const map<Key, T, Compare, Allocator>& y);
224
225template <class Key, class T, class Compare, class Allocator>
226bool
227operator< (const map<Key, T, Compare, Allocator>& x,
228 const map<Key, T, Compare, Allocator>& y);
229
230template <class Key, class T, class Compare, class Allocator>
231bool
232operator!=(const map<Key, T, Compare, Allocator>& x,
233 const map<Key, T, Compare, Allocator>& y);
234
235template <class Key, class T, class Compare, class Allocator>
236bool
237operator> (const map<Key, T, Compare, Allocator>& x,
238 const map<Key, T, Compare, Allocator>& y);
239
240template <class Key, class T, class Compare, class Allocator>
241bool
242operator>=(const map<Key, T, Compare, Allocator>& x,
243 const map<Key, T, Compare, Allocator>& y);
244
245template <class Key, class T, class Compare, class Allocator>
246bool
247operator<=(const map<Key, T, Compare, Allocator>& x,
248 const map<Key, T, Compare, Allocator>& y);
249
250// specialized algorithms:
251template <class Key, class T, class Compare, class Allocator>
252void
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +0000253swap(map<Key, T, Compare, Allocator>& x, map<Key, T, Compare, Allocator>& y)
254 noexcept(noexcept(x.swap(y)));
Howard Hinnantc51e1022010-05-11 19:42:16 +0000255
Marshall Clow29b53f22018-12-14 18:49:35 +0000256template <class Key, class T, class Compare, class Allocator, class Predicate>
257 void erase_if(map<Key, T, Compare, Allocator>& c, Predicate pred); // C++20
258
259
Howard Hinnantc51e1022010-05-11 19:42:16 +0000260template <class Key, class T, class Compare = less<Key>,
261 class Allocator = allocator<pair<const Key, T>>>
262class multimap
263{
264public:
265 // types:
266 typedef Key key_type;
267 typedef T mapped_type;
268 typedef pair<const key_type,mapped_type> value_type;
269 typedef Compare key_compare;
270 typedef Allocator allocator_type;
271 typedef typename allocator_type::reference reference;
272 typedef typename allocator_type::const_reference const_reference;
273 typedef typename allocator_type::size_type size_type;
274 typedef typename allocator_type::difference_type difference_type;
275 typedef typename allocator_type::pointer pointer;
276 typedef typename allocator_type::const_pointer const_pointer;
277
278 typedef implementation-defined iterator;
279 typedef implementation-defined const_iterator;
280 typedef std::reverse_iterator<iterator> reverse_iterator;
281 typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
Erik Pilkingtonc37a3d82018-08-01 01:33:38 +0000282 typedef unspecified node_type; // C++17
Howard Hinnantc51e1022010-05-11 19:42:16 +0000283
284 class value_compare
285 : public binary_function<value_type,value_type,bool>
286 {
287 friend class multimap;
288 protected:
289 key_compare comp;
290 value_compare(key_compare c);
291 public:
292 bool operator()(const value_type& x, const value_type& y) const;
293 };
294
295 // construct/copy/destroy:
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +0000296 multimap()
297 noexcept(
298 is_nothrow_default_constructible<allocator_type>::value &&
299 is_nothrow_default_constructible<key_compare>::value &&
300 is_nothrow_copy_constructible<key_compare>::value);
301 explicit multimap(const key_compare& comp);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000302 multimap(const key_compare& comp, const allocator_type& a);
303 template <class InputIterator>
304 multimap(InputIterator first, InputIterator last, const key_compare& comp);
305 template <class InputIterator>
306 multimap(InputIterator first, InputIterator last, const key_compare& comp,
307 const allocator_type& a);
308 multimap(const multimap& m);
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +0000309 multimap(multimap&& m)
310 noexcept(
311 is_nothrow_move_constructible<allocator_type>::value &&
312 is_nothrow_move_constructible<key_compare>::value);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000313 explicit multimap(const allocator_type& a);
314 multimap(const multimap& m, const allocator_type& a);
315 multimap(multimap&& m, const allocator_type& a);
316 multimap(initializer_list<value_type> il, const key_compare& comp = key_compare());
317 multimap(initializer_list<value_type> il, const key_compare& comp,
318 const allocator_type& a);
Marshall Clow300abfb2013-09-11 01:15:47 +0000319 template <class InputIterator>
320 multimap(InputIterator first, InputIterator last, const allocator_type& a)
321 : multimap(first, last, Compare(), a) {} // C++14
322 multimap(initializer_list<value_type> il, const allocator_type& a)
323 : multimap(il, Compare(), a) {} // C++14
Howard Hinnantc51e1022010-05-11 19:42:16 +0000324 ~multimap();
325
326 multimap& operator=(const multimap& m);
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +0000327 multimap& operator=(multimap&& m)
328 noexcept(
329 allocator_type::propagate_on_container_move_assignment::value &&
330 is_nothrow_move_assignable<allocator_type>::value &&
Howard Hinnantf95f4f52011-06-04 15:22:34 +0000331 is_nothrow_move_assignable<key_compare>::value);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000332 multimap& operator=(initializer_list<value_type> il);
333
334 // iterators:
Howard Hinnantf95f4f52011-06-04 15:22:34 +0000335 iterator begin() noexcept;
336 const_iterator begin() const noexcept;
337 iterator end() noexcept;
338 const_iterator end() const noexcept;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000339
Howard Hinnantf95f4f52011-06-04 15:22:34 +0000340 reverse_iterator rbegin() noexcept;
341 const_reverse_iterator rbegin() const noexcept;
342 reverse_iterator rend() noexcept;
343 const_reverse_iterator rend() const noexcept;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000344
Howard Hinnantf95f4f52011-06-04 15:22:34 +0000345 const_iterator cbegin() const noexcept;
346 const_iterator cend() const noexcept;
347 const_reverse_iterator crbegin() const noexcept;
348 const_reverse_iterator crend() const noexcept;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000349
350 // capacity:
Howard Hinnantf95f4f52011-06-04 15:22:34 +0000351 bool empty() const noexcept;
352 size_type size() const noexcept;
353 size_type max_size() const noexcept;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000354
355 // modifiers:
356 template <class... Args>
357 iterator emplace(Args&&... args);
358 template <class... Args>
359 iterator emplace_hint(const_iterator position, Args&&... args);
360 iterator insert(const value_type& v);
Marshall Clowd430d022016-01-05 19:32:41 +0000361 iterator insert( value_type&& v); // C++17
Howard Hinnantc51e1022010-05-11 19:42:16 +0000362 template <class P>
363 iterator insert(P&& p);
364 iterator insert(const_iterator position, const value_type& v);
Marshall Clowd430d022016-01-05 19:32:41 +0000365 iterator insert(const_iterator position, value_type&& v); // C++17
Howard Hinnantc51e1022010-05-11 19:42:16 +0000366 template <class P>
367 iterator insert(const_iterator position, P&& p);
368 template <class InputIterator>
369 void insert(InputIterator first, InputIterator last);
370 void insert(initializer_list<value_type> il);
371
Erik Pilkingtonc37a3d82018-08-01 01:33:38 +0000372 node_type extract(const_iterator position); // C++17
373 node_type extract(const key_type& x); // C++17
374 iterator insert(node_type&& nh); // C++17
375 iterator insert(const_iterator hint, node_type&& nh); // C++17
376
Howard Hinnantc51e1022010-05-11 19:42:16 +0000377 iterator erase(const_iterator position);
Marshall Clow22ea5b82015-05-10 13:35:00 +0000378 iterator erase(iterator position); // C++14
Howard Hinnantc51e1022010-05-11 19:42:16 +0000379 size_type erase(const key_type& k);
380 iterator erase(const_iterator first, const_iterator last);
Howard Hinnantf95f4f52011-06-04 15:22:34 +0000381 void clear() noexcept;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000382
Erik Pilkington82a65ad2018-10-31 17:31:35 +0000383 template<class C2>
384 void merge(multimap<Key, T, C2, Allocator>& source); // C++17
385 template<class C2>
386 void merge(multimap<Key, T, C2, Allocator>&& source); // C++17
387 template<class C2>
388 void merge(map<Key, T, C2, Allocator>& source); // C++17
389 template<class C2>
390 void merge(map<Key, T, C2, Allocator>&& source); // C++17
391
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +0000392 void swap(multimap& m)
Marshall Clow8982dcd2015-07-13 20:04:56 +0000393 noexcept(allocator_traits<allocator_type>::is_always_equal::value &&
Eric Fiselier6bfed252016-04-21 23:38:59 +0000394 is_nothrow_swappable<key_compare>::value); // C++17
Howard Hinnantc51e1022010-05-11 19:42:16 +0000395
396 // observers:
Howard Hinnantf95f4f52011-06-04 15:22:34 +0000397 allocator_type get_allocator() const noexcept;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000398 key_compare key_comp() const;
399 value_compare value_comp() const;
400
401 // map operations:
402 iterator find(const key_type& k);
403 const_iterator find(const key_type& k) const;
Marshall Clowebb57322013-08-13 22:18:47 +0000404 template<typename K>
405 iterator find(const K& x); // C++14
406 template<typename K>
407 const_iterator find(const K& x) const; // C++14
408 template<typename K>
Marshall Clowe6a5f522014-08-24 23:54:16 +0000409 size_type count(const K& x) const; // C++14
Marshall Clowebb57322013-08-13 22:18:47 +0000410
Howard Hinnantc51e1022010-05-11 19:42:16 +0000411 size_type count(const key_type& k) const;
412 iterator lower_bound(const key_type& k);
413 const_iterator lower_bound(const key_type& k) const;
Marshall Clowebb57322013-08-13 22:18:47 +0000414 template<typename K>
415 iterator lower_bound(const K& x); // C++14
416 template<typename K>
417 const_iterator lower_bound(const K& x) const; // C++14
418
Howard Hinnantc51e1022010-05-11 19:42:16 +0000419 iterator upper_bound(const key_type& k);
420 const_iterator upper_bound(const key_type& k) const;
Marshall Clowebb57322013-08-13 22:18:47 +0000421 template<typename K>
422 iterator upper_bound(const K& x); // C++14
423 template<typename K>
424 const_iterator upper_bound(const K& x) const; // C++14
425
Howard Hinnantc51e1022010-05-11 19:42:16 +0000426 pair<iterator,iterator> equal_range(const key_type& k);
427 pair<const_iterator,const_iterator> equal_range(const key_type& k) const;
Marshall Clowebb57322013-08-13 22:18:47 +0000428 template<typename K>
429 pair<iterator,iterator> equal_range(const K& x); // C++14
430 template<typename K>
431 pair<const_iterator,const_iterator> equal_range(const K& x) const; // C++14
Howard Hinnantc51e1022010-05-11 19:42:16 +0000432};
433
434template <class Key, class T, class Compare, class Allocator>
435bool
436operator==(const multimap<Key, T, Compare, Allocator>& x,
437 const multimap<Key, T, Compare, Allocator>& y);
438
439template <class Key, class T, class Compare, class Allocator>
440bool
441operator< (const multimap<Key, T, Compare, Allocator>& x,
442 const multimap<Key, T, Compare, Allocator>& y);
443
444template <class Key, class T, class Compare, class Allocator>
445bool
446operator!=(const multimap<Key, T, Compare, Allocator>& x,
447 const multimap<Key, T, Compare, Allocator>& y);
448
449template <class Key, class T, class Compare, class Allocator>
450bool
451operator> (const multimap<Key, T, Compare, Allocator>& x,
452 const multimap<Key, T, Compare, Allocator>& y);
453
454template <class Key, class T, class Compare, class Allocator>
455bool
456operator>=(const multimap<Key, T, Compare, Allocator>& x,
457 const multimap<Key, T, Compare, Allocator>& y);
458
459template <class Key, class T, class Compare, class Allocator>
460bool
461operator<=(const multimap<Key, T, Compare, Allocator>& x,
462 const multimap<Key, T, Compare, Allocator>& y);
463
464// specialized algorithms:
465template <class Key, class T, class Compare, class Allocator>
466void
467swap(multimap<Key, T, Compare, Allocator>& x,
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +0000468 multimap<Key, T, Compare, Allocator>& y)
469 noexcept(noexcept(x.swap(y)));
Howard Hinnantc51e1022010-05-11 19:42:16 +0000470
Marshall Clow29b53f22018-12-14 18:49:35 +0000471template <class Key, class T, class Compare, class Allocator, class Predicate>
472 void erase_if(multimap<Key, T, Compare, Allocator>& c, Predicate pred); // C++20
473
Howard Hinnantc51e1022010-05-11 19:42:16 +0000474} // std
475
476*/
477
478#include <__config>
479#include <__tree>
Erik Pilkingtonc37a3d82018-08-01 01:33:38 +0000480#include <__node_handle>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000481#include <iterator>
482#include <memory>
483#include <utility>
484#include <functional>
485#include <initializer_list>
Eric Fiselierf7394302015-06-13 07:08:02 +0000486#include <type_traits>
Marshall Clow0a1e7502018-09-12 19:41:40 +0000487#include <version>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000488
Howard Hinnantaaaa52b2011-10-17 20:05:10 +0000489#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000490#pragma GCC system_header
Howard Hinnantaaaa52b2011-10-17 20:05:10 +0000491#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +0000492
493_LIBCPP_BEGIN_NAMESPACE_STD
494
Louis Dionne878a3a82018-12-06 21:46:17 +0000495template <class _Key, class _CP, class _Compare,
496 bool = is_empty<_Compare>::value && !__libcpp_is_final<_Compare>::value>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000497class __map_value_compare
498 : private _Compare
499{
Howard Hinnantc51e1022010-05-11 19:42:16 +0000500public:
Howard Hinnant756c69b2010-09-22 16:48:34 +0000501 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +0000502 __map_value_compare()
503 _NOEXCEPT_(is_nothrow_default_constructible<_Compare>::value)
504 : _Compare() {}
Howard Hinnant756c69b2010-09-22 16:48:34 +0000505 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +0000506 __map_value_compare(_Compare c)
507 _NOEXCEPT_(is_nothrow_copy_constructible<_Compare>::value)
508 : _Compare(c) {}
Howard Hinnant756c69b2010-09-22 16:48:34 +0000509 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +0000510 const _Compare& key_comp() const _NOEXCEPT {return *this;}
Howard Hinnant756c69b2010-09-22 16:48:34 +0000511 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000512 bool operator()(const _CP& __x, const _CP& __y) const
Erik Pilkingtond3fe2992018-06-04 20:38:23 +0000513 {return static_cast<const _Compare&>(*this)(__x.__get_value().first, __y.__get_value().first);}
Howard Hinnant756c69b2010-09-22 16:48:34 +0000514 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000515 bool operator()(const _CP& __x, const _Key& __y) const
Erik Pilkingtond3fe2992018-06-04 20:38:23 +0000516 {return static_cast<const _Compare&>(*this)(__x.__get_value().first, __y);}
Howard Hinnant756c69b2010-09-22 16:48:34 +0000517 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000518 bool operator()(const _Key& __x, const _CP& __y) const
Erik Pilkingtond3fe2992018-06-04 20:38:23 +0000519 {return static_cast<const _Compare&>(*this)(__x, __y.__get_value().first);}
Marshall Clow8982dcd2015-07-13 20:04:56 +0000520 void swap(__map_value_compare&__y)
521 _NOEXCEPT_(__is_nothrow_swappable<_Compare>::value)
522 {
Eric Fiselier68b5f0b2017-04-13 00:34:24 +0000523 using _VSTD::swap;
524 swap(static_cast<_Compare&>(*this), static_cast<_Compare&>(__y));
Marshall Clow8982dcd2015-07-13 20:04:56 +0000525 }
Marshall Clowebb57322013-08-13 22:18:47 +0000526
527#if _LIBCPP_STD_VER > 11
528 template <typename _K2>
529 _LIBCPP_INLINE_VISIBILITY
530 typename enable_if<__is_transparent<_Compare, _K2>::value, bool>::type
531 operator () ( const _K2& __x, const _CP& __y ) const
Erik Pilkingtond3fe2992018-06-04 20:38:23 +0000532 {return static_cast<const _Compare&>(*this) (__x, __y.__get_value().first);}
Marshall Clowebb57322013-08-13 22:18:47 +0000533
534 template <typename _K2>
535 _LIBCPP_INLINE_VISIBILITY
536 typename enable_if<__is_transparent<_Compare, _K2>::value, bool>::type
537 operator () (const _CP& __x, const _K2& __y) const
Erik Pilkingtond3fe2992018-06-04 20:38:23 +0000538 {return static_cast<const _Compare&>(*this) (__x.__get_value().first, __y);}
Marshall Clowebb57322013-08-13 22:18:47 +0000539#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +0000540};
541
Howard Hinnant90b91592013-07-05 18:06:00 +0000542template <class _Key, class _CP, class _Compare>
543class __map_value_compare<_Key, _CP, _Compare, false>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000544{
545 _Compare comp;
546
Howard Hinnantc51e1022010-05-11 19:42:16 +0000547public:
Howard Hinnant756c69b2010-09-22 16:48:34 +0000548 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +0000549 __map_value_compare()
550 _NOEXCEPT_(is_nothrow_default_constructible<_Compare>::value)
551 : comp() {}
Howard Hinnant756c69b2010-09-22 16:48:34 +0000552 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +0000553 __map_value_compare(_Compare c)
554 _NOEXCEPT_(is_nothrow_copy_constructible<_Compare>::value)
555 : comp(c) {}
Howard Hinnant756c69b2010-09-22 16:48:34 +0000556 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +0000557 const _Compare& key_comp() const _NOEXCEPT {return comp;}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000558
Howard Hinnant756c69b2010-09-22 16:48:34 +0000559 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000560 bool operator()(const _CP& __x, const _CP& __y) const
Erik Pilkingtond3fe2992018-06-04 20:38:23 +0000561 {return comp(__x.__get_value().first, __y.__get_value().first);}
Howard Hinnant756c69b2010-09-22 16:48:34 +0000562 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000563 bool operator()(const _CP& __x, const _Key& __y) const
Erik Pilkingtond3fe2992018-06-04 20:38:23 +0000564 {return comp(__x.__get_value().first, __y);}
Howard Hinnant756c69b2010-09-22 16:48:34 +0000565 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000566 bool operator()(const _Key& __x, const _CP& __y) const
Erik Pilkingtond3fe2992018-06-04 20:38:23 +0000567 {return comp(__x, __y.__get_value().first);}
Marshall Clow8982dcd2015-07-13 20:04:56 +0000568 void swap(__map_value_compare&__y)
569 _NOEXCEPT_(__is_nothrow_swappable<_Compare>::value)
570 {
571 using _VSTD::swap;
572 swap(comp, __y.comp);
573 }
Eric Fiseliercf8c0212017-01-05 06:06:18 +0000574
Marshall Clowebb57322013-08-13 22:18:47 +0000575#if _LIBCPP_STD_VER > 11
576 template <typename _K2>
577 _LIBCPP_INLINE_VISIBILITY
578 typename enable_if<__is_transparent<_Compare, _K2>::value, bool>::type
579 operator () ( const _K2& __x, const _CP& __y ) const
Erik Pilkingtond3fe2992018-06-04 20:38:23 +0000580 {return comp (__x, __y.__get_value().first);}
Marshall Clowebb57322013-08-13 22:18:47 +0000581
582 template <typename _K2>
583 _LIBCPP_INLINE_VISIBILITY
584 typename enable_if<__is_transparent<_Compare, _K2>::value, bool>::type
585 operator () (const _CP& __x, const _K2& __y) const
Erik Pilkingtond3fe2992018-06-04 20:38:23 +0000586 {return comp (__x.__get_value().first, __y);}
Marshall Clowebb57322013-08-13 22:18:47 +0000587#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +0000588};
589
Marshall Clow8982dcd2015-07-13 20:04:56 +0000590template <class _Key, class _CP, class _Compare, bool __b>
591inline _LIBCPP_INLINE_VISIBILITY
592void
593swap(__map_value_compare<_Key, _CP, _Compare, __b>& __x,
594 __map_value_compare<_Key, _CP, _Compare, __b>& __y)
595 _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
596{
597 __x.swap(__y);
598}
599
Howard Hinnantc51e1022010-05-11 19:42:16 +0000600template <class _Allocator>
601class __map_node_destructor
602{
603 typedef _Allocator allocator_type;
604 typedef allocator_traits<allocator_type> __alloc_traits;
Eric Fiseliera00b4842016-02-20 05:28:30 +0000605
Howard Hinnantc51e1022010-05-11 19:42:16 +0000606public:
607 typedef typename __alloc_traits::pointer pointer;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000608
Eric Fiseliera00b4842016-02-20 05:28:30 +0000609private:
Howard Hinnantc51e1022010-05-11 19:42:16 +0000610 allocator_type& __na_;
611
612 __map_node_destructor& operator=(const __map_node_destructor&);
613
614public:
615 bool __first_constructed;
616 bool __second_constructed;
617
Howard Hinnant756c69b2010-09-22 16:48:34 +0000618 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +0000619 explicit __map_node_destructor(allocator_type& __na) _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +0000620 : __na_(__na),
621 __first_constructed(false),
622 __second_constructed(false)
623 {}
624
Eric Fiseliera85b1282017-04-18 21:08:06 +0000625#ifndef _LIBCPP_CXX03_LANG
Howard Hinnant756c69b2010-09-22 16:48:34 +0000626 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +0000627 __map_node_destructor(__tree_node_destructor<allocator_type>&& __x) _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +0000628 : __na_(__x.__na_),
629 __first_constructed(__x.__value_constructed),
630 __second_constructed(__x.__value_constructed)
631 {
632 __x.__value_constructed = false;
633 }
Eric Fiseliera85b1282017-04-18 21:08:06 +0000634#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +0000635
Howard Hinnant756c69b2010-09-22 16:48:34 +0000636 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +0000637 void operator()(pointer __p) _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +0000638 {
639 if (__second_constructed)
Erik Pilkingtond3fe2992018-06-04 20:38:23 +0000640 __alloc_traits::destroy(__na_, _VSTD::addressof(__p->__value_.__get_value().second));
Howard Hinnantc51e1022010-05-11 19:42:16 +0000641 if (__first_constructed)
Erik Pilkingtond3fe2992018-06-04 20:38:23 +0000642 __alloc_traits::destroy(__na_, _VSTD::addressof(__p->__value_.__get_value().first));
Howard Hinnantc51e1022010-05-11 19:42:16 +0000643 if (__p)
644 __alloc_traits::deallocate(__na_, __p, 1);
645 }
646};
647
Howard Hinnant944510a2011-06-14 19:58:17 +0000648template <class _Key, class _Tp, class _Compare, class _Allocator>
649 class map;
650template <class _Key, class _Tp, class _Compare, class _Allocator>
651 class multimap;
652template <class _TreeIterator> class __map_const_iterator;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000653
Eric Fiseliera00b4842016-02-20 05:28:30 +0000654#ifndef _LIBCPP_CXX03_LANG
Howard Hinnant89f8b792013-09-30 19:08:22 +0000655
656template <class _Key, class _Tp>
Erik Pilkingtond3fe2992018-06-04 20:38:23 +0000657struct __value_type
Howard Hinnant89f8b792013-09-30 19:08:22 +0000658{
659 typedef _Key key_type;
660 typedef _Tp mapped_type;
661 typedef pair<const key_type, mapped_type> value_type;
Erik Pilkingtond3fe2992018-06-04 20:38:23 +0000662 typedef pair<key_type&, mapped_type&> __nc_ref_pair_type;
663 typedef pair<key_type&&, mapped_type&&> __nc_rref_pair_type;
Howard Hinnant89f8b792013-09-30 19:08:22 +0000664
Erik Pilkingtond3fe2992018-06-04 20:38:23 +0000665private:
Howard Hinnant89f8b792013-09-30 19:08:22 +0000666 value_type __cc;
Erik Pilkingtond3fe2992018-06-04 20:38:23 +0000667
668public:
669 _LIBCPP_INLINE_VISIBILITY
670 value_type& __get_value()
671 {
672#if _LIBCPP_STD_VER > 14
673 return *_VSTD::launder(_VSTD::addressof(__cc));
674#else
675 return __cc;
676#endif
677 }
678
679 _LIBCPP_INLINE_VISIBILITY
680 const value_type& __get_value() const
681 {
682#if _LIBCPP_STD_VER > 14
683 return *_VSTD::launder(_VSTD::addressof(__cc));
684#else
685 return __cc;
686#endif
687 }
688
689 _LIBCPP_INLINE_VISIBILITY
690 __nc_ref_pair_type __ref()
691 {
692 value_type& __v = __get_value();
693 return __nc_ref_pair_type(const_cast<key_type&>(__v.first), __v.second);
694 }
695
696 _LIBCPP_INLINE_VISIBILITY
697 __nc_rref_pair_type __move()
698 {
699 value_type& __v = __get_value();
700 return __nc_rref_pair_type(
701 _VSTD::move(const_cast<key_type&>(__v.first)),
702 _VSTD::move(__v.second));
703 }
Howard Hinnant89f8b792013-09-30 19:08:22 +0000704
Howard Hinnant89f8b792013-09-30 19:08:22 +0000705 _LIBCPP_INLINE_VISIBILITY
706 __value_type& operator=(const __value_type& __v)
Erik Pilkingtond3fe2992018-06-04 20:38:23 +0000707 {
708 __ref() = __v.__get_value();
709 return *this;
710 }
Howard Hinnant89f8b792013-09-30 19:08:22 +0000711
712 _LIBCPP_INLINE_VISIBILITY
713 __value_type& operator=(__value_type&& __v)
Erik Pilkingtond3fe2992018-06-04 20:38:23 +0000714 {
715 __ref() = __v.__move();
716 return *this;
717 }
Howard Hinnant89f8b792013-09-30 19:08:22 +0000718
Eric Fiselierd06276b2016-03-31 02:15:15 +0000719 template <class _ValueTp,
720 class = typename enable_if<
721 __is_same_uncvref<_ValueTp, value_type>::value
722 >::type
723 >
Howard Hinnant89f8b792013-09-30 19:08:22 +0000724 _LIBCPP_INLINE_VISIBILITY
Erik Pilkingtond3fe2992018-06-04 20:38:23 +0000725 __value_type& operator=(_ValueTp&& __v)
726 {
727 __ref() = _VSTD::forward<_ValueTp>(__v);
728 return *this;
Eric Fiselierd06276b2016-03-31 02:15:15 +0000729 }
730
731private:
732 __value_type() _LIBCPP_EQUAL_DELETE;
733 ~__value_type() _LIBCPP_EQUAL_DELETE;
734 __value_type(const __value_type& __v) _LIBCPP_EQUAL_DELETE;
735 __value_type(__value_type&& __v) _LIBCPP_EQUAL_DELETE;
Howard Hinnant89f8b792013-09-30 19:08:22 +0000736};
737
738#else
739
740template <class _Key, class _Tp>
741struct __value_type
742{
743 typedef _Key key_type;
744 typedef _Tp mapped_type;
745 typedef pair<const key_type, mapped_type> value_type;
746
Erik Pilkingtond3fe2992018-06-04 20:38:23 +0000747private:
Howard Hinnant89f8b792013-09-30 19:08:22 +0000748 value_type __cc;
749
Erik Pilkingtond3fe2992018-06-04 20:38:23 +0000750public:
751 _LIBCPP_INLINE_VISIBILITY
752 value_type& __get_value() { return __cc; }
753 _LIBCPP_INLINE_VISIBILITY
754 const value_type& __get_value() const { return __cc; }
755
Eric Fiselierd06276b2016-03-31 02:15:15 +0000756private:
757 __value_type();
758 __value_type(__value_type const&);
759 __value_type& operator=(__value_type const&);
760 ~__value_type();
Howard Hinnant89f8b792013-09-30 19:08:22 +0000761};
762
Eric Fiseliera85b1282017-04-18 21:08:06 +0000763#endif // _LIBCPP_CXX03_LANG
Howard Hinnant89f8b792013-09-30 19:08:22 +0000764
Eric Fiselier44f9fd02015-03-03 20:10:01 +0000765template <class _Tp>
766struct __extract_key_value_types;
767
768template <class _Key, class _Tp>
769struct __extract_key_value_types<__value_type<_Key, _Tp> >
770{
771 typedef _Key const __key_type;
772 typedef _Tp __mapped_type;
773};
774
Howard Hinnantc51e1022010-05-11 19:42:16 +0000775template <class _TreeIterator>
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000776class _LIBCPP_TEMPLATE_VIS __map_iterator
Howard Hinnantc51e1022010-05-11 19:42:16 +0000777{
Eric Fiseliera00b4842016-02-20 05:28:30 +0000778 typedef typename _TreeIterator::_NodeTypes _NodeTypes;
779 typedef typename _TreeIterator::__pointer_traits __pointer_traits;
780
Howard Hinnantc51e1022010-05-11 19:42:16 +0000781 _TreeIterator __i_;
782
Howard Hinnantc51e1022010-05-11 19:42:16 +0000783public:
784 typedef bidirectional_iterator_tag iterator_category;
Eric Fiseliera00b4842016-02-20 05:28:30 +0000785 typedef typename _NodeTypes::__map_value_type value_type;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000786 typedef typename _TreeIterator::difference_type difference_type;
787 typedef value_type& reference;
Eric Fiseliera00b4842016-02-20 05:28:30 +0000788 typedef typename _NodeTypes::__map_value_type_pointer pointer;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000789
Howard Hinnant756c69b2010-09-22 16:48:34 +0000790 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +0000791 __map_iterator() _NOEXCEPT {}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000792
Howard Hinnant756c69b2010-09-22 16:48:34 +0000793 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +0000794 __map_iterator(_TreeIterator __i) _NOEXCEPT : __i_(__i) {}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000795
Howard Hinnant756c69b2010-09-22 16:48:34 +0000796 _LIBCPP_INLINE_VISIBILITY
Erik Pilkingtond3fe2992018-06-04 20:38:23 +0000797 reference operator*() const {return __i_->__get_value();}
Howard Hinnant756c69b2010-09-22 16:48:34 +0000798 _LIBCPP_INLINE_VISIBILITY
Erik Pilkingtond3fe2992018-06-04 20:38:23 +0000799 pointer operator->() const {return pointer_traits<pointer>::pointer_to(__i_->__get_value());}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000800
Howard Hinnant756c69b2010-09-22 16:48:34 +0000801 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000802 __map_iterator& operator++() {++__i_; return *this;}
Howard Hinnant756c69b2010-09-22 16:48:34 +0000803 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000804 __map_iterator operator++(int)
805 {
806 __map_iterator __t(*this);
807 ++(*this);
808 return __t;
809 }
810
Howard Hinnant756c69b2010-09-22 16:48:34 +0000811 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000812 __map_iterator& operator--() {--__i_; return *this;}
Howard Hinnant756c69b2010-09-22 16:48:34 +0000813 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000814 __map_iterator operator--(int)
815 {
816 __map_iterator __t(*this);
817 --(*this);
818 return __t;
819 }
820
Howard Hinnant756c69b2010-09-22 16:48:34 +0000821 friend _LIBCPP_INLINE_VISIBILITY
822 bool operator==(const __map_iterator& __x, const __map_iterator& __y)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000823 {return __x.__i_ == __y.__i_;}
Eric Fiseliercf8c0212017-01-05 06:06:18 +0000824 friend
Howard Hinnant756c69b2010-09-22 16:48:34 +0000825 _LIBCPP_INLINE_VISIBILITY
826 bool operator!=(const __map_iterator& __x, const __map_iterator& __y)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000827 {return __x.__i_ != __y.__i_;}
828
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000829 template <class, class, class, class> friend class _LIBCPP_TEMPLATE_VIS map;
830 template <class, class, class, class> friend class _LIBCPP_TEMPLATE_VIS multimap;
831 template <class> friend class _LIBCPP_TEMPLATE_VIS __map_const_iterator;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000832};
833
834template <class _TreeIterator>
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000835class _LIBCPP_TEMPLATE_VIS __map_const_iterator
Howard Hinnantc51e1022010-05-11 19:42:16 +0000836{
Eric Fiseliera00b4842016-02-20 05:28:30 +0000837 typedef typename _TreeIterator::_NodeTypes _NodeTypes;
838 typedef typename _TreeIterator::__pointer_traits __pointer_traits;
839
Howard Hinnantc51e1022010-05-11 19:42:16 +0000840 _TreeIterator __i_;
841
Howard Hinnantc51e1022010-05-11 19:42:16 +0000842public:
843 typedef bidirectional_iterator_tag iterator_category;
Eric Fiseliera00b4842016-02-20 05:28:30 +0000844 typedef typename _NodeTypes::__map_value_type value_type;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000845 typedef typename _TreeIterator::difference_type difference_type;
846 typedef const value_type& reference;
Eric Fiseliera00b4842016-02-20 05:28:30 +0000847 typedef typename _NodeTypes::__const_map_value_type_pointer pointer;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000848
Howard Hinnant756c69b2010-09-22 16:48:34 +0000849 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +0000850 __map_const_iterator() _NOEXCEPT {}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000851
Howard Hinnant756c69b2010-09-22 16:48:34 +0000852 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +0000853 __map_const_iterator(_TreeIterator __i) _NOEXCEPT : __i_(__i) {}
Howard Hinnant756c69b2010-09-22 16:48:34 +0000854 _LIBCPP_INLINE_VISIBILITY
Eric Fiselier44f9fd02015-03-03 20:10:01 +0000855 __map_const_iterator(__map_iterator<
856 typename _TreeIterator::__non_const_iterator> __i) _NOEXCEPT
857 : __i_(__i.__i_) {}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000858
Howard Hinnant756c69b2010-09-22 16:48:34 +0000859 _LIBCPP_INLINE_VISIBILITY
Erik Pilkingtond3fe2992018-06-04 20:38:23 +0000860 reference operator*() const {return __i_->__get_value();}
Howard Hinnant756c69b2010-09-22 16:48:34 +0000861 _LIBCPP_INLINE_VISIBILITY
Erik Pilkingtond3fe2992018-06-04 20:38:23 +0000862 pointer operator->() const {return pointer_traits<pointer>::pointer_to(__i_->__get_value());}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000863
Howard Hinnant756c69b2010-09-22 16:48:34 +0000864 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000865 __map_const_iterator& operator++() {++__i_; return *this;}
Howard Hinnant756c69b2010-09-22 16:48:34 +0000866 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000867 __map_const_iterator operator++(int)
868 {
869 __map_const_iterator __t(*this);
870 ++(*this);
871 return __t;
872 }
873
Howard Hinnant756c69b2010-09-22 16:48:34 +0000874 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000875 __map_const_iterator& operator--() {--__i_; return *this;}
Howard Hinnant756c69b2010-09-22 16:48:34 +0000876 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000877 __map_const_iterator operator--(int)
878 {
879 __map_const_iterator __t(*this);
880 --(*this);
881 return __t;
882 }
883
Howard Hinnant756c69b2010-09-22 16:48:34 +0000884 friend _LIBCPP_INLINE_VISIBILITY
885 bool operator==(const __map_const_iterator& __x, const __map_const_iterator& __y)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000886 {return __x.__i_ == __y.__i_;}
Howard Hinnant756c69b2010-09-22 16:48:34 +0000887 friend _LIBCPP_INLINE_VISIBILITY
888 bool operator!=(const __map_const_iterator& __x, const __map_const_iterator& __y)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000889 {return __x.__i_ != __y.__i_;}
890
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000891 template <class, class, class, class> friend class _LIBCPP_TEMPLATE_VIS map;
892 template <class, class, class, class> friend class _LIBCPP_TEMPLATE_VIS multimap;
893 template <class, class, class> friend class _LIBCPP_TEMPLATE_VIS __tree_const_iterator;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000894};
895
896template <class _Key, class _Tp, class _Compare = less<_Key>,
897 class _Allocator = allocator<pair<const _Key, _Tp> > >
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000898class _LIBCPP_TEMPLATE_VIS map
Howard Hinnantc51e1022010-05-11 19:42:16 +0000899{
900public:
901 // types:
902 typedef _Key key_type;
903 typedef _Tp mapped_type;
904 typedef pair<const key_type, mapped_type> value_type;
Louis Dionned23a5f22019-06-20 19:32:00 +0000905 typedef typename __identity<_Compare>::type key_compare;
906 typedef typename __identity<_Allocator>::type allocator_type;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000907 typedef value_type& reference;
908 typedef const value_type& const_reference;
909
Marshall Clow5128cf32015-11-26 01:24:04 +0000910 static_assert((is_same<typename allocator_type::value_type, value_type>::value),
911 "Allocator::value_type must be same type as value_type");
912
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000913 class _LIBCPP_TEMPLATE_VIS value_compare
Howard Hinnantc51e1022010-05-11 19:42:16 +0000914 : public binary_function<value_type, value_type, bool>
915 {
916 friend class map;
917 protected:
918 key_compare comp;
919
Howard Hinnant756c69b2010-09-22 16:48:34 +0000920 _LIBCPP_INLINE_VISIBILITY value_compare(key_compare c) : comp(c) {}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000921 public:
Howard Hinnant756c69b2010-09-22 16:48:34 +0000922 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000923 bool operator()(const value_type& __x, const value_type& __y) const
924 {return comp(__x.first, __y.first);}
925 };
926
927private:
Howard Hinnant2d0046b2013-06-19 21:29:40 +0000928
Howard Hinnant89f8b792013-09-30 19:08:22 +0000929 typedef _VSTD::__value_type<key_type, mapped_type> __value_type;
Howard Hinnant90b91592013-07-05 18:06:00 +0000930 typedef __map_value_compare<key_type, __value_type, key_compare> __vc;
Marshall Clow940e01c2015-04-07 05:21:38 +0000931 typedef typename __rebind_alloc_helper<allocator_traits<allocator_type>,
932 __value_type>::type __allocator_type;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000933 typedef __tree<__value_type, __vc, __allocator_type> __base;
934 typedef typename __base::__node_traits __node_traits;
935 typedef allocator_traits<allocator_type> __alloc_traits;
936
937 __base __tree_;
938
939public:
940 typedef typename __alloc_traits::pointer pointer;
941 typedef typename __alloc_traits::const_pointer const_pointer;
942 typedef typename __alloc_traits::size_type size_type;
943 typedef typename __alloc_traits::difference_type difference_type;
Eric Fiselier44f9fd02015-03-03 20:10:01 +0000944 typedef __map_iterator<typename __base::iterator> iterator;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000945 typedef __map_const_iterator<typename __base::const_iterator> const_iterator;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +0000946 typedef _VSTD::reverse_iterator<iterator> reverse_iterator;
947 typedef _VSTD::reverse_iterator<const_iterator> const_reverse_iterator;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000948
Erik Pilkingtonc37a3d82018-08-01 01:33:38 +0000949#if _LIBCPP_STD_VER > 14
950 typedef __map_node_handle<typename __base::__node, allocator_type> node_type;
951 typedef __insert_return_type<iterator, node_type> insert_return_type;
952#endif
953
Erik Pilkington82a65ad2018-10-31 17:31:35 +0000954 template <class _Key2, class _Value2, class _Comp2, class _Alloc2>
955 friend class _LIBCPP_TEMPLATE_VIS map;
956 template <class _Key2, class _Value2, class _Comp2, class _Alloc2>
957 friend class _LIBCPP_TEMPLATE_VIS multimap;
958
Howard Hinnant756c69b2010-09-22 16:48:34 +0000959 _LIBCPP_INLINE_VISIBILITY
Marshall Clow7086a5a2014-03-10 04:50:10 +0000960 map()
961 _NOEXCEPT_(
962 is_nothrow_default_constructible<allocator_type>::value &&
963 is_nothrow_default_constructible<key_compare>::value &&
964 is_nothrow_copy_constructible<key_compare>::value)
965 : __tree_(__vc(key_compare())) {}
966
967 _LIBCPP_INLINE_VISIBILITY
968 explicit map(const key_compare& __comp)
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +0000969 _NOEXCEPT_(
970 is_nothrow_default_constructible<allocator_type>::value &&
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +0000971 is_nothrow_copy_constructible<key_compare>::value)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000972 : __tree_(__vc(__comp)) {}
973
Howard Hinnant756c69b2010-09-22 16:48:34 +0000974 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000975 explicit map(const key_compare& __comp, const allocator_type& __a)
Marshall Clow657cbc42016-08-17 05:58:40 +0000976 : __tree_(__vc(__comp), typename __base::allocator_type(__a)) {}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000977
978 template <class _InputIterator>
Howard Hinnant756c69b2010-09-22 16:48:34 +0000979 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000980 map(_InputIterator __f, _InputIterator __l,
981 const key_compare& __comp = key_compare())
982 : __tree_(__vc(__comp))
983 {
984 insert(__f, __l);
985 }
986
987 template <class _InputIterator>
Howard Hinnant756c69b2010-09-22 16:48:34 +0000988 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000989 map(_InputIterator __f, _InputIterator __l,
990 const key_compare& __comp, const allocator_type& __a)
Marshall Clow657cbc42016-08-17 05:58:40 +0000991 : __tree_(__vc(__comp), typename __base::allocator_type(__a))
Howard Hinnantc51e1022010-05-11 19:42:16 +0000992 {
993 insert(__f, __l);
994 }
995
Marshall Clow300abfb2013-09-11 01:15:47 +0000996#if _LIBCPP_STD_VER > 11
997 template <class _InputIterator>
Eric Fiseliercf8c0212017-01-05 06:06:18 +0000998 _LIBCPP_INLINE_VISIBILITY
Marshall Clow300abfb2013-09-11 01:15:47 +0000999 map(_InputIterator __f, _InputIterator __l, const allocator_type& __a)
1000 : map(__f, __l, key_compare(), __a) {}
1001#endif
1002
Howard Hinnant756c69b2010-09-22 16:48:34 +00001003 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001004 map(const map& __m)
1005 : __tree_(__m.__tree_)
1006 {
1007 insert(__m.begin(), __m.end());
1008 }
1009
Howard Hinnantd3a657f2011-07-01 19:24:36 +00001010 _LIBCPP_INLINE_VISIBILITY
1011 map& operator=(const map& __m)
1012 {
Marshall Clow476d3f42016-07-18 13:19:00 +00001013#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantd3a657f2011-07-01 19:24:36 +00001014 __tree_ = __m.__tree_;
Howard Hinnant2d0046b2013-06-19 21:29:40 +00001015#else
Marshall Clowdb3cfcb2014-02-08 04:03:14 +00001016 if (this != &__m) {
1017 __tree_.clear();
1018 __tree_.value_comp() = __m.__tree_.value_comp();
1019 __tree_.__copy_assign_alloc(__m.__tree_);
1020 insert(__m.begin(), __m.end());
1021 }
Howard Hinnant2d0046b2013-06-19 21:29:40 +00001022#endif
Howard Hinnantd3a657f2011-07-01 19:24:36 +00001023 return *this;
1024 }
1025
Eric Fiseliera85b1282017-04-18 21:08:06 +00001026#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00001027
Howard Hinnant756c69b2010-09-22 16:48:34 +00001028 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001029 map(map&& __m)
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001030 _NOEXCEPT_(is_nothrow_move_constructible<__base>::value)
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001031 : __tree_(_VSTD::move(__m.__tree_))
Howard Hinnantc51e1022010-05-11 19:42:16 +00001032 {
1033 }
1034
1035 map(map&& __m, const allocator_type& __a);
1036
Howard Hinnant756c69b2010-09-22 16:48:34 +00001037 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant33711792011-08-12 21:56:02 +00001038 map& operator=(map&& __m)
1039 _NOEXCEPT_(is_nothrow_move_assignable<__base>::value)
1040 {
1041 __tree_ = _VSTD::move(__m.__tree_);
1042 return *this;
1043 }
1044
Howard Hinnant33711792011-08-12 21:56:02 +00001045 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001046 map(initializer_list<value_type> __il, const key_compare& __comp = key_compare())
1047 : __tree_(__vc(__comp))
1048 {
1049 insert(__il.begin(), __il.end());
1050 }
1051
Howard Hinnant756c69b2010-09-22 16:48:34 +00001052 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001053 map(initializer_list<value_type> __il, const key_compare& __comp, const allocator_type& __a)
Marshall Clow657cbc42016-08-17 05:58:40 +00001054 : __tree_(__vc(__comp), typename __base::allocator_type(__a))
Howard Hinnantc51e1022010-05-11 19:42:16 +00001055 {
1056 insert(__il.begin(), __il.end());
1057 }
1058
Marshall Clow300abfb2013-09-11 01:15:47 +00001059#if _LIBCPP_STD_VER > 11
Eric Fiseliercf8c0212017-01-05 06:06:18 +00001060 _LIBCPP_INLINE_VISIBILITY
Marshall Clow300abfb2013-09-11 01:15:47 +00001061 map(initializer_list<value_type> __il, const allocator_type& __a)
1062 : map(__il, key_compare(), __a) {}
1063#endif
1064
Howard Hinnant756c69b2010-09-22 16:48:34 +00001065 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001066 map& operator=(initializer_list<value_type> __il)
1067 {
1068 __tree_.__assign_unique(__il.begin(), __il.end());
1069 return *this;
1070 }
1071
Eric Fiseliera85b1282017-04-18 21:08:06 +00001072#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00001073
Howard Hinnant756c69b2010-09-22 16:48:34 +00001074 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001075 explicit map(const allocator_type& __a)
Marshall Clow657cbc42016-08-17 05:58:40 +00001076 : __tree_(typename __base::allocator_type(__a))
Howard Hinnantc51e1022010-05-11 19:42:16 +00001077 {
1078 }
1079
Howard Hinnant756c69b2010-09-22 16:48:34 +00001080 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001081 map(const map& __m, const allocator_type& __a)
Marshall Clow657cbc42016-08-17 05:58:40 +00001082 : __tree_(__m.__tree_.value_comp(), typename __base::allocator_type(__a))
Howard Hinnantc51e1022010-05-11 19:42:16 +00001083 {
1084 insert(__m.begin(), __m.end());
1085 }
1086
Howard Hinnant756c69b2010-09-22 16:48:34 +00001087 _LIBCPP_INLINE_VISIBILITY
Louis Dionne69c42c02019-04-11 16:14:56 +00001088 ~map() {
1089 static_assert(sizeof(__diagnose_non_const_comparator<_Key, _Compare>()), "");
1090 }
1091
1092 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001093 iterator begin() _NOEXCEPT {return __tree_.begin();}
Howard Hinnant756c69b2010-09-22 16:48:34 +00001094 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001095 const_iterator begin() const _NOEXCEPT {return __tree_.begin();}
Howard Hinnant756c69b2010-09-22 16:48:34 +00001096 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001097 iterator end() _NOEXCEPT {return __tree_.end();}
Howard Hinnant756c69b2010-09-22 16:48:34 +00001098 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001099 const_iterator end() const _NOEXCEPT {return __tree_.end();}
Howard Hinnantc51e1022010-05-11 19:42:16 +00001100
Howard Hinnant756c69b2010-09-22 16:48:34 +00001101 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001102 reverse_iterator rbegin() _NOEXCEPT {return reverse_iterator(end());}
Howard Hinnant756c69b2010-09-22 16:48:34 +00001103 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001104 const_reverse_iterator rbegin() const _NOEXCEPT
1105 {return const_reverse_iterator(end());}
Howard Hinnant756c69b2010-09-22 16:48:34 +00001106 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001107 reverse_iterator rend() _NOEXCEPT
1108 {return reverse_iterator(begin());}
Howard Hinnant756c69b2010-09-22 16:48:34 +00001109 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001110 const_reverse_iterator rend() const _NOEXCEPT
1111 {return const_reverse_iterator(begin());}
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 const_iterator cbegin() const _NOEXCEPT {return begin();}
Howard Hinnant756c69b2010-09-22 16:48:34 +00001115 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001116 const_iterator cend() const _NOEXCEPT {return end();}
Howard Hinnant756c69b2010-09-22 16:48:34 +00001117 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001118 const_reverse_iterator crbegin() const _NOEXCEPT {return rbegin();}
Howard Hinnant756c69b2010-09-22 16:48:34 +00001119 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001120 const_reverse_iterator crend() const _NOEXCEPT {return rend();}
Howard Hinnantc51e1022010-05-11 19:42:16 +00001121
Marshall Clow425f5752017-11-15 05:51:26 +00001122 _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001123 bool empty() const _NOEXCEPT {return __tree_.size() == 0;}
Howard Hinnant756c69b2010-09-22 16:48:34 +00001124 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001125 size_type size() const _NOEXCEPT {return __tree_.size();}
Howard Hinnant756c69b2010-09-22 16:48:34 +00001126 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001127 size_type max_size() const _NOEXCEPT {return __tree_.max_size();}
Howard Hinnantc51e1022010-05-11 19:42:16 +00001128
1129 mapped_type& operator[](const key_type& __k);
Eric Fiselierd63f38e2016-03-31 03:13:37 +00001130#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00001131 mapped_type& operator[](key_type&& __k);
1132#endif
1133
1134 mapped_type& at(const key_type& __k);
1135 const mapped_type& at(const key_type& __k) const;
1136
Howard Hinnant756c69b2010-09-22 16:48:34 +00001137 _LIBCPP_INLINE_VISIBILITY
Marshall Clow657cbc42016-08-17 05:58:40 +00001138 allocator_type get_allocator() const _NOEXCEPT {return allocator_type(__tree_.__alloc());}
Howard Hinnant756c69b2010-09-22 16:48:34 +00001139 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001140 key_compare key_comp() const {return __tree_.value_comp().key_comp();}
Howard Hinnant756c69b2010-09-22 16:48:34 +00001141 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001142 value_compare value_comp() const {return value_compare(__tree_.value_comp().key_comp());}
1143
Eric Fiselierd06276b2016-03-31 02:15:15 +00001144#ifndef _LIBCPP_CXX03_LANG
1145 template <class ..._Args>
1146 _LIBCPP_INLINE_VISIBILITY
1147 pair<iterator, bool> emplace(_Args&& ...__args) {
1148 return __tree_.__emplace_unique(_VSTD::forward<_Args>(__args)...);
1149 }
Howard Hinnant74279a52010-09-04 23:28:19 +00001150
Howard Hinnant29eb9b82012-05-25 22:04:21 +00001151 template <class ..._Args>
Eric Fiselierd06276b2016-03-31 02:15:15 +00001152 _LIBCPP_INLINE_VISIBILITY
1153 iterator emplace_hint(const_iterator __p, _Args&& ...__args) {
1154 return __tree_.__emplace_hint_unique(__p.__i_, _VSTD::forward<_Args>(__args)...);
1155 }
Howard Hinnant74279a52010-09-04 23:28:19 +00001156
Howard Hinnantc834c512011-11-29 18:15:50 +00001157 template <class _Pp,
1158 class = typename enable_if<is_constructible<value_type, _Pp>::value>::type>
Howard Hinnant756c69b2010-09-22 16:48:34 +00001159 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc834c512011-11-29 18:15:50 +00001160 pair<iterator, bool> insert(_Pp&& __p)
1161 {return __tree_.__insert_unique(_VSTD::forward<_Pp>(__p));}
Howard Hinnantc51e1022010-05-11 19:42:16 +00001162
Howard Hinnantc834c512011-11-29 18:15:50 +00001163 template <class _Pp,
1164 class = typename enable_if<is_constructible<value_type, _Pp>::value>::type>
Howard Hinnant756c69b2010-09-22 16:48:34 +00001165 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc834c512011-11-29 18:15:50 +00001166 iterator insert(const_iterator __pos, _Pp&& __p)
1167 {return __tree_.__insert_unique(__pos.__i_, _VSTD::forward<_Pp>(__p));}
Howard Hinnantc51e1022010-05-11 19:42:16 +00001168
Eric Fiselierd06276b2016-03-31 02:15:15 +00001169#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00001170
Howard Hinnant756c69b2010-09-22 16:48:34 +00001171 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001172 pair<iterator, bool>
1173 insert(const value_type& __v) {return __tree_.__insert_unique(__v);}
1174
Howard Hinnant756c69b2010-09-22 16:48:34 +00001175 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001176 iterator
1177 insert(const_iterator __p, const value_type& __v)
1178 {return __tree_.__insert_unique(__p.__i_, __v);}
1179
Eric Fiselierd6143132016-04-18 01:40:45 +00001180#ifndef _LIBCPP_CXX03_LANG
Marshall Clowd430d022016-01-05 19:32:41 +00001181 _LIBCPP_INLINE_VISIBILITY
1182 pair<iterator, bool>
Eric Fiselierd06276b2016-03-31 02:15:15 +00001183 insert(value_type&& __v) {return __tree_.__insert_unique(_VSTD::move(__v));}
Marshall Clowd430d022016-01-05 19:32:41 +00001184
1185 _LIBCPP_INLINE_VISIBILITY
Eric Fiselierd06276b2016-03-31 02:15:15 +00001186 iterator insert(const_iterator __p, value_type&& __v)
1187 {return __tree_.__insert_unique(__p.__i_, _VSTD::move(__v));}
Eric Fiseliera85b1282017-04-18 21:08:06 +00001188
1189 _LIBCPP_INLINE_VISIBILITY
1190 void insert(initializer_list<value_type> __il)
1191 {insert(__il.begin(), __il.end());}
Marshall Clowd430d022016-01-05 19:32:41 +00001192#endif
1193
Howard Hinnantc51e1022010-05-11 19:42:16 +00001194 template <class _InputIterator>
Howard Hinnant756c69b2010-09-22 16:48:34 +00001195 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001196 void insert(_InputIterator __f, _InputIterator __l)
1197 {
1198 for (const_iterator __e = cend(); __f != __l; ++__f)
1199 insert(__e.__i_, *__f);
1200 }
1201
Marshall Clow3223db82015-07-07 03:37:33 +00001202#if _LIBCPP_STD_VER > 14
Eric Fiselierd63f38e2016-03-31 03:13:37 +00001203
Marshall Clow3223db82015-07-07 03:37:33 +00001204 template <class... _Args>
1205 _LIBCPP_INLINE_VISIBILITY
1206 pair<iterator, bool> try_emplace(const key_type& __k, _Args&&... __args)
1207 {
Eric Fiselierd63f38e2016-03-31 03:13:37 +00001208 return __tree_.__emplace_unique_key_args(__k,
1209 _VSTD::piecewise_construct,
1210 _VSTD::forward_as_tuple(__k),
1211 _VSTD::forward_as_tuple(_VSTD::forward<_Args>(__args)...));
Marshall Clow3223db82015-07-07 03:37:33 +00001212 }
1213
1214 template <class... _Args>
1215 _LIBCPP_INLINE_VISIBILITY
1216 pair<iterator, bool> try_emplace(key_type&& __k, _Args&&... __args)
1217 {
Eric Fiselierd63f38e2016-03-31 03:13:37 +00001218 return __tree_.__emplace_unique_key_args(__k,
1219 _VSTD::piecewise_construct,
1220 _VSTD::forward_as_tuple(_VSTD::move(__k)),
1221 _VSTD::forward_as_tuple(_VSTD::forward<_Args>(__args)...));
Marshall Clow3223db82015-07-07 03:37:33 +00001222 }
1223
1224 template <class... _Args>
1225 _LIBCPP_INLINE_VISIBILITY
1226 iterator try_emplace(const_iterator __h, const key_type& __k, _Args&&... __args)
1227 {
Eric Fiselierd63f38e2016-03-31 03:13:37 +00001228 return __tree_.__emplace_hint_unique_key_args(__h.__i_, __k,
1229 _VSTD::piecewise_construct,
1230 _VSTD::forward_as_tuple(__k),
1231 _VSTD::forward_as_tuple(_VSTD::forward<_Args>(__args)...));
Marshall Clow3223db82015-07-07 03:37:33 +00001232 }
1233
1234 template <class... _Args>
1235 _LIBCPP_INLINE_VISIBILITY
1236 iterator try_emplace(const_iterator __h, key_type&& __k, _Args&&... __args)
1237 {
Eric Fiselierd63f38e2016-03-31 03:13:37 +00001238 return __tree_.__emplace_hint_unique_key_args(__h.__i_, __k,
1239 _VSTD::piecewise_construct,
1240 _VSTD::forward_as_tuple(_VSTD::move(__k)),
1241 _VSTD::forward_as_tuple(_VSTD::forward<_Args>(__args)...));
Marshall Clow3223db82015-07-07 03:37:33 +00001242 }
1243
1244 template <class _Vp>
1245 _LIBCPP_INLINE_VISIBILITY
1246 pair<iterator, bool> insert_or_assign(const key_type& __k, _Vp&& __v)
1247 {
1248 iterator __p = lower_bound(__k);
1249 if ( __p != end() && !key_comp()(__k, __p->first))
1250 {
1251 __p->second = _VSTD::forward<_Vp>(__v);
1252 return _VSTD::make_pair(__p, false);
1253 }
1254 return _VSTD::make_pair(emplace_hint(__p, __k, _VSTD::forward<_Vp>(__v)), true);
1255 }
Eric Fiselierd63f38e2016-03-31 03:13:37 +00001256
Marshall Clow3223db82015-07-07 03:37:33 +00001257 template <class _Vp>
1258 _LIBCPP_INLINE_VISIBILITY
1259 pair<iterator, bool> insert_or_assign(key_type&& __k, _Vp&& __v)
1260 {
1261 iterator __p = lower_bound(__k);
1262 if ( __p != end() && !key_comp()(__k, __p->first))
1263 {
1264 __p->second = _VSTD::forward<_Vp>(__v);
1265 return _VSTD::make_pair(__p, false);
1266 }
1267 return _VSTD::make_pair(emplace_hint(__p, _VSTD::move(__k), _VSTD::forward<_Vp>(__v)), true);
1268 }
1269
1270 template <class _Vp>
1271 _LIBCPP_INLINE_VISIBILITY
1272 iterator insert_or_assign(const_iterator __h, const key_type& __k, _Vp&& __v)
1273 {
1274 iterator __p = lower_bound(__k);
1275 if ( __p != end() && !key_comp()(__k, __p->first))
1276 {
1277 __p->second = _VSTD::forward<_Vp>(__v);
1278 return __p;
1279 }
1280 return emplace_hint(__h, __k, _VSTD::forward<_Vp>(__v));
1281 }
1282
1283 template <class _Vp>
1284 _LIBCPP_INLINE_VISIBILITY
1285 iterator insert_or_assign(const_iterator __h, key_type&& __k, _Vp&& __v)
1286 {
1287 iterator __p = lower_bound(__k);
1288 if ( __p != end() && !key_comp()(__k, __p->first))
1289 {
1290 __p->second = _VSTD::forward<_Vp>(__v);
1291 return __p;
1292 }
1293 return emplace_hint(__h, _VSTD::move(__k), _VSTD::forward<_Vp>(__v));
1294 }
Eric Fiselierd63f38e2016-03-31 03:13:37 +00001295
Eric Fiseliera85b1282017-04-18 21:08:06 +00001296#endif // _LIBCPP_STD_VER > 14
Marshall Clow3223db82015-07-07 03:37:33 +00001297
Howard Hinnant756c69b2010-09-22 16:48:34 +00001298 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001299 iterator erase(const_iterator __p) {return __tree_.erase(__p.__i_);}
Howard Hinnant756c69b2010-09-22 16:48:34 +00001300 _LIBCPP_INLINE_VISIBILITY
Marshall Clow22ea5b82015-05-10 13:35:00 +00001301 iterator erase(iterator __p) {return __tree_.erase(__p.__i_);}
1302 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001303 size_type erase(const key_type& __k)
1304 {return __tree_.__erase_unique(__k);}
Howard Hinnant756c69b2010-09-22 16:48:34 +00001305 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001306 iterator erase(const_iterator __f, const_iterator __l)
1307 {return __tree_.erase(__f.__i_, __l.__i_);}
Howard Hinnant756c69b2010-09-22 16:48:34 +00001308 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001309 void clear() _NOEXCEPT {__tree_.clear();}
Howard Hinnantc51e1022010-05-11 19:42:16 +00001310
Erik Pilkingtonc37a3d82018-08-01 01:33:38 +00001311#if _LIBCPP_STD_VER > 14
1312 _LIBCPP_INLINE_VISIBILITY
1313 insert_return_type insert(node_type&& __nh)
1314 {
1315 _LIBCPP_ASSERT(__nh.empty() || __nh.get_allocator() == get_allocator(),
1316 "node_type with incompatible allocator passed to map::insert()");
1317 return __tree_.template __node_handle_insert_unique<
1318 node_type, insert_return_type>(_VSTD::move(__nh));
1319 }
1320 _LIBCPP_INLINE_VISIBILITY
1321 iterator insert(const_iterator __hint, node_type&& __nh)
1322 {
1323 _LIBCPP_ASSERT(__nh.empty() || __nh.get_allocator() == get_allocator(),
1324 "node_type with incompatible allocator passed to map::insert()");
1325 return __tree_.template __node_handle_insert_unique<node_type>(
1326 __hint.__i_, _VSTD::move(__nh));
1327 }
1328 _LIBCPP_INLINE_VISIBILITY
1329 node_type extract(key_type const& __key)
1330 {
1331 return __tree_.template __node_handle_extract<node_type>(__key);
1332 }
1333 _LIBCPP_INLINE_VISIBILITY
1334 node_type extract(const_iterator __it)
1335 {
1336 return __tree_.template __node_handle_extract<node_type>(__it.__i_);
1337 }
Louis Dionned2322c82018-11-01 14:41:37 +00001338 template <class _Compare2>
Erik Pilkington82a65ad2018-10-31 17:31:35 +00001339 _LIBCPP_INLINE_VISIBILITY
Louis Dionned2322c82018-11-01 14:41:37 +00001340 void merge(map<key_type, mapped_type, _Compare2, allocator_type>& __source)
Erik Pilkington82a65ad2018-10-31 17:31:35 +00001341 {
1342 _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
1343 "merging container with incompatible allocator");
1344 __tree_.__node_handle_merge_unique(__source.__tree_);
1345 }
Louis Dionned2322c82018-11-01 14:41:37 +00001346 template <class _Compare2>
Erik Pilkington82a65ad2018-10-31 17:31:35 +00001347 _LIBCPP_INLINE_VISIBILITY
Louis Dionned2322c82018-11-01 14:41:37 +00001348 void merge(map<key_type, mapped_type, _Compare2, allocator_type>&& __source)
Erik Pilkington82a65ad2018-10-31 17:31:35 +00001349 {
1350 _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
1351 "merging container with incompatible allocator");
1352 __tree_.__node_handle_merge_unique(__source.__tree_);
1353 }
Louis Dionned2322c82018-11-01 14:41:37 +00001354 template <class _Compare2>
Erik Pilkington82a65ad2018-10-31 17:31:35 +00001355 _LIBCPP_INLINE_VISIBILITY
Louis Dionned2322c82018-11-01 14:41:37 +00001356 void merge(multimap<key_type, mapped_type, _Compare2, allocator_type>& __source)
Erik Pilkington82a65ad2018-10-31 17:31:35 +00001357 {
1358 _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
1359 "merging container with incompatible allocator");
1360 __tree_.__node_handle_merge_unique(__source.__tree_);
1361 }
Louis Dionned2322c82018-11-01 14:41:37 +00001362 template <class _Compare2>
Erik Pilkington82a65ad2018-10-31 17:31:35 +00001363 _LIBCPP_INLINE_VISIBILITY
Louis Dionned2322c82018-11-01 14:41:37 +00001364 void merge(multimap<key_type, mapped_type, _Compare2, allocator_type>&& __source)
Erik Pilkington82a65ad2018-10-31 17:31:35 +00001365 {
1366 _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
1367 "merging container with incompatible allocator");
1368 __tree_.__node_handle_merge_unique(__source.__tree_);
1369 }
Erik Pilkingtonc37a3d82018-08-01 01:33:38 +00001370#endif
1371
Howard Hinnant756c69b2010-09-22 16:48:34 +00001372 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001373 void swap(map& __m)
1374 _NOEXCEPT_(__is_nothrow_swappable<__base>::value)
1375 {__tree_.swap(__m.__tree_);}
Howard Hinnantc51e1022010-05-11 19:42:16 +00001376
Howard Hinnant756c69b2010-09-22 16:48:34 +00001377 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001378 iterator find(const key_type& __k) {return __tree_.find(__k);}
Howard Hinnant756c69b2010-09-22 16:48:34 +00001379 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001380 const_iterator find(const key_type& __k) const {return __tree_.find(__k);}
Marshall Clowebb57322013-08-13 22:18:47 +00001381#if _LIBCPP_STD_VER > 11
1382 template <typename _K2>
1383 _LIBCPP_INLINE_VISIBILITY
1384 typename enable_if<__is_transparent<_Compare, _K2>::value,iterator>::type
1385 find(const _K2& __k) {return __tree_.find(__k);}
1386 template <typename _K2>
1387 _LIBCPP_INLINE_VISIBILITY
1388 typename enable_if<__is_transparent<_Compare, _K2>::value,const_iterator>::type
1389 find(const _K2& __k) const {return __tree_.find(__k);}
1390#endif
1391
Howard Hinnant756c69b2010-09-22 16:48:34 +00001392 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001393 size_type count(const key_type& __k) const
1394 {return __tree_.__count_unique(__k);}
Marshall Clowe6a5f522014-08-24 23:54:16 +00001395#if _LIBCPP_STD_VER > 11
1396 template <typename _K2>
1397 _LIBCPP_INLINE_VISIBILITY
1398 typename enable_if<__is_transparent<_Compare, _K2>::value,size_type>::type
Eric Fiseliera85c9e92018-02-10 02:53:47 +00001399 count(const _K2& __k) const {return __tree_.__count_multi(__k);}
Marshall Clowe6a5f522014-08-24 23:54:16 +00001400#endif
Howard Hinnant756c69b2010-09-22 16:48:34 +00001401 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001402 iterator lower_bound(const key_type& __k)
1403 {return __tree_.lower_bound(__k);}
Howard Hinnant756c69b2010-09-22 16:48:34 +00001404 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001405 const_iterator lower_bound(const key_type& __k) const
1406 {return __tree_.lower_bound(__k);}
Marshall Clowebb57322013-08-13 22:18:47 +00001407#if _LIBCPP_STD_VER > 11
1408 template <typename _K2>
1409 _LIBCPP_INLINE_VISIBILITY
1410 typename enable_if<__is_transparent<_Compare, _K2>::value,iterator>::type
1411 lower_bound(const _K2& __k) {return __tree_.lower_bound(__k);}
1412
1413 template <typename _K2>
1414 _LIBCPP_INLINE_VISIBILITY
1415 typename enable_if<__is_transparent<_Compare, _K2>::value,const_iterator>::type
1416 lower_bound(const _K2& __k) const {return __tree_.lower_bound(__k);}
1417#endif
1418
Howard Hinnant756c69b2010-09-22 16:48:34 +00001419 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001420 iterator upper_bound(const key_type& __k)
1421 {return __tree_.upper_bound(__k);}
Howard Hinnant756c69b2010-09-22 16:48:34 +00001422 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001423 const_iterator upper_bound(const key_type& __k) const
1424 {return __tree_.upper_bound(__k);}
Marshall Clowebb57322013-08-13 22:18:47 +00001425#if _LIBCPP_STD_VER > 11
1426 template <typename _K2>
1427 _LIBCPP_INLINE_VISIBILITY
1428 typename enable_if<__is_transparent<_Compare, _K2>::value,iterator>::type
1429 upper_bound(const _K2& __k) {return __tree_.upper_bound(__k);}
1430 template <typename _K2>
1431 _LIBCPP_INLINE_VISIBILITY
1432 typename enable_if<__is_transparent<_Compare, _K2>::value,const_iterator>::type
1433 upper_bound(const _K2& __k) const {return __tree_.upper_bound(__k);}
1434#endif
1435
Howard Hinnant756c69b2010-09-22 16:48:34 +00001436 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001437 pair<iterator,iterator> equal_range(const key_type& __k)
1438 {return __tree_.__equal_range_unique(__k);}
Howard Hinnant756c69b2010-09-22 16:48:34 +00001439 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001440 pair<const_iterator,const_iterator> equal_range(const key_type& __k) const
1441 {return __tree_.__equal_range_unique(__k);}
Marshall Clowebb57322013-08-13 22:18:47 +00001442#if _LIBCPP_STD_VER > 11
1443 template <typename _K2>
1444 _LIBCPP_INLINE_VISIBILITY
1445 typename enable_if<__is_transparent<_Compare, _K2>::value,pair<iterator,iterator>>::type
Eric Fiseliera85c9e92018-02-10 02:53:47 +00001446 equal_range(const _K2& __k) {return __tree_.__equal_range_multi(__k);}
Marshall Clowebb57322013-08-13 22:18:47 +00001447 template <typename _K2>
1448 _LIBCPP_INLINE_VISIBILITY
1449 typename enable_if<__is_transparent<_Compare, _K2>::value,pair<const_iterator,const_iterator>>::type
Eric Fiseliera85c9e92018-02-10 02:53:47 +00001450 equal_range(const _K2& __k) const {return __tree_.__equal_range_multi(__k);}
Marshall Clowebb57322013-08-13 22:18:47 +00001451#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00001452
1453private:
1454 typedef typename __base::__node __node;
1455 typedef typename __base::__node_allocator __node_allocator;
1456 typedef typename __base::__node_pointer __node_pointer;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001457 typedef typename __base::__node_base_pointer __node_base_pointer;
Eric Fiseliercf8c0212017-01-05 06:06:18 +00001458 typedef typename __base::__parent_pointer __parent_pointer;
Eric Fiseliera92b0732016-02-20 07:12:17 +00001459
Howard Hinnantc834c512011-11-29 18:15:50 +00001460 typedef __map_node_destructor<__node_allocator> _Dp;
1461 typedef unique_ptr<__node, _Dp> __node_holder;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001462
Eric Fiselierd63f38e2016-03-31 03:13:37 +00001463#ifdef _LIBCPP_CXX03_LANG
Howard Hinnantac7e7482013-07-04 20:59:16 +00001464 __node_holder __construct_node_with_key(const key_type& __k);
Eric Fiselierd63f38e2016-03-31 03:13:37 +00001465#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00001466};
1467
Louis Dionned23a5f22019-06-20 19:32:00 +00001468#ifndef _LIBCPP_HAS_NO_DEDUCTION_GUIDES
1469template<class _InputIterator, class _Compare = less<__iter_key_type<_InputIterator>>,
1470 class _Allocator = allocator<__iter_to_alloc_type<_InputIterator>>,
1471 class = enable_if_t<!__is_allocator<_Compare>::value, void>,
1472 class = enable_if_t<__is_allocator<_Allocator>::value, void>>
1473map(_InputIterator, _InputIterator, _Compare = _Compare(), _Allocator = _Allocator())
1474 -> map<__iter_key_type<_InputIterator>, __iter_mapped_type<_InputIterator>, _Compare, _Allocator>;
1475
1476template<class _Key, class _Tp, class _Compare = less<remove_const_t<_Key>>,
1477 class _Allocator = allocator<pair<const _Key, _Tp>>,
1478 class = enable_if_t<!__is_allocator<_Compare>::value, void>,
1479 class = enable_if_t<__is_allocator<_Allocator>::value, void>>
1480map(initializer_list<pair<_Key, _Tp>>, _Compare = _Compare(), _Allocator = _Allocator())
1481 -> map<remove_const_t<_Key>, _Tp, _Compare, _Allocator>;
1482
1483template<class _InputIterator, class _Allocator,
1484 class = enable_if_t<__is_allocator<_Allocator>::value, void>>
1485map(_InputIterator, _InputIterator, _Allocator)
1486 -> map<__iter_key_type<_InputIterator>, __iter_mapped_type<_InputIterator>,
1487 less<__iter_key_type<_InputIterator>>, _Allocator>;
1488
1489template<class _Key, class _Tp, class _Allocator,
1490 class = enable_if_t<__is_allocator<_Allocator>::value, void>>
1491map(initializer_list<pair<_Key, _Tp>>, _Allocator)
1492 -> map<remove_const_t<_Key>, _Tp, less<remove_const_t<_Key>>, _Allocator>;
1493#endif
Eric Fiseliera92b0732016-02-20 07:12:17 +00001494
Eric Fiselierd06276b2016-03-31 02:15:15 +00001495#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00001496template <class _Key, class _Tp, class _Compare, class _Allocator>
1497map<_Key, _Tp, _Compare, _Allocator>::map(map&& __m, const allocator_type& __a)
Marshall Clow657cbc42016-08-17 05:58:40 +00001498 : __tree_(_VSTD::move(__m.__tree_), typename __base::allocator_type(__a))
Howard Hinnantc51e1022010-05-11 19:42:16 +00001499{
1500 if (__a != __m.get_allocator())
1501 {
1502 const_iterator __e = cend();
1503 while (!__m.empty())
1504 __tree_.__insert_unique(__e.__i_,
Erik Pilkingtond3fe2992018-06-04 20:38:23 +00001505 __m.__tree_.remove(__m.begin().__i_)->__value_.__move());
Howard Hinnantc51e1022010-05-11 19:42:16 +00001506 }
1507}
1508
Eric Fiseliera85b1282017-04-18 21:08:06 +00001509template <class _Key, class _Tp, class _Compare, class _Allocator>
1510_Tp&
1511map<_Key, _Tp, _Compare, _Allocator>::operator[](const key_type& __k)
1512{
1513 return __tree_.__emplace_unique_key_args(__k,
1514 _VSTD::piecewise_construct,
1515 _VSTD::forward_as_tuple(__k),
Erik Pilkingtond3fe2992018-06-04 20:38:23 +00001516 _VSTD::forward_as_tuple()).first->__get_value().second;
Eric Fiseliera85b1282017-04-18 21:08:06 +00001517}
Howard Hinnantc51e1022010-05-11 19:42:16 +00001518
Eric Fiseliera85b1282017-04-18 21:08:06 +00001519template <class _Key, class _Tp, class _Compare, class _Allocator>
1520_Tp&
1521map<_Key, _Tp, _Compare, _Allocator>::operator[](key_type&& __k)
1522{
1523 return __tree_.__emplace_unique_key_args(__k,
1524 _VSTD::piecewise_construct,
1525 _VSTD::forward_as_tuple(_VSTD::move(__k)),
Erik Pilkingtond3fe2992018-06-04 20:38:23 +00001526 _VSTD::forward_as_tuple()).first->__get_value().second;
Eric Fiseliera85b1282017-04-18 21:08:06 +00001527}
Eric Fiselierd63f38e2016-03-31 03:13:37 +00001528
Eric Fiseliera85b1282017-04-18 21:08:06 +00001529#else // _LIBCPP_CXX03_LANG
Eric Fiselierd63f38e2016-03-31 03:13:37 +00001530
Howard Hinnantc51e1022010-05-11 19:42:16 +00001531template <class _Key, class _Tp, class _Compare, class _Allocator>
1532typename map<_Key, _Tp, _Compare, _Allocator>::__node_holder
Howard Hinnantac7e7482013-07-04 20:59:16 +00001533map<_Key, _Tp, _Compare, _Allocator>::__construct_node_with_key(const key_type& __k)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001534{
1535 __node_allocator& __na = __tree_.__node_alloc();
Howard Hinnantc834c512011-11-29 18:15:50 +00001536 __node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na));
Erik Pilkingtond3fe2992018-06-04 20:38:23 +00001537 __node_traits::construct(__na, _VSTD::addressof(__h->__value_.__get_value().first), __k);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001538 __h.get_deleter().__first_constructed = true;
Erik Pilkingtond3fe2992018-06-04 20:38:23 +00001539 __node_traits::construct(__na, _VSTD::addressof(__h->__value_.__get_value().second));
Howard Hinnantc51e1022010-05-11 19:42:16 +00001540 __h.get_deleter().__second_constructed = true;
Dimitry Andric830fb602015-08-19 06:43:33 +00001541 return _LIBCPP_EXPLICIT_MOVE(__h); // explicitly moved for C++03
Howard Hinnantc51e1022010-05-11 19:42:16 +00001542}
1543
Howard Hinnantc51e1022010-05-11 19:42:16 +00001544template <class _Key, class _Tp, class _Compare, class _Allocator>
1545_Tp&
1546map<_Key, _Tp, _Compare, _Allocator>::operator[](const key_type& __k)
1547{
Eric Fiseliercf8c0212017-01-05 06:06:18 +00001548 __parent_pointer __parent;
1549 __node_base_pointer& __child = __tree_.__find_equal(__parent, __k);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001550 __node_pointer __r = static_cast<__node_pointer>(__child);
1551 if (__child == nullptr)
1552 {
Howard Hinnantac7e7482013-07-04 20:59:16 +00001553 __node_holder __h = __construct_node_with_key(__k);
Howard Hinnant2d0046b2013-06-19 21:29:40 +00001554 __tree_.__insert_node_at(__parent, __child, static_cast<__node_base_pointer>(__h.get()));
Howard Hinnantc51e1022010-05-11 19:42:16 +00001555 __r = __h.release();
1556 }
Erik Pilkingtond3fe2992018-06-04 20:38:23 +00001557 return __r->__value_.__get_value().second;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001558}
1559
Eric Fiseliera85b1282017-04-18 21:08:06 +00001560#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00001561
1562template <class _Key, class _Tp, class _Compare, class _Allocator>
1563_Tp&
1564map<_Key, _Tp, _Compare, _Allocator>::at(const key_type& __k)
1565{
Eric Fiseliercf8c0212017-01-05 06:06:18 +00001566 __parent_pointer __parent;
1567 __node_base_pointer& __child = __tree_.__find_equal(__parent, __k);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001568 if (__child == nullptr)
Louis Dionne2b239162019-02-12 16:06:02 +00001569 __throw_out_of_range("map::at: key not found");
Erik Pilkingtond3fe2992018-06-04 20:38:23 +00001570 return static_cast<__node_pointer>(__child)->__value_.__get_value().second;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001571}
1572
1573template <class _Key, class _Tp, class _Compare, class _Allocator>
1574const _Tp&
1575map<_Key, _Tp, _Compare, _Allocator>::at(const key_type& __k) const
1576{
Eric Fiseliercf8c0212017-01-05 06:06:18 +00001577 __parent_pointer __parent;
1578 __node_base_pointer __child = __tree_.__find_equal(__parent, __k);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001579 if (__child == nullptr)
Louis Dionne2b239162019-02-12 16:06:02 +00001580 __throw_out_of_range("map::at: key not found");
Erik Pilkingtond3fe2992018-06-04 20:38:23 +00001581 return static_cast<__node_pointer>(__child)->__value_.__get_value().second;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001582}
1583
Howard Hinnantc51e1022010-05-11 19:42:16 +00001584
1585template <class _Key, class _Tp, class _Compare, class _Allocator>
Howard Hinnant756c69b2010-09-22 16:48:34 +00001586inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001587bool
1588operator==(const map<_Key, _Tp, _Compare, _Allocator>& __x,
1589 const map<_Key, _Tp, _Compare, _Allocator>& __y)
1590{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001591 return __x.size() == __y.size() && _VSTD::equal(__x.begin(), __x.end(), __y.begin());
Howard Hinnantc51e1022010-05-11 19:42:16 +00001592}
1593
1594template <class _Key, class _Tp, class _Compare, class _Allocator>
Howard Hinnant756c69b2010-09-22 16:48:34 +00001595inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001596bool
1597operator< (const map<_Key, _Tp, _Compare, _Allocator>& __x,
1598 const map<_Key, _Tp, _Compare, _Allocator>& __y)
1599{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001600 return _VSTD::lexicographical_compare(__x.begin(), __x.end(), __y.begin(), __y.end());
Howard Hinnantc51e1022010-05-11 19:42:16 +00001601}
1602
1603template <class _Key, class _Tp, class _Compare, class _Allocator>
Howard Hinnant756c69b2010-09-22 16:48:34 +00001604inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001605bool
1606operator!=(const map<_Key, _Tp, _Compare, _Allocator>& __x,
1607 const map<_Key, _Tp, _Compare, _Allocator>& __y)
1608{
1609 return !(__x == __y);
1610}
1611
1612template <class _Key, class _Tp, class _Compare, class _Allocator>
Howard Hinnant756c69b2010-09-22 16:48:34 +00001613inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001614bool
1615operator> (const map<_Key, _Tp, _Compare, _Allocator>& __x,
1616 const map<_Key, _Tp, _Compare, _Allocator>& __y)
1617{
1618 return __y < __x;
1619}
1620
1621template <class _Key, class _Tp, class _Compare, class _Allocator>
Howard Hinnant756c69b2010-09-22 16:48:34 +00001622inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001623bool
1624operator>=(const map<_Key, _Tp, _Compare, _Allocator>& __x,
1625 const map<_Key, _Tp, _Compare, _Allocator>& __y)
1626{
1627 return !(__x < __y);
1628}
1629
1630template <class _Key, class _Tp, class _Compare, class _Allocator>
Howard Hinnant756c69b2010-09-22 16:48:34 +00001631inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001632bool
1633operator<=(const map<_Key, _Tp, _Compare, _Allocator>& __x,
1634 const map<_Key, _Tp, _Compare, _Allocator>& __y)
1635{
1636 return !(__y < __x);
1637}
1638
1639template <class _Key, class _Tp, class _Compare, class _Allocator>
Howard Hinnant756c69b2010-09-22 16:48:34 +00001640inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001641void
1642swap(map<_Key, _Tp, _Compare, _Allocator>& __x,
1643 map<_Key, _Tp, _Compare, _Allocator>& __y)
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001644 _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
Howard Hinnantc51e1022010-05-11 19:42:16 +00001645{
1646 __x.swap(__y);
1647}
1648
Marshall Clow29b53f22018-12-14 18:49:35 +00001649#if _LIBCPP_STD_VER > 17
1650template <class _Key, class _Tp, class _Compare, class _Allocator, class _Predicate>
1651inline _LIBCPP_INLINE_VISIBILITY
1652void erase_if(map<_Key, _Tp, _Compare, _Allocator>& __c, _Predicate __pred)
1653{ __libcpp_erase_if_container(__c, __pred); }
1654#endif
1655
1656
Howard Hinnantc51e1022010-05-11 19:42:16 +00001657template <class _Key, class _Tp, class _Compare = less<_Key>,
1658 class _Allocator = allocator<pair<const _Key, _Tp> > >
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +00001659class _LIBCPP_TEMPLATE_VIS multimap
Howard Hinnantc51e1022010-05-11 19:42:16 +00001660{
1661public:
1662 // types:
1663 typedef _Key key_type;
1664 typedef _Tp mapped_type;
1665 typedef pair<const key_type, mapped_type> value_type;
Louis Dionned23a5f22019-06-20 19:32:00 +00001666 typedef typename __identity<_Compare>::type key_compare;
1667 typedef typename __identity<_Allocator>::type allocator_type;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001668 typedef value_type& reference;
1669 typedef const value_type& const_reference;
1670
Marshall Clow5128cf32015-11-26 01:24:04 +00001671 static_assert((is_same<typename allocator_type::value_type, value_type>::value),
1672 "Allocator::value_type must be same type as value_type");
1673
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +00001674 class _LIBCPP_TEMPLATE_VIS value_compare
Howard Hinnantc51e1022010-05-11 19:42:16 +00001675 : public binary_function<value_type, value_type, bool>
1676 {
1677 friend class multimap;
1678 protected:
1679 key_compare comp;
1680
Howard Hinnant756c69b2010-09-22 16:48:34 +00001681 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001682 value_compare(key_compare c) : comp(c) {}
1683 public:
Howard Hinnant756c69b2010-09-22 16:48:34 +00001684 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001685 bool operator()(const value_type& __x, const value_type& __y) const
1686 {return comp(__x.first, __y.first);}
1687 };
1688
1689private:
Howard Hinnant2d0046b2013-06-19 21:29:40 +00001690
Howard Hinnant89f8b792013-09-30 19:08:22 +00001691 typedef _VSTD::__value_type<key_type, mapped_type> __value_type;
Howard Hinnant90b91592013-07-05 18:06:00 +00001692 typedef __map_value_compare<key_type, __value_type, key_compare> __vc;
Marshall Clow940e01c2015-04-07 05:21:38 +00001693 typedef typename __rebind_alloc_helper<allocator_traits<allocator_type>,
1694 __value_type>::type __allocator_type;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001695 typedef __tree<__value_type, __vc, __allocator_type> __base;
1696 typedef typename __base::__node_traits __node_traits;
1697 typedef allocator_traits<allocator_type> __alloc_traits;
1698
1699 __base __tree_;
1700
1701public:
1702 typedef typename __alloc_traits::pointer pointer;
1703 typedef typename __alloc_traits::const_pointer const_pointer;
1704 typedef typename __alloc_traits::size_type size_type;
1705 typedef typename __alloc_traits::difference_type difference_type;
1706 typedef __map_iterator<typename __base::iterator> iterator;
1707 typedef __map_const_iterator<typename __base::const_iterator> const_iterator;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001708 typedef _VSTD::reverse_iterator<iterator> reverse_iterator;
1709 typedef _VSTD::reverse_iterator<const_iterator> const_reverse_iterator;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001710
Erik Pilkingtonc37a3d82018-08-01 01:33:38 +00001711#if _LIBCPP_STD_VER > 14
1712 typedef __map_node_handle<typename __base::__node, allocator_type> node_type;
1713#endif
1714
Erik Pilkington82a65ad2018-10-31 17:31:35 +00001715 template <class _Key2, class _Value2, class _Comp2, class _Alloc2>
1716 friend class _LIBCPP_TEMPLATE_VIS map;
1717 template <class _Key2, class _Value2, class _Comp2, class _Alloc2>
1718 friend class _LIBCPP_TEMPLATE_VIS multimap;
1719
Howard Hinnant756c69b2010-09-22 16:48:34 +00001720 _LIBCPP_INLINE_VISIBILITY
Marshall Clow7086a5a2014-03-10 04:50:10 +00001721 multimap()
1722 _NOEXCEPT_(
1723 is_nothrow_default_constructible<allocator_type>::value &&
1724 is_nothrow_default_constructible<key_compare>::value &&
1725 is_nothrow_copy_constructible<key_compare>::value)
1726 : __tree_(__vc(key_compare())) {}
1727
1728 _LIBCPP_INLINE_VISIBILITY
1729 explicit multimap(const key_compare& __comp)
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001730 _NOEXCEPT_(
1731 is_nothrow_default_constructible<allocator_type>::value &&
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001732 is_nothrow_copy_constructible<key_compare>::value)
Howard Hinnantc51e1022010-05-11 19:42:16 +00001733 : __tree_(__vc(__comp)) {}
1734
Howard Hinnant756c69b2010-09-22 16:48:34 +00001735 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001736 explicit multimap(const key_compare& __comp, const allocator_type& __a)
Marshall Clow657cbc42016-08-17 05:58:40 +00001737 : __tree_(__vc(__comp), typename __base::allocator_type(__a)) {}
Howard Hinnantc51e1022010-05-11 19:42:16 +00001738
1739 template <class _InputIterator>
Howard Hinnant756c69b2010-09-22 16:48:34 +00001740 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001741 multimap(_InputIterator __f, _InputIterator __l,
1742 const key_compare& __comp = key_compare())
1743 : __tree_(__vc(__comp))
1744 {
1745 insert(__f, __l);
1746 }
1747
1748 template <class _InputIterator>
Howard Hinnant756c69b2010-09-22 16:48:34 +00001749 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001750 multimap(_InputIterator __f, _InputIterator __l,
1751 const key_compare& __comp, const allocator_type& __a)
Marshall Clow657cbc42016-08-17 05:58:40 +00001752 : __tree_(__vc(__comp), typename __base::allocator_type(__a))
Howard Hinnantc51e1022010-05-11 19:42:16 +00001753 {
1754 insert(__f, __l);
1755 }
1756
Marshall Clow300abfb2013-09-11 01:15:47 +00001757#if _LIBCPP_STD_VER > 11
1758 template <class _InputIterator>
Eric Fiseliercf8c0212017-01-05 06:06:18 +00001759 _LIBCPP_INLINE_VISIBILITY
Marshall Clow300abfb2013-09-11 01:15:47 +00001760 multimap(_InputIterator __f, _InputIterator __l, const allocator_type& __a)
1761 : multimap(__f, __l, key_compare(), __a) {}
1762#endif
1763
Howard Hinnant756c69b2010-09-22 16:48:34 +00001764 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001765 multimap(const multimap& __m)
1766 : __tree_(__m.__tree_.value_comp(),
1767 __alloc_traits::select_on_container_copy_construction(__m.__tree_.__alloc()))
1768 {
1769 insert(__m.begin(), __m.end());
1770 }
1771
Howard Hinnantd3a657f2011-07-01 19:24:36 +00001772 _LIBCPP_INLINE_VISIBILITY
1773 multimap& operator=(const multimap& __m)
1774 {
Marshall Clow476d3f42016-07-18 13:19:00 +00001775#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantd3a657f2011-07-01 19:24:36 +00001776 __tree_ = __m.__tree_;
Howard Hinnant2d0046b2013-06-19 21:29:40 +00001777#else
Marshall Clowdb3cfcb2014-02-08 04:03:14 +00001778 if (this != &__m) {
1779 __tree_.clear();
1780 __tree_.value_comp() = __m.__tree_.value_comp();
1781 __tree_.__copy_assign_alloc(__m.__tree_);
1782 insert(__m.begin(), __m.end());
1783 }
Howard Hinnant2d0046b2013-06-19 21:29:40 +00001784#endif
Howard Hinnantd3a657f2011-07-01 19:24:36 +00001785 return *this;
1786 }
1787
Eric Fiseliera85b1282017-04-18 21:08:06 +00001788#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00001789
Howard Hinnant756c69b2010-09-22 16:48:34 +00001790 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001791 multimap(multimap&& __m)
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001792 _NOEXCEPT_(is_nothrow_move_constructible<__base>::value)
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001793 : __tree_(_VSTD::move(__m.__tree_))
Howard Hinnantc51e1022010-05-11 19:42:16 +00001794 {
1795 }
1796
1797 multimap(multimap&& __m, const allocator_type& __a);
1798
Howard Hinnant756c69b2010-09-22 16:48:34 +00001799 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant33711792011-08-12 21:56:02 +00001800 multimap& operator=(multimap&& __m)
1801 _NOEXCEPT_(is_nothrow_move_assignable<__base>::value)
1802 {
1803 __tree_ = _VSTD::move(__m.__tree_);
1804 return *this;
1805 }
1806
Howard Hinnant33711792011-08-12 21:56:02 +00001807 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001808 multimap(initializer_list<value_type> __il, const key_compare& __comp = key_compare())
1809 : __tree_(__vc(__comp))
1810 {
1811 insert(__il.begin(), __il.end());
1812 }
1813
Howard Hinnant756c69b2010-09-22 16:48:34 +00001814 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001815 multimap(initializer_list<value_type> __il, const key_compare& __comp, const allocator_type& __a)
Marshall Clow657cbc42016-08-17 05:58:40 +00001816 : __tree_(__vc(__comp), typename __base::allocator_type(__a))
Howard Hinnantc51e1022010-05-11 19:42:16 +00001817 {
1818 insert(__il.begin(), __il.end());
1819 }
1820
Marshall Clow300abfb2013-09-11 01:15:47 +00001821#if _LIBCPP_STD_VER > 11
Eric Fiseliercf8c0212017-01-05 06:06:18 +00001822 _LIBCPP_INLINE_VISIBILITY
Marshall Clow300abfb2013-09-11 01:15:47 +00001823 multimap(initializer_list<value_type> __il, const allocator_type& __a)
1824 : multimap(__il, key_compare(), __a) {}
1825#endif
1826
Howard Hinnant756c69b2010-09-22 16:48:34 +00001827 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001828 multimap& operator=(initializer_list<value_type> __il)
1829 {
1830 __tree_.__assign_multi(__il.begin(), __il.end());
1831 return *this;
1832 }
Howard Hinnant33711792011-08-12 21:56:02 +00001833
Eric Fiseliera85b1282017-04-18 21:08:06 +00001834#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00001835
Howard Hinnant756c69b2010-09-22 16:48:34 +00001836 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001837 explicit multimap(const allocator_type& __a)
Marshall Clow657cbc42016-08-17 05:58:40 +00001838 : __tree_(typename __base::allocator_type(__a))
Howard Hinnantc51e1022010-05-11 19:42:16 +00001839 {
1840 }
1841
Howard Hinnant756c69b2010-09-22 16:48:34 +00001842 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001843 multimap(const multimap& __m, const allocator_type& __a)
Marshall Clow657cbc42016-08-17 05:58:40 +00001844 : __tree_(__m.__tree_.value_comp(), typename __base::allocator_type(__a))
Howard Hinnantc51e1022010-05-11 19:42:16 +00001845 {
1846 insert(__m.begin(), __m.end());
1847 }
1848
Howard Hinnant756c69b2010-09-22 16:48:34 +00001849 _LIBCPP_INLINE_VISIBILITY
Louis Dionne69c42c02019-04-11 16:14:56 +00001850 ~multimap() {
1851 static_assert(sizeof(__diagnose_non_const_comparator<_Key, _Compare>()), "");
1852 }
1853
1854 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001855 iterator begin() _NOEXCEPT {return __tree_.begin();}
Howard Hinnant756c69b2010-09-22 16:48:34 +00001856 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001857 const_iterator begin() const _NOEXCEPT {return __tree_.begin();}
Howard Hinnant756c69b2010-09-22 16:48:34 +00001858 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001859 iterator end() _NOEXCEPT {return __tree_.end();}
Howard Hinnant756c69b2010-09-22 16:48:34 +00001860 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001861 const_iterator end() const _NOEXCEPT {return __tree_.end();}
Howard Hinnantc51e1022010-05-11 19:42:16 +00001862
Howard Hinnant756c69b2010-09-22 16:48:34 +00001863 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001864 reverse_iterator rbegin() _NOEXCEPT {return reverse_iterator(end());}
Howard Hinnant756c69b2010-09-22 16:48:34 +00001865 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001866 const_reverse_iterator rbegin() const _NOEXCEPT
1867 {return const_reverse_iterator(end());}
Howard Hinnant756c69b2010-09-22 16:48:34 +00001868 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001869 reverse_iterator rend() _NOEXCEPT {return reverse_iterator(begin());}
Howard Hinnant756c69b2010-09-22 16:48:34 +00001870 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001871 const_reverse_iterator rend() const _NOEXCEPT
1872 {return const_reverse_iterator(begin());}
Howard Hinnantc51e1022010-05-11 19:42:16 +00001873
Howard Hinnant756c69b2010-09-22 16:48:34 +00001874 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001875 const_iterator cbegin() const _NOEXCEPT {return begin();}
Howard Hinnant756c69b2010-09-22 16:48:34 +00001876 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001877 const_iterator cend() const _NOEXCEPT {return end();}
Howard Hinnant756c69b2010-09-22 16:48:34 +00001878 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001879 const_reverse_iterator crbegin() const _NOEXCEPT {return rbegin();}
Howard Hinnant756c69b2010-09-22 16:48:34 +00001880 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001881 const_reverse_iterator crend() const _NOEXCEPT {return rend();}
Howard Hinnantc51e1022010-05-11 19:42:16 +00001882
Marshall Clow425f5752017-11-15 05:51:26 +00001883 _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001884 bool empty() const _NOEXCEPT {return __tree_.size() == 0;}
Howard Hinnant756c69b2010-09-22 16:48:34 +00001885 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001886 size_type size() const _NOEXCEPT {return __tree_.size();}
Howard Hinnant756c69b2010-09-22 16:48:34 +00001887 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001888 size_type max_size() const _NOEXCEPT {return __tree_.max_size();}
Howard Hinnantc51e1022010-05-11 19:42:16 +00001889
Howard Hinnant756c69b2010-09-22 16:48:34 +00001890 _LIBCPP_INLINE_VISIBILITY
Marshall Clow657cbc42016-08-17 05:58:40 +00001891 allocator_type get_allocator() const _NOEXCEPT {return allocator_type(__tree_.__alloc());}
Howard Hinnant756c69b2010-09-22 16:48:34 +00001892 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001893 key_compare key_comp() const {return __tree_.value_comp().key_comp();}
Howard Hinnant756c69b2010-09-22 16:48:34 +00001894 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00001895 value_compare value_comp() const
1896 {return value_compare(__tree_.value_comp().key_comp());}
Howard Hinnantc51e1022010-05-11 19:42:16 +00001897
Eric Fiselierd06276b2016-03-31 02:15:15 +00001898#ifndef _LIBCPP_CXX03_LANG
Howard Hinnant74279a52010-09-04 23:28:19 +00001899
Howard Hinnant29eb9b82012-05-25 22:04:21 +00001900 template <class ..._Args>
Eric Fiselierd06276b2016-03-31 02:15:15 +00001901 _LIBCPP_INLINE_VISIBILITY
1902 iterator emplace(_Args&& ...__args) {
1903 return __tree_.__emplace_multi(_VSTD::forward<_Args>(__args)...);
1904 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00001905
Howard Hinnant29eb9b82012-05-25 22:04:21 +00001906 template <class ..._Args>
Eric Fiselierd06276b2016-03-31 02:15:15 +00001907 _LIBCPP_INLINE_VISIBILITY
1908 iterator emplace_hint(const_iterator __p, _Args&& ...__args) {
1909 return __tree_.__emplace_hint_multi(__p.__i_, _VSTD::forward<_Args>(__args)...);
1910 }
Howard Hinnant74279a52010-09-04 23:28:19 +00001911
Howard Hinnantc834c512011-11-29 18:15:50 +00001912 template <class _Pp,
1913 class = typename enable_if<is_constructible<value_type, _Pp>::value>::type>
Howard Hinnant756c69b2010-09-22 16:48:34 +00001914 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc834c512011-11-29 18:15:50 +00001915 iterator insert(_Pp&& __p)
1916 {return __tree_.__insert_multi(_VSTD::forward<_Pp>(__p));}
Howard Hinnantc51e1022010-05-11 19:42:16 +00001917
Howard Hinnantc834c512011-11-29 18:15:50 +00001918 template <class _Pp,
1919 class = typename enable_if<is_constructible<value_type, _Pp>::value>::type>
Howard Hinnant756c69b2010-09-22 16:48:34 +00001920 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc834c512011-11-29 18:15:50 +00001921 iterator insert(const_iterator __pos, _Pp&& __p)
1922 {return __tree_.__insert_multi(__pos.__i_, _VSTD::forward<_Pp>(__p));}
Howard Hinnantc51e1022010-05-11 19:42:16 +00001923
Eric Fiselierd6143132016-04-18 01:40:45 +00001924 _LIBCPP_INLINE_VISIBILITY
1925 iterator insert(value_type&& __v)
1926 {return __tree_.__insert_multi(_VSTD::move(__v));}
1927
1928 _LIBCPP_INLINE_VISIBILITY
1929 iterator insert(const_iterator __p, value_type&& __v)
1930 {return __tree_.__insert_multi(__p.__i_, _VSTD::move(__v));}
1931
Eric Fiseliera85b1282017-04-18 21:08:06 +00001932
1933 _LIBCPP_INLINE_VISIBILITY
1934 void insert(initializer_list<value_type> __il)
1935 {insert(__il.begin(), __il.end());}
1936
Eric Fiselierd06276b2016-03-31 02:15:15 +00001937#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00001938
Howard Hinnant756c69b2010-09-22 16:48:34 +00001939 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001940 iterator insert(const value_type& __v) {return __tree_.__insert_multi(__v);}
1941
Howard Hinnant756c69b2010-09-22 16:48:34 +00001942 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001943 iterator insert(const_iterator __p, const value_type& __v)
1944 {return __tree_.__insert_multi(__p.__i_, __v);}
1945
1946 template <class _InputIterator>
Howard Hinnant756c69b2010-09-22 16:48:34 +00001947 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001948 void insert(_InputIterator __f, _InputIterator __l)
1949 {
1950 for (const_iterator __e = cend(); __f != __l; ++__f)
1951 __tree_.__insert_multi(__e.__i_, *__f);
1952 }
1953
Howard Hinnant756c69b2010-09-22 16:48:34 +00001954 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001955 iterator erase(const_iterator __p) {return __tree_.erase(__p.__i_);}
Howard Hinnant756c69b2010-09-22 16:48:34 +00001956 _LIBCPP_INLINE_VISIBILITY
Marshall Clow22ea5b82015-05-10 13:35:00 +00001957 iterator erase(iterator __p) {return __tree_.erase(__p.__i_);}
1958 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001959 size_type erase(const key_type& __k) {return __tree_.__erase_multi(__k);}
Howard Hinnant756c69b2010-09-22 16:48:34 +00001960 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001961 iterator erase(const_iterator __f, const_iterator __l)
1962 {return __tree_.erase(__f.__i_, __l.__i_);}
Erik Pilkingtonc37a3d82018-08-01 01:33:38 +00001963
1964#if _LIBCPP_STD_VER > 14
1965 _LIBCPP_INLINE_VISIBILITY
1966 iterator insert(node_type&& __nh)
1967 {
1968 _LIBCPP_ASSERT(__nh.empty() || __nh.get_allocator() == get_allocator(),
1969 "node_type with incompatible allocator passed to multimap::insert()");
1970 return __tree_.template __node_handle_insert_multi<node_type>(
1971 _VSTD::move(__nh));
1972 }
1973 _LIBCPP_INLINE_VISIBILITY
1974 iterator insert(const_iterator __hint, node_type&& __nh)
1975 {
1976 _LIBCPP_ASSERT(__nh.empty() || __nh.get_allocator() == get_allocator(),
1977 "node_type with incompatible allocator passed to multimap::insert()");
1978 return __tree_.template __node_handle_insert_multi<node_type>(
1979 __hint.__i_, _VSTD::move(__nh));
1980 }
1981 _LIBCPP_INLINE_VISIBILITY
1982 node_type extract(key_type const& __key)
1983 {
1984 return __tree_.template __node_handle_extract<node_type>(__key);
1985 }
1986 _LIBCPP_INLINE_VISIBILITY
1987 node_type extract(const_iterator __it)
1988 {
1989 return __tree_.template __node_handle_extract<node_type>(
1990 __it.__i_);
1991 }
Louis Dionned2322c82018-11-01 14:41:37 +00001992 template <class _Compare2>
Erik Pilkington82a65ad2018-10-31 17:31:35 +00001993 _LIBCPP_INLINE_VISIBILITY
Louis Dionned2322c82018-11-01 14:41:37 +00001994 void merge(multimap<key_type, mapped_type, _Compare2, allocator_type>& __source)
Erik Pilkington82a65ad2018-10-31 17:31:35 +00001995 {
1996 _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
1997 "merging container with incompatible allocator");
1998 return __tree_.__node_handle_merge_multi(__source.__tree_);
1999 }
Louis Dionned2322c82018-11-01 14:41:37 +00002000 template <class _Compare2>
Erik Pilkington82a65ad2018-10-31 17:31:35 +00002001 _LIBCPP_INLINE_VISIBILITY
Louis Dionned2322c82018-11-01 14:41:37 +00002002 void merge(multimap<key_type, mapped_type, _Compare2, allocator_type>&& __source)
Erik Pilkington82a65ad2018-10-31 17:31:35 +00002003 {
2004 _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
2005 "merging container with incompatible allocator");
2006 return __tree_.__node_handle_merge_multi(__source.__tree_);
2007 }
Louis Dionned2322c82018-11-01 14:41:37 +00002008 template <class _Compare2>
Erik Pilkington82a65ad2018-10-31 17:31:35 +00002009 _LIBCPP_INLINE_VISIBILITY
Louis Dionned2322c82018-11-01 14:41:37 +00002010 void merge(map<key_type, mapped_type, _Compare2, allocator_type>& __source)
Erik Pilkington82a65ad2018-10-31 17:31:35 +00002011 {
2012 _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
2013 "merging container with incompatible allocator");
2014 return __tree_.__node_handle_merge_multi(__source.__tree_);
2015 }
Louis Dionned2322c82018-11-01 14:41:37 +00002016 template <class _Compare2>
Erik Pilkington82a65ad2018-10-31 17:31:35 +00002017 _LIBCPP_INLINE_VISIBILITY
Louis Dionned2322c82018-11-01 14:41:37 +00002018 void merge(map<key_type, mapped_type, _Compare2, allocator_type>&& __source)
Erik Pilkington82a65ad2018-10-31 17:31:35 +00002019 {
2020 _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
2021 "merging container with incompatible allocator");
2022 return __tree_.__node_handle_merge_multi(__source.__tree_);
2023 }
Erik Pilkingtonc37a3d82018-08-01 01:33:38 +00002024#endif
2025
Howard Hinnant756c69b2010-09-22 16:48:34 +00002026 _LIBCPP_INLINE_VISIBILITY
Marshall Clowde1312a2018-08-22 04:28:43 +00002027 void clear() _NOEXCEPT {__tree_.clear();}
Howard Hinnantc51e1022010-05-11 19:42:16 +00002028
Howard Hinnant756c69b2010-09-22 16:48:34 +00002029 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00002030 void swap(multimap& __m)
2031 _NOEXCEPT_(__is_nothrow_swappable<__base>::value)
2032 {__tree_.swap(__m.__tree_);}
Howard Hinnantc51e1022010-05-11 19:42:16 +00002033
Howard Hinnant756c69b2010-09-22 16:48:34 +00002034 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002035 iterator find(const key_type& __k) {return __tree_.find(__k);}
Howard Hinnant756c69b2010-09-22 16:48:34 +00002036 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002037 const_iterator find(const key_type& __k) const {return __tree_.find(__k);}
Marshall Clowebb57322013-08-13 22:18:47 +00002038#if _LIBCPP_STD_VER > 11
2039 template <typename _K2>
2040 _LIBCPP_INLINE_VISIBILITY
2041 typename enable_if<__is_transparent<_Compare, _K2>::value,iterator>::type
2042 find(const _K2& __k) {return __tree_.find(__k);}
2043 template <typename _K2>
2044 _LIBCPP_INLINE_VISIBILITY
2045 typename enable_if<__is_transparent<_Compare, _K2>::value,const_iterator>::type
2046 find(const _K2& __k) const {return __tree_.find(__k);}
2047#endif
2048
Howard Hinnant756c69b2010-09-22 16:48:34 +00002049 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002050 size_type count(const key_type& __k) const
2051 {return __tree_.__count_multi(__k);}
Marshall Clowe6a5f522014-08-24 23:54:16 +00002052#if _LIBCPP_STD_VER > 11
2053 template <typename _K2>
2054 _LIBCPP_INLINE_VISIBILITY
2055 typename enable_if<__is_transparent<_Compare, _K2>::value,size_type>::type
Marshall Clow141e47b2015-06-30 18:15:41 +00002056 count(const _K2& __k) const {return __tree_.__count_multi(__k);}
Marshall Clowe6a5f522014-08-24 23:54:16 +00002057#endif
Howard Hinnant756c69b2010-09-22 16:48:34 +00002058 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002059 iterator lower_bound(const key_type& __k)
2060 {return __tree_.lower_bound(__k);}
Howard Hinnant756c69b2010-09-22 16:48:34 +00002061 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002062 const_iterator lower_bound(const key_type& __k) const
2063 {return __tree_.lower_bound(__k);}
Marshall Clowebb57322013-08-13 22:18:47 +00002064#if _LIBCPP_STD_VER > 11
2065 template <typename _K2>
2066 _LIBCPP_INLINE_VISIBILITY
2067 typename enable_if<__is_transparent<_Compare, _K2>::value,iterator>::type
2068 lower_bound(const _K2& __k) {return __tree_.lower_bound(__k);}
2069
2070 template <typename _K2>
2071 _LIBCPP_INLINE_VISIBILITY
2072 typename enable_if<__is_transparent<_Compare, _K2>::value,const_iterator>::type
2073 lower_bound(const _K2& __k) const {return __tree_.lower_bound(__k);}
2074#endif
2075
Howard Hinnant756c69b2010-09-22 16:48:34 +00002076 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002077 iterator upper_bound(const key_type& __k)
2078 {return __tree_.upper_bound(__k);}
Howard Hinnant756c69b2010-09-22 16:48:34 +00002079 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002080 const_iterator upper_bound(const key_type& __k) const
2081 {return __tree_.upper_bound(__k);}
Marshall Clowebb57322013-08-13 22:18:47 +00002082#if _LIBCPP_STD_VER > 11
2083 template <typename _K2>
2084 _LIBCPP_INLINE_VISIBILITY
2085 typename enable_if<__is_transparent<_Compare, _K2>::value,iterator>::type
2086 upper_bound(const _K2& __k) {return __tree_.upper_bound(__k);}
2087 template <typename _K2>
2088 _LIBCPP_INLINE_VISIBILITY
2089 typename enable_if<__is_transparent<_Compare, _K2>::value,const_iterator>::type
2090 upper_bound(const _K2& __k) const {return __tree_.upper_bound(__k);}
2091#endif
2092
Howard Hinnant756c69b2010-09-22 16:48:34 +00002093 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002094 pair<iterator,iterator> equal_range(const key_type& __k)
2095 {return __tree_.__equal_range_multi(__k);}
Howard Hinnant756c69b2010-09-22 16:48:34 +00002096 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002097 pair<const_iterator,const_iterator> equal_range(const key_type& __k) const
2098 {return __tree_.__equal_range_multi(__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,pair<iterator,iterator>>::type
2103 equal_range(const _K2& __k) {return __tree_.__equal_range_multi(__k);}
2104 template <typename _K2>
2105 _LIBCPP_INLINE_VISIBILITY
2106 typename enable_if<__is_transparent<_Compare, _K2>::value,pair<const_iterator,const_iterator>>::type
2107 equal_range(const _K2& __k) const {return __tree_.__equal_range_multi(__k);}
2108#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00002109
2110private:
2111 typedef typename __base::__node __node;
2112 typedef typename __base::__node_allocator __node_allocator;
2113 typedef typename __base::__node_pointer __node_pointer;
Eric Fiseliera92b0732016-02-20 07:12:17 +00002114
Howard Hinnantc834c512011-11-29 18:15:50 +00002115 typedef __map_node_destructor<__node_allocator> _Dp;
2116 typedef unique_ptr<__node, _Dp> __node_holder;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002117};
2118
Louis Dionned23a5f22019-06-20 19:32:00 +00002119#ifndef _LIBCPP_HAS_NO_DEDUCTION_GUIDES
2120template<class _InputIterator, class _Compare = less<__iter_key_type<_InputIterator>>,
2121 class _Allocator = allocator<__iter_to_alloc_type<_InputIterator>>,
2122 class = enable_if_t<!__is_allocator<_Compare>::value, void>,
2123 class = enable_if_t<__is_allocator<_Allocator>::value, void>>
2124multimap(_InputIterator, _InputIterator, _Compare = _Compare(), _Allocator = _Allocator())
2125 -> multimap<__iter_key_type<_InputIterator>, __iter_mapped_type<_InputIterator>, _Compare, _Allocator>;
2126
2127template<class _Key, class _Tp, class _Compare = less<remove_const_t<_Key>>,
2128 class _Allocator = allocator<pair<const _Key, _Tp>>,
2129 class = enable_if_t<!__is_allocator<_Compare>::value, void>,
2130 class = enable_if_t<__is_allocator<_Allocator>::value, void>>
2131multimap(initializer_list<pair<_Key, _Tp>>, _Compare = _Compare(), _Allocator = _Allocator())
2132 -> multimap<remove_const_t<_Key>, _Tp, _Compare, _Allocator>;
2133
2134template<class _InputIterator, class _Allocator,
2135 class = enable_if_t<__is_allocator<_Allocator>::value, void>>
2136multimap(_InputIterator, _InputIterator, _Allocator)
2137 -> multimap<__iter_key_type<_InputIterator>, __iter_mapped_type<_InputIterator>,
2138 less<__iter_key_type<_InputIterator>>, _Allocator>;
2139
2140template<class _Key, class _Tp, class _Allocator,
2141 class = enable_if_t<__is_allocator<_Allocator>::value, void>>
2142multimap(initializer_list<pair<_Key, _Tp>>, _Allocator)
2143 -> multimap<remove_const_t<_Key>, _Tp, less<remove_const_t<_Key>>, _Allocator>;
2144#endif
2145
Eric Fiselierd06276b2016-03-31 02:15:15 +00002146#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00002147template <class _Key, class _Tp, class _Compare, class _Allocator>
2148multimap<_Key, _Tp, _Compare, _Allocator>::multimap(multimap&& __m, const allocator_type& __a)
Marshall Clow657cbc42016-08-17 05:58:40 +00002149 : __tree_(_VSTD::move(__m.__tree_), typename __base::allocator_type(__a))
Howard Hinnantc51e1022010-05-11 19:42:16 +00002150{
2151 if (__a != __m.get_allocator())
2152 {
2153 const_iterator __e = cend();
2154 while (!__m.empty())
2155 __tree_.__insert_multi(__e.__i_,
Erik Pilkingtond3fe2992018-06-04 20:38:23 +00002156 _VSTD::move(__m.__tree_.remove(__m.begin().__i_)->__value_.__move()));
Howard Hinnantc51e1022010-05-11 19:42:16 +00002157 }
2158}
Eric Fiselierd06276b2016-03-31 02:15:15 +00002159#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +00002160
2161template <class _Key, class _Tp, class _Compare, class _Allocator>
Howard Hinnant756c69b2010-09-22 16:48:34 +00002162inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002163bool
2164operator==(const multimap<_Key, _Tp, _Compare, _Allocator>& __x,
2165 const multimap<_Key, _Tp, _Compare, _Allocator>& __y)
2166{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00002167 return __x.size() == __y.size() && _VSTD::equal(__x.begin(), __x.end(), __y.begin());
Howard Hinnantc51e1022010-05-11 19:42:16 +00002168}
2169
2170template <class _Key, class _Tp, class _Compare, class _Allocator>
Howard Hinnant756c69b2010-09-22 16:48:34 +00002171inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002172bool
2173operator< (const multimap<_Key, _Tp, _Compare, _Allocator>& __x,
2174 const multimap<_Key, _Tp, _Compare, _Allocator>& __y)
2175{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00002176 return _VSTD::lexicographical_compare(__x.begin(), __x.end(), __y.begin(), __y.end());
Howard Hinnantc51e1022010-05-11 19:42:16 +00002177}
2178
2179template <class _Key, class _Tp, class _Compare, class _Allocator>
Howard Hinnant756c69b2010-09-22 16:48:34 +00002180inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002181bool
2182operator!=(const multimap<_Key, _Tp, _Compare, _Allocator>& __x,
2183 const multimap<_Key, _Tp, _Compare, _Allocator>& __y)
2184{
2185 return !(__x == __y);
2186}
2187
2188template <class _Key, class _Tp, class _Compare, class _Allocator>
Howard Hinnant756c69b2010-09-22 16:48:34 +00002189inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002190bool
2191operator> (const multimap<_Key, _Tp, _Compare, _Allocator>& __x,
2192 const multimap<_Key, _Tp, _Compare, _Allocator>& __y)
2193{
2194 return __y < __x;
2195}
2196
2197template <class _Key, class _Tp, class _Compare, class _Allocator>
Howard Hinnant756c69b2010-09-22 16:48:34 +00002198inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002199bool
2200operator>=(const multimap<_Key, _Tp, _Compare, _Allocator>& __x,
2201 const multimap<_Key, _Tp, _Compare, _Allocator>& __y)
2202{
2203 return !(__x < __y);
2204}
2205
2206template <class _Key, class _Tp, class _Compare, class _Allocator>
Howard Hinnant756c69b2010-09-22 16:48:34 +00002207inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002208bool
2209operator<=(const multimap<_Key, _Tp, _Compare, _Allocator>& __x,
2210 const multimap<_Key, _Tp, _Compare, _Allocator>& __y)
2211{
2212 return !(__y < __x);
2213}
2214
2215template <class _Key, class _Tp, class _Compare, class _Allocator>
Howard Hinnant756c69b2010-09-22 16:48:34 +00002216inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002217void
2218swap(multimap<_Key, _Tp, _Compare, _Allocator>& __x,
2219 multimap<_Key, _Tp, _Compare, _Allocator>& __y)
Howard Hinnant2f1ea9c2011-06-04 14:31:57 +00002220 _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
Howard Hinnantc51e1022010-05-11 19:42:16 +00002221{
2222 __x.swap(__y);
2223}
2224
Marshall Clow29b53f22018-12-14 18:49:35 +00002225#if _LIBCPP_STD_VER > 17
2226template <class _Key, class _Tp, class _Compare, class _Allocator, class _Predicate>
2227inline _LIBCPP_INLINE_VISIBILITY
2228void erase_if(multimap<_Key, _Tp, _Compare, _Allocator>& __c, _Predicate __pred)
2229{ __libcpp_erase_if_container(__c, __pred); }
2230#endif
2231
Howard Hinnantc51e1022010-05-11 19:42:16 +00002232_LIBCPP_END_NAMESPACE_STD
2233
2234#endif // _LIBCPP_MAP