blob: 22d794da547af6a2c204376a3701d59344a319e5 [file] [log] [blame]
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001// -*- C++ -*-
2//===---------------------------- set -------------------------------------===//
3//
Howard Hinnantf5256e12010-05-11 21:36:01 +00004// The LLVM Compiler Infrastructure
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005//
Howard Hinnantb64f8b02010-11-16 22:09:02 +00006// This file is dual licensed under the MIT and the University of Illinois Open
7// Source Licenses. See LICENSE.TXT for details.
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00008//
9//===----------------------------------------------------------------------===//
10
11#ifndef _LIBCPP_SET
12#define _LIBCPP_SET
13
14/*
15
16 set synopsis
17
18namespace std
19{
20
21template <class Key, class Compare = less<Key>,
22 class Allocator = allocator<Key>>
23class set
24{
25public:
26 // types:
27 typedef Key key_type;
28 typedef key_type value_type;
29 typedef Compare key_compare;
30 typedef key_compare value_compare;
31 typedef Allocator allocator_type;
32 typedef typename allocator_type::reference reference;
33 typedef typename allocator_type::const_reference const_reference;
34 typedef typename allocator_type::size_type size_type;
35 typedef typename allocator_type::difference_type difference_type;
36 typedef typename allocator_type::pointer pointer;
37 typedef typename allocator_type::const_pointer const_pointer;
38
39 typedef implementation-defined iterator;
40 typedef implementation-defined const_iterator;
41 typedef std::reverse_iterator<iterator> reverse_iterator;
42 typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
43
44 // construct/copy/destroy:
Howard Hinnantb2e2a8f2011-06-04 15:22:34 +000045 set()
46 noexcept(
47 is_nothrow_default_constructible<allocator_type>::value &&
48 is_nothrow_default_constructible<key_compare>::value &&
49 is_nothrow_copy_constructible<key_compare>::value);
50 explicit set(const value_compare& comp);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +000051 set(const value_compare& comp, const allocator_type& a);
52 template <class InputIterator>
53 set(InputIterator first, InputIterator last,
54 const value_compare& comp = value_compare());
55 template <class InputIterator>
56 set(InputIterator first, InputIterator last, const value_compare& comp,
57 const allocator_type& a);
58 set(const set& s);
Howard Hinnantb2e2a8f2011-06-04 15:22:34 +000059 set(set&& s)
60 noexcept(
61 is_nothrow_move_constructible<allocator_type>::value &&
62 is_nothrow_move_constructible<key_compare>::value);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +000063 explicit set(const allocator_type& a);
64 set(const set& s, const allocator_type& a);
65 set(set&& s, const allocator_type& a);
66 set(initializer_list<value_type> il, const value_compare& comp = value_compare());
67 set(initializer_list<value_type> il, const value_compare& comp,
68 const allocator_type& a);
Marshall Clow24a7e332013-09-11 00:06:45 +000069 template <class InputIterator>
70 set(InputIterator first, InputIterator last, const allocator_type& a)
71 : set(first, last, Compare(), a) {} // C++14
72 set(initializer_list<value_type> il, const allocator_type& a)
73 : set(il, Compare(), a) {} // C++14
Howard Hinnantbc8d3f92010-05-11 19:42:16 +000074 ~set();
75
76 set& operator=(const set& s);
Howard Hinnantb2e2a8f2011-06-04 15:22:34 +000077 set& operator=(set&& s)
78 noexcept(
79 allocator_type::propagate_on_container_move_assignment::value &&
80 is_nothrow_move_assignable<allocator_type>::value &&
81 is_nothrow_move_assignable<key_compare>::value);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +000082 set& operator=(initializer_list<value_type> il);
83
84 // iterators:
Howard Hinnantb2e2a8f2011-06-04 15:22:34 +000085 iterator begin() noexcept;
86 const_iterator begin() const noexcept;
87 iterator end() noexcept;
88 const_iterator end() const noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +000089
Howard Hinnantb2e2a8f2011-06-04 15:22:34 +000090 reverse_iterator rbegin() noexcept;
91 const_reverse_iterator rbegin() const noexcept;
92 reverse_iterator rend() noexcept;
93 const_reverse_iterator rend() const noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +000094
Howard Hinnantb2e2a8f2011-06-04 15:22:34 +000095 const_iterator cbegin() const noexcept;
96 const_iterator cend() const noexcept;
97 const_reverse_iterator crbegin() const noexcept;
98 const_reverse_iterator crend() const noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +000099
100 // capacity:
Howard Hinnantb2e2a8f2011-06-04 15:22:34 +0000101 bool empty() const noexcept;
102 size_type size() const noexcept;
103 size_type max_size() const noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000104
105 // modifiers:
106 template <class... Args>
107 pair<iterator, bool> emplace(Args&&... args);
108 template <class... Args>
109 iterator emplace_hint(const_iterator position, Args&&... args);
110 pair<iterator,bool> insert(const value_type& v);
111 pair<iterator,bool> insert(value_type&& v);
112 iterator insert(const_iterator position, const value_type& v);
113 iterator insert(const_iterator position, value_type&& v);
114 template <class InputIterator>
115 void insert(InputIterator first, InputIterator last);
116 void insert(initializer_list<value_type> il);
117
118 iterator erase(const_iterator position);
119 size_type erase(const key_type& k);
120 iterator erase(const_iterator first, const_iterator last);
Howard Hinnantb2e2a8f2011-06-04 15:22:34 +0000121 void clear() noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000122
Howard Hinnantb2e2a8f2011-06-04 15:22:34 +0000123 void swap(set& s)
124 noexcept(
125 __is_nothrow_swappable<key_compare>::value &&
126 (!allocator_type::propagate_on_container_swap::value ||
127 __is_nothrow_swappable<allocator_type>::value));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000128
129 // observers:
Howard Hinnantb2e2a8f2011-06-04 15:22:34 +0000130 allocator_type get_allocator() const noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000131 key_compare key_comp() const;
132 value_compare value_comp() const;
133
134 // set operations:
135 iterator find(const key_type& k);
136 const_iterator find(const key_type& k) const;
Marshall Clow4a0a9812013-08-13 01:11:06 +0000137 template<typename K>
138 iterator find(const K& x);
139 template<typename K>
140 const_iterator find(const K& x) const; // C++14
141 template<typename K>
142 size_type count(const K& x) const; // C++14
143
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000144 size_type count(const key_type& k) const;
145 iterator lower_bound(const key_type& k);
146 const_iterator lower_bound(const key_type& k) const;
Marshall Clow4a0a9812013-08-13 01:11:06 +0000147 template<typename K>
148 iterator lower_bound(const K& x); // C++14
149 template<typename K>
150 const_iterator lower_bound(const K& x) const; // C++14
151
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000152 iterator upper_bound(const key_type& k);
153 const_iterator upper_bound(const key_type& k) const;
Marshall Clow4a0a9812013-08-13 01:11:06 +0000154 template<typename K>
155 iterator upper_bound(const K& x); // C++14
156 template<typename K>
157 const_iterator upper_bound(const K& x) const; // C++14
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000158 pair<iterator,iterator> equal_range(const key_type& k);
159 pair<const_iterator,const_iterator> equal_range(const key_type& k) const;
Marshall Clow4a0a9812013-08-13 01:11:06 +0000160 template<typename K>
161 pair<iterator,iterator> equal_range(const K& x); // C++14
162 template<typename K>
163 pair<const_iterator,const_iterator> equal_range(const K& x) const; // C++14
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000164};
165
166template <class Key, class Compare, class Allocator>
167bool
168operator==(const set<Key, Compare, Allocator>& x,
169 const set<Key, Compare, Allocator>& y);
170
171template <class Key, class Compare, class Allocator>
172bool
173operator< (const set<Key, Compare, Allocator>& x,
174 const set<Key, Compare, Allocator>& y);
175
176template <class Key, class Compare, class Allocator>
177bool
178operator!=(const set<Key, Compare, Allocator>& x,
179 const set<Key, Compare, Allocator>& y);
180
181template <class Key, class Compare, class Allocator>
182bool
183operator> (const set<Key, Compare, Allocator>& x,
184 const set<Key, Compare, Allocator>& y);
185
186template <class Key, class Compare, class Allocator>
187bool
188operator>=(const set<Key, Compare, Allocator>& x,
189 const set<Key, Compare, Allocator>& y);
190
191template <class Key, class Compare, class Allocator>
192bool
193operator<=(const set<Key, Compare, Allocator>& x,
194 const set<Key, Compare, Allocator>& y);
195
196// specialized algorithms:
197template <class Key, class Compare, class Allocator>
198void
Howard Hinnantb2e2a8f2011-06-04 15:22:34 +0000199swap(set<Key, Compare, Allocator>& x, set<Key, Compare, Allocator>& y)
200 noexcept(noexcept(x.swap(y)));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000201
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000202template <class Key, class Compare = less<Key>,
203 class Allocator = allocator<Key>>
204class multiset
205{
206public:
207 // types:
208 typedef Key key_type;
209 typedef key_type value_type;
210 typedef Compare key_compare;
211 typedef key_compare value_compare;
212 typedef Allocator allocator_type;
213 typedef typename allocator_type::reference reference;
214 typedef typename allocator_type::const_reference const_reference;
215 typedef typename allocator_type::size_type size_type;
216 typedef typename allocator_type::difference_type difference_type;
217 typedef typename allocator_type::pointer pointer;
218 typedef typename allocator_type::const_pointer const_pointer;
219
220 typedef implementation-defined iterator;
221 typedef implementation-defined const_iterator;
222 typedef std::reverse_iterator<iterator> reverse_iterator;
223 typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
224
225 // construct/copy/destroy:
Howard Hinnantb2e2a8f2011-06-04 15:22:34 +0000226 multiset()
227 noexcept(
228 is_nothrow_default_constructible<allocator_type>::value &&
229 is_nothrow_default_constructible<key_compare>::value &&
230 is_nothrow_copy_constructible<key_compare>::value);
231 explicit multiset(const value_compare& comp);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000232 multiset(const value_compare& comp, const allocator_type& a);
233 template <class InputIterator>
234 multiset(InputIterator first, InputIterator last,
235 const value_compare& comp = value_compare());
236 template <class InputIterator>
237 multiset(InputIterator first, InputIterator last,
238 const value_compare& comp, const allocator_type& a);
239 multiset(const multiset& s);
Howard Hinnantb2e2a8f2011-06-04 15:22:34 +0000240 multiset(multiset&& s)
241 noexcept(
242 is_nothrow_move_constructible<allocator_type>::value &&
243 is_nothrow_move_constructible<key_compare>::value);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000244 explicit multiset(const allocator_type& a);
245 multiset(const multiset& s, const allocator_type& a);
246 multiset(multiset&& s, const allocator_type& a);
247 multiset(initializer_list<value_type> il, const value_compare& comp = value_compare());
248 multiset(initializer_list<value_type> il, const value_compare& comp,
249 const allocator_type& a);
Marshall Clow24a7e332013-09-11 00:06:45 +0000250 template <class InputIterator>
251 multiset(InputIterator first, InputIterator last, const allocator_type& a)
252 : set(first, last, Compare(), a) {} // C++14
253 multiset(initializer_list<value_type> il, const allocator_type& a)
254 : set(il, Compare(), a) {} // C++14
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000255 ~multiset();
256
257 multiset& operator=(const multiset& s);
Howard Hinnantb2e2a8f2011-06-04 15:22:34 +0000258 multiset& operator=(multiset&& s)
259 noexcept(
260 allocator_type::propagate_on_container_move_assignment::value &&
261 is_nothrow_move_assignable<allocator_type>::value &&
262 is_nothrow_move_assignable<key_compare>::value);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000263 multiset& operator=(initializer_list<value_type> il);
264
265 // iterators:
Howard Hinnantb2e2a8f2011-06-04 15:22:34 +0000266 iterator begin() noexcept;
267 const_iterator begin() const noexcept;
268 iterator end() noexcept;
269 const_iterator end() const noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000270
Howard Hinnantb2e2a8f2011-06-04 15:22:34 +0000271 reverse_iterator rbegin() noexcept;
272 const_reverse_iterator rbegin() const noexcept;
273 reverse_iterator rend() noexcept;
274 const_reverse_iterator rend() const noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000275
Howard Hinnantb2e2a8f2011-06-04 15:22:34 +0000276 const_iterator cbegin() const noexcept;
277 const_iterator cend() const noexcept;
278 const_reverse_iterator crbegin() const noexcept;
279 const_reverse_iterator crend() const noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000280
281 // capacity:
Howard Hinnantb2e2a8f2011-06-04 15:22:34 +0000282 bool empty() const noexcept;
283 size_type size() const noexcept;
284 size_type max_size() const noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000285
286 // modifiers:
287 template <class... Args>
288 iterator emplace(Args&&... args);
289 template <class... Args>
290 iterator emplace_hint(const_iterator position, Args&&... args);
291 iterator insert(const value_type& v);
292 iterator insert(value_type&& v);
293 iterator insert(const_iterator position, const value_type& v);
294 iterator insert(const_iterator position, value_type&& v);
295 template <class InputIterator>
296 void insert(InputIterator first, InputIterator last);
297 void insert(initializer_list<value_type> il);
298
299 iterator erase(const_iterator position);
300 size_type erase(const key_type& k);
301 iterator erase(const_iterator first, const_iterator last);
Howard Hinnantb2e2a8f2011-06-04 15:22:34 +0000302 void clear() noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000303
Howard Hinnantb2e2a8f2011-06-04 15:22:34 +0000304 void swap(multiset& s)
305 noexcept(
306 __is_nothrow_swappable<key_compare>::value &&
307 (!allocator_type::propagate_on_container_swap::value ||
308 __is_nothrow_swappable<allocator_type>::value));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000309
310 // observers:
Howard Hinnantb2e2a8f2011-06-04 15:22:34 +0000311 allocator_type get_allocator() const noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000312 key_compare key_comp() const;
313 value_compare value_comp() const;
314
315 // set operations:
316 iterator find(const key_type& k);
317 const_iterator find(const key_type& k) const;
Marshall Clow4a0a9812013-08-13 01:11:06 +0000318 template<typename K>
319 iterator find(const K& x);
320 template<typename K>
321 const_iterator find(const K& x) const; // C++14
322
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000323 size_type count(const key_type& k) const;
324 iterator lower_bound(const key_type& k);
325 const_iterator lower_bound(const key_type& k) const;
Marshall Clow4a0a9812013-08-13 01:11:06 +0000326 template<typename K>
327 iterator lower_bound(const K& x); // C++14
328 template<typename K>
329 const_iterator lower_bound(const K& x) const; // C++14
330
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000331 iterator upper_bound(const key_type& k);
332 const_iterator upper_bound(const key_type& k) const;
Marshall Clow4a0a9812013-08-13 01:11:06 +0000333 template<typename K>
334 iterator upper_bound(const K& x); // C++14
335 template<typename K>
336 const_iterator upper_bound(const K& x) const; // C++14
337
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000338 pair<iterator,iterator> equal_range(const key_type& k);
339 pair<const_iterator,const_iterator> equal_range(const key_type& k) const;
Marshall Clow4a0a9812013-08-13 01:11:06 +0000340 template<typename K>
341 pair<iterator,iterator> equal_range(const K& x); // C++14
342 template<typename K>
343 pair<const_iterator,const_iterator> equal_range(const K& x) const; // C++14
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000344};
345
346template <class Key, class Compare, class Allocator>
347bool
348operator==(const multiset<Key, Compare, Allocator>& x,
349 const multiset<Key, Compare, Allocator>& y);
350
351template <class Key, class Compare, class Allocator>
352bool
353operator< (const multiset<Key, Compare, Allocator>& x,
354 const multiset<Key, Compare, Allocator>& y);
355
356template <class Key, class Compare, class Allocator>
357bool
358operator!=(const multiset<Key, Compare, Allocator>& x,
359 const multiset<Key, Compare, Allocator>& y);
360
361template <class Key, class Compare, class Allocator>
362bool
363operator> (const multiset<Key, Compare, Allocator>& x,
364 const multiset<Key, Compare, Allocator>& y);
365
366template <class Key, class Compare, class Allocator>
367bool
368operator>=(const multiset<Key, Compare, Allocator>& x,
369 const multiset<Key, Compare, Allocator>& y);
370
371template <class Key, class Compare, class Allocator>
372bool
373operator<=(const multiset<Key, Compare, Allocator>& x,
374 const multiset<Key, Compare, Allocator>& y);
375
376// specialized algorithms:
377template <class Key, class Compare, class Allocator>
378void
Howard Hinnantb2e2a8f2011-06-04 15:22:34 +0000379swap(multiset<Key, Compare, Allocator>& x, multiset<Key, Compare, Allocator>& y)
380 noexcept(noexcept(x.swap(y)));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000381
382} // std
383
384*/
385
386#include <__config>
387#include <__tree>
388#include <functional>
389
Howard Hinnant08e17472011-10-17 20:05:10 +0000390#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000391#pragma GCC system_header
Howard Hinnant08e17472011-10-17 20:05:10 +0000392#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000393
394_LIBCPP_BEGIN_NAMESPACE_STD
395
396template <class _Key, class _Compare = less<_Key>,
397 class _Allocator = allocator<_Key> >
Howard Hinnant0f678bd2013-08-12 18:38:34 +0000398class _LIBCPP_TYPE_VIS_ONLY set
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000399{
400public:
401 // types:
402 typedef _Key key_type;
403 typedef key_type value_type;
404 typedef _Compare key_compare;
405 typedef key_compare value_compare;
406 typedef _Allocator allocator_type;
407 typedef value_type& reference;
408 typedef const value_type& const_reference;
409
410private:
411 typedef __tree<value_type, value_compare, allocator_type> __base;
412 typedef allocator_traits<allocator_type> __alloc_traits;
413 typedef typename __base::__node_holder __node_holder;
414
415 __base __tree_;
416
417public:
418 typedef typename __base::pointer pointer;
419 typedef typename __base::const_pointer const_pointer;
420 typedef typename __base::size_type size_type;
421 typedef typename __base::difference_type difference_type;
422 typedef typename __base::const_iterator iterator;
423 typedef typename __base::const_iterator const_iterator;
Howard Hinnant0949eed2011-06-30 21:18:19 +0000424 typedef _VSTD::reverse_iterator<iterator> reverse_iterator;
425 typedef _VSTD::reverse_iterator<const_iterator> const_reverse_iterator;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000426
Howard Hinnant28c97e62010-09-23 16:27:36 +0000427 _LIBCPP_INLINE_VISIBILITY
Marshall Clowcaaa1412014-03-10 04:50:10 +0000428 set()
429 _NOEXCEPT_(
430 is_nothrow_default_constructible<allocator_type>::value &&
431 is_nothrow_default_constructible<key_compare>::value &&
432 is_nothrow_copy_constructible<key_compare>::value)
433 : __tree_(value_compare()) {}
434
435 _LIBCPP_INLINE_VISIBILITY
436 explicit set(const value_compare& __comp)
Howard Hinnantb2e2a8f2011-06-04 15:22:34 +0000437 _NOEXCEPT_(
438 is_nothrow_default_constructible<allocator_type>::value &&
Howard Hinnantb2e2a8f2011-06-04 15:22:34 +0000439 is_nothrow_copy_constructible<key_compare>::value)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000440 : __tree_(__comp) {}
Marshall Clowcaaa1412014-03-10 04:50:10 +0000441
Howard Hinnant28c97e62010-09-23 16:27:36 +0000442 _LIBCPP_INLINE_VISIBILITY
Marshall Clow48c74702014-03-05 19:06:20 +0000443 explicit set(const value_compare& __comp, const allocator_type& __a)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000444 : __tree_(__comp, __a) {}
445 template <class _InputIterator>
Howard Hinnant28c97e62010-09-23 16:27:36 +0000446 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000447 set(_InputIterator __f, _InputIterator __l,
448 const value_compare& __comp = value_compare())
449 : __tree_(__comp)
450 {
451 insert(__f, __l);
452 }
453
454 template <class _InputIterator>
Howard Hinnant28c97e62010-09-23 16:27:36 +0000455 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000456 set(_InputIterator __f, _InputIterator __l, const value_compare& __comp,
457 const allocator_type& __a)
458 : __tree_(__comp, __a)
459 {
460 insert(__f, __l);
461 }
462
Marshall Clow24a7e332013-09-11 00:06:45 +0000463#if _LIBCPP_STD_VER > 11
464 template <class _InputIterator>
465 _LIBCPP_INLINE_VISIBILITY
466 set(_InputIterator __f, _InputIterator __l, const allocator_type& __a)
467 : set(__f, __l, key_compare(), __a) {}
468#endif
469
Howard Hinnant28c97e62010-09-23 16:27:36 +0000470 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000471 set(const set& __s)
472 : __tree_(__s.__tree_)
473 {
474 insert(__s.begin(), __s.end());
475 }
476
Howard Hinnant61aa6012011-07-01 19:24:36 +0000477 _LIBCPP_INLINE_VISIBILITY
478 set& operator=(const set& __s)
479 {
480 __tree_ = __s.__tree_;
481 return *this;
482 }
483
Howard Hinnant73d21a42010-09-04 23:28:19 +0000484#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnant28c97e62010-09-23 16:27:36 +0000485 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000486 set(set&& __s)
Howard Hinnantb2e2a8f2011-06-04 15:22:34 +0000487 _NOEXCEPT_(is_nothrow_move_constructible<__base>::value)
Howard Hinnant0949eed2011-06-30 21:18:19 +0000488 : __tree_(_VSTD::move(__s.__tree_)) {}
Howard Hinnant73d21a42010-09-04 23:28:19 +0000489#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000490
Howard Hinnant28c97e62010-09-23 16:27:36 +0000491 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000492 explicit set(const allocator_type& __a)
493 : __tree_(__a) {}
494
Howard Hinnant28c97e62010-09-23 16:27:36 +0000495 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000496 set(const set& __s, const allocator_type& __a)
497 : __tree_(__s.__tree_.value_comp(), __a)
498 {
499 insert(__s.begin(), __s.end());
500 }
501
Howard Hinnant73d21a42010-09-04 23:28:19 +0000502#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000503 set(set&& __s, const allocator_type& __a);
504#endif
505
Howard Hinnante3e32912011-08-12 21:56:02 +0000506#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnant28c97e62010-09-23 16:27:36 +0000507 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000508 set(initializer_list<value_type> __il, const value_compare& __comp = value_compare())
509 : __tree_(__comp)
510 {
511 insert(__il.begin(), __il.end());
512 }
513
Howard Hinnant28c97e62010-09-23 16:27:36 +0000514 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000515 set(initializer_list<value_type> __il, const value_compare& __comp,
516 const allocator_type& __a)
517 : __tree_(__comp, __a)
518 {
519 insert(__il.begin(), __il.end());
520 }
521
Marshall Clow24a7e332013-09-11 00:06:45 +0000522#if _LIBCPP_STD_VER > 11
523 _LIBCPP_INLINE_VISIBILITY
524 set(initializer_list<value_type> __il, const allocator_type& __a)
525 : set(__il, key_compare(), __a) {}
526#endif
527
Howard Hinnant28c97e62010-09-23 16:27:36 +0000528 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000529 set& operator=(initializer_list<value_type> __il)
530 {
531 __tree_.__assign_unique(__il.begin(), __il.end());
532 return *this;
533 }
Howard Hinnante3e32912011-08-12 21:56:02 +0000534#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000535
Howard Hinnant73d21a42010-09-04 23:28:19 +0000536#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnant28c97e62010-09-23 16:27:36 +0000537 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000538 set& operator=(set&& __s)
Howard Hinnantb2e2a8f2011-06-04 15:22:34 +0000539 _NOEXCEPT_(is_nothrow_move_assignable<__base>::value)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000540 {
Howard Hinnant0949eed2011-06-30 21:18:19 +0000541 __tree_ = _VSTD::move(__s.__tree_);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000542 return *this;
543 }
Howard Hinnant73d21a42010-09-04 23:28:19 +0000544#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000545
Howard Hinnant28c97e62010-09-23 16:27:36 +0000546 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantb2e2a8f2011-06-04 15:22:34 +0000547 iterator begin() _NOEXCEPT {return __tree_.begin();}
Howard Hinnant28c97e62010-09-23 16:27:36 +0000548 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantb2e2a8f2011-06-04 15:22:34 +0000549 const_iterator begin() const _NOEXCEPT {return __tree_.begin();}
Howard Hinnant28c97e62010-09-23 16:27:36 +0000550 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantb2e2a8f2011-06-04 15:22:34 +0000551 iterator end() _NOEXCEPT {return __tree_.end();}
Howard Hinnant28c97e62010-09-23 16:27:36 +0000552 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantb2e2a8f2011-06-04 15:22:34 +0000553 const_iterator end() const _NOEXCEPT {return __tree_.end();}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000554
Howard Hinnant28c97e62010-09-23 16:27:36 +0000555 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantb2e2a8f2011-06-04 15:22:34 +0000556 reverse_iterator rbegin() _NOEXCEPT
557 {return reverse_iterator(end());}
Howard Hinnant28c97e62010-09-23 16:27:36 +0000558 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantb2e2a8f2011-06-04 15:22:34 +0000559 const_reverse_iterator rbegin() const _NOEXCEPT
560 {return const_reverse_iterator(end());}
Howard Hinnant28c97e62010-09-23 16:27:36 +0000561 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantb2e2a8f2011-06-04 15:22:34 +0000562 reverse_iterator rend() _NOEXCEPT
563 {return reverse_iterator(begin());}
Howard Hinnant28c97e62010-09-23 16:27:36 +0000564 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantb2e2a8f2011-06-04 15:22:34 +0000565 const_reverse_iterator rend() const _NOEXCEPT
566 {return const_reverse_iterator(begin());}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000567
Howard Hinnant28c97e62010-09-23 16:27:36 +0000568 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantb2e2a8f2011-06-04 15:22:34 +0000569 const_iterator cbegin() const _NOEXCEPT {return begin();}
Howard Hinnant28c97e62010-09-23 16:27:36 +0000570 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantb2e2a8f2011-06-04 15:22:34 +0000571 const_iterator cend() const _NOEXCEPT {return end();}
Howard Hinnant28c97e62010-09-23 16:27:36 +0000572 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantb2e2a8f2011-06-04 15:22:34 +0000573 const_reverse_iterator crbegin() const _NOEXCEPT {return rbegin();}
Howard Hinnant28c97e62010-09-23 16:27:36 +0000574 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantb2e2a8f2011-06-04 15:22:34 +0000575 const_reverse_iterator crend() const _NOEXCEPT {return rend();}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000576
Howard Hinnant28c97e62010-09-23 16:27:36 +0000577 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantb2e2a8f2011-06-04 15:22:34 +0000578 bool empty() const _NOEXCEPT {return __tree_.size() == 0;}
Howard Hinnant28c97e62010-09-23 16:27:36 +0000579 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantb2e2a8f2011-06-04 15:22:34 +0000580 size_type size() const _NOEXCEPT {return __tree_.size();}
Howard Hinnant28c97e62010-09-23 16:27:36 +0000581 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantb2e2a8f2011-06-04 15:22:34 +0000582 size_type max_size() const _NOEXCEPT {return __tree_.max_size();}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000583
584 // modifiers:
Howard Hinnant73d21a42010-09-04 23:28:19 +0000585#if !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000586 template <class... _Args>
Howard Hinnant28c97e62010-09-23 16:27:36 +0000587 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000588 pair<iterator, bool> emplace(_Args&&... __args)
Howard Hinnant0949eed2011-06-30 21:18:19 +0000589 {return __tree_.__emplace_unique(_VSTD::forward<_Args>(__args)...);}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000590 template <class... _Args>
Howard Hinnant28c97e62010-09-23 16:27:36 +0000591 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000592 iterator emplace_hint(const_iterator __p, _Args&&... __args)
Howard Hinnant0949eed2011-06-30 21:18:19 +0000593 {return __tree_.__emplace_hint_unique(__p, _VSTD::forward<_Args>(__args)...);}
Howard Hinnant73d21a42010-09-04 23:28:19 +0000594#endif // !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS)
Howard Hinnant28c97e62010-09-23 16:27:36 +0000595 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000596 pair<iterator,bool> insert(const value_type& __v)
597 {return __tree_.__insert_unique(__v);}
Howard Hinnant73d21a42010-09-04 23:28:19 +0000598#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnant28c97e62010-09-23 16:27:36 +0000599 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000600 pair<iterator,bool> insert(value_type&& __v)
Howard Hinnant0949eed2011-06-30 21:18:19 +0000601 {return __tree_.__insert_unique(_VSTD::move(__v));}
Howard Hinnant73d21a42010-09-04 23:28:19 +0000602#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnant28c97e62010-09-23 16:27:36 +0000603 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000604 iterator insert(const_iterator __p, const value_type& __v)
605 {return __tree_.__insert_unique(__p, __v);}
Howard Hinnant73d21a42010-09-04 23:28:19 +0000606#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnant28c97e62010-09-23 16:27:36 +0000607 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000608 iterator insert(const_iterator __p, value_type&& __v)
Howard Hinnant0949eed2011-06-30 21:18:19 +0000609 {return __tree_.__insert_unique(__p, _VSTD::move(__v));}
Howard Hinnant73d21a42010-09-04 23:28:19 +0000610#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000611 template <class _InputIterator>
Howard Hinnant28c97e62010-09-23 16:27:36 +0000612 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000613 void insert(_InputIterator __f, _InputIterator __l)
614 {
615 for (const_iterator __e = cend(); __f != __l; ++__f)
616 __tree_.__insert_unique(__e, *__f);
617 }
618
Howard Hinnante3e32912011-08-12 21:56:02 +0000619#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnant28c97e62010-09-23 16:27:36 +0000620 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000621 void insert(initializer_list<value_type> __il)
622 {insert(__il.begin(), __il.end());}
Howard Hinnante3e32912011-08-12 21:56:02 +0000623#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000624
Howard Hinnant28c97e62010-09-23 16:27:36 +0000625 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000626 iterator erase(const_iterator __p) {return __tree_.erase(__p);}
Howard Hinnant28c97e62010-09-23 16:27:36 +0000627 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000628 size_type erase(const key_type& __k)
629 {return __tree_.__erase_unique(__k);}
Howard Hinnant28c97e62010-09-23 16:27:36 +0000630 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000631 iterator erase(const_iterator __f, const_iterator __l)
632 {return __tree_.erase(__f, __l);}
Howard Hinnant28c97e62010-09-23 16:27:36 +0000633 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantb2e2a8f2011-06-04 15:22:34 +0000634 void clear() _NOEXCEPT {__tree_.clear();}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000635
Howard Hinnant28c97e62010-09-23 16:27:36 +0000636 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantb2e2a8f2011-06-04 15:22:34 +0000637 void swap(set& __s) _NOEXCEPT_(__is_nothrow_swappable<__base>::value)
638 {__tree_.swap(__s.__tree_);}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000639
Howard Hinnant28c97e62010-09-23 16:27:36 +0000640 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantb2e2a8f2011-06-04 15:22:34 +0000641 allocator_type get_allocator() const _NOEXCEPT {return __tree_.__alloc();}
Howard Hinnant28c97e62010-09-23 16:27:36 +0000642 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000643 key_compare key_comp() const {return __tree_.value_comp();}
Howard Hinnant28c97e62010-09-23 16:27:36 +0000644 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000645 value_compare value_comp() const {return __tree_.value_comp();}
646
647 // set operations:
Howard Hinnant28c97e62010-09-23 16:27:36 +0000648 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000649 iterator find(const key_type& __k) {return __tree_.find(__k);}
Howard Hinnant28c97e62010-09-23 16:27:36 +0000650 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000651 const_iterator find(const key_type& __k) const {return __tree_.find(__k);}
Marshall Clow4a0a9812013-08-13 01:11:06 +0000652#if _LIBCPP_STD_VER > 11
653 template <typename _K2>
654 _LIBCPP_INLINE_VISIBILITY
655 typename enable_if<__is_transparent<_Compare, _K2>::value,iterator>::type
656 find(const _K2& __k) {return __tree_.find(__k);}
657 template <typename _K2>
658 _LIBCPP_INLINE_VISIBILITY
659 typename enable_if<__is_transparent<_Compare, _K2>::value,const_iterator>::type
660 find(const _K2& __k) const {return __tree_.find(__k);}
661#endif
662
Howard Hinnant28c97e62010-09-23 16:27:36 +0000663 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000664 size_type count(const key_type& __k) const
665 {return __tree_.__count_unique(__k);}
Marshall Clow4de32042014-08-24 23:54:16 +0000666#if _LIBCPP_STD_VER > 11
667 template <typename _K2>
668 _LIBCPP_INLINE_VISIBILITY
669 typename enable_if<__is_transparent<_Compare, _K2>::value,size_type>::type
670 count(const _K2& __k) {return __tree_.__count_unique(__k);}
671#endif
Howard Hinnant28c97e62010-09-23 16:27:36 +0000672 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000673 iterator lower_bound(const key_type& __k)
674 {return __tree_.lower_bound(__k);}
Howard Hinnant28c97e62010-09-23 16:27:36 +0000675 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000676 const_iterator lower_bound(const key_type& __k) const
677 {return __tree_.lower_bound(__k);}
Marshall Clow4a0a9812013-08-13 01:11:06 +0000678#if _LIBCPP_STD_VER > 11
679 template <typename _K2>
680 _LIBCPP_INLINE_VISIBILITY
681 typename enable_if<__is_transparent<_Compare, _K2>::value,iterator>::type
682 lower_bound(const _K2& __k) {return __tree_.lower_bound(__k);}
683
684 template <typename _K2>
685 _LIBCPP_INLINE_VISIBILITY
686 typename enable_if<__is_transparent<_Compare, _K2>::value,const_iterator>::type
687 lower_bound(const _K2& __k) const {return __tree_.lower_bound(__k);}
688#endif
689
Howard Hinnant28c97e62010-09-23 16:27:36 +0000690 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000691 iterator upper_bound(const key_type& __k)
692 {return __tree_.upper_bound(__k);}
Howard Hinnant28c97e62010-09-23 16:27:36 +0000693 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000694 const_iterator upper_bound(const key_type& __k) const
695 {return __tree_.upper_bound(__k);}
Marshall Clow4a0a9812013-08-13 01:11:06 +0000696#if _LIBCPP_STD_VER > 11
697 template <typename _K2>
698 _LIBCPP_INLINE_VISIBILITY
699 typename enable_if<__is_transparent<_Compare, _K2>::value,iterator>::type
700 upper_bound(const _K2& __k) {return __tree_.upper_bound(__k);}
701 template <typename _K2>
702 _LIBCPP_INLINE_VISIBILITY
703 typename enable_if<__is_transparent<_Compare, _K2>::value,const_iterator>::type
704 upper_bound(const _K2& __k) const {return __tree_.upper_bound(__k);}
705#endif
706
Howard Hinnant28c97e62010-09-23 16:27:36 +0000707 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000708 pair<iterator,iterator> equal_range(const key_type& __k)
709 {return __tree_.__equal_range_unique(__k);}
Howard Hinnant28c97e62010-09-23 16:27:36 +0000710 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000711 pair<const_iterator,const_iterator> equal_range(const key_type& __k) const
712 {return __tree_.__equal_range_unique(__k);}
Marshall Clow4a0a9812013-08-13 01:11:06 +0000713#if _LIBCPP_STD_VER > 11
714 template <typename _K2>
715 _LIBCPP_INLINE_VISIBILITY
716 typename enable_if<__is_transparent<_Compare, _K2>::value,pair<iterator,iterator>>::type
717 equal_range(const _K2& __k) {return __tree_.__equal_range_unique(__k);}
718 template <typename _K2>
719 _LIBCPP_INLINE_VISIBILITY
720 typename enable_if<__is_transparent<_Compare, _K2>::value,pair<const_iterator,const_iterator>>::type
721 equal_range(const _K2& __k) const {return __tree_.__equal_range_unique(__k);}
722#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000723};
724
Howard Hinnant73d21a42010-09-04 23:28:19 +0000725#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000726
727template <class _Key, class _Compare, class _Allocator>
728set<_Key, _Compare, _Allocator>::set(set&& __s, const allocator_type& __a)
Howard Hinnant0949eed2011-06-30 21:18:19 +0000729 : __tree_(_VSTD::move(__s.__tree_), __a)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000730{
731 if (__a != __s.get_allocator())
732 {
733 const_iterator __e = cend();
734 while (!__s.empty())
Howard Hinnant0949eed2011-06-30 21:18:19 +0000735 insert(__e, _VSTD::move(__s.__tree_.remove(__s.begin())->__value_));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000736 }
737}
738
Howard Hinnant73d21a42010-09-04 23:28:19 +0000739#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000740
741template <class _Key, class _Compare, class _Allocator>
Howard Hinnant28c97e62010-09-23 16:27:36 +0000742inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000743bool
744operator==(const set<_Key, _Compare, _Allocator>& __x,
745 const set<_Key, _Compare, _Allocator>& __y)
746{
Howard Hinnant0949eed2011-06-30 21:18:19 +0000747 return __x.size() == __y.size() && _VSTD::equal(__x.begin(), __x.end(), __y.begin());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000748}
749
750template <class _Key, class _Compare, class _Allocator>
Howard Hinnant28c97e62010-09-23 16:27:36 +0000751inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000752bool
753operator< (const set<_Key, _Compare, _Allocator>& __x,
754 const set<_Key, _Compare, _Allocator>& __y)
755{
Howard Hinnant0949eed2011-06-30 21:18:19 +0000756 return _VSTD::lexicographical_compare(__x.begin(), __x.end(), __y.begin(), __y.end());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000757}
758
759template <class _Key, class _Compare, class _Allocator>
Howard Hinnant28c97e62010-09-23 16:27:36 +0000760inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000761bool
762operator!=(const set<_Key, _Compare, _Allocator>& __x,
763 const set<_Key, _Compare, _Allocator>& __y)
764{
765 return !(__x == __y);
766}
767
768template <class _Key, class _Compare, class _Allocator>
Howard Hinnant28c97e62010-09-23 16:27:36 +0000769inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000770bool
771operator> (const set<_Key, _Compare, _Allocator>& __x,
772 const set<_Key, _Compare, _Allocator>& __y)
773{
774 return __y < __x;
775}
776
777template <class _Key, class _Compare, class _Allocator>
Howard Hinnant28c97e62010-09-23 16:27:36 +0000778inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000779bool
780operator>=(const set<_Key, _Compare, _Allocator>& __x,
781 const set<_Key, _Compare, _Allocator>& __y)
782{
783 return !(__x < __y);
784}
785
786template <class _Key, class _Compare, class _Allocator>
Howard Hinnant28c97e62010-09-23 16:27:36 +0000787inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000788bool
789operator<=(const set<_Key, _Compare, _Allocator>& __x,
790 const set<_Key, _Compare, _Allocator>& __y)
791{
792 return !(__y < __x);
793}
794
795// specialized algorithms:
796template <class _Key, class _Compare, class _Allocator>
Howard Hinnant28c97e62010-09-23 16:27:36 +0000797inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000798void
799swap(set<_Key, _Compare, _Allocator>& __x,
800 set<_Key, _Compare, _Allocator>& __y)
Howard Hinnantb2e2a8f2011-06-04 15:22:34 +0000801 _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000802{
803 __x.swap(__y);
804}
805
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000806template <class _Key, class _Compare = less<_Key>,
807 class _Allocator = allocator<_Key> >
Howard Hinnant0f678bd2013-08-12 18:38:34 +0000808class _LIBCPP_TYPE_VIS_ONLY multiset
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000809{
810public:
811 // types:
812 typedef _Key key_type;
813 typedef key_type value_type;
814 typedef _Compare key_compare;
815 typedef key_compare value_compare;
816 typedef _Allocator allocator_type;
817 typedef value_type& reference;
818 typedef const value_type& const_reference;
819
820private:
821 typedef __tree<value_type, value_compare, allocator_type> __base;
822 typedef allocator_traits<allocator_type> __alloc_traits;
823 typedef typename __base::__node_holder __node_holder;
824
825 __base __tree_;
826
827public:
828 typedef typename __base::pointer pointer;
829 typedef typename __base::const_pointer const_pointer;
830 typedef typename __base::size_type size_type;
831 typedef typename __base::difference_type difference_type;
832 typedef typename __base::const_iterator iterator;
833 typedef typename __base::const_iterator const_iterator;
Howard Hinnant0949eed2011-06-30 21:18:19 +0000834 typedef _VSTD::reverse_iterator<iterator> reverse_iterator;
835 typedef _VSTD::reverse_iterator<const_iterator> const_reverse_iterator;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000836
837 // construct/copy/destroy:
Howard Hinnant28c97e62010-09-23 16:27:36 +0000838 _LIBCPP_INLINE_VISIBILITY
Marshall Clowcaaa1412014-03-10 04:50:10 +0000839 multiset()
840 _NOEXCEPT_(
841 is_nothrow_default_constructible<allocator_type>::value &&
842 is_nothrow_default_constructible<key_compare>::value &&
843 is_nothrow_copy_constructible<key_compare>::value)
844 : __tree_(value_compare()) {}
845
846 _LIBCPP_INLINE_VISIBILITY
847 explicit multiset(const value_compare& __comp)
Howard Hinnantb2e2a8f2011-06-04 15:22:34 +0000848 _NOEXCEPT_(
849 is_nothrow_default_constructible<allocator_type>::value &&
Howard Hinnantb2e2a8f2011-06-04 15:22:34 +0000850 is_nothrow_copy_constructible<key_compare>::value)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000851 : __tree_(__comp) {}
Marshall Clowcaaa1412014-03-10 04:50:10 +0000852
Howard Hinnant28c97e62010-09-23 16:27:36 +0000853 _LIBCPP_INLINE_VISIBILITY
Marshall Clow48c74702014-03-05 19:06:20 +0000854 explicit multiset(const value_compare& __comp, const allocator_type& __a)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000855 : __tree_(__comp, __a) {}
856 template <class _InputIterator>
Howard Hinnant28c97e62010-09-23 16:27:36 +0000857 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000858 multiset(_InputIterator __f, _InputIterator __l,
859 const value_compare& __comp = value_compare())
860 : __tree_(__comp)
861 {
862 insert(__f, __l);
863 }
864
Marshall Clow24a7e332013-09-11 00:06:45 +0000865#if _LIBCPP_STD_VER > 11
866 template <class _InputIterator>
867 _LIBCPP_INLINE_VISIBILITY
868 multiset(_InputIterator __f, _InputIterator __l, const allocator_type& __a)
869 : multiset(__f, __l, key_compare(), __a) {}
870#endif
871
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000872 template <class _InputIterator>
Howard Hinnant28c97e62010-09-23 16:27:36 +0000873 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000874 multiset(_InputIterator __f, _InputIterator __l,
875 const value_compare& __comp, const allocator_type& __a)
876 : __tree_(__comp, __a)
877 {
878 insert(__f, __l);
879 }
880
Howard Hinnant28c97e62010-09-23 16:27:36 +0000881 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000882 multiset(const multiset& __s)
883 : __tree_(__s.__tree_.value_comp(),
884 __alloc_traits::select_on_container_copy_construction(__s.__tree_.__alloc()))
885 {
886 insert(__s.begin(), __s.end());
887 }
888
Howard Hinnant61aa6012011-07-01 19:24:36 +0000889 _LIBCPP_INLINE_VISIBILITY
890 multiset& operator=(const multiset& __s)
891 {
892 __tree_ = __s.__tree_;
893 return *this;
894 }
895
Howard Hinnant73d21a42010-09-04 23:28:19 +0000896#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnant28c97e62010-09-23 16:27:36 +0000897 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000898 multiset(multiset&& __s)
Howard Hinnantb2e2a8f2011-06-04 15:22:34 +0000899 _NOEXCEPT_(is_nothrow_move_constructible<__base>::value)
Howard Hinnant0949eed2011-06-30 21:18:19 +0000900 : __tree_(_VSTD::move(__s.__tree_)) {}
Howard Hinnant73d21a42010-09-04 23:28:19 +0000901#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnant28c97e62010-09-23 16:27:36 +0000902 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000903 explicit multiset(const allocator_type& __a)
904 : __tree_(__a) {}
Howard Hinnant28c97e62010-09-23 16:27:36 +0000905 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000906 multiset(const multiset& __s, const allocator_type& __a)
907 : __tree_(__s.__tree_.value_comp(), __a)
908 {
909 insert(__s.begin(), __s.end());
910 }
Howard Hinnant73d21a42010-09-04 23:28:19 +0000911#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000912 multiset(multiset&& __s, const allocator_type& __a);
913#endif
914
Howard Hinnante3e32912011-08-12 21:56:02 +0000915#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnant28c97e62010-09-23 16:27:36 +0000916 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000917 multiset(initializer_list<value_type> __il, const value_compare& __comp = value_compare())
918 : __tree_(__comp)
919 {
920 insert(__il.begin(), __il.end());
921 }
922
Howard Hinnant28c97e62010-09-23 16:27:36 +0000923 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000924 multiset(initializer_list<value_type> __il, const value_compare& __comp,
925 const allocator_type& __a)
926 : __tree_(__comp, __a)
927 {
928 insert(__il.begin(), __il.end());
929 }
930
Marshall Clow24a7e332013-09-11 00:06:45 +0000931#if _LIBCPP_STD_VER > 11
932 _LIBCPP_INLINE_VISIBILITY
933 multiset(initializer_list<value_type> __il, const allocator_type& __a)
934 : multiset(__il, key_compare(), __a) {}
935#endif
936
Howard Hinnant28c97e62010-09-23 16:27:36 +0000937 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000938 multiset& operator=(initializer_list<value_type> __il)
939 {
940 __tree_.__assign_multi(__il.begin(), __il.end());
941 return *this;
942 }
Howard Hinnante3e32912011-08-12 21:56:02 +0000943#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000944
Howard Hinnant73d21a42010-09-04 23:28:19 +0000945#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnant28c97e62010-09-23 16:27:36 +0000946 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000947 multiset& operator=(multiset&& __s)
Howard Hinnantb2e2a8f2011-06-04 15:22:34 +0000948 _NOEXCEPT_(is_nothrow_move_assignable<__base>::value)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000949 {
Howard Hinnant0949eed2011-06-30 21:18:19 +0000950 __tree_ = _VSTD::move(__s.__tree_);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000951 return *this;
952 }
Howard Hinnant73d21a42010-09-04 23:28:19 +0000953#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000954
Howard Hinnant28c97e62010-09-23 16:27:36 +0000955 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantb2e2a8f2011-06-04 15:22:34 +0000956 iterator begin() _NOEXCEPT {return __tree_.begin();}
Howard Hinnant28c97e62010-09-23 16:27:36 +0000957 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantb2e2a8f2011-06-04 15:22:34 +0000958 const_iterator begin() const _NOEXCEPT {return __tree_.begin();}
Howard Hinnant28c97e62010-09-23 16:27:36 +0000959 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantb2e2a8f2011-06-04 15:22:34 +0000960 iterator end() _NOEXCEPT {return __tree_.end();}
Howard Hinnant28c97e62010-09-23 16:27:36 +0000961 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantb2e2a8f2011-06-04 15:22:34 +0000962 const_iterator end() const _NOEXCEPT {return __tree_.end();}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000963
Howard Hinnant28c97e62010-09-23 16:27:36 +0000964 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantb2e2a8f2011-06-04 15:22:34 +0000965 reverse_iterator rbegin() _NOEXCEPT
966 {return reverse_iterator(end());}
Howard Hinnant28c97e62010-09-23 16:27:36 +0000967 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantb2e2a8f2011-06-04 15:22:34 +0000968 const_reverse_iterator rbegin() const _NOEXCEPT
969 {return const_reverse_iterator(end());}
Howard Hinnant28c97e62010-09-23 16:27:36 +0000970 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantb2e2a8f2011-06-04 15:22:34 +0000971 reverse_iterator rend() _NOEXCEPT
972 {return reverse_iterator(begin());}
Howard Hinnant28c97e62010-09-23 16:27:36 +0000973 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantb2e2a8f2011-06-04 15:22:34 +0000974 const_reverse_iterator rend() const _NOEXCEPT
975 {return const_reverse_iterator(begin());}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000976
Howard Hinnant28c97e62010-09-23 16:27:36 +0000977 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantb2e2a8f2011-06-04 15:22:34 +0000978 const_iterator cbegin() const _NOEXCEPT {return begin();}
Howard Hinnant28c97e62010-09-23 16:27:36 +0000979 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantb2e2a8f2011-06-04 15:22:34 +0000980 const_iterator cend() const _NOEXCEPT {return end();}
Howard Hinnant28c97e62010-09-23 16:27:36 +0000981 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantb2e2a8f2011-06-04 15:22:34 +0000982 const_reverse_iterator crbegin() const _NOEXCEPT {return rbegin();}
Howard Hinnant28c97e62010-09-23 16:27:36 +0000983 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantb2e2a8f2011-06-04 15:22:34 +0000984 const_reverse_iterator crend() const _NOEXCEPT {return rend();}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000985
Howard Hinnant28c97e62010-09-23 16:27:36 +0000986 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantb2e2a8f2011-06-04 15:22:34 +0000987 bool empty() const _NOEXCEPT {return __tree_.size() == 0;}
Howard Hinnant28c97e62010-09-23 16:27:36 +0000988 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantb2e2a8f2011-06-04 15:22:34 +0000989 size_type size() const _NOEXCEPT {return __tree_.size();}
Howard Hinnant28c97e62010-09-23 16:27:36 +0000990 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantb2e2a8f2011-06-04 15:22:34 +0000991 size_type max_size() const _NOEXCEPT {return __tree_.max_size();}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000992
993 // modifiers:
Howard Hinnant73d21a42010-09-04 23:28:19 +0000994#if !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000995 template <class... _Args>
Howard Hinnant28c97e62010-09-23 16:27:36 +0000996 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000997 iterator emplace(_Args&&... __args)
Howard Hinnant0949eed2011-06-30 21:18:19 +0000998 {return __tree_.__emplace_multi(_VSTD::forward<_Args>(__args)...);}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000999 template <class... _Args>
Howard Hinnant28c97e62010-09-23 16:27:36 +00001000 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001001 iterator emplace_hint(const_iterator __p, _Args&&... __args)
Howard Hinnant0949eed2011-06-30 21:18:19 +00001002 {return __tree_.__emplace_hint_multi(__p, _VSTD::forward<_Args>(__args)...);}
Howard Hinnant73d21a42010-09-04 23:28:19 +00001003#endif // !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS)
Howard Hinnant28c97e62010-09-23 16:27:36 +00001004 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001005 iterator insert(const value_type& __v)
1006 {return __tree_.__insert_multi(__v);}
Howard Hinnant73d21a42010-09-04 23:28:19 +00001007#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnant28c97e62010-09-23 16:27:36 +00001008 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001009 iterator insert(value_type&& __v)
Howard Hinnant0949eed2011-06-30 21:18:19 +00001010 {return __tree_.__insert_multi(_VSTD::move(__v));}
Howard Hinnant73d21a42010-09-04 23:28:19 +00001011#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnant28c97e62010-09-23 16:27:36 +00001012 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001013 iterator insert(const_iterator __p, const value_type& __v)
1014 {return __tree_.__insert_multi(__p, __v);}
Howard Hinnant73d21a42010-09-04 23:28:19 +00001015#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnant28c97e62010-09-23 16:27:36 +00001016 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001017 iterator insert(const_iterator __p, value_type&& __v)
Howard Hinnant0949eed2011-06-30 21:18:19 +00001018 {return __tree_.__insert_multi(_VSTD::move(__v));}
Howard Hinnant73d21a42010-09-04 23:28:19 +00001019#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001020 template <class _InputIterator>
Howard Hinnant28c97e62010-09-23 16:27:36 +00001021 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001022 void insert(_InputIterator __f, _InputIterator __l)
1023 {
1024 for (const_iterator __e = cend(); __f != __l; ++__f)
1025 __tree_.__insert_multi(__e, *__f);
1026 }
1027
Howard Hinnante3e32912011-08-12 21:56:02 +00001028#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnant28c97e62010-09-23 16:27:36 +00001029 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001030 void insert(initializer_list<value_type> __il)
1031 {insert(__il.begin(), __il.end());}
Howard Hinnante3e32912011-08-12 21:56:02 +00001032#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001033
Howard Hinnant28c97e62010-09-23 16:27:36 +00001034 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001035 iterator erase(const_iterator __p) {return __tree_.erase(__p);}
Howard Hinnant28c97e62010-09-23 16:27:36 +00001036 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001037 size_type erase(const key_type& __k) {return __tree_.__erase_multi(__k);}
Howard Hinnant28c97e62010-09-23 16:27:36 +00001038 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001039 iterator erase(const_iterator __f, const_iterator __l)
1040 {return __tree_.erase(__f, __l);}
Howard Hinnant28c97e62010-09-23 16:27:36 +00001041 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantb2e2a8f2011-06-04 15:22:34 +00001042 void clear() _NOEXCEPT {__tree_.clear();}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001043
Howard Hinnant28c97e62010-09-23 16:27:36 +00001044 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantb2e2a8f2011-06-04 15:22:34 +00001045 void swap(multiset& __s)
1046 _NOEXCEPT_(__is_nothrow_swappable<__base>::value)
1047 {__tree_.swap(__s.__tree_);}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001048
Howard Hinnant28c97e62010-09-23 16:27:36 +00001049 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantb2e2a8f2011-06-04 15:22:34 +00001050 allocator_type get_allocator() const _NOEXCEPT {return __tree_.__alloc();}
Howard Hinnant28c97e62010-09-23 16:27:36 +00001051 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001052 key_compare key_comp() const {return __tree_.value_comp();}
Howard Hinnant28c97e62010-09-23 16:27:36 +00001053 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001054 value_compare value_comp() const {return __tree_.value_comp();}
1055
1056 // set operations:
Howard Hinnant28c97e62010-09-23 16:27:36 +00001057 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001058 iterator find(const key_type& __k) {return __tree_.find(__k);}
Howard Hinnant28c97e62010-09-23 16:27:36 +00001059 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001060 const_iterator find(const key_type& __k) const {return __tree_.find(__k);}
Marshall Clow4a0a9812013-08-13 01:11:06 +00001061#if _LIBCPP_STD_VER > 11
1062 template <typename _K2>
1063 _LIBCPP_INLINE_VISIBILITY
1064 typename _VSTD::enable_if<_VSTD::__is_transparent<_Compare, _K2>::value,iterator>::type
1065 find(const _K2& __k) {return __tree_.find(__k);}
1066 template <typename _K2>
1067 _LIBCPP_INLINE_VISIBILITY
1068 typename _VSTD::enable_if<_VSTD::__is_transparent<_Compare, _K2>::value,const_iterator>::type
1069 find(const _K2& __k) const {return __tree_.find(__k);}
1070#endif
1071
Howard Hinnant28c97e62010-09-23 16:27:36 +00001072 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001073 size_type count(const key_type& __k) const
1074 {return __tree_.__count_multi(__k);}
Marshall Clow4de32042014-08-24 23:54:16 +00001075#if _LIBCPP_STD_VER > 11
1076 template <typename _K2>
1077 _LIBCPP_INLINE_VISIBILITY
1078 typename enable_if<__is_transparent<_Compare, _K2>::value,size_type>::type
1079 count(const _K2& __k) {return __tree_.__count_multi(__k);}
1080#endif
Marshall Clow4a0a9812013-08-13 01:11:06 +00001081
Howard Hinnant28c97e62010-09-23 16:27:36 +00001082 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001083 iterator lower_bound(const key_type& __k)
1084 {return __tree_.lower_bound(__k);}
Howard Hinnant28c97e62010-09-23 16:27:36 +00001085 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001086 const_iterator lower_bound(const key_type& __k) const
1087 {return __tree_.lower_bound(__k);}
Marshall Clow4a0a9812013-08-13 01:11:06 +00001088#if _LIBCPP_STD_VER > 11
1089 template <typename _K2>
1090 _LIBCPP_INLINE_VISIBILITY
1091 typename _VSTD::enable_if<_VSTD::__is_transparent<_Compare, _K2>::value,iterator>::type
1092 lower_bound(const _K2& __k) {return __tree_.lower_bound(__k);}
1093
1094 template <typename _K2>
1095 _LIBCPP_INLINE_VISIBILITY
1096 typename _VSTD::enable_if<_VSTD::__is_transparent<_Compare, _K2>::value,const_iterator>::type
1097 lower_bound(const _K2& __k) const {return __tree_.lower_bound(__k);}
1098#endif
1099
Howard Hinnant28c97e62010-09-23 16:27:36 +00001100 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001101 iterator upper_bound(const key_type& __k)
1102 {return __tree_.upper_bound(__k);}
Howard Hinnant28c97e62010-09-23 16:27:36 +00001103 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001104 const_iterator upper_bound(const key_type& __k) const
1105 {return __tree_.upper_bound(__k);}
Marshall Clow4a0a9812013-08-13 01:11:06 +00001106#if _LIBCPP_STD_VER > 11
1107 template <typename _K2>
1108 _LIBCPP_INLINE_VISIBILITY
1109 typename _VSTD::enable_if<_VSTD::__is_transparent<_Compare, _K2>::value,iterator>::type
1110 upper_bound(const _K2& __k) {return __tree_.upper_bound(__k);}
1111 template <typename _K2>
1112 _LIBCPP_INLINE_VISIBILITY
1113 typename _VSTD::enable_if<_VSTD::__is_transparent<_Compare, _K2>::value,const_iterator>::type
1114 upper_bound(const _K2& __k) const {return __tree_.upper_bound(__k);}
1115#endif
1116
Howard Hinnant28c97e62010-09-23 16:27:36 +00001117 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001118 pair<iterator,iterator> equal_range(const key_type& __k)
1119 {return __tree_.__equal_range_multi(__k);}
Howard Hinnant28c97e62010-09-23 16:27:36 +00001120 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001121 pair<const_iterator,const_iterator> equal_range(const key_type& __k) const
1122 {return __tree_.__equal_range_multi(__k);}
Marshall Clow4a0a9812013-08-13 01:11:06 +00001123#if _LIBCPP_STD_VER > 11
1124 template <typename _K2>
1125 _LIBCPP_INLINE_VISIBILITY
1126 typename _VSTD::enable_if<_VSTD::__is_transparent<_Compare, _K2>::value,pair<iterator,iterator>>::type
1127 equal_range(const _K2& __k) {return __tree_.__equal_range_multi(__k);}
1128 template <typename _K2>
1129 _LIBCPP_INLINE_VISIBILITY
1130 typename _VSTD::enable_if<_VSTD::__is_transparent<_Compare, _K2>::value,pair<const_iterator,const_iterator>>::type
1131 equal_range(const _K2& __k) const {return __tree_.__equal_range_multi(__k);}
1132#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001133};
1134
Howard Hinnant73d21a42010-09-04 23:28:19 +00001135#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001136
1137template <class _Key, class _Compare, class _Allocator>
1138multiset<_Key, _Compare, _Allocator>::multiset(multiset&& __s, const allocator_type& __a)
Howard Hinnant0949eed2011-06-30 21:18:19 +00001139 : __tree_(_VSTD::move(__s.__tree_), __a)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001140{
1141 if (__a != __s.get_allocator())
1142 {
1143 const_iterator __e = cend();
1144 while (!__s.empty())
Howard Hinnant0949eed2011-06-30 21:18:19 +00001145 insert(__e, _VSTD::move(__s.__tree_.remove(__s.begin())->__value_));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001146 }
1147}
1148
Howard Hinnant73d21a42010-09-04 23:28:19 +00001149#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001150
1151template <class _Key, class _Compare, class _Allocator>
Howard Hinnant28c97e62010-09-23 16:27:36 +00001152inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001153bool
1154operator==(const multiset<_Key, _Compare, _Allocator>& __x,
1155 const multiset<_Key, _Compare, _Allocator>& __y)
1156{
Howard Hinnant0949eed2011-06-30 21:18:19 +00001157 return __x.size() == __y.size() && _VSTD::equal(__x.begin(), __x.end(), __y.begin());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001158}
1159
1160template <class _Key, class _Compare, class _Allocator>
Howard Hinnant28c97e62010-09-23 16:27:36 +00001161inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001162bool
1163operator< (const multiset<_Key, _Compare, _Allocator>& __x,
1164 const multiset<_Key, _Compare, _Allocator>& __y)
1165{
Howard Hinnant0949eed2011-06-30 21:18:19 +00001166 return _VSTD::lexicographical_compare(__x.begin(), __x.end(), __y.begin(), __y.end());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001167}
1168
1169template <class _Key, class _Compare, class _Allocator>
Howard Hinnant28c97e62010-09-23 16:27:36 +00001170inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001171bool
1172operator!=(const multiset<_Key, _Compare, _Allocator>& __x,
1173 const multiset<_Key, _Compare, _Allocator>& __y)
1174{
1175 return !(__x == __y);
1176}
1177
1178template <class _Key, class _Compare, class _Allocator>
Howard Hinnant28c97e62010-09-23 16:27:36 +00001179inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001180bool
1181operator> (const multiset<_Key, _Compare, _Allocator>& __x,
1182 const multiset<_Key, _Compare, _Allocator>& __y)
1183{
1184 return __y < __x;
1185}
1186
1187template <class _Key, class _Compare, class _Allocator>
Howard Hinnant28c97e62010-09-23 16:27:36 +00001188inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001189bool
1190operator>=(const multiset<_Key, _Compare, _Allocator>& __x,
1191 const multiset<_Key, _Compare, _Allocator>& __y)
1192{
1193 return !(__x < __y);
1194}
1195
1196template <class _Key, class _Compare, class _Allocator>
Howard Hinnant28c97e62010-09-23 16:27:36 +00001197inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001198bool
1199operator<=(const multiset<_Key, _Compare, _Allocator>& __x,
1200 const multiset<_Key, _Compare, _Allocator>& __y)
1201{
1202 return !(__y < __x);
1203}
1204
1205template <class _Key, class _Compare, class _Allocator>
Howard Hinnant28c97e62010-09-23 16:27:36 +00001206inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001207void
1208swap(multiset<_Key, _Compare, _Allocator>& __x,
1209 multiset<_Key, _Compare, _Allocator>& __y)
Howard Hinnantb2e2a8f2011-06-04 15:22:34 +00001210 _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001211{
1212 __x.swap(__y);
1213}
1214
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001215_LIBCPP_END_NAMESPACE_STD
1216
1217#endif // _LIBCPP_SET