blob: 7dbf97095e249d52419f97e044f4766854906074 [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 &&
439 is_nothrow_default_constructible<key_compare>::value &&
440 is_nothrow_copy_constructible<key_compare>::value)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000441 : __tree_(__comp) {}
Marshall Clowcaaa1412014-03-10 04:50:10 +0000442
Howard Hinnant28c97e62010-09-23 16:27:36 +0000443 _LIBCPP_INLINE_VISIBILITY
Marshall Clow48c74702014-03-05 19:06:20 +0000444 explicit set(const value_compare& __comp, const allocator_type& __a)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000445 : __tree_(__comp, __a) {}
446 template <class _InputIterator>
Howard Hinnant28c97e62010-09-23 16:27:36 +0000447 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000448 set(_InputIterator __f, _InputIterator __l,
449 const value_compare& __comp = value_compare())
450 : __tree_(__comp)
451 {
452 insert(__f, __l);
453 }
454
455 template <class _InputIterator>
Howard Hinnant28c97e62010-09-23 16:27:36 +0000456 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000457 set(_InputIterator __f, _InputIterator __l, const value_compare& __comp,
458 const allocator_type& __a)
459 : __tree_(__comp, __a)
460 {
461 insert(__f, __l);
462 }
463
Marshall Clow24a7e332013-09-11 00:06:45 +0000464#if _LIBCPP_STD_VER > 11
465 template <class _InputIterator>
466 _LIBCPP_INLINE_VISIBILITY
467 set(_InputIterator __f, _InputIterator __l, const allocator_type& __a)
468 : set(__f, __l, key_compare(), __a) {}
469#endif
470
Howard Hinnant28c97e62010-09-23 16:27:36 +0000471 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000472 set(const set& __s)
473 : __tree_(__s.__tree_)
474 {
475 insert(__s.begin(), __s.end());
476 }
477
Howard Hinnant61aa6012011-07-01 19:24:36 +0000478 _LIBCPP_INLINE_VISIBILITY
479 set& operator=(const set& __s)
480 {
481 __tree_ = __s.__tree_;
482 return *this;
483 }
484
Howard Hinnant73d21a42010-09-04 23:28:19 +0000485#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnant28c97e62010-09-23 16:27:36 +0000486 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000487 set(set&& __s)
Howard Hinnantb2e2a8f2011-06-04 15:22:34 +0000488 _NOEXCEPT_(is_nothrow_move_constructible<__base>::value)
Howard Hinnant0949eed2011-06-30 21:18:19 +0000489 : __tree_(_VSTD::move(__s.__tree_)) {}
Howard Hinnant73d21a42010-09-04 23:28:19 +0000490#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000491
Howard Hinnant28c97e62010-09-23 16:27:36 +0000492 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000493 explicit set(const allocator_type& __a)
494 : __tree_(__a) {}
495
Howard Hinnant28c97e62010-09-23 16:27:36 +0000496 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000497 set(const set& __s, const allocator_type& __a)
498 : __tree_(__s.__tree_.value_comp(), __a)
499 {
500 insert(__s.begin(), __s.end());
501 }
502
Howard Hinnant73d21a42010-09-04 23:28:19 +0000503#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000504 set(set&& __s, const allocator_type& __a);
505#endif
506
Howard Hinnante3e32912011-08-12 21:56:02 +0000507#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnant28c97e62010-09-23 16:27:36 +0000508 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000509 set(initializer_list<value_type> __il, const value_compare& __comp = value_compare())
510 : __tree_(__comp)
511 {
512 insert(__il.begin(), __il.end());
513 }
514
Howard Hinnant28c97e62010-09-23 16:27:36 +0000515 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000516 set(initializer_list<value_type> __il, const value_compare& __comp,
517 const allocator_type& __a)
518 : __tree_(__comp, __a)
519 {
520 insert(__il.begin(), __il.end());
521 }
522
Marshall Clow24a7e332013-09-11 00:06:45 +0000523#if _LIBCPP_STD_VER > 11
524 _LIBCPP_INLINE_VISIBILITY
525 set(initializer_list<value_type> __il, const allocator_type& __a)
526 : set(__il, key_compare(), __a) {}
527#endif
528
Howard Hinnant28c97e62010-09-23 16:27:36 +0000529 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000530 set& operator=(initializer_list<value_type> __il)
531 {
532 __tree_.__assign_unique(__il.begin(), __il.end());
533 return *this;
534 }
Howard Hinnante3e32912011-08-12 21:56:02 +0000535#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000536
Howard Hinnant73d21a42010-09-04 23:28:19 +0000537#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnant28c97e62010-09-23 16:27:36 +0000538 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000539 set& operator=(set&& __s)
Howard Hinnantb2e2a8f2011-06-04 15:22:34 +0000540 _NOEXCEPT_(is_nothrow_move_assignable<__base>::value)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000541 {
Howard Hinnant0949eed2011-06-30 21:18:19 +0000542 __tree_ = _VSTD::move(__s.__tree_);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000543 return *this;
544 }
Howard Hinnant73d21a42010-09-04 23:28:19 +0000545#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000546
Howard Hinnant28c97e62010-09-23 16:27:36 +0000547 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantb2e2a8f2011-06-04 15:22:34 +0000548 iterator begin() _NOEXCEPT {return __tree_.begin();}
Howard Hinnant28c97e62010-09-23 16:27:36 +0000549 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantb2e2a8f2011-06-04 15:22:34 +0000550 const_iterator begin() const _NOEXCEPT {return __tree_.begin();}
Howard Hinnant28c97e62010-09-23 16:27:36 +0000551 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantb2e2a8f2011-06-04 15:22:34 +0000552 iterator end() _NOEXCEPT {return __tree_.end();}
Howard Hinnant28c97e62010-09-23 16:27:36 +0000553 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantb2e2a8f2011-06-04 15:22:34 +0000554 const_iterator end() const _NOEXCEPT {return __tree_.end();}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000555
Howard Hinnant28c97e62010-09-23 16:27:36 +0000556 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantb2e2a8f2011-06-04 15:22:34 +0000557 reverse_iterator rbegin() _NOEXCEPT
558 {return reverse_iterator(end());}
Howard Hinnant28c97e62010-09-23 16:27:36 +0000559 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantb2e2a8f2011-06-04 15:22:34 +0000560 const_reverse_iterator rbegin() const _NOEXCEPT
561 {return const_reverse_iterator(end());}
Howard Hinnant28c97e62010-09-23 16:27:36 +0000562 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantb2e2a8f2011-06-04 15:22:34 +0000563 reverse_iterator rend() _NOEXCEPT
564 {return reverse_iterator(begin());}
Howard Hinnant28c97e62010-09-23 16:27:36 +0000565 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantb2e2a8f2011-06-04 15:22:34 +0000566 const_reverse_iterator rend() const _NOEXCEPT
567 {return const_reverse_iterator(begin());}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000568
Howard Hinnant28c97e62010-09-23 16:27:36 +0000569 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantb2e2a8f2011-06-04 15:22:34 +0000570 const_iterator cbegin() const _NOEXCEPT {return begin();}
Howard Hinnant28c97e62010-09-23 16:27:36 +0000571 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantb2e2a8f2011-06-04 15:22:34 +0000572 const_iterator cend() const _NOEXCEPT {return end();}
Howard Hinnant28c97e62010-09-23 16:27:36 +0000573 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantb2e2a8f2011-06-04 15:22:34 +0000574 const_reverse_iterator crbegin() const _NOEXCEPT {return rbegin();}
Howard Hinnant28c97e62010-09-23 16:27:36 +0000575 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantb2e2a8f2011-06-04 15:22:34 +0000576 const_reverse_iterator crend() const _NOEXCEPT {return rend();}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000577
Howard Hinnant28c97e62010-09-23 16:27:36 +0000578 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantb2e2a8f2011-06-04 15:22:34 +0000579 bool empty() const _NOEXCEPT {return __tree_.size() == 0;}
Howard Hinnant28c97e62010-09-23 16:27:36 +0000580 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantb2e2a8f2011-06-04 15:22:34 +0000581 size_type size() const _NOEXCEPT {return __tree_.size();}
Howard Hinnant28c97e62010-09-23 16:27:36 +0000582 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantb2e2a8f2011-06-04 15:22:34 +0000583 size_type max_size() const _NOEXCEPT {return __tree_.max_size();}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000584
585 // modifiers:
Howard Hinnant73d21a42010-09-04 23:28:19 +0000586#if !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000587 template <class... _Args>
Howard Hinnant28c97e62010-09-23 16:27:36 +0000588 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000589 pair<iterator, bool> emplace(_Args&&... __args)
Howard Hinnant0949eed2011-06-30 21:18:19 +0000590 {return __tree_.__emplace_unique(_VSTD::forward<_Args>(__args)...);}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000591 template <class... _Args>
Howard Hinnant28c97e62010-09-23 16:27:36 +0000592 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000593 iterator emplace_hint(const_iterator __p, _Args&&... __args)
Howard Hinnant0949eed2011-06-30 21:18:19 +0000594 {return __tree_.__emplace_hint_unique(__p, _VSTD::forward<_Args>(__args)...);}
Howard Hinnant73d21a42010-09-04 23:28:19 +0000595#endif // !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS)
Howard Hinnant28c97e62010-09-23 16:27:36 +0000596 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000597 pair<iterator,bool> insert(const value_type& __v)
598 {return __tree_.__insert_unique(__v);}
Howard Hinnant73d21a42010-09-04 23:28:19 +0000599#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnant28c97e62010-09-23 16:27:36 +0000600 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000601 pair<iterator,bool> insert(value_type&& __v)
Howard Hinnant0949eed2011-06-30 21:18:19 +0000602 {return __tree_.__insert_unique(_VSTD::move(__v));}
Howard Hinnant73d21a42010-09-04 23:28:19 +0000603#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnant28c97e62010-09-23 16:27:36 +0000604 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000605 iterator insert(const_iterator __p, const value_type& __v)
606 {return __tree_.__insert_unique(__p, __v);}
Howard Hinnant73d21a42010-09-04 23:28:19 +0000607#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnant28c97e62010-09-23 16:27:36 +0000608 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000609 iterator insert(const_iterator __p, value_type&& __v)
Howard Hinnant0949eed2011-06-30 21:18:19 +0000610 {return __tree_.__insert_unique(__p, _VSTD::move(__v));}
Howard Hinnant73d21a42010-09-04 23:28:19 +0000611#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000612 template <class _InputIterator>
Howard Hinnant28c97e62010-09-23 16:27:36 +0000613 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000614 void insert(_InputIterator __f, _InputIterator __l)
615 {
616 for (const_iterator __e = cend(); __f != __l; ++__f)
617 __tree_.__insert_unique(__e, *__f);
618 }
619
Howard Hinnante3e32912011-08-12 21:56:02 +0000620#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnant28c97e62010-09-23 16:27:36 +0000621 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000622 void insert(initializer_list<value_type> __il)
623 {insert(__il.begin(), __il.end());}
Howard Hinnante3e32912011-08-12 21:56:02 +0000624#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000625
Howard Hinnant28c97e62010-09-23 16:27:36 +0000626 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000627 iterator erase(const_iterator __p) {return __tree_.erase(__p);}
Howard Hinnant28c97e62010-09-23 16:27:36 +0000628 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000629 size_type erase(const key_type& __k)
630 {return __tree_.__erase_unique(__k);}
Howard Hinnant28c97e62010-09-23 16:27:36 +0000631 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000632 iterator erase(const_iterator __f, const_iterator __l)
633 {return __tree_.erase(__f, __l);}
Howard Hinnant28c97e62010-09-23 16:27:36 +0000634 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantb2e2a8f2011-06-04 15:22:34 +0000635 void clear() _NOEXCEPT {__tree_.clear();}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000636
Howard Hinnant28c97e62010-09-23 16:27:36 +0000637 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantb2e2a8f2011-06-04 15:22:34 +0000638 void swap(set& __s) _NOEXCEPT_(__is_nothrow_swappable<__base>::value)
639 {__tree_.swap(__s.__tree_);}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000640
Howard Hinnant28c97e62010-09-23 16:27:36 +0000641 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantb2e2a8f2011-06-04 15:22:34 +0000642 allocator_type get_allocator() const _NOEXCEPT {return __tree_.__alloc();}
Howard Hinnant28c97e62010-09-23 16:27:36 +0000643 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000644 key_compare key_comp() const {return __tree_.value_comp();}
Howard Hinnant28c97e62010-09-23 16:27:36 +0000645 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000646 value_compare value_comp() const {return __tree_.value_comp();}
647
648 // set operations:
Howard Hinnant28c97e62010-09-23 16:27:36 +0000649 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000650 iterator find(const key_type& __k) {return __tree_.find(__k);}
Howard Hinnant28c97e62010-09-23 16:27:36 +0000651 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000652 const_iterator find(const key_type& __k) const {return __tree_.find(__k);}
Marshall Clow4a0a9812013-08-13 01:11:06 +0000653#if _LIBCPP_STD_VER > 11
654 template <typename _K2>
655 _LIBCPP_INLINE_VISIBILITY
656 typename enable_if<__is_transparent<_Compare, _K2>::value,iterator>::type
657 find(const _K2& __k) {return __tree_.find(__k);}
658 template <typename _K2>
659 _LIBCPP_INLINE_VISIBILITY
660 typename enable_if<__is_transparent<_Compare, _K2>::value,const_iterator>::type
661 find(const _K2& __k) const {return __tree_.find(__k);}
662#endif
663
Howard Hinnant28c97e62010-09-23 16:27:36 +0000664 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000665 size_type count(const key_type& __k) const
666 {return __tree_.__count_unique(__k);}
Howard Hinnant28c97e62010-09-23 16:27:36 +0000667 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000668 iterator lower_bound(const key_type& __k)
669 {return __tree_.lower_bound(__k);}
Howard Hinnant28c97e62010-09-23 16:27:36 +0000670 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000671 const_iterator lower_bound(const key_type& __k) const
672 {return __tree_.lower_bound(__k);}
Marshall Clow4a0a9812013-08-13 01:11:06 +0000673#if _LIBCPP_STD_VER > 11
674 template <typename _K2>
675 _LIBCPP_INLINE_VISIBILITY
676 typename enable_if<__is_transparent<_Compare, _K2>::value,iterator>::type
677 lower_bound(const _K2& __k) {return __tree_.lower_bound(__k);}
678
679 template <typename _K2>
680 _LIBCPP_INLINE_VISIBILITY
681 typename enable_if<__is_transparent<_Compare, _K2>::value,const_iterator>::type
682 lower_bound(const _K2& __k) const {return __tree_.lower_bound(__k);}
683#endif
684
Howard Hinnant28c97e62010-09-23 16:27:36 +0000685 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000686 iterator upper_bound(const key_type& __k)
687 {return __tree_.upper_bound(__k);}
Howard Hinnant28c97e62010-09-23 16:27:36 +0000688 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000689 const_iterator upper_bound(const key_type& __k) const
690 {return __tree_.upper_bound(__k);}
Marshall Clow4a0a9812013-08-13 01:11:06 +0000691#if _LIBCPP_STD_VER > 11
692 template <typename _K2>
693 _LIBCPP_INLINE_VISIBILITY
694 typename enable_if<__is_transparent<_Compare, _K2>::value,iterator>::type
695 upper_bound(const _K2& __k) {return __tree_.upper_bound(__k);}
696 template <typename _K2>
697 _LIBCPP_INLINE_VISIBILITY
698 typename enable_if<__is_transparent<_Compare, _K2>::value,const_iterator>::type
699 upper_bound(const _K2& __k) const {return __tree_.upper_bound(__k);}
700#endif
701
Howard Hinnant28c97e62010-09-23 16:27:36 +0000702 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000703 pair<iterator,iterator> equal_range(const key_type& __k)
704 {return __tree_.__equal_range_unique(__k);}
Howard Hinnant28c97e62010-09-23 16:27:36 +0000705 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000706 pair<const_iterator,const_iterator> equal_range(const key_type& __k) const
707 {return __tree_.__equal_range_unique(__k);}
Marshall Clow4a0a9812013-08-13 01:11:06 +0000708#if _LIBCPP_STD_VER > 11
709 template <typename _K2>
710 _LIBCPP_INLINE_VISIBILITY
711 typename enable_if<__is_transparent<_Compare, _K2>::value,pair<iterator,iterator>>::type
712 equal_range(const _K2& __k) {return __tree_.__equal_range_unique(__k);}
713 template <typename _K2>
714 _LIBCPP_INLINE_VISIBILITY
715 typename enable_if<__is_transparent<_Compare, _K2>::value,pair<const_iterator,const_iterator>>::type
716 equal_range(const _K2& __k) const {return __tree_.__equal_range_unique(__k);}
717#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000718};
719
Howard Hinnant73d21a42010-09-04 23:28:19 +0000720#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000721
722template <class _Key, class _Compare, class _Allocator>
723set<_Key, _Compare, _Allocator>::set(set&& __s, const allocator_type& __a)
Howard Hinnant0949eed2011-06-30 21:18:19 +0000724 : __tree_(_VSTD::move(__s.__tree_), __a)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000725{
726 if (__a != __s.get_allocator())
727 {
728 const_iterator __e = cend();
729 while (!__s.empty())
Howard Hinnant0949eed2011-06-30 21:18:19 +0000730 insert(__e, _VSTD::move(__s.__tree_.remove(__s.begin())->__value_));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000731 }
732}
733
Howard Hinnant73d21a42010-09-04 23:28:19 +0000734#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000735
736template <class _Key, class _Compare, class _Allocator>
Howard Hinnant28c97e62010-09-23 16:27:36 +0000737inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000738bool
739operator==(const set<_Key, _Compare, _Allocator>& __x,
740 const set<_Key, _Compare, _Allocator>& __y)
741{
Howard Hinnant0949eed2011-06-30 21:18:19 +0000742 return __x.size() == __y.size() && _VSTD::equal(__x.begin(), __x.end(), __y.begin());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000743}
744
745template <class _Key, class _Compare, class _Allocator>
Howard Hinnant28c97e62010-09-23 16:27:36 +0000746inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000747bool
748operator< (const set<_Key, _Compare, _Allocator>& __x,
749 const set<_Key, _Compare, _Allocator>& __y)
750{
Howard Hinnant0949eed2011-06-30 21:18:19 +0000751 return _VSTD::lexicographical_compare(__x.begin(), __x.end(), __y.begin(), __y.end());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000752}
753
754template <class _Key, class _Compare, class _Allocator>
Howard Hinnant28c97e62010-09-23 16:27:36 +0000755inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000756bool
757operator!=(const set<_Key, _Compare, _Allocator>& __x,
758 const set<_Key, _Compare, _Allocator>& __y)
759{
760 return !(__x == __y);
761}
762
763template <class _Key, class _Compare, class _Allocator>
Howard Hinnant28c97e62010-09-23 16:27:36 +0000764inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000765bool
766operator> (const set<_Key, _Compare, _Allocator>& __x,
767 const set<_Key, _Compare, _Allocator>& __y)
768{
769 return __y < __x;
770}
771
772template <class _Key, class _Compare, class _Allocator>
Howard Hinnant28c97e62010-09-23 16:27:36 +0000773inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000774bool
775operator>=(const set<_Key, _Compare, _Allocator>& __x,
776 const set<_Key, _Compare, _Allocator>& __y)
777{
778 return !(__x < __y);
779}
780
781template <class _Key, class _Compare, class _Allocator>
Howard Hinnant28c97e62010-09-23 16:27:36 +0000782inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000783bool
784operator<=(const set<_Key, _Compare, _Allocator>& __x,
785 const set<_Key, _Compare, _Allocator>& __y)
786{
787 return !(__y < __x);
788}
789
790// specialized algorithms:
791template <class _Key, class _Compare, class _Allocator>
Howard Hinnant28c97e62010-09-23 16:27:36 +0000792inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000793void
794swap(set<_Key, _Compare, _Allocator>& __x,
795 set<_Key, _Compare, _Allocator>& __y)
Howard Hinnantb2e2a8f2011-06-04 15:22:34 +0000796 _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000797{
798 __x.swap(__y);
799}
800
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000801template <class _Key, class _Compare = less<_Key>,
802 class _Allocator = allocator<_Key> >
Howard Hinnant0f678bd2013-08-12 18:38:34 +0000803class _LIBCPP_TYPE_VIS_ONLY multiset
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000804{
805public:
806 // types:
807 typedef _Key key_type;
808 typedef key_type value_type;
809 typedef _Compare key_compare;
810 typedef key_compare value_compare;
811 typedef _Allocator allocator_type;
812 typedef value_type& reference;
813 typedef const value_type& const_reference;
814
815private:
816 typedef __tree<value_type, value_compare, allocator_type> __base;
817 typedef allocator_traits<allocator_type> __alloc_traits;
818 typedef typename __base::__node_holder __node_holder;
819
820 __base __tree_;
821
822public:
823 typedef typename __base::pointer pointer;
824 typedef typename __base::const_pointer const_pointer;
825 typedef typename __base::size_type size_type;
826 typedef typename __base::difference_type difference_type;
827 typedef typename __base::const_iterator iterator;
828 typedef typename __base::const_iterator const_iterator;
Howard Hinnant0949eed2011-06-30 21:18:19 +0000829 typedef _VSTD::reverse_iterator<iterator> reverse_iterator;
830 typedef _VSTD::reverse_iterator<const_iterator> const_reverse_iterator;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000831
832 // construct/copy/destroy:
Howard Hinnant28c97e62010-09-23 16:27:36 +0000833 _LIBCPP_INLINE_VISIBILITY
Marshall Clowcaaa1412014-03-10 04:50:10 +0000834 multiset()
835 _NOEXCEPT_(
836 is_nothrow_default_constructible<allocator_type>::value &&
837 is_nothrow_default_constructible<key_compare>::value &&
838 is_nothrow_copy_constructible<key_compare>::value)
839 : __tree_(value_compare()) {}
840
841 _LIBCPP_INLINE_VISIBILITY
842 explicit multiset(const value_compare& __comp)
Howard Hinnantb2e2a8f2011-06-04 15:22:34 +0000843 _NOEXCEPT_(
844 is_nothrow_default_constructible<allocator_type>::value &&
845 is_nothrow_default_constructible<key_compare>::value &&
846 is_nothrow_copy_constructible<key_compare>::value)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000847 : __tree_(__comp) {}
Marshall Clowcaaa1412014-03-10 04:50:10 +0000848
Howard Hinnant28c97e62010-09-23 16:27:36 +0000849 _LIBCPP_INLINE_VISIBILITY
Marshall Clow48c74702014-03-05 19:06:20 +0000850 explicit multiset(const value_compare& __comp, const allocator_type& __a)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000851 : __tree_(__comp, __a) {}
852 template <class _InputIterator>
Howard Hinnant28c97e62010-09-23 16:27:36 +0000853 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000854 multiset(_InputIterator __f, _InputIterator __l,
855 const value_compare& __comp = value_compare())
856 : __tree_(__comp)
857 {
858 insert(__f, __l);
859 }
860
Marshall Clow24a7e332013-09-11 00:06:45 +0000861#if _LIBCPP_STD_VER > 11
862 template <class _InputIterator>
863 _LIBCPP_INLINE_VISIBILITY
864 multiset(_InputIterator __f, _InputIterator __l, const allocator_type& __a)
865 : multiset(__f, __l, key_compare(), __a) {}
866#endif
867
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000868 template <class _InputIterator>
Howard Hinnant28c97e62010-09-23 16:27:36 +0000869 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000870 multiset(_InputIterator __f, _InputIterator __l,
871 const value_compare& __comp, const allocator_type& __a)
872 : __tree_(__comp, __a)
873 {
874 insert(__f, __l);
875 }
876
Howard Hinnant28c97e62010-09-23 16:27:36 +0000877 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000878 multiset(const multiset& __s)
879 : __tree_(__s.__tree_.value_comp(),
880 __alloc_traits::select_on_container_copy_construction(__s.__tree_.__alloc()))
881 {
882 insert(__s.begin(), __s.end());
883 }
884
Howard Hinnant61aa6012011-07-01 19:24:36 +0000885 _LIBCPP_INLINE_VISIBILITY
886 multiset& operator=(const multiset& __s)
887 {
888 __tree_ = __s.__tree_;
889 return *this;
890 }
891
Howard Hinnant73d21a42010-09-04 23:28:19 +0000892#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnant28c97e62010-09-23 16:27:36 +0000893 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000894 multiset(multiset&& __s)
Howard Hinnantb2e2a8f2011-06-04 15:22:34 +0000895 _NOEXCEPT_(is_nothrow_move_constructible<__base>::value)
Howard Hinnant0949eed2011-06-30 21:18:19 +0000896 : __tree_(_VSTD::move(__s.__tree_)) {}
Howard Hinnant73d21a42010-09-04 23:28:19 +0000897#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnant28c97e62010-09-23 16:27:36 +0000898 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000899 explicit multiset(const allocator_type& __a)
900 : __tree_(__a) {}
Howard Hinnant28c97e62010-09-23 16:27:36 +0000901 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000902 multiset(const multiset& __s, const allocator_type& __a)
903 : __tree_(__s.__tree_.value_comp(), __a)
904 {
905 insert(__s.begin(), __s.end());
906 }
Howard Hinnant73d21a42010-09-04 23:28:19 +0000907#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000908 multiset(multiset&& __s, const allocator_type& __a);
909#endif
910
Howard Hinnante3e32912011-08-12 21:56:02 +0000911#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnant28c97e62010-09-23 16:27:36 +0000912 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000913 multiset(initializer_list<value_type> __il, const value_compare& __comp = value_compare())
914 : __tree_(__comp)
915 {
916 insert(__il.begin(), __il.end());
917 }
918
Howard Hinnant28c97e62010-09-23 16:27:36 +0000919 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000920 multiset(initializer_list<value_type> __il, const value_compare& __comp,
921 const allocator_type& __a)
922 : __tree_(__comp, __a)
923 {
924 insert(__il.begin(), __il.end());
925 }
926
Marshall Clow24a7e332013-09-11 00:06:45 +0000927#if _LIBCPP_STD_VER > 11
928 _LIBCPP_INLINE_VISIBILITY
929 multiset(initializer_list<value_type> __il, const allocator_type& __a)
930 : multiset(__il, key_compare(), __a) {}
931#endif
932
Howard Hinnant28c97e62010-09-23 16:27:36 +0000933 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000934 multiset& operator=(initializer_list<value_type> __il)
935 {
936 __tree_.__assign_multi(__il.begin(), __il.end());
937 return *this;
938 }
Howard Hinnante3e32912011-08-12 21:56:02 +0000939#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000940
Howard Hinnant73d21a42010-09-04 23:28:19 +0000941#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnant28c97e62010-09-23 16:27:36 +0000942 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000943 multiset& operator=(multiset&& __s)
Howard Hinnantb2e2a8f2011-06-04 15:22:34 +0000944 _NOEXCEPT_(is_nothrow_move_assignable<__base>::value)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000945 {
Howard Hinnant0949eed2011-06-30 21:18:19 +0000946 __tree_ = _VSTD::move(__s.__tree_);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000947 return *this;
948 }
Howard Hinnant73d21a42010-09-04 23:28:19 +0000949#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000950
Howard Hinnant28c97e62010-09-23 16:27:36 +0000951 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantb2e2a8f2011-06-04 15:22:34 +0000952 iterator begin() _NOEXCEPT {return __tree_.begin();}
Howard Hinnant28c97e62010-09-23 16:27:36 +0000953 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantb2e2a8f2011-06-04 15:22:34 +0000954 const_iterator begin() const _NOEXCEPT {return __tree_.begin();}
Howard Hinnant28c97e62010-09-23 16:27:36 +0000955 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantb2e2a8f2011-06-04 15:22:34 +0000956 iterator end() _NOEXCEPT {return __tree_.end();}
Howard Hinnant28c97e62010-09-23 16:27:36 +0000957 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantb2e2a8f2011-06-04 15:22:34 +0000958 const_iterator end() const _NOEXCEPT {return __tree_.end();}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000959
Howard Hinnant28c97e62010-09-23 16:27:36 +0000960 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantb2e2a8f2011-06-04 15:22:34 +0000961 reverse_iterator rbegin() _NOEXCEPT
962 {return reverse_iterator(end());}
Howard Hinnant28c97e62010-09-23 16:27:36 +0000963 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantb2e2a8f2011-06-04 15:22:34 +0000964 const_reverse_iterator rbegin() const _NOEXCEPT
965 {return const_reverse_iterator(end());}
Howard Hinnant28c97e62010-09-23 16:27:36 +0000966 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantb2e2a8f2011-06-04 15:22:34 +0000967 reverse_iterator rend() _NOEXCEPT
968 {return reverse_iterator(begin());}
Howard Hinnant28c97e62010-09-23 16:27:36 +0000969 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantb2e2a8f2011-06-04 15:22:34 +0000970 const_reverse_iterator rend() const _NOEXCEPT
971 {return const_reverse_iterator(begin());}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000972
Howard Hinnant28c97e62010-09-23 16:27:36 +0000973 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantb2e2a8f2011-06-04 15:22:34 +0000974 const_iterator cbegin() const _NOEXCEPT {return begin();}
Howard Hinnant28c97e62010-09-23 16:27:36 +0000975 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantb2e2a8f2011-06-04 15:22:34 +0000976 const_iterator cend() const _NOEXCEPT {return end();}
Howard Hinnant28c97e62010-09-23 16:27:36 +0000977 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantb2e2a8f2011-06-04 15:22:34 +0000978 const_reverse_iterator crbegin() const _NOEXCEPT {return rbegin();}
Howard Hinnant28c97e62010-09-23 16:27:36 +0000979 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantb2e2a8f2011-06-04 15:22:34 +0000980 const_reverse_iterator crend() const _NOEXCEPT {return rend();}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000981
Howard Hinnant28c97e62010-09-23 16:27:36 +0000982 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantb2e2a8f2011-06-04 15:22:34 +0000983 bool empty() const _NOEXCEPT {return __tree_.size() == 0;}
Howard Hinnant28c97e62010-09-23 16:27:36 +0000984 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantb2e2a8f2011-06-04 15:22:34 +0000985 size_type size() const _NOEXCEPT {return __tree_.size();}
Howard Hinnant28c97e62010-09-23 16:27:36 +0000986 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantb2e2a8f2011-06-04 15:22:34 +0000987 size_type max_size() const _NOEXCEPT {return __tree_.max_size();}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000988
989 // modifiers:
Howard Hinnant73d21a42010-09-04 23:28:19 +0000990#if !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000991 template <class... _Args>
Howard Hinnant28c97e62010-09-23 16:27:36 +0000992 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000993 iterator emplace(_Args&&... __args)
Howard Hinnant0949eed2011-06-30 21:18:19 +0000994 {return __tree_.__emplace_multi(_VSTD::forward<_Args>(__args)...);}
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_hint(const_iterator __p, _Args&&... __args)
Howard Hinnant0949eed2011-06-30 21:18:19 +0000998 {return __tree_.__emplace_hint_multi(__p, _VSTD::forward<_Args>(__args)...);}
Howard Hinnant73d21a42010-09-04 23:28:19 +0000999#endif // !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS)
Howard Hinnant28c97e62010-09-23 16:27:36 +00001000 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001001 iterator insert(const value_type& __v)
1002 {return __tree_.__insert_multi(__v);}
Howard Hinnant73d21a42010-09-04 23:28:19 +00001003#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnant28c97e62010-09-23 16:27:36 +00001004 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001005 iterator insert(value_type&& __v)
Howard Hinnant0949eed2011-06-30 21:18:19 +00001006 {return __tree_.__insert_multi(_VSTD::move(__v));}
Howard Hinnant73d21a42010-09-04 23:28:19 +00001007#endif // _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(const_iterator __p, const value_type& __v)
1010 {return __tree_.__insert_multi(__p, __v);}
Howard Hinnant73d21a42010-09-04 23:28:19 +00001011#ifndef _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, value_type&& __v)
Howard Hinnant0949eed2011-06-30 21:18:19 +00001014 {return __tree_.__insert_multi(_VSTD::move(__v));}
Howard Hinnant73d21a42010-09-04 23:28:19 +00001015#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001016 template <class _InputIterator>
Howard Hinnant28c97e62010-09-23 16:27:36 +00001017 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001018 void insert(_InputIterator __f, _InputIterator __l)
1019 {
1020 for (const_iterator __e = cend(); __f != __l; ++__f)
1021 __tree_.__insert_multi(__e, *__f);
1022 }
1023
Howard Hinnante3e32912011-08-12 21:56:02 +00001024#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnant28c97e62010-09-23 16:27:36 +00001025 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001026 void insert(initializer_list<value_type> __il)
1027 {insert(__il.begin(), __il.end());}
Howard Hinnante3e32912011-08-12 21:56:02 +00001028#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001029
Howard Hinnant28c97e62010-09-23 16:27:36 +00001030 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001031 iterator erase(const_iterator __p) {return __tree_.erase(__p);}
Howard Hinnant28c97e62010-09-23 16:27:36 +00001032 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001033 size_type erase(const key_type& __k) {return __tree_.__erase_multi(__k);}
Howard Hinnant28c97e62010-09-23 16:27:36 +00001034 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001035 iterator erase(const_iterator __f, const_iterator __l)
1036 {return __tree_.erase(__f, __l);}
Howard Hinnant28c97e62010-09-23 16:27:36 +00001037 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantb2e2a8f2011-06-04 15:22:34 +00001038 void clear() _NOEXCEPT {__tree_.clear();}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001039
Howard Hinnant28c97e62010-09-23 16:27:36 +00001040 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantb2e2a8f2011-06-04 15:22:34 +00001041 void swap(multiset& __s)
1042 _NOEXCEPT_(__is_nothrow_swappable<__base>::value)
1043 {__tree_.swap(__s.__tree_);}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001044
Howard Hinnant28c97e62010-09-23 16:27:36 +00001045 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantb2e2a8f2011-06-04 15:22:34 +00001046 allocator_type get_allocator() const _NOEXCEPT {return __tree_.__alloc();}
Howard Hinnant28c97e62010-09-23 16:27:36 +00001047 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001048 key_compare key_comp() const {return __tree_.value_comp();}
Howard Hinnant28c97e62010-09-23 16:27:36 +00001049 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001050 value_compare value_comp() const {return __tree_.value_comp();}
1051
1052 // set operations:
Howard Hinnant28c97e62010-09-23 16:27:36 +00001053 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001054 iterator find(const key_type& __k) {return __tree_.find(__k);}
Howard Hinnant28c97e62010-09-23 16:27:36 +00001055 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001056 const_iterator find(const key_type& __k) const {return __tree_.find(__k);}
Marshall Clow4a0a9812013-08-13 01:11:06 +00001057#if _LIBCPP_STD_VER > 11
1058 template <typename _K2>
1059 _LIBCPP_INLINE_VISIBILITY
1060 typename _VSTD::enable_if<_VSTD::__is_transparent<_Compare, _K2>::value,iterator>::type
1061 find(const _K2& __k) {return __tree_.find(__k);}
1062 template <typename _K2>
1063 _LIBCPP_INLINE_VISIBILITY
1064 typename _VSTD::enable_if<_VSTD::__is_transparent<_Compare, _K2>::value,const_iterator>::type
1065 find(const _K2& __k) const {return __tree_.find(__k);}
1066#endif
1067
Howard Hinnant28c97e62010-09-23 16:27:36 +00001068 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001069 size_type count(const key_type& __k) const
1070 {return __tree_.__count_multi(__k);}
Marshall Clow4a0a9812013-08-13 01:11:06 +00001071
Howard Hinnant28c97e62010-09-23 16:27:36 +00001072 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001073 iterator lower_bound(const key_type& __k)
1074 {return __tree_.lower_bound(__k);}
Howard Hinnant28c97e62010-09-23 16:27:36 +00001075 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001076 const_iterator lower_bound(const key_type& __k) const
1077 {return __tree_.lower_bound(__k);}
Marshall Clow4a0a9812013-08-13 01:11:06 +00001078#if _LIBCPP_STD_VER > 11
1079 template <typename _K2>
1080 _LIBCPP_INLINE_VISIBILITY
1081 typename _VSTD::enable_if<_VSTD::__is_transparent<_Compare, _K2>::value,iterator>::type
1082 lower_bound(const _K2& __k) {return __tree_.lower_bound(__k);}
1083
1084 template <typename _K2>
1085 _LIBCPP_INLINE_VISIBILITY
1086 typename _VSTD::enable_if<_VSTD::__is_transparent<_Compare, _K2>::value,const_iterator>::type
1087 lower_bound(const _K2& __k) const {return __tree_.lower_bound(__k);}
1088#endif
1089
Howard Hinnant28c97e62010-09-23 16:27:36 +00001090 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001091 iterator upper_bound(const key_type& __k)
1092 {return __tree_.upper_bound(__k);}
Howard Hinnant28c97e62010-09-23 16:27:36 +00001093 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001094 const_iterator upper_bound(const key_type& __k) const
1095 {return __tree_.upper_bound(__k);}
Marshall Clow4a0a9812013-08-13 01:11:06 +00001096#if _LIBCPP_STD_VER > 11
1097 template <typename _K2>
1098 _LIBCPP_INLINE_VISIBILITY
1099 typename _VSTD::enable_if<_VSTD::__is_transparent<_Compare, _K2>::value,iterator>::type
1100 upper_bound(const _K2& __k) {return __tree_.upper_bound(__k);}
1101 template <typename _K2>
1102 _LIBCPP_INLINE_VISIBILITY
1103 typename _VSTD::enable_if<_VSTD::__is_transparent<_Compare, _K2>::value,const_iterator>::type
1104 upper_bound(const _K2& __k) const {return __tree_.upper_bound(__k);}
1105#endif
1106
Howard Hinnant28c97e62010-09-23 16:27:36 +00001107 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001108 pair<iterator,iterator> equal_range(const key_type& __k)
1109 {return __tree_.__equal_range_multi(__k);}
Howard Hinnant28c97e62010-09-23 16:27:36 +00001110 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001111 pair<const_iterator,const_iterator> equal_range(const key_type& __k) const
1112 {return __tree_.__equal_range_multi(__k);}
Marshall Clow4a0a9812013-08-13 01:11:06 +00001113#if _LIBCPP_STD_VER > 11
1114 template <typename _K2>
1115 _LIBCPP_INLINE_VISIBILITY
1116 typename _VSTD::enable_if<_VSTD::__is_transparent<_Compare, _K2>::value,pair<iterator,iterator>>::type
1117 equal_range(const _K2& __k) {return __tree_.__equal_range_multi(__k);}
1118 template <typename _K2>
1119 _LIBCPP_INLINE_VISIBILITY
1120 typename _VSTD::enable_if<_VSTD::__is_transparent<_Compare, _K2>::value,pair<const_iterator,const_iterator>>::type
1121 equal_range(const _K2& __k) const {return __tree_.__equal_range_multi(__k);}
1122#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001123};
1124
Howard Hinnant73d21a42010-09-04 23:28:19 +00001125#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001126
1127template <class _Key, class _Compare, class _Allocator>
1128multiset<_Key, _Compare, _Allocator>::multiset(multiset&& __s, const allocator_type& __a)
Howard Hinnant0949eed2011-06-30 21:18:19 +00001129 : __tree_(_VSTD::move(__s.__tree_), __a)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001130{
1131 if (__a != __s.get_allocator())
1132 {
1133 const_iterator __e = cend();
1134 while (!__s.empty())
Howard Hinnant0949eed2011-06-30 21:18:19 +00001135 insert(__e, _VSTD::move(__s.__tree_.remove(__s.begin())->__value_));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001136 }
1137}
1138
Howard Hinnant73d21a42010-09-04 23:28:19 +00001139#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001140
1141template <class _Key, class _Compare, class _Allocator>
Howard Hinnant28c97e62010-09-23 16:27:36 +00001142inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001143bool
1144operator==(const multiset<_Key, _Compare, _Allocator>& __x,
1145 const multiset<_Key, _Compare, _Allocator>& __y)
1146{
Howard Hinnant0949eed2011-06-30 21:18:19 +00001147 return __x.size() == __y.size() && _VSTD::equal(__x.begin(), __x.end(), __y.begin());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001148}
1149
1150template <class _Key, class _Compare, class _Allocator>
Howard Hinnant28c97e62010-09-23 16:27:36 +00001151inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001152bool
1153operator< (const multiset<_Key, _Compare, _Allocator>& __x,
1154 const multiset<_Key, _Compare, _Allocator>& __y)
1155{
Howard Hinnant0949eed2011-06-30 21:18:19 +00001156 return _VSTD::lexicographical_compare(__x.begin(), __x.end(), __y.begin(), __y.end());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001157}
1158
1159template <class _Key, class _Compare, class _Allocator>
Howard Hinnant28c97e62010-09-23 16:27:36 +00001160inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001161bool
1162operator!=(const multiset<_Key, _Compare, _Allocator>& __x,
1163 const multiset<_Key, _Compare, _Allocator>& __y)
1164{
1165 return !(__x == __y);
1166}
1167
1168template <class _Key, class _Compare, class _Allocator>
Howard Hinnant28c97e62010-09-23 16:27:36 +00001169inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001170bool
1171operator> (const multiset<_Key, _Compare, _Allocator>& __x,
1172 const multiset<_Key, _Compare, _Allocator>& __y)
1173{
1174 return __y < __x;
1175}
1176
1177template <class _Key, class _Compare, class _Allocator>
Howard Hinnant28c97e62010-09-23 16:27:36 +00001178inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001179bool
1180operator>=(const multiset<_Key, _Compare, _Allocator>& __x,
1181 const multiset<_Key, _Compare, _Allocator>& __y)
1182{
1183 return !(__x < __y);
1184}
1185
1186template <class _Key, class _Compare, class _Allocator>
Howard Hinnant28c97e62010-09-23 16:27:36 +00001187inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001188bool
1189operator<=(const multiset<_Key, _Compare, _Allocator>& __x,
1190 const multiset<_Key, _Compare, _Allocator>& __y)
1191{
1192 return !(__y < __x);
1193}
1194
1195template <class _Key, class _Compare, class _Allocator>
Howard Hinnant28c97e62010-09-23 16:27:36 +00001196inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001197void
1198swap(multiset<_Key, _Compare, _Allocator>& __x,
1199 multiset<_Key, _Compare, _Allocator>& __y)
Howard Hinnantb2e2a8f2011-06-04 15:22:34 +00001200 _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001201{
1202 __x.swap(__y);
1203}
1204
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001205_LIBCPP_END_NAMESPACE_STD
1206
1207#endif // _LIBCPP_SET