xref: /llvm-project-15.0.7/libcxx/include/set (revision 4e0ea2cf)
13e519524SHoward Hinnant// -*- C++ -*-
23e519524SHoward Hinnant//===---------------------------- set -------------------------------------===//
33e519524SHoward Hinnant//
457b08b09SChandler Carruth// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
557b08b09SChandler Carruth// See https://llvm.org/LICENSE.txt for license information.
657b08b09SChandler Carruth// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
73e519524SHoward Hinnant//
83e519524SHoward Hinnant//===----------------------------------------------------------------------===//
93e519524SHoward Hinnant
103e519524SHoward Hinnant#ifndef _LIBCPP_SET
113e519524SHoward Hinnant#define _LIBCPP_SET
123e519524SHoward Hinnant
133e519524SHoward Hinnant/*
143e519524SHoward Hinnant
153e519524SHoward Hinnant    set synopsis
163e519524SHoward Hinnant
173e519524SHoward Hinnantnamespace std
183e519524SHoward Hinnant{
193e519524SHoward Hinnant
203e519524SHoward Hinnanttemplate <class Key, class Compare = less<Key>,
213e519524SHoward Hinnant          class Allocator = allocator<Key>>
223e519524SHoward Hinnantclass set
233e519524SHoward Hinnant{
243e519524SHoward Hinnantpublic:
253e519524SHoward Hinnant    // types:
263e519524SHoward Hinnant    typedef Key                                      key_type;
273e519524SHoward Hinnant    typedef key_type                                 value_type;
283e519524SHoward Hinnant    typedef Compare                                  key_compare;
293e519524SHoward Hinnant    typedef key_compare                              value_compare;
303e519524SHoward Hinnant    typedef Allocator                                allocator_type;
313e519524SHoward Hinnant    typedef typename allocator_type::reference       reference;
323e519524SHoward Hinnant    typedef typename allocator_type::const_reference const_reference;
333e519524SHoward Hinnant    typedef typename allocator_type::size_type       size_type;
343e519524SHoward Hinnant    typedef typename allocator_type::difference_type difference_type;
353e519524SHoward Hinnant    typedef typename allocator_type::pointer         pointer;
363e519524SHoward Hinnant    typedef typename allocator_type::const_pointer   const_pointer;
373e519524SHoward Hinnant
383e519524SHoward Hinnant    typedef implementation-defined                   iterator;
393e519524SHoward Hinnant    typedef implementation-defined                   const_iterator;
403e519524SHoward Hinnant    typedef std::reverse_iterator<iterator>          reverse_iterator;
413e519524SHoward Hinnant    typedef std::reverse_iterator<const_iterator>    const_reverse_iterator;
42b0386a51SErik Pilkington    typedef unspecified                              node_type;               // C++17
43b0386a51SErik Pilkington    typedef INSERT_RETURN_TYPE<iterator, node_type>  insert_return_type;      // C++17
443e519524SHoward Hinnant
453e519524SHoward Hinnant    // construct/copy/destroy:
460e9f71c1SHoward Hinnant    set()
470e9f71c1SHoward Hinnant        noexcept(
480e9f71c1SHoward Hinnant            is_nothrow_default_constructible<allocator_type>::value &&
490e9f71c1SHoward Hinnant            is_nothrow_default_constructible<key_compare>::value &&
500e9f71c1SHoward Hinnant            is_nothrow_copy_constructible<key_compare>::value);
510e9f71c1SHoward Hinnant    explicit set(const value_compare& comp);
523e519524SHoward Hinnant    set(const value_compare& comp, const allocator_type& a);
533e519524SHoward Hinnant    template <class InputIterator>
543e519524SHoward Hinnant        set(InputIterator first, InputIterator last,
553e519524SHoward Hinnant            const value_compare& comp = value_compare());
563e519524SHoward Hinnant    template <class InputIterator>
573e519524SHoward Hinnant        set(InputIterator first, InputIterator last, const value_compare& comp,
583e519524SHoward Hinnant            const allocator_type& a);
593e519524SHoward Hinnant    set(const set& s);
600e9f71c1SHoward Hinnant    set(set&& s)
610e9f71c1SHoward Hinnant        noexcept(
620e9f71c1SHoward Hinnant            is_nothrow_move_constructible<allocator_type>::value &&
630e9f71c1SHoward Hinnant            is_nothrow_move_constructible<key_compare>::value);
643e519524SHoward Hinnant    explicit set(const allocator_type& a);
653e519524SHoward Hinnant    set(const set& s, const allocator_type& a);
663e519524SHoward Hinnant    set(set&& s, const allocator_type& a);
673e519524SHoward Hinnant    set(initializer_list<value_type> il, const value_compare& comp = value_compare());
683e519524SHoward Hinnant    set(initializer_list<value_type> il, const value_compare& comp,
693e519524SHoward Hinnant        const allocator_type& a);
700a55d17bSMarshall Clow    template <class InputIterator>
710a55d17bSMarshall Clow        set(InputIterator first, InputIterator last, const allocator_type& a)
720a55d17bSMarshall Clow            : set(first, last, Compare(), a) {}  // C++14
730a55d17bSMarshall Clow    set(initializer_list<value_type> il, const allocator_type& a)
740a55d17bSMarshall Clow        : set(il, Compare(), a) {}  // C++14
753e519524SHoward Hinnant    ~set();
763e519524SHoward Hinnant
773e519524SHoward Hinnant    set& operator=(const set& s);
780e9f71c1SHoward Hinnant    set& operator=(set&& s)
790e9f71c1SHoward Hinnant        noexcept(
800e9f71c1SHoward Hinnant            allocator_type::propagate_on_container_move_assignment::value &&
810e9f71c1SHoward Hinnant            is_nothrow_move_assignable<allocator_type>::value &&
820e9f71c1SHoward Hinnant            is_nothrow_move_assignable<key_compare>::value);
833e519524SHoward Hinnant    set& operator=(initializer_list<value_type> il);
843e519524SHoward Hinnant
853e519524SHoward Hinnant    // iterators:
860e9f71c1SHoward Hinnant          iterator begin() noexcept;
870e9f71c1SHoward Hinnant    const_iterator begin() const noexcept;
880e9f71c1SHoward Hinnant          iterator end() noexcept;
890e9f71c1SHoward Hinnant    const_iterator end()   const noexcept;
903e519524SHoward Hinnant
910e9f71c1SHoward Hinnant          reverse_iterator rbegin() noexcept;
920e9f71c1SHoward Hinnant    const_reverse_iterator rbegin() const noexcept;
930e9f71c1SHoward Hinnant          reverse_iterator rend() noexcept;
940e9f71c1SHoward Hinnant    const_reverse_iterator rend()   const noexcept;
953e519524SHoward Hinnant
960e9f71c1SHoward Hinnant    const_iterator         cbegin()  const noexcept;
970e9f71c1SHoward Hinnant    const_iterator         cend()    const noexcept;
980e9f71c1SHoward Hinnant    const_reverse_iterator crbegin() const noexcept;
990e9f71c1SHoward Hinnant    const_reverse_iterator crend()   const noexcept;
1003e519524SHoward Hinnant
1013e519524SHoward Hinnant    // capacity:
1020e9f71c1SHoward Hinnant    bool      empty()    const noexcept;
1030e9f71c1SHoward Hinnant    size_type size()     const noexcept;
1040e9f71c1SHoward Hinnant    size_type max_size() const noexcept;
1053e519524SHoward Hinnant
1063e519524SHoward Hinnant    // modifiers:
1073e519524SHoward Hinnant    template <class... Args>
1083e519524SHoward Hinnant        pair<iterator, bool> emplace(Args&&... args);
1093e519524SHoward Hinnant    template <class... Args>
1103e519524SHoward Hinnant        iterator emplace_hint(const_iterator position, Args&&... args);
1113e519524SHoward Hinnant    pair<iterator,bool> insert(const value_type& v);
1123e519524SHoward Hinnant    pair<iterator,bool> insert(value_type&& v);
1133e519524SHoward Hinnant    iterator insert(const_iterator position, const value_type& v);
1143e519524SHoward Hinnant    iterator insert(const_iterator position, value_type&& v);
1153e519524SHoward Hinnant    template <class InputIterator>
1163e519524SHoward Hinnant        void insert(InputIterator first, InputIterator last);
1173e519524SHoward Hinnant    void insert(initializer_list<value_type> il);
1183e519524SHoward Hinnant
119b0386a51SErik Pilkington    node_type extract(const_iterator position);                                       // C++17
120b0386a51SErik Pilkington    node_type extract(const key_type& x);                                             // C++17
121b0386a51SErik Pilkington    insert_return_type insert(node_type&& nh);                                        // C++17
122b0386a51SErik Pilkington    iterator insert(const_iterator hint, node_type&& nh);                             // C++17
123b0386a51SErik Pilkington
1243e519524SHoward Hinnant    iterator  erase(const_iterator position);
125ec392968SMarshall Clow    iterator  erase(iterator position);  // C++14
1263e519524SHoward Hinnant    size_type erase(const key_type& k);
1273e519524SHoward Hinnant    iterator  erase(const_iterator first, const_iterator last);
1280e9f71c1SHoward Hinnant    void clear() noexcept;
1293e519524SHoward Hinnant
1305c4e07aeSErik Pilkington    template<class C2>
1315c4e07aeSErik Pilkington      void merge(set<Key, C2, Allocator>& source);         // C++17
1325c4e07aeSErik Pilkington    template<class C2>
1335c4e07aeSErik Pilkington      void merge(set<Key, C2, Allocator>&& source);        // C++17
1345c4e07aeSErik Pilkington    template<class C2>
1355c4e07aeSErik Pilkington      void merge(multiset<Key, C2, Allocator>& source);    // C++17
1365c4e07aeSErik Pilkington    template<class C2>
1375c4e07aeSErik Pilkington      void merge(multiset<Key, C2, Allocator>&& source);   // C++17
1385c4e07aeSErik Pilkington
1390e9f71c1SHoward Hinnant    void swap(set& s)
1400e9f71c1SHoward Hinnant        noexcept(
1410e9f71c1SHoward Hinnant            __is_nothrow_swappable<key_compare>::value &&
1420e9f71c1SHoward Hinnant            (!allocator_type::propagate_on_container_swap::value ||
1430e9f71c1SHoward Hinnant             __is_nothrow_swappable<allocator_type>::value));
1443e519524SHoward Hinnant
1453e519524SHoward Hinnant    // observers:
1460e9f71c1SHoward Hinnant    allocator_type get_allocator() const noexcept;
1473e519524SHoward Hinnant    key_compare    key_comp()      const;
1483e519524SHoward Hinnant    value_compare  value_comp()    const;
1493e519524SHoward Hinnant
1503e519524SHoward Hinnant    // set operations:
1513e519524SHoward Hinnant          iterator find(const key_type& k);
1523e519524SHoward Hinnant    const_iterator find(const key_type& k) const;
15325d3402cSMarshall Clow    template<typename K>
15425d3402cSMarshall Clow        iterator find(const K& x);
15525d3402cSMarshall Clow    template<typename K>
15625d3402cSMarshall Clow        const_iterator find(const K& x) const;  // C++14
1573fca07d7SMarek Kurdej
15825d3402cSMarshall Clow    template<typename K>
15925d3402cSMarshall Clow        size_type count(const K& x) const;        // C++14
1603e519524SHoward Hinnant    size_type      count(const key_type& k) const;
1613fca07d7SMarek Kurdej
162a17b1aedSZoe Carver    bool           contains(const key_type& x) const;  // C++20
1633fca07d7SMarek Kurdej    template<class K> bool contains(const K& x) const; // C++20
1643fca07d7SMarek Kurdej
1653e519524SHoward Hinnant          iterator lower_bound(const key_type& k);
1663e519524SHoward Hinnant    const_iterator lower_bound(const key_type& k) const;
16725d3402cSMarshall Clow    template<typename K>
16825d3402cSMarshall Clow        iterator lower_bound(const K& x);              // C++14
16925d3402cSMarshall Clow    template<typename K>
17025d3402cSMarshall Clow        const_iterator lower_bound(const K& x) const;  // C++14
17125d3402cSMarshall Clow
1723e519524SHoward Hinnant          iterator upper_bound(const key_type& k);
1733e519524SHoward Hinnant    const_iterator upper_bound(const key_type& k) const;
17425d3402cSMarshall Clow    template<typename K>
17525d3402cSMarshall Clow        iterator upper_bound(const K& x);              // C++14
17625d3402cSMarshall Clow    template<typename K>
17725d3402cSMarshall Clow        const_iterator upper_bound(const K& x) const;  // C++14
1783e519524SHoward Hinnant    pair<iterator,iterator>             equal_range(const key_type& k);
1793e519524SHoward Hinnant    pair<const_iterator,const_iterator> equal_range(const key_type& k) const;
18025d3402cSMarshall Clow    template<typename K>
18125d3402cSMarshall Clow        pair<iterator,iterator>             equal_range(const K& x);        // C++14
18225d3402cSMarshall Clow    template<typename K>
18325d3402cSMarshall Clow        pair<const_iterator,const_iterator> equal_range(const K& x) const;  // C++14
1843e519524SHoward Hinnant};
1853e519524SHoward Hinnant
1863e519524SHoward Hinnanttemplate <class Key, class Compare, class Allocator>
1873e519524SHoward Hinnantbool
1883e519524SHoward Hinnantoperator==(const set<Key, Compare, Allocator>& x,
1893e519524SHoward Hinnant           const set<Key, Compare, Allocator>& y);
1903e519524SHoward Hinnant
1913e519524SHoward Hinnanttemplate <class Key, class Compare, class Allocator>
1923e519524SHoward Hinnantbool
1933e519524SHoward Hinnantoperator< (const set<Key, Compare, Allocator>& x,
1943e519524SHoward Hinnant           const set<Key, Compare, Allocator>& y);
1953e519524SHoward Hinnant
1963e519524SHoward Hinnanttemplate <class Key, class Compare, class Allocator>
1973e519524SHoward Hinnantbool
1983e519524SHoward Hinnantoperator!=(const set<Key, Compare, Allocator>& x,
1993e519524SHoward Hinnant           const set<Key, Compare, Allocator>& y);
2003e519524SHoward Hinnant
2013e519524SHoward Hinnanttemplate <class Key, class Compare, class Allocator>
2023e519524SHoward Hinnantbool
2033e519524SHoward Hinnantoperator> (const set<Key, Compare, Allocator>& x,
2043e519524SHoward Hinnant           const set<Key, Compare, Allocator>& y);
2053e519524SHoward Hinnant
2063e519524SHoward Hinnanttemplate <class Key, class Compare, class Allocator>
2073e519524SHoward Hinnantbool
2083e519524SHoward Hinnantoperator>=(const set<Key, Compare, Allocator>& x,
2093e519524SHoward Hinnant           const set<Key, Compare, Allocator>& y);
2103e519524SHoward Hinnant
2113e519524SHoward Hinnanttemplate <class Key, class Compare, class Allocator>
2123e519524SHoward Hinnantbool
2133e519524SHoward Hinnantoperator<=(const set<Key, Compare, Allocator>& x,
2143e519524SHoward Hinnant           const set<Key, Compare, Allocator>& y);
2153e519524SHoward Hinnant
2163e519524SHoward Hinnant// specialized algorithms:
2173e519524SHoward Hinnanttemplate <class Key, class Compare, class Allocator>
2183e519524SHoward Hinnantvoid
2190e9f71c1SHoward Hinnantswap(set<Key, Compare, Allocator>& x, set<Key, Compare, Allocator>& y)
2200e9f71c1SHoward Hinnant    noexcept(noexcept(x.swap(y)));
2213e519524SHoward Hinnant
222f60c63c0SMarshall Clowtemplate <class Key, class Compare, class Allocator, class Predicate>
2233e895085SMarek Kurdejtypename set<Key, Compare, Allocator>::size_type
2243e895085SMarek Kurdejerase_if(set<Key, Compare, Allocator>& c, Predicate pred);  // C++20
225f60c63c0SMarshall Clow
2263e519524SHoward Hinnanttemplate <class Key, class Compare = less<Key>,
2273e519524SHoward Hinnant          class Allocator = allocator<Key>>
2283e519524SHoward Hinnantclass multiset
2293e519524SHoward Hinnant{
2303e519524SHoward Hinnantpublic:
2313e519524SHoward Hinnant    // types:
2323e519524SHoward Hinnant    typedef Key                                      key_type;
2333e519524SHoward Hinnant    typedef key_type                                 value_type;
2343e519524SHoward Hinnant    typedef Compare                                  key_compare;
2353e519524SHoward Hinnant    typedef key_compare                              value_compare;
2363e519524SHoward Hinnant    typedef Allocator                                allocator_type;
2373e519524SHoward Hinnant    typedef typename allocator_type::reference       reference;
2383e519524SHoward Hinnant    typedef typename allocator_type::const_reference const_reference;
2393e519524SHoward Hinnant    typedef typename allocator_type::size_type       size_type;
2403e519524SHoward Hinnant    typedef typename allocator_type::difference_type difference_type;
2413e519524SHoward Hinnant    typedef typename allocator_type::pointer         pointer;
2423e519524SHoward Hinnant    typedef typename allocator_type::const_pointer   const_pointer;
2433e519524SHoward Hinnant
2443e519524SHoward Hinnant    typedef implementation-defined                   iterator;
2453e519524SHoward Hinnant    typedef implementation-defined                   const_iterator;
2463e519524SHoward Hinnant    typedef std::reverse_iterator<iterator>          reverse_iterator;
2473e519524SHoward Hinnant    typedef std::reverse_iterator<const_iterator>    const_reverse_iterator;
248b0386a51SErik Pilkington    typedef unspecified                              node_type;               // C++17
2493e519524SHoward Hinnant
2503e519524SHoward Hinnant    // construct/copy/destroy:
2510e9f71c1SHoward Hinnant    multiset()
2520e9f71c1SHoward Hinnant        noexcept(
2530e9f71c1SHoward Hinnant            is_nothrow_default_constructible<allocator_type>::value &&
2540e9f71c1SHoward Hinnant            is_nothrow_default_constructible<key_compare>::value &&
2550e9f71c1SHoward Hinnant            is_nothrow_copy_constructible<key_compare>::value);
2560e9f71c1SHoward Hinnant    explicit multiset(const value_compare& comp);
2573e519524SHoward Hinnant    multiset(const value_compare& comp, const allocator_type& a);
2583e519524SHoward Hinnant    template <class InputIterator>
2593e519524SHoward Hinnant        multiset(InputIterator first, InputIterator last,
2603e519524SHoward Hinnant                 const value_compare& comp = value_compare());
2613e519524SHoward Hinnant    template <class InputIterator>
2623e519524SHoward Hinnant        multiset(InputIterator first, InputIterator last,
2633e519524SHoward Hinnant                 const value_compare& comp, const allocator_type& a);
2643e519524SHoward Hinnant    multiset(const multiset& s);
2650e9f71c1SHoward Hinnant    multiset(multiset&& s)
2660e9f71c1SHoward Hinnant        noexcept(
2670e9f71c1SHoward Hinnant            is_nothrow_move_constructible<allocator_type>::value &&
2680e9f71c1SHoward Hinnant            is_nothrow_move_constructible<key_compare>::value);
2693e519524SHoward Hinnant    explicit multiset(const allocator_type& a);
2703e519524SHoward Hinnant    multiset(const multiset& s, const allocator_type& a);
2713e519524SHoward Hinnant    multiset(multiset&& s, const allocator_type& a);
2723e519524SHoward Hinnant    multiset(initializer_list<value_type> il, const value_compare& comp = value_compare());
2733e519524SHoward Hinnant    multiset(initializer_list<value_type> il, const value_compare& comp,
2743e519524SHoward Hinnant             const allocator_type& a);
2750a55d17bSMarshall Clow    template <class InputIterator>
2760a55d17bSMarshall Clow        multiset(InputIterator first, InputIterator last, const allocator_type& a)
2770a55d17bSMarshall Clow            : set(first, last, Compare(), a) {}  // C++14
2780a55d17bSMarshall Clow    multiset(initializer_list<value_type> il, const allocator_type& a)
2790a55d17bSMarshall Clow        : set(il, Compare(), a) {}  // C++14
2803e519524SHoward Hinnant    ~multiset();
2813e519524SHoward Hinnant
2823e519524SHoward Hinnant    multiset& operator=(const multiset& s);
2830e9f71c1SHoward Hinnant    multiset& operator=(multiset&& s)
2840e9f71c1SHoward Hinnant        noexcept(
2850e9f71c1SHoward Hinnant            allocator_type::propagate_on_container_move_assignment::value &&
2860e9f71c1SHoward Hinnant            is_nothrow_move_assignable<allocator_type>::value &&
2870e9f71c1SHoward Hinnant            is_nothrow_move_assignable<key_compare>::value);
2883e519524SHoward Hinnant    multiset& operator=(initializer_list<value_type> il);
2893e519524SHoward Hinnant
2903e519524SHoward Hinnant    // iterators:
2910e9f71c1SHoward Hinnant          iterator begin() noexcept;
2920e9f71c1SHoward Hinnant    const_iterator begin() const noexcept;
2930e9f71c1SHoward Hinnant          iterator end() noexcept;
2940e9f71c1SHoward Hinnant    const_iterator end()   const noexcept;
2953e519524SHoward Hinnant
2960e9f71c1SHoward Hinnant          reverse_iterator rbegin() noexcept;
2970e9f71c1SHoward Hinnant    const_reverse_iterator rbegin() const noexcept;
2980e9f71c1SHoward Hinnant          reverse_iterator rend() noexcept;
2990e9f71c1SHoward Hinnant    const_reverse_iterator rend()   const noexcept;
3003e519524SHoward Hinnant
3010e9f71c1SHoward Hinnant    const_iterator         cbegin()  const noexcept;
3020e9f71c1SHoward Hinnant    const_iterator         cend()    const noexcept;
3030e9f71c1SHoward Hinnant    const_reverse_iterator crbegin() const noexcept;
3040e9f71c1SHoward Hinnant    const_reverse_iterator crend()   const noexcept;
3053e519524SHoward Hinnant
3063e519524SHoward Hinnant    // capacity:
3070e9f71c1SHoward Hinnant    bool      empty()    const noexcept;
3080e9f71c1SHoward Hinnant    size_type size()     const noexcept;
3090e9f71c1SHoward Hinnant    size_type max_size() const noexcept;
3103e519524SHoward Hinnant
3113e519524SHoward Hinnant    // modifiers:
3123e519524SHoward Hinnant    template <class... Args>
3133e519524SHoward Hinnant        iterator emplace(Args&&... args);
3143e519524SHoward Hinnant    template <class... Args>
3153e519524SHoward Hinnant        iterator emplace_hint(const_iterator position, Args&&... args);
3163e519524SHoward Hinnant    iterator insert(const value_type& v);
3173e519524SHoward Hinnant    iterator insert(value_type&& v);
3183e519524SHoward Hinnant    iterator insert(const_iterator position, const value_type& v);
3193e519524SHoward Hinnant    iterator insert(const_iterator position, value_type&& v);
3203e519524SHoward Hinnant    template <class InputIterator>
3213e519524SHoward Hinnant        void insert(InputIterator first, InputIterator last);
3223e519524SHoward Hinnant    void insert(initializer_list<value_type> il);
3233e519524SHoward Hinnant
324b0386a51SErik Pilkington    node_type extract(const_iterator position);                                       // C++17
325b0386a51SErik Pilkington    node_type extract(const key_type& x);                                             // C++17
326b0386a51SErik Pilkington    iterator insert(node_type&& nh);                                                  // C++17
327b0386a51SErik Pilkington    iterator insert(const_iterator hint, node_type&& nh);                             // C++17
328b0386a51SErik Pilkington
3293e519524SHoward Hinnant    iterator  erase(const_iterator position);
330ec392968SMarshall Clow    iterator  erase(iterator position);  // C++14
3313e519524SHoward Hinnant    size_type erase(const key_type& k);
3323e519524SHoward Hinnant    iterator  erase(const_iterator first, const_iterator last);
3330e9f71c1SHoward Hinnant    void clear() noexcept;
3343e519524SHoward Hinnant
3355c4e07aeSErik Pilkington    template<class C2>
3365c4e07aeSErik Pilkington      void merge(multiset<Key, C2, Allocator>& source);    // C++17
3375c4e07aeSErik Pilkington    template<class C2>
3385c4e07aeSErik Pilkington      void merge(multiset<Key, C2, Allocator>&& source);   // C++17
3395c4e07aeSErik Pilkington    template<class C2>
3405c4e07aeSErik Pilkington      void merge(set<Key, C2, Allocator>& source);         // C++17
3415c4e07aeSErik Pilkington    template<class C2>
3425c4e07aeSErik Pilkington      void merge(set<Key, C2, Allocator>&& source);        // C++17
3435c4e07aeSErik Pilkington
3440e9f71c1SHoward Hinnant    void swap(multiset& s)
3450e9f71c1SHoward Hinnant        noexcept(
3460e9f71c1SHoward Hinnant            __is_nothrow_swappable<key_compare>::value &&
3470e9f71c1SHoward Hinnant            (!allocator_type::propagate_on_container_swap::value ||
3480e9f71c1SHoward Hinnant             __is_nothrow_swappable<allocator_type>::value));
3493e519524SHoward Hinnant
3503e519524SHoward Hinnant    // observers:
3510e9f71c1SHoward Hinnant    allocator_type get_allocator() const noexcept;
3523e519524SHoward Hinnant    key_compare    key_comp()      const;
3533e519524SHoward Hinnant    value_compare  value_comp()    const;
3543e519524SHoward Hinnant
3553e519524SHoward Hinnant    // set operations:
3563e519524SHoward Hinnant          iterator find(const key_type& k);
3573e519524SHoward Hinnant    const_iterator find(const key_type& k) const;
35825d3402cSMarshall Clow    template<typename K>
35925d3402cSMarshall Clow        iterator find(const K& x);
36025d3402cSMarshall Clow    template<typename K>
36125d3402cSMarshall Clow        const_iterator find(const K& x) const;  // C++14
3623fca07d7SMarek Kurdej
363a17b1aedSZoe Carver    template<typename K>
364a17b1aedSZoe Carver        size_type count(const K& x) const;      // C++14
3653e519524SHoward Hinnant    size_type      count(const key_type& k) const;
3663fca07d7SMarek Kurdej
367a17b1aedSZoe Carver    bool           contains(const key_type& x) const;  // C++20
3683fca07d7SMarek Kurdej    template<class K> bool contains(const K& x) const; // C++20
3693fca07d7SMarek Kurdej
3703e519524SHoward Hinnant          iterator lower_bound(const key_type& k);
3713e519524SHoward Hinnant    const_iterator lower_bound(const key_type& k) const;
37225d3402cSMarshall Clow    template<typename K>
37325d3402cSMarshall Clow        iterator lower_bound(const K& x);              // C++14
37425d3402cSMarshall Clow    template<typename K>
37525d3402cSMarshall Clow        const_iterator lower_bound(const K& x) const;  // C++14
37625d3402cSMarshall Clow
3773e519524SHoward Hinnant          iterator upper_bound(const key_type& k);
3783e519524SHoward Hinnant    const_iterator upper_bound(const key_type& k) const;
37925d3402cSMarshall Clow    template<typename K>
38025d3402cSMarshall Clow        iterator upper_bound(const K& x);              // C++14
38125d3402cSMarshall Clow    template<typename K>
38225d3402cSMarshall Clow        const_iterator upper_bound(const K& x) const;  // C++14
38325d3402cSMarshall Clow
3843e519524SHoward Hinnant    pair<iterator,iterator>             equal_range(const key_type& k);
3853e519524SHoward Hinnant    pair<const_iterator,const_iterator> equal_range(const key_type& k) const;
38625d3402cSMarshall Clow    template<typename K>
38725d3402cSMarshall Clow        pair<iterator,iterator>             equal_range(const K& x);        // C++14
38825d3402cSMarshall Clow    template<typename K>
38925d3402cSMarshall Clow        pair<const_iterator,const_iterator> equal_range(const K& x) const;  // C++14
3903e519524SHoward Hinnant};
3913e519524SHoward Hinnant
3923e519524SHoward Hinnanttemplate <class Key, class Compare, class Allocator>
3933e519524SHoward Hinnantbool
3943e519524SHoward Hinnantoperator==(const multiset<Key, Compare, Allocator>& x,
3953e519524SHoward Hinnant           const multiset<Key, Compare, Allocator>& y);
3963e519524SHoward Hinnant
3973e519524SHoward Hinnanttemplate <class Key, class Compare, class Allocator>
3983e519524SHoward Hinnantbool
3993e519524SHoward Hinnantoperator< (const multiset<Key, Compare, Allocator>& x,
4003e519524SHoward Hinnant           const multiset<Key, Compare, Allocator>& y);
4013e519524SHoward Hinnant
4023e519524SHoward Hinnanttemplate <class Key, class Compare, class Allocator>
4033e519524SHoward Hinnantbool
4043e519524SHoward Hinnantoperator!=(const multiset<Key, Compare, Allocator>& x,
4053e519524SHoward Hinnant           const multiset<Key, Compare, Allocator>& y);
4063e519524SHoward Hinnant
4073e519524SHoward Hinnanttemplate <class Key, class Compare, class Allocator>
4083e519524SHoward Hinnantbool
4093e519524SHoward Hinnantoperator> (const multiset<Key, Compare, Allocator>& x,
4103e519524SHoward Hinnant           const multiset<Key, Compare, Allocator>& y);
4113e519524SHoward Hinnant
4123e519524SHoward Hinnanttemplate <class Key, class Compare, class Allocator>
4133e519524SHoward Hinnantbool
4143e519524SHoward Hinnantoperator>=(const multiset<Key, Compare, Allocator>& x,
4153e519524SHoward Hinnant           const multiset<Key, Compare, Allocator>& y);
4163e519524SHoward Hinnant
4173e519524SHoward Hinnanttemplate <class Key, class Compare, class Allocator>
4183e519524SHoward Hinnantbool
4193e519524SHoward Hinnantoperator<=(const multiset<Key, Compare, Allocator>& x,
4203e519524SHoward Hinnant           const multiset<Key, Compare, Allocator>& y);
4213e519524SHoward Hinnant
4223e519524SHoward Hinnant// specialized algorithms:
4233e519524SHoward Hinnanttemplate <class Key, class Compare, class Allocator>
4243e519524SHoward Hinnantvoid
4250e9f71c1SHoward Hinnantswap(multiset<Key, Compare, Allocator>& x, multiset<Key, Compare, Allocator>& y)
4260e9f71c1SHoward Hinnant    noexcept(noexcept(x.swap(y)));
4273e519524SHoward Hinnant
428f60c63c0SMarshall Clowtemplate <class Key, class Compare, class Allocator, class Predicate>
4293e895085SMarek Kurdejtypename multiset<Key, Compare, Allocator>::size_type
4303e895085SMarek Kurdejerase_if(multiset<Key, Compare, Allocator>& c, Predicate pred);  // C++20
431f60c63c0SMarshall Clow
4323e519524SHoward Hinnant}  // std
4333e519524SHoward Hinnant
4343e519524SHoward Hinnant*/
4353e519524SHoward Hinnant
4363e519524SHoward Hinnant#include <__config>
43706b40e80SArthur O'Dwyer#include <__debug>
438050b064fSChristopher Di Bella#include <__functional/is_transparent.h>
439b0386a51SErik Pilkington#include <__node_handle>
44006b40e80SArthur O'Dwyer#include <__tree>
4416adbc83eSChristopher Di Bella#include <__utility/forward.h>
4422d0f1fa4SArthur O'Dwyer#include <compare>
4433e519524SHoward Hinnant#include <functional>
4442d0f1fa4SArthur O'Dwyer#include <initializer_list>
4452ac6babcSArthur O'Dwyer#include <iterator> // __libcpp_erase_if_container
446f56972e2SMarshall Clow#include <version>
4473e519524SHoward Hinnant
448073458b1SHoward Hinnant#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
4493e519524SHoward Hinnant#pragma GCC system_header
450073458b1SHoward Hinnant#endif
4513e519524SHoward Hinnant
4523e519524SHoward Hinnant_LIBCPP_BEGIN_NAMESPACE_STD
4533e519524SHoward Hinnant
4545c4e07aeSErik Pilkingtontemplate <class _Key, class _Compare, class _Allocator>
4555c4e07aeSErik Pilkingtonclass multiset;
4565c4e07aeSErik Pilkington
4573e519524SHoward Hinnanttemplate <class _Key, class _Compare = less<_Key>,
4583e519524SHoward Hinnant          class _Allocator = allocator<_Key> >
459e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS set
4603e519524SHoward Hinnant{
4613e519524SHoward Hinnantpublic:
4623e519524SHoward Hinnant    // types:
4633e519524SHoward Hinnant    typedef _Key                                     key_type;
4643e519524SHoward Hinnant    typedef key_type                                 value_type;
4653e519524SHoward Hinnant    typedef _Compare                                 key_compare;
4663e519524SHoward Hinnant    typedef key_compare                              value_compare;
46709fa1d0eSArthur O'Dwyer    typedef __identity_t<_Allocator>                 allocator_type;
4683e519524SHoward Hinnant    typedef value_type&                              reference;
4693e519524SHoward Hinnant    typedef const value_type&                        const_reference;
4703e519524SHoward Hinnant
47194f89aeeSMarshall Clow    static_assert((is_same<typename allocator_type::value_type, value_type>::value),
47294f89aeeSMarshall Clow                  "Allocator::value_type must be same type as value_type");
47394f89aeeSMarshall Clow
4743e519524SHoward Hinnantprivate:
4753e519524SHoward Hinnant    typedef __tree<value_type, value_compare, allocator_type> __base;
4763e519524SHoward Hinnant    typedef allocator_traits<allocator_type>                  __alloc_traits;
4773e519524SHoward Hinnant    typedef typename __base::__node_holder                    __node_holder;
4783e519524SHoward Hinnant
4793e519524SHoward Hinnant    __base __tree_;
4803e519524SHoward Hinnant
4813e519524SHoward Hinnantpublic:
4823e519524SHoward Hinnant    typedef typename __base::pointer               pointer;
4833e519524SHoward Hinnant    typedef typename __base::const_pointer         const_pointer;
4843e519524SHoward Hinnant    typedef typename __base::size_type             size_type;
4853e519524SHoward Hinnant    typedef typename __base::difference_type       difference_type;
4863e519524SHoward Hinnant    typedef typename __base::const_iterator        iterator;
4873e519524SHoward Hinnant    typedef typename __base::const_iterator        const_iterator;
488ce48a113SHoward Hinnant    typedef _VSTD::reverse_iterator<iterator>       reverse_iterator;
489ce48a113SHoward Hinnant    typedef _VSTD::reverse_iterator<const_iterator> const_reverse_iterator;
4903e519524SHoward Hinnant
491b0386a51SErik Pilkington#if _LIBCPP_STD_VER > 14
492b0386a51SErik Pilkington    typedef __set_node_handle<typename __base::__node, allocator_type> node_type;
493b0386a51SErik Pilkington    typedef __insert_return_type<iterator, node_type> insert_return_type;
494b0386a51SErik Pilkington#endif
495b0386a51SErik Pilkington
4965c4e07aeSErik Pilkington    template <class _Key2, class _Compare2, class _Alloc2>
4975c4e07aeSErik Pilkington        friend class _LIBCPP_TEMPLATE_VIS set;
4985c4e07aeSErik Pilkington    template <class _Key2, class _Compare2, class _Alloc2>
4995c4e07aeSErik Pilkington        friend class _LIBCPP_TEMPLATE_VIS multiset;
5005c4e07aeSErik Pilkington
50153ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
502415a24e4SMarshall Clow    set()
503415a24e4SMarshall Clow        _NOEXCEPT_(
504415a24e4SMarshall Clow            is_nothrow_default_constructible<allocator_type>::value &&
505415a24e4SMarshall Clow            is_nothrow_default_constructible<key_compare>::value &&
506415a24e4SMarshall Clow            is_nothrow_copy_constructible<key_compare>::value)
507415a24e4SMarshall Clow        : __tree_(value_compare()) {}
508415a24e4SMarshall Clow
509415a24e4SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
510415a24e4SMarshall Clow    explicit set(const value_compare& __comp)
5110e9f71c1SHoward Hinnant        _NOEXCEPT_(
5120e9f71c1SHoward Hinnant            is_nothrow_default_constructible<allocator_type>::value &&
5130e9f71c1SHoward Hinnant            is_nothrow_copy_constructible<key_compare>::value)
5143e519524SHoward Hinnant        : __tree_(__comp) {}
515415a24e4SMarshall Clow
51653ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
51778a87e8aSMarshall Clow    explicit set(const value_compare& __comp, const allocator_type& __a)
5183e519524SHoward Hinnant        : __tree_(__comp, __a) {}
5193e519524SHoward Hinnant    template <class _InputIterator>
52053ec0b4eSHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
5213e519524SHoward Hinnant        set(_InputIterator __f, _InputIterator __l,
5223e519524SHoward Hinnant            const value_compare& __comp = value_compare())
5233e519524SHoward Hinnant        : __tree_(__comp)
5243e519524SHoward Hinnant        {
5253e519524SHoward Hinnant            insert(__f, __l);
5263e519524SHoward Hinnant        }
5273e519524SHoward Hinnant
5283e519524SHoward Hinnant    template <class _InputIterator>
52953ec0b4eSHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
5303e519524SHoward Hinnant        set(_InputIterator __f, _InputIterator __l, const value_compare& __comp,
5313e519524SHoward Hinnant            const allocator_type& __a)
5323e519524SHoward Hinnant        : __tree_(__comp, __a)
5333e519524SHoward Hinnant        {
5343e519524SHoward Hinnant            insert(__f, __l);
5353e519524SHoward Hinnant        }
5363e519524SHoward Hinnant
5370a55d17bSMarshall Clow#if _LIBCPP_STD_VER > 11
5380a55d17bSMarshall Clow        template <class _InputIterator>
5390a55d17bSMarshall Clow        _LIBCPP_INLINE_VISIBILITY
5400a55d17bSMarshall Clow        set(_InputIterator __f, _InputIterator __l, const allocator_type& __a)
5410a55d17bSMarshall Clow            : set(__f, __l, key_compare(), __a) {}
5420a55d17bSMarshall Clow#endif
5430a55d17bSMarshall Clow
54453ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
5453e519524SHoward Hinnant    set(const set& __s)
5463e519524SHoward Hinnant        : __tree_(__s.__tree_)
5473e519524SHoward Hinnant        {
5483e519524SHoward Hinnant            insert(__s.begin(), __s.end());
5493e519524SHoward Hinnant        }
5503e519524SHoward Hinnant
5515a33687dSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
5525a33687dSHoward Hinnant    set& operator=(const set& __s)
5535a33687dSHoward Hinnant        {
5545a33687dSHoward Hinnant            __tree_ = __s.__tree_;
5555a33687dSHoward Hinnant            return *this;
5565a33687dSHoward Hinnant        }
5575a33687dSHoward Hinnant
558922940b6SEric Fiselier#ifndef _LIBCPP_CXX03_LANG
55953ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
5603e519524SHoward Hinnant    set(set&& __s)
5610e9f71c1SHoward Hinnant        _NOEXCEPT_(is_nothrow_move_constructible<__base>::value)
562ce48a113SHoward Hinnant        : __tree_(_VSTD::move(__s.__tree_)) {}
563922940b6SEric Fiselier#endif // _LIBCPP_CXX03_LANG
5643e519524SHoward Hinnant
56553ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
5663e519524SHoward Hinnant    explicit set(const allocator_type& __a)
5673e519524SHoward Hinnant        : __tree_(__a) {}
5683e519524SHoward Hinnant
56953ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
5703e519524SHoward Hinnant    set(const set& __s, const allocator_type& __a)
5713e519524SHoward Hinnant        : __tree_(__s.__tree_.value_comp(), __a)
5723e519524SHoward Hinnant        {
5733e519524SHoward Hinnant            insert(__s.begin(), __s.end());
5743e519524SHoward Hinnant        }
5753e519524SHoward Hinnant
576922940b6SEric Fiselier#ifndef _LIBCPP_CXX03_LANG
5773e519524SHoward Hinnant    set(set&& __s, const allocator_type& __a);
5783e519524SHoward Hinnant
57953ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
5803e519524SHoward Hinnant    set(initializer_list<value_type> __il, const value_compare& __comp = value_compare())
5813e519524SHoward Hinnant        : __tree_(__comp)
5823e519524SHoward Hinnant        {
5833e519524SHoward Hinnant            insert(__il.begin(), __il.end());
5843e519524SHoward Hinnant        }
5853e519524SHoward Hinnant
58653ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
5873e519524SHoward Hinnant    set(initializer_list<value_type> __il, const value_compare& __comp,
5883e519524SHoward Hinnant        const allocator_type& __a)
5893e519524SHoward Hinnant        : __tree_(__comp, __a)
5903e519524SHoward Hinnant        {
5913e519524SHoward Hinnant            insert(__il.begin(), __il.end());
5923e519524SHoward Hinnant        }
5933e519524SHoward Hinnant
5940a55d17bSMarshall Clow#if _LIBCPP_STD_VER > 11
5950a55d17bSMarshall Clow    _LIBCPP_INLINE_VISIBILITY
5960a55d17bSMarshall Clow    set(initializer_list<value_type> __il, const allocator_type& __a)
5970a55d17bSMarshall Clow        : set(__il, key_compare(), __a) {}
5980a55d17bSMarshall Clow#endif
5990a55d17bSMarshall Clow
60053ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
6013e519524SHoward Hinnant    set& operator=(initializer_list<value_type> __il)
6023e519524SHoward Hinnant        {
6033e519524SHoward Hinnant            __tree_.__assign_unique(__il.begin(), __il.end());
6043e519524SHoward Hinnant            return *this;
6053e519524SHoward Hinnant        }
6063e519524SHoward Hinnant
60753ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
6083e519524SHoward Hinnant    set& operator=(set&& __s)
6090e9f71c1SHoward Hinnant        _NOEXCEPT_(is_nothrow_move_assignable<__base>::value)
6103e519524SHoward Hinnant        {
611ce48a113SHoward Hinnant            __tree_ = _VSTD::move(__s.__tree_);
6123e519524SHoward Hinnant            return *this;
6133e519524SHoward Hinnant        }
614922940b6SEric Fiselier#endif // _LIBCPP_CXX03_LANG
6153e519524SHoward Hinnant
61653ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
6177c142fccSLouis Dionne    ~set() {
6187c142fccSLouis Dionne        static_assert(sizeof(__diagnose_non_const_comparator<_Key, _Compare>()), "");
6197c142fccSLouis Dionne    }
6207c142fccSLouis Dionne
6217c142fccSLouis Dionne    _LIBCPP_INLINE_VISIBILITY
6220e9f71c1SHoward Hinnant          iterator begin() _NOEXCEPT       {return __tree_.begin();}
62353ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
6240e9f71c1SHoward Hinnant    const_iterator begin() const _NOEXCEPT {return __tree_.begin();}
62553ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
6260e9f71c1SHoward Hinnant          iterator end() _NOEXCEPT         {return __tree_.end();}
62753ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
6280e9f71c1SHoward Hinnant    const_iterator end()   const _NOEXCEPT {return __tree_.end();}
6293e519524SHoward Hinnant
63053ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
6310e9f71c1SHoward Hinnant          reverse_iterator rbegin() _NOEXCEPT
6320e9f71c1SHoward Hinnant            {return reverse_iterator(end());}
63353ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
6340e9f71c1SHoward Hinnant    const_reverse_iterator rbegin() const _NOEXCEPT
6350e9f71c1SHoward Hinnant        {return const_reverse_iterator(end());}
63653ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
6370e9f71c1SHoward Hinnant          reverse_iterator rend() _NOEXCEPT
6380e9f71c1SHoward Hinnant            {return reverse_iterator(begin());}
63953ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
6400e9f71c1SHoward Hinnant    const_reverse_iterator rend() const _NOEXCEPT
6410e9f71c1SHoward Hinnant        {return const_reverse_iterator(begin());}
6423e519524SHoward Hinnant
64353ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
6440e9f71c1SHoward Hinnant    const_iterator cbegin()  const _NOEXCEPT {return begin();}
64553ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
6460e9f71c1SHoward Hinnant    const_iterator cend() const _NOEXCEPT {return end();}
64753ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
6480e9f71c1SHoward Hinnant    const_reverse_iterator crbegin() const _NOEXCEPT {return rbegin();}
64953ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
6500e9f71c1SHoward Hinnant    const_reverse_iterator crend() const _NOEXCEPT {return rend();}
6513e519524SHoward Hinnant
65272c8fad4SMarshall Clow    _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY
6530e9f71c1SHoward Hinnant    bool empty() const _NOEXCEPT {return __tree_.size() == 0;}
65453ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
6550e9f71c1SHoward Hinnant    size_type size() const _NOEXCEPT {return __tree_.size();}
65653ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
6570e9f71c1SHoward Hinnant    size_type max_size() const _NOEXCEPT {return __tree_.max_size();}
6583e519524SHoward Hinnant
6593e519524SHoward Hinnant    // modifiers:
660922940b6SEric Fiselier#ifndef _LIBCPP_CXX03_LANG
6613e519524SHoward Hinnant    template <class... _Args>
66253ec0b4eSHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
6633e519524SHoward Hinnant        pair<iterator, bool> emplace(_Args&&... __args)
664ce48a113SHoward Hinnant            {return __tree_.__emplace_unique(_VSTD::forward<_Args>(__args)...);}
6653e519524SHoward Hinnant    template <class... _Args>
66653ec0b4eSHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
6673e519524SHoward Hinnant        iterator emplace_hint(const_iterator __p, _Args&&... __args)
668ce48a113SHoward Hinnant            {return __tree_.__emplace_hint_unique(__p, _VSTD::forward<_Args>(__args)...);}
669922940b6SEric Fiselier#endif // _LIBCPP_CXX03_LANG
670922940b6SEric Fiselier
67153ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
6723e519524SHoward Hinnant    pair<iterator,bool> insert(const value_type& __v)
6733e519524SHoward Hinnant        {return __tree_.__insert_unique(__v);}
67453ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
6753e519524SHoward Hinnant    iterator insert(const_iterator __p, const value_type& __v)
6763e519524SHoward Hinnant        {return __tree_.__insert_unique(__p, __v);}
677922940b6SEric Fiselier
6783e519524SHoward Hinnant    template <class _InputIterator>
67953ec0b4eSHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
6803e519524SHoward Hinnant        void insert(_InputIterator __f, _InputIterator __l)
6813e519524SHoward Hinnant        {
6823e519524SHoward Hinnant            for (const_iterator __e = cend(); __f != __l; ++__f)
6833e519524SHoward Hinnant                __tree_.__insert_unique(__e, *__f);
6843e519524SHoward Hinnant        }
6853e519524SHoward Hinnant
686922940b6SEric Fiselier#ifndef _LIBCPP_CXX03_LANG
687922940b6SEric Fiselier    _LIBCPP_INLINE_VISIBILITY
688922940b6SEric Fiselier    pair<iterator,bool> insert(value_type&& __v)
689922940b6SEric Fiselier        {return __tree_.__insert_unique(_VSTD::move(__v));}
690922940b6SEric Fiselier
691922940b6SEric Fiselier    _LIBCPP_INLINE_VISIBILITY
692922940b6SEric Fiselier    iterator insert(const_iterator __p, value_type&& __v)
693922940b6SEric Fiselier        {return __tree_.__insert_unique(__p, _VSTD::move(__v));}
694922940b6SEric Fiselier
69553ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
6963e519524SHoward Hinnant    void insert(initializer_list<value_type> __il)
6973e519524SHoward Hinnant        {insert(__il.begin(), __il.end());}
698922940b6SEric Fiselier#endif // _LIBCPP_CXX03_LANG
6993e519524SHoward Hinnant
70053ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
7013e519524SHoward Hinnant    iterator  erase(const_iterator __p) {return __tree_.erase(__p);}
70253ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
7033e519524SHoward Hinnant    size_type erase(const key_type& __k)
7043e519524SHoward Hinnant        {return __tree_.__erase_unique(__k);}
70553ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
7063e519524SHoward Hinnant    iterator  erase(const_iterator __f, const_iterator __l)
7073e519524SHoward Hinnant        {return __tree_.erase(__f, __l);}
70853ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
7090e9f71c1SHoward Hinnant    void clear() _NOEXCEPT {__tree_.clear();}
7103e519524SHoward Hinnant
711b0386a51SErik Pilkington#if _LIBCPP_STD_VER > 14
712b0386a51SErik Pilkington    _LIBCPP_INLINE_VISIBILITY
713b0386a51SErik Pilkington    insert_return_type insert(node_type&& __nh)
714b0386a51SErik Pilkington    {
715b0386a51SErik Pilkington        _LIBCPP_ASSERT(__nh.empty() || __nh.get_allocator() == get_allocator(),
716b0386a51SErik Pilkington            "node_type with incompatible allocator passed to set::insert()");
717b0386a51SErik Pilkington        return __tree_.template __node_handle_insert_unique<
718b0386a51SErik Pilkington            node_type, insert_return_type>(_VSTD::move(__nh));
719b0386a51SErik Pilkington    }
720b0386a51SErik Pilkington    _LIBCPP_INLINE_VISIBILITY
721b0386a51SErik Pilkington    iterator insert(const_iterator __hint, node_type&& __nh)
722b0386a51SErik Pilkington    {
723b0386a51SErik Pilkington        _LIBCPP_ASSERT(__nh.empty() || __nh.get_allocator() == get_allocator(),
724b0386a51SErik Pilkington            "node_type with incompatible allocator passed to set::insert()");
725b0386a51SErik Pilkington        return __tree_.template __node_handle_insert_unique<node_type>(
726b0386a51SErik Pilkington            __hint, _VSTD::move(__nh));
727b0386a51SErik Pilkington    }
728b0386a51SErik Pilkington    _LIBCPP_INLINE_VISIBILITY
729b0386a51SErik Pilkington    node_type extract(key_type const& __key)
730b0386a51SErik Pilkington    {
731b0386a51SErik Pilkington        return __tree_.template __node_handle_extract<node_type>(__key);
732b0386a51SErik Pilkington    }
733b0386a51SErik Pilkington    _LIBCPP_INLINE_VISIBILITY
734b0386a51SErik Pilkington    node_type extract(const_iterator __it)
735b0386a51SErik Pilkington    {
736b0386a51SErik Pilkington        return __tree_.template __node_handle_extract<node_type>(__it);
737b0386a51SErik Pilkington    }
7388df1d5a5SLouis Dionne    template <class _Compare2>
7395c4e07aeSErik Pilkington    _LIBCPP_INLINE_VISIBILITY
7408df1d5a5SLouis Dionne    void merge(set<key_type, _Compare2, allocator_type>& __source)
7415c4e07aeSErik Pilkington    {
7425c4e07aeSErik Pilkington        _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
7435c4e07aeSErik Pilkington                       "merging container with incompatible allocator");
7445c4e07aeSErik Pilkington        __tree_.__node_handle_merge_unique(__source.__tree_);
7455c4e07aeSErik Pilkington    }
7468df1d5a5SLouis Dionne    template <class _Compare2>
7475c4e07aeSErik Pilkington    _LIBCPP_INLINE_VISIBILITY
7488df1d5a5SLouis Dionne    void merge(set<key_type, _Compare2, allocator_type>&& __source)
7495c4e07aeSErik Pilkington    {
7505c4e07aeSErik Pilkington        _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
7515c4e07aeSErik Pilkington                       "merging container with incompatible allocator");
7525c4e07aeSErik Pilkington        __tree_.__node_handle_merge_unique(__source.__tree_);
7535c4e07aeSErik Pilkington    }
7548df1d5a5SLouis Dionne    template <class _Compare2>
7555c4e07aeSErik Pilkington    _LIBCPP_INLINE_VISIBILITY
7568df1d5a5SLouis Dionne    void merge(multiset<key_type, _Compare2, allocator_type>& __source)
7575c4e07aeSErik Pilkington    {
7585c4e07aeSErik Pilkington        _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
7595c4e07aeSErik Pilkington                       "merging container with incompatible allocator");
7605c4e07aeSErik Pilkington        __tree_.__node_handle_merge_unique(__source.__tree_);
7615c4e07aeSErik Pilkington    }
7628df1d5a5SLouis Dionne    template <class _Compare2>
7635c4e07aeSErik Pilkington    _LIBCPP_INLINE_VISIBILITY
7648df1d5a5SLouis Dionne    void merge(multiset<key_type, _Compare2, allocator_type>&& __source)
7655c4e07aeSErik Pilkington    {
7665c4e07aeSErik Pilkington        _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
7675c4e07aeSErik Pilkington                       "merging container with incompatible allocator");
7685c4e07aeSErik Pilkington        __tree_.__node_handle_merge_unique(__source.__tree_);
7695c4e07aeSErik Pilkington    }
770b0386a51SErik Pilkington#endif
771b0386a51SErik Pilkington
77253ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
7730e9f71c1SHoward Hinnant    void swap(set& __s) _NOEXCEPT_(__is_nothrow_swappable<__base>::value)
7740e9f71c1SHoward Hinnant        {__tree_.swap(__s.__tree_);}
7753e519524SHoward Hinnant
77653ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
7770e9f71c1SHoward Hinnant    allocator_type get_allocator() const _NOEXCEPT {return __tree_.__alloc();}
77853ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
7793e519524SHoward Hinnant    key_compare    key_comp()      const {return __tree_.value_comp();}
78053ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
7813e519524SHoward Hinnant    value_compare  value_comp()    const {return __tree_.value_comp();}
7823e519524SHoward Hinnant
7833e519524SHoward Hinnant    // set operations:
78453ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
7853e519524SHoward Hinnant    iterator find(const key_type& __k)             {return __tree_.find(__k);}
78653ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
7873e519524SHoward Hinnant    const_iterator find(const key_type& __k) const {return __tree_.find(__k);}
78825d3402cSMarshall Clow#if _LIBCPP_STD_VER > 11
78925d3402cSMarshall Clow    template <typename _K2>
79025d3402cSMarshall Clow    _LIBCPP_INLINE_VISIBILITY
79125d3402cSMarshall Clow    typename enable_if<__is_transparent<_Compare, _K2>::value,iterator>::type
79225d3402cSMarshall Clow    find(const _K2& __k)                           {return __tree_.find(__k);}
79325d3402cSMarshall Clow    template <typename _K2>
79425d3402cSMarshall Clow    _LIBCPP_INLINE_VISIBILITY
79525d3402cSMarshall Clow    typename enable_if<__is_transparent<_Compare, _K2>::value,const_iterator>::type
79625d3402cSMarshall Clow    find(const _K2& __k) const                     {return __tree_.find(__k);}
79725d3402cSMarshall Clow#endif
79825d3402cSMarshall Clow
79953ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
8003e519524SHoward Hinnant    size_type      count(const key_type& __k) const
8013e519524SHoward Hinnant        {return __tree_.__count_unique(__k);}
8020aacbc92SMarshall Clow#if _LIBCPP_STD_VER > 11
8030aacbc92SMarshall Clow    template <typename _K2>
8040aacbc92SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
8050aacbc92SMarshall Clow    typename enable_if<__is_transparent<_Compare, _K2>::value,size_type>::type
8069bfdb770SEric Fiselier    count(const _K2& __k) const                    {return __tree_.__count_multi(__k);}
8070aacbc92SMarshall Clow#endif
808a17b1aedSZoe Carver
809a17b1aedSZoe Carver#if _LIBCPP_STD_VER > 17
810a17b1aedSZoe Carver    _LIBCPP_INLINE_VISIBILITY
811a17b1aedSZoe Carver    bool contains(const key_type& __k) const {return find(__k) != end();}
8123fca07d7SMarek Kurdej    template <typename _K2>
8133fca07d7SMarek Kurdej    _LIBCPP_INLINE_VISIBILITY
8143fca07d7SMarek Kurdej    typename enable_if<__is_transparent<_Compare, _K2>::value, bool>::type
8153fca07d7SMarek Kurdej    contains(const _K2& __k) const { return find(__k) != end(); }
816a17b1aedSZoe Carver#endif // _LIBCPP_STD_VER > 17
817a17b1aedSZoe Carver
81853ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
8193e519524SHoward Hinnant    iterator lower_bound(const key_type& __k)
8203e519524SHoward Hinnant        {return __tree_.lower_bound(__k);}
82153ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
8223e519524SHoward Hinnant    const_iterator lower_bound(const key_type& __k) const
8233e519524SHoward Hinnant        {return __tree_.lower_bound(__k);}
82425d3402cSMarshall Clow#if _LIBCPP_STD_VER > 11
82525d3402cSMarshall Clow    template <typename _K2>
82625d3402cSMarshall Clow    _LIBCPP_INLINE_VISIBILITY
82725d3402cSMarshall Clow    typename enable_if<__is_transparent<_Compare, _K2>::value,iterator>::type
82825d3402cSMarshall Clow    lower_bound(const _K2& __k)       {return __tree_.lower_bound(__k);}
82925d3402cSMarshall Clow
83025d3402cSMarshall Clow    template <typename _K2>
83125d3402cSMarshall Clow    _LIBCPP_INLINE_VISIBILITY
83225d3402cSMarshall Clow    typename enable_if<__is_transparent<_Compare, _K2>::value,const_iterator>::type
83325d3402cSMarshall Clow    lower_bound(const _K2& __k) const {return __tree_.lower_bound(__k);}
83425d3402cSMarshall Clow#endif
83525d3402cSMarshall Clow
83653ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
8373e519524SHoward Hinnant    iterator upper_bound(const key_type& __k)
8383e519524SHoward Hinnant        {return __tree_.upper_bound(__k);}
83953ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
8403e519524SHoward Hinnant    const_iterator upper_bound(const key_type& __k) const
8413e519524SHoward Hinnant        {return __tree_.upper_bound(__k);}
84225d3402cSMarshall Clow#if _LIBCPP_STD_VER > 11
84325d3402cSMarshall Clow    template <typename _K2>
84425d3402cSMarshall Clow    _LIBCPP_INLINE_VISIBILITY
84525d3402cSMarshall Clow    typename enable_if<__is_transparent<_Compare, _K2>::value,iterator>::type
84625d3402cSMarshall Clow    upper_bound(const _K2& __k)       {return __tree_.upper_bound(__k);}
84725d3402cSMarshall Clow    template <typename _K2>
84825d3402cSMarshall Clow    _LIBCPP_INLINE_VISIBILITY
84925d3402cSMarshall Clow    typename enable_if<__is_transparent<_Compare, _K2>::value,const_iterator>::type
85025d3402cSMarshall Clow    upper_bound(const _K2& __k) const {return __tree_.upper_bound(__k);}
85125d3402cSMarshall Clow#endif
85225d3402cSMarshall Clow
85353ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
8543e519524SHoward Hinnant    pair<iterator,iterator> equal_range(const key_type& __k)
8553e519524SHoward Hinnant        {return __tree_.__equal_range_unique(__k);}
85653ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
8573e519524SHoward Hinnant    pair<const_iterator,const_iterator> equal_range(const key_type& __k) const
8583e519524SHoward Hinnant        {return __tree_.__equal_range_unique(__k);}
85925d3402cSMarshall Clow#if _LIBCPP_STD_VER > 11
86025d3402cSMarshall Clow    template <typename _K2>
86125d3402cSMarshall Clow    _LIBCPP_INLINE_VISIBILITY
86225d3402cSMarshall Clow    typename enable_if<__is_transparent<_Compare, _K2>::value,pair<iterator,iterator>>::type
8639bfdb770SEric Fiselier    equal_range(const _K2& __k)       {return __tree_.__equal_range_multi(__k);}
86425d3402cSMarshall Clow    template <typename _K2>
86525d3402cSMarshall Clow    _LIBCPP_INLINE_VISIBILITY
86625d3402cSMarshall Clow    typename enable_if<__is_transparent<_Compare, _K2>::value,pair<const_iterator,const_iterator>>::type
8679bfdb770SEric Fiselier    equal_range(const _K2& __k) const {return __tree_.__equal_range_multi(__k);}
86825d3402cSMarshall Clow#endif
8693e519524SHoward Hinnant};
8703e519524SHoward Hinnant
87101666904SLouis Dionne#if _LIBCPP_STD_VER >= 17
872e20865c3SLouis Dionnetemplate<class _InputIterator,
873199d2ebeSArthur O'Dwyer         class _Compare = less<__iter_value_type<_InputIterator>>,
874199d2ebeSArthur O'Dwyer         class _Allocator = allocator<__iter_value_type<_InputIterator>>,
875*4e0ea2cfSLouis Dionne         class = enable_if_t<__is_allocator<_Allocator>::value, void>,
876*4e0ea2cfSLouis Dionne         class = enable_if_t<!__is_allocator<_Compare>::value, void>>
877e20865c3SLouis Dionneset(_InputIterator, _InputIterator, _Compare = _Compare(), _Allocator = _Allocator())
878199d2ebeSArthur O'Dwyer  -> set<__iter_value_type<_InputIterator>, _Compare, _Allocator>;
879e20865c3SLouis Dionne
880e20865c3SLouis Dionnetemplate<class _Key, class _Compare = less<_Key>,
881e20865c3SLouis Dionne         class _Allocator = allocator<_Key>,
882*4e0ea2cfSLouis Dionne         class = enable_if_t<__is_allocator<_Allocator>::value, void>,
883*4e0ea2cfSLouis Dionne         class = enable_if_t<!__is_allocator<_Compare>::value, void>>
884e20865c3SLouis Dionneset(initializer_list<_Key>, _Compare = _Compare(), _Allocator = _Allocator())
885e20865c3SLouis Dionne  -> set<_Key, _Compare, _Allocator>;
886e20865c3SLouis Dionne
887e20865c3SLouis Dionnetemplate<class _InputIterator, class _Allocator,
888*4e0ea2cfSLouis Dionne         class = enable_if_t<__is_allocator<_Allocator>::value, void>>
889e20865c3SLouis Dionneset(_InputIterator, _InputIterator, _Allocator)
890199d2ebeSArthur O'Dwyer  -> set<__iter_value_type<_InputIterator>,
891199d2ebeSArthur O'Dwyer         less<__iter_value_type<_InputIterator>>, _Allocator>;
892e20865c3SLouis Dionne
893e20865c3SLouis Dionnetemplate<class _Key, class _Allocator,
894*4e0ea2cfSLouis Dionne         class = enable_if_t<__is_allocator<_Allocator>::value, void>>
895e20865c3SLouis Dionneset(initializer_list<_Key>, _Allocator)
896e20865c3SLouis Dionne  -> set<_Key, less<_Key>, _Allocator>;
897e20865c3SLouis Dionne#endif
898e20865c3SLouis Dionne
899922940b6SEric Fiselier#ifndef _LIBCPP_CXX03_LANG
9003e519524SHoward Hinnant
9013e519524SHoward Hinnanttemplate <class _Key, class _Compare, class _Allocator>
9023e519524SHoward Hinnantset<_Key, _Compare, _Allocator>::set(set&& __s, const allocator_type& __a)
903ce48a113SHoward Hinnant    : __tree_(_VSTD::move(__s.__tree_), __a)
9043e519524SHoward Hinnant{
9053e519524SHoward Hinnant    if (__a != __s.get_allocator())
9063e519524SHoward Hinnant    {
9073e519524SHoward Hinnant        const_iterator __e = cend();
9083e519524SHoward Hinnant        while (!__s.empty())
909ce48a113SHoward Hinnant            insert(__e, _VSTD::move(__s.__tree_.remove(__s.begin())->__value_));
9103e519524SHoward Hinnant    }
9113e519524SHoward Hinnant}
9123e519524SHoward Hinnant
913922940b6SEric Fiselier#endif // _LIBCPP_CXX03_LANG
9143e519524SHoward Hinnant
9153e519524SHoward Hinnanttemplate <class _Key, class _Compare, class _Allocator>
91653ec0b4eSHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
9173e519524SHoward Hinnantbool
9183e519524SHoward Hinnantoperator==(const set<_Key, _Compare, _Allocator>& __x,
9193e519524SHoward Hinnant           const set<_Key, _Compare, _Allocator>& __y)
9203e519524SHoward Hinnant{
921ce48a113SHoward Hinnant    return __x.size() == __y.size() && _VSTD::equal(__x.begin(), __x.end(), __y.begin());
9223e519524SHoward Hinnant}
9233e519524SHoward Hinnant
9243e519524SHoward Hinnanttemplate <class _Key, class _Compare, class _Allocator>
92553ec0b4eSHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
9263e519524SHoward Hinnantbool
9273e519524SHoward Hinnantoperator< (const set<_Key, _Compare, _Allocator>& __x,
9283e519524SHoward Hinnant           const set<_Key, _Compare, _Allocator>& __y)
9293e519524SHoward Hinnant{
930ce48a113SHoward Hinnant    return _VSTD::lexicographical_compare(__x.begin(), __x.end(), __y.begin(), __y.end());
9313e519524SHoward Hinnant}
9323e519524SHoward Hinnant
9333e519524SHoward Hinnanttemplate <class _Key, class _Compare, class _Allocator>
93453ec0b4eSHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
9353e519524SHoward Hinnantbool
9363e519524SHoward Hinnantoperator!=(const set<_Key, _Compare, _Allocator>& __x,
9373e519524SHoward Hinnant           const set<_Key, _Compare, _Allocator>& __y)
9383e519524SHoward Hinnant{
9393e519524SHoward Hinnant    return !(__x == __y);
9403e519524SHoward Hinnant}
9413e519524SHoward Hinnant
9423e519524SHoward Hinnanttemplate <class _Key, class _Compare, class _Allocator>
94353ec0b4eSHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
9443e519524SHoward Hinnantbool
9453e519524SHoward Hinnantoperator> (const set<_Key, _Compare, _Allocator>& __x,
9463e519524SHoward Hinnant           const set<_Key, _Compare, _Allocator>& __y)
9473e519524SHoward Hinnant{
9483e519524SHoward Hinnant    return __y < __x;
9493e519524SHoward Hinnant}
9503e519524SHoward Hinnant
9513e519524SHoward Hinnanttemplate <class _Key, class _Compare, class _Allocator>
95253ec0b4eSHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
9533e519524SHoward Hinnantbool
9543e519524SHoward Hinnantoperator>=(const set<_Key, _Compare, _Allocator>& __x,
9553e519524SHoward Hinnant           const set<_Key, _Compare, _Allocator>& __y)
9563e519524SHoward Hinnant{
9573e519524SHoward Hinnant    return !(__x < __y);
9583e519524SHoward Hinnant}
9593e519524SHoward Hinnant
9603e519524SHoward Hinnanttemplate <class _Key, class _Compare, class _Allocator>
96153ec0b4eSHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
9623e519524SHoward Hinnantbool
9633e519524SHoward Hinnantoperator<=(const set<_Key, _Compare, _Allocator>& __x,
9643e519524SHoward Hinnant           const set<_Key, _Compare, _Allocator>& __y)
9653e519524SHoward Hinnant{
9663e519524SHoward Hinnant    return !(__y < __x);
9673e519524SHoward Hinnant}
9683e519524SHoward Hinnant
9693e519524SHoward Hinnant// specialized algorithms:
9703e519524SHoward Hinnanttemplate <class _Key, class _Compare, class _Allocator>
97153ec0b4eSHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
9723e519524SHoward Hinnantvoid
9733e519524SHoward Hinnantswap(set<_Key, _Compare, _Allocator>& __x,
9743e519524SHoward Hinnant     set<_Key, _Compare, _Allocator>& __y)
9750e9f71c1SHoward Hinnant    _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
9763e519524SHoward Hinnant{
9773e519524SHoward Hinnant    __x.swap(__y);
9783e519524SHoward Hinnant}
9793e519524SHoward Hinnant
980f60c63c0SMarshall Clow#if _LIBCPP_STD_VER > 17
981f60c63c0SMarshall Clowtemplate <class _Key, class _Compare, class _Allocator, class _Predicate>
982f60c63c0SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY
9833e895085SMarek Kurdej    typename set<_Key, _Compare, _Allocator>::size_type
9843e895085SMarek Kurdej    erase_if(set<_Key, _Compare, _Allocator>& __c, _Predicate __pred) {
9852ac6babcSArthur O'Dwyer  return _VSTD::__libcpp_erase_if_container(__c, __pred);
9863e895085SMarek Kurdej}
987f60c63c0SMarshall Clow#endif
988f60c63c0SMarshall Clow
9893e519524SHoward Hinnanttemplate <class _Key, class _Compare = less<_Key>,
9903e519524SHoward Hinnant          class _Allocator = allocator<_Key> >
991e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS multiset
9923e519524SHoward Hinnant{
9933e519524SHoward Hinnantpublic:
9943e519524SHoward Hinnant    // types:
9953e519524SHoward Hinnant    typedef _Key                                     key_type;
9963e519524SHoward Hinnant    typedef key_type                                 value_type;
9973e519524SHoward Hinnant    typedef _Compare                                 key_compare;
9983e519524SHoward Hinnant    typedef key_compare                              value_compare;
99909fa1d0eSArthur O'Dwyer    typedef __identity_t<_Allocator>                 allocator_type;
10003e519524SHoward Hinnant    typedef value_type&                              reference;
10013e519524SHoward Hinnant    typedef const value_type&                        const_reference;
10023e519524SHoward Hinnant
100394f89aeeSMarshall Clow    static_assert((is_same<typename allocator_type::value_type, value_type>::value),
100494f89aeeSMarshall Clow                  "Allocator::value_type must be same type as value_type");
100594f89aeeSMarshall Clow
10063e519524SHoward Hinnantprivate:
10073e519524SHoward Hinnant    typedef __tree<value_type, value_compare, allocator_type> __base;
10083e519524SHoward Hinnant    typedef allocator_traits<allocator_type>                  __alloc_traits;
10093e519524SHoward Hinnant    typedef typename __base::__node_holder                    __node_holder;
10103e519524SHoward Hinnant
10113e519524SHoward Hinnant    __base __tree_;
10123e519524SHoward Hinnant
10133e519524SHoward Hinnantpublic:
10143e519524SHoward Hinnant    typedef typename __base::pointer               pointer;
10153e519524SHoward Hinnant    typedef typename __base::const_pointer         const_pointer;
10163e519524SHoward Hinnant    typedef typename __base::size_type             size_type;
10173e519524SHoward Hinnant    typedef typename __base::difference_type       difference_type;
10183e519524SHoward Hinnant    typedef typename __base::const_iterator        iterator;
10193e519524SHoward Hinnant    typedef typename __base::const_iterator        const_iterator;
1020ce48a113SHoward Hinnant    typedef _VSTD::reverse_iterator<iterator>       reverse_iterator;
1021ce48a113SHoward Hinnant    typedef _VSTD::reverse_iterator<const_iterator> const_reverse_iterator;
10223e519524SHoward Hinnant
1023b0386a51SErik Pilkington#if _LIBCPP_STD_VER > 14
1024b0386a51SErik Pilkington    typedef __set_node_handle<typename __base::__node, allocator_type> node_type;
1025b0386a51SErik Pilkington#endif
1026b0386a51SErik Pilkington
10275c4e07aeSErik Pilkington    template <class _Key2, class _Compare2, class _Alloc2>
10285c4e07aeSErik Pilkington        friend class _LIBCPP_TEMPLATE_VIS set;
10295c4e07aeSErik Pilkington    template <class _Key2, class _Compare2, class _Alloc2>
10305c4e07aeSErik Pilkington        friend class _LIBCPP_TEMPLATE_VIS multiset;
10315c4e07aeSErik Pilkington
10323e519524SHoward Hinnant    // construct/copy/destroy:
103353ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
1034415a24e4SMarshall Clow    multiset()
1035415a24e4SMarshall Clow        _NOEXCEPT_(
1036415a24e4SMarshall Clow            is_nothrow_default_constructible<allocator_type>::value &&
1037415a24e4SMarshall Clow            is_nothrow_default_constructible<key_compare>::value &&
1038415a24e4SMarshall Clow            is_nothrow_copy_constructible<key_compare>::value)
1039415a24e4SMarshall Clow        : __tree_(value_compare()) {}
1040415a24e4SMarshall Clow
1041415a24e4SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
1042415a24e4SMarshall Clow    explicit multiset(const value_compare& __comp)
10430e9f71c1SHoward Hinnant        _NOEXCEPT_(
10440e9f71c1SHoward Hinnant            is_nothrow_default_constructible<allocator_type>::value &&
10450e9f71c1SHoward Hinnant            is_nothrow_copy_constructible<key_compare>::value)
10463e519524SHoward Hinnant        : __tree_(__comp) {}
1047415a24e4SMarshall Clow
104853ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
104978a87e8aSMarshall Clow    explicit multiset(const value_compare& __comp, const allocator_type& __a)
10503e519524SHoward Hinnant        : __tree_(__comp, __a) {}
10513e519524SHoward Hinnant    template <class _InputIterator>
105253ec0b4eSHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
10533e519524SHoward Hinnant        multiset(_InputIterator __f, _InputIterator __l,
10543e519524SHoward Hinnant                 const value_compare& __comp = value_compare())
10553e519524SHoward Hinnant        : __tree_(__comp)
10563e519524SHoward Hinnant        {
10573e519524SHoward Hinnant            insert(__f, __l);
10583e519524SHoward Hinnant        }
10593e519524SHoward Hinnant
10600a55d17bSMarshall Clow#if _LIBCPP_STD_VER > 11
10610a55d17bSMarshall Clow        template <class _InputIterator>
10620a55d17bSMarshall Clow        _LIBCPP_INLINE_VISIBILITY
10630a55d17bSMarshall Clow        multiset(_InputIterator __f, _InputIterator __l, const allocator_type& __a)
10640a55d17bSMarshall Clow            : multiset(__f, __l, key_compare(), __a) {}
10650a55d17bSMarshall Clow#endif
10660a55d17bSMarshall Clow
10673e519524SHoward Hinnant    template <class _InputIterator>
106853ec0b4eSHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
10693e519524SHoward Hinnant        multiset(_InputIterator __f, _InputIterator __l,
10703e519524SHoward Hinnant                 const value_compare& __comp, const allocator_type& __a)
10713e519524SHoward Hinnant        : __tree_(__comp, __a)
10723e519524SHoward Hinnant        {
10733e519524SHoward Hinnant            insert(__f, __l);
10743e519524SHoward Hinnant        }
10753e519524SHoward Hinnant
107653ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
10773e519524SHoward Hinnant    multiset(const multiset& __s)
10783e519524SHoward Hinnant        : __tree_(__s.__tree_.value_comp(),
10793e519524SHoward Hinnant          __alloc_traits::select_on_container_copy_construction(__s.__tree_.__alloc()))
10803e519524SHoward Hinnant        {
10813e519524SHoward Hinnant            insert(__s.begin(), __s.end());
10823e519524SHoward Hinnant        }
10833e519524SHoward Hinnant
10845a33687dSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
10855a33687dSHoward Hinnant    multiset& operator=(const multiset& __s)
10865a33687dSHoward Hinnant        {
10875a33687dSHoward Hinnant            __tree_ = __s.__tree_;
10885a33687dSHoward Hinnant            return *this;
10895a33687dSHoward Hinnant        }
10905a33687dSHoward Hinnant
1091922940b6SEric Fiselier#ifndef _LIBCPP_CXX03_LANG
109253ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
10933e519524SHoward Hinnant    multiset(multiset&& __s)
10940e9f71c1SHoward Hinnant        _NOEXCEPT_(is_nothrow_move_constructible<__base>::value)
1095ce48a113SHoward Hinnant        : __tree_(_VSTD::move(__s.__tree_)) {}
1096922940b6SEric Fiselier
1097922940b6SEric Fiselier    multiset(multiset&& __s, const allocator_type& __a);
1098922940b6SEric Fiselier#endif // _LIBCPP_CXX03_LANG
109953ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11003e519524SHoward Hinnant    explicit multiset(const allocator_type& __a)
11013e519524SHoward Hinnant        : __tree_(__a) {}
110253ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11033e519524SHoward Hinnant    multiset(const multiset& __s, const allocator_type& __a)
11043e519524SHoward Hinnant        : __tree_(__s.__tree_.value_comp(), __a)
11053e519524SHoward Hinnant        {
11063e519524SHoward Hinnant            insert(__s.begin(), __s.end());
11073e519524SHoward Hinnant        }
11083e519524SHoward Hinnant
1109922940b6SEric Fiselier#ifndef _LIBCPP_CXX03_LANG
111053ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11113e519524SHoward Hinnant    multiset(initializer_list<value_type> __il, const value_compare& __comp = value_compare())
11123e519524SHoward Hinnant        : __tree_(__comp)
11133e519524SHoward Hinnant        {
11143e519524SHoward Hinnant            insert(__il.begin(), __il.end());
11153e519524SHoward Hinnant        }
11163e519524SHoward Hinnant
111753ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11183e519524SHoward Hinnant    multiset(initializer_list<value_type> __il, const value_compare& __comp,
11193e519524SHoward Hinnant        const allocator_type& __a)
11203e519524SHoward Hinnant        : __tree_(__comp, __a)
11213e519524SHoward Hinnant        {
11223e519524SHoward Hinnant            insert(__il.begin(), __il.end());
11233e519524SHoward Hinnant        }
11243e519524SHoward Hinnant
11250a55d17bSMarshall Clow#if _LIBCPP_STD_VER > 11
11260a55d17bSMarshall Clow    _LIBCPP_INLINE_VISIBILITY
11270a55d17bSMarshall Clow    multiset(initializer_list<value_type> __il, const allocator_type& __a)
11280a55d17bSMarshall Clow        : multiset(__il, key_compare(), __a) {}
11290a55d17bSMarshall Clow#endif
11300a55d17bSMarshall Clow
113153ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11323e519524SHoward Hinnant    multiset& operator=(initializer_list<value_type> __il)
11333e519524SHoward Hinnant        {
11343e519524SHoward Hinnant            __tree_.__assign_multi(__il.begin(), __il.end());
11353e519524SHoward Hinnant            return *this;
11363e519524SHoward Hinnant        }
11373e519524SHoward Hinnant
113853ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11393e519524SHoward Hinnant    multiset& operator=(multiset&& __s)
11400e9f71c1SHoward Hinnant        _NOEXCEPT_(is_nothrow_move_assignable<__base>::value)
11413e519524SHoward Hinnant        {
1142ce48a113SHoward Hinnant            __tree_ = _VSTD::move(__s.__tree_);
11433e519524SHoward Hinnant            return *this;
11443e519524SHoward Hinnant        }
1145922940b6SEric Fiselier#endif // _LIBCPP_CXX03_LANG
11463e519524SHoward Hinnant
114753ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11487c142fccSLouis Dionne    ~multiset() {
11497c142fccSLouis Dionne        static_assert(sizeof(__diagnose_non_const_comparator<_Key, _Compare>()), "");
11507c142fccSLouis Dionne    }
11517c142fccSLouis Dionne
11527c142fccSLouis Dionne    _LIBCPP_INLINE_VISIBILITY
11530e9f71c1SHoward Hinnant          iterator begin() _NOEXCEPT       {return __tree_.begin();}
115453ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11550e9f71c1SHoward Hinnant    const_iterator begin() const _NOEXCEPT {return __tree_.begin();}
115653ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11570e9f71c1SHoward Hinnant          iterator end() _NOEXCEPT         {return __tree_.end();}
115853ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11590e9f71c1SHoward Hinnant    const_iterator end()   const _NOEXCEPT {return __tree_.end();}
11603e519524SHoward Hinnant
116153ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11620e9f71c1SHoward Hinnant          reverse_iterator rbegin() _NOEXCEPT
11630e9f71c1SHoward Hinnant            {return reverse_iterator(end());}
116453ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11650e9f71c1SHoward Hinnant    const_reverse_iterator rbegin() const _NOEXCEPT
11660e9f71c1SHoward Hinnant        {return const_reverse_iterator(end());}
116753ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11680e9f71c1SHoward Hinnant          reverse_iterator rend() _NOEXCEPT
11690e9f71c1SHoward Hinnant            {return       reverse_iterator(begin());}
117053ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11710e9f71c1SHoward Hinnant    const_reverse_iterator rend() const _NOEXCEPT
11720e9f71c1SHoward Hinnant        {return const_reverse_iterator(begin());}
11733e519524SHoward Hinnant
117453ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11750e9f71c1SHoward Hinnant    const_iterator cbegin()  const _NOEXCEPT {return begin();}
117653ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11770e9f71c1SHoward Hinnant    const_iterator cend() const _NOEXCEPT {return end();}
117853ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11790e9f71c1SHoward Hinnant    const_reverse_iterator crbegin() const _NOEXCEPT {return rbegin();}
118053ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11810e9f71c1SHoward Hinnant    const_reverse_iterator crend() const _NOEXCEPT {return rend();}
11823e519524SHoward Hinnant
118372c8fad4SMarshall Clow    _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY
11840e9f71c1SHoward Hinnant    bool empty() const _NOEXCEPT {return __tree_.size() == 0;}
118553ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11860e9f71c1SHoward Hinnant    size_type size() const _NOEXCEPT {return __tree_.size();}
118753ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11880e9f71c1SHoward Hinnant    size_type max_size() const _NOEXCEPT {return __tree_.max_size();}
11893e519524SHoward Hinnant
11903e519524SHoward Hinnant    // modifiers:
1191922940b6SEric Fiselier#ifndef _LIBCPP_CXX03_LANG
11923e519524SHoward Hinnant    template <class... _Args>
119353ec0b4eSHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
11943e519524SHoward Hinnant        iterator emplace(_Args&&... __args)
1195ce48a113SHoward Hinnant            {return __tree_.__emplace_multi(_VSTD::forward<_Args>(__args)...);}
11963e519524SHoward Hinnant    template <class... _Args>
119753ec0b4eSHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
11983e519524SHoward Hinnant        iterator emplace_hint(const_iterator __p, _Args&&... __args)
1199ce48a113SHoward Hinnant            {return __tree_.__emplace_hint_multi(__p, _VSTD::forward<_Args>(__args)...);}
1200922940b6SEric Fiselier#endif // _LIBCPP_CXX03_LANG
1201922940b6SEric Fiselier
120253ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
12033e519524SHoward Hinnant    iterator insert(const value_type& __v)
12043e519524SHoward Hinnant        {return __tree_.__insert_multi(__v);}
120553ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
12063e519524SHoward Hinnant    iterator insert(const_iterator __p, const value_type& __v)
12073e519524SHoward Hinnant        {return __tree_.__insert_multi(__p, __v);}
1208922940b6SEric Fiselier
12093e519524SHoward Hinnant    template <class _InputIterator>
121053ec0b4eSHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
12113e519524SHoward Hinnant        void insert(_InputIterator __f, _InputIterator __l)
12123e519524SHoward Hinnant        {
12133e519524SHoward Hinnant            for (const_iterator __e = cend(); __f != __l; ++__f)
12143e519524SHoward Hinnant                __tree_.__insert_multi(__e, *__f);
12153e519524SHoward Hinnant        }
12163e519524SHoward Hinnant
1217922940b6SEric Fiselier#ifndef _LIBCPP_CXX03_LANG
1218922940b6SEric Fiselier    _LIBCPP_INLINE_VISIBILITY
1219922940b6SEric Fiselier    iterator insert(value_type&& __v)
1220922940b6SEric Fiselier        {return __tree_.__insert_multi(_VSTD::move(__v));}
1221922940b6SEric Fiselier
1222922940b6SEric Fiselier    _LIBCPP_INLINE_VISIBILITY
1223922940b6SEric Fiselier    iterator insert(const_iterator __p, value_type&& __v)
1224922940b6SEric Fiselier        {return __tree_.__insert_multi(__p, _VSTD::move(__v));}
1225922940b6SEric Fiselier
122653ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
12273e519524SHoward Hinnant    void insert(initializer_list<value_type> __il)
12283e519524SHoward Hinnant        {insert(__il.begin(), __il.end());}
1229922940b6SEric Fiselier#endif // _LIBCPP_CXX03_LANG
12303e519524SHoward Hinnant
123153ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
12323e519524SHoward Hinnant    iterator  erase(const_iterator __p) {return __tree_.erase(__p);}
123353ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
12343e519524SHoward Hinnant    size_type erase(const key_type& __k) {return __tree_.__erase_multi(__k);}
123553ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
12363e519524SHoward Hinnant    iterator  erase(const_iterator __f, const_iterator __l)
12373e519524SHoward Hinnant        {return __tree_.erase(__f, __l);}
123853ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
12390e9f71c1SHoward Hinnant    void clear() _NOEXCEPT {__tree_.clear();}
12403e519524SHoward Hinnant
1241b0386a51SErik Pilkington#if _LIBCPP_STD_VER > 14
1242b0386a51SErik Pilkington    _LIBCPP_INLINE_VISIBILITY
1243b0386a51SErik Pilkington    iterator insert(node_type&& __nh)
1244b0386a51SErik Pilkington    {
1245b0386a51SErik Pilkington        _LIBCPP_ASSERT(__nh.empty() || __nh.get_allocator() == get_allocator(),
1246b0386a51SErik Pilkington            "node_type with incompatible allocator passed to multiset::insert()");
1247b0386a51SErik Pilkington        return __tree_.template __node_handle_insert_multi<node_type>(
1248b0386a51SErik Pilkington            _VSTD::move(__nh));
1249b0386a51SErik Pilkington    }
1250b0386a51SErik Pilkington    _LIBCPP_INLINE_VISIBILITY
1251b0386a51SErik Pilkington    iterator insert(const_iterator __hint, node_type&& __nh)
1252b0386a51SErik Pilkington    {
1253b0386a51SErik Pilkington        _LIBCPP_ASSERT(__nh.empty() || __nh.get_allocator() == get_allocator(),
1254b0386a51SErik Pilkington            "node_type with incompatible allocator passed to multiset::insert()");
1255b0386a51SErik Pilkington        return __tree_.template __node_handle_insert_multi<node_type>(
1256b0386a51SErik Pilkington            __hint, _VSTD::move(__nh));
1257b0386a51SErik Pilkington    }
1258b0386a51SErik Pilkington    _LIBCPP_INLINE_VISIBILITY
1259b0386a51SErik Pilkington    node_type extract(key_type const& __key)
1260b0386a51SErik Pilkington    {
1261b0386a51SErik Pilkington        return __tree_.template __node_handle_extract<node_type>(__key);
1262b0386a51SErik Pilkington    }
1263b0386a51SErik Pilkington    _LIBCPP_INLINE_VISIBILITY
1264b0386a51SErik Pilkington    node_type extract(const_iterator __it)
1265b0386a51SErik Pilkington    {
1266b0386a51SErik Pilkington        return __tree_.template __node_handle_extract<node_type>(__it);
1267b0386a51SErik Pilkington    }
12688df1d5a5SLouis Dionne    template <class _Compare2>
12695c4e07aeSErik Pilkington    _LIBCPP_INLINE_VISIBILITY
12708df1d5a5SLouis Dionne    void merge(multiset<key_type, _Compare2, allocator_type>& __source)
12715c4e07aeSErik Pilkington    {
12725c4e07aeSErik Pilkington        _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
12735c4e07aeSErik Pilkington                       "merging container with incompatible allocator");
12745c4e07aeSErik Pilkington        __tree_.__node_handle_merge_multi(__source.__tree_);
12755c4e07aeSErik Pilkington    }
12768df1d5a5SLouis Dionne    template <class _Compare2>
12775c4e07aeSErik Pilkington    _LIBCPP_INLINE_VISIBILITY
12788df1d5a5SLouis Dionne    void merge(multiset<key_type, _Compare2, allocator_type>&& __source)
12795c4e07aeSErik Pilkington    {
12805c4e07aeSErik Pilkington        _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
12815c4e07aeSErik Pilkington                       "merging container with incompatible allocator");
12825c4e07aeSErik Pilkington        __tree_.__node_handle_merge_multi(__source.__tree_);
12835c4e07aeSErik Pilkington    }
12848df1d5a5SLouis Dionne    template <class _Compare2>
12855c4e07aeSErik Pilkington    _LIBCPP_INLINE_VISIBILITY
12868df1d5a5SLouis Dionne    void merge(set<key_type, _Compare2, allocator_type>& __source)
12875c4e07aeSErik Pilkington    {
12885c4e07aeSErik Pilkington        _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
12895c4e07aeSErik Pilkington                       "merging container with incompatible allocator");
12905c4e07aeSErik Pilkington        __tree_.__node_handle_merge_multi(__source.__tree_);
12915c4e07aeSErik Pilkington    }
12928df1d5a5SLouis Dionne    template <class _Compare2>
12935c4e07aeSErik Pilkington    _LIBCPP_INLINE_VISIBILITY
12948df1d5a5SLouis Dionne    void merge(set<key_type, _Compare2, allocator_type>&& __source)
12955c4e07aeSErik Pilkington    {
12965c4e07aeSErik Pilkington        _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
12975c4e07aeSErik Pilkington                       "merging container with incompatible allocator");
12985c4e07aeSErik Pilkington        __tree_.__node_handle_merge_multi(__source.__tree_);
12995c4e07aeSErik Pilkington    }
1300b0386a51SErik Pilkington#endif
1301b0386a51SErik Pilkington
130253ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
13030e9f71c1SHoward Hinnant    void swap(multiset& __s)
13040e9f71c1SHoward Hinnant        _NOEXCEPT_(__is_nothrow_swappable<__base>::value)
13050e9f71c1SHoward Hinnant        {__tree_.swap(__s.__tree_);}
13063e519524SHoward Hinnant
130753ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
13080e9f71c1SHoward Hinnant    allocator_type get_allocator() const _NOEXCEPT {return __tree_.__alloc();}
130953ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
13103e519524SHoward Hinnant    key_compare    key_comp()      const {return __tree_.value_comp();}
131153ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
13123e519524SHoward Hinnant    value_compare  value_comp()    const {return __tree_.value_comp();}
13133e519524SHoward Hinnant
13143e519524SHoward Hinnant    // set operations:
131553ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
13163e519524SHoward Hinnant    iterator find(const key_type& __k)             {return __tree_.find(__k);}
131753ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
13183e519524SHoward Hinnant    const_iterator find(const key_type& __k) const {return __tree_.find(__k);}
131925d3402cSMarshall Clow#if _LIBCPP_STD_VER > 11
132025d3402cSMarshall Clow    template <typename _K2>
132125d3402cSMarshall Clow    _LIBCPP_INLINE_VISIBILITY
1322cfef7c91SMark de Wever    typename enable_if<__is_transparent<_Compare, _K2>::value,iterator>::type
132325d3402cSMarshall Clow    find(const _K2& __k)                           {return __tree_.find(__k);}
132425d3402cSMarshall Clow    template <typename _K2>
132525d3402cSMarshall Clow    _LIBCPP_INLINE_VISIBILITY
1326cfef7c91SMark de Wever    typename enable_if<__is_transparent<_Compare, _K2>::value,const_iterator>::type
132725d3402cSMarshall Clow    find(const _K2& __k) const                     {return __tree_.find(__k);}
132825d3402cSMarshall Clow#endif
132925d3402cSMarshall Clow
133053ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
13313e519524SHoward Hinnant    size_type      count(const key_type& __k) const
13323e519524SHoward Hinnant        {return __tree_.__count_multi(__k);}
13330aacbc92SMarshall Clow#if _LIBCPP_STD_VER > 11
13340aacbc92SMarshall Clow    template <typename _K2>
13350aacbc92SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
13360aacbc92SMarshall Clow    typename enable_if<__is_transparent<_Compare, _K2>::value,size_type>::type
1337464de6caSMarshall Clow    count(const _K2& __k) const            {return __tree_.__count_multi(__k);}
13380aacbc92SMarshall Clow#endif
133925d3402cSMarshall Clow
1340a17b1aedSZoe Carver#if _LIBCPP_STD_VER > 17
1341a17b1aedSZoe Carver    _LIBCPP_INLINE_VISIBILITY
1342a17b1aedSZoe Carver    bool contains(const key_type& __k) const {return find(__k) != end();}
13433fca07d7SMarek Kurdej    template <typename _K2>
13443fca07d7SMarek Kurdej    _LIBCPP_INLINE_VISIBILITY
13453fca07d7SMarek Kurdej    typename enable_if<__is_transparent<_Compare, _K2>::value, bool>::type
13463fca07d7SMarek Kurdej    contains(const _K2& __k) const { return find(__k) != end(); }
1347a17b1aedSZoe Carver#endif // _LIBCPP_STD_VER > 17
1348a17b1aedSZoe Carver
134953ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
13503e519524SHoward Hinnant    iterator lower_bound(const key_type& __k)
13513e519524SHoward Hinnant        {return __tree_.lower_bound(__k);}
135253ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
13533e519524SHoward Hinnant    const_iterator lower_bound(const key_type& __k) const
13543e519524SHoward Hinnant            {return __tree_.lower_bound(__k);}
135525d3402cSMarshall Clow#if _LIBCPP_STD_VER > 11
135625d3402cSMarshall Clow    template <typename _K2>
135725d3402cSMarshall Clow    _LIBCPP_INLINE_VISIBILITY
1358cfef7c91SMark de Wever    typename enable_if<__is_transparent<_Compare, _K2>::value,iterator>::type
135925d3402cSMarshall Clow    lower_bound(const _K2& __k)       {return __tree_.lower_bound(__k);}
136025d3402cSMarshall Clow
136125d3402cSMarshall Clow    template <typename _K2>
136225d3402cSMarshall Clow    _LIBCPP_INLINE_VISIBILITY
1363cfef7c91SMark de Wever    typename enable_if<__is_transparent<_Compare, _K2>::value,const_iterator>::type
136425d3402cSMarshall Clow    lower_bound(const _K2& __k) const {return __tree_.lower_bound(__k);}
136525d3402cSMarshall Clow#endif
136625d3402cSMarshall Clow
136753ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
13683e519524SHoward Hinnant    iterator upper_bound(const key_type& __k)
13693e519524SHoward Hinnant            {return __tree_.upper_bound(__k);}
137053ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
13713e519524SHoward Hinnant    const_iterator upper_bound(const key_type& __k) const
13723e519524SHoward Hinnant            {return __tree_.upper_bound(__k);}
137325d3402cSMarshall Clow#if _LIBCPP_STD_VER > 11
137425d3402cSMarshall Clow    template <typename _K2>
137525d3402cSMarshall Clow    _LIBCPP_INLINE_VISIBILITY
1376cfef7c91SMark de Wever    typename enable_if<__is_transparent<_Compare, _K2>::value,iterator>::type
137725d3402cSMarshall Clow    upper_bound(const _K2& __k)       {return __tree_.upper_bound(__k);}
137825d3402cSMarshall Clow    template <typename _K2>
137925d3402cSMarshall Clow    _LIBCPP_INLINE_VISIBILITY
1380cfef7c91SMark de Wever    typename enable_if<__is_transparent<_Compare, _K2>::value,const_iterator>::type
138125d3402cSMarshall Clow    upper_bound(const _K2& __k) const {return __tree_.upper_bound(__k);}
138225d3402cSMarshall Clow#endif
138325d3402cSMarshall Clow
138453ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
13853e519524SHoward Hinnant    pair<iterator,iterator>             equal_range(const key_type& __k)
13863e519524SHoward Hinnant            {return __tree_.__equal_range_multi(__k);}
138753ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
13883e519524SHoward Hinnant    pair<const_iterator,const_iterator> equal_range(const key_type& __k) const
13893e519524SHoward Hinnant            {return __tree_.__equal_range_multi(__k);}
139025d3402cSMarshall Clow#if _LIBCPP_STD_VER > 11
139125d3402cSMarshall Clow    template <typename _K2>
139225d3402cSMarshall Clow    _LIBCPP_INLINE_VISIBILITY
1393cfef7c91SMark de Wever    typename enable_if<__is_transparent<_Compare, _K2>::value,pair<iterator,iterator>>::type
139425d3402cSMarshall Clow    equal_range(const _K2& __k)       {return __tree_.__equal_range_multi(__k);}
139525d3402cSMarshall Clow    template <typename _K2>
139625d3402cSMarshall Clow    _LIBCPP_INLINE_VISIBILITY
1397cfef7c91SMark de Wever    typename enable_if<__is_transparent<_Compare, _K2>::value,pair<const_iterator,const_iterator>>::type
139825d3402cSMarshall Clow    equal_range(const _K2& __k) const {return __tree_.__equal_range_multi(__k);}
139925d3402cSMarshall Clow#endif
14003e519524SHoward Hinnant};
14013e519524SHoward Hinnant
140201666904SLouis Dionne#if _LIBCPP_STD_VER >= 17
1403e20865c3SLouis Dionnetemplate<class _InputIterator,
1404199d2ebeSArthur O'Dwyer         class _Compare = less<__iter_value_type<_InputIterator>>,
1405199d2ebeSArthur O'Dwyer         class _Allocator = allocator<__iter_value_type<_InputIterator>>,
1406*4e0ea2cfSLouis Dionne         class = enable_if_t<__is_allocator<_Allocator>::value, void>,
1407*4e0ea2cfSLouis Dionne         class = enable_if_t<!__is_allocator<_Compare>::value, void>>
1408e20865c3SLouis Dionnemultiset(_InputIterator, _InputIterator, _Compare = _Compare(), _Allocator = _Allocator())
1409199d2ebeSArthur O'Dwyer  -> multiset<__iter_value_type<_InputIterator>, _Compare, _Allocator>;
1410e20865c3SLouis Dionne
1411e20865c3SLouis Dionnetemplate<class _Key, class _Compare = less<_Key>,
1412e20865c3SLouis Dionne         class _Allocator = allocator<_Key>,
1413*4e0ea2cfSLouis Dionne         class = enable_if_t<__is_allocator<_Allocator>::value, void>,
1414*4e0ea2cfSLouis Dionne         class = enable_if_t<!__is_allocator<_Compare>::value, void>>
1415e20865c3SLouis Dionnemultiset(initializer_list<_Key>, _Compare = _Compare(), _Allocator = _Allocator())
1416e20865c3SLouis Dionne  -> multiset<_Key, _Compare, _Allocator>;
1417e20865c3SLouis Dionne
1418e20865c3SLouis Dionnetemplate<class _InputIterator, class _Allocator,
1419*4e0ea2cfSLouis Dionne         class = enable_if_t<__is_allocator<_Allocator>::value, void>>
1420e20865c3SLouis Dionnemultiset(_InputIterator, _InputIterator, _Allocator)
1421199d2ebeSArthur O'Dwyer  -> multiset<__iter_value_type<_InputIterator>,
1422199d2ebeSArthur O'Dwyer         less<__iter_value_type<_InputIterator>>, _Allocator>;
1423e20865c3SLouis Dionne
1424e20865c3SLouis Dionnetemplate<class _Key, class _Allocator,
1425*4e0ea2cfSLouis Dionne         class = enable_if_t<__is_allocator<_Allocator>::value, void>>
1426e20865c3SLouis Dionnemultiset(initializer_list<_Key>, _Allocator)
1427e20865c3SLouis Dionne  -> multiset<_Key, less<_Key>, _Allocator>;
1428e20865c3SLouis Dionne#endif
1429e20865c3SLouis Dionne
1430922940b6SEric Fiselier#ifndef _LIBCPP_CXX03_LANG
14313e519524SHoward Hinnant
14323e519524SHoward Hinnanttemplate <class _Key, class _Compare, class _Allocator>
14333e519524SHoward Hinnantmultiset<_Key, _Compare, _Allocator>::multiset(multiset&& __s, const allocator_type& __a)
1434ce48a113SHoward Hinnant    : __tree_(_VSTD::move(__s.__tree_), __a)
14353e519524SHoward Hinnant{
14363e519524SHoward Hinnant    if (__a != __s.get_allocator())
14373e519524SHoward Hinnant    {
14383e519524SHoward Hinnant        const_iterator __e = cend();
14393e519524SHoward Hinnant        while (!__s.empty())
1440ce48a113SHoward Hinnant            insert(__e, _VSTD::move(__s.__tree_.remove(__s.begin())->__value_));
14413e519524SHoward Hinnant    }
14423e519524SHoward Hinnant}
14433e519524SHoward Hinnant
1444922940b6SEric Fiselier#endif // _LIBCPP_CXX03_LANG
14453e519524SHoward Hinnant
14463e519524SHoward Hinnanttemplate <class _Key, class _Compare, class _Allocator>
144753ec0b4eSHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
14483e519524SHoward Hinnantbool
14493e519524SHoward Hinnantoperator==(const multiset<_Key, _Compare, _Allocator>& __x,
14503e519524SHoward Hinnant           const multiset<_Key, _Compare, _Allocator>& __y)
14513e519524SHoward Hinnant{
1452ce48a113SHoward Hinnant    return __x.size() == __y.size() && _VSTD::equal(__x.begin(), __x.end(), __y.begin());
14533e519524SHoward Hinnant}
14543e519524SHoward Hinnant
14553e519524SHoward Hinnanttemplate <class _Key, class _Compare, class _Allocator>
145653ec0b4eSHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
14573e519524SHoward Hinnantbool
14583e519524SHoward Hinnantoperator< (const multiset<_Key, _Compare, _Allocator>& __x,
14593e519524SHoward Hinnant           const multiset<_Key, _Compare, _Allocator>& __y)
14603e519524SHoward Hinnant{
1461ce48a113SHoward Hinnant    return _VSTD::lexicographical_compare(__x.begin(), __x.end(), __y.begin(), __y.end());
14623e519524SHoward Hinnant}
14633e519524SHoward Hinnant
14643e519524SHoward Hinnanttemplate <class _Key, class _Compare, class _Allocator>
146553ec0b4eSHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
14663e519524SHoward Hinnantbool
14673e519524SHoward Hinnantoperator!=(const multiset<_Key, _Compare, _Allocator>& __x,
14683e519524SHoward Hinnant           const multiset<_Key, _Compare, _Allocator>& __y)
14693e519524SHoward Hinnant{
14703e519524SHoward Hinnant    return !(__x == __y);
14713e519524SHoward Hinnant}
14723e519524SHoward Hinnant
14733e519524SHoward Hinnanttemplate <class _Key, class _Compare, class _Allocator>
147453ec0b4eSHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
14753e519524SHoward Hinnantbool
14763e519524SHoward Hinnantoperator> (const multiset<_Key, _Compare, _Allocator>& __x,
14773e519524SHoward Hinnant           const multiset<_Key, _Compare, _Allocator>& __y)
14783e519524SHoward Hinnant{
14793e519524SHoward Hinnant    return __y < __x;
14803e519524SHoward Hinnant}
14813e519524SHoward Hinnant
14823e519524SHoward Hinnanttemplate <class _Key, class _Compare, class _Allocator>
148353ec0b4eSHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
14843e519524SHoward Hinnantbool
14853e519524SHoward Hinnantoperator>=(const multiset<_Key, _Compare, _Allocator>& __x,
14863e519524SHoward Hinnant           const multiset<_Key, _Compare, _Allocator>& __y)
14873e519524SHoward Hinnant{
14883e519524SHoward Hinnant    return !(__x < __y);
14893e519524SHoward Hinnant}
14903e519524SHoward Hinnant
14913e519524SHoward Hinnanttemplate <class _Key, class _Compare, class _Allocator>
149253ec0b4eSHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
14933e519524SHoward Hinnantbool
14943e519524SHoward Hinnantoperator<=(const multiset<_Key, _Compare, _Allocator>& __x,
14953e519524SHoward Hinnant           const multiset<_Key, _Compare, _Allocator>& __y)
14963e519524SHoward Hinnant{
14973e519524SHoward Hinnant    return !(__y < __x);
14983e519524SHoward Hinnant}
14993e519524SHoward Hinnant
15003e519524SHoward Hinnanttemplate <class _Key, class _Compare, class _Allocator>
150153ec0b4eSHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
15023e519524SHoward Hinnantvoid
15033e519524SHoward Hinnantswap(multiset<_Key, _Compare, _Allocator>& __x,
15043e519524SHoward Hinnant     multiset<_Key, _Compare, _Allocator>& __y)
15050e9f71c1SHoward Hinnant    _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
15063e519524SHoward Hinnant{
15073e519524SHoward Hinnant    __x.swap(__y);
15083e519524SHoward Hinnant}
15093e519524SHoward Hinnant
1510f60c63c0SMarshall Clow#if _LIBCPP_STD_VER > 17
1511f60c63c0SMarshall Clowtemplate <class _Key, class _Compare, class _Allocator, class _Predicate>
1512f60c63c0SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY
15133e895085SMarek Kurdej    typename multiset<_Key, _Compare, _Allocator>::size_type
15143e895085SMarek Kurdej    erase_if(multiset<_Key, _Compare, _Allocator>& __c, _Predicate __pred) {
15152ac6babcSArthur O'Dwyer  return _VSTD::__libcpp_erase_if_container(__c, __pred);
15163e895085SMarek Kurdej}
1517f60c63c0SMarshall Clow#endif
1518f60c63c0SMarshall Clow
15193e519524SHoward Hinnant_LIBCPP_END_NAMESPACE_STD
15203e519524SHoward Hinnant
15213e519524SHoward Hinnant#endif // _LIBCPP_SET
1522