xref: /llvm-project-15.0.7/libcxx/include/set (revision de4a57cb)
13e519524SHoward Hinnant// -*- C++ -*-
2eb8650a7SLouis Dionne//===----------------------------------------------------------------------===//
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
18668072a71SKonstantin Varlamovtemplate <class InputIterator,
18768072a71SKonstantin Varlamov      class Compare = less<typename iterator_traits<InputIterator>::value_type>,
18868072a71SKonstantin Varlamov      class Allocator = allocator<typename iterator_traits<InputIterator>::value_type>>
18968072a71SKonstantin Varlamovset(InputIterator, InputIterator,
19068072a71SKonstantin Varlamov    Compare = Compare(), Allocator = Allocator())
19168072a71SKonstantin Varlamov  -> set<typename iterator_traits<InputIterator>::value_type, Compare, Allocator>; // C++17
19268072a71SKonstantin Varlamov
19368072a71SKonstantin Varlamovtemplate<class Key, class Compare = less<Key>, class Allocator = allocator<Key>>
19468072a71SKonstantin Varlamovset(initializer_list<Key>, Compare = Compare(), Allocator = Allocator())
19568072a71SKonstantin Varlamov  -> set<Key, Compare, Allocator>; // C++17
19668072a71SKonstantin Varlamov
19768072a71SKonstantin Varlamovtemplate<class InputIterator, class Allocator>
19868072a71SKonstantin Varlamovset(InputIterator, InputIterator, Allocator)
19968072a71SKonstantin Varlamov  -> set<typename iterator_traits<InputIterator>::value_type,
20068072a71SKonstantin Varlamov          less<typename iterator_traits<InputIterator>::value_type>, Allocator>; // C++17
20168072a71SKonstantin Varlamov
20268072a71SKonstantin Varlamovtemplate<class Key, class Allocator>
20368072a71SKonstantin Varlamovset(initializer_list<Key>, Allocator) -> set<Key, less<Key>, Allocator>; // C++17
20468072a71SKonstantin Varlamov
2053e519524SHoward Hinnanttemplate <class Key, class Compare, class Allocator>
2063e519524SHoward Hinnantbool
2073e519524SHoward Hinnantoperator==(const set<Key, Compare, Allocator>& x,
2083e519524SHoward Hinnant           const set<Key, Compare, Allocator>& y);
2093e519524SHoward Hinnant
2103e519524SHoward Hinnanttemplate <class Key, class Compare, class Allocator>
2113e519524SHoward Hinnantbool
2123e519524SHoward Hinnantoperator< (const set<Key, Compare, Allocator>& x,
2133e519524SHoward Hinnant           const set<Key, Compare, Allocator>& y);
2143e519524SHoward Hinnant
2153e519524SHoward Hinnanttemplate <class Key, class Compare, class Allocator>
2163e519524SHoward Hinnantbool
2173e519524SHoward Hinnantoperator!=(const set<Key, Compare, Allocator>& x,
2183e519524SHoward Hinnant           const set<Key, Compare, Allocator>& y);
2193e519524SHoward Hinnant
2203e519524SHoward Hinnanttemplate <class Key, class Compare, class Allocator>
2213e519524SHoward Hinnantbool
2223e519524SHoward Hinnantoperator> (const set<Key, Compare, Allocator>& x,
2233e519524SHoward Hinnant           const set<Key, Compare, Allocator>& y);
2243e519524SHoward Hinnant
2253e519524SHoward Hinnanttemplate <class Key, class Compare, class Allocator>
2263e519524SHoward Hinnantbool
2273e519524SHoward Hinnantoperator>=(const set<Key, Compare, Allocator>& x,
2283e519524SHoward Hinnant           const set<Key, Compare, Allocator>& y);
2293e519524SHoward Hinnant
2303e519524SHoward Hinnanttemplate <class Key, class Compare, class Allocator>
2313e519524SHoward Hinnantbool
2323e519524SHoward Hinnantoperator<=(const set<Key, Compare, Allocator>& x,
2333e519524SHoward Hinnant           const set<Key, Compare, Allocator>& y);
2343e519524SHoward Hinnant
2353e519524SHoward Hinnant// specialized algorithms:
2363e519524SHoward Hinnanttemplate <class Key, class Compare, class Allocator>
2373e519524SHoward Hinnantvoid
2380e9f71c1SHoward Hinnantswap(set<Key, Compare, Allocator>& x, set<Key, Compare, Allocator>& y)
2390e9f71c1SHoward Hinnant    noexcept(noexcept(x.swap(y)));
2403e519524SHoward Hinnant
241f60c63c0SMarshall Clowtemplate <class Key, class Compare, class Allocator, class Predicate>
2423e895085SMarek Kurdejtypename set<Key, Compare, Allocator>::size_type
2433e895085SMarek Kurdejerase_if(set<Key, Compare, Allocator>& c, Predicate pred);  // C++20
244f60c63c0SMarshall Clow
2453e519524SHoward Hinnanttemplate <class Key, class Compare = less<Key>,
2463e519524SHoward Hinnant          class Allocator = allocator<Key>>
2473e519524SHoward Hinnantclass multiset
2483e519524SHoward Hinnant{
2493e519524SHoward Hinnantpublic:
2503e519524SHoward Hinnant    // types:
2513e519524SHoward Hinnant    typedef Key                                      key_type;
2523e519524SHoward Hinnant    typedef key_type                                 value_type;
2533e519524SHoward Hinnant    typedef Compare                                  key_compare;
2543e519524SHoward Hinnant    typedef key_compare                              value_compare;
2553e519524SHoward Hinnant    typedef Allocator                                allocator_type;
2563e519524SHoward Hinnant    typedef typename allocator_type::reference       reference;
2573e519524SHoward Hinnant    typedef typename allocator_type::const_reference const_reference;
2583e519524SHoward Hinnant    typedef typename allocator_type::size_type       size_type;
2593e519524SHoward Hinnant    typedef typename allocator_type::difference_type difference_type;
2603e519524SHoward Hinnant    typedef typename allocator_type::pointer         pointer;
2613e519524SHoward Hinnant    typedef typename allocator_type::const_pointer   const_pointer;
2623e519524SHoward Hinnant
2633e519524SHoward Hinnant    typedef implementation-defined                   iterator;
2643e519524SHoward Hinnant    typedef implementation-defined                   const_iterator;
2653e519524SHoward Hinnant    typedef std::reverse_iterator<iterator>          reverse_iterator;
2663e519524SHoward Hinnant    typedef std::reverse_iterator<const_iterator>    const_reverse_iterator;
267b0386a51SErik Pilkington    typedef unspecified                              node_type;               // C++17
2683e519524SHoward Hinnant
2693e519524SHoward Hinnant    // construct/copy/destroy:
2700e9f71c1SHoward Hinnant    multiset()
2710e9f71c1SHoward Hinnant        noexcept(
2720e9f71c1SHoward Hinnant            is_nothrow_default_constructible<allocator_type>::value &&
2730e9f71c1SHoward Hinnant            is_nothrow_default_constructible<key_compare>::value &&
2740e9f71c1SHoward Hinnant            is_nothrow_copy_constructible<key_compare>::value);
2750e9f71c1SHoward Hinnant    explicit multiset(const value_compare& comp);
2763e519524SHoward Hinnant    multiset(const value_compare& comp, const allocator_type& a);
2773e519524SHoward Hinnant    template <class InputIterator>
2783e519524SHoward Hinnant        multiset(InputIterator first, InputIterator last,
2793e519524SHoward Hinnant                 const value_compare& comp = value_compare());
2803e519524SHoward Hinnant    template <class InputIterator>
2813e519524SHoward Hinnant        multiset(InputIterator first, InputIterator last,
2823e519524SHoward Hinnant                 const value_compare& comp, const allocator_type& a);
2833e519524SHoward Hinnant    multiset(const multiset& s);
2840e9f71c1SHoward Hinnant    multiset(multiset&& s)
2850e9f71c1SHoward Hinnant        noexcept(
2860e9f71c1SHoward Hinnant            is_nothrow_move_constructible<allocator_type>::value &&
2870e9f71c1SHoward Hinnant            is_nothrow_move_constructible<key_compare>::value);
2883e519524SHoward Hinnant    explicit multiset(const allocator_type& a);
2893e519524SHoward Hinnant    multiset(const multiset& s, const allocator_type& a);
2903e519524SHoward Hinnant    multiset(multiset&& s, const allocator_type& a);
2913e519524SHoward Hinnant    multiset(initializer_list<value_type> il, const value_compare& comp = value_compare());
2923e519524SHoward Hinnant    multiset(initializer_list<value_type> il, const value_compare& comp,
2933e519524SHoward Hinnant             const allocator_type& a);
2940a55d17bSMarshall Clow    template <class InputIterator>
2950a55d17bSMarshall Clow        multiset(InputIterator first, InputIterator last, const allocator_type& a)
2960a55d17bSMarshall Clow            : set(first, last, Compare(), a) {}  // C++14
2970a55d17bSMarshall Clow    multiset(initializer_list<value_type> il, const allocator_type& a)
2980a55d17bSMarshall Clow        : set(il, Compare(), a) {}  // C++14
2993e519524SHoward Hinnant    ~multiset();
3003e519524SHoward Hinnant
3013e519524SHoward Hinnant    multiset& operator=(const multiset& s);
3020e9f71c1SHoward Hinnant    multiset& operator=(multiset&& s)
3030e9f71c1SHoward Hinnant        noexcept(
3040e9f71c1SHoward Hinnant            allocator_type::propagate_on_container_move_assignment::value &&
3050e9f71c1SHoward Hinnant            is_nothrow_move_assignable<allocator_type>::value &&
3060e9f71c1SHoward Hinnant            is_nothrow_move_assignable<key_compare>::value);
3073e519524SHoward Hinnant    multiset& operator=(initializer_list<value_type> il);
3083e519524SHoward Hinnant
3093e519524SHoward Hinnant    // iterators:
3100e9f71c1SHoward Hinnant          iterator begin() noexcept;
3110e9f71c1SHoward Hinnant    const_iterator begin() const noexcept;
3120e9f71c1SHoward Hinnant          iterator end() noexcept;
3130e9f71c1SHoward Hinnant    const_iterator end()   const noexcept;
3143e519524SHoward Hinnant
3150e9f71c1SHoward Hinnant          reverse_iterator rbegin() noexcept;
3160e9f71c1SHoward Hinnant    const_reverse_iterator rbegin() const noexcept;
3170e9f71c1SHoward Hinnant          reverse_iterator rend() noexcept;
3180e9f71c1SHoward Hinnant    const_reverse_iterator rend()   const noexcept;
3193e519524SHoward Hinnant
3200e9f71c1SHoward Hinnant    const_iterator         cbegin()  const noexcept;
3210e9f71c1SHoward Hinnant    const_iterator         cend()    const noexcept;
3220e9f71c1SHoward Hinnant    const_reverse_iterator crbegin() const noexcept;
3230e9f71c1SHoward Hinnant    const_reverse_iterator crend()   const noexcept;
3243e519524SHoward Hinnant
3253e519524SHoward Hinnant    // capacity:
3260e9f71c1SHoward Hinnant    bool      empty()    const noexcept;
3270e9f71c1SHoward Hinnant    size_type size()     const noexcept;
3280e9f71c1SHoward Hinnant    size_type max_size() const noexcept;
3293e519524SHoward Hinnant
3303e519524SHoward Hinnant    // modifiers:
3313e519524SHoward Hinnant    template <class... Args>
3323e519524SHoward Hinnant        iterator emplace(Args&&... args);
3333e519524SHoward Hinnant    template <class... Args>
3343e519524SHoward Hinnant        iterator emplace_hint(const_iterator position, Args&&... args);
3353e519524SHoward Hinnant    iterator insert(const value_type& v);
3363e519524SHoward Hinnant    iterator insert(value_type&& v);
3373e519524SHoward Hinnant    iterator insert(const_iterator position, const value_type& v);
3383e519524SHoward Hinnant    iterator insert(const_iterator position, value_type&& v);
3393e519524SHoward Hinnant    template <class InputIterator>
3403e519524SHoward Hinnant        void insert(InputIterator first, InputIterator last);
3413e519524SHoward Hinnant    void insert(initializer_list<value_type> il);
3423e519524SHoward Hinnant
343b0386a51SErik Pilkington    node_type extract(const_iterator position);                                       // C++17
344b0386a51SErik Pilkington    node_type extract(const key_type& x);                                             // C++17
345b0386a51SErik Pilkington    iterator insert(node_type&& nh);                                                  // C++17
346b0386a51SErik Pilkington    iterator insert(const_iterator hint, node_type&& nh);                             // C++17
347b0386a51SErik Pilkington
3483e519524SHoward Hinnant    iterator  erase(const_iterator position);
349ec392968SMarshall Clow    iterator  erase(iterator position);  // C++14
3503e519524SHoward Hinnant    size_type erase(const key_type& k);
3513e519524SHoward Hinnant    iterator  erase(const_iterator first, const_iterator last);
3520e9f71c1SHoward Hinnant    void clear() noexcept;
3533e519524SHoward Hinnant
3545c4e07aeSErik Pilkington    template<class C2>
3555c4e07aeSErik Pilkington      void merge(multiset<Key, C2, Allocator>& source);    // C++17
3565c4e07aeSErik Pilkington    template<class C2>
3575c4e07aeSErik Pilkington      void merge(multiset<Key, C2, Allocator>&& source);   // C++17
3585c4e07aeSErik Pilkington    template<class C2>
3595c4e07aeSErik Pilkington      void merge(set<Key, C2, Allocator>& source);         // C++17
3605c4e07aeSErik Pilkington    template<class C2>
3615c4e07aeSErik Pilkington      void merge(set<Key, C2, Allocator>&& source);        // C++17
3625c4e07aeSErik Pilkington
3630e9f71c1SHoward Hinnant    void swap(multiset& s)
3640e9f71c1SHoward Hinnant        noexcept(
3650e9f71c1SHoward Hinnant            __is_nothrow_swappable<key_compare>::value &&
3660e9f71c1SHoward Hinnant            (!allocator_type::propagate_on_container_swap::value ||
3670e9f71c1SHoward Hinnant             __is_nothrow_swappable<allocator_type>::value));
3683e519524SHoward Hinnant
3693e519524SHoward Hinnant    // observers:
3700e9f71c1SHoward Hinnant    allocator_type get_allocator() const noexcept;
3713e519524SHoward Hinnant    key_compare    key_comp()      const;
3723e519524SHoward Hinnant    value_compare  value_comp()    const;
3733e519524SHoward Hinnant
3743e519524SHoward Hinnant    // set operations:
3753e519524SHoward Hinnant          iterator find(const key_type& k);
3763e519524SHoward Hinnant    const_iterator find(const key_type& k) const;
37725d3402cSMarshall Clow    template<typename K>
37825d3402cSMarshall Clow        iterator find(const K& x);
37925d3402cSMarshall Clow    template<typename K>
38025d3402cSMarshall Clow        const_iterator find(const K& x) const;  // C++14
3813fca07d7SMarek Kurdej
382a17b1aedSZoe Carver    template<typename K>
383a17b1aedSZoe Carver        size_type count(const K& x) const;      // C++14
3843e519524SHoward Hinnant    size_type      count(const key_type& k) const;
3853fca07d7SMarek Kurdej
386a17b1aedSZoe Carver    bool           contains(const key_type& x) const;  // C++20
3873fca07d7SMarek Kurdej    template<class K> bool contains(const K& x) const; // C++20
3883fca07d7SMarek Kurdej
3893e519524SHoward Hinnant          iterator lower_bound(const key_type& k);
3903e519524SHoward Hinnant    const_iterator lower_bound(const key_type& k) const;
39125d3402cSMarshall Clow    template<typename K>
39225d3402cSMarshall Clow        iterator lower_bound(const K& x);              // C++14
39325d3402cSMarshall Clow    template<typename K>
39425d3402cSMarshall Clow        const_iterator lower_bound(const K& x) const;  // C++14
39525d3402cSMarshall Clow
3963e519524SHoward Hinnant          iterator upper_bound(const key_type& k);
3973e519524SHoward Hinnant    const_iterator upper_bound(const key_type& k) const;
39825d3402cSMarshall Clow    template<typename K>
39925d3402cSMarshall Clow        iterator upper_bound(const K& x);              // C++14
40025d3402cSMarshall Clow    template<typename K>
40125d3402cSMarshall Clow        const_iterator upper_bound(const K& x) const;  // C++14
40225d3402cSMarshall Clow
4033e519524SHoward Hinnant    pair<iterator,iterator>             equal_range(const key_type& k);
4043e519524SHoward Hinnant    pair<const_iterator,const_iterator> equal_range(const key_type& k) const;
40525d3402cSMarshall Clow    template<typename K>
40625d3402cSMarshall Clow        pair<iterator,iterator>             equal_range(const K& x);        // C++14
40725d3402cSMarshall Clow    template<typename K>
40825d3402cSMarshall Clow        pair<const_iterator,const_iterator> equal_range(const K& x) const;  // C++14
4093e519524SHoward Hinnant};
4103e519524SHoward Hinnant
41168072a71SKonstantin Varlamovtemplate <class InputIterator,
41268072a71SKonstantin Varlamov      class Compare = less<typename iterator_traits<InputIterator>::value_type>,
41368072a71SKonstantin Varlamov      class Allocator = allocator<typename iterator_traits<InputIterator>::value_type>>
41468072a71SKonstantin Varlamovmultiset(InputIterator, InputIterator,
41568072a71SKonstantin Varlamov    Compare = Compare(), Allocator = Allocator())
41668072a71SKonstantin Varlamov  -> multiset<typename iterator_traits<InputIterator>::value_type, Compare, Allocator>; // C++17
41768072a71SKonstantin Varlamov
41868072a71SKonstantin Varlamovtemplate<class Key, class Compare = less<Key>, class Allocator = allocator<Key>>
41968072a71SKonstantin Varlamovmultiset(initializer_list<Key>, Compare = Compare(), Allocator = Allocator())
42068072a71SKonstantin Varlamov  -> multiset<Key, Compare, Allocator>; // C++17
42168072a71SKonstantin Varlamov
42268072a71SKonstantin Varlamovtemplate<class InputIterator, class Allocator>
42368072a71SKonstantin Varlamovmultiset(InputIterator, InputIterator, Allocator)
42468072a71SKonstantin Varlamov  -> multiset<typename iterator_traits<InputIterator>::value_type,
42568072a71SKonstantin Varlamov          less<typename iterator_traits<InputIterator>::value_type>, Allocator>; // C++17
42668072a71SKonstantin Varlamov
42768072a71SKonstantin Varlamovtemplate<class Key, class Allocator>
42868072a71SKonstantin Varlamovmultiset(initializer_list<Key>, Allocator) -> multiset<Key, less<Key>, Allocator>; // C++17
42968072a71SKonstantin Varlamov
4303e519524SHoward Hinnanttemplate <class Key, class Compare, class Allocator>
4313e519524SHoward Hinnantbool
4323e519524SHoward Hinnantoperator==(const multiset<Key, Compare, Allocator>& x,
4333e519524SHoward Hinnant           const multiset<Key, Compare, Allocator>& y);
4343e519524SHoward Hinnant
4353e519524SHoward Hinnanttemplate <class Key, class Compare, class Allocator>
4363e519524SHoward Hinnantbool
4373e519524SHoward Hinnantoperator< (const multiset<Key, Compare, Allocator>& x,
4383e519524SHoward Hinnant           const multiset<Key, Compare, Allocator>& y);
4393e519524SHoward Hinnant
4403e519524SHoward Hinnanttemplate <class Key, class Compare, class Allocator>
4413e519524SHoward Hinnantbool
4423e519524SHoward Hinnantoperator!=(const multiset<Key, Compare, Allocator>& x,
4433e519524SHoward Hinnant           const multiset<Key, Compare, Allocator>& y);
4443e519524SHoward Hinnant
4453e519524SHoward Hinnanttemplate <class Key, class Compare, class Allocator>
4463e519524SHoward Hinnantbool
4473e519524SHoward Hinnantoperator> (const multiset<Key, Compare, Allocator>& x,
4483e519524SHoward Hinnant           const multiset<Key, Compare, Allocator>& y);
4493e519524SHoward Hinnant
4503e519524SHoward Hinnanttemplate <class Key, class Compare, class Allocator>
4513e519524SHoward Hinnantbool
4523e519524SHoward Hinnantoperator>=(const multiset<Key, Compare, Allocator>& x,
4533e519524SHoward Hinnant           const multiset<Key, Compare, Allocator>& y);
4543e519524SHoward Hinnant
4553e519524SHoward Hinnanttemplate <class Key, class Compare, class Allocator>
4563e519524SHoward Hinnantbool
4573e519524SHoward Hinnantoperator<=(const multiset<Key, Compare, Allocator>& x,
4583e519524SHoward Hinnant           const multiset<Key, Compare, Allocator>& y);
4593e519524SHoward Hinnant
4603e519524SHoward Hinnant// specialized algorithms:
4613e519524SHoward Hinnanttemplate <class Key, class Compare, class Allocator>
4623e519524SHoward Hinnantvoid
4630e9f71c1SHoward Hinnantswap(multiset<Key, Compare, Allocator>& x, multiset<Key, Compare, Allocator>& y)
4640e9f71c1SHoward Hinnant    noexcept(noexcept(x.swap(y)));
4653e519524SHoward Hinnant
466f60c63c0SMarshall Clowtemplate <class Key, class Compare, class Allocator, class Predicate>
4673e895085SMarek Kurdejtypename multiset<Key, Compare, Allocator>::size_type
4683e895085SMarek Kurdejerase_if(multiset<Key, Compare, Allocator>& c, Predicate pred);  // C++20
469f60c63c0SMarshall Clow
4703e519524SHoward Hinnant}  // std
4713e519524SHoward Hinnant
4723e519524SHoward Hinnant*/
4733e519524SHoward Hinnant
4742e2f3158SNikolas Klauser#include <__algorithm/equal.h>
4752e2f3158SNikolas Klauser#include <__algorithm/lexicographical_compare.h>
476385cc25aSLouis Dionne#include <__assert> // all public C++ headers provide the assertion handler
4773e519524SHoward Hinnant#include <__config>
478050b064fSChristopher Di Bella#include <__functional/is_transparent.h>
47934f73804SNikolas Klauser#include <__functional/operations.h>
4803cd4531bSNikolas Klauser#include <__iterator/erase_if_container.h>
48168072a71SKonstantin Varlamov#include <__iterator/iterator_traits.h>
4823cd4531bSNikolas Klauser#include <__iterator/reverse_iterator.h>
483b0386a51SErik Pilkington#include <__node_handle>
48406b40e80SArthur O'Dwyer#include <__tree>
4856adbc83eSChristopher Di Bella#include <__utility/forward.h>
486db1978b6SNikolas Klauser#include <version>
487db1978b6SNikolas Klauser
488*de4a57cbSLouis Dionne#ifndef _LIBCPP_REMOVE_TRANSITIVE_INCLUDES
489*de4a57cbSLouis Dionne#  include <functional>
490*de4a57cbSLouis Dionne#  include <iterator>
491*de4a57cbSLouis Dionne#endif
492*de4a57cbSLouis Dionne
493db1978b6SNikolas Klauser// standard-mandated includes
494db1978b6SNikolas Klauser
495db1978b6SNikolas Klauser// [iterator.range]
496db1978b6SNikolas Klauser#include <__iterator/access.h>
497db1978b6SNikolas Klauser#include <__iterator/data.h>
498db1978b6SNikolas Klauser#include <__iterator/empty.h>
499db1978b6SNikolas Klauser#include <__iterator/reverse_access.h>
500db1978b6SNikolas Klauser#include <__iterator/size.h>
501db1978b6SNikolas Klauser
502db1978b6SNikolas Klauser// [associative.set.syn]
5032d0f1fa4SArthur O'Dwyer#include <compare>
5042d0f1fa4SArthur O'Dwyer#include <initializer_list>
5053e519524SHoward Hinnant
506073458b1SHoward Hinnant#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
5073e519524SHoward Hinnant#  pragma GCC system_header
508073458b1SHoward Hinnant#endif
5093e519524SHoward Hinnant
5103e519524SHoward Hinnant_LIBCPP_BEGIN_NAMESPACE_STD
5113e519524SHoward Hinnant
5125c4e07aeSErik Pilkingtontemplate <class _Key, class _Compare, class _Allocator>
5135c4e07aeSErik Pilkingtonclass multiset;
5145c4e07aeSErik Pilkington
5153e519524SHoward Hinnanttemplate <class _Key, class _Compare = less<_Key>,
5163e519524SHoward Hinnant          class _Allocator = allocator<_Key> >
517e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS set
5183e519524SHoward Hinnant{
5193e519524SHoward Hinnantpublic:
5203e519524SHoward Hinnant    // types:
5213e519524SHoward Hinnant    typedef _Key                                     key_type;
5223e519524SHoward Hinnant    typedef key_type                                 value_type;
5233c6bd176SNikolas Klauser    typedef __type_identity_t<_Compare>              key_compare;
5243e519524SHoward Hinnant    typedef key_compare                              value_compare;
5253c6bd176SNikolas Klauser    typedef __type_identity_t<_Allocator>            allocator_type;
5263e519524SHoward Hinnant    typedef value_type&                              reference;
5273e519524SHoward Hinnant    typedef const value_type&                        const_reference;
5283e519524SHoward Hinnant
52994f89aeeSMarshall Clow    static_assert((is_same<typename allocator_type::value_type, value_type>::value),
53094f89aeeSMarshall Clow                  "Allocator::value_type must be same type as value_type");
53194f89aeeSMarshall Clow
5323e519524SHoward Hinnantprivate:
5333e519524SHoward Hinnant    typedef __tree<value_type, value_compare, allocator_type> __base;
5343e519524SHoward Hinnant    typedef allocator_traits<allocator_type>                  __alloc_traits;
5353e519524SHoward Hinnant
5363e519524SHoward Hinnant    __base __tree_;
5373e519524SHoward Hinnant
5383e519524SHoward Hinnantpublic:
5393e519524SHoward Hinnant    typedef typename __base::pointer               pointer;
5403e519524SHoward Hinnant    typedef typename __base::const_pointer         const_pointer;
5413e519524SHoward Hinnant    typedef typename __base::size_type             size_type;
5423e519524SHoward Hinnant    typedef typename __base::difference_type       difference_type;
5433e519524SHoward Hinnant    typedef typename __base::const_iterator        iterator;
5443e519524SHoward Hinnant    typedef typename __base::const_iterator        const_iterator;
545ce48a113SHoward Hinnant    typedef _VSTD::reverse_iterator<iterator>       reverse_iterator;
546ce48a113SHoward Hinnant    typedef _VSTD::reverse_iterator<const_iterator> const_reverse_iterator;
5473e519524SHoward Hinnant
548b0386a51SErik Pilkington#if _LIBCPP_STD_VER > 14
549b0386a51SErik Pilkington    typedef __set_node_handle<typename __base::__node, allocator_type> node_type;
550b0386a51SErik Pilkington    typedef __insert_return_type<iterator, node_type> insert_return_type;
551b0386a51SErik Pilkington#endif
552b0386a51SErik Pilkington
5535c4e07aeSErik Pilkington    template <class _Key2, class _Compare2, class _Alloc2>
5545c4e07aeSErik Pilkington        friend class _LIBCPP_TEMPLATE_VIS set;
5555c4e07aeSErik Pilkington    template <class _Key2, class _Compare2, class _Alloc2>
5565c4e07aeSErik Pilkington        friend class _LIBCPP_TEMPLATE_VIS multiset;
5575c4e07aeSErik Pilkington
55853ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
559415a24e4SMarshall Clow    set()
560415a24e4SMarshall Clow        _NOEXCEPT_(
561415a24e4SMarshall Clow            is_nothrow_default_constructible<allocator_type>::value &&
562415a24e4SMarshall Clow            is_nothrow_default_constructible<key_compare>::value &&
563415a24e4SMarshall Clow            is_nothrow_copy_constructible<key_compare>::value)
564415a24e4SMarshall Clow        : __tree_(value_compare()) {}
565415a24e4SMarshall Clow
566415a24e4SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
567415a24e4SMarshall Clow    explicit set(const value_compare& __comp)
5680e9f71c1SHoward Hinnant        _NOEXCEPT_(
5690e9f71c1SHoward Hinnant            is_nothrow_default_constructible<allocator_type>::value &&
5700e9f71c1SHoward Hinnant            is_nothrow_copy_constructible<key_compare>::value)
5713e519524SHoward Hinnant        : __tree_(__comp) {}
572415a24e4SMarshall Clow
57353ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
57478a87e8aSMarshall Clow    explicit set(const value_compare& __comp, const allocator_type& __a)
5753e519524SHoward Hinnant        : __tree_(__comp, __a) {}
5763e519524SHoward Hinnant    template <class _InputIterator>
57753ec0b4eSHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
5783e519524SHoward Hinnant        set(_InputIterator __f, _InputIterator __l,
5793e519524SHoward Hinnant            const value_compare& __comp = value_compare())
5803e519524SHoward Hinnant        : __tree_(__comp)
5813e519524SHoward Hinnant        {
5823e519524SHoward Hinnant            insert(__f, __l);
5833e519524SHoward Hinnant        }
5843e519524SHoward Hinnant
5853e519524SHoward Hinnant    template <class _InputIterator>
58653ec0b4eSHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
5873e519524SHoward Hinnant        set(_InputIterator __f, _InputIterator __l, const value_compare& __comp,
5883e519524SHoward Hinnant            const allocator_type& __a)
5893e519524SHoward Hinnant        : __tree_(__comp, __a)
5903e519524SHoward Hinnant        {
5913e519524SHoward Hinnant            insert(__f, __l);
5923e519524SHoward Hinnant        }
5933e519524SHoward Hinnant
5940a55d17bSMarshall Clow#if _LIBCPP_STD_VER > 11
5950a55d17bSMarshall Clow        template <class _InputIterator>
5960a55d17bSMarshall Clow        _LIBCPP_INLINE_VISIBILITY
5970a55d17bSMarshall Clow        set(_InputIterator __f, _InputIterator __l, const allocator_type& __a)
5980a55d17bSMarshall Clow            : set(__f, __l, key_compare(), __a) {}
5990a55d17bSMarshall Clow#endif
6000a55d17bSMarshall Clow
60153ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
6023e519524SHoward Hinnant    set(const set& __s)
6033e519524SHoward Hinnant        : __tree_(__s.__tree_)
6043e519524SHoward Hinnant        {
6053e519524SHoward Hinnant            insert(__s.begin(), __s.end());
6063e519524SHoward Hinnant        }
6073e519524SHoward Hinnant
6085a33687dSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
6095a33687dSHoward Hinnant    set& operator=(const set& __s)
6105a33687dSHoward Hinnant        {
6115a33687dSHoward Hinnant            __tree_ = __s.__tree_;
6125a33687dSHoward Hinnant            return *this;
6135a33687dSHoward Hinnant        }
6145a33687dSHoward Hinnant
615922940b6SEric Fiselier#ifndef _LIBCPP_CXX03_LANG
61653ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
6173e519524SHoward Hinnant    set(set&& __s)
6180e9f71c1SHoward Hinnant        _NOEXCEPT_(is_nothrow_move_constructible<__base>::value)
619ce48a113SHoward Hinnant        : __tree_(_VSTD::move(__s.__tree_)) {}
620922940b6SEric Fiselier#endif // _LIBCPP_CXX03_LANG
6213e519524SHoward Hinnant
62253ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
6233e519524SHoward Hinnant    explicit set(const allocator_type& __a)
6243e519524SHoward Hinnant        : __tree_(__a) {}
6253e519524SHoward Hinnant
62653ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
6273e519524SHoward Hinnant    set(const set& __s, const allocator_type& __a)
6283e519524SHoward Hinnant        : __tree_(__s.__tree_.value_comp(), __a)
6293e519524SHoward Hinnant        {
6303e519524SHoward Hinnant            insert(__s.begin(), __s.end());
6313e519524SHoward Hinnant        }
6323e519524SHoward Hinnant
633922940b6SEric Fiselier#ifndef _LIBCPP_CXX03_LANG
6343e519524SHoward Hinnant    set(set&& __s, const allocator_type& __a);
6353e519524SHoward Hinnant
63653ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
6373e519524SHoward Hinnant    set(initializer_list<value_type> __il, const value_compare& __comp = value_compare())
6383e519524SHoward Hinnant        : __tree_(__comp)
6393e519524SHoward Hinnant        {
6403e519524SHoward Hinnant            insert(__il.begin(), __il.end());
6413e519524SHoward Hinnant        }
6423e519524SHoward Hinnant
64353ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
6443e519524SHoward Hinnant    set(initializer_list<value_type> __il, const value_compare& __comp,
6453e519524SHoward Hinnant        const allocator_type& __a)
6463e519524SHoward Hinnant        : __tree_(__comp, __a)
6473e519524SHoward Hinnant        {
6483e519524SHoward Hinnant            insert(__il.begin(), __il.end());
6493e519524SHoward Hinnant        }
6503e519524SHoward Hinnant
6510a55d17bSMarshall Clow#if _LIBCPP_STD_VER > 11
6520a55d17bSMarshall Clow    _LIBCPP_INLINE_VISIBILITY
6530a55d17bSMarshall Clow    set(initializer_list<value_type> __il, const allocator_type& __a)
6540a55d17bSMarshall Clow        : set(__il, key_compare(), __a) {}
6550a55d17bSMarshall Clow#endif
6560a55d17bSMarshall Clow
65753ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
6583e519524SHoward Hinnant    set& operator=(initializer_list<value_type> __il)
6593e519524SHoward Hinnant        {
6603e519524SHoward Hinnant            __tree_.__assign_unique(__il.begin(), __il.end());
6613e519524SHoward Hinnant            return *this;
6623e519524SHoward Hinnant        }
6633e519524SHoward Hinnant
66453ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
6653e519524SHoward Hinnant    set& operator=(set&& __s)
6660e9f71c1SHoward Hinnant        _NOEXCEPT_(is_nothrow_move_assignable<__base>::value)
6673e519524SHoward Hinnant        {
668ce48a113SHoward Hinnant            __tree_ = _VSTD::move(__s.__tree_);
6693e519524SHoward Hinnant            return *this;
6703e519524SHoward Hinnant        }
671922940b6SEric Fiselier#endif // _LIBCPP_CXX03_LANG
6723e519524SHoward Hinnant
67353ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
6747c142fccSLouis Dionne    ~set() {
6757c142fccSLouis Dionne        static_assert(sizeof(__diagnose_non_const_comparator<_Key, _Compare>()), "");
6767c142fccSLouis Dionne    }
6777c142fccSLouis Dionne
6787c142fccSLouis Dionne    _LIBCPP_INLINE_VISIBILITY
6790e9f71c1SHoward Hinnant          iterator begin() _NOEXCEPT       {return __tree_.begin();}
68053ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
6810e9f71c1SHoward Hinnant    const_iterator begin() const _NOEXCEPT {return __tree_.begin();}
68253ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
6830e9f71c1SHoward Hinnant          iterator end() _NOEXCEPT         {return __tree_.end();}
68453ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
6850e9f71c1SHoward Hinnant    const_iterator end()   const _NOEXCEPT {return __tree_.end();}
6863e519524SHoward Hinnant
68753ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
6880e9f71c1SHoward Hinnant          reverse_iterator rbegin() _NOEXCEPT
6890e9f71c1SHoward Hinnant            {return reverse_iterator(end());}
69053ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
6910e9f71c1SHoward Hinnant    const_reverse_iterator rbegin() const _NOEXCEPT
6920e9f71c1SHoward Hinnant        {return const_reverse_iterator(end());}
69353ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
6940e9f71c1SHoward Hinnant          reverse_iterator rend() _NOEXCEPT
6950e9f71c1SHoward Hinnant            {return reverse_iterator(begin());}
69653ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
6970e9f71c1SHoward Hinnant    const_reverse_iterator rend() const _NOEXCEPT
6980e9f71c1SHoward Hinnant        {return const_reverse_iterator(begin());}
6993e519524SHoward Hinnant
70053ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
7010e9f71c1SHoward Hinnant    const_iterator cbegin()  const _NOEXCEPT {return begin();}
70253ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
7030e9f71c1SHoward Hinnant    const_iterator cend() const _NOEXCEPT {return end();}
70453ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
7050e9f71c1SHoward Hinnant    const_reverse_iterator crbegin() const _NOEXCEPT {return rbegin();}
70653ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
7070e9f71c1SHoward Hinnant    const_reverse_iterator crend() const _NOEXCEPT {return rend();}
7083e519524SHoward Hinnant
70972c8fad4SMarshall Clow    _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY
7100e9f71c1SHoward Hinnant    bool empty() const _NOEXCEPT {return __tree_.size() == 0;}
71153ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
7120e9f71c1SHoward Hinnant    size_type size() const _NOEXCEPT {return __tree_.size();}
71353ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
7140e9f71c1SHoward Hinnant    size_type max_size() const _NOEXCEPT {return __tree_.max_size();}
7153e519524SHoward Hinnant
7163e519524SHoward Hinnant    // modifiers:
717922940b6SEric Fiselier#ifndef _LIBCPP_CXX03_LANG
7183e519524SHoward Hinnant    template <class... _Args>
71953ec0b4eSHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
7203e519524SHoward Hinnant        pair<iterator, bool> emplace(_Args&&... __args)
721ce48a113SHoward Hinnant            {return __tree_.__emplace_unique(_VSTD::forward<_Args>(__args)...);}
7223e519524SHoward Hinnant    template <class... _Args>
72353ec0b4eSHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
7243e519524SHoward Hinnant        iterator emplace_hint(const_iterator __p, _Args&&... __args)
725ce48a113SHoward Hinnant            {return __tree_.__emplace_hint_unique(__p, _VSTD::forward<_Args>(__args)...);}
726922940b6SEric Fiselier#endif // _LIBCPP_CXX03_LANG
727922940b6SEric Fiselier
72853ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
7293e519524SHoward Hinnant    pair<iterator,bool> insert(const value_type& __v)
7303e519524SHoward Hinnant        {return __tree_.__insert_unique(__v);}
73153ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
7323e519524SHoward Hinnant    iterator insert(const_iterator __p, const value_type& __v)
7333e519524SHoward Hinnant        {return __tree_.__insert_unique(__p, __v);}
734922940b6SEric Fiselier
7353e519524SHoward Hinnant    template <class _InputIterator>
73653ec0b4eSHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
7373e519524SHoward Hinnant        void insert(_InputIterator __f, _InputIterator __l)
7383e519524SHoward Hinnant        {
7393e519524SHoward Hinnant            for (const_iterator __e = cend(); __f != __l; ++__f)
7403e519524SHoward Hinnant                __tree_.__insert_unique(__e, *__f);
7413e519524SHoward Hinnant        }
7423e519524SHoward Hinnant
743922940b6SEric Fiselier#ifndef _LIBCPP_CXX03_LANG
744922940b6SEric Fiselier    _LIBCPP_INLINE_VISIBILITY
745922940b6SEric Fiselier    pair<iterator,bool> insert(value_type&& __v)
746922940b6SEric Fiselier        {return __tree_.__insert_unique(_VSTD::move(__v));}
747922940b6SEric Fiselier
748922940b6SEric Fiselier    _LIBCPP_INLINE_VISIBILITY
749922940b6SEric Fiselier    iterator insert(const_iterator __p, value_type&& __v)
750922940b6SEric Fiselier        {return __tree_.__insert_unique(__p, _VSTD::move(__v));}
751922940b6SEric Fiselier
75253ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
7533e519524SHoward Hinnant    void insert(initializer_list<value_type> __il)
7543e519524SHoward Hinnant        {insert(__il.begin(), __il.end());}
755922940b6SEric Fiselier#endif // _LIBCPP_CXX03_LANG
7563e519524SHoward Hinnant
75753ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
7583e519524SHoward Hinnant    iterator  erase(const_iterator __p) {return __tree_.erase(__p);}
75953ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
7603e519524SHoward Hinnant    size_type erase(const key_type& __k)
7613e519524SHoward Hinnant        {return __tree_.__erase_unique(__k);}
76253ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
7633e519524SHoward Hinnant    iterator  erase(const_iterator __f, const_iterator __l)
7643e519524SHoward Hinnant        {return __tree_.erase(__f, __l);}
76553ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
7660e9f71c1SHoward Hinnant    void clear() _NOEXCEPT {__tree_.clear();}
7673e519524SHoward Hinnant
768b0386a51SErik Pilkington#if _LIBCPP_STD_VER > 14
769b0386a51SErik Pilkington    _LIBCPP_INLINE_VISIBILITY
770b0386a51SErik Pilkington    insert_return_type insert(node_type&& __nh)
771b0386a51SErik Pilkington    {
772b0386a51SErik Pilkington        _LIBCPP_ASSERT(__nh.empty() || __nh.get_allocator() == get_allocator(),
773b0386a51SErik Pilkington            "node_type with incompatible allocator passed to set::insert()");
774b0386a51SErik Pilkington        return __tree_.template __node_handle_insert_unique<
775b0386a51SErik Pilkington            node_type, insert_return_type>(_VSTD::move(__nh));
776b0386a51SErik Pilkington    }
777b0386a51SErik Pilkington    _LIBCPP_INLINE_VISIBILITY
778b0386a51SErik Pilkington    iterator insert(const_iterator __hint, node_type&& __nh)
779b0386a51SErik Pilkington    {
780b0386a51SErik Pilkington        _LIBCPP_ASSERT(__nh.empty() || __nh.get_allocator() == get_allocator(),
781b0386a51SErik Pilkington            "node_type with incompatible allocator passed to set::insert()");
782b0386a51SErik Pilkington        return __tree_.template __node_handle_insert_unique<node_type>(
783b0386a51SErik Pilkington            __hint, _VSTD::move(__nh));
784b0386a51SErik Pilkington    }
785b0386a51SErik Pilkington    _LIBCPP_INLINE_VISIBILITY
786b0386a51SErik Pilkington    node_type extract(key_type const& __key)
787b0386a51SErik Pilkington    {
788b0386a51SErik Pilkington        return __tree_.template __node_handle_extract<node_type>(__key);
789b0386a51SErik Pilkington    }
790b0386a51SErik Pilkington    _LIBCPP_INLINE_VISIBILITY
791b0386a51SErik Pilkington    node_type extract(const_iterator __it)
792b0386a51SErik Pilkington    {
793b0386a51SErik Pilkington        return __tree_.template __node_handle_extract<node_type>(__it);
794b0386a51SErik Pilkington    }
7958df1d5a5SLouis Dionne    template <class _Compare2>
7965c4e07aeSErik Pilkington    _LIBCPP_INLINE_VISIBILITY
7978df1d5a5SLouis Dionne    void merge(set<key_type, _Compare2, allocator_type>& __source)
7985c4e07aeSErik Pilkington    {
7995c4e07aeSErik Pilkington        _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
8005c4e07aeSErik Pilkington                       "merging container with incompatible allocator");
8015c4e07aeSErik Pilkington        __tree_.__node_handle_merge_unique(__source.__tree_);
8025c4e07aeSErik Pilkington    }
8038df1d5a5SLouis Dionne    template <class _Compare2>
8045c4e07aeSErik Pilkington    _LIBCPP_INLINE_VISIBILITY
8058df1d5a5SLouis Dionne    void merge(set<key_type, _Compare2, allocator_type>&& __source)
8065c4e07aeSErik Pilkington    {
8075c4e07aeSErik Pilkington        _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
8085c4e07aeSErik Pilkington                       "merging container with incompatible allocator");
8095c4e07aeSErik Pilkington        __tree_.__node_handle_merge_unique(__source.__tree_);
8105c4e07aeSErik Pilkington    }
8118df1d5a5SLouis Dionne    template <class _Compare2>
8125c4e07aeSErik Pilkington    _LIBCPP_INLINE_VISIBILITY
8138df1d5a5SLouis Dionne    void merge(multiset<key_type, _Compare2, allocator_type>& __source)
8145c4e07aeSErik Pilkington    {
8155c4e07aeSErik Pilkington        _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
8165c4e07aeSErik Pilkington                       "merging container with incompatible allocator");
8175c4e07aeSErik Pilkington        __tree_.__node_handle_merge_unique(__source.__tree_);
8185c4e07aeSErik Pilkington    }
8198df1d5a5SLouis Dionne    template <class _Compare2>
8205c4e07aeSErik Pilkington    _LIBCPP_INLINE_VISIBILITY
8218df1d5a5SLouis Dionne    void merge(multiset<key_type, _Compare2, allocator_type>&& __source)
8225c4e07aeSErik Pilkington    {
8235c4e07aeSErik Pilkington        _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
8245c4e07aeSErik Pilkington                       "merging container with incompatible allocator");
8255c4e07aeSErik Pilkington        __tree_.__node_handle_merge_unique(__source.__tree_);
8265c4e07aeSErik Pilkington    }
827b0386a51SErik Pilkington#endif
828b0386a51SErik Pilkington
82953ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
8300e9f71c1SHoward Hinnant    void swap(set& __s) _NOEXCEPT_(__is_nothrow_swappable<__base>::value)
8310e9f71c1SHoward Hinnant        {__tree_.swap(__s.__tree_);}
8323e519524SHoward Hinnant
83353ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
8340e9f71c1SHoward Hinnant    allocator_type get_allocator() const _NOEXCEPT {return __tree_.__alloc();}
83553ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
8363e519524SHoward Hinnant    key_compare    key_comp()      const {return __tree_.value_comp();}
83753ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
8383e519524SHoward Hinnant    value_compare  value_comp()    const {return __tree_.value_comp();}
8393e519524SHoward Hinnant
8403e519524SHoward Hinnant    // set operations:
84153ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
8423e519524SHoward Hinnant    iterator find(const key_type& __k)             {return __tree_.find(__k);}
84353ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
8443e519524SHoward Hinnant    const_iterator find(const key_type& __k) const {return __tree_.find(__k);}
84525d3402cSMarshall Clow#if _LIBCPP_STD_VER > 11
84625d3402cSMarshall Clow    template <typename _K2>
84725d3402cSMarshall Clow    _LIBCPP_INLINE_VISIBILITY
84825d3402cSMarshall Clow    typename enable_if<__is_transparent<_Compare, _K2>::value,iterator>::type
84925d3402cSMarshall Clow    find(const _K2& __k)                           {return __tree_.find(__k);}
85025d3402cSMarshall Clow    template <typename _K2>
85125d3402cSMarshall Clow    _LIBCPP_INLINE_VISIBILITY
85225d3402cSMarshall Clow    typename enable_if<__is_transparent<_Compare, _K2>::value,const_iterator>::type
85325d3402cSMarshall Clow    find(const _K2& __k) const                     {return __tree_.find(__k);}
85425d3402cSMarshall Clow#endif
85525d3402cSMarshall Clow
85653ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
8573e519524SHoward Hinnant    size_type      count(const key_type& __k) const
8583e519524SHoward Hinnant        {return __tree_.__count_unique(__k);}
8590aacbc92SMarshall Clow#if _LIBCPP_STD_VER > 11
8600aacbc92SMarshall Clow    template <typename _K2>
8610aacbc92SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
8620aacbc92SMarshall Clow    typename enable_if<__is_transparent<_Compare, _K2>::value,size_type>::type
8639bfdb770SEric Fiselier    count(const _K2& __k) const                    {return __tree_.__count_multi(__k);}
8640aacbc92SMarshall Clow#endif
865a17b1aedSZoe Carver
866a17b1aedSZoe Carver#if _LIBCPP_STD_VER > 17
867a17b1aedSZoe Carver    _LIBCPP_INLINE_VISIBILITY
868a17b1aedSZoe Carver    bool contains(const key_type& __k) const {return find(__k) != end();}
8693fca07d7SMarek Kurdej    template <typename _K2>
8703fca07d7SMarek Kurdej    _LIBCPP_INLINE_VISIBILITY
8713fca07d7SMarek Kurdej    typename enable_if<__is_transparent<_Compare, _K2>::value, bool>::type
8723fca07d7SMarek Kurdej    contains(const _K2& __k) const { return find(__k) != end(); }
873a17b1aedSZoe Carver#endif // _LIBCPP_STD_VER > 17
874a17b1aedSZoe Carver
87553ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
8763e519524SHoward Hinnant    iterator lower_bound(const key_type& __k)
8773e519524SHoward Hinnant        {return __tree_.lower_bound(__k);}
87853ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
8793e519524SHoward Hinnant    const_iterator lower_bound(const key_type& __k) const
8803e519524SHoward Hinnant        {return __tree_.lower_bound(__k);}
88125d3402cSMarshall Clow#if _LIBCPP_STD_VER > 11
88225d3402cSMarshall Clow    template <typename _K2>
88325d3402cSMarshall Clow    _LIBCPP_INLINE_VISIBILITY
88425d3402cSMarshall Clow    typename enable_if<__is_transparent<_Compare, _K2>::value,iterator>::type
88525d3402cSMarshall Clow    lower_bound(const _K2& __k)       {return __tree_.lower_bound(__k);}
88625d3402cSMarshall Clow
88725d3402cSMarshall Clow    template <typename _K2>
88825d3402cSMarshall Clow    _LIBCPP_INLINE_VISIBILITY
88925d3402cSMarshall Clow    typename enable_if<__is_transparent<_Compare, _K2>::value,const_iterator>::type
89025d3402cSMarshall Clow    lower_bound(const _K2& __k) const {return __tree_.lower_bound(__k);}
89125d3402cSMarshall Clow#endif
89225d3402cSMarshall Clow
89353ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
8943e519524SHoward Hinnant    iterator upper_bound(const key_type& __k)
8953e519524SHoward Hinnant        {return __tree_.upper_bound(__k);}
89653ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
8973e519524SHoward Hinnant    const_iterator upper_bound(const key_type& __k) const
8983e519524SHoward Hinnant        {return __tree_.upper_bound(__k);}
89925d3402cSMarshall Clow#if _LIBCPP_STD_VER > 11
90025d3402cSMarshall Clow    template <typename _K2>
90125d3402cSMarshall Clow    _LIBCPP_INLINE_VISIBILITY
90225d3402cSMarshall Clow    typename enable_if<__is_transparent<_Compare, _K2>::value,iterator>::type
90325d3402cSMarshall Clow    upper_bound(const _K2& __k)       {return __tree_.upper_bound(__k);}
90425d3402cSMarshall Clow    template <typename _K2>
90525d3402cSMarshall Clow    _LIBCPP_INLINE_VISIBILITY
90625d3402cSMarshall Clow    typename enable_if<__is_transparent<_Compare, _K2>::value,const_iterator>::type
90725d3402cSMarshall Clow    upper_bound(const _K2& __k) const {return __tree_.upper_bound(__k);}
90825d3402cSMarshall Clow#endif
90925d3402cSMarshall Clow
91053ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
9113e519524SHoward Hinnant    pair<iterator,iterator> equal_range(const key_type& __k)
9123e519524SHoward Hinnant        {return __tree_.__equal_range_unique(__k);}
91353ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
9143e519524SHoward Hinnant    pair<const_iterator,const_iterator> equal_range(const key_type& __k) const
9153e519524SHoward Hinnant        {return __tree_.__equal_range_unique(__k);}
91625d3402cSMarshall Clow#if _LIBCPP_STD_VER > 11
91725d3402cSMarshall Clow    template <typename _K2>
91825d3402cSMarshall Clow    _LIBCPP_INLINE_VISIBILITY
91925d3402cSMarshall Clow    typename enable_if<__is_transparent<_Compare, _K2>::value,pair<iterator,iterator>>::type
9209bfdb770SEric Fiselier    equal_range(const _K2& __k)       {return __tree_.__equal_range_multi(__k);}
92125d3402cSMarshall Clow    template <typename _K2>
92225d3402cSMarshall Clow    _LIBCPP_INLINE_VISIBILITY
92325d3402cSMarshall Clow    typename enable_if<__is_transparent<_Compare, _K2>::value,pair<const_iterator,const_iterator>>::type
9249bfdb770SEric Fiselier    equal_range(const _K2& __k) const {return __tree_.__equal_range_multi(__k);}
92525d3402cSMarshall Clow#endif
9263e519524SHoward Hinnant};
9273e519524SHoward Hinnant
92801666904SLouis Dionne#if _LIBCPP_STD_VER >= 17
929e20865c3SLouis Dionnetemplate<class _InputIterator,
930199d2ebeSArthur O'Dwyer         class _Compare = less<__iter_value_type<_InputIterator>>,
931199d2ebeSArthur O'Dwyer         class _Allocator = allocator<__iter_value_type<_InputIterator>>,
93268072a71SKonstantin Varlamov         class = enable_if_t<__is_cpp17_input_iterator<_InputIterator>::value, void>,
9334e0ea2cfSLouis Dionne         class = enable_if_t<__is_allocator<_Allocator>::value, void>,
9344e0ea2cfSLouis Dionne         class = enable_if_t<!__is_allocator<_Compare>::value, void>>
935e20865c3SLouis Dionneset(_InputIterator, _InputIterator, _Compare = _Compare(), _Allocator = _Allocator())
936199d2ebeSArthur O'Dwyer  -> set<__iter_value_type<_InputIterator>, _Compare, _Allocator>;
937e20865c3SLouis Dionne
938e20865c3SLouis Dionnetemplate<class _Key, class _Compare = less<_Key>,
939e20865c3SLouis Dionne         class _Allocator = allocator<_Key>,
94068072a71SKonstantin Varlamov         class = enable_if_t<!__is_allocator<_Compare>::value, void>,
94168072a71SKonstantin Varlamov         class = enable_if_t<__is_allocator<_Allocator>::value, void>>
942e20865c3SLouis Dionneset(initializer_list<_Key>, _Compare = _Compare(), _Allocator = _Allocator())
943e20865c3SLouis Dionne  -> set<_Key, _Compare, _Allocator>;
944e20865c3SLouis Dionne
945e20865c3SLouis Dionnetemplate<class _InputIterator, class _Allocator,
94668072a71SKonstantin Varlamov         class = enable_if_t<__is_cpp17_input_iterator<_InputIterator>::value, void>,
9474e0ea2cfSLouis Dionne         class = enable_if_t<__is_allocator<_Allocator>::value, void>>
948e20865c3SLouis Dionneset(_InputIterator, _InputIterator, _Allocator)
949199d2ebeSArthur O'Dwyer  -> set<__iter_value_type<_InputIterator>,
950199d2ebeSArthur O'Dwyer         less<__iter_value_type<_InputIterator>>, _Allocator>;
951e20865c3SLouis Dionne
952e20865c3SLouis Dionnetemplate<class _Key, class _Allocator,
9534e0ea2cfSLouis Dionne         class = enable_if_t<__is_allocator<_Allocator>::value, void>>
954e20865c3SLouis Dionneset(initializer_list<_Key>, _Allocator)
955e20865c3SLouis Dionne  -> set<_Key, less<_Key>, _Allocator>;
956e20865c3SLouis Dionne#endif
957e20865c3SLouis Dionne
958922940b6SEric Fiselier#ifndef _LIBCPP_CXX03_LANG
9593e519524SHoward Hinnant
9603e519524SHoward Hinnanttemplate <class _Key, class _Compare, class _Allocator>
9613e519524SHoward Hinnantset<_Key, _Compare, _Allocator>::set(set&& __s, const allocator_type& __a)
962ce48a113SHoward Hinnant    : __tree_(_VSTD::move(__s.__tree_), __a)
9633e519524SHoward Hinnant{
9643e519524SHoward Hinnant    if (__a != __s.get_allocator())
9653e519524SHoward Hinnant    {
9663e519524SHoward Hinnant        const_iterator __e = cend();
9673e519524SHoward Hinnant        while (!__s.empty())
968ce48a113SHoward Hinnant            insert(__e, _VSTD::move(__s.__tree_.remove(__s.begin())->__value_));
9693e519524SHoward Hinnant    }
9703e519524SHoward Hinnant}
9713e519524SHoward Hinnant
972922940b6SEric Fiselier#endif // _LIBCPP_CXX03_LANG
9733e519524SHoward Hinnant
9743e519524SHoward Hinnanttemplate <class _Key, class _Compare, class _Allocator>
97553ec0b4eSHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
9763e519524SHoward Hinnantbool
9773e519524SHoward Hinnantoperator==(const set<_Key, _Compare, _Allocator>& __x,
9783e519524SHoward Hinnant           const set<_Key, _Compare, _Allocator>& __y)
9793e519524SHoward Hinnant{
980ce48a113SHoward Hinnant    return __x.size() == __y.size() && _VSTD::equal(__x.begin(), __x.end(), __y.begin());
9813e519524SHoward Hinnant}
9823e519524SHoward Hinnant
9833e519524SHoward Hinnanttemplate <class _Key, class _Compare, class _Allocator>
98453ec0b4eSHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
9853e519524SHoward Hinnantbool
9863e519524SHoward Hinnantoperator< (const set<_Key, _Compare, _Allocator>& __x,
9873e519524SHoward Hinnant           const set<_Key, _Compare, _Allocator>& __y)
9883e519524SHoward Hinnant{
989ce48a113SHoward Hinnant    return _VSTD::lexicographical_compare(__x.begin(), __x.end(), __y.begin(), __y.end());
9903e519524SHoward Hinnant}
9913e519524SHoward Hinnant
9923e519524SHoward Hinnanttemplate <class _Key, class _Compare, class _Allocator>
99353ec0b4eSHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
9943e519524SHoward Hinnantbool
9953e519524SHoward Hinnantoperator!=(const set<_Key, _Compare, _Allocator>& __x,
9963e519524SHoward Hinnant           const set<_Key, _Compare, _Allocator>& __y)
9973e519524SHoward Hinnant{
9983e519524SHoward Hinnant    return !(__x == __y);
9993e519524SHoward Hinnant}
10003e519524SHoward Hinnant
10013e519524SHoward Hinnanttemplate <class _Key, class _Compare, class _Allocator>
100253ec0b4eSHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
10033e519524SHoward Hinnantbool
10043e519524SHoward Hinnantoperator> (const set<_Key, _Compare, _Allocator>& __x,
10053e519524SHoward Hinnant           const set<_Key, _Compare, _Allocator>& __y)
10063e519524SHoward Hinnant{
10073e519524SHoward Hinnant    return __y < __x;
10083e519524SHoward Hinnant}
10093e519524SHoward Hinnant
10103e519524SHoward Hinnanttemplate <class _Key, class _Compare, class _Allocator>
101153ec0b4eSHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
10123e519524SHoward Hinnantbool
10133e519524SHoward Hinnantoperator>=(const set<_Key, _Compare, _Allocator>& __x,
10143e519524SHoward Hinnant           const set<_Key, _Compare, _Allocator>& __y)
10153e519524SHoward Hinnant{
10163e519524SHoward Hinnant    return !(__x < __y);
10173e519524SHoward Hinnant}
10183e519524SHoward Hinnant
10193e519524SHoward Hinnanttemplate <class _Key, class _Compare, class _Allocator>
102053ec0b4eSHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
10213e519524SHoward Hinnantbool
10223e519524SHoward Hinnantoperator<=(const set<_Key, _Compare, _Allocator>& __x,
10233e519524SHoward Hinnant           const set<_Key, _Compare, _Allocator>& __y)
10243e519524SHoward Hinnant{
10253e519524SHoward Hinnant    return !(__y < __x);
10263e519524SHoward Hinnant}
10273e519524SHoward Hinnant
10283e519524SHoward Hinnant// specialized algorithms:
10293e519524SHoward Hinnanttemplate <class _Key, class _Compare, class _Allocator>
103053ec0b4eSHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
10313e519524SHoward Hinnantvoid
10323e519524SHoward Hinnantswap(set<_Key, _Compare, _Allocator>& __x,
10333e519524SHoward Hinnant     set<_Key, _Compare, _Allocator>& __y)
10340e9f71c1SHoward Hinnant    _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
10353e519524SHoward Hinnant{
10363e519524SHoward Hinnant    __x.swap(__y);
10373e519524SHoward Hinnant}
10383e519524SHoward Hinnant
1039f60c63c0SMarshall Clow#if _LIBCPP_STD_VER > 17
1040f60c63c0SMarshall Clowtemplate <class _Key, class _Compare, class _Allocator, class _Predicate>
1041f60c63c0SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY
10423e895085SMarek Kurdej    typename set<_Key, _Compare, _Allocator>::size_type
10433e895085SMarek Kurdej    erase_if(set<_Key, _Compare, _Allocator>& __c, _Predicate __pred) {
10442ac6babcSArthur O'Dwyer  return _VSTD::__libcpp_erase_if_container(__c, __pred);
10453e895085SMarek Kurdej}
1046f60c63c0SMarshall Clow#endif
1047f60c63c0SMarshall Clow
10483e519524SHoward Hinnanttemplate <class _Key, class _Compare = less<_Key>,
10493e519524SHoward Hinnant          class _Allocator = allocator<_Key> >
1050e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS multiset
10513e519524SHoward Hinnant{
10523e519524SHoward Hinnantpublic:
10533e519524SHoward Hinnant    // types:
10543e519524SHoward Hinnant    typedef _Key                                     key_type;
10553e519524SHoward Hinnant    typedef key_type                                 value_type;
10563c6bd176SNikolas Klauser    typedef __type_identity_t<_Compare>              key_compare;
10573e519524SHoward Hinnant    typedef key_compare                              value_compare;
10583c6bd176SNikolas Klauser    typedef __type_identity_t<_Allocator>            allocator_type;
10593e519524SHoward Hinnant    typedef value_type&                              reference;
10603e519524SHoward Hinnant    typedef const value_type&                        const_reference;
10613e519524SHoward Hinnant
106294f89aeeSMarshall Clow    static_assert((is_same<typename allocator_type::value_type, value_type>::value),
106394f89aeeSMarshall Clow                  "Allocator::value_type must be same type as value_type");
106494f89aeeSMarshall Clow
10653e519524SHoward Hinnantprivate:
10663e519524SHoward Hinnant    typedef __tree<value_type, value_compare, allocator_type> __base;
10673e519524SHoward Hinnant    typedef allocator_traits<allocator_type>                  __alloc_traits;
10683e519524SHoward Hinnant
10693e519524SHoward Hinnant    __base __tree_;
10703e519524SHoward Hinnant
10713e519524SHoward Hinnantpublic:
10723e519524SHoward Hinnant    typedef typename __base::pointer               pointer;
10733e519524SHoward Hinnant    typedef typename __base::const_pointer         const_pointer;
10743e519524SHoward Hinnant    typedef typename __base::size_type             size_type;
10753e519524SHoward Hinnant    typedef typename __base::difference_type       difference_type;
10763e519524SHoward Hinnant    typedef typename __base::const_iterator        iterator;
10773e519524SHoward Hinnant    typedef typename __base::const_iterator        const_iterator;
1078ce48a113SHoward Hinnant    typedef _VSTD::reverse_iterator<iterator>       reverse_iterator;
1079ce48a113SHoward Hinnant    typedef _VSTD::reverse_iterator<const_iterator> const_reverse_iterator;
10803e519524SHoward Hinnant
1081b0386a51SErik Pilkington#if _LIBCPP_STD_VER > 14
1082b0386a51SErik Pilkington    typedef __set_node_handle<typename __base::__node, allocator_type> node_type;
1083b0386a51SErik Pilkington#endif
1084b0386a51SErik Pilkington
10855c4e07aeSErik Pilkington    template <class _Key2, class _Compare2, class _Alloc2>
10865c4e07aeSErik Pilkington        friend class _LIBCPP_TEMPLATE_VIS set;
10875c4e07aeSErik Pilkington    template <class _Key2, class _Compare2, class _Alloc2>
10885c4e07aeSErik Pilkington        friend class _LIBCPP_TEMPLATE_VIS multiset;
10895c4e07aeSErik Pilkington
10903e519524SHoward Hinnant    // construct/copy/destroy:
109153ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
1092415a24e4SMarshall Clow    multiset()
1093415a24e4SMarshall Clow        _NOEXCEPT_(
1094415a24e4SMarshall Clow            is_nothrow_default_constructible<allocator_type>::value &&
1095415a24e4SMarshall Clow            is_nothrow_default_constructible<key_compare>::value &&
1096415a24e4SMarshall Clow            is_nothrow_copy_constructible<key_compare>::value)
1097415a24e4SMarshall Clow        : __tree_(value_compare()) {}
1098415a24e4SMarshall Clow
1099415a24e4SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
1100415a24e4SMarshall Clow    explicit multiset(const value_compare& __comp)
11010e9f71c1SHoward Hinnant        _NOEXCEPT_(
11020e9f71c1SHoward Hinnant            is_nothrow_default_constructible<allocator_type>::value &&
11030e9f71c1SHoward Hinnant            is_nothrow_copy_constructible<key_compare>::value)
11043e519524SHoward Hinnant        : __tree_(__comp) {}
1105415a24e4SMarshall Clow
110653ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
110778a87e8aSMarshall Clow    explicit multiset(const value_compare& __comp, const allocator_type& __a)
11083e519524SHoward Hinnant        : __tree_(__comp, __a) {}
11093e519524SHoward Hinnant    template <class _InputIterator>
111053ec0b4eSHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
11113e519524SHoward Hinnant        multiset(_InputIterator __f, _InputIterator __l,
11123e519524SHoward Hinnant                 const value_compare& __comp = value_compare())
11133e519524SHoward Hinnant        : __tree_(__comp)
11143e519524SHoward Hinnant        {
11153e519524SHoward Hinnant            insert(__f, __l);
11163e519524SHoward Hinnant        }
11173e519524SHoward Hinnant
11180a55d17bSMarshall Clow#if _LIBCPP_STD_VER > 11
11190a55d17bSMarshall Clow        template <class _InputIterator>
11200a55d17bSMarshall Clow        _LIBCPP_INLINE_VISIBILITY
11210a55d17bSMarshall Clow        multiset(_InputIterator __f, _InputIterator __l, const allocator_type& __a)
11220a55d17bSMarshall Clow            : multiset(__f, __l, key_compare(), __a) {}
11230a55d17bSMarshall Clow#endif
11240a55d17bSMarshall Clow
11253e519524SHoward Hinnant    template <class _InputIterator>
112653ec0b4eSHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
11273e519524SHoward Hinnant        multiset(_InputIterator __f, _InputIterator __l,
11283e519524SHoward Hinnant                 const value_compare& __comp, const allocator_type& __a)
11293e519524SHoward Hinnant        : __tree_(__comp, __a)
11303e519524SHoward Hinnant        {
11313e519524SHoward Hinnant            insert(__f, __l);
11323e519524SHoward Hinnant        }
11333e519524SHoward Hinnant
113453ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11353e519524SHoward Hinnant    multiset(const multiset& __s)
11363e519524SHoward Hinnant        : __tree_(__s.__tree_.value_comp(),
11373e519524SHoward Hinnant          __alloc_traits::select_on_container_copy_construction(__s.__tree_.__alloc()))
11383e519524SHoward Hinnant        {
11393e519524SHoward Hinnant            insert(__s.begin(), __s.end());
11403e519524SHoward Hinnant        }
11413e519524SHoward Hinnant
11425a33687dSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11435a33687dSHoward Hinnant    multiset& operator=(const multiset& __s)
11445a33687dSHoward Hinnant        {
11455a33687dSHoward Hinnant            __tree_ = __s.__tree_;
11465a33687dSHoward Hinnant            return *this;
11475a33687dSHoward Hinnant        }
11485a33687dSHoward Hinnant
1149922940b6SEric Fiselier#ifndef _LIBCPP_CXX03_LANG
115053ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11513e519524SHoward Hinnant    multiset(multiset&& __s)
11520e9f71c1SHoward Hinnant        _NOEXCEPT_(is_nothrow_move_constructible<__base>::value)
1153ce48a113SHoward Hinnant        : __tree_(_VSTD::move(__s.__tree_)) {}
1154922940b6SEric Fiselier
1155922940b6SEric Fiselier    multiset(multiset&& __s, const allocator_type& __a);
1156922940b6SEric Fiselier#endif // _LIBCPP_CXX03_LANG
115753ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11583e519524SHoward Hinnant    explicit multiset(const allocator_type& __a)
11593e519524SHoward Hinnant        : __tree_(__a) {}
116053ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11613e519524SHoward Hinnant    multiset(const multiset& __s, const allocator_type& __a)
11623e519524SHoward Hinnant        : __tree_(__s.__tree_.value_comp(), __a)
11633e519524SHoward Hinnant        {
11643e519524SHoward Hinnant            insert(__s.begin(), __s.end());
11653e519524SHoward Hinnant        }
11663e519524SHoward Hinnant
1167922940b6SEric Fiselier#ifndef _LIBCPP_CXX03_LANG
116853ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11693e519524SHoward Hinnant    multiset(initializer_list<value_type> __il, const value_compare& __comp = value_compare())
11703e519524SHoward Hinnant        : __tree_(__comp)
11713e519524SHoward Hinnant        {
11723e519524SHoward Hinnant            insert(__il.begin(), __il.end());
11733e519524SHoward Hinnant        }
11743e519524SHoward Hinnant
117553ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11763e519524SHoward Hinnant    multiset(initializer_list<value_type> __il, const value_compare& __comp,
11773e519524SHoward Hinnant        const allocator_type& __a)
11783e519524SHoward Hinnant        : __tree_(__comp, __a)
11793e519524SHoward Hinnant        {
11803e519524SHoward Hinnant            insert(__il.begin(), __il.end());
11813e519524SHoward Hinnant        }
11823e519524SHoward Hinnant
11830a55d17bSMarshall Clow#if _LIBCPP_STD_VER > 11
11840a55d17bSMarshall Clow    _LIBCPP_INLINE_VISIBILITY
11850a55d17bSMarshall Clow    multiset(initializer_list<value_type> __il, const allocator_type& __a)
11860a55d17bSMarshall Clow        : multiset(__il, key_compare(), __a) {}
11870a55d17bSMarshall Clow#endif
11880a55d17bSMarshall Clow
118953ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11903e519524SHoward Hinnant    multiset& operator=(initializer_list<value_type> __il)
11913e519524SHoward Hinnant        {
11923e519524SHoward Hinnant            __tree_.__assign_multi(__il.begin(), __il.end());
11933e519524SHoward Hinnant            return *this;
11943e519524SHoward Hinnant        }
11953e519524SHoward Hinnant
119653ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11973e519524SHoward Hinnant    multiset& operator=(multiset&& __s)
11980e9f71c1SHoward Hinnant        _NOEXCEPT_(is_nothrow_move_assignable<__base>::value)
11993e519524SHoward Hinnant        {
1200ce48a113SHoward Hinnant            __tree_ = _VSTD::move(__s.__tree_);
12013e519524SHoward Hinnant            return *this;
12023e519524SHoward Hinnant        }
1203922940b6SEric Fiselier#endif // _LIBCPP_CXX03_LANG
12043e519524SHoward Hinnant
120553ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
12067c142fccSLouis Dionne    ~multiset() {
12077c142fccSLouis Dionne        static_assert(sizeof(__diagnose_non_const_comparator<_Key, _Compare>()), "");
12087c142fccSLouis Dionne    }
12097c142fccSLouis Dionne
12107c142fccSLouis Dionne    _LIBCPP_INLINE_VISIBILITY
12110e9f71c1SHoward Hinnant          iterator begin() _NOEXCEPT       {return __tree_.begin();}
121253ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
12130e9f71c1SHoward Hinnant    const_iterator begin() const _NOEXCEPT {return __tree_.begin();}
121453ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
12150e9f71c1SHoward Hinnant          iterator end() _NOEXCEPT         {return __tree_.end();}
121653ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
12170e9f71c1SHoward Hinnant    const_iterator end()   const _NOEXCEPT {return __tree_.end();}
12183e519524SHoward Hinnant
121953ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
12200e9f71c1SHoward Hinnant          reverse_iterator rbegin() _NOEXCEPT
12210e9f71c1SHoward Hinnant            {return reverse_iterator(end());}
122253ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
12230e9f71c1SHoward Hinnant    const_reverse_iterator rbegin() const _NOEXCEPT
12240e9f71c1SHoward Hinnant        {return const_reverse_iterator(end());}
122553ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
12260e9f71c1SHoward Hinnant          reverse_iterator rend() _NOEXCEPT
12270e9f71c1SHoward Hinnant            {return       reverse_iterator(begin());}
122853ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
12290e9f71c1SHoward Hinnant    const_reverse_iterator rend() const _NOEXCEPT
12300e9f71c1SHoward Hinnant        {return const_reverse_iterator(begin());}
12313e519524SHoward Hinnant
123253ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
12330e9f71c1SHoward Hinnant    const_iterator cbegin()  const _NOEXCEPT {return begin();}
123453ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
12350e9f71c1SHoward Hinnant    const_iterator cend() const _NOEXCEPT {return end();}
123653ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
12370e9f71c1SHoward Hinnant    const_reverse_iterator crbegin() const _NOEXCEPT {return rbegin();}
123853ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
12390e9f71c1SHoward Hinnant    const_reverse_iterator crend() const _NOEXCEPT {return rend();}
12403e519524SHoward Hinnant
124172c8fad4SMarshall Clow    _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY
12420e9f71c1SHoward Hinnant    bool empty() const _NOEXCEPT {return __tree_.size() == 0;}
124353ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
12440e9f71c1SHoward Hinnant    size_type size() const _NOEXCEPT {return __tree_.size();}
124553ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
12460e9f71c1SHoward Hinnant    size_type max_size() const _NOEXCEPT {return __tree_.max_size();}
12473e519524SHoward Hinnant
12483e519524SHoward Hinnant    // modifiers:
1249922940b6SEric Fiselier#ifndef _LIBCPP_CXX03_LANG
12503e519524SHoward Hinnant    template <class... _Args>
125153ec0b4eSHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
12523e519524SHoward Hinnant        iterator emplace(_Args&&... __args)
1253ce48a113SHoward Hinnant            {return __tree_.__emplace_multi(_VSTD::forward<_Args>(__args)...);}
12543e519524SHoward Hinnant    template <class... _Args>
125553ec0b4eSHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
12563e519524SHoward Hinnant        iterator emplace_hint(const_iterator __p, _Args&&... __args)
1257ce48a113SHoward Hinnant            {return __tree_.__emplace_hint_multi(__p, _VSTD::forward<_Args>(__args)...);}
1258922940b6SEric Fiselier#endif // _LIBCPP_CXX03_LANG
1259922940b6SEric Fiselier
126053ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
12613e519524SHoward Hinnant    iterator insert(const value_type& __v)
12623e519524SHoward Hinnant        {return __tree_.__insert_multi(__v);}
126353ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
12643e519524SHoward Hinnant    iterator insert(const_iterator __p, const value_type& __v)
12653e519524SHoward Hinnant        {return __tree_.__insert_multi(__p, __v);}
1266922940b6SEric Fiselier
12673e519524SHoward Hinnant    template <class _InputIterator>
126853ec0b4eSHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
12693e519524SHoward Hinnant        void insert(_InputIterator __f, _InputIterator __l)
12703e519524SHoward Hinnant        {
12713e519524SHoward Hinnant            for (const_iterator __e = cend(); __f != __l; ++__f)
12723e519524SHoward Hinnant                __tree_.__insert_multi(__e, *__f);
12733e519524SHoward Hinnant        }
12743e519524SHoward Hinnant
1275922940b6SEric Fiselier#ifndef _LIBCPP_CXX03_LANG
1276922940b6SEric Fiselier    _LIBCPP_INLINE_VISIBILITY
1277922940b6SEric Fiselier    iterator insert(value_type&& __v)
1278922940b6SEric Fiselier        {return __tree_.__insert_multi(_VSTD::move(__v));}
1279922940b6SEric Fiselier
1280922940b6SEric Fiselier    _LIBCPP_INLINE_VISIBILITY
1281922940b6SEric Fiselier    iterator insert(const_iterator __p, value_type&& __v)
1282922940b6SEric Fiselier        {return __tree_.__insert_multi(__p, _VSTD::move(__v));}
1283922940b6SEric Fiselier
128453ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
12853e519524SHoward Hinnant    void insert(initializer_list<value_type> __il)
12863e519524SHoward Hinnant        {insert(__il.begin(), __il.end());}
1287922940b6SEric Fiselier#endif // _LIBCPP_CXX03_LANG
12883e519524SHoward Hinnant
128953ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
12903e519524SHoward Hinnant    iterator  erase(const_iterator __p) {return __tree_.erase(__p);}
129153ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
12923e519524SHoward Hinnant    size_type erase(const key_type& __k) {return __tree_.__erase_multi(__k);}
129353ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
12943e519524SHoward Hinnant    iterator  erase(const_iterator __f, const_iterator __l)
12953e519524SHoward Hinnant        {return __tree_.erase(__f, __l);}
129653ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
12970e9f71c1SHoward Hinnant    void clear() _NOEXCEPT {__tree_.clear();}
12983e519524SHoward Hinnant
1299b0386a51SErik Pilkington#if _LIBCPP_STD_VER > 14
1300b0386a51SErik Pilkington    _LIBCPP_INLINE_VISIBILITY
1301b0386a51SErik Pilkington    iterator insert(node_type&& __nh)
1302b0386a51SErik Pilkington    {
1303b0386a51SErik Pilkington        _LIBCPP_ASSERT(__nh.empty() || __nh.get_allocator() == get_allocator(),
1304b0386a51SErik Pilkington            "node_type with incompatible allocator passed to multiset::insert()");
1305b0386a51SErik Pilkington        return __tree_.template __node_handle_insert_multi<node_type>(
1306b0386a51SErik Pilkington            _VSTD::move(__nh));
1307b0386a51SErik Pilkington    }
1308b0386a51SErik Pilkington    _LIBCPP_INLINE_VISIBILITY
1309b0386a51SErik Pilkington    iterator insert(const_iterator __hint, node_type&& __nh)
1310b0386a51SErik Pilkington    {
1311b0386a51SErik Pilkington        _LIBCPP_ASSERT(__nh.empty() || __nh.get_allocator() == get_allocator(),
1312b0386a51SErik Pilkington            "node_type with incompatible allocator passed to multiset::insert()");
1313b0386a51SErik Pilkington        return __tree_.template __node_handle_insert_multi<node_type>(
1314b0386a51SErik Pilkington            __hint, _VSTD::move(__nh));
1315b0386a51SErik Pilkington    }
1316b0386a51SErik Pilkington    _LIBCPP_INLINE_VISIBILITY
1317b0386a51SErik Pilkington    node_type extract(key_type const& __key)
1318b0386a51SErik Pilkington    {
1319b0386a51SErik Pilkington        return __tree_.template __node_handle_extract<node_type>(__key);
1320b0386a51SErik Pilkington    }
1321b0386a51SErik Pilkington    _LIBCPP_INLINE_VISIBILITY
1322b0386a51SErik Pilkington    node_type extract(const_iterator __it)
1323b0386a51SErik Pilkington    {
1324b0386a51SErik Pilkington        return __tree_.template __node_handle_extract<node_type>(__it);
1325b0386a51SErik Pilkington    }
13268df1d5a5SLouis Dionne    template <class _Compare2>
13275c4e07aeSErik Pilkington    _LIBCPP_INLINE_VISIBILITY
13288df1d5a5SLouis Dionne    void merge(multiset<key_type, _Compare2, allocator_type>& __source)
13295c4e07aeSErik Pilkington    {
13305c4e07aeSErik Pilkington        _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
13315c4e07aeSErik Pilkington                       "merging container with incompatible allocator");
13325c4e07aeSErik Pilkington        __tree_.__node_handle_merge_multi(__source.__tree_);
13335c4e07aeSErik Pilkington    }
13348df1d5a5SLouis Dionne    template <class _Compare2>
13355c4e07aeSErik Pilkington    _LIBCPP_INLINE_VISIBILITY
13368df1d5a5SLouis Dionne    void merge(multiset<key_type, _Compare2, allocator_type>&& __source)
13375c4e07aeSErik Pilkington    {
13385c4e07aeSErik Pilkington        _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
13395c4e07aeSErik Pilkington                       "merging container with incompatible allocator");
13405c4e07aeSErik Pilkington        __tree_.__node_handle_merge_multi(__source.__tree_);
13415c4e07aeSErik Pilkington    }
13428df1d5a5SLouis Dionne    template <class _Compare2>
13435c4e07aeSErik Pilkington    _LIBCPP_INLINE_VISIBILITY
13448df1d5a5SLouis Dionne    void merge(set<key_type, _Compare2, allocator_type>& __source)
13455c4e07aeSErik Pilkington    {
13465c4e07aeSErik Pilkington        _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
13475c4e07aeSErik Pilkington                       "merging container with incompatible allocator");
13485c4e07aeSErik Pilkington        __tree_.__node_handle_merge_multi(__source.__tree_);
13495c4e07aeSErik Pilkington    }
13508df1d5a5SLouis Dionne    template <class _Compare2>
13515c4e07aeSErik Pilkington    _LIBCPP_INLINE_VISIBILITY
13528df1d5a5SLouis Dionne    void merge(set<key_type, _Compare2, allocator_type>&& __source)
13535c4e07aeSErik Pilkington    {
13545c4e07aeSErik Pilkington        _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
13555c4e07aeSErik Pilkington                       "merging container with incompatible allocator");
13565c4e07aeSErik Pilkington        __tree_.__node_handle_merge_multi(__source.__tree_);
13575c4e07aeSErik Pilkington    }
1358b0386a51SErik Pilkington#endif
1359b0386a51SErik Pilkington
136053ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
13610e9f71c1SHoward Hinnant    void swap(multiset& __s)
13620e9f71c1SHoward Hinnant        _NOEXCEPT_(__is_nothrow_swappable<__base>::value)
13630e9f71c1SHoward Hinnant        {__tree_.swap(__s.__tree_);}
13643e519524SHoward Hinnant
136553ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
13660e9f71c1SHoward Hinnant    allocator_type get_allocator() const _NOEXCEPT {return __tree_.__alloc();}
136753ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
13683e519524SHoward Hinnant    key_compare    key_comp()      const {return __tree_.value_comp();}
136953ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
13703e519524SHoward Hinnant    value_compare  value_comp()    const {return __tree_.value_comp();}
13713e519524SHoward Hinnant
13723e519524SHoward Hinnant    // set operations:
137353ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
13743e519524SHoward Hinnant    iterator find(const key_type& __k)             {return __tree_.find(__k);}
137553ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
13763e519524SHoward Hinnant    const_iterator find(const key_type& __k) const {return __tree_.find(__k);}
137725d3402cSMarshall Clow#if _LIBCPP_STD_VER > 11
137825d3402cSMarshall Clow    template <typename _K2>
137925d3402cSMarshall Clow    _LIBCPP_INLINE_VISIBILITY
1380cfef7c91SMark de Wever    typename enable_if<__is_transparent<_Compare, _K2>::value,iterator>::type
138125d3402cSMarshall Clow    find(const _K2& __k)                           {return __tree_.find(__k);}
138225d3402cSMarshall Clow    template <typename _K2>
138325d3402cSMarshall Clow    _LIBCPP_INLINE_VISIBILITY
1384cfef7c91SMark de Wever    typename enable_if<__is_transparent<_Compare, _K2>::value,const_iterator>::type
138525d3402cSMarshall Clow    find(const _K2& __k) const                     {return __tree_.find(__k);}
138625d3402cSMarshall Clow#endif
138725d3402cSMarshall Clow
138853ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
13893e519524SHoward Hinnant    size_type      count(const key_type& __k) const
13903e519524SHoward Hinnant        {return __tree_.__count_multi(__k);}
13910aacbc92SMarshall Clow#if _LIBCPP_STD_VER > 11
13920aacbc92SMarshall Clow    template <typename _K2>
13930aacbc92SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
13940aacbc92SMarshall Clow    typename enable_if<__is_transparent<_Compare, _K2>::value,size_type>::type
1395464de6caSMarshall Clow    count(const _K2& __k) const            {return __tree_.__count_multi(__k);}
13960aacbc92SMarshall Clow#endif
139725d3402cSMarshall Clow
1398a17b1aedSZoe Carver#if _LIBCPP_STD_VER > 17
1399a17b1aedSZoe Carver    _LIBCPP_INLINE_VISIBILITY
1400a17b1aedSZoe Carver    bool contains(const key_type& __k) const {return find(__k) != end();}
14013fca07d7SMarek Kurdej    template <typename _K2>
14023fca07d7SMarek Kurdej    _LIBCPP_INLINE_VISIBILITY
14033fca07d7SMarek Kurdej    typename enable_if<__is_transparent<_Compare, _K2>::value, bool>::type
14043fca07d7SMarek Kurdej    contains(const _K2& __k) const { return find(__k) != end(); }
1405a17b1aedSZoe Carver#endif // _LIBCPP_STD_VER > 17
1406a17b1aedSZoe Carver
140753ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
14083e519524SHoward Hinnant    iterator lower_bound(const key_type& __k)
14093e519524SHoward Hinnant        {return __tree_.lower_bound(__k);}
141053ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
14113e519524SHoward Hinnant    const_iterator lower_bound(const key_type& __k) const
14123e519524SHoward Hinnant            {return __tree_.lower_bound(__k);}
141325d3402cSMarshall Clow#if _LIBCPP_STD_VER > 11
141425d3402cSMarshall Clow    template <typename _K2>
141525d3402cSMarshall Clow    _LIBCPP_INLINE_VISIBILITY
1416cfef7c91SMark de Wever    typename enable_if<__is_transparent<_Compare, _K2>::value,iterator>::type
141725d3402cSMarshall Clow    lower_bound(const _K2& __k)       {return __tree_.lower_bound(__k);}
141825d3402cSMarshall Clow
141925d3402cSMarshall Clow    template <typename _K2>
142025d3402cSMarshall Clow    _LIBCPP_INLINE_VISIBILITY
1421cfef7c91SMark de Wever    typename enable_if<__is_transparent<_Compare, _K2>::value,const_iterator>::type
142225d3402cSMarshall Clow    lower_bound(const _K2& __k) const {return __tree_.lower_bound(__k);}
142325d3402cSMarshall Clow#endif
142425d3402cSMarshall Clow
142553ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
14263e519524SHoward Hinnant    iterator upper_bound(const key_type& __k)
14273e519524SHoward Hinnant            {return __tree_.upper_bound(__k);}
142853ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
14293e519524SHoward Hinnant    const_iterator upper_bound(const key_type& __k) const
14303e519524SHoward Hinnant            {return __tree_.upper_bound(__k);}
143125d3402cSMarshall Clow#if _LIBCPP_STD_VER > 11
143225d3402cSMarshall Clow    template <typename _K2>
143325d3402cSMarshall Clow    _LIBCPP_INLINE_VISIBILITY
1434cfef7c91SMark de Wever    typename enable_if<__is_transparent<_Compare, _K2>::value,iterator>::type
143525d3402cSMarshall Clow    upper_bound(const _K2& __k)       {return __tree_.upper_bound(__k);}
143625d3402cSMarshall Clow    template <typename _K2>
143725d3402cSMarshall Clow    _LIBCPP_INLINE_VISIBILITY
1438cfef7c91SMark de Wever    typename enable_if<__is_transparent<_Compare, _K2>::value,const_iterator>::type
143925d3402cSMarshall Clow    upper_bound(const _K2& __k) const {return __tree_.upper_bound(__k);}
144025d3402cSMarshall Clow#endif
144125d3402cSMarshall Clow
144253ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
14433e519524SHoward Hinnant    pair<iterator,iterator>             equal_range(const key_type& __k)
14443e519524SHoward Hinnant            {return __tree_.__equal_range_multi(__k);}
144553ec0b4eSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
14463e519524SHoward Hinnant    pair<const_iterator,const_iterator> equal_range(const key_type& __k) const
14473e519524SHoward Hinnant            {return __tree_.__equal_range_multi(__k);}
144825d3402cSMarshall Clow#if _LIBCPP_STD_VER > 11
144925d3402cSMarshall Clow    template <typename _K2>
145025d3402cSMarshall Clow    _LIBCPP_INLINE_VISIBILITY
1451cfef7c91SMark de Wever    typename enable_if<__is_transparent<_Compare, _K2>::value,pair<iterator,iterator>>::type
145225d3402cSMarshall Clow    equal_range(const _K2& __k)       {return __tree_.__equal_range_multi(__k);}
145325d3402cSMarshall Clow    template <typename _K2>
145425d3402cSMarshall Clow    _LIBCPP_INLINE_VISIBILITY
1455cfef7c91SMark de Wever    typename enable_if<__is_transparent<_Compare, _K2>::value,pair<const_iterator,const_iterator>>::type
145625d3402cSMarshall Clow    equal_range(const _K2& __k) const {return __tree_.__equal_range_multi(__k);}
145725d3402cSMarshall Clow#endif
14583e519524SHoward Hinnant};
14593e519524SHoward Hinnant
146001666904SLouis Dionne#if _LIBCPP_STD_VER >= 17
1461e20865c3SLouis Dionnetemplate<class _InputIterator,
1462199d2ebeSArthur O'Dwyer         class _Compare = less<__iter_value_type<_InputIterator>>,
1463199d2ebeSArthur O'Dwyer         class _Allocator = allocator<__iter_value_type<_InputIterator>>,
146468072a71SKonstantin Varlamov         class = enable_if_t<__is_cpp17_input_iterator<_InputIterator>::value, void>,
14654e0ea2cfSLouis Dionne         class = enable_if_t<__is_allocator<_Allocator>::value, void>,
14664e0ea2cfSLouis Dionne         class = enable_if_t<!__is_allocator<_Compare>::value, void>>
1467e20865c3SLouis Dionnemultiset(_InputIterator, _InputIterator, _Compare = _Compare(), _Allocator = _Allocator())
1468199d2ebeSArthur O'Dwyer  -> multiset<__iter_value_type<_InputIterator>, _Compare, _Allocator>;
1469e20865c3SLouis Dionne
1470e20865c3SLouis Dionnetemplate<class _Key, class _Compare = less<_Key>,
1471e20865c3SLouis Dionne         class _Allocator = allocator<_Key>,
14724e0ea2cfSLouis Dionne         class = enable_if_t<__is_allocator<_Allocator>::value, void>,
14734e0ea2cfSLouis Dionne         class = enable_if_t<!__is_allocator<_Compare>::value, void>>
1474e20865c3SLouis Dionnemultiset(initializer_list<_Key>, _Compare = _Compare(), _Allocator = _Allocator())
1475e20865c3SLouis Dionne  -> multiset<_Key, _Compare, _Allocator>;
1476e20865c3SLouis Dionne
1477e20865c3SLouis Dionnetemplate<class _InputIterator, class _Allocator,
147868072a71SKonstantin Varlamov         class = enable_if_t<__is_cpp17_input_iterator<_InputIterator>::value, void>,
14794e0ea2cfSLouis Dionne         class = enable_if_t<__is_allocator<_Allocator>::value, void>>
1480e20865c3SLouis Dionnemultiset(_InputIterator, _InputIterator, _Allocator)
1481199d2ebeSArthur O'Dwyer  -> multiset<__iter_value_type<_InputIterator>,
1482199d2ebeSArthur O'Dwyer         less<__iter_value_type<_InputIterator>>, _Allocator>;
1483e20865c3SLouis Dionne
1484e20865c3SLouis Dionnetemplate<class _Key, class _Allocator,
14854e0ea2cfSLouis Dionne         class = enable_if_t<__is_allocator<_Allocator>::value, void>>
1486e20865c3SLouis Dionnemultiset(initializer_list<_Key>, _Allocator)
1487e20865c3SLouis Dionne  -> multiset<_Key, less<_Key>, _Allocator>;
1488e20865c3SLouis Dionne#endif
1489e20865c3SLouis Dionne
1490922940b6SEric Fiselier#ifndef _LIBCPP_CXX03_LANG
14913e519524SHoward Hinnant
14923e519524SHoward Hinnanttemplate <class _Key, class _Compare, class _Allocator>
14933e519524SHoward Hinnantmultiset<_Key, _Compare, _Allocator>::multiset(multiset&& __s, const allocator_type& __a)
1494ce48a113SHoward Hinnant    : __tree_(_VSTD::move(__s.__tree_), __a)
14953e519524SHoward Hinnant{
14963e519524SHoward Hinnant    if (__a != __s.get_allocator())
14973e519524SHoward Hinnant    {
14983e519524SHoward Hinnant        const_iterator __e = cend();
14993e519524SHoward Hinnant        while (!__s.empty())
1500ce48a113SHoward Hinnant            insert(__e, _VSTD::move(__s.__tree_.remove(__s.begin())->__value_));
15013e519524SHoward Hinnant    }
15023e519524SHoward Hinnant}
15033e519524SHoward Hinnant
1504922940b6SEric Fiselier#endif // _LIBCPP_CXX03_LANG
15053e519524SHoward Hinnant
15063e519524SHoward Hinnanttemplate <class _Key, class _Compare, class _Allocator>
150753ec0b4eSHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
15083e519524SHoward Hinnantbool
15093e519524SHoward Hinnantoperator==(const multiset<_Key, _Compare, _Allocator>& __x,
15103e519524SHoward Hinnant           const multiset<_Key, _Compare, _Allocator>& __y)
15113e519524SHoward Hinnant{
1512ce48a113SHoward Hinnant    return __x.size() == __y.size() && _VSTD::equal(__x.begin(), __x.end(), __y.begin());
15133e519524SHoward Hinnant}
15143e519524SHoward Hinnant
15153e519524SHoward Hinnanttemplate <class _Key, class _Compare, class _Allocator>
151653ec0b4eSHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
15173e519524SHoward Hinnantbool
15183e519524SHoward Hinnantoperator< (const multiset<_Key, _Compare, _Allocator>& __x,
15193e519524SHoward Hinnant           const multiset<_Key, _Compare, _Allocator>& __y)
15203e519524SHoward Hinnant{
1521ce48a113SHoward Hinnant    return _VSTD::lexicographical_compare(__x.begin(), __x.end(), __y.begin(), __y.end());
15223e519524SHoward Hinnant}
15233e519524SHoward Hinnant
15243e519524SHoward Hinnanttemplate <class _Key, class _Compare, class _Allocator>
152553ec0b4eSHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
15263e519524SHoward Hinnantbool
15273e519524SHoward Hinnantoperator!=(const multiset<_Key, _Compare, _Allocator>& __x,
15283e519524SHoward Hinnant           const multiset<_Key, _Compare, _Allocator>& __y)
15293e519524SHoward Hinnant{
15303e519524SHoward Hinnant    return !(__x == __y);
15313e519524SHoward Hinnant}
15323e519524SHoward Hinnant
15333e519524SHoward Hinnanttemplate <class _Key, class _Compare, class _Allocator>
153453ec0b4eSHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
15353e519524SHoward Hinnantbool
15363e519524SHoward Hinnantoperator> (const multiset<_Key, _Compare, _Allocator>& __x,
15373e519524SHoward Hinnant           const multiset<_Key, _Compare, _Allocator>& __y)
15383e519524SHoward Hinnant{
15393e519524SHoward Hinnant    return __y < __x;
15403e519524SHoward Hinnant}
15413e519524SHoward Hinnant
15423e519524SHoward Hinnanttemplate <class _Key, class _Compare, class _Allocator>
154353ec0b4eSHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
15443e519524SHoward Hinnantbool
15453e519524SHoward Hinnantoperator>=(const multiset<_Key, _Compare, _Allocator>& __x,
15463e519524SHoward Hinnant           const multiset<_Key, _Compare, _Allocator>& __y)
15473e519524SHoward Hinnant{
15483e519524SHoward Hinnant    return !(__x < __y);
15493e519524SHoward Hinnant}
15503e519524SHoward Hinnant
15513e519524SHoward Hinnanttemplate <class _Key, class _Compare, class _Allocator>
155253ec0b4eSHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
15533e519524SHoward Hinnantbool
15543e519524SHoward Hinnantoperator<=(const multiset<_Key, _Compare, _Allocator>& __x,
15553e519524SHoward Hinnant           const multiset<_Key, _Compare, _Allocator>& __y)
15563e519524SHoward Hinnant{
15573e519524SHoward Hinnant    return !(__y < __x);
15583e519524SHoward Hinnant}
15593e519524SHoward Hinnant
15603e519524SHoward Hinnanttemplate <class _Key, class _Compare, class _Allocator>
156153ec0b4eSHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
15623e519524SHoward Hinnantvoid
15633e519524SHoward Hinnantswap(multiset<_Key, _Compare, _Allocator>& __x,
15643e519524SHoward Hinnant     multiset<_Key, _Compare, _Allocator>& __y)
15650e9f71c1SHoward Hinnant    _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
15663e519524SHoward Hinnant{
15673e519524SHoward Hinnant    __x.swap(__y);
15683e519524SHoward Hinnant}
15693e519524SHoward Hinnant
1570f60c63c0SMarshall Clow#if _LIBCPP_STD_VER > 17
1571f60c63c0SMarshall Clowtemplate <class _Key, class _Compare, class _Allocator, class _Predicate>
1572f60c63c0SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY
15733e895085SMarek Kurdej    typename multiset<_Key, _Compare, _Allocator>::size_type
15743e895085SMarek Kurdej    erase_if(multiset<_Key, _Compare, _Allocator>& __c, _Predicate __pred) {
15752ac6babcSArthur O'Dwyer  return _VSTD::__libcpp_erase_if_container(__c, __pred);
15763e895085SMarek Kurdej}
1577f60c63c0SMarshall Clow#endif
1578f60c63c0SMarshall Clow
15793e519524SHoward Hinnant_LIBCPP_END_NAMESPACE_STD
15803e519524SHoward Hinnant
15813e519524SHoward Hinnant#endif // _LIBCPP_SET
1582