xref: /llvm-project-15.0.7/libcxx/include/set (revision 53ec0b4e)
13e519524SHoward Hinnant// -*- C++ -*-
23e519524SHoward Hinnant//===---------------------------- set -------------------------------------===//
33e519524SHoward Hinnant//
45b08a8a4SHoward Hinnant//                     The LLVM Compiler Infrastructure
53e519524SHoward Hinnant//
63e519524SHoward Hinnant// This file is distributed under the University of Illinois Open Source
73e519524SHoward Hinnant// License. See LICENSE.TXT for details.
83e519524SHoward Hinnant//
93e519524SHoward Hinnant//===----------------------------------------------------------------------===//
103e519524SHoward Hinnant
113e519524SHoward Hinnant#ifndef _LIBCPP_SET
123e519524SHoward Hinnant#define _LIBCPP_SET
133e519524SHoward Hinnant
143e519524SHoward Hinnant/*
153e519524SHoward Hinnant
163e519524SHoward Hinnant    set synopsis
173e519524SHoward Hinnant
183e519524SHoward Hinnantnamespace std
193e519524SHoward Hinnant{
203e519524SHoward Hinnant
213e519524SHoward Hinnanttemplate <class Key, class Compare = less<Key>,
223e519524SHoward Hinnant          class Allocator = allocator<Key>>
233e519524SHoward Hinnantclass set
243e519524SHoward Hinnant{
253e519524SHoward Hinnantpublic:
263e519524SHoward Hinnant    // types:
273e519524SHoward Hinnant    typedef Key                                      key_type;
283e519524SHoward Hinnant    typedef key_type                                 value_type;
293e519524SHoward Hinnant    typedef Compare                                  key_compare;
303e519524SHoward Hinnant    typedef key_compare                              value_compare;
313e519524SHoward Hinnant    typedef Allocator                                allocator_type;
323e519524SHoward Hinnant    typedef typename allocator_type::reference       reference;
333e519524SHoward Hinnant    typedef typename allocator_type::const_reference const_reference;
343e519524SHoward Hinnant    typedef typename allocator_type::size_type       size_type;
353e519524SHoward Hinnant    typedef typename allocator_type::difference_type difference_type;
363e519524SHoward Hinnant    typedef typename allocator_type::pointer         pointer;
373e519524SHoward Hinnant    typedef typename allocator_type::const_pointer   const_pointer;
383e519524SHoward Hinnant
393e519524SHoward Hinnant    typedef implementation-defined                   iterator;
403e519524SHoward Hinnant    typedef implementation-defined                   const_iterator;
413e519524SHoward Hinnant    typedef std::reverse_iterator<iterator>          reverse_iterator;
423e519524SHoward Hinnant    typedef std::reverse_iterator<const_iterator>    const_reverse_iterator;
433e519524SHoward Hinnant
443e519524SHoward Hinnant    // construct/copy/destroy:
453e519524SHoward Hinnant    explicit set(const value_compare& comp = value_compare());
463e519524SHoward Hinnant    set(const value_compare& comp, const allocator_type& a);
473e519524SHoward Hinnant    template <class InputIterator>
483e519524SHoward Hinnant        set(InputIterator first, InputIterator last,
493e519524SHoward Hinnant            const value_compare& comp = value_compare());
503e519524SHoward Hinnant    template <class InputIterator>
513e519524SHoward Hinnant        set(InputIterator first, InputIterator last, const value_compare& comp,
523e519524SHoward Hinnant            const allocator_type& a);
533e519524SHoward Hinnant    set(const set& s);
543e519524SHoward Hinnant    set(set&& s);
553e519524SHoward Hinnant    explicit set(const allocator_type& a);
563e519524SHoward Hinnant    set(const set& s, const allocator_type& a);
573e519524SHoward Hinnant    set(set&& s, const allocator_type& a);
583e519524SHoward Hinnant    set(initializer_list<value_type> il, const value_compare& comp = value_compare());
593e519524SHoward Hinnant    set(initializer_list<value_type> il, const value_compare& comp,
603e519524SHoward Hinnant        const allocator_type& a);
613e519524SHoward Hinnant    ~set();
623e519524SHoward Hinnant
633e519524SHoward Hinnant    set& operator=(const set& s);
643e519524SHoward Hinnant    set& operator=(set&& s);
653e519524SHoward Hinnant    set& operator=(initializer_list<value_type> il);
663e519524SHoward Hinnant
673e519524SHoward Hinnant    // iterators:
683e519524SHoward Hinnant          iterator begin();
693e519524SHoward Hinnant    const_iterator begin() const;
703e519524SHoward Hinnant          iterator end();
713e519524SHoward Hinnant    const_iterator end()   const;
723e519524SHoward Hinnant
733e519524SHoward Hinnant          reverse_iterator rbegin();
743e519524SHoward Hinnant    const_reverse_iterator rbegin() const;
753e519524SHoward Hinnant          reverse_iterator rend();
763e519524SHoward Hinnant    const_reverse_iterator rend()   const;
773e519524SHoward Hinnant
783e519524SHoward Hinnant    const_iterator         cbegin()  const;
793e519524SHoward Hinnant    const_iterator         cend()    const;
803e519524SHoward Hinnant    const_reverse_iterator crbegin() const;
813e519524SHoward Hinnant    const_reverse_iterator crend()   const;
823e519524SHoward Hinnant
833e519524SHoward Hinnant    // capacity:
843e519524SHoward Hinnant    bool      empty()    const;
853e519524SHoward Hinnant    size_type size()     const;
863e519524SHoward Hinnant    size_type max_size() const;
873e519524SHoward Hinnant
883e519524SHoward Hinnant    // modifiers:
893e519524SHoward Hinnant    template <class... Args>
903e519524SHoward Hinnant        pair<iterator, bool> emplace(Args&&... args);
913e519524SHoward Hinnant    template <class... Args>
923e519524SHoward Hinnant        iterator emplace_hint(const_iterator position, Args&&... args);
933e519524SHoward Hinnant    pair<iterator,bool> insert(const value_type& v);
943e519524SHoward Hinnant    pair<iterator,bool> insert(value_type&& v);
953e519524SHoward Hinnant    iterator insert(const_iterator position, const value_type& v);
963e519524SHoward Hinnant    iterator insert(const_iterator position, value_type&& v);
973e519524SHoward Hinnant    template <class InputIterator>
983e519524SHoward Hinnant        void insert(InputIterator first, InputIterator last);
993e519524SHoward Hinnant    void insert(initializer_list<value_type> il);
1003e519524SHoward Hinnant
1013e519524SHoward Hinnant    iterator  erase(const_iterator position);
1023e519524SHoward Hinnant    size_type erase(const key_type& k);
1033e519524SHoward Hinnant    iterator  erase(const_iterator first, const_iterator last);
1043e519524SHoward Hinnant    void clear();
1053e519524SHoward Hinnant
1063e519524SHoward Hinnant    void swap(set& s);
1073e519524SHoward Hinnant
1083e519524SHoward Hinnant    // observers:
1093e519524SHoward Hinnant    allocator_type get_allocator() const;
1103e519524SHoward Hinnant    key_compare    key_comp()      const;
1113e519524SHoward Hinnant    value_compare  value_comp()    const;
1123e519524SHoward Hinnant
1133e519524SHoward Hinnant    // set operations:
1143e519524SHoward Hinnant          iterator find(const key_type& k);
1153e519524SHoward Hinnant    const_iterator find(const key_type& k) const;
1163e519524SHoward Hinnant    size_type      count(const key_type& k) const;
1173e519524SHoward Hinnant          iterator lower_bound(const key_type& k);
1183e519524SHoward Hinnant    const_iterator lower_bound(const key_type& k) const;
1193e519524SHoward Hinnant          iterator upper_bound(const key_type& k);
1203e519524SHoward Hinnant    const_iterator upper_bound(const key_type& k) const;
1213e519524SHoward Hinnant    pair<iterator,iterator>             equal_range(const key_type& k);
1223e519524SHoward Hinnant    pair<const_iterator,const_iterator> equal_range(const key_type& k) const;
1233e519524SHoward Hinnant};
1243e519524SHoward Hinnant
1253e519524SHoward Hinnanttemplate <class Key, class Compare, class Allocator>
1263e519524SHoward Hinnantbool
1273e519524SHoward Hinnantoperator==(const set<Key, Compare, Allocator>& x,
1283e519524SHoward Hinnant           const set<Key, Compare, Allocator>& y);
1293e519524SHoward Hinnant
1303e519524SHoward Hinnanttemplate <class Key, class Compare, class Allocator>
1313e519524SHoward Hinnantbool
1323e519524SHoward Hinnantoperator< (const set<Key, Compare, Allocator>& x,
1333e519524SHoward Hinnant           const set<Key, Compare, Allocator>& y);
1343e519524SHoward Hinnant
1353e519524SHoward Hinnanttemplate <class Key, class Compare, class Allocator>
1363e519524SHoward Hinnantbool
1373e519524SHoward Hinnantoperator!=(const set<Key, Compare, Allocator>& x,
1383e519524SHoward Hinnant           const set<Key, Compare, Allocator>& y);
1393e519524SHoward Hinnant
1403e519524SHoward Hinnanttemplate <class Key, class Compare, class Allocator>
1413e519524SHoward Hinnantbool
1423e519524SHoward Hinnantoperator> (const set<Key, Compare, Allocator>& x,
1433e519524SHoward Hinnant           const set<Key, Compare, Allocator>& y);
1443e519524SHoward Hinnant
1453e519524SHoward Hinnanttemplate <class Key, class Compare, class Allocator>
1463e519524SHoward Hinnantbool
1473e519524SHoward Hinnantoperator>=(const set<Key, Compare, Allocator>& x,
1483e519524SHoward Hinnant           const set<Key, Compare, Allocator>& y);
1493e519524SHoward Hinnant
1503e519524SHoward Hinnanttemplate <class Key, class Compare, class Allocator>
1513e519524SHoward Hinnantbool
1523e519524SHoward Hinnantoperator<=(const set<Key, Compare, Allocator>& x,
1533e519524SHoward Hinnant           const set<Key, Compare, Allocator>& y);
1543e519524SHoward Hinnant
1553e519524SHoward Hinnant// specialized algorithms:
1563e519524SHoward Hinnanttemplate <class Key, class Compare, class Allocator>
1573e519524SHoward Hinnantvoid
1583e519524SHoward Hinnantswap(set<Key, Compare, Allocator>& x, set<Key, Compare, Allocator>& y);
1593e519524SHoward Hinnant
1603e519524SHoward Hinnanttemplate <class Key, class Compare = less<Key>,
1613e519524SHoward Hinnant          class Allocator = allocator<Key>>
1623e519524SHoward Hinnantclass multiset
1633e519524SHoward Hinnant{
1643e519524SHoward Hinnantpublic:
1653e519524SHoward Hinnant    // types:
1663e519524SHoward Hinnant    typedef Key                                      key_type;
1673e519524SHoward Hinnant    typedef key_type                                 value_type;
1683e519524SHoward Hinnant    typedef Compare                                  key_compare;
1693e519524SHoward Hinnant    typedef key_compare                              value_compare;
1703e519524SHoward Hinnant    typedef Allocator                                allocator_type;
1713e519524SHoward Hinnant    typedef typename allocator_type::reference       reference;
1723e519524SHoward Hinnant    typedef typename allocator_type::const_reference const_reference;
1733e519524SHoward Hinnant    typedef typename allocator_type::size_type       size_type;
1743e519524SHoward Hinnant    typedef typename allocator_type::difference_type difference_type;
1753e519524SHoward Hinnant    typedef typename allocator_type::pointer         pointer;
1763e519524SHoward Hinnant    typedef typename allocator_type::const_pointer   const_pointer;
1773e519524SHoward Hinnant
1783e519524SHoward Hinnant    typedef implementation-defined                   iterator;
1793e519524SHoward Hinnant    typedef implementation-defined                   const_iterator;
1803e519524SHoward Hinnant    typedef std::reverse_iterator<iterator>          reverse_iterator;
1813e519524SHoward Hinnant    typedef std::reverse_iterator<const_iterator>    const_reverse_iterator;
1823e519524SHoward Hinnant
1833e519524SHoward Hinnant    // construct/copy/destroy:
1843e519524SHoward Hinnant    explicit multiset(const value_compare& comp = value_compare());
1853e519524SHoward Hinnant    multiset(const value_compare& comp, const allocator_type& a);
1863e519524SHoward Hinnant    template <class InputIterator>
1873e519524SHoward Hinnant        multiset(InputIterator first, InputIterator last,
1883e519524SHoward Hinnant                 const value_compare& comp = value_compare());
1893e519524SHoward Hinnant    template <class InputIterator>
1903e519524SHoward Hinnant        multiset(InputIterator first, InputIterator last,
1913e519524SHoward Hinnant                 const value_compare& comp, const allocator_type& a);
1923e519524SHoward Hinnant    multiset(const multiset& s);
1933e519524SHoward Hinnant    multiset(multiset&& s);
1943e519524SHoward Hinnant    explicit multiset(const allocator_type& a);
1953e519524SHoward Hinnant    multiset(const multiset& s, const allocator_type& a);
1963e519524SHoward Hinnant    multiset(multiset&& s, const allocator_type& a);
1973e519524SHoward Hinnant    multiset(initializer_list<value_type> il, const value_compare& comp = value_compare());
1983e519524SHoward Hinnant    multiset(initializer_list<value_type> il, const value_compare& comp,
1993e519524SHoward Hinnant             const allocator_type& a);
2003e519524SHoward Hinnant    ~multiset();
2013e519524SHoward Hinnant
2023e519524SHoward Hinnant    multiset& operator=(const multiset& s);
2033e519524SHoward Hinnant    multiset& operator=(multiset&& s);
2043e519524SHoward Hinnant    multiset& operator=(initializer_list<value_type> il);
2053e519524SHoward Hinnant
2063e519524SHoward Hinnant    // iterators:
2073e519524SHoward Hinnant          iterator begin();
2083e519524SHoward Hinnant    const_iterator begin() const;
2093e519524SHoward Hinnant          iterator end();
2103e519524SHoward Hinnant    const_iterator end()   const;
2113e519524SHoward Hinnant
2123e519524SHoward Hinnant          reverse_iterator rbegin();
2133e519524SHoward Hinnant    const_reverse_iterator rbegin() const;
2143e519524SHoward Hinnant          reverse_iterator rend();
2153e519524SHoward Hinnant    const_reverse_iterator rend()   const;
2163e519524SHoward Hinnant
2173e519524SHoward Hinnant    const_iterator         cbegin()  const;
2183e519524SHoward Hinnant    const_iterator         cend()    const;
2193e519524SHoward Hinnant    const_reverse_iterator crbegin() const;
2203e519524SHoward Hinnant    const_reverse_iterator crend()   const;
2213e519524SHoward Hinnant
2223e519524SHoward Hinnant    // capacity:
2233e519524SHoward Hinnant    bool      empty()    const;
2243e519524SHoward Hinnant    size_type size()     const;
2253e519524SHoward Hinnant    size_type max_size() const;
2263e519524SHoward Hinnant
2273e519524SHoward Hinnant    // modifiers:
2283e519524SHoward Hinnant    template <class... Args>
2293e519524SHoward Hinnant        iterator emplace(Args&&... args);
2303e519524SHoward Hinnant    template <class... Args>
2313e519524SHoward Hinnant        iterator emplace_hint(const_iterator position, Args&&... args);
2323e519524SHoward Hinnant    iterator insert(const value_type& v);
2333e519524SHoward Hinnant    iterator insert(value_type&& v);
2343e519524SHoward Hinnant    iterator insert(const_iterator position, const value_type& v);
2353e519524SHoward Hinnant    iterator insert(const_iterator position, value_type&& v);
2363e519524SHoward Hinnant    template <class InputIterator>
2373e519524SHoward Hinnant        void insert(InputIterator first, InputIterator last);
2383e519524SHoward Hinnant    void insert(initializer_list<value_type> il);
2393e519524SHoward Hinnant
2403e519524SHoward Hinnant    iterator  erase(const_iterator position);
2413e519524SHoward Hinnant    size_type erase(const key_type& k);
2423e519524SHoward Hinnant    iterator  erase(const_iterator first, const_iterator last);
2433e519524SHoward Hinnant    void clear();
2443e519524SHoward Hinnant
2453e519524SHoward Hinnant    void swap(multiset& s);
2463e519524SHoward Hinnant
2473e519524SHoward Hinnant    // observers:
2483e519524SHoward Hinnant    allocator_type get_allocator() const;
2493e519524SHoward Hinnant    key_compare    key_comp()      const;
2503e519524SHoward Hinnant    value_compare  value_comp()    const;
2513e519524SHoward Hinnant
2523e519524SHoward Hinnant    // set operations:
2533e519524SHoward Hinnant          iterator find(const key_type& k);
2543e519524SHoward Hinnant    const_iterator find(const key_type& k) const;
2553e519524SHoward Hinnant    size_type      count(const key_type& k) const;
2563e519524SHoward Hinnant          iterator lower_bound(const key_type& k);
2573e519524SHoward Hinnant    const_iterator lower_bound(const key_type& k) const;
2583e519524SHoward Hinnant          iterator upper_bound(const key_type& k);
2593e519524SHoward Hinnant    const_iterator upper_bound(const key_type& k) const;
2603e519524SHoward Hinnant    pair<iterator,iterator>             equal_range(const key_type& k);
2613e519524SHoward Hinnant    pair<const_iterator,const_iterator> equal_range(const key_type& k) const;
2623e519524SHoward Hinnant};
2633e519524SHoward Hinnant
2643e519524SHoward Hinnanttemplate <class Key, class Compare, class Allocator>
2653e519524SHoward Hinnantbool
2663e519524SHoward Hinnantoperator==(const multiset<Key, Compare, Allocator>& x,
2673e519524SHoward Hinnant           const multiset<Key, Compare, Allocator>& y);
2683e519524SHoward Hinnant
2693e519524SHoward Hinnanttemplate <class Key, class Compare, class Allocator>
2703e519524SHoward Hinnantbool
2713e519524SHoward Hinnantoperator< (const multiset<Key, Compare, Allocator>& x,
2723e519524SHoward Hinnant           const multiset<Key, Compare, Allocator>& y);
2733e519524SHoward Hinnant
2743e519524SHoward Hinnanttemplate <class Key, class Compare, class Allocator>
2753e519524SHoward Hinnantbool
2763e519524SHoward Hinnantoperator!=(const multiset<Key, Compare, Allocator>& x,
2773e519524SHoward Hinnant           const multiset<Key, Compare, Allocator>& y);
2783e519524SHoward Hinnant
2793e519524SHoward Hinnanttemplate <class Key, class Compare, class Allocator>
2803e519524SHoward Hinnantbool
2813e519524SHoward Hinnantoperator> (const multiset<Key, Compare, Allocator>& x,
2823e519524SHoward Hinnant           const multiset<Key, Compare, Allocator>& y);
2833e519524SHoward Hinnant
2843e519524SHoward Hinnanttemplate <class Key, class Compare, class Allocator>
2853e519524SHoward Hinnantbool
2863e519524SHoward Hinnantoperator>=(const multiset<Key, Compare, Allocator>& x,
2873e519524SHoward Hinnant           const multiset<Key, Compare, Allocator>& y);
2883e519524SHoward Hinnant
2893e519524SHoward Hinnanttemplate <class Key, class Compare, class Allocator>
2903e519524SHoward Hinnantbool
2913e519524SHoward Hinnantoperator<=(const multiset<Key, Compare, Allocator>& x,
2923e519524SHoward Hinnant           const multiset<Key, Compare, Allocator>& y);
2933e519524SHoward Hinnant
2943e519524SHoward Hinnant// specialized algorithms:
2953e519524SHoward Hinnanttemplate <class Key, class Compare, class Allocator>
2963e519524SHoward Hinnantvoid
2973e519524SHoward Hinnantswap(multiset<Key, Compare, Allocator>& x, multiset<Key, Compare, Allocator>& y);
2983e519524SHoward Hinnant
2993e519524SHoward Hinnant}  // std
3003e519524SHoward Hinnant
3013e519524SHoward Hinnant*/
3023e519524SHoward Hinnant
3033e519524SHoward Hinnant#include <__config>
3043e519524SHoward Hinnant#include <__tree>
3053e519524SHoward Hinnant#include <functional>
3063e519524SHoward Hinnant
3073e519524SHoward Hinnant#pragma GCC system_header
3083e519524SHoward Hinnant
3093e519524SHoward Hinnant_LIBCPP_BEGIN_NAMESPACE_STD
3103e519524SHoward Hinnant
3113e519524SHoward Hinnanttemplate <class _Key, class _Compare = less<_Key>,
3123e519524SHoward Hinnant          class _Allocator = allocator<_Key> >
313*53ec0b4eSHoward Hinnantclass _LIBCPP_VISIBLE set
3143e519524SHoward Hinnant{
3153e519524SHoward Hinnantpublic:
3163e519524SHoward Hinnant    // types:
3173e519524SHoward Hinnant    typedef _Key                                     key_type;
3183e519524SHoward Hinnant    typedef key_type                                 value_type;
3193e519524SHoward Hinnant    typedef _Compare                                 key_compare;
3203e519524SHoward Hinnant    typedef key_compare                              value_compare;
3213e519524SHoward Hinnant    typedef _Allocator                               allocator_type;
3223e519524SHoward Hinnant    typedef value_type&                              reference;
3233e519524SHoward Hinnant    typedef const value_type&                        const_reference;
3243e519524SHoward Hinnant
3253e519524SHoward Hinnantprivate:
3263e519524SHoward Hinnant    typedef __tree<value_type, value_compare, allocator_type> __base;
3273e519524SHoward Hinnant    typedef allocator_traits<allocator_type>                  __alloc_traits;
3283e519524SHoward Hinnant    typedef typename __base::__node_holder                    __node_holder;
3293e519524SHoward Hinnant
3303e519524SHoward Hinnant    __base __tree_;
3313e519524SHoward Hinnant
3323e519524SHoward Hinnantpublic:
3333e519524SHoward Hinnant    typedef typename __base::pointer               pointer;
3343e519524SHoward Hinnant    typedef typename __base::const_pointer         const_pointer;
3353e519524SHoward Hinnant    typedef typename __base::size_type             size_type;
3363e519524SHoward Hinnant    typedef typename __base::difference_type       difference_type;
3373e519524SHoward Hinnant    typedef typename __base::const_iterator        iterator;
3383e519524SHoward Hinnant    typedef typename __base::const_iterator        const_iterator;
3393e519524SHoward Hinnant    typedef _STD::reverse_iterator<iterator>       reverse_iterator;
3403e519524SHoward Hinnant    typedef _STD::reverse_iterator<const_iterator> const_reverse_iterator;
3413e519524SHoward Hinnant
342*53ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
3433e519524SHoward Hinnant    explicit set(const value_compare& __comp = value_compare())
3443e519524SHoward Hinnant        : __tree_(__comp) {}
345*53ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
3463e519524SHoward Hinnant    set(const value_compare& __comp, const allocator_type& __a)
3473e519524SHoward Hinnant        : __tree_(__comp, __a) {}
3483e519524SHoward Hinnant    template <class _InputIterator>
349*53ec0b4eSHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
3503e519524SHoward Hinnant        set(_InputIterator __f, _InputIterator __l,
3513e519524SHoward Hinnant            const value_compare& __comp = value_compare())
3523e519524SHoward Hinnant        : __tree_(__comp)
3533e519524SHoward Hinnant        {
3543e519524SHoward Hinnant            insert(__f, __l);
3553e519524SHoward Hinnant        }
3563e519524SHoward Hinnant
3573e519524SHoward Hinnant    template <class _InputIterator>
358*53ec0b4eSHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
3593e519524SHoward Hinnant        set(_InputIterator __f, _InputIterator __l, const value_compare& __comp,
3603e519524SHoward Hinnant            const allocator_type& __a)
3613e519524SHoward Hinnant        : __tree_(__comp, __a)
3623e519524SHoward Hinnant        {
3633e519524SHoward Hinnant            insert(__f, __l);
3643e519524SHoward Hinnant        }
3653e519524SHoward Hinnant
366*53ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
3673e519524SHoward Hinnant    set(const set& __s)
3683e519524SHoward Hinnant        : __tree_(__s.__tree_)
3693e519524SHoward Hinnant        {
3703e519524SHoward Hinnant            insert(__s.begin(), __s.end());
3713e519524SHoward Hinnant        }
3723e519524SHoward Hinnant
3737609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
374*53ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
3753e519524SHoward Hinnant    set(set&& __s)
3763e519524SHoward Hinnant        : __tree_(_STD::move(__s.__tree_)) {}
3777609c9b6SHoward Hinnant#endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
3783e519524SHoward Hinnant
379*53ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
3803e519524SHoward Hinnant    explicit set(const allocator_type& __a)
3813e519524SHoward Hinnant        : __tree_(__a) {}
3823e519524SHoward Hinnant
383*53ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
3843e519524SHoward Hinnant    set(const set& __s, const allocator_type& __a)
3853e519524SHoward Hinnant        : __tree_(__s.__tree_.value_comp(), __a)
3863e519524SHoward Hinnant        {
3873e519524SHoward Hinnant            insert(__s.begin(), __s.end());
3883e519524SHoward Hinnant        }
3893e519524SHoward Hinnant
3907609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
3913e519524SHoward Hinnant    set(set&& __s, const allocator_type& __a);
3923e519524SHoward Hinnant#endif
3933e519524SHoward Hinnant
394*53ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
3953e519524SHoward Hinnant    set(initializer_list<value_type> __il, const value_compare& __comp = value_compare())
3963e519524SHoward Hinnant        : __tree_(__comp)
3973e519524SHoward Hinnant        {
3983e519524SHoward Hinnant            insert(__il.begin(), __il.end());
3993e519524SHoward Hinnant        }
4003e519524SHoward Hinnant
401*53ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
4023e519524SHoward Hinnant    set(initializer_list<value_type> __il, const value_compare& __comp,
4033e519524SHoward Hinnant        const allocator_type& __a)
4043e519524SHoward Hinnant        : __tree_(__comp, __a)
4053e519524SHoward Hinnant        {
4063e519524SHoward Hinnant            insert(__il.begin(), __il.end());
4073e519524SHoward Hinnant        }
4083e519524SHoward Hinnant
409*53ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
4103e519524SHoward Hinnant    set& operator=(initializer_list<value_type> __il)
4113e519524SHoward Hinnant        {
4123e519524SHoward Hinnant            __tree_.__assign_unique(__il.begin(), __il.end());
4133e519524SHoward Hinnant            return *this;
4143e519524SHoward Hinnant        }
4153e519524SHoward Hinnant
4167609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
417*53ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
4183e519524SHoward Hinnant    set& operator=(set&& __s)
4193e519524SHoward Hinnant        {
4203e519524SHoward Hinnant            __tree_ = _STD::move(__s.__tree_);
4213e519524SHoward Hinnant            return *this;
4223e519524SHoward Hinnant        }
4237609c9b6SHoward Hinnant#endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
4243e519524SHoward Hinnant
425*53ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
4263e519524SHoward Hinnant          iterator begin()       {return __tree_.begin();}
427*53ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
4283e519524SHoward Hinnant    const_iterator begin() const {return __tree_.begin();}
429*53ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
4303e519524SHoward Hinnant          iterator end()         {return __tree_.end();}
431*53ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
4323e519524SHoward Hinnant    const_iterator end()   const {return __tree_.end();}
4333e519524SHoward Hinnant
434*53ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
4353e519524SHoward Hinnant          reverse_iterator rbegin()       {return       reverse_iterator(end());}
436*53ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
4373e519524SHoward Hinnant    const_reverse_iterator rbegin() const {return const_reverse_iterator(end());}
438*53ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
4393e519524SHoward Hinnant          reverse_iterator rend()         {return       reverse_iterator(begin());}
440*53ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
4413e519524SHoward Hinnant    const_reverse_iterator rend()   const {return const_reverse_iterator(begin());}
4423e519524SHoward Hinnant
443*53ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
4443e519524SHoward Hinnant    const_iterator         cbegin()  const {return begin();}
445*53ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
4463e519524SHoward Hinnant    const_iterator         cend()    const {return end();}
447*53ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
4483e519524SHoward Hinnant    const_reverse_iterator crbegin() const {return rbegin();}
449*53ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
4503e519524SHoward Hinnant    const_reverse_iterator crend()   const {return rend();}
4513e519524SHoward Hinnant
452*53ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
4533e519524SHoward Hinnant    bool      empty()    const {return __tree_.size() == 0;}
454*53ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
4553e519524SHoward Hinnant    size_type size()     const {return __tree_.size();}
456*53ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
4573e519524SHoward Hinnant    size_type max_size() const {return __tree_.max_size();}
4583e519524SHoward Hinnant
4593e519524SHoward Hinnant    // modifiers:
4607609c9b6SHoward Hinnant#if !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS)
4613e519524SHoward Hinnant    template <class... _Args>
462*53ec0b4eSHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
4633e519524SHoward Hinnant        pair<iterator, bool> emplace(_Args&&... __args)
4643e519524SHoward Hinnant            {return __tree_.__emplace_unique(_STD::forward<_Args>(__args)...);}
4653e519524SHoward Hinnant    template <class... _Args>
466*53ec0b4eSHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
4673e519524SHoward Hinnant        iterator emplace_hint(const_iterator __p, _Args&&... __args)
4683e519524SHoward Hinnant            {return __tree_.__emplace_hint_unique(__p, _STD::forward<_Args>(__args)...);}
4697609c9b6SHoward Hinnant#endif  // !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS)
470*53ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
4713e519524SHoward Hinnant    pair<iterator,bool> insert(const value_type& __v)
4723e519524SHoward Hinnant        {return __tree_.__insert_unique(__v);}
4737609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
474*53ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
4753e519524SHoward Hinnant    pair<iterator,bool> insert(value_type&& __v)
4763e519524SHoward Hinnant        {return __tree_.__insert_unique(_STD::move(__v));}
4777609c9b6SHoward Hinnant#endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
478*53ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
4793e519524SHoward Hinnant    iterator insert(const_iterator __p, const value_type& __v)
4803e519524SHoward Hinnant        {return __tree_.__insert_unique(__p, __v);}
4817609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
482*53ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
4833e519524SHoward Hinnant    iterator insert(const_iterator __p, value_type&& __v)
4843e519524SHoward Hinnant        {return __tree_.__insert_unique(__p, _STD::move(__v));}
4857609c9b6SHoward Hinnant#endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
4863e519524SHoward Hinnant    template <class _InputIterator>
487*53ec0b4eSHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
4883e519524SHoward Hinnant        void insert(_InputIterator __f, _InputIterator __l)
4893e519524SHoward Hinnant        {
4903e519524SHoward Hinnant            for (const_iterator __e = cend(); __f != __l; ++__f)
4913e519524SHoward Hinnant                __tree_.__insert_unique(__e, *__f);
4923e519524SHoward Hinnant        }
4933e519524SHoward Hinnant
494*53ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
4953e519524SHoward Hinnant    void insert(initializer_list<value_type> __il)
4963e519524SHoward Hinnant        {insert(__il.begin(), __il.end());}
4973e519524SHoward Hinnant
498*53ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
4993e519524SHoward Hinnant    iterator  erase(const_iterator __p) {return __tree_.erase(__p);}
500*53ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
5013e519524SHoward Hinnant    size_type erase(const key_type& __k)
5023e519524SHoward Hinnant        {return __tree_.__erase_unique(__k);}
503*53ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
5043e519524SHoward Hinnant    iterator  erase(const_iterator __f, const_iterator __l)
5053e519524SHoward Hinnant        {return __tree_.erase(__f, __l);}
506*53ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
5073e519524SHoward Hinnant    void clear() {__tree_.clear();}
5083e519524SHoward Hinnant
509*53ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
5103e519524SHoward Hinnant    void swap(set& __s) {__tree_.swap(__s.__tree_);}
5113e519524SHoward Hinnant
512*53ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
5133e519524SHoward Hinnant    allocator_type get_allocator() const {return __tree_.__alloc();}
514*53ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
5153e519524SHoward Hinnant    key_compare    key_comp()      const {return __tree_.value_comp();}
516*53ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
5173e519524SHoward Hinnant    value_compare  value_comp()    const {return __tree_.value_comp();}
5183e519524SHoward Hinnant
5193e519524SHoward Hinnant    // set operations:
520*53ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
5213e519524SHoward Hinnant    iterator find(const key_type& __k)             {return __tree_.find(__k);}
522*53ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
5233e519524SHoward Hinnant    const_iterator find(const key_type& __k) const {return __tree_.find(__k);}
524*53ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
5253e519524SHoward Hinnant    size_type      count(const key_type& __k) const
5263e519524SHoward Hinnant        {return __tree_.__count_unique(__k);}
527*53ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
5283e519524SHoward Hinnant    iterator lower_bound(const key_type& __k)
5293e519524SHoward Hinnant        {return __tree_.lower_bound(__k);}
530*53ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
5313e519524SHoward Hinnant    const_iterator lower_bound(const key_type& __k) const
5323e519524SHoward Hinnant        {return __tree_.lower_bound(__k);}
533*53ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
5343e519524SHoward Hinnant    iterator upper_bound(const key_type& __k)
5353e519524SHoward Hinnant        {return __tree_.upper_bound(__k);}
536*53ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
5373e519524SHoward Hinnant    const_iterator upper_bound(const key_type& __k) const
5383e519524SHoward Hinnant        {return __tree_.upper_bound(__k);}
539*53ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
5403e519524SHoward Hinnant    pair<iterator,iterator> equal_range(const key_type& __k)
5413e519524SHoward Hinnant        {return __tree_.__equal_range_unique(__k);}
542*53ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
5433e519524SHoward Hinnant    pair<const_iterator,const_iterator> equal_range(const key_type& __k) const
5443e519524SHoward Hinnant        {return __tree_.__equal_range_unique(__k);}
5453e519524SHoward Hinnant};
5463e519524SHoward Hinnant
5477609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
5483e519524SHoward Hinnant
5493e519524SHoward Hinnanttemplate <class _Key, class _Compare, class _Allocator>
5503e519524SHoward Hinnantset<_Key, _Compare, _Allocator>::set(set&& __s, const allocator_type& __a)
5513e519524SHoward Hinnant    : __tree_(_STD::move(__s.__tree_), __a)
5523e519524SHoward Hinnant{
5533e519524SHoward Hinnant    if (__a != __s.get_allocator())
5543e519524SHoward Hinnant    {
5553e519524SHoward Hinnant        const_iterator __e = cend();
5563e519524SHoward Hinnant        while (!__s.empty())
5573e519524SHoward Hinnant            insert(__e, _STD::move(__s.__tree_.remove(__s.begin())->__value_));
5583e519524SHoward Hinnant    }
5593e519524SHoward Hinnant}
5603e519524SHoward Hinnant
5617609c9b6SHoward Hinnant#endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
5623e519524SHoward Hinnant
5633e519524SHoward Hinnanttemplate <class _Key, class _Compare, class _Allocator>
564*53ec0b4eSHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
5653e519524SHoward Hinnantbool
5663e519524SHoward Hinnantoperator==(const set<_Key, _Compare, _Allocator>& __x,
5673e519524SHoward Hinnant           const set<_Key, _Compare, _Allocator>& __y)
5683e519524SHoward Hinnant{
5693e519524SHoward Hinnant    return __x.size() == __y.size() && _STD::equal(__x.begin(), __x.end(), __y.begin());
5703e519524SHoward Hinnant}
5713e519524SHoward Hinnant
5723e519524SHoward Hinnanttemplate <class _Key, class _Compare, class _Allocator>
573*53ec0b4eSHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
5743e519524SHoward Hinnantbool
5753e519524SHoward Hinnantoperator< (const set<_Key, _Compare, _Allocator>& __x,
5763e519524SHoward Hinnant           const set<_Key, _Compare, _Allocator>& __y)
5773e519524SHoward Hinnant{
5783e519524SHoward Hinnant    return _STD::lexicographical_compare(__x.begin(), __x.end(), __y.begin(), __y.end());
5793e519524SHoward Hinnant}
5803e519524SHoward Hinnant
5813e519524SHoward Hinnanttemplate <class _Key, class _Compare, class _Allocator>
582*53ec0b4eSHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
5833e519524SHoward Hinnantbool
5843e519524SHoward Hinnantoperator!=(const set<_Key, _Compare, _Allocator>& __x,
5853e519524SHoward Hinnant           const set<_Key, _Compare, _Allocator>& __y)
5863e519524SHoward Hinnant{
5873e519524SHoward Hinnant    return !(__x == __y);
5883e519524SHoward Hinnant}
5893e519524SHoward Hinnant
5903e519524SHoward Hinnanttemplate <class _Key, class _Compare, class _Allocator>
591*53ec0b4eSHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
5923e519524SHoward Hinnantbool
5933e519524SHoward Hinnantoperator> (const set<_Key, _Compare, _Allocator>& __x,
5943e519524SHoward Hinnant           const set<_Key, _Compare, _Allocator>& __y)
5953e519524SHoward Hinnant{
5963e519524SHoward Hinnant    return __y < __x;
5973e519524SHoward Hinnant}
5983e519524SHoward Hinnant
5993e519524SHoward Hinnanttemplate <class _Key, class _Compare, class _Allocator>
600*53ec0b4eSHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
6013e519524SHoward Hinnantbool
6023e519524SHoward Hinnantoperator>=(const set<_Key, _Compare, _Allocator>& __x,
6033e519524SHoward Hinnant           const set<_Key, _Compare, _Allocator>& __y)
6043e519524SHoward Hinnant{
6053e519524SHoward Hinnant    return !(__x < __y);
6063e519524SHoward Hinnant}
6073e519524SHoward Hinnant
6083e519524SHoward Hinnanttemplate <class _Key, class _Compare, class _Allocator>
609*53ec0b4eSHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
6103e519524SHoward Hinnantbool
6113e519524SHoward Hinnantoperator<=(const set<_Key, _Compare, _Allocator>& __x,
6123e519524SHoward Hinnant           const set<_Key, _Compare, _Allocator>& __y)
6133e519524SHoward Hinnant{
6143e519524SHoward Hinnant    return !(__y < __x);
6153e519524SHoward Hinnant}
6163e519524SHoward Hinnant
6173e519524SHoward Hinnant// specialized algorithms:
6183e519524SHoward Hinnanttemplate <class _Key, class _Compare, class _Allocator>
619*53ec0b4eSHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
6203e519524SHoward Hinnantvoid
6213e519524SHoward Hinnantswap(set<_Key, _Compare, _Allocator>& __x,
6223e519524SHoward Hinnant     set<_Key, _Compare, _Allocator>& __y)
6233e519524SHoward Hinnant{
6243e519524SHoward Hinnant    __x.swap(__y);
6253e519524SHoward Hinnant}
6263e519524SHoward Hinnant
6273e519524SHoward Hinnanttemplate <class _Key, class _Compare = less<_Key>,
6283e519524SHoward Hinnant          class _Allocator = allocator<_Key> >
629*53ec0b4eSHoward Hinnantclass _LIBCPP_VISIBLE multiset
6303e519524SHoward Hinnant{
6313e519524SHoward Hinnantpublic:
6323e519524SHoward Hinnant    // types:
6333e519524SHoward Hinnant    typedef _Key                                      key_type;
6343e519524SHoward Hinnant    typedef key_type                                 value_type;
6353e519524SHoward Hinnant    typedef _Compare                                  key_compare;
6363e519524SHoward Hinnant    typedef key_compare                              value_compare;
6373e519524SHoward Hinnant    typedef _Allocator                                allocator_type;
6383e519524SHoward Hinnant    typedef value_type&                              reference;
6393e519524SHoward Hinnant    typedef const value_type&                        const_reference;
6403e519524SHoward Hinnant
6413e519524SHoward Hinnantprivate:
6423e519524SHoward Hinnant    typedef __tree<value_type, value_compare, allocator_type> __base;
6433e519524SHoward Hinnant    typedef allocator_traits<allocator_type>                  __alloc_traits;
6443e519524SHoward Hinnant    typedef typename __base::__node_holder                    __node_holder;
6453e519524SHoward Hinnant
6463e519524SHoward Hinnant    __base __tree_;
6473e519524SHoward Hinnant
6483e519524SHoward Hinnantpublic:
6493e519524SHoward Hinnant    typedef typename __base::pointer               pointer;
6503e519524SHoward Hinnant    typedef typename __base::const_pointer         const_pointer;
6513e519524SHoward Hinnant    typedef typename __base::size_type             size_type;
6523e519524SHoward Hinnant    typedef typename __base::difference_type       difference_type;
6533e519524SHoward Hinnant    typedef typename __base::const_iterator        iterator;
6543e519524SHoward Hinnant    typedef typename __base::const_iterator        const_iterator;
6553e519524SHoward Hinnant    typedef _STD::reverse_iterator<iterator>       reverse_iterator;
6563e519524SHoward Hinnant    typedef _STD::reverse_iterator<const_iterator> const_reverse_iterator;
6573e519524SHoward Hinnant
6583e519524SHoward Hinnant    // construct/copy/destroy:
659*53ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
6603e519524SHoward Hinnant    explicit multiset(const value_compare& __comp = value_compare())
6613e519524SHoward Hinnant        : __tree_(__comp) {}
662*53ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
6633e519524SHoward Hinnant    multiset(const value_compare& __comp, const allocator_type& __a)
6643e519524SHoward Hinnant        : __tree_(__comp, __a) {}
6653e519524SHoward Hinnant    template <class _InputIterator>
666*53ec0b4eSHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
6673e519524SHoward Hinnant        multiset(_InputIterator __f, _InputIterator __l,
6683e519524SHoward Hinnant                 const value_compare& __comp = value_compare())
6693e519524SHoward Hinnant        : __tree_(__comp)
6703e519524SHoward Hinnant        {
6713e519524SHoward Hinnant            insert(__f, __l);
6723e519524SHoward Hinnant        }
6733e519524SHoward Hinnant
6743e519524SHoward Hinnant    template <class _InputIterator>
675*53ec0b4eSHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
6763e519524SHoward Hinnant        multiset(_InputIterator __f, _InputIterator __l,
6773e519524SHoward Hinnant                 const value_compare& __comp, const allocator_type& __a)
6783e519524SHoward Hinnant        : __tree_(__comp, __a)
6793e519524SHoward Hinnant        {
6803e519524SHoward Hinnant            insert(__f, __l);
6813e519524SHoward Hinnant        }
6823e519524SHoward Hinnant
683*53ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
6843e519524SHoward Hinnant    multiset(const multiset& __s)
6853e519524SHoward Hinnant        : __tree_(__s.__tree_.value_comp(),
6863e519524SHoward Hinnant          __alloc_traits::select_on_container_copy_construction(__s.__tree_.__alloc()))
6873e519524SHoward Hinnant        {
6883e519524SHoward Hinnant            insert(__s.begin(), __s.end());
6893e519524SHoward Hinnant        }
6903e519524SHoward Hinnant
6917609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
692*53ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
6933e519524SHoward Hinnant    multiset(multiset&& __s)
6943e519524SHoward Hinnant        : __tree_(_STD::move(__s.__tree_)) {}
6957609c9b6SHoward Hinnant#endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
696*53ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
6973e519524SHoward Hinnant    explicit multiset(const allocator_type& __a)
6983e519524SHoward Hinnant        : __tree_(__a) {}
699*53ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
7003e519524SHoward Hinnant    multiset(const multiset& __s, const allocator_type& __a)
7013e519524SHoward Hinnant        : __tree_(__s.__tree_.value_comp(), __a)
7023e519524SHoward Hinnant        {
7033e519524SHoward Hinnant            insert(__s.begin(), __s.end());
7043e519524SHoward Hinnant        }
7057609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
7063e519524SHoward Hinnant    multiset(multiset&& __s, const allocator_type& __a);
7073e519524SHoward Hinnant#endif
7083e519524SHoward Hinnant
709*53ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
7103e519524SHoward Hinnant    multiset(initializer_list<value_type> __il, const value_compare& __comp = value_compare())
7113e519524SHoward Hinnant        : __tree_(__comp)
7123e519524SHoward Hinnant        {
7133e519524SHoward Hinnant            insert(__il.begin(), __il.end());
7143e519524SHoward Hinnant        }
7153e519524SHoward Hinnant
716*53ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
7173e519524SHoward Hinnant    multiset(initializer_list<value_type> __il, const value_compare& __comp,
7183e519524SHoward Hinnant        const allocator_type& __a)
7193e519524SHoward Hinnant        : __tree_(__comp, __a)
7203e519524SHoward Hinnant        {
7213e519524SHoward Hinnant            insert(__il.begin(), __il.end());
7223e519524SHoward Hinnant        }
7233e519524SHoward Hinnant
724*53ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
7253e519524SHoward Hinnant    multiset& operator=(initializer_list<value_type> __il)
7263e519524SHoward Hinnant        {
7273e519524SHoward Hinnant            __tree_.__assign_multi(__il.begin(), __il.end());
7283e519524SHoward Hinnant            return *this;
7293e519524SHoward Hinnant        }
7303e519524SHoward Hinnant
7317609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
732*53ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
7333e519524SHoward Hinnant    multiset& operator=(multiset&& __s)
7343e519524SHoward Hinnant        {
7353e519524SHoward Hinnant            __tree_ = _STD::move(__s.__tree_);
7363e519524SHoward Hinnant            return *this;
7373e519524SHoward Hinnant        }
7387609c9b6SHoward Hinnant#endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
7393e519524SHoward Hinnant
740*53ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
7413e519524SHoward Hinnant          iterator begin()       {return __tree_.begin();}
742*53ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
7433e519524SHoward Hinnant    const_iterator begin() const {return __tree_.begin();}
744*53ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
7453e519524SHoward Hinnant          iterator end()         {return __tree_.end();}
746*53ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
7473e519524SHoward Hinnant    const_iterator end()   const {return __tree_.end();}
7483e519524SHoward Hinnant
749*53ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
7503e519524SHoward Hinnant          reverse_iterator rbegin()       {return       reverse_iterator(end());}
751*53ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
7523e519524SHoward Hinnant    const_reverse_iterator rbegin() const {return const_reverse_iterator(end());}
753*53ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
7543e519524SHoward Hinnant          reverse_iterator rend()         {return       reverse_iterator(begin());}
755*53ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
7563e519524SHoward Hinnant    const_reverse_iterator rend()   const {return const_reverse_iterator(begin());}
7573e519524SHoward Hinnant
758*53ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
7593e519524SHoward Hinnant    const_iterator         cbegin()  const {return begin();}
760*53ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
7613e519524SHoward Hinnant    const_iterator         cend()    const {return end();}
762*53ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
7633e519524SHoward Hinnant    const_reverse_iterator crbegin() const {return rbegin();}
764*53ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
7653e519524SHoward Hinnant    const_reverse_iterator crend()   const {return rend();}
7663e519524SHoward Hinnant
767*53ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
7683e519524SHoward Hinnant    bool      empty()    const {return __tree_.size() == 0;}
769*53ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
7703e519524SHoward Hinnant    size_type size()     const {return __tree_.size();}
771*53ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
7723e519524SHoward Hinnant    size_type max_size() const {return __tree_.max_size();}
7733e519524SHoward Hinnant
7743e519524SHoward Hinnant    // modifiers:
7757609c9b6SHoward Hinnant#if !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS)
7763e519524SHoward Hinnant    template <class... _Args>
777*53ec0b4eSHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
7783e519524SHoward Hinnant        iterator emplace(_Args&&... __args)
7793e519524SHoward Hinnant            {return __tree_.__emplace_multi(_STD::forward<_Args>(__args)...);}
7803e519524SHoward Hinnant    template <class... _Args>
781*53ec0b4eSHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
7823e519524SHoward Hinnant        iterator emplace_hint(const_iterator __p, _Args&&... __args)
7833e519524SHoward Hinnant            {return __tree_.__emplace_hint_multi(__p, _STD::forward<_Args>(__args)...);}
7847609c9b6SHoward Hinnant#endif  // !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS)
785*53ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
7863e519524SHoward Hinnant    iterator insert(const value_type& __v)
7873e519524SHoward Hinnant        {return __tree_.__insert_multi(__v);}
7887609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
789*53ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
7903e519524SHoward Hinnant    iterator insert(value_type&& __v)
7913e519524SHoward Hinnant        {return __tree_.__insert_multi(_STD::move(__v));}
7927609c9b6SHoward Hinnant#endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
793*53ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
7943e519524SHoward Hinnant    iterator insert(const_iterator __p, const value_type& __v)
7953e519524SHoward Hinnant        {return __tree_.__insert_multi(__p, __v);}
7967609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
797*53ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
7983e519524SHoward Hinnant    iterator insert(const_iterator __p, value_type&& __v)
7993e519524SHoward Hinnant        {return __tree_.__insert_multi(_STD::move(__v));}
8007609c9b6SHoward Hinnant#endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
8013e519524SHoward Hinnant    template <class _InputIterator>
802*53ec0b4eSHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
8033e519524SHoward Hinnant        void insert(_InputIterator __f, _InputIterator __l)
8043e519524SHoward Hinnant        {
8053e519524SHoward Hinnant            for (const_iterator __e = cend(); __f != __l; ++__f)
8063e519524SHoward Hinnant                __tree_.__insert_multi(__e, *__f);
8073e519524SHoward Hinnant        }
8083e519524SHoward Hinnant
809*53ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
8103e519524SHoward Hinnant    void insert(initializer_list<value_type> __il)
8113e519524SHoward Hinnant        {insert(__il.begin(), __il.end());}
8123e519524SHoward Hinnant
813*53ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
8143e519524SHoward Hinnant    iterator  erase(const_iterator __p) {return __tree_.erase(__p);}
815*53ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
8163e519524SHoward Hinnant    size_type erase(const key_type& __k) {return __tree_.__erase_multi(__k);}
817*53ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
8183e519524SHoward Hinnant    iterator  erase(const_iterator __f, const_iterator __l)
8193e519524SHoward Hinnant        {return __tree_.erase(__f, __l);}
820*53ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
8213e519524SHoward Hinnant    void clear() {__tree_.clear();}
8223e519524SHoward Hinnant
823*53ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
8243e519524SHoward Hinnant    void swap(multiset& __s) {__tree_.swap(__s.__tree_);}
8253e519524SHoward Hinnant
826*53ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
8273e519524SHoward Hinnant    allocator_type get_allocator() const {return __tree_.__alloc();}
828*53ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
8293e519524SHoward Hinnant    key_compare    key_comp()      const {return __tree_.value_comp();}
830*53ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
8313e519524SHoward Hinnant    value_compare  value_comp()    const {return __tree_.value_comp();}
8323e519524SHoward Hinnant
8333e519524SHoward Hinnant    // set operations:
834*53ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
8353e519524SHoward Hinnant    iterator find(const key_type& __k)             {return __tree_.find(__k);}
836*53ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
8373e519524SHoward Hinnant    const_iterator find(const key_type& __k) const {return __tree_.find(__k);}
838*53ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
8393e519524SHoward Hinnant    size_type      count(const key_type& __k) const
8403e519524SHoward Hinnant        {return __tree_.__count_multi(__k);}
841*53ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
8423e519524SHoward Hinnant    iterator lower_bound(const key_type& __k)
8433e519524SHoward Hinnant        {return __tree_.lower_bound(__k);}
844*53ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
8453e519524SHoward Hinnant    const_iterator lower_bound(const key_type& __k) const
8463e519524SHoward Hinnant            {return __tree_.lower_bound(__k);}
847*53ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
8483e519524SHoward Hinnant    iterator upper_bound(const key_type& __k)
8493e519524SHoward Hinnant            {return __tree_.upper_bound(__k);}
850*53ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
8513e519524SHoward Hinnant    const_iterator upper_bound(const key_type& __k) const
8523e519524SHoward Hinnant            {return __tree_.upper_bound(__k);}
853*53ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
8543e519524SHoward Hinnant    pair<iterator,iterator>             equal_range(const key_type& __k)
8553e519524SHoward Hinnant            {return __tree_.__equal_range_multi(__k);}
856*53ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
8573e519524SHoward Hinnant    pair<const_iterator,const_iterator> equal_range(const key_type& __k) const
8583e519524SHoward Hinnant            {return __tree_.__equal_range_multi(__k);}
8593e519524SHoward Hinnant};
8603e519524SHoward Hinnant
8617609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
8623e519524SHoward Hinnant
8633e519524SHoward Hinnanttemplate <class _Key, class _Compare, class _Allocator>
8643e519524SHoward Hinnantmultiset<_Key, _Compare, _Allocator>::multiset(multiset&& __s, const allocator_type& __a)
8653e519524SHoward Hinnant    : __tree_(_STD::move(__s.__tree_), __a)
8663e519524SHoward Hinnant{
8673e519524SHoward Hinnant    if (__a != __s.get_allocator())
8683e519524SHoward Hinnant    {
8693e519524SHoward Hinnant        const_iterator __e = cend();
8703e519524SHoward Hinnant        while (!__s.empty())
8713e519524SHoward Hinnant            insert(__e, _STD::move(__s.__tree_.remove(__s.begin())->__value_));
8723e519524SHoward Hinnant    }
8733e519524SHoward Hinnant}
8743e519524SHoward Hinnant
8757609c9b6SHoward Hinnant#endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
8763e519524SHoward Hinnant
8773e519524SHoward Hinnanttemplate <class _Key, class _Compare, class _Allocator>
878*53ec0b4eSHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
8793e519524SHoward Hinnantbool
8803e519524SHoward Hinnantoperator==(const multiset<_Key, _Compare, _Allocator>& __x,
8813e519524SHoward Hinnant           const multiset<_Key, _Compare, _Allocator>& __y)
8823e519524SHoward Hinnant{
8833e519524SHoward Hinnant    return __x.size() == __y.size() && _STD::equal(__x.begin(), __x.end(), __y.begin());
8843e519524SHoward Hinnant}
8853e519524SHoward Hinnant
8863e519524SHoward Hinnanttemplate <class _Key, class _Compare, class _Allocator>
887*53ec0b4eSHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
8883e519524SHoward Hinnantbool
8893e519524SHoward Hinnantoperator< (const multiset<_Key, _Compare, _Allocator>& __x,
8903e519524SHoward Hinnant           const multiset<_Key, _Compare, _Allocator>& __y)
8913e519524SHoward Hinnant{
8923e519524SHoward Hinnant    return _STD::lexicographical_compare(__x.begin(), __x.end(), __y.begin(), __y.end());
8933e519524SHoward Hinnant}
8943e519524SHoward Hinnant
8953e519524SHoward Hinnanttemplate <class _Key, class _Compare, class _Allocator>
896*53ec0b4eSHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
8973e519524SHoward Hinnantbool
8983e519524SHoward Hinnantoperator!=(const multiset<_Key, _Compare, _Allocator>& __x,
8993e519524SHoward Hinnant           const multiset<_Key, _Compare, _Allocator>& __y)
9003e519524SHoward Hinnant{
9013e519524SHoward Hinnant    return !(__x == __y);
9023e519524SHoward Hinnant}
9033e519524SHoward Hinnant
9043e519524SHoward Hinnanttemplate <class _Key, class _Compare, class _Allocator>
905*53ec0b4eSHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
9063e519524SHoward Hinnantbool
9073e519524SHoward Hinnantoperator> (const multiset<_Key, _Compare, _Allocator>& __x,
9083e519524SHoward Hinnant           const multiset<_Key, _Compare, _Allocator>& __y)
9093e519524SHoward Hinnant{
9103e519524SHoward Hinnant    return __y < __x;
9113e519524SHoward Hinnant}
9123e519524SHoward Hinnant
9133e519524SHoward Hinnanttemplate <class _Key, class _Compare, class _Allocator>
914*53ec0b4eSHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
9153e519524SHoward Hinnantbool
9163e519524SHoward Hinnantoperator>=(const multiset<_Key, _Compare, _Allocator>& __x,
9173e519524SHoward Hinnant           const multiset<_Key, _Compare, _Allocator>& __y)
9183e519524SHoward Hinnant{
9193e519524SHoward Hinnant    return !(__x < __y);
9203e519524SHoward Hinnant}
9213e519524SHoward Hinnant
9223e519524SHoward Hinnanttemplate <class _Key, class _Compare, class _Allocator>
923*53ec0b4eSHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
9243e519524SHoward Hinnantbool
9253e519524SHoward Hinnantoperator<=(const multiset<_Key, _Compare, _Allocator>& __x,
9263e519524SHoward Hinnant           const multiset<_Key, _Compare, _Allocator>& __y)
9273e519524SHoward Hinnant{
9283e519524SHoward Hinnant    return !(__y < __x);
9293e519524SHoward Hinnant}
9303e519524SHoward Hinnant
9313e519524SHoward Hinnanttemplate <class _Key, class _Compare, class _Allocator>
932*53ec0b4eSHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
9333e519524SHoward Hinnantvoid
9343e519524SHoward Hinnantswap(multiset<_Key, _Compare, _Allocator>& __x,
9353e519524SHoward Hinnant     multiset<_Key, _Compare, _Allocator>& __y)
9363e519524SHoward Hinnant{
9373e519524SHoward Hinnant    __x.swap(__y);
9383e519524SHoward Hinnant}
9393e519524SHoward Hinnant
9403e519524SHoward Hinnant_LIBCPP_END_NAMESPACE_STD
9413e519524SHoward Hinnant
9423e519524SHoward Hinnant#endif  // _LIBCPP_SET
943