blob: a537c5fe3457bc6f3f584fd8ea670a737070f1ea [file] [log] [blame]
Howard Hinnantbc8d3f92010-05-11 19:42:161// -*- C++ -*-
2//===---------------------------- set -------------------------------------===//
3//
Howard Hinnantf5256e12010-05-11 21:36:014// The LLVM Compiler Infrastructure
Howard Hinnantbc8d3f92010-05-11 19:42:165//
Howard Hinnantb64f8b02010-11-16 22:09:026// 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:168//
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:3445 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:1651 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:3459 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:1663 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:4569 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:1674 ~set();
75
76 set& operator=(const set& s);
Howard Hinnantb2e2a8f2011-06-04 15:22:3477 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:1682 set& operator=(initializer_list<value_type> il);
83
84 // iterators:
Howard Hinnantb2e2a8f2011-06-04 15:22:3485 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:1689
Howard Hinnantb2e2a8f2011-06-04 15:22:3490 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:1694
Howard Hinnantb2e2a8f2011-06-04 15:22:3495 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:1699
100 // capacity:
Howard Hinnantb2e2a8f2011-06-04 15:22:34101 bool empty() const noexcept;
102 size_type size() const noexcept;
103 size_type max_size() const noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16104
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:34121 void clear() noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16122
Howard Hinnantb2e2a8f2011-06-04 15:22:34123 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:16128
129 // observers:
Howard Hinnantb2e2a8f2011-06-04 15:22:34130 allocator_type get_allocator() const noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16131 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:06137 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:16144 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:06147 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:16152 iterator upper_bound(const key_type& k);
153 const_iterator upper_bound(const key_type& k) const;
Marshall Clow4a0a9812013-08-13 01:11:06154 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:16158 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:06160 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:16164};
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:34199swap(set<Key, Compare, Allocator>& x, set<Key, Compare, Allocator>& y)
200 noexcept(noexcept(x.swap(y)));
Howard Hinnantbc8d3f92010-05-11 19:42:16201
Howard Hinnantbc8d3f92010-05-11 19:42:16202template <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:34226 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:16232 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:34240 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:16244 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:45250 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:16255 ~multiset();
256
257 multiset& operator=(const multiset& s);
Howard Hinnantb2e2a8f2011-06-04 15:22:34258 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:16263 multiset& operator=(initializer_list<value_type> il);
264
265 // iterators:
Howard Hinnantb2e2a8f2011-06-04 15:22:34266 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:16270
Howard Hinnantb2e2a8f2011-06-04 15:22:34271 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:16275
Howard Hinnantb2e2a8f2011-06-04 15:22:34276 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:16280
281 // capacity:
Howard Hinnantb2e2a8f2011-06-04 15:22:34282 bool empty() const noexcept;
283 size_type size() const noexcept;
284 size_type max_size() const noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16285
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:34302 void clear() noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16303
Howard Hinnantb2e2a8f2011-06-04 15:22:34304 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:16309
310 // observers:
Howard Hinnantb2e2a8f2011-06-04 15:22:34311 allocator_type get_allocator() const noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16312 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:06318 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:16323 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:06326 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:16331 iterator upper_bound(const key_type& k);
332 const_iterator upper_bound(const key_type& k) const;
Marshall Clow4a0a9812013-08-13 01:11:06333 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:16338 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:06340 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:16344};
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:34379swap(multiset<Key, Compare, Allocator>& x, multiset<Key, Compare, Allocator>& y)
380 noexcept(noexcept(x.swap(y)));
Howard Hinnantbc8d3f92010-05-11 19:42:16381
382} // std
383
384*/
385
386#include <__config>
387#include <__tree>
388#include <functional>
389
Howard Hinnant08e17472011-10-17 20:05:10390#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
Howard Hinnantbc8d3f92010-05-11 19:42:16391#pragma GCC system_header
Howard Hinnant08e17472011-10-17 20:05:10392#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16393
394_LIBCPP_BEGIN_NAMESPACE_STD
395
396template <class _Key, class _Compare = less<_Key>,
397 class _Allocator = allocator<_Key> >
Howard Hinnant0f678bd2013-08-12 18:38:34398class _LIBCPP_TYPE_VIS_ONLY set
Howard Hinnantbc8d3f92010-05-11 19:42:16399{
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:19424 typedef _VSTD::reverse_iterator<iterator> reverse_iterator;
425 typedef _VSTD::reverse_iterator<const_iterator> const_reverse_iterator;
Howard Hinnantbc8d3f92010-05-11 19:42:16426
Howard Hinnant28c97e62010-09-23 16:27:36427 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16428 explicit set(const value_compare& __comp = value_compare())
Howard Hinnantb2e2a8f2011-06-04 15:22:34429 _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)
Howard Hinnantbc8d3f92010-05-11 19:42:16433 : __tree_(__comp) {}
Howard Hinnant28c97e62010-09-23 16:27:36434 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16435 set(const value_compare& __comp, const allocator_type& __a)
436 : __tree_(__comp, __a) {}
437 template <class _InputIterator>
Howard Hinnant28c97e62010-09-23 16:27:36438 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16439 set(_InputIterator __f, _InputIterator __l,
440 const value_compare& __comp = value_compare())
441 : __tree_(__comp)
442 {
443 insert(__f, __l);
444 }
445
446 template <class _InputIterator>
Howard Hinnant28c97e62010-09-23 16:27:36447 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16448 set(_InputIterator __f, _InputIterator __l, const value_compare& __comp,
449 const allocator_type& __a)
450 : __tree_(__comp, __a)
451 {
452 insert(__f, __l);
453 }
454
Marshall Clow24a7e332013-09-11 00:06:45455#if _LIBCPP_STD_VER > 11
456 template <class _InputIterator>
457 _LIBCPP_INLINE_VISIBILITY
458 set(_InputIterator __f, _InputIterator __l, const allocator_type& __a)
459 : set(__f, __l, key_compare(), __a) {}
460#endif
461
Howard Hinnant28c97e62010-09-23 16:27:36462 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16463 set(const set& __s)
464 : __tree_(__s.__tree_)
465 {
466 insert(__s.begin(), __s.end());
467 }
468
Howard Hinnant61aa6012011-07-01 19:24:36469 _LIBCPP_INLINE_VISIBILITY
470 set& operator=(const set& __s)
471 {
472 __tree_ = __s.__tree_;
473 return *this;
474 }
475
Howard Hinnant73d21a42010-09-04 23:28:19476#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnant28c97e62010-09-23 16:27:36477 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16478 set(set&& __s)
Howard Hinnantb2e2a8f2011-06-04 15:22:34479 _NOEXCEPT_(is_nothrow_move_constructible<__base>::value)
Howard Hinnant0949eed2011-06-30 21:18:19480 : __tree_(_VSTD::move(__s.__tree_)) {}
Howard Hinnant73d21a42010-09-04 23:28:19481#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:16482
Howard Hinnant28c97e62010-09-23 16:27:36483 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16484 explicit set(const allocator_type& __a)
485 : __tree_(__a) {}
486
Howard Hinnant28c97e62010-09-23 16:27:36487 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16488 set(const set& __s, const allocator_type& __a)
489 : __tree_(__s.__tree_.value_comp(), __a)
490 {
491 insert(__s.begin(), __s.end());
492 }
493
Howard Hinnant73d21a42010-09-04 23:28:19494#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:16495 set(set&& __s, const allocator_type& __a);
496#endif
497
Howard Hinnante3e32912011-08-12 21:56:02498#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnant28c97e62010-09-23 16:27:36499 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16500 set(initializer_list<value_type> __il, const value_compare& __comp = value_compare())
501 : __tree_(__comp)
502 {
503 insert(__il.begin(), __il.end());
504 }
505
Howard Hinnant28c97e62010-09-23 16:27:36506 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16507 set(initializer_list<value_type> __il, const value_compare& __comp,
508 const allocator_type& __a)
509 : __tree_(__comp, __a)
510 {
511 insert(__il.begin(), __il.end());
512 }
513
Marshall Clow24a7e332013-09-11 00:06:45514#if _LIBCPP_STD_VER > 11
515 _LIBCPP_INLINE_VISIBILITY
516 set(initializer_list<value_type> __il, const allocator_type& __a)
517 : set(__il, key_compare(), __a) {}
518#endif
519
Howard Hinnant28c97e62010-09-23 16:27:36520 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16521 set& operator=(initializer_list<value_type> __il)
522 {
523 __tree_.__assign_unique(__il.begin(), __il.end());
524 return *this;
525 }
Howard Hinnante3e32912011-08-12 21:56:02526#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantbc8d3f92010-05-11 19:42:16527
Howard Hinnant73d21a42010-09-04 23:28:19528#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnant28c97e62010-09-23 16:27:36529 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16530 set& operator=(set&& __s)
Howard Hinnantb2e2a8f2011-06-04 15:22:34531 _NOEXCEPT_(is_nothrow_move_assignable<__base>::value)
Howard Hinnantbc8d3f92010-05-11 19:42:16532 {
Howard Hinnant0949eed2011-06-30 21:18:19533 __tree_ = _VSTD::move(__s.__tree_);
Howard Hinnantbc8d3f92010-05-11 19:42:16534 return *this;
535 }
Howard Hinnant73d21a42010-09-04 23:28:19536#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:16537
Howard Hinnant28c97e62010-09-23 16:27:36538 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantb2e2a8f2011-06-04 15:22:34539 iterator begin() _NOEXCEPT {return __tree_.begin();}
Howard Hinnant28c97e62010-09-23 16:27:36540 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantb2e2a8f2011-06-04 15:22:34541 const_iterator begin() const _NOEXCEPT {return __tree_.begin();}
Howard Hinnant28c97e62010-09-23 16:27:36542 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantb2e2a8f2011-06-04 15:22:34543 iterator end() _NOEXCEPT {return __tree_.end();}
Howard Hinnant28c97e62010-09-23 16:27:36544 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantb2e2a8f2011-06-04 15:22:34545 const_iterator end() const _NOEXCEPT {return __tree_.end();}
Howard Hinnantbc8d3f92010-05-11 19:42:16546
Howard Hinnant28c97e62010-09-23 16:27:36547 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantb2e2a8f2011-06-04 15:22:34548 reverse_iterator rbegin() _NOEXCEPT
549 {return reverse_iterator(end());}
Howard Hinnant28c97e62010-09-23 16:27:36550 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantb2e2a8f2011-06-04 15:22:34551 const_reverse_iterator rbegin() const _NOEXCEPT
552 {return const_reverse_iterator(end());}
Howard Hinnant28c97e62010-09-23 16:27:36553 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantb2e2a8f2011-06-04 15:22:34554 reverse_iterator rend() _NOEXCEPT
555 {return reverse_iterator(begin());}
Howard Hinnant28c97e62010-09-23 16:27:36556 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantb2e2a8f2011-06-04 15:22:34557 const_reverse_iterator rend() const _NOEXCEPT
558 {return const_reverse_iterator(begin());}
Howard Hinnantbc8d3f92010-05-11 19:42:16559
Howard Hinnant28c97e62010-09-23 16:27:36560 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantb2e2a8f2011-06-04 15:22:34561 const_iterator cbegin() const _NOEXCEPT {return begin();}
Howard Hinnant28c97e62010-09-23 16:27:36562 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantb2e2a8f2011-06-04 15:22:34563 const_iterator cend() const _NOEXCEPT {return end();}
Howard Hinnant28c97e62010-09-23 16:27:36564 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantb2e2a8f2011-06-04 15:22:34565 const_reverse_iterator crbegin() const _NOEXCEPT {return rbegin();}
Howard Hinnant28c97e62010-09-23 16:27:36566 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantb2e2a8f2011-06-04 15:22:34567 const_reverse_iterator crend() const _NOEXCEPT {return rend();}
Howard Hinnantbc8d3f92010-05-11 19:42:16568
Howard Hinnant28c97e62010-09-23 16:27:36569 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantb2e2a8f2011-06-04 15:22:34570 bool empty() const _NOEXCEPT {return __tree_.size() == 0;}
Howard Hinnant28c97e62010-09-23 16:27:36571 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantb2e2a8f2011-06-04 15:22:34572 size_type size() const _NOEXCEPT {return __tree_.size();}
Howard Hinnant28c97e62010-09-23 16:27:36573 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantb2e2a8f2011-06-04 15:22:34574 size_type max_size() const _NOEXCEPT {return __tree_.max_size();}
Howard Hinnantbc8d3f92010-05-11 19:42:16575
576 // modifiers:
Howard Hinnant73d21a42010-09-04 23:28:19577#if !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS)
Howard Hinnantbc8d3f92010-05-11 19:42:16578 template <class... _Args>
Howard Hinnant28c97e62010-09-23 16:27:36579 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16580 pair<iterator, bool> emplace(_Args&&... __args)
Howard Hinnant0949eed2011-06-30 21:18:19581 {return __tree_.__emplace_unique(_VSTD::forward<_Args>(__args)...);}
Howard Hinnantbc8d3f92010-05-11 19:42:16582 template <class... _Args>
Howard Hinnant28c97e62010-09-23 16:27:36583 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16584 iterator emplace_hint(const_iterator __p, _Args&&... __args)
Howard Hinnant0949eed2011-06-30 21:18:19585 {return __tree_.__emplace_hint_unique(__p, _VSTD::forward<_Args>(__args)...);}
Howard Hinnant73d21a42010-09-04 23:28:19586#endif // !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS)
Howard Hinnant28c97e62010-09-23 16:27:36587 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16588 pair<iterator,bool> insert(const value_type& __v)
589 {return __tree_.__insert_unique(__v);}
Howard Hinnant73d21a42010-09-04 23:28:19590#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnant28c97e62010-09-23 16:27:36591 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16592 pair<iterator,bool> insert(value_type&& __v)
Howard Hinnant0949eed2011-06-30 21:18:19593 {return __tree_.__insert_unique(_VSTD::move(__v));}
Howard Hinnant73d21a42010-09-04 23:28:19594#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnant28c97e62010-09-23 16:27:36595 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16596 iterator insert(const_iterator __p, const value_type& __v)
597 {return __tree_.__insert_unique(__p, __v);}
Howard Hinnant73d21a42010-09-04 23:28:19598#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnant28c97e62010-09-23 16:27:36599 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16600 iterator insert(const_iterator __p, value_type&& __v)
Howard Hinnant0949eed2011-06-30 21:18:19601 {return __tree_.__insert_unique(__p, _VSTD::move(__v));}
Howard Hinnant73d21a42010-09-04 23:28:19602#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:16603 template <class _InputIterator>
Howard Hinnant28c97e62010-09-23 16:27:36604 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16605 void insert(_InputIterator __f, _InputIterator __l)
606 {
607 for (const_iterator __e = cend(); __f != __l; ++__f)
608 __tree_.__insert_unique(__e, *__f);
609 }
610
Howard Hinnante3e32912011-08-12 21:56:02611#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnant28c97e62010-09-23 16:27:36612 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16613 void insert(initializer_list<value_type> __il)
614 {insert(__il.begin(), __il.end());}
Howard Hinnante3e32912011-08-12 21:56:02615#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantbc8d3f92010-05-11 19:42:16616
Howard Hinnant28c97e62010-09-23 16:27:36617 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16618 iterator erase(const_iterator __p) {return __tree_.erase(__p);}
Howard Hinnant28c97e62010-09-23 16:27:36619 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16620 size_type erase(const key_type& __k)
621 {return __tree_.__erase_unique(__k);}
Howard Hinnant28c97e62010-09-23 16:27:36622 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16623 iterator erase(const_iterator __f, const_iterator __l)
624 {return __tree_.erase(__f, __l);}
Howard Hinnant28c97e62010-09-23 16:27:36625 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantb2e2a8f2011-06-04 15:22:34626 void clear() _NOEXCEPT {__tree_.clear();}
Howard Hinnantbc8d3f92010-05-11 19:42:16627
Howard Hinnant28c97e62010-09-23 16:27:36628 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantb2e2a8f2011-06-04 15:22:34629 void swap(set& __s) _NOEXCEPT_(__is_nothrow_swappable<__base>::value)
630 {__tree_.swap(__s.__tree_);}
Howard Hinnantbc8d3f92010-05-11 19:42:16631
Howard Hinnant28c97e62010-09-23 16:27:36632 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantb2e2a8f2011-06-04 15:22:34633 allocator_type get_allocator() const _NOEXCEPT {return __tree_.__alloc();}
Howard Hinnant28c97e62010-09-23 16:27:36634 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16635 key_compare key_comp() const {return __tree_.value_comp();}
Howard Hinnant28c97e62010-09-23 16:27:36636 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16637 value_compare value_comp() const {return __tree_.value_comp();}
638
639 // set operations:
Howard Hinnant28c97e62010-09-23 16:27:36640 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16641 iterator find(const key_type& __k) {return __tree_.find(__k);}
Howard Hinnant28c97e62010-09-23 16:27:36642 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16643 const_iterator find(const key_type& __k) const {return __tree_.find(__k);}
Marshall Clow4a0a9812013-08-13 01:11:06644#if _LIBCPP_STD_VER > 11
645 template <typename _K2>
646 _LIBCPP_INLINE_VISIBILITY
647 typename enable_if<__is_transparent<_Compare, _K2>::value,iterator>::type
648 find(const _K2& __k) {return __tree_.find(__k);}
649 template <typename _K2>
650 _LIBCPP_INLINE_VISIBILITY
651 typename enable_if<__is_transparent<_Compare, _K2>::value,const_iterator>::type
652 find(const _K2& __k) const {return __tree_.find(__k);}
653#endif
654
Howard Hinnant28c97e62010-09-23 16:27:36655 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16656 size_type count(const key_type& __k) const
657 {return __tree_.__count_unique(__k);}
Howard Hinnant28c97e62010-09-23 16:27:36658 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16659 iterator lower_bound(const key_type& __k)
660 {return __tree_.lower_bound(__k);}
Howard Hinnant28c97e62010-09-23 16:27:36661 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16662 const_iterator lower_bound(const key_type& __k) const
663 {return __tree_.lower_bound(__k);}
Marshall Clow4a0a9812013-08-13 01:11:06664#if _LIBCPP_STD_VER > 11
665 template <typename _K2>
666 _LIBCPP_INLINE_VISIBILITY
667 typename enable_if<__is_transparent<_Compare, _K2>::value,iterator>::type
668 lower_bound(const _K2& __k) {return __tree_.lower_bound(__k);}
669
670 template <typename _K2>
671 _LIBCPP_INLINE_VISIBILITY
672 typename enable_if<__is_transparent<_Compare, _K2>::value,const_iterator>::type
673 lower_bound(const _K2& __k) const {return __tree_.lower_bound(__k);}
674#endif
675
Howard Hinnant28c97e62010-09-23 16:27:36676 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16677 iterator upper_bound(const key_type& __k)
678 {return __tree_.upper_bound(__k);}
Howard Hinnant28c97e62010-09-23 16:27:36679 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16680 const_iterator upper_bound(const key_type& __k) const
681 {return __tree_.upper_bound(__k);}
Marshall Clow4a0a9812013-08-13 01:11:06682#if _LIBCPP_STD_VER > 11
683 template <typename _K2>
684 _LIBCPP_INLINE_VISIBILITY
685 typename enable_if<__is_transparent<_Compare, _K2>::value,iterator>::type
686 upper_bound(const _K2& __k) {return __tree_.upper_bound(__k);}
687 template <typename _K2>
688 _LIBCPP_INLINE_VISIBILITY
689 typename enable_if<__is_transparent<_Compare, _K2>::value,const_iterator>::type
690 upper_bound(const _K2& __k) const {return __tree_.upper_bound(__k);}
691#endif
692
Howard Hinnant28c97e62010-09-23 16:27:36693 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16694 pair<iterator,iterator> equal_range(const key_type& __k)
695 {return __tree_.__equal_range_unique(__k);}
Howard Hinnant28c97e62010-09-23 16:27:36696 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16697 pair<const_iterator,const_iterator> equal_range(const key_type& __k) const
698 {return __tree_.__equal_range_unique(__k);}
Marshall Clow4a0a9812013-08-13 01:11:06699#if _LIBCPP_STD_VER > 11
700 template <typename _K2>
701 _LIBCPP_INLINE_VISIBILITY
702 typename enable_if<__is_transparent<_Compare, _K2>::value,pair<iterator,iterator>>::type
703 equal_range(const _K2& __k) {return __tree_.__equal_range_unique(__k);}
704 template <typename _K2>
705 _LIBCPP_INLINE_VISIBILITY
706 typename enable_if<__is_transparent<_Compare, _K2>::value,pair<const_iterator,const_iterator>>::type
707 equal_range(const _K2& __k) const {return __tree_.__equal_range_unique(__k);}
708#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16709};
710
Howard Hinnant73d21a42010-09-04 23:28:19711#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:16712
713template <class _Key, class _Compare, class _Allocator>
714set<_Key, _Compare, _Allocator>::set(set&& __s, const allocator_type& __a)
Howard Hinnant0949eed2011-06-30 21:18:19715 : __tree_(_VSTD::move(__s.__tree_), __a)
Howard Hinnantbc8d3f92010-05-11 19:42:16716{
717 if (__a != __s.get_allocator())
718 {
719 const_iterator __e = cend();
720 while (!__s.empty())
Howard Hinnant0949eed2011-06-30 21:18:19721 insert(__e, _VSTD::move(__s.__tree_.remove(__s.begin())->__value_));
Howard Hinnantbc8d3f92010-05-11 19:42:16722 }
723}
724
Howard Hinnant73d21a42010-09-04 23:28:19725#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:16726
727template <class _Key, class _Compare, class _Allocator>
Howard Hinnant28c97e62010-09-23 16:27:36728inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16729bool
730operator==(const set<_Key, _Compare, _Allocator>& __x,
731 const set<_Key, _Compare, _Allocator>& __y)
732{
Howard Hinnant0949eed2011-06-30 21:18:19733 return __x.size() == __y.size() && _VSTD::equal(__x.begin(), __x.end(), __y.begin());
Howard Hinnantbc8d3f92010-05-11 19:42:16734}
735
736template <class _Key, class _Compare, class _Allocator>
Howard Hinnant28c97e62010-09-23 16:27:36737inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16738bool
739operator< (const set<_Key, _Compare, _Allocator>& __x,
740 const set<_Key, _Compare, _Allocator>& __y)
741{
Howard Hinnant0949eed2011-06-30 21:18:19742 return _VSTD::lexicographical_compare(__x.begin(), __x.end(), __y.begin(), __y.end());
Howard Hinnantbc8d3f92010-05-11 19:42:16743}
744
745template <class _Key, class _Compare, class _Allocator>
Howard Hinnant28c97e62010-09-23 16:27:36746inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16747bool
748operator!=(const set<_Key, _Compare, _Allocator>& __x,
749 const set<_Key, _Compare, _Allocator>& __y)
750{
751 return !(__x == __y);
752}
753
754template <class _Key, class _Compare, class _Allocator>
Howard Hinnant28c97e62010-09-23 16:27:36755inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16756bool
757operator> (const set<_Key, _Compare, _Allocator>& __x,
758 const set<_Key, _Compare, _Allocator>& __y)
759{
760 return __y < __x;
761}
762
763template <class _Key, class _Compare, class _Allocator>
Howard Hinnant28c97e62010-09-23 16:27:36764inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16765bool
766operator>=(const set<_Key, _Compare, _Allocator>& __x,
767 const set<_Key, _Compare, _Allocator>& __y)
768{
769 return !(__x < __y);
770}
771
772template <class _Key, class _Compare, class _Allocator>
Howard Hinnant28c97e62010-09-23 16:27:36773inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16774bool
775operator<=(const set<_Key, _Compare, _Allocator>& __x,
776 const set<_Key, _Compare, _Allocator>& __y)
777{
778 return !(__y < __x);
779}
780
781// specialized algorithms:
782template <class _Key, class _Compare, class _Allocator>
Howard Hinnant28c97e62010-09-23 16:27:36783inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16784void
785swap(set<_Key, _Compare, _Allocator>& __x,
786 set<_Key, _Compare, _Allocator>& __y)
Howard Hinnantb2e2a8f2011-06-04 15:22:34787 _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
Howard Hinnantbc8d3f92010-05-11 19:42:16788{
789 __x.swap(__y);
790}
791
Howard Hinnantbc8d3f92010-05-11 19:42:16792template <class _Key, class _Compare = less<_Key>,
793 class _Allocator = allocator<_Key> >
Howard Hinnant0f678bd2013-08-12 18:38:34794class _LIBCPP_TYPE_VIS_ONLY multiset
Howard Hinnantbc8d3f92010-05-11 19:42:16795{
796public:
797 // types:
798 typedef _Key key_type;
799 typedef key_type value_type;
800 typedef _Compare key_compare;
801 typedef key_compare value_compare;
802 typedef _Allocator allocator_type;
803 typedef value_type& reference;
804 typedef const value_type& const_reference;
805
806private:
807 typedef __tree<value_type, value_compare, allocator_type> __base;
808 typedef allocator_traits<allocator_type> __alloc_traits;
809 typedef typename __base::__node_holder __node_holder;
810
811 __base __tree_;
812
813public:
814 typedef typename __base::pointer pointer;
815 typedef typename __base::const_pointer const_pointer;
816 typedef typename __base::size_type size_type;
817 typedef typename __base::difference_type difference_type;
818 typedef typename __base::const_iterator iterator;
819 typedef typename __base::const_iterator const_iterator;
Howard Hinnant0949eed2011-06-30 21:18:19820 typedef _VSTD::reverse_iterator<iterator> reverse_iterator;
821 typedef _VSTD::reverse_iterator<const_iterator> const_reverse_iterator;
Howard Hinnantbc8d3f92010-05-11 19:42:16822
823 // construct/copy/destroy:
Howard Hinnant28c97e62010-09-23 16:27:36824 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16825 explicit multiset(const value_compare& __comp = value_compare())
Howard Hinnantb2e2a8f2011-06-04 15:22:34826 _NOEXCEPT_(
827 is_nothrow_default_constructible<allocator_type>::value &&
828 is_nothrow_default_constructible<key_compare>::value &&
829 is_nothrow_copy_constructible<key_compare>::value)
Howard Hinnantbc8d3f92010-05-11 19:42:16830 : __tree_(__comp) {}
Howard Hinnant28c97e62010-09-23 16:27:36831 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16832 multiset(const value_compare& __comp, const allocator_type& __a)
833 : __tree_(__comp, __a) {}
834 template <class _InputIterator>
Howard Hinnant28c97e62010-09-23 16:27:36835 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16836 multiset(_InputIterator __f, _InputIterator __l,
837 const value_compare& __comp = value_compare())
838 : __tree_(__comp)
839 {
840 insert(__f, __l);
841 }
842
Marshall Clow24a7e332013-09-11 00:06:45843#if _LIBCPP_STD_VER > 11
844 template <class _InputIterator>
845 _LIBCPP_INLINE_VISIBILITY
846 multiset(_InputIterator __f, _InputIterator __l, const allocator_type& __a)
847 : multiset(__f, __l, key_compare(), __a) {}
848#endif
849
Howard Hinnantbc8d3f92010-05-11 19:42:16850 template <class _InputIterator>
Howard Hinnant28c97e62010-09-23 16:27:36851 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16852 multiset(_InputIterator __f, _InputIterator __l,
853 const value_compare& __comp, const allocator_type& __a)
854 : __tree_(__comp, __a)
855 {
856 insert(__f, __l);
857 }
858
Howard Hinnant28c97e62010-09-23 16:27:36859 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16860 multiset(const multiset& __s)
861 : __tree_(__s.__tree_.value_comp(),
862 __alloc_traits::select_on_container_copy_construction(__s.__tree_.__alloc()))
863 {
864 insert(__s.begin(), __s.end());
865 }
866
Howard Hinnant61aa6012011-07-01 19:24:36867 _LIBCPP_INLINE_VISIBILITY
868 multiset& operator=(const multiset& __s)
869 {
870 __tree_ = __s.__tree_;
871 return *this;
872 }
873
Howard Hinnant73d21a42010-09-04 23:28:19874#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnant28c97e62010-09-23 16:27:36875 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16876 multiset(multiset&& __s)
Howard Hinnantb2e2a8f2011-06-04 15:22:34877 _NOEXCEPT_(is_nothrow_move_constructible<__base>::value)
Howard Hinnant0949eed2011-06-30 21:18:19878 : __tree_(_VSTD::move(__s.__tree_)) {}
Howard Hinnant73d21a42010-09-04 23:28:19879#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnant28c97e62010-09-23 16:27:36880 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16881 explicit multiset(const allocator_type& __a)
882 : __tree_(__a) {}
Howard Hinnant28c97e62010-09-23 16:27:36883 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16884 multiset(const multiset& __s, const allocator_type& __a)
885 : __tree_(__s.__tree_.value_comp(), __a)
886 {
887 insert(__s.begin(), __s.end());
888 }
Howard Hinnant73d21a42010-09-04 23:28:19889#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:16890 multiset(multiset&& __s, const allocator_type& __a);
891#endif
892
Howard Hinnante3e32912011-08-12 21:56:02893#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnant28c97e62010-09-23 16:27:36894 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16895 multiset(initializer_list<value_type> __il, const value_compare& __comp = value_compare())
896 : __tree_(__comp)
897 {
898 insert(__il.begin(), __il.end());
899 }
900
Howard Hinnant28c97e62010-09-23 16:27:36901 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16902 multiset(initializer_list<value_type> __il, const value_compare& __comp,
903 const allocator_type& __a)
904 : __tree_(__comp, __a)
905 {
906 insert(__il.begin(), __il.end());
907 }
908
Marshall Clow24a7e332013-09-11 00:06:45909#if _LIBCPP_STD_VER > 11
910 _LIBCPP_INLINE_VISIBILITY
911 multiset(initializer_list<value_type> __il, const allocator_type& __a)
912 : multiset(__il, key_compare(), __a) {}
913#endif
914
Howard Hinnant28c97e62010-09-23 16:27:36915 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16916 multiset& operator=(initializer_list<value_type> __il)
917 {
918 __tree_.__assign_multi(__il.begin(), __il.end());
919 return *this;
920 }
Howard Hinnante3e32912011-08-12 21:56:02921#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantbc8d3f92010-05-11 19:42:16922
Howard Hinnant73d21a42010-09-04 23:28:19923#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnant28c97e62010-09-23 16:27:36924 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16925 multiset& operator=(multiset&& __s)
Howard Hinnantb2e2a8f2011-06-04 15:22:34926 _NOEXCEPT_(is_nothrow_move_assignable<__base>::value)
Howard Hinnantbc8d3f92010-05-11 19:42:16927 {
Howard Hinnant0949eed2011-06-30 21:18:19928 __tree_ = _VSTD::move(__s.__tree_);
Howard Hinnantbc8d3f92010-05-11 19:42:16929 return *this;
930 }
Howard Hinnant73d21a42010-09-04 23:28:19931#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:16932
Howard Hinnant28c97e62010-09-23 16:27:36933 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantb2e2a8f2011-06-04 15:22:34934 iterator begin() _NOEXCEPT {return __tree_.begin();}
Howard Hinnant28c97e62010-09-23 16:27:36935 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantb2e2a8f2011-06-04 15:22:34936 const_iterator begin() const _NOEXCEPT {return __tree_.begin();}
Howard Hinnant28c97e62010-09-23 16:27:36937 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantb2e2a8f2011-06-04 15:22:34938 iterator end() _NOEXCEPT {return __tree_.end();}
Howard Hinnant28c97e62010-09-23 16:27:36939 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantb2e2a8f2011-06-04 15:22:34940 const_iterator end() const _NOEXCEPT {return __tree_.end();}
Howard Hinnantbc8d3f92010-05-11 19:42:16941
Howard Hinnant28c97e62010-09-23 16:27:36942 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantb2e2a8f2011-06-04 15:22:34943 reverse_iterator rbegin() _NOEXCEPT
944 {return reverse_iterator(end());}
Howard Hinnant28c97e62010-09-23 16:27:36945 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantb2e2a8f2011-06-04 15:22:34946 const_reverse_iterator rbegin() const _NOEXCEPT
947 {return const_reverse_iterator(end());}
Howard Hinnant28c97e62010-09-23 16:27:36948 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantb2e2a8f2011-06-04 15:22:34949 reverse_iterator rend() _NOEXCEPT
950 {return reverse_iterator(begin());}
Howard Hinnant28c97e62010-09-23 16:27:36951 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantb2e2a8f2011-06-04 15:22:34952 const_reverse_iterator rend() const _NOEXCEPT
953 {return const_reverse_iterator(begin());}
Howard Hinnantbc8d3f92010-05-11 19:42:16954
Howard Hinnant28c97e62010-09-23 16:27:36955 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantb2e2a8f2011-06-04 15:22:34956 const_iterator cbegin() const _NOEXCEPT {return begin();}
Howard Hinnant28c97e62010-09-23 16:27:36957 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantb2e2a8f2011-06-04 15:22:34958 const_iterator cend() const _NOEXCEPT {return end();}
Howard Hinnant28c97e62010-09-23 16:27:36959 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantb2e2a8f2011-06-04 15:22:34960 const_reverse_iterator crbegin() const _NOEXCEPT {return rbegin();}
Howard Hinnant28c97e62010-09-23 16:27:36961 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantb2e2a8f2011-06-04 15:22:34962 const_reverse_iterator crend() const _NOEXCEPT {return rend();}
Howard Hinnantbc8d3f92010-05-11 19:42:16963
Howard Hinnant28c97e62010-09-23 16:27:36964 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantb2e2a8f2011-06-04 15:22:34965 bool empty() const _NOEXCEPT {return __tree_.size() == 0;}
Howard Hinnant28c97e62010-09-23 16:27:36966 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantb2e2a8f2011-06-04 15:22:34967 size_type size() const _NOEXCEPT {return __tree_.size();}
Howard Hinnant28c97e62010-09-23 16:27:36968 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantb2e2a8f2011-06-04 15:22:34969 size_type max_size() const _NOEXCEPT {return __tree_.max_size();}
Howard Hinnantbc8d3f92010-05-11 19:42:16970
971 // modifiers:
Howard Hinnant73d21a42010-09-04 23:28:19972#if !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS)
Howard Hinnantbc8d3f92010-05-11 19:42:16973 template <class... _Args>
Howard Hinnant28c97e62010-09-23 16:27:36974 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16975 iterator emplace(_Args&&... __args)
Howard Hinnant0949eed2011-06-30 21:18:19976 {return __tree_.__emplace_multi(_VSTD::forward<_Args>(__args)...);}
Howard Hinnantbc8d3f92010-05-11 19:42:16977 template <class... _Args>
Howard Hinnant28c97e62010-09-23 16:27:36978 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16979 iterator emplace_hint(const_iterator __p, _Args&&... __args)
Howard Hinnant0949eed2011-06-30 21:18:19980 {return __tree_.__emplace_hint_multi(__p, _VSTD::forward<_Args>(__args)...);}
Howard Hinnant73d21a42010-09-04 23:28:19981#endif // !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS)
Howard Hinnant28c97e62010-09-23 16:27:36982 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16983 iterator insert(const value_type& __v)
984 {return __tree_.__insert_multi(__v);}
Howard Hinnant73d21a42010-09-04 23:28:19985#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnant28c97e62010-09-23 16:27:36986 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16987 iterator insert(value_type&& __v)
Howard Hinnant0949eed2011-06-30 21:18:19988 {return __tree_.__insert_multi(_VSTD::move(__v));}
Howard Hinnant73d21a42010-09-04 23:28:19989#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnant28c97e62010-09-23 16:27:36990 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16991 iterator insert(const_iterator __p, const value_type& __v)
992 {return __tree_.__insert_multi(__p, __v);}
Howard Hinnant73d21a42010-09-04 23:28:19993#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnant28c97e62010-09-23 16:27:36994 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16995 iterator insert(const_iterator __p, value_type&& __v)
Howard Hinnant0949eed2011-06-30 21:18:19996 {return __tree_.__insert_multi(_VSTD::move(__v));}
Howard Hinnant73d21a42010-09-04 23:28:19997#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:16998 template <class _InputIterator>
Howard Hinnant28c97e62010-09-23 16:27:36999 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161000 void insert(_InputIterator __f, _InputIterator __l)
1001 {
1002 for (const_iterator __e = cend(); __f != __l; ++__f)
1003 __tree_.__insert_multi(__e, *__f);
1004 }
1005
Howard Hinnante3e32912011-08-12 21:56:021006#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnant28c97e62010-09-23 16:27:361007 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161008 void insert(initializer_list<value_type> __il)
1009 {insert(__il.begin(), __il.end());}
Howard Hinnante3e32912011-08-12 21:56:021010#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantbc8d3f92010-05-11 19:42:161011
Howard Hinnant28c97e62010-09-23 16:27:361012 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161013 iterator erase(const_iterator __p) {return __tree_.erase(__p);}
Howard Hinnant28c97e62010-09-23 16:27:361014 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161015 size_type erase(const key_type& __k) {return __tree_.__erase_multi(__k);}
Howard Hinnant28c97e62010-09-23 16:27:361016 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161017 iterator erase(const_iterator __f, const_iterator __l)
1018 {return __tree_.erase(__f, __l);}
Howard Hinnant28c97e62010-09-23 16:27:361019 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantb2e2a8f2011-06-04 15:22:341020 void clear() _NOEXCEPT {__tree_.clear();}
Howard Hinnantbc8d3f92010-05-11 19:42:161021
Howard Hinnant28c97e62010-09-23 16:27:361022 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantb2e2a8f2011-06-04 15:22:341023 void swap(multiset& __s)
1024 _NOEXCEPT_(__is_nothrow_swappable<__base>::value)
1025 {__tree_.swap(__s.__tree_);}
Howard Hinnantbc8d3f92010-05-11 19:42:161026
Howard Hinnant28c97e62010-09-23 16:27:361027 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantb2e2a8f2011-06-04 15:22:341028 allocator_type get_allocator() const _NOEXCEPT {return __tree_.__alloc();}
Howard Hinnant28c97e62010-09-23 16:27:361029 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161030 key_compare key_comp() const {return __tree_.value_comp();}
Howard Hinnant28c97e62010-09-23 16:27:361031 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161032 value_compare value_comp() const {return __tree_.value_comp();}
1033
1034 // set operations:
Howard Hinnant28c97e62010-09-23 16:27:361035 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161036 iterator find(const key_type& __k) {return __tree_.find(__k);}
Howard Hinnant28c97e62010-09-23 16:27:361037 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161038 const_iterator find(const key_type& __k) const {return __tree_.find(__k);}
Marshall Clow4a0a9812013-08-13 01:11:061039#if _LIBCPP_STD_VER > 11
1040 template <typename _K2>
1041 _LIBCPP_INLINE_VISIBILITY
1042 typename _VSTD::enable_if<_VSTD::__is_transparent<_Compare, _K2>::value,iterator>::type
1043 find(const _K2& __k) {return __tree_.find(__k);}
1044 template <typename _K2>
1045 _LIBCPP_INLINE_VISIBILITY
1046 typename _VSTD::enable_if<_VSTD::__is_transparent<_Compare, _K2>::value,const_iterator>::type
1047 find(const _K2& __k) const {return __tree_.find(__k);}
1048#endif
1049
Howard Hinnant28c97e62010-09-23 16:27:361050 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161051 size_type count(const key_type& __k) const
1052 {return __tree_.__count_multi(__k);}
Marshall Clow4a0a9812013-08-13 01:11:061053
Howard Hinnant28c97e62010-09-23 16:27:361054 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161055 iterator lower_bound(const key_type& __k)
1056 {return __tree_.lower_bound(__k);}
Howard Hinnant28c97e62010-09-23 16:27:361057 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161058 const_iterator lower_bound(const key_type& __k) const
1059 {return __tree_.lower_bound(__k);}
Marshall Clow4a0a9812013-08-13 01:11:061060#if _LIBCPP_STD_VER > 11
1061 template <typename _K2>
1062 _LIBCPP_INLINE_VISIBILITY
1063 typename _VSTD::enable_if<_VSTD::__is_transparent<_Compare, _K2>::value,iterator>::type
1064 lower_bound(const _K2& __k) {return __tree_.lower_bound(__k);}
1065
1066 template <typename _K2>
1067 _LIBCPP_INLINE_VISIBILITY
1068 typename _VSTD::enable_if<_VSTD::__is_transparent<_Compare, _K2>::value,const_iterator>::type
1069 lower_bound(const _K2& __k) const {return __tree_.lower_bound(__k);}
1070#endif
1071
Howard Hinnant28c97e62010-09-23 16:27:361072 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161073 iterator upper_bound(const key_type& __k)
1074 {return __tree_.upper_bound(__k);}
Howard Hinnant28c97e62010-09-23 16:27:361075 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161076 const_iterator upper_bound(const key_type& __k) const
1077 {return __tree_.upper_bound(__k);}
Marshall Clow4a0a9812013-08-13 01:11:061078#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 upper_bound(const _K2& __k) {return __tree_.upper_bound(__k);}
1083 template <typename _K2>
1084 _LIBCPP_INLINE_VISIBILITY
1085 typename _VSTD::enable_if<_VSTD::__is_transparent<_Compare, _K2>::value,const_iterator>::type
1086 upper_bound(const _K2& __k) const {return __tree_.upper_bound(__k);}
1087#endif
1088
Howard Hinnant28c97e62010-09-23 16:27:361089 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161090 pair<iterator,iterator> equal_range(const key_type& __k)
1091 {return __tree_.__equal_range_multi(__k);}
Howard Hinnant28c97e62010-09-23 16:27:361092 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161093 pair<const_iterator,const_iterator> equal_range(const key_type& __k) const
1094 {return __tree_.__equal_range_multi(__k);}
Marshall Clow4a0a9812013-08-13 01:11:061095#if _LIBCPP_STD_VER > 11
1096 template <typename _K2>
1097 _LIBCPP_INLINE_VISIBILITY
1098 typename _VSTD::enable_if<_VSTD::__is_transparent<_Compare, _K2>::value,pair<iterator,iterator>>::type
1099 equal_range(const _K2& __k) {return __tree_.__equal_range_multi(__k);}
1100 template <typename _K2>
1101 _LIBCPP_INLINE_VISIBILITY
1102 typename _VSTD::enable_if<_VSTD::__is_transparent<_Compare, _K2>::value,pair<const_iterator,const_iterator>>::type
1103 equal_range(const _K2& __k) const {return __tree_.__equal_range_multi(__k);}
1104#endif
Howard Hinnantbc8d3f92010-05-11 19:42:161105};
1106
Howard Hinnant73d21a42010-09-04 23:28:191107#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:161108
1109template <class _Key, class _Compare, class _Allocator>
1110multiset<_Key, _Compare, _Allocator>::multiset(multiset&& __s, const allocator_type& __a)
Howard Hinnant0949eed2011-06-30 21:18:191111 : __tree_(_VSTD::move(__s.__tree_), __a)
Howard Hinnantbc8d3f92010-05-11 19:42:161112{
1113 if (__a != __s.get_allocator())
1114 {
1115 const_iterator __e = cend();
1116 while (!__s.empty())
Howard Hinnant0949eed2011-06-30 21:18:191117 insert(__e, _VSTD::move(__s.__tree_.remove(__s.begin())->__value_));
Howard Hinnantbc8d3f92010-05-11 19:42:161118 }
1119}
1120
Howard Hinnant73d21a42010-09-04 23:28:191121#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:161122
1123template <class _Key, class _Compare, class _Allocator>
Howard Hinnant28c97e62010-09-23 16:27:361124inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161125bool
1126operator==(const multiset<_Key, _Compare, _Allocator>& __x,
1127 const multiset<_Key, _Compare, _Allocator>& __y)
1128{
Howard Hinnant0949eed2011-06-30 21:18:191129 return __x.size() == __y.size() && _VSTD::equal(__x.begin(), __x.end(), __y.begin());
Howard Hinnantbc8d3f92010-05-11 19:42:161130}
1131
1132template <class _Key, class _Compare, class _Allocator>
Howard Hinnant28c97e62010-09-23 16:27:361133inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161134bool
1135operator< (const multiset<_Key, _Compare, _Allocator>& __x,
1136 const multiset<_Key, _Compare, _Allocator>& __y)
1137{
Howard Hinnant0949eed2011-06-30 21:18:191138 return _VSTD::lexicographical_compare(__x.begin(), __x.end(), __y.begin(), __y.end());
Howard Hinnantbc8d3f92010-05-11 19:42:161139}
1140
1141template <class _Key, class _Compare, class _Allocator>
Howard Hinnant28c97e62010-09-23 16:27:361142inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161143bool
1144operator!=(const multiset<_Key, _Compare, _Allocator>& __x,
1145 const multiset<_Key, _Compare, _Allocator>& __y)
1146{
1147 return !(__x == __y);
1148}
1149
1150template <class _Key, class _Compare, class _Allocator>
Howard Hinnant28c97e62010-09-23 16:27:361151inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161152bool
1153operator> (const multiset<_Key, _Compare, _Allocator>& __x,
1154 const multiset<_Key, _Compare, _Allocator>& __y)
1155{
1156 return __y < __x;
1157}
1158
1159template <class _Key, class _Compare, class _Allocator>
Howard Hinnant28c97e62010-09-23 16:27:361160inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161161bool
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:361169inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161170bool
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:361178inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161179void
1180swap(multiset<_Key, _Compare, _Allocator>& __x,
1181 multiset<_Key, _Compare, _Allocator>& __y)
Howard Hinnantb2e2a8f2011-06-04 15:22:341182 _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
Howard Hinnantbc8d3f92010-05-11 19:42:161183{
1184 __x.swap(__y);
1185}
1186
Howard Hinnantbc8d3f92010-05-11 19:42:161187_LIBCPP_END_NAMESPACE_STD
1188
1189#endif // _LIBCPP_SET