]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/libc++/include/set
Upgrade to OpenSSH 6.8p1.
[FreeBSD/FreeBSD.git] / contrib / libc++ / include / set
1 // -*- C++ -*-
2 //===---------------------------- set -------------------------------------===//
3 //
4 //                     The LLVM Compiler Infrastructure
5 //
6 // This file is dual licensed under the MIT and the University of Illinois Open
7 // Source Licenses. See LICENSE.TXT for details.
8 //
9 //===----------------------------------------------------------------------===//
10
11 #ifndef _LIBCPP_SET
12 #define _LIBCPP_SET
13
14 /*
15
16     set synopsis
17
18 namespace std
19 {
20
21 template <class Key, class Compare = less<Key>,
22           class Allocator = allocator<Key>>
23 class set
24 {
25 public:
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:
45     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);
51     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);
59     set(set&& s)
60         noexcept(
61             is_nothrow_move_constructible<allocator_type>::value &&
62             is_nothrow_move_constructible<key_compare>::value);
63     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);
69     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
74     ~set();
75
76     set& operator=(const set& s);
77     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);
82     set& operator=(initializer_list<value_type> il);
83
84     // iterators:
85           iterator begin() noexcept;
86     const_iterator begin() const noexcept;
87           iterator end() noexcept;
88     const_iterator end()   const noexcept;
89
90           reverse_iterator rbegin() noexcept;
91     const_reverse_iterator rbegin() const noexcept;
92           reverse_iterator rend() noexcept;
93     const_reverse_iterator rend()   const noexcept;
94
95     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;
99
100     // capacity:
101     bool      empty()    const noexcept;
102     size_type size()     const noexcept;
103     size_type max_size() const noexcept;
104
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     iterator  erase(iterator position);  // C++14
120     size_type erase(const key_type& k);
121     iterator  erase(const_iterator first, const_iterator last);
122     void clear() noexcept;
123
124     void swap(set& s)
125         noexcept(
126             __is_nothrow_swappable<key_compare>::value &&
127             (!allocator_type::propagate_on_container_swap::value ||
128              __is_nothrow_swappable<allocator_type>::value));
129
130     // observers:
131     allocator_type get_allocator() const noexcept;
132     key_compare    key_comp()      const;
133     value_compare  value_comp()    const;
134
135     // set operations:
136           iterator find(const key_type& k);
137     const_iterator find(const key_type& k) const;
138     template<typename K>
139         iterator find(const K& x);
140     template<typename K>
141         const_iterator find(const K& x) const;  // C++14
142     template<typename K>
143       size_type count(const K& x) const;        // C++14
144
145     size_type      count(const key_type& k) const;
146           iterator lower_bound(const key_type& k);
147     const_iterator lower_bound(const key_type& k) const;
148     template<typename K>
149         iterator lower_bound(const K& x);              // C++14
150     template<typename K>
151         const_iterator lower_bound(const K& x) const;  // C++14
152
153           iterator upper_bound(const key_type& k);
154     const_iterator upper_bound(const key_type& k) const;
155     template<typename K>
156         iterator upper_bound(const K& x);              // C++14
157     template<typename K>
158         const_iterator upper_bound(const K& x) const;  // C++14
159     pair<iterator,iterator>             equal_range(const key_type& k);
160     pair<const_iterator,const_iterator> equal_range(const key_type& k) const;
161     template<typename K>
162         pair<iterator,iterator>             equal_range(const K& x);        // C++14
163     template<typename K>
164         pair<const_iterator,const_iterator> equal_range(const K& x) const;  // C++14
165 };
166
167 template <class Key, class Compare, class Allocator>
168 bool
169 operator==(const set<Key, Compare, Allocator>& x,
170            const set<Key, Compare, Allocator>& y);
171
172 template <class Key, class Compare, class Allocator>
173 bool
174 operator< (const set<Key, Compare, Allocator>& x,
175            const set<Key, Compare, Allocator>& y);
176
177 template <class Key, class Compare, class Allocator>
178 bool
179 operator!=(const set<Key, Compare, Allocator>& x,
180            const set<Key, Compare, Allocator>& y);
181
182 template <class Key, class Compare, class Allocator>
183 bool
184 operator> (const set<Key, Compare, Allocator>& x,
185            const set<Key, Compare, Allocator>& y);
186
187 template <class Key, class Compare, class Allocator>
188 bool
189 operator>=(const set<Key, Compare, Allocator>& x,
190            const set<Key, Compare, Allocator>& y);
191
192 template <class Key, class Compare, class Allocator>
193 bool
194 operator<=(const set<Key, Compare, Allocator>& x,
195            const set<Key, Compare, Allocator>& y);
196
197 // specialized algorithms:
198 template <class Key, class Compare, class Allocator>
199 void
200 swap(set<Key, Compare, Allocator>& x, set<Key, Compare, Allocator>& y)
201     noexcept(noexcept(x.swap(y)));
202
203 template <class Key, class Compare = less<Key>,
204           class Allocator = allocator<Key>>
205 class multiset
206 {
207 public:
208     // types:
209     typedef Key                                      key_type;
210     typedef key_type                                 value_type;
211     typedef Compare                                  key_compare;
212     typedef key_compare                              value_compare;
213     typedef Allocator                                allocator_type;
214     typedef typename allocator_type::reference       reference;
215     typedef typename allocator_type::const_reference const_reference;
216     typedef typename allocator_type::size_type       size_type;
217     typedef typename allocator_type::difference_type difference_type;
218     typedef typename allocator_type::pointer         pointer;
219     typedef typename allocator_type::const_pointer   const_pointer;
220
221     typedef implementation-defined                   iterator;
222     typedef implementation-defined                   const_iterator;
223     typedef std::reverse_iterator<iterator>          reverse_iterator;
224     typedef std::reverse_iterator<const_iterator>    const_reverse_iterator;
225
226     // construct/copy/destroy:
227     multiset()
228         noexcept(
229             is_nothrow_default_constructible<allocator_type>::value &&
230             is_nothrow_default_constructible<key_compare>::value &&
231             is_nothrow_copy_constructible<key_compare>::value);
232     explicit multiset(const value_compare& comp);
233     multiset(const value_compare& comp, const allocator_type& a);
234     template <class InputIterator>
235         multiset(InputIterator first, InputIterator last,
236                  const value_compare& comp = value_compare());
237     template <class InputIterator>
238         multiset(InputIterator first, InputIterator last,
239                  const value_compare& comp, const allocator_type& a);
240     multiset(const multiset& s);
241     multiset(multiset&& s)
242         noexcept(
243             is_nothrow_move_constructible<allocator_type>::value &&
244             is_nothrow_move_constructible<key_compare>::value);
245     explicit multiset(const allocator_type& a);
246     multiset(const multiset& s, const allocator_type& a);
247     multiset(multiset&& s, const allocator_type& a);
248     multiset(initializer_list<value_type> il, const value_compare& comp = value_compare());
249     multiset(initializer_list<value_type> il, const value_compare& comp,
250              const allocator_type& a);
251     template <class InputIterator>
252         multiset(InputIterator first, InputIterator last, const allocator_type& a)
253             : set(first, last, Compare(), a) {}  // C++14
254     multiset(initializer_list<value_type> il, const allocator_type& a)
255         : set(il, Compare(), a) {}  // C++14
256     ~multiset();
257
258     multiset& operator=(const multiset& s);
259     multiset& operator=(multiset&& s)
260         noexcept(
261             allocator_type::propagate_on_container_move_assignment::value &&
262             is_nothrow_move_assignable<allocator_type>::value &&
263             is_nothrow_move_assignable<key_compare>::value);
264     multiset& operator=(initializer_list<value_type> il);
265
266     // iterators:
267           iterator begin() noexcept;
268     const_iterator begin() const noexcept;
269           iterator end() noexcept;
270     const_iterator end()   const noexcept;
271
272           reverse_iterator rbegin() noexcept;
273     const_reverse_iterator rbegin() const noexcept;
274           reverse_iterator rend() noexcept;
275     const_reverse_iterator rend()   const noexcept;
276
277     const_iterator         cbegin()  const noexcept;
278     const_iterator         cend()    const noexcept;
279     const_reverse_iterator crbegin() const noexcept;
280     const_reverse_iterator crend()   const noexcept;
281
282     // capacity:
283     bool      empty()    const noexcept;
284     size_type size()     const noexcept;
285     size_type max_size() const noexcept;
286
287     // modifiers:
288     template <class... Args>
289         iterator emplace(Args&&... args);
290     template <class... Args>
291         iterator emplace_hint(const_iterator position, Args&&... args);
292     iterator insert(const value_type& v);
293     iterator insert(value_type&& v);
294     iterator insert(const_iterator position, const value_type& v);
295     iterator insert(const_iterator position, value_type&& v);
296     template <class InputIterator>
297         void insert(InputIterator first, InputIterator last);
298     void insert(initializer_list<value_type> il);
299
300     iterator  erase(const_iterator position);
301     iterator  erase(iterator position);  // C++14
302     size_type erase(const key_type& k);
303     iterator  erase(const_iterator first, const_iterator last);
304     void clear() noexcept;
305
306     void swap(multiset& s)
307         noexcept(
308             __is_nothrow_swappable<key_compare>::value &&
309             (!allocator_type::propagate_on_container_swap::value ||
310              __is_nothrow_swappable<allocator_type>::value));
311
312     // observers:
313     allocator_type get_allocator() const noexcept;
314     key_compare    key_comp()      const;
315     value_compare  value_comp()    const;
316
317     // set operations:
318           iterator find(const key_type& k);
319     const_iterator find(const key_type& k) const;
320     template<typename K>
321         iterator find(const K& x);
322     template<typename K>
323         const_iterator find(const K& x) const;  // C++14
324
325     size_type      count(const key_type& k) const;
326           iterator lower_bound(const key_type& k);
327     const_iterator lower_bound(const key_type& k) const;
328     template<typename K>
329         iterator lower_bound(const K& x);              // C++14
330     template<typename K>
331         const_iterator lower_bound(const K& x) const;  // C++14
332
333           iterator upper_bound(const key_type& k);
334     const_iterator upper_bound(const key_type& k) const;
335     template<typename K>
336         iterator upper_bound(const K& x);              // C++14
337     template<typename K>
338         const_iterator upper_bound(const K& x) const;  // C++14
339
340     pair<iterator,iterator>             equal_range(const key_type& k);
341     pair<const_iterator,const_iterator> equal_range(const key_type& k) const;
342     template<typename K>
343         pair<iterator,iterator>             equal_range(const K& x);        // C++14
344     template<typename K>
345         pair<const_iterator,const_iterator> equal_range(const K& x) const;  // C++14
346 };
347
348 template <class Key, class Compare, class Allocator>
349 bool
350 operator==(const multiset<Key, Compare, Allocator>& x,
351            const multiset<Key, Compare, Allocator>& y);
352
353 template <class Key, class Compare, class Allocator>
354 bool
355 operator< (const multiset<Key, Compare, Allocator>& x,
356            const multiset<Key, Compare, Allocator>& y);
357
358 template <class Key, class Compare, class Allocator>
359 bool
360 operator!=(const multiset<Key, Compare, Allocator>& x,
361            const multiset<Key, Compare, Allocator>& y);
362
363 template <class Key, class Compare, class Allocator>
364 bool
365 operator> (const multiset<Key, Compare, Allocator>& x,
366            const multiset<Key, Compare, Allocator>& y);
367
368 template <class Key, class Compare, class Allocator>
369 bool
370 operator>=(const multiset<Key, Compare, Allocator>& x,
371            const multiset<Key, Compare, Allocator>& y);
372
373 template <class Key, class Compare, class Allocator>
374 bool
375 operator<=(const multiset<Key, Compare, Allocator>& x,
376            const multiset<Key, Compare, Allocator>& y);
377
378 // specialized algorithms:
379 template <class Key, class Compare, class Allocator>
380 void
381 swap(multiset<Key, Compare, Allocator>& x, multiset<Key, Compare, Allocator>& y)
382     noexcept(noexcept(x.swap(y)));
383
384 }  // std
385
386 */
387
388 #include <__config>
389 #include <__tree>
390 #include <functional>
391
392 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
393 #pragma GCC system_header
394 #endif
395
396 _LIBCPP_BEGIN_NAMESPACE_STD
397
398 template <class _Key, class _Compare = less<_Key>,
399           class _Allocator = allocator<_Key> >
400 class _LIBCPP_TYPE_VIS_ONLY set
401 {
402 public:
403     // types:
404     typedef _Key                                     key_type;
405     typedef key_type                                 value_type;
406     typedef _Compare                                 key_compare;
407     typedef key_compare                              value_compare;
408     typedef _Allocator                               allocator_type;
409     typedef value_type&                              reference;
410     typedef const value_type&                        const_reference;
411
412 private:
413     typedef __tree<value_type, value_compare, allocator_type> __base;
414     typedef allocator_traits<allocator_type>                  __alloc_traits;
415     typedef typename __base::__node_holder                    __node_holder;
416
417     __base __tree_;
418
419 public:
420     typedef typename __base::pointer               pointer;
421     typedef typename __base::const_pointer         const_pointer;
422     typedef typename __base::size_type             size_type;
423     typedef typename __base::difference_type       difference_type;
424     typedef typename __base::const_iterator        iterator;
425     typedef typename __base::const_iterator        const_iterator;
426     typedef _VSTD::reverse_iterator<iterator>       reverse_iterator;
427     typedef _VSTD::reverse_iterator<const_iterator> const_reverse_iterator;
428
429     _LIBCPP_INLINE_VISIBILITY
430     set()
431         _NOEXCEPT_(
432             is_nothrow_default_constructible<allocator_type>::value &&
433             is_nothrow_default_constructible<key_compare>::value &&
434             is_nothrow_copy_constructible<key_compare>::value)
435         : __tree_(value_compare()) {}
436
437     _LIBCPP_INLINE_VISIBILITY
438     explicit set(const value_compare& __comp)
439         _NOEXCEPT_(
440             is_nothrow_default_constructible<allocator_type>::value &&
441             is_nothrow_copy_constructible<key_compare>::value)
442         : __tree_(__comp) {}
443
444     _LIBCPP_INLINE_VISIBILITY
445     explicit set(const value_compare& __comp, const allocator_type& __a)
446         : __tree_(__comp, __a) {}
447     template <class _InputIterator>
448         _LIBCPP_INLINE_VISIBILITY
449         set(_InputIterator __f, _InputIterator __l,
450             const value_compare& __comp = value_compare())
451         : __tree_(__comp)
452         {
453             insert(__f, __l);
454         }
455
456     template <class _InputIterator>
457         _LIBCPP_INLINE_VISIBILITY
458         set(_InputIterator __f, _InputIterator __l, const value_compare& __comp,
459             const allocator_type& __a)
460         : __tree_(__comp, __a)
461         {
462             insert(__f, __l);
463         }
464
465 #if _LIBCPP_STD_VER > 11
466         template <class _InputIterator>
467         _LIBCPP_INLINE_VISIBILITY 
468         set(_InputIterator __f, _InputIterator __l, const allocator_type& __a)
469             : set(__f, __l, key_compare(), __a) {}
470 #endif
471
472     _LIBCPP_INLINE_VISIBILITY
473     set(const set& __s)
474         : __tree_(__s.__tree_)
475         {
476             insert(__s.begin(), __s.end());
477         }
478
479     _LIBCPP_INLINE_VISIBILITY
480     set& operator=(const set& __s)
481         {
482             __tree_ = __s.__tree_;
483             return *this;
484         }
485
486 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
487     _LIBCPP_INLINE_VISIBILITY
488     set(set&& __s)
489         _NOEXCEPT_(is_nothrow_move_constructible<__base>::value)
490         : __tree_(_VSTD::move(__s.__tree_)) {}
491 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
492
493     _LIBCPP_INLINE_VISIBILITY
494     explicit set(const allocator_type& __a)
495         : __tree_(__a) {}
496
497     _LIBCPP_INLINE_VISIBILITY
498     set(const set& __s, const allocator_type& __a)
499         : __tree_(__s.__tree_.value_comp(), __a)
500         {
501             insert(__s.begin(), __s.end());
502         }
503
504 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
505     set(set&& __s, const allocator_type& __a);
506 #endif
507
508 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
509     _LIBCPP_INLINE_VISIBILITY
510     set(initializer_list<value_type> __il, const value_compare& __comp = value_compare())
511         : __tree_(__comp)
512         {
513             insert(__il.begin(), __il.end());
514         }
515
516     _LIBCPP_INLINE_VISIBILITY
517     set(initializer_list<value_type> __il, const value_compare& __comp,
518         const allocator_type& __a)
519         : __tree_(__comp, __a)
520         {
521             insert(__il.begin(), __il.end());
522         }
523
524 #if _LIBCPP_STD_VER > 11
525     _LIBCPP_INLINE_VISIBILITY 
526     set(initializer_list<value_type> __il, const allocator_type& __a)
527         : set(__il, key_compare(), __a) {}
528 #endif
529
530     _LIBCPP_INLINE_VISIBILITY
531     set& operator=(initializer_list<value_type> __il)
532         {
533             __tree_.__assign_unique(__il.begin(), __il.end());
534             return *this;
535         }
536 #endif  // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
537
538 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
539     _LIBCPP_INLINE_VISIBILITY
540     set& operator=(set&& __s)
541         _NOEXCEPT_(is_nothrow_move_assignable<__base>::value)
542         {
543             __tree_ = _VSTD::move(__s.__tree_);
544             return *this;
545         }
546 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
547
548     _LIBCPP_INLINE_VISIBILITY
549           iterator begin() _NOEXCEPT       {return __tree_.begin();}
550     _LIBCPP_INLINE_VISIBILITY
551     const_iterator begin() const _NOEXCEPT {return __tree_.begin();}
552     _LIBCPP_INLINE_VISIBILITY
553           iterator end() _NOEXCEPT         {return __tree_.end();}
554     _LIBCPP_INLINE_VISIBILITY
555     const_iterator end()   const _NOEXCEPT {return __tree_.end();}
556
557     _LIBCPP_INLINE_VISIBILITY
558           reverse_iterator rbegin() _NOEXCEPT
559             {return reverse_iterator(end());}
560     _LIBCPP_INLINE_VISIBILITY
561     const_reverse_iterator rbegin() const _NOEXCEPT
562         {return const_reverse_iterator(end());}
563     _LIBCPP_INLINE_VISIBILITY
564           reverse_iterator rend() _NOEXCEPT
565             {return reverse_iterator(begin());}
566     _LIBCPP_INLINE_VISIBILITY
567     const_reverse_iterator rend() const _NOEXCEPT
568         {return const_reverse_iterator(begin());}
569
570     _LIBCPP_INLINE_VISIBILITY
571     const_iterator cbegin()  const _NOEXCEPT {return begin();}
572     _LIBCPP_INLINE_VISIBILITY
573     const_iterator cend() const _NOEXCEPT {return end();}
574     _LIBCPP_INLINE_VISIBILITY
575     const_reverse_iterator crbegin() const _NOEXCEPT {return rbegin();}
576     _LIBCPP_INLINE_VISIBILITY
577     const_reverse_iterator crend() const _NOEXCEPT {return rend();}
578
579     _LIBCPP_INLINE_VISIBILITY
580     bool empty() const _NOEXCEPT {return __tree_.size() == 0;}
581     _LIBCPP_INLINE_VISIBILITY
582     size_type size() const _NOEXCEPT {return __tree_.size();}
583     _LIBCPP_INLINE_VISIBILITY
584     size_type max_size() const _NOEXCEPT {return __tree_.max_size();}
585
586     // modifiers:
587 #if !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS)
588     template <class... _Args>
589         _LIBCPP_INLINE_VISIBILITY
590         pair<iterator, bool> emplace(_Args&&... __args)
591             {return __tree_.__emplace_unique(_VSTD::forward<_Args>(__args)...);}
592     template <class... _Args>
593         _LIBCPP_INLINE_VISIBILITY
594         iterator emplace_hint(const_iterator __p, _Args&&... __args)
595             {return __tree_.__emplace_hint_unique(__p, _VSTD::forward<_Args>(__args)...);}
596 #endif  // !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS)
597     _LIBCPP_INLINE_VISIBILITY
598     pair<iterator,bool> insert(const value_type& __v)
599         {return __tree_.__insert_unique(__v);}
600 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
601     _LIBCPP_INLINE_VISIBILITY
602     pair<iterator,bool> insert(value_type&& __v)
603         {return __tree_.__insert_unique(_VSTD::move(__v));}
604 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
605     _LIBCPP_INLINE_VISIBILITY
606     iterator insert(const_iterator __p, const value_type& __v)
607         {return __tree_.__insert_unique(__p, __v);}
608 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
609     _LIBCPP_INLINE_VISIBILITY
610     iterator insert(const_iterator __p, value_type&& __v)
611         {return __tree_.__insert_unique(__p, _VSTD::move(__v));}
612 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
613     template <class _InputIterator>
614         _LIBCPP_INLINE_VISIBILITY
615         void insert(_InputIterator __f, _InputIterator __l)
616         {
617             for (const_iterator __e = cend(); __f != __l; ++__f)
618                 __tree_.__insert_unique(__e, *__f);
619         }
620
621 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
622     _LIBCPP_INLINE_VISIBILITY
623     void insert(initializer_list<value_type> __il)
624         {insert(__il.begin(), __il.end());}
625 #endif  // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
626
627     _LIBCPP_INLINE_VISIBILITY
628     iterator  erase(const_iterator __p) {return __tree_.erase(__p);}
629     _LIBCPP_INLINE_VISIBILITY
630     size_type erase(const key_type& __k)
631         {return __tree_.__erase_unique(__k);}
632     _LIBCPP_INLINE_VISIBILITY
633     iterator  erase(const_iterator __f, const_iterator __l)
634         {return __tree_.erase(__f, __l);}
635     _LIBCPP_INLINE_VISIBILITY
636     void clear() _NOEXCEPT {__tree_.clear();}
637
638     _LIBCPP_INLINE_VISIBILITY
639     void swap(set& __s) _NOEXCEPT_(__is_nothrow_swappable<__base>::value)
640         {__tree_.swap(__s.__tree_);}
641
642     _LIBCPP_INLINE_VISIBILITY
643     allocator_type get_allocator() const _NOEXCEPT {return __tree_.__alloc();}
644     _LIBCPP_INLINE_VISIBILITY
645     key_compare    key_comp()      const {return __tree_.value_comp();}
646     _LIBCPP_INLINE_VISIBILITY
647     value_compare  value_comp()    const {return __tree_.value_comp();}
648
649     // set operations:
650     _LIBCPP_INLINE_VISIBILITY
651     iterator find(const key_type& __k)             {return __tree_.find(__k);}
652     _LIBCPP_INLINE_VISIBILITY
653     const_iterator find(const key_type& __k) const {return __tree_.find(__k);}
654 #if _LIBCPP_STD_VER > 11
655     template <typename _K2>
656     _LIBCPP_INLINE_VISIBILITY
657     typename enable_if<__is_transparent<_Compare, _K2>::value,iterator>::type
658     find(const _K2& __k)                           {return __tree_.find(__k);}
659     template <typename _K2>
660     _LIBCPP_INLINE_VISIBILITY
661     typename enable_if<__is_transparent<_Compare, _K2>::value,const_iterator>::type
662     find(const _K2& __k) const                     {return __tree_.find(__k);}
663 #endif
664
665     _LIBCPP_INLINE_VISIBILITY
666     size_type      count(const key_type& __k) const
667         {return __tree_.__count_unique(__k);}
668 #if _LIBCPP_STD_VER > 11
669     template <typename _K2>
670     _LIBCPP_INLINE_VISIBILITY
671     typename enable_if<__is_transparent<_Compare, _K2>::value,size_type>::type
672     count(const _K2& __k)                  {return __tree_.__count_unique(__k);}
673 #endif
674     _LIBCPP_INLINE_VISIBILITY
675     iterator lower_bound(const key_type& __k)
676         {return __tree_.lower_bound(__k);}
677     _LIBCPP_INLINE_VISIBILITY
678     const_iterator lower_bound(const key_type& __k) const
679         {return __tree_.lower_bound(__k);}
680 #if _LIBCPP_STD_VER > 11
681     template <typename _K2>
682     _LIBCPP_INLINE_VISIBILITY
683     typename enable_if<__is_transparent<_Compare, _K2>::value,iterator>::type
684     lower_bound(const _K2& __k)       {return __tree_.lower_bound(__k);}
685
686     template <typename _K2>
687     _LIBCPP_INLINE_VISIBILITY
688     typename enable_if<__is_transparent<_Compare, _K2>::value,const_iterator>::type
689     lower_bound(const _K2& __k) const {return __tree_.lower_bound(__k);}
690 #endif
691
692     _LIBCPP_INLINE_VISIBILITY
693     iterator upper_bound(const key_type& __k)
694         {return __tree_.upper_bound(__k);}
695     _LIBCPP_INLINE_VISIBILITY
696     const_iterator upper_bound(const key_type& __k) const
697         {return __tree_.upper_bound(__k);}
698 #if _LIBCPP_STD_VER > 11
699     template <typename _K2>
700     _LIBCPP_INLINE_VISIBILITY
701     typename enable_if<__is_transparent<_Compare, _K2>::value,iterator>::type
702     upper_bound(const _K2& __k)       {return __tree_.upper_bound(__k);}
703     template <typename _K2>
704     _LIBCPP_INLINE_VISIBILITY
705     typename enable_if<__is_transparent<_Compare, _K2>::value,const_iterator>::type
706     upper_bound(const _K2& __k) const {return __tree_.upper_bound(__k);}
707 #endif
708
709     _LIBCPP_INLINE_VISIBILITY
710     pair<iterator,iterator> equal_range(const key_type& __k)
711         {return __tree_.__equal_range_unique(__k);}
712     _LIBCPP_INLINE_VISIBILITY
713     pair<const_iterator,const_iterator> equal_range(const key_type& __k) const
714         {return __tree_.__equal_range_unique(__k);}
715 #if _LIBCPP_STD_VER > 11
716     template <typename _K2>
717     _LIBCPP_INLINE_VISIBILITY
718     typename enable_if<__is_transparent<_Compare, _K2>::value,pair<iterator,iterator>>::type
719     equal_range(const _K2& __k)       {return __tree_.__equal_range_unique(__k);}
720     template <typename _K2>
721     _LIBCPP_INLINE_VISIBILITY
722     typename enable_if<__is_transparent<_Compare, _K2>::value,pair<const_iterator,const_iterator>>::type
723     equal_range(const _K2& __k) const {return __tree_.__equal_range_unique(__k);}
724 #endif
725 };
726
727 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
728
729 template <class _Key, class _Compare, class _Allocator>
730 set<_Key, _Compare, _Allocator>::set(set&& __s, const allocator_type& __a)
731     : __tree_(_VSTD::move(__s.__tree_), __a)
732 {
733     if (__a != __s.get_allocator())
734     {
735         const_iterator __e = cend();
736         while (!__s.empty())
737             insert(__e, _VSTD::move(__s.__tree_.remove(__s.begin())->__value_));
738     }
739 }
740
741 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
742
743 template <class _Key, class _Compare, class _Allocator>
744 inline _LIBCPP_INLINE_VISIBILITY
745 bool
746 operator==(const set<_Key, _Compare, _Allocator>& __x,
747            const set<_Key, _Compare, _Allocator>& __y)
748 {
749     return __x.size() == __y.size() && _VSTD::equal(__x.begin(), __x.end(), __y.begin());
750 }
751
752 template <class _Key, class _Compare, class _Allocator>
753 inline _LIBCPP_INLINE_VISIBILITY
754 bool
755 operator< (const set<_Key, _Compare, _Allocator>& __x,
756            const set<_Key, _Compare, _Allocator>& __y)
757 {
758     return _VSTD::lexicographical_compare(__x.begin(), __x.end(), __y.begin(), __y.end());
759 }
760
761 template <class _Key, class _Compare, class _Allocator>
762 inline _LIBCPP_INLINE_VISIBILITY
763 bool
764 operator!=(const set<_Key, _Compare, _Allocator>& __x,
765            const set<_Key, _Compare, _Allocator>& __y)
766 {
767     return !(__x == __y);
768 }
769
770 template <class _Key, class _Compare, class _Allocator>
771 inline _LIBCPP_INLINE_VISIBILITY
772 bool
773 operator> (const set<_Key, _Compare, _Allocator>& __x,
774            const set<_Key, _Compare, _Allocator>& __y)
775 {
776     return __y < __x;
777 }
778
779 template <class _Key, class _Compare, class _Allocator>
780 inline _LIBCPP_INLINE_VISIBILITY
781 bool
782 operator>=(const set<_Key, _Compare, _Allocator>& __x,
783            const set<_Key, _Compare, _Allocator>& __y)
784 {
785     return !(__x < __y);
786 }
787
788 template <class _Key, class _Compare, class _Allocator>
789 inline _LIBCPP_INLINE_VISIBILITY
790 bool
791 operator<=(const set<_Key, _Compare, _Allocator>& __x,
792            const set<_Key, _Compare, _Allocator>& __y)
793 {
794     return !(__y < __x);
795 }
796
797 // specialized algorithms:
798 template <class _Key, class _Compare, class _Allocator>
799 inline _LIBCPP_INLINE_VISIBILITY
800 void
801 swap(set<_Key, _Compare, _Allocator>& __x,
802      set<_Key, _Compare, _Allocator>& __y)
803     _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
804 {
805     __x.swap(__y);
806 }
807
808 template <class _Key, class _Compare = less<_Key>,
809           class _Allocator = allocator<_Key> >
810 class _LIBCPP_TYPE_VIS_ONLY multiset
811 {
812 public:
813     // types:
814     typedef _Key                                      key_type;
815     typedef key_type                                 value_type;
816     typedef _Compare                                  key_compare;
817     typedef key_compare                              value_compare;
818     typedef _Allocator                                allocator_type;
819     typedef value_type&                              reference;
820     typedef const value_type&                        const_reference;
821
822 private:
823     typedef __tree<value_type, value_compare, allocator_type> __base;
824     typedef allocator_traits<allocator_type>                  __alloc_traits;
825     typedef typename __base::__node_holder                    __node_holder;
826
827     __base __tree_;
828
829 public:
830     typedef typename __base::pointer               pointer;
831     typedef typename __base::const_pointer         const_pointer;
832     typedef typename __base::size_type             size_type;
833     typedef typename __base::difference_type       difference_type;
834     typedef typename __base::const_iterator        iterator;
835     typedef typename __base::const_iterator        const_iterator;
836     typedef _VSTD::reverse_iterator<iterator>       reverse_iterator;
837     typedef _VSTD::reverse_iterator<const_iterator> const_reverse_iterator;
838
839     // construct/copy/destroy:
840     _LIBCPP_INLINE_VISIBILITY
841     multiset()
842         _NOEXCEPT_(
843             is_nothrow_default_constructible<allocator_type>::value &&
844             is_nothrow_default_constructible<key_compare>::value &&
845             is_nothrow_copy_constructible<key_compare>::value)
846         : __tree_(value_compare()) {}
847
848     _LIBCPP_INLINE_VISIBILITY
849     explicit multiset(const value_compare& __comp)
850         _NOEXCEPT_(
851             is_nothrow_default_constructible<allocator_type>::value &&
852             is_nothrow_copy_constructible<key_compare>::value)
853         : __tree_(__comp) {}
854
855     _LIBCPP_INLINE_VISIBILITY
856     explicit multiset(const value_compare& __comp, const allocator_type& __a)
857         : __tree_(__comp, __a) {}
858     template <class _InputIterator>
859         _LIBCPP_INLINE_VISIBILITY
860         multiset(_InputIterator __f, _InputIterator __l,
861                  const value_compare& __comp = value_compare())
862         : __tree_(__comp)
863         {
864             insert(__f, __l);
865         }
866
867 #if _LIBCPP_STD_VER > 11
868         template <class _InputIterator>
869         _LIBCPP_INLINE_VISIBILITY 
870         multiset(_InputIterator __f, _InputIterator __l, const allocator_type& __a)
871             : multiset(__f, __l, key_compare(), __a) {}
872 #endif
873
874     template <class _InputIterator>
875         _LIBCPP_INLINE_VISIBILITY
876         multiset(_InputIterator __f, _InputIterator __l,
877                  const value_compare& __comp, const allocator_type& __a)
878         : __tree_(__comp, __a)
879         {
880             insert(__f, __l);
881         }
882
883     _LIBCPP_INLINE_VISIBILITY
884     multiset(const multiset& __s)
885         : __tree_(__s.__tree_.value_comp(),
886           __alloc_traits::select_on_container_copy_construction(__s.__tree_.__alloc()))
887         {
888             insert(__s.begin(), __s.end());
889         }
890
891     _LIBCPP_INLINE_VISIBILITY
892     multiset& operator=(const multiset& __s)
893         {
894             __tree_ = __s.__tree_;
895             return *this;
896         }
897
898 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
899     _LIBCPP_INLINE_VISIBILITY
900     multiset(multiset&& __s)
901         _NOEXCEPT_(is_nothrow_move_constructible<__base>::value)
902         : __tree_(_VSTD::move(__s.__tree_)) {}
903 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
904     _LIBCPP_INLINE_VISIBILITY
905     explicit multiset(const allocator_type& __a)
906         : __tree_(__a) {}
907     _LIBCPP_INLINE_VISIBILITY
908     multiset(const multiset& __s, const allocator_type& __a)
909         : __tree_(__s.__tree_.value_comp(), __a)
910         {
911             insert(__s.begin(), __s.end());
912         }
913 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
914     multiset(multiset&& __s, const allocator_type& __a);
915 #endif
916
917 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
918     _LIBCPP_INLINE_VISIBILITY
919     multiset(initializer_list<value_type> __il, const value_compare& __comp = value_compare())
920         : __tree_(__comp)
921         {
922             insert(__il.begin(), __il.end());
923         }
924
925     _LIBCPP_INLINE_VISIBILITY
926     multiset(initializer_list<value_type> __il, const value_compare& __comp,
927         const allocator_type& __a)
928         : __tree_(__comp, __a)
929         {
930             insert(__il.begin(), __il.end());
931         }
932
933 #if _LIBCPP_STD_VER > 11
934     _LIBCPP_INLINE_VISIBILITY 
935     multiset(initializer_list<value_type> __il, const allocator_type& __a)
936         : multiset(__il, key_compare(), __a) {}
937 #endif
938
939     _LIBCPP_INLINE_VISIBILITY
940     multiset& operator=(initializer_list<value_type> __il)
941         {
942             __tree_.__assign_multi(__il.begin(), __il.end());
943             return *this;
944         }
945 #endif  // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
946
947 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
948     _LIBCPP_INLINE_VISIBILITY
949     multiset& operator=(multiset&& __s)
950         _NOEXCEPT_(is_nothrow_move_assignable<__base>::value)
951         {
952             __tree_ = _VSTD::move(__s.__tree_);
953             return *this;
954         }
955 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
956
957     _LIBCPP_INLINE_VISIBILITY
958           iterator begin() _NOEXCEPT       {return __tree_.begin();}
959     _LIBCPP_INLINE_VISIBILITY
960     const_iterator begin() const _NOEXCEPT {return __tree_.begin();}
961     _LIBCPP_INLINE_VISIBILITY
962           iterator end() _NOEXCEPT         {return __tree_.end();}
963     _LIBCPP_INLINE_VISIBILITY
964     const_iterator end()   const _NOEXCEPT {return __tree_.end();}
965
966     _LIBCPP_INLINE_VISIBILITY
967           reverse_iterator rbegin() _NOEXCEPT
968             {return reverse_iterator(end());}
969     _LIBCPP_INLINE_VISIBILITY
970     const_reverse_iterator rbegin() const _NOEXCEPT
971         {return const_reverse_iterator(end());}
972     _LIBCPP_INLINE_VISIBILITY
973           reverse_iterator rend() _NOEXCEPT
974             {return       reverse_iterator(begin());}
975     _LIBCPP_INLINE_VISIBILITY
976     const_reverse_iterator rend() const _NOEXCEPT
977         {return const_reverse_iterator(begin());}
978
979     _LIBCPP_INLINE_VISIBILITY
980     const_iterator cbegin()  const _NOEXCEPT {return begin();}
981     _LIBCPP_INLINE_VISIBILITY
982     const_iterator cend() const _NOEXCEPT {return end();}
983     _LIBCPP_INLINE_VISIBILITY
984     const_reverse_iterator crbegin() const _NOEXCEPT {return rbegin();}
985     _LIBCPP_INLINE_VISIBILITY
986     const_reverse_iterator crend() const _NOEXCEPT {return rend();}
987
988     _LIBCPP_INLINE_VISIBILITY
989     bool empty() const _NOEXCEPT {return __tree_.size() == 0;}
990     _LIBCPP_INLINE_VISIBILITY
991     size_type size() const _NOEXCEPT {return __tree_.size();}
992     _LIBCPP_INLINE_VISIBILITY
993     size_type max_size() const _NOEXCEPT {return __tree_.max_size();}
994
995     // modifiers:
996 #if !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS)
997     template <class... _Args>
998         _LIBCPP_INLINE_VISIBILITY
999         iterator emplace(_Args&&... __args)
1000             {return __tree_.__emplace_multi(_VSTD::forward<_Args>(__args)...);}
1001     template <class... _Args>
1002         _LIBCPP_INLINE_VISIBILITY
1003         iterator emplace_hint(const_iterator __p, _Args&&... __args)
1004             {return __tree_.__emplace_hint_multi(__p, _VSTD::forward<_Args>(__args)...);}
1005 #endif  // !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS)
1006     _LIBCPP_INLINE_VISIBILITY
1007     iterator insert(const value_type& __v)
1008         {return __tree_.__insert_multi(__v);}
1009 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
1010     _LIBCPP_INLINE_VISIBILITY
1011     iterator insert(value_type&& __v)
1012         {return __tree_.__insert_multi(_VSTD::move(__v));}
1013 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
1014     _LIBCPP_INLINE_VISIBILITY
1015     iterator insert(const_iterator __p, const value_type& __v)
1016         {return __tree_.__insert_multi(__p, __v);}
1017 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
1018     _LIBCPP_INLINE_VISIBILITY
1019     iterator insert(const_iterator __p, value_type&& __v)
1020         {return __tree_.__insert_multi(_VSTD::move(__v));}
1021 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
1022     template <class _InputIterator>
1023         _LIBCPP_INLINE_VISIBILITY
1024         void insert(_InputIterator __f, _InputIterator __l)
1025         {
1026             for (const_iterator __e = cend(); __f != __l; ++__f)
1027                 __tree_.__insert_multi(__e, *__f);
1028         }
1029
1030 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
1031     _LIBCPP_INLINE_VISIBILITY
1032     void insert(initializer_list<value_type> __il)
1033         {insert(__il.begin(), __il.end());}
1034 #endif  // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
1035
1036     _LIBCPP_INLINE_VISIBILITY
1037     iterator  erase(const_iterator __p) {return __tree_.erase(__p);}
1038     _LIBCPP_INLINE_VISIBILITY
1039     size_type erase(const key_type& __k) {return __tree_.__erase_multi(__k);}
1040     _LIBCPP_INLINE_VISIBILITY
1041     iterator  erase(const_iterator __f, const_iterator __l)
1042         {return __tree_.erase(__f, __l);}
1043     _LIBCPP_INLINE_VISIBILITY
1044     void clear() _NOEXCEPT {__tree_.clear();}
1045
1046     _LIBCPP_INLINE_VISIBILITY
1047     void swap(multiset& __s)
1048         _NOEXCEPT_(__is_nothrow_swappable<__base>::value)
1049         {__tree_.swap(__s.__tree_);}
1050
1051     _LIBCPP_INLINE_VISIBILITY
1052     allocator_type get_allocator() const _NOEXCEPT {return __tree_.__alloc();}
1053     _LIBCPP_INLINE_VISIBILITY
1054     key_compare    key_comp()      const {return __tree_.value_comp();}
1055     _LIBCPP_INLINE_VISIBILITY
1056     value_compare  value_comp()    const {return __tree_.value_comp();}
1057
1058     // set operations:
1059     _LIBCPP_INLINE_VISIBILITY
1060     iterator find(const key_type& __k)             {return __tree_.find(__k);}
1061     _LIBCPP_INLINE_VISIBILITY
1062     const_iterator find(const key_type& __k) const {return __tree_.find(__k);}
1063 #if _LIBCPP_STD_VER > 11
1064     template <typename _K2>
1065     _LIBCPP_INLINE_VISIBILITY
1066     typename _VSTD::enable_if<_VSTD::__is_transparent<_Compare, _K2>::value,iterator>::type
1067     find(const _K2& __k)                           {return __tree_.find(__k);}
1068     template <typename _K2>
1069     _LIBCPP_INLINE_VISIBILITY
1070     typename _VSTD::enable_if<_VSTD::__is_transparent<_Compare, _K2>::value,const_iterator>::type
1071     find(const _K2& __k) const                     {return __tree_.find(__k);}
1072 #endif
1073
1074     _LIBCPP_INLINE_VISIBILITY
1075     size_type      count(const key_type& __k) const
1076         {return __tree_.__count_multi(__k);}
1077 #if _LIBCPP_STD_VER > 11
1078     template <typename _K2>
1079     _LIBCPP_INLINE_VISIBILITY
1080     typename enable_if<__is_transparent<_Compare, _K2>::value,size_type>::type
1081     count(const _K2& __k)                  {return __tree_.__count_multi(__k);}
1082 #endif
1083
1084     _LIBCPP_INLINE_VISIBILITY
1085     iterator lower_bound(const key_type& __k)
1086         {return __tree_.lower_bound(__k);}
1087     _LIBCPP_INLINE_VISIBILITY
1088     const_iterator lower_bound(const key_type& __k) const
1089             {return __tree_.lower_bound(__k);}
1090 #if _LIBCPP_STD_VER > 11
1091     template <typename _K2>
1092     _LIBCPP_INLINE_VISIBILITY
1093     typename _VSTD::enable_if<_VSTD::__is_transparent<_Compare, _K2>::value,iterator>::type
1094     lower_bound(const _K2& __k)       {return __tree_.lower_bound(__k);}
1095
1096     template <typename _K2>
1097     _LIBCPP_INLINE_VISIBILITY
1098     typename _VSTD::enable_if<_VSTD::__is_transparent<_Compare, _K2>::value,const_iterator>::type
1099     lower_bound(const _K2& __k) const {return __tree_.lower_bound(__k);}
1100 #endif
1101
1102     _LIBCPP_INLINE_VISIBILITY
1103     iterator upper_bound(const key_type& __k)
1104             {return __tree_.upper_bound(__k);}
1105     _LIBCPP_INLINE_VISIBILITY
1106     const_iterator upper_bound(const key_type& __k) const
1107             {return __tree_.upper_bound(__k);}
1108 #if _LIBCPP_STD_VER > 11
1109     template <typename _K2>
1110     _LIBCPP_INLINE_VISIBILITY
1111     typename _VSTD::enable_if<_VSTD::__is_transparent<_Compare, _K2>::value,iterator>::type
1112     upper_bound(const _K2& __k)       {return __tree_.upper_bound(__k);}
1113     template <typename _K2>
1114     _LIBCPP_INLINE_VISIBILITY
1115     typename _VSTD::enable_if<_VSTD::__is_transparent<_Compare, _K2>::value,const_iterator>::type
1116     upper_bound(const _K2& __k) const {return __tree_.upper_bound(__k);}
1117 #endif
1118
1119     _LIBCPP_INLINE_VISIBILITY
1120     pair<iterator,iterator>             equal_range(const key_type& __k)
1121             {return __tree_.__equal_range_multi(__k);}
1122     _LIBCPP_INLINE_VISIBILITY
1123     pair<const_iterator,const_iterator> equal_range(const key_type& __k) const
1124             {return __tree_.__equal_range_multi(__k);}
1125 #if _LIBCPP_STD_VER > 11
1126     template <typename _K2>
1127     _LIBCPP_INLINE_VISIBILITY
1128     typename _VSTD::enable_if<_VSTD::__is_transparent<_Compare, _K2>::value,pair<iterator,iterator>>::type
1129     equal_range(const _K2& __k)       {return __tree_.__equal_range_multi(__k);}
1130     template <typename _K2>
1131     _LIBCPP_INLINE_VISIBILITY
1132     typename _VSTD::enable_if<_VSTD::__is_transparent<_Compare, _K2>::value,pair<const_iterator,const_iterator>>::type
1133     equal_range(const _K2& __k) const {return __tree_.__equal_range_multi(__k);}
1134 #endif
1135 };
1136
1137 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
1138
1139 template <class _Key, class _Compare, class _Allocator>
1140 multiset<_Key, _Compare, _Allocator>::multiset(multiset&& __s, const allocator_type& __a)
1141     : __tree_(_VSTD::move(__s.__tree_), __a)
1142 {
1143     if (__a != __s.get_allocator())
1144     {
1145         const_iterator __e = cend();
1146         while (!__s.empty())
1147             insert(__e, _VSTD::move(__s.__tree_.remove(__s.begin())->__value_));
1148     }
1149 }
1150
1151 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
1152
1153 template <class _Key, class _Compare, class _Allocator>
1154 inline _LIBCPP_INLINE_VISIBILITY
1155 bool
1156 operator==(const multiset<_Key, _Compare, _Allocator>& __x,
1157            const multiset<_Key, _Compare, _Allocator>& __y)
1158 {
1159     return __x.size() == __y.size() && _VSTD::equal(__x.begin(), __x.end(), __y.begin());
1160 }
1161
1162 template <class _Key, class _Compare, class _Allocator>
1163 inline _LIBCPP_INLINE_VISIBILITY
1164 bool
1165 operator< (const multiset<_Key, _Compare, _Allocator>& __x,
1166            const multiset<_Key, _Compare, _Allocator>& __y)
1167 {
1168     return _VSTD::lexicographical_compare(__x.begin(), __x.end(), __y.begin(), __y.end());
1169 }
1170
1171 template <class _Key, class _Compare, class _Allocator>
1172 inline _LIBCPP_INLINE_VISIBILITY
1173 bool
1174 operator!=(const multiset<_Key, _Compare, _Allocator>& __x,
1175            const multiset<_Key, _Compare, _Allocator>& __y)
1176 {
1177     return !(__x == __y);
1178 }
1179
1180 template <class _Key, class _Compare, class _Allocator>
1181 inline _LIBCPP_INLINE_VISIBILITY
1182 bool
1183 operator> (const multiset<_Key, _Compare, _Allocator>& __x,
1184            const multiset<_Key, _Compare, _Allocator>& __y)
1185 {
1186     return __y < __x;
1187 }
1188
1189 template <class _Key, class _Compare, class _Allocator>
1190 inline _LIBCPP_INLINE_VISIBILITY
1191 bool
1192 operator>=(const multiset<_Key, _Compare, _Allocator>& __x,
1193            const multiset<_Key, _Compare, _Allocator>& __y)
1194 {
1195     return !(__x < __y);
1196 }
1197
1198 template <class _Key, class _Compare, class _Allocator>
1199 inline _LIBCPP_INLINE_VISIBILITY
1200 bool
1201 operator<=(const multiset<_Key, _Compare, _Allocator>& __x,
1202            const multiset<_Key, _Compare, _Allocator>& __y)
1203 {
1204     return !(__y < __x);
1205 }
1206
1207 template <class _Key, class _Compare, class _Allocator>
1208 inline _LIBCPP_INLINE_VISIBILITY
1209 void
1210 swap(multiset<_Key, _Compare, _Allocator>& __x,
1211      multiset<_Key, _Compare, _Allocator>& __y)
1212     _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
1213 {
1214     __x.swap(__y);
1215 }
1216
1217 _LIBCPP_END_NAMESPACE_STD
1218
1219 #endif  // _LIBCPP_SET