Home | History | Annotate | Line # | Download | only in include
      1  1.1  joerg // -*- C++ -*-
      2  1.1  joerg //===---------------------------- set -------------------------------------===//
      3  1.1  joerg //
      4  1.1  joerg // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
      5  1.1  joerg // See https://llvm.org/LICENSE.txt for license information.
      6  1.1  joerg // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
      7  1.1  joerg //
      8  1.1  joerg //===----------------------------------------------------------------------===//
      9  1.1  joerg 
     10  1.1  joerg #ifndef _LIBCPP_SET
     11  1.1  joerg #define _LIBCPP_SET
     12  1.1  joerg 
     13  1.1  joerg /*
     14  1.1  joerg 
     15  1.1  joerg     set synopsis
     16  1.1  joerg 
     17  1.1  joerg namespace std
     18  1.1  joerg {
     19  1.1  joerg 
     20  1.1  joerg template <class Key, class Compare = less<Key>,
     21  1.1  joerg           class Allocator = allocator<Key>>
     22  1.1  joerg class set
     23  1.1  joerg {
     24  1.1  joerg public:
     25  1.1  joerg     // types:
     26  1.1  joerg     typedef Key                                      key_type;
     27  1.1  joerg     typedef key_type                                 value_type;
     28  1.1  joerg     typedef Compare                                  key_compare;
     29  1.1  joerg     typedef key_compare                              value_compare;
     30  1.1  joerg     typedef Allocator                                allocator_type;
     31  1.1  joerg     typedef typename allocator_type::reference       reference;
     32  1.1  joerg     typedef typename allocator_type::const_reference const_reference;
     33  1.1  joerg     typedef typename allocator_type::size_type       size_type;
     34  1.1  joerg     typedef typename allocator_type::difference_type difference_type;
     35  1.1  joerg     typedef typename allocator_type::pointer         pointer;
     36  1.1  joerg     typedef typename allocator_type::const_pointer   const_pointer;
     37  1.1  joerg 
     38  1.1  joerg     typedef implementation-defined                   iterator;
     39  1.1  joerg     typedef implementation-defined                   const_iterator;
     40  1.1  joerg     typedef std::reverse_iterator<iterator>          reverse_iterator;
     41  1.1  joerg     typedef std::reverse_iterator<const_iterator>    const_reverse_iterator;
     42  1.1  joerg     typedef unspecified                              node_type;               // C++17
     43  1.1  joerg     typedef INSERT_RETURN_TYPE<iterator, node_type>  insert_return_type;      // C++17
     44  1.1  joerg 
     45  1.1  joerg     // construct/copy/destroy:
     46  1.1  joerg     set()
     47  1.1  joerg         noexcept(
     48  1.1  joerg             is_nothrow_default_constructible<allocator_type>::value &&
     49  1.1  joerg             is_nothrow_default_constructible<key_compare>::value &&
     50  1.1  joerg             is_nothrow_copy_constructible<key_compare>::value);
     51  1.1  joerg     explicit set(const value_compare& comp);
     52  1.1  joerg     set(const value_compare& comp, const allocator_type& a);
     53  1.1  joerg     template <class InputIterator>
     54  1.1  joerg         set(InputIterator first, InputIterator last,
     55  1.1  joerg             const value_compare& comp = value_compare());
     56  1.1  joerg     template <class InputIterator>
     57  1.1  joerg         set(InputIterator first, InputIterator last, const value_compare& comp,
     58  1.1  joerg             const allocator_type& a);
     59  1.1  joerg     set(const set& s);
     60  1.1  joerg     set(set&& s)
     61  1.1  joerg         noexcept(
     62  1.1  joerg             is_nothrow_move_constructible<allocator_type>::value &&
     63  1.1  joerg             is_nothrow_move_constructible<key_compare>::value);
     64  1.1  joerg     explicit set(const allocator_type& a);
     65  1.1  joerg     set(const set& s, const allocator_type& a);
     66  1.1  joerg     set(set&& s, const allocator_type& a);
     67  1.1  joerg     set(initializer_list<value_type> il, const value_compare& comp = value_compare());
     68  1.1  joerg     set(initializer_list<value_type> il, const value_compare& comp,
     69  1.1  joerg         const allocator_type& a);
     70  1.1  joerg     template <class InputIterator>
     71  1.1  joerg         set(InputIterator first, InputIterator last, const allocator_type& a)
     72  1.1  joerg             : set(first, last, Compare(), a) {}  // C++14
     73  1.1  joerg     set(initializer_list<value_type> il, const allocator_type& a)
     74  1.1  joerg         : set(il, Compare(), a) {}  // C++14
     75  1.1  joerg     ~set();
     76  1.1  joerg 
     77  1.1  joerg     set& operator=(const set& s);
     78  1.1  joerg     set& operator=(set&& s)
     79  1.1  joerg         noexcept(
     80  1.1  joerg             allocator_type::propagate_on_container_move_assignment::value &&
     81  1.1  joerg             is_nothrow_move_assignable<allocator_type>::value &&
     82  1.1  joerg             is_nothrow_move_assignable<key_compare>::value);
     83  1.1  joerg     set& operator=(initializer_list<value_type> il);
     84  1.1  joerg 
     85  1.1  joerg     // iterators:
     86  1.1  joerg           iterator begin() noexcept;
     87  1.1  joerg     const_iterator begin() const noexcept;
     88  1.1  joerg           iterator end() noexcept;
     89  1.1  joerg     const_iterator end()   const noexcept;
     90  1.1  joerg 
     91  1.1  joerg           reverse_iterator rbegin() noexcept;
     92  1.1  joerg     const_reverse_iterator rbegin() const noexcept;
     93  1.1  joerg           reverse_iterator rend() noexcept;
     94  1.1  joerg     const_reverse_iterator rend()   const noexcept;
     95  1.1  joerg 
     96  1.1  joerg     const_iterator         cbegin()  const noexcept;
     97  1.1  joerg     const_iterator         cend()    const noexcept;
     98  1.1  joerg     const_reverse_iterator crbegin() const noexcept;
     99  1.1  joerg     const_reverse_iterator crend()   const noexcept;
    100  1.1  joerg 
    101  1.1  joerg     // capacity:
    102  1.1  joerg     bool      empty()    const noexcept;
    103  1.1  joerg     size_type size()     const noexcept;
    104  1.1  joerg     size_type max_size() const noexcept;
    105  1.1  joerg 
    106  1.1  joerg     // modifiers:
    107  1.1  joerg     template <class... Args>
    108  1.1  joerg         pair<iterator, bool> emplace(Args&&... args);
    109  1.1  joerg     template <class... Args>
    110  1.1  joerg         iterator emplace_hint(const_iterator position, Args&&... args);
    111  1.1  joerg     pair<iterator,bool> insert(const value_type& v);
    112  1.1  joerg     pair<iterator,bool> insert(value_type&& v);
    113  1.1  joerg     iterator insert(const_iterator position, const value_type& v);
    114  1.1  joerg     iterator insert(const_iterator position, value_type&& v);
    115  1.1  joerg     template <class InputIterator>
    116  1.1  joerg         void insert(InputIterator first, InputIterator last);
    117  1.1  joerg     void insert(initializer_list<value_type> il);
    118  1.1  joerg 
    119  1.1  joerg     node_type extract(const_iterator position);                                       // C++17
    120  1.1  joerg     node_type extract(const key_type& x);                                             // C++17
    121  1.1  joerg     insert_return_type insert(node_type&& nh);                                        // C++17
    122  1.1  joerg     iterator insert(const_iterator hint, node_type&& nh);                             // C++17
    123  1.1  joerg 
    124  1.1  joerg     iterator  erase(const_iterator position);
    125  1.1  joerg     iterator  erase(iterator position);  // C++14
    126  1.1  joerg     size_type erase(const key_type& k);
    127  1.1  joerg     iterator  erase(const_iterator first, const_iterator last);
    128  1.1  joerg     void clear() noexcept;
    129  1.1  joerg 
    130  1.1  joerg     template<class C2>
    131  1.1  joerg       void merge(set<Key, C2, Allocator>& source);         // C++17
    132  1.1  joerg     template<class C2>
    133  1.1  joerg       void merge(set<Key, C2, Allocator>&& source);        // C++17
    134  1.1  joerg     template<class C2>
    135  1.1  joerg       void merge(multiset<Key, C2, Allocator>& source);    // C++17
    136  1.1  joerg     template<class C2>
    137  1.1  joerg       void merge(multiset<Key, C2, Allocator>&& source);   // C++17
    138  1.1  joerg 
    139  1.1  joerg     void swap(set& s)
    140  1.1  joerg         noexcept(
    141  1.1  joerg             __is_nothrow_swappable<key_compare>::value &&
    142  1.1  joerg             (!allocator_type::propagate_on_container_swap::value ||
    143  1.1  joerg              __is_nothrow_swappable<allocator_type>::value));
    144  1.1  joerg 
    145  1.1  joerg     // observers:
    146  1.1  joerg     allocator_type get_allocator() const noexcept;
    147  1.1  joerg     key_compare    key_comp()      const;
    148  1.1  joerg     value_compare  value_comp()    const;
    149  1.1  joerg 
    150  1.1  joerg     // set operations:
    151  1.1  joerg           iterator find(const key_type& k);
    152  1.1  joerg     const_iterator find(const key_type& k) const;
    153  1.1  joerg     template<typename K>
    154  1.1  joerg         iterator find(const K& x);
    155  1.1  joerg     template<typename K>
    156  1.1  joerg         const_iterator find(const K& x) const;  // C++14
    157  1.1  joerg 
    158  1.1  joerg     template<typename K>
    159  1.1  joerg         size_type count(const K& x) const;        // C++14
    160  1.1  joerg     size_type      count(const key_type& k) const;
    161  1.1  joerg 
    162  1.1  joerg     bool           contains(const key_type& x) const;  // C++20
    163  1.1  joerg     template<class K> bool contains(const K& x) const; // C++20
    164  1.1  joerg 
    165  1.1  joerg           iterator lower_bound(const key_type& k);
    166  1.1  joerg     const_iterator lower_bound(const key_type& k) const;
    167  1.1  joerg     template<typename K>
    168  1.1  joerg         iterator lower_bound(const K& x);              // C++14
    169  1.1  joerg     template<typename K>
    170  1.1  joerg         const_iterator lower_bound(const K& x) const;  // C++14
    171  1.1  joerg 
    172  1.1  joerg           iterator upper_bound(const key_type& k);
    173  1.1  joerg     const_iterator upper_bound(const key_type& k) const;
    174  1.1  joerg     template<typename K>
    175  1.1  joerg         iterator upper_bound(const K& x);              // C++14
    176  1.1  joerg     template<typename K>
    177  1.1  joerg         const_iterator upper_bound(const K& x) const;  // C++14
    178  1.1  joerg     pair<iterator,iterator>             equal_range(const key_type& k);
    179  1.1  joerg     pair<const_iterator,const_iterator> equal_range(const key_type& k) const;
    180  1.1  joerg     template<typename K>
    181  1.1  joerg         pair<iterator,iterator>             equal_range(const K& x);        // C++14
    182  1.1  joerg     template<typename K>
    183  1.1  joerg         pair<const_iterator,const_iterator> equal_range(const K& x) const;  // C++14
    184  1.1  joerg };
    185  1.1  joerg 
    186  1.1  joerg template <class Key, class Compare, class Allocator>
    187  1.1  joerg bool
    188  1.1  joerg operator==(const set<Key, Compare, Allocator>& x,
    189  1.1  joerg            const set<Key, Compare, Allocator>& y);
    190  1.1  joerg 
    191  1.1  joerg template <class Key, class Compare, class Allocator>
    192  1.1  joerg bool
    193  1.1  joerg operator< (const set<Key, Compare, Allocator>& x,
    194  1.1  joerg            const set<Key, Compare, Allocator>& y);
    195  1.1  joerg 
    196  1.1  joerg template <class Key, class Compare, class Allocator>
    197  1.1  joerg bool
    198  1.1  joerg operator!=(const set<Key, Compare, Allocator>& x,
    199  1.1  joerg            const set<Key, Compare, Allocator>& y);
    200  1.1  joerg 
    201  1.1  joerg template <class Key, class Compare, class Allocator>
    202  1.1  joerg bool
    203  1.1  joerg operator> (const set<Key, Compare, Allocator>& x,
    204  1.1  joerg            const set<Key, Compare, Allocator>& y);
    205  1.1  joerg 
    206  1.1  joerg template <class Key, class Compare, class Allocator>
    207  1.1  joerg bool
    208  1.1  joerg operator>=(const set<Key, Compare, Allocator>& x,
    209  1.1  joerg            const set<Key, Compare, Allocator>& y);
    210  1.1  joerg 
    211  1.1  joerg template <class Key, class Compare, class Allocator>
    212  1.1  joerg bool
    213  1.1  joerg operator<=(const set<Key, Compare, Allocator>& x,
    214  1.1  joerg            const set<Key, Compare, Allocator>& y);
    215  1.1  joerg 
    216  1.1  joerg // specialized algorithms:
    217  1.1  joerg template <class Key, class Compare, class Allocator>
    218  1.1  joerg void
    219  1.1  joerg swap(set<Key, Compare, Allocator>& x, set<Key, Compare, Allocator>& y)
    220  1.1  joerg     noexcept(noexcept(x.swap(y)));
    221  1.1  joerg 
    222  1.1  joerg template <class Key, class Compare, class Allocator, class Predicate>
    223  1.1  joerg typename set<Key, Compare, Allocator>::size_type
    224  1.1  joerg erase_if(set<Key, Compare, Allocator>& c, Predicate pred);  // C++20
    225  1.1  joerg 
    226  1.1  joerg template <class Key, class Compare = less<Key>,
    227  1.1  joerg           class Allocator = allocator<Key>>
    228  1.1  joerg class multiset
    229  1.1  joerg {
    230  1.1  joerg public:
    231  1.1  joerg     // types:
    232  1.1  joerg     typedef Key                                      key_type;
    233  1.1  joerg     typedef key_type                                 value_type;
    234  1.1  joerg     typedef Compare                                  key_compare;
    235  1.1  joerg     typedef key_compare                              value_compare;
    236  1.1  joerg     typedef Allocator                                allocator_type;
    237  1.1  joerg     typedef typename allocator_type::reference       reference;
    238  1.1  joerg     typedef typename allocator_type::const_reference const_reference;
    239  1.1  joerg     typedef typename allocator_type::size_type       size_type;
    240  1.1  joerg     typedef typename allocator_type::difference_type difference_type;
    241  1.1  joerg     typedef typename allocator_type::pointer         pointer;
    242  1.1  joerg     typedef typename allocator_type::const_pointer   const_pointer;
    243  1.1  joerg 
    244  1.1  joerg     typedef implementation-defined                   iterator;
    245  1.1  joerg     typedef implementation-defined                   const_iterator;
    246  1.1  joerg     typedef std::reverse_iterator<iterator>          reverse_iterator;
    247  1.1  joerg     typedef std::reverse_iterator<const_iterator>    const_reverse_iterator;
    248  1.1  joerg     typedef unspecified                              node_type;               // C++17
    249  1.1  joerg 
    250  1.1  joerg     // construct/copy/destroy:
    251  1.1  joerg     multiset()
    252  1.1  joerg         noexcept(
    253  1.1  joerg             is_nothrow_default_constructible<allocator_type>::value &&
    254  1.1  joerg             is_nothrow_default_constructible<key_compare>::value &&
    255  1.1  joerg             is_nothrow_copy_constructible<key_compare>::value);
    256  1.1  joerg     explicit multiset(const value_compare& comp);
    257  1.1  joerg     multiset(const value_compare& comp, const allocator_type& a);
    258  1.1  joerg     template <class InputIterator>
    259  1.1  joerg         multiset(InputIterator first, InputIterator last,
    260  1.1  joerg                  const value_compare& comp = value_compare());
    261  1.1  joerg     template <class InputIterator>
    262  1.1  joerg         multiset(InputIterator first, InputIterator last,
    263  1.1  joerg                  const value_compare& comp, const allocator_type& a);
    264  1.1  joerg     multiset(const multiset& s);
    265  1.1  joerg     multiset(multiset&& s)
    266  1.1  joerg         noexcept(
    267  1.1  joerg             is_nothrow_move_constructible<allocator_type>::value &&
    268  1.1  joerg             is_nothrow_move_constructible<key_compare>::value);
    269  1.1  joerg     explicit multiset(const allocator_type& a);
    270  1.1  joerg     multiset(const multiset& s, const allocator_type& a);
    271  1.1  joerg     multiset(multiset&& s, const allocator_type& a);
    272  1.1  joerg     multiset(initializer_list<value_type> il, const value_compare& comp = value_compare());
    273  1.1  joerg     multiset(initializer_list<value_type> il, const value_compare& comp,
    274  1.1  joerg              const allocator_type& a);
    275  1.1  joerg     template <class InputIterator>
    276  1.1  joerg         multiset(InputIterator first, InputIterator last, const allocator_type& a)
    277  1.1  joerg             : set(first, last, Compare(), a) {}  // C++14
    278  1.1  joerg     multiset(initializer_list<value_type> il, const allocator_type& a)
    279  1.1  joerg         : set(il, Compare(), a) {}  // C++14
    280  1.1  joerg     ~multiset();
    281  1.1  joerg 
    282  1.1  joerg     multiset& operator=(const multiset& s);
    283  1.1  joerg     multiset& operator=(multiset&& s)
    284  1.1  joerg         noexcept(
    285  1.1  joerg             allocator_type::propagate_on_container_move_assignment::value &&
    286  1.1  joerg             is_nothrow_move_assignable<allocator_type>::value &&
    287  1.1  joerg             is_nothrow_move_assignable<key_compare>::value);
    288  1.1  joerg     multiset& operator=(initializer_list<value_type> il);
    289  1.1  joerg 
    290  1.1  joerg     // iterators:
    291  1.1  joerg           iterator begin() noexcept;
    292  1.1  joerg     const_iterator begin() const noexcept;
    293  1.1  joerg           iterator end() noexcept;
    294  1.1  joerg     const_iterator end()   const noexcept;
    295  1.1  joerg 
    296  1.1  joerg           reverse_iterator rbegin() noexcept;
    297  1.1  joerg     const_reverse_iterator rbegin() const noexcept;
    298  1.1  joerg           reverse_iterator rend() noexcept;
    299  1.1  joerg     const_reverse_iterator rend()   const noexcept;
    300  1.1  joerg 
    301  1.1  joerg     const_iterator         cbegin()  const noexcept;
    302  1.1  joerg     const_iterator         cend()    const noexcept;
    303  1.1  joerg     const_reverse_iterator crbegin() const noexcept;
    304  1.1  joerg     const_reverse_iterator crend()   const noexcept;
    305  1.1  joerg 
    306  1.1  joerg     // capacity:
    307  1.1  joerg     bool      empty()    const noexcept;
    308  1.1  joerg     size_type size()     const noexcept;
    309  1.1  joerg     size_type max_size() const noexcept;
    310  1.1  joerg 
    311  1.1  joerg     // modifiers:
    312  1.1  joerg     template <class... Args>
    313  1.1  joerg         iterator emplace(Args&&... args);
    314  1.1  joerg     template <class... Args>
    315  1.1  joerg         iterator emplace_hint(const_iterator position, Args&&... args);
    316  1.1  joerg     iterator insert(const value_type& v);
    317  1.1  joerg     iterator insert(value_type&& v);
    318  1.1  joerg     iterator insert(const_iterator position, const value_type& v);
    319  1.1  joerg     iterator insert(const_iterator position, value_type&& v);
    320  1.1  joerg     template <class InputIterator>
    321  1.1  joerg         void insert(InputIterator first, InputIterator last);
    322  1.1  joerg     void insert(initializer_list<value_type> il);
    323  1.1  joerg 
    324  1.1  joerg     node_type extract(const_iterator position);                                       // C++17
    325  1.1  joerg     node_type extract(const key_type& x);                                             // C++17
    326  1.1  joerg     iterator insert(node_type&& nh);                                                  // C++17
    327  1.1  joerg     iterator insert(const_iterator hint, node_type&& nh);                             // C++17
    328  1.1  joerg 
    329  1.1  joerg     iterator  erase(const_iterator position);
    330  1.1  joerg     iterator  erase(iterator position);  // C++14
    331  1.1  joerg     size_type erase(const key_type& k);
    332  1.1  joerg     iterator  erase(const_iterator first, const_iterator last);
    333  1.1  joerg     void clear() noexcept;
    334  1.1  joerg 
    335  1.1  joerg     template<class C2>
    336  1.1  joerg       void merge(multiset<Key, C2, Allocator>& source);    // C++17
    337  1.1  joerg     template<class C2>
    338  1.1  joerg       void merge(multiset<Key, C2, Allocator>&& source);   // C++17
    339  1.1  joerg     template<class C2>
    340  1.1  joerg       void merge(set<Key, C2, Allocator>& source);         // C++17
    341  1.1  joerg     template<class C2>
    342  1.1  joerg       void merge(set<Key, C2, Allocator>&& source);        // C++17
    343  1.1  joerg 
    344  1.1  joerg     void swap(multiset& s)
    345  1.1  joerg         noexcept(
    346  1.1  joerg             __is_nothrow_swappable<key_compare>::value &&
    347  1.1  joerg             (!allocator_type::propagate_on_container_swap::value ||
    348  1.1  joerg              __is_nothrow_swappable<allocator_type>::value));
    349  1.1  joerg 
    350  1.1  joerg     // observers:
    351  1.1  joerg     allocator_type get_allocator() const noexcept;
    352  1.1  joerg     key_compare    key_comp()      const;
    353  1.1  joerg     value_compare  value_comp()    const;
    354  1.1  joerg 
    355  1.1  joerg     // set operations:
    356  1.1  joerg           iterator find(const key_type& k);
    357  1.1  joerg     const_iterator find(const key_type& k) const;
    358  1.1  joerg     template<typename K>
    359  1.1  joerg         iterator find(const K& x);
    360  1.1  joerg     template<typename K>
    361  1.1  joerg         const_iterator find(const K& x) const;  // C++14
    362  1.1  joerg 
    363  1.1  joerg     template<typename K>
    364  1.1  joerg         size_type count(const K& x) const;      // C++14
    365  1.1  joerg     size_type      count(const key_type& k) const;
    366  1.1  joerg 
    367  1.1  joerg     bool           contains(const key_type& x) const;  // C++20
    368  1.1  joerg     template<class K> bool contains(const K& x) const; // C++20
    369  1.1  joerg 
    370  1.1  joerg           iterator lower_bound(const key_type& k);
    371  1.1  joerg     const_iterator lower_bound(const key_type& k) const;
    372  1.1  joerg     template<typename K>
    373  1.1  joerg         iterator lower_bound(const K& x);              // C++14
    374  1.1  joerg     template<typename K>
    375  1.1  joerg         const_iterator lower_bound(const K& x) const;  // C++14
    376  1.1  joerg 
    377  1.1  joerg           iterator upper_bound(const key_type& k);
    378  1.1  joerg     const_iterator upper_bound(const key_type& k) const;
    379  1.1  joerg     template<typename K>
    380  1.1  joerg         iterator upper_bound(const K& x);              // C++14
    381  1.1  joerg     template<typename K>
    382  1.1  joerg         const_iterator upper_bound(const K& x) const;  // C++14
    383  1.1  joerg 
    384  1.1  joerg     pair<iterator,iterator>             equal_range(const key_type& k);
    385  1.1  joerg     pair<const_iterator,const_iterator> equal_range(const key_type& k) const;
    386  1.1  joerg     template<typename K>
    387  1.1  joerg         pair<iterator,iterator>             equal_range(const K& x);        // C++14
    388  1.1  joerg     template<typename K>
    389  1.1  joerg         pair<const_iterator,const_iterator> equal_range(const K& x) const;  // C++14
    390  1.1  joerg };
    391  1.1  joerg 
    392  1.1  joerg template <class Key, class Compare, class Allocator>
    393  1.1  joerg bool
    394  1.1  joerg operator==(const multiset<Key, Compare, Allocator>& x,
    395  1.1  joerg            const multiset<Key, Compare, Allocator>& y);
    396  1.1  joerg 
    397  1.1  joerg template <class Key, class Compare, class Allocator>
    398  1.1  joerg bool
    399  1.1  joerg operator< (const multiset<Key, Compare, Allocator>& x,
    400  1.1  joerg            const multiset<Key, Compare, Allocator>& y);
    401  1.1  joerg 
    402  1.1  joerg template <class Key, class Compare, class Allocator>
    403  1.1  joerg bool
    404  1.1  joerg operator!=(const multiset<Key, Compare, Allocator>& x,
    405  1.1  joerg            const multiset<Key, Compare, Allocator>& y);
    406  1.1  joerg 
    407  1.1  joerg template <class Key, class Compare, class Allocator>
    408  1.1  joerg bool
    409  1.1  joerg operator> (const multiset<Key, Compare, Allocator>& x,
    410  1.1  joerg            const multiset<Key, Compare, Allocator>& y);
    411  1.1  joerg 
    412  1.1  joerg template <class Key, class Compare, class Allocator>
    413  1.1  joerg bool
    414  1.1  joerg operator>=(const multiset<Key, Compare, Allocator>& x,
    415  1.1  joerg            const multiset<Key, Compare, Allocator>& y);
    416  1.1  joerg 
    417  1.1  joerg template <class Key, class Compare, class Allocator>
    418  1.1  joerg bool
    419  1.1  joerg operator<=(const multiset<Key, Compare, Allocator>& x,
    420  1.1  joerg            const multiset<Key, Compare, Allocator>& y);
    421  1.1  joerg 
    422  1.1  joerg // specialized algorithms:
    423  1.1  joerg template <class Key, class Compare, class Allocator>
    424  1.1  joerg void
    425  1.1  joerg swap(multiset<Key, Compare, Allocator>& x, multiset<Key, Compare, Allocator>& y)
    426  1.1  joerg     noexcept(noexcept(x.swap(y)));
    427  1.1  joerg 
    428  1.1  joerg template <class Key, class Compare, class Allocator, class Predicate>
    429  1.1  joerg typename multiset<Key, Compare, Allocator>::size_type
    430  1.1  joerg erase_if(multiset<Key, Compare, Allocator>& c, Predicate pred);  // C++20
    431  1.1  joerg 
    432  1.1  joerg }  // std
    433  1.1  joerg 
    434  1.1  joerg */
    435  1.1  joerg 
    436  1.1  joerg #include <__config>
    437  1.1  joerg #include <__debug>
    438  1.1  joerg #include <__node_handle>
    439  1.1  joerg #include <__tree>
    440  1.1  joerg #include <compare>
    441  1.1  joerg #include <functional>
    442  1.1  joerg #include <initializer_list>
    443  1.1  joerg #include <iterator> // __libcpp_erase_if_container
    444  1.1  joerg #include <version>
    445  1.1  joerg 
    446  1.1  joerg #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
    447  1.1  joerg #pragma GCC system_header
    448  1.1  joerg #endif
    449  1.1  joerg 
    450  1.1  joerg _LIBCPP_BEGIN_NAMESPACE_STD
    451  1.1  joerg 
    452  1.1  joerg template <class _Key, class _Compare, class _Allocator>
    453  1.1  joerg class multiset;
    454  1.1  joerg 
    455  1.1  joerg template <class _Key, class _Compare = less<_Key>,
    456  1.1  joerg           class _Allocator = allocator<_Key> >
    457  1.1  joerg class _LIBCPP_TEMPLATE_VIS set
    458  1.1  joerg {
    459  1.1  joerg public:
    460  1.1  joerg     // types:
    461  1.1  joerg     typedef _Key                                     key_type;
    462  1.1  joerg     typedef key_type                                 value_type;
    463  1.1  joerg     typedef _Compare                                 key_compare;
    464  1.1  joerg     typedef key_compare                              value_compare;
    465  1.1  joerg     typedef __identity_t<_Allocator>                 allocator_type;
    466  1.1  joerg     typedef value_type&                              reference;
    467  1.1  joerg     typedef const value_type&                        const_reference;
    468  1.1  joerg 
    469  1.1  joerg     static_assert((is_same<typename allocator_type::value_type, value_type>::value),
    470  1.1  joerg                   "Allocator::value_type must be same type as value_type");
    471  1.1  joerg 
    472  1.1  joerg private:
    473  1.1  joerg     typedef __tree<value_type, value_compare, allocator_type> __base;
    474  1.1  joerg     typedef allocator_traits<allocator_type>                  __alloc_traits;
    475  1.1  joerg     typedef typename __base::__node_holder                    __node_holder;
    476  1.1  joerg 
    477  1.1  joerg     __base __tree_;
    478  1.1  joerg 
    479  1.1  joerg public:
    480  1.1  joerg     typedef typename __base::pointer               pointer;
    481  1.1  joerg     typedef typename __base::const_pointer         const_pointer;
    482  1.1  joerg     typedef typename __base::size_type             size_type;
    483  1.1  joerg     typedef typename __base::difference_type       difference_type;
    484  1.1  joerg     typedef typename __base::const_iterator        iterator;
    485  1.1  joerg     typedef typename __base::const_iterator        const_iterator;
    486  1.1  joerg     typedef _VSTD::reverse_iterator<iterator>       reverse_iterator;
    487  1.1  joerg     typedef _VSTD::reverse_iterator<const_iterator> const_reverse_iterator;
    488  1.1  joerg 
    489  1.1  joerg #if _LIBCPP_STD_VER > 14
    490  1.1  joerg     typedef __set_node_handle<typename __base::__node, allocator_type> node_type;
    491  1.1  joerg     typedef __insert_return_type<iterator, node_type> insert_return_type;
    492  1.1  joerg #endif
    493  1.1  joerg 
    494  1.1  joerg     template <class _Key2, class _Compare2, class _Alloc2>
    495  1.1  joerg         friend class _LIBCPP_TEMPLATE_VIS set;
    496  1.1  joerg     template <class _Key2, class _Compare2, class _Alloc2>
    497  1.1  joerg         friend class _LIBCPP_TEMPLATE_VIS multiset;
    498  1.1  joerg 
    499  1.1  joerg     _LIBCPP_INLINE_VISIBILITY
    500  1.1  joerg     set()
    501  1.1  joerg         _NOEXCEPT_(
    502  1.1  joerg             is_nothrow_default_constructible<allocator_type>::value &&
    503  1.1  joerg             is_nothrow_default_constructible<key_compare>::value &&
    504  1.1  joerg             is_nothrow_copy_constructible<key_compare>::value)
    505  1.1  joerg         : __tree_(value_compare()) {}
    506  1.1  joerg 
    507  1.1  joerg     _LIBCPP_INLINE_VISIBILITY
    508  1.1  joerg     explicit set(const value_compare& __comp)
    509  1.1  joerg         _NOEXCEPT_(
    510  1.1  joerg             is_nothrow_default_constructible<allocator_type>::value &&
    511  1.1  joerg             is_nothrow_copy_constructible<key_compare>::value)
    512  1.1  joerg         : __tree_(__comp) {}
    513  1.1  joerg 
    514  1.1  joerg     _LIBCPP_INLINE_VISIBILITY
    515  1.1  joerg     explicit set(const value_compare& __comp, const allocator_type& __a)
    516  1.1  joerg         : __tree_(__comp, __a) {}
    517  1.1  joerg     template <class _InputIterator>
    518  1.1  joerg         _LIBCPP_INLINE_VISIBILITY
    519  1.1  joerg         set(_InputIterator __f, _InputIterator __l,
    520  1.1  joerg             const value_compare& __comp = value_compare())
    521  1.1  joerg         : __tree_(__comp)
    522  1.1  joerg         {
    523  1.1  joerg             insert(__f, __l);
    524  1.1  joerg         }
    525  1.1  joerg 
    526  1.1  joerg     template <class _InputIterator>
    527  1.1  joerg         _LIBCPP_INLINE_VISIBILITY
    528  1.1  joerg         set(_InputIterator __f, _InputIterator __l, const value_compare& __comp,
    529  1.1  joerg             const allocator_type& __a)
    530  1.1  joerg         : __tree_(__comp, __a)
    531  1.1  joerg         {
    532  1.1  joerg             insert(__f, __l);
    533  1.1  joerg         }
    534  1.1  joerg 
    535  1.1  joerg #if _LIBCPP_STD_VER > 11
    536  1.1  joerg         template <class _InputIterator>
    537  1.1  joerg         _LIBCPP_INLINE_VISIBILITY
    538  1.1  joerg         set(_InputIterator __f, _InputIterator __l, const allocator_type& __a)
    539  1.1  joerg             : set(__f, __l, key_compare(), __a) {}
    540  1.1  joerg #endif
    541  1.1  joerg 
    542  1.1  joerg     _LIBCPP_INLINE_VISIBILITY
    543  1.1  joerg     set(const set& __s)
    544  1.1  joerg         : __tree_(__s.__tree_)
    545  1.1  joerg         {
    546  1.1  joerg             insert(__s.begin(), __s.end());
    547  1.1  joerg         }
    548  1.1  joerg 
    549  1.1  joerg     _LIBCPP_INLINE_VISIBILITY
    550  1.1  joerg     set& operator=(const set& __s)
    551  1.1  joerg         {
    552  1.1  joerg             __tree_ = __s.__tree_;
    553  1.1  joerg             return *this;
    554  1.1  joerg         }
    555  1.1  joerg 
    556  1.1  joerg #ifndef _LIBCPP_CXX03_LANG
    557  1.1  joerg     _LIBCPP_INLINE_VISIBILITY
    558  1.1  joerg     set(set&& __s)
    559  1.1  joerg         _NOEXCEPT_(is_nothrow_move_constructible<__base>::value)
    560  1.1  joerg         : __tree_(_VSTD::move(__s.__tree_)) {}
    561  1.1  joerg #endif // _LIBCPP_CXX03_LANG
    562  1.1  joerg 
    563  1.1  joerg     _LIBCPP_INLINE_VISIBILITY
    564  1.1  joerg     explicit set(const allocator_type& __a)
    565  1.1  joerg         : __tree_(__a) {}
    566  1.1  joerg 
    567  1.1  joerg     _LIBCPP_INLINE_VISIBILITY
    568  1.1  joerg     set(const set& __s, const allocator_type& __a)
    569  1.1  joerg         : __tree_(__s.__tree_.value_comp(), __a)
    570  1.1  joerg         {
    571  1.1  joerg             insert(__s.begin(), __s.end());
    572  1.1  joerg         }
    573  1.1  joerg 
    574  1.1  joerg #ifndef _LIBCPP_CXX03_LANG
    575  1.1  joerg     set(set&& __s, const allocator_type& __a);
    576  1.1  joerg 
    577  1.1  joerg     _LIBCPP_INLINE_VISIBILITY
    578  1.1  joerg     set(initializer_list<value_type> __il, const value_compare& __comp = value_compare())
    579  1.1  joerg         : __tree_(__comp)
    580  1.1  joerg         {
    581  1.1  joerg             insert(__il.begin(), __il.end());
    582  1.1  joerg         }
    583  1.1  joerg 
    584  1.1  joerg     _LIBCPP_INLINE_VISIBILITY
    585  1.1  joerg     set(initializer_list<value_type> __il, const value_compare& __comp,
    586  1.1  joerg         const allocator_type& __a)
    587  1.1  joerg         : __tree_(__comp, __a)
    588  1.1  joerg         {
    589  1.1  joerg             insert(__il.begin(), __il.end());
    590  1.1  joerg         }
    591  1.1  joerg 
    592  1.1  joerg #if _LIBCPP_STD_VER > 11
    593  1.1  joerg     _LIBCPP_INLINE_VISIBILITY
    594  1.1  joerg     set(initializer_list<value_type> __il, const allocator_type& __a)
    595  1.1  joerg         : set(__il, key_compare(), __a) {}
    596  1.1  joerg #endif
    597  1.1  joerg 
    598  1.1  joerg     _LIBCPP_INLINE_VISIBILITY
    599  1.1  joerg     set& operator=(initializer_list<value_type> __il)
    600  1.1  joerg         {
    601  1.1  joerg             __tree_.__assign_unique(__il.begin(), __il.end());
    602  1.1  joerg             return *this;
    603  1.1  joerg         }
    604  1.1  joerg 
    605  1.1  joerg     _LIBCPP_INLINE_VISIBILITY
    606  1.1  joerg     set& operator=(set&& __s)
    607  1.1  joerg         _NOEXCEPT_(is_nothrow_move_assignable<__base>::value)
    608  1.1  joerg         {
    609  1.1  joerg             __tree_ = _VSTD::move(__s.__tree_);
    610  1.1  joerg             return *this;
    611  1.1  joerg         }
    612  1.1  joerg #endif // _LIBCPP_CXX03_LANG
    613  1.1  joerg 
    614  1.1  joerg     _LIBCPP_INLINE_VISIBILITY
    615  1.1  joerg     ~set() {
    616  1.1  joerg         static_assert(sizeof(__diagnose_non_const_comparator<_Key, _Compare>()), "");
    617  1.1  joerg     }
    618  1.1  joerg 
    619  1.1  joerg     _LIBCPP_INLINE_VISIBILITY
    620  1.1  joerg           iterator begin() _NOEXCEPT       {return __tree_.begin();}
    621  1.1  joerg     _LIBCPP_INLINE_VISIBILITY
    622  1.1  joerg     const_iterator begin() const _NOEXCEPT {return __tree_.begin();}
    623  1.1  joerg     _LIBCPP_INLINE_VISIBILITY
    624  1.1  joerg           iterator end() _NOEXCEPT         {return __tree_.end();}
    625  1.1  joerg     _LIBCPP_INLINE_VISIBILITY
    626  1.1  joerg     const_iterator end()   const _NOEXCEPT {return __tree_.end();}
    627  1.1  joerg 
    628  1.1  joerg     _LIBCPP_INLINE_VISIBILITY
    629  1.1  joerg           reverse_iterator rbegin() _NOEXCEPT
    630  1.1  joerg             {return reverse_iterator(end());}
    631  1.1  joerg     _LIBCPP_INLINE_VISIBILITY
    632  1.1  joerg     const_reverse_iterator rbegin() const _NOEXCEPT
    633  1.1  joerg         {return const_reverse_iterator(end());}
    634  1.1  joerg     _LIBCPP_INLINE_VISIBILITY
    635  1.1  joerg           reverse_iterator rend() _NOEXCEPT
    636  1.1  joerg             {return reverse_iterator(begin());}
    637  1.1  joerg     _LIBCPP_INLINE_VISIBILITY
    638  1.1  joerg     const_reverse_iterator rend() const _NOEXCEPT
    639  1.1  joerg         {return const_reverse_iterator(begin());}
    640  1.1  joerg 
    641  1.1  joerg     _LIBCPP_INLINE_VISIBILITY
    642  1.1  joerg     const_iterator cbegin()  const _NOEXCEPT {return begin();}
    643  1.1  joerg     _LIBCPP_INLINE_VISIBILITY
    644  1.1  joerg     const_iterator cend() const _NOEXCEPT {return end();}
    645  1.1  joerg     _LIBCPP_INLINE_VISIBILITY
    646  1.1  joerg     const_reverse_iterator crbegin() const _NOEXCEPT {return rbegin();}
    647  1.1  joerg     _LIBCPP_INLINE_VISIBILITY
    648  1.1  joerg     const_reverse_iterator crend() const _NOEXCEPT {return rend();}
    649  1.1  joerg 
    650  1.1  joerg     _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY
    651  1.1  joerg     bool empty() const _NOEXCEPT {return __tree_.size() == 0;}
    652  1.1  joerg     _LIBCPP_INLINE_VISIBILITY
    653  1.1  joerg     size_type size() const _NOEXCEPT {return __tree_.size();}
    654  1.1  joerg     _LIBCPP_INLINE_VISIBILITY
    655  1.1  joerg     size_type max_size() const _NOEXCEPT {return __tree_.max_size();}
    656  1.1  joerg 
    657  1.1  joerg     // modifiers:
    658  1.1  joerg #ifndef _LIBCPP_CXX03_LANG
    659  1.1  joerg     template <class... _Args>
    660  1.1  joerg         _LIBCPP_INLINE_VISIBILITY
    661  1.1  joerg         pair<iterator, bool> emplace(_Args&&... __args)
    662  1.1  joerg             {return __tree_.__emplace_unique(_VSTD::forward<_Args>(__args)...);}
    663  1.1  joerg     template <class... _Args>
    664  1.1  joerg         _LIBCPP_INLINE_VISIBILITY
    665  1.1  joerg         iterator emplace_hint(const_iterator __p, _Args&&... __args)
    666  1.1  joerg             {return __tree_.__emplace_hint_unique(__p, _VSTD::forward<_Args>(__args)...);}
    667  1.1  joerg #endif // _LIBCPP_CXX03_LANG
    668  1.1  joerg 
    669  1.1  joerg     _LIBCPP_INLINE_VISIBILITY
    670  1.1  joerg     pair<iterator,bool> insert(const value_type& __v)
    671  1.1  joerg         {return __tree_.__insert_unique(__v);}
    672  1.1  joerg     _LIBCPP_INLINE_VISIBILITY
    673  1.1  joerg     iterator insert(const_iterator __p, const value_type& __v)
    674  1.1  joerg         {return __tree_.__insert_unique(__p, __v);}
    675  1.1  joerg 
    676  1.1  joerg     template <class _InputIterator>
    677  1.1  joerg         _LIBCPP_INLINE_VISIBILITY
    678  1.1  joerg         void insert(_InputIterator __f, _InputIterator __l)
    679  1.1  joerg         {
    680  1.1  joerg             for (const_iterator __e = cend(); __f != __l; ++__f)
    681  1.1  joerg                 __tree_.__insert_unique(__e, *__f);
    682  1.1  joerg         }
    683  1.1  joerg 
    684  1.1  joerg #ifndef _LIBCPP_CXX03_LANG
    685  1.1  joerg     _LIBCPP_INLINE_VISIBILITY
    686  1.1  joerg     pair<iterator,bool> insert(value_type&& __v)
    687  1.1  joerg         {return __tree_.__insert_unique(_VSTD::move(__v));}
    688  1.1  joerg 
    689  1.1  joerg     _LIBCPP_INLINE_VISIBILITY
    690  1.1  joerg     iterator insert(const_iterator __p, value_type&& __v)
    691  1.1  joerg         {return __tree_.__insert_unique(__p, _VSTD::move(__v));}
    692  1.1  joerg 
    693  1.1  joerg     _LIBCPP_INLINE_VISIBILITY
    694  1.1  joerg     void insert(initializer_list<value_type> __il)
    695  1.1  joerg         {insert(__il.begin(), __il.end());}
    696  1.1  joerg #endif // _LIBCPP_CXX03_LANG
    697  1.1  joerg 
    698  1.1  joerg     _LIBCPP_INLINE_VISIBILITY
    699  1.1  joerg     iterator  erase(const_iterator __p) {return __tree_.erase(__p);}
    700  1.1  joerg     _LIBCPP_INLINE_VISIBILITY
    701  1.1  joerg     size_type erase(const key_type& __k)
    702  1.1  joerg         {return __tree_.__erase_unique(__k);}
    703  1.1  joerg     _LIBCPP_INLINE_VISIBILITY
    704  1.1  joerg     iterator  erase(const_iterator __f, const_iterator __l)
    705  1.1  joerg         {return __tree_.erase(__f, __l);}
    706  1.1  joerg     _LIBCPP_INLINE_VISIBILITY
    707  1.1  joerg     void clear() _NOEXCEPT {__tree_.clear();}
    708  1.1  joerg 
    709  1.1  joerg #if _LIBCPP_STD_VER > 14
    710  1.1  joerg     _LIBCPP_INLINE_VISIBILITY
    711  1.1  joerg     insert_return_type insert(node_type&& __nh)
    712  1.1  joerg     {
    713  1.1  joerg         _LIBCPP_ASSERT(__nh.empty() || __nh.get_allocator() == get_allocator(),
    714  1.1  joerg             "node_type with incompatible allocator passed to set::insert()");
    715  1.1  joerg         return __tree_.template __node_handle_insert_unique<
    716  1.1  joerg             node_type, insert_return_type>(_VSTD::move(__nh));
    717  1.1  joerg     }
    718  1.1  joerg     _LIBCPP_INLINE_VISIBILITY
    719  1.1  joerg     iterator insert(const_iterator __hint, node_type&& __nh)
    720  1.1  joerg     {
    721  1.1  joerg         _LIBCPP_ASSERT(__nh.empty() || __nh.get_allocator() == get_allocator(),
    722  1.1  joerg             "node_type with incompatible allocator passed to set::insert()");
    723  1.1  joerg         return __tree_.template __node_handle_insert_unique<node_type>(
    724  1.1  joerg             __hint, _VSTD::move(__nh));
    725  1.1  joerg     }
    726  1.1  joerg     _LIBCPP_INLINE_VISIBILITY
    727  1.1  joerg     node_type extract(key_type const& __key)
    728  1.1  joerg     {
    729  1.1  joerg         return __tree_.template __node_handle_extract<node_type>(__key);
    730  1.1  joerg     }
    731  1.1  joerg     _LIBCPP_INLINE_VISIBILITY
    732  1.1  joerg     node_type extract(const_iterator __it)
    733  1.1  joerg     {
    734  1.1  joerg         return __tree_.template __node_handle_extract<node_type>(__it);
    735  1.1  joerg     }
    736  1.1  joerg     template <class _Compare2>
    737  1.1  joerg     _LIBCPP_INLINE_VISIBILITY
    738  1.1  joerg     void merge(set<key_type, _Compare2, allocator_type>& __source)
    739  1.1  joerg     {
    740  1.1  joerg         _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
    741  1.1  joerg                        "merging container with incompatible allocator");
    742  1.1  joerg         __tree_.__node_handle_merge_unique(__source.__tree_);
    743  1.1  joerg     }
    744  1.1  joerg     template <class _Compare2>
    745  1.1  joerg     _LIBCPP_INLINE_VISIBILITY
    746  1.1  joerg     void merge(set<key_type, _Compare2, allocator_type>&& __source)
    747  1.1  joerg     {
    748  1.1  joerg         _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
    749  1.1  joerg                        "merging container with incompatible allocator");
    750  1.1  joerg         __tree_.__node_handle_merge_unique(__source.__tree_);
    751  1.1  joerg     }
    752  1.1  joerg     template <class _Compare2>
    753  1.1  joerg     _LIBCPP_INLINE_VISIBILITY
    754  1.1  joerg     void merge(multiset<key_type, _Compare2, allocator_type>& __source)
    755  1.1  joerg     {
    756  1.1  joerg         _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
    757  1.1  joerg                        "merging container with incompatible allocator");
    758  1.1  joerg         __tree_.__node_handle_merge_unique(__source.__tree_);
    759  1.1  joerg     }
    760  1.1  joerg     template <class _Compare2>
    761  1.1  joerg     _LIBCPP_INLINE_VISIBILITY
    762  1.1  joerg     void merge(multiset<key_type, _Compare2, allocator_type>&& __source)
    763  1.1  joerg     {
    764  1.1  joerg         _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
    765  1.1  joerg                        "merging container with incompatible allocator");
    766  1.1  joerg         __tree_.__node_handle_merge_unique(__source.__tree_);
    767  1.1  joerg     }
    768  1.1  joerg #endif
    769  1.1  joerg 
    770  1.1  joerg     _LIBCPP_INLINE_VISIBILITY
    771  1.1  joerg     void swap(set& __s) _NOEXCEPT_(__is_nothrow_swappable<__base>::value)
    772  1.1  joerg         {__tree_.swap(__s.__tree_);}
    773  1.1  joerg 
    774  1.1  joerg     _LIBCPP_INLINE_VISIBILITY
    775  1.1  joerg     allocator_type get_allocator() const _NOEXCEPT {return __tree_.__alloc();}
    776  1.1  joerg     _LIBCPP_INLINE_VISIBILITY
    777  1.1  joerg     key_compare    key_comp()      const {return __tree_.value_comp();}
    778  1.1  joerg     _LIBCPP_INLINE_VISIBILITY
    779  1.1  joerg     value_compare  value_comp()    const {return __tree_.value_comp();}
    780  1.1  joerg 
    781  1.1  joerg     // set operations:
    782  1.1  joerg     _LIBCPP_INLINE_VISIBILITY
    783  1.1  joerg     iterator find(const key_type& __k)             {return __tree_.find(__k);}
    784  1.1  joerg     _LIBCPP_INLINE_VISIBILITY
    785  1.1  joerg     const_iterator find(const key_type& __k) const {return __tree_.find(__k);}
    786  1.1  joerg #if _LIBCPP_STD_VER > 11
    787  1.1  joerg     template <typename _K2>
    788  1.1  joerg     _LIBCPP_INLINE_VISIBILITY
    789  1.1  joerg     typename enable_if<__is_transparent<_Compare, _K2>::value,iterator>::type
    790  1.1  joerg     find(const _K2& __k)                           {return __tree_.find(__k);}
    791  1.1  joerg     template <typename _K2>
    792  1.1  joerg     _LIBCPP_INLINE_VISIBILITY
    793  1.1  joerg     typename enable_if<__is_transparent<_Compare, _K2>::value,const_iterator>::type
    794  1.1  joerg     find(const _K2& __k) const                     {return __tree_.find(__k);}
    795  1.1  joerg #endif
    796  1.1  joerg 
    797  1.1  joerg     _LIBCPP_INLINE_VISIBILITY
    798  1.1  joerg     size_type      count(const key_type& __k) const
    799  1.1  joerg         {return __tree_.__count_unique(__k);}
    800  1.1  joerg #if _LIBCPP_STD_VER > 11
    801  1.1  joerg     template <typename _K2>
    802  1.1  joerg     _LIBCPP_INLINE_VISIBILITY
    803  1.1  joerg     typename enable_if<__is_transparent<_Compare, _K2>::value,size_type>::type
    804  1.1  joerg     count(const _K2& __k) const                    {return __tree_.__count_multi(__k);}
    805  1.1  joerg #endif
    806  1.1  joerg 
    807  1.1  joerg #if _LIBCPP_STD_VER > 17
    808  1.1  joerg     _LIBCPP_INLINE_VISIBILITY
    809  1.1  joerg     bool contains(const key_type& __k) const {return find(__k) != end();}
    810  1.1  joerg     template <typename _K2>
    811  1.1  joerg     _LIBCPP_INLINE_VISIBILITY
    812  1.1  joerg     typename enable_if<__is_transparent<_Compare, _K2>::value, bool>::type
    813  1.1  joerg     contains(const _K2& __k) const { return find(__k) != end(); }
    814  1.1  joerg #endif // _LIBCPP_STD_VER > 17
    815  1.1  joerg 
    816  1.1  joerg     _LIBCPP_INLINE_VISIBILITY
    817  1.1  joerg     iterator lower_bound(const key_type& __k)
    818  1.1  joerg         {return __tree_.lower_bound(__k);}
    819  1.1  joerg     _LIBCPP_INLINE_VISIBILITY
    820  1.1  joerg     const_iterator lower_bound(const key_type& __k) const
    821  1.1  joerg         {return __tree_.lower_bound(__k);}
    822  1.1  joerg #if _LIBCPP_STD_VER > 11
    823  1.1  joerg     template <typename _K2>
    824  1.1  joerg     _LIBCPP_INLINE_VISIBILITY
    825  1.1  joerg     typename enable_if<__is_transparent<_Compare, _K2>::value,iterator>::type
    826  1.1  joerg     lower_bound(const _K2& __k)       {return __tree_.lower_bound(__k);}
    827  1.1  joerg 
    828  1.1  joerg     template <typename _K2>
    829  1.1  joerg     _LIBCPP_INLINE_VISIBILITY
    830  1.1  joerg     typename enable_if<__is_transparent<_Compare, _K2>::value,const_iterator>::type
    831  1.1  joerg     lower_bound(const _K2& __k) const {return __tree_.lower_bound(__k);}
    832  1.1  joerg #endif
    833  1.1  joerg 
    834  1.1  joerg     _LIBCPP_INLINE_VISIBILITY
    835  1.1  joerg     iterator upper_bound(const key_type& __k)
    836  1.1  joerg         {return __tree_.upper_bound(__k);}
    837  1.1  joerg     _LIBCPP_INLINE_VISIBILITY
    838  1.1  joerg     const_iterator upper_bound(const key_type& __k) const
    839  1.1  joerg         {return __tree_.upper_bound(__k);}
    840  1.1  joerg #if _LIBCPP_STD_VER > 11
    841  1.1  joerg     template <typename _K2>
    842  1.1  joerg     _LIBCPP_INLINE_VISIBILITY
    843  1.1  joerg     typename enable_if<__is_transparent<_Compare, _K2>::value,iterator>::type
    844  1.1  joerg     upper_bound(const _K2& __k)       {return __tree_.upper_bound(__k);}
    845  1.1  joerg     template <typename _K2>
    846  1.1  joerg     _LIBCPP_INLINE_VISIBILITY
    847  1.1  joerg     typename enable_if<__is_transparent<_Compare, _K2>::value,const_iterator>::type
    848  1.1  joerg     upper_bound(const _K2& __k) const {return __tree_.upper_bound(__k);}
    849  1.1  joerg #endif
    850  1.1  joerg 
    851  1.1  joerg     _LIBCPP_INLINE_VISIBILITY
    852  1.1  joerg     pair<iterator,iterator> equal_range(const key_type& __k)
    853  1.1  joerg         {return __tree_.__equal_range_unique(__k);}
    854  1.1  joerg     _LIBCPP_INLINE_VISIBILITY
    855  1.1  joerg     pair<const_iterator,const_iterator> equal_range(const key_type& __k) const
    856  1.1  joerg         {return __tree_.__equal_range_unique(__k);}
    857  1.1  joerg #if _LIBCPP_STD_VER > 11
    858  1.1  joerg     template <typename _K2>
    859  1.1  joerg     _LIBCPP_INLINE_VISIBILITY
    860  1.1  joerg     typename enable_if<__is_transparent<_Compare, _K2>::value,pair<iterator,iterator>>::type
    861  1.1  joerg     equal_range(const _K2& __k)       {return __tree_.__equal_range_multi(__k);}
    862  1.1  joerg     template <typename _K2>
    863  1.1  joerg     _LIBCPP_INLINE_VISIBILITY
    864  1.1  joerg     typename enable_if<__is_transparent<_Compare, _K2>::value,pair<const_iterator,const_iterator>>::type
    865  1.1  joerg     equal_range(const _K2& __k) const {return __tree_.__equal_range_multi(__k);}
    866  1.1  joerg #endif
    867  1.1  joerg };
    868  1.1  joerg 
    869  1.1  joerg #ifndef _LIBCPP_HAS_NO_DEDUCTION_GUIDES
    870  1.1  joerg template<class _InputIterator,
    871  1.1  joerg          class _Compare = less<__iter_value_type<_InputIterator>>,
    872  1.1  joerg          class _Allocator = allocator<__iter_value_type<_InputIterator>>,
    873  1.1  joerg          class = _EnableIf<__is_allocator<_Allocator>::value, void>,
    874  1.1  joerg          class = _EnableIf<!__is_allocator<_Compare>::value, void>>
    875  1.1  joerg set(_InputIterator, _InputIterator, _Compare = _Compare(), _Allocator = _Allocator())
    876  1.1  joerg   -> set<__iter_value_type<_InputIterator>, _Compare, _Allocator>;
    877  1.1  joerg 
    878  1.1  joerg template<class _Key, class _Compare = less<_Key>,
    879  1.1  joerg          class _Allocator = allocator<_Key>,
    880  1.1  joerg          class = _EnableIf<__is_allocator<_Allocator>::value, void>,
    881  1.1  joerg          class = _EnableIf<!__is_allocator<_Compare>::value, void>>
    882  1.1  joerg set(initializer_list<_Key>, _Compare = _Compare(), _Allocator = _Allocator())
    883  1.1  joerg   -> set<_Key, _Compare, _Allocator>;
    884  1.1  joerg 
    885  1.1  joerg template<class _InputIterator, class _Allocator,
    886  1.1  joerg          class = _EnableIf<__is_allocator<_Allocator>::value, void>>
    887  1.1  joerg set(_InputIterator, _InputIterator, _Allocator)
    888  1.1  joerg   -> set<__iter_value_type<_InputIterator>,
    889  1.1  joerg          less<__iter_value_type<_InputIterator>>, _Allocator>;
    890  1.1  joerg 
    891  1.1  joerg template<class _Key, class _Allocator,
    892  1.1  joerg          class = _EnableIf<__is_allocator<_Allocator>::value, void>>
    893  1.1  joerg set(initializer_list<_Key>, _Allocator)
    894  1.1  joerg   -> set<_Key, less<_Key>, _Allocator>;
    895  1.1  joerg #endif
    896  1.1  joerg 
    897  1.1  joerg #ifndef _LIBCPP_CXX03_LANG
    898  1.1  joerg 
    899  1.1  joerg template <class _Key, class _Compare, class _Allocator>
    900  1.1  joerg set<_Key, _Compare, _Allocator>::set(set&& __s, const allocator_type& __a)
    901  1.1  joerg     : __tree_(_VSTD::move(__s.__tree_), __a)
    902  1.1  joerg {
    903  1.1  joerg     if (__a != __s.get_allocator())
    904  1.1  joerg     {
    905  1.1  joerg         const_iterator __e = cend();
    906  1.1  joerg         while (!__s.empty())
    907  1.1  joerg             insert(__e, _VSTD::move(__s.__tree_.remove(__s.begin())->__value_));
    908  1.1  joerg     }
    909  1.1  joerg }
    910  1.1  joerg 
    911  1.1  joerg #endif // _LIBCPP_CXX03_LANG
    912  1.1  joerg 
    913  1.1  joerg template <class _Key, class _Compare, class _Allocator>
    914  1.1  joerg inline _LIBCPP_INLINE_VISIBILITY
    915  1.1  joerg bool
    916  1.1  joerg operator==(const set<_Key, _Compare, _Allocator>& __x,
    917  1.1  joerg            const set<_Key, _Compare, _Allocator>& __y)
    918  1.1  joerg {
    919  1.1  joerg     return __x.size() == __y.size() && _VSTD::equal(__x.begin(), __x.end(), __y.begin());
    920  1.1  joerg }
    921  1.1  joerg 
    922  1.1  joerg template <class _Key, class _Compare, class _Allocator>
    923  1.1  joerg inline _LIBCPP_INLINE_VISIBILITY
    924  1.1  joerg bool
    925  1.1  joerg operator< (const set<_Key, _Compare, _Allocator>& __x,
    926  1.1  joerg            const set<_Key, _Compare, _Allocator>& __y)
    927  1.1  joerg {
    928  1.1  joerg     return _VSTD::lexicographical_compare(__x.begin(), __x.end(), __y.begin(), __y.end());
    929  1.1  joerg }
    930  1.1  joerg 
    931  1.1  joerg template <class _Key, class _Compare, class _Allocator>
    932  1.1  joerg inline _LIBCPP_INLINE_VISIBILITY
    933  1.1  joerg bool
    934  1.1  joerg operator!=(const set<_Key, _Compare, _Allocator>& __x,
    935  1.1  joerg            const set<_Key, _Compare, _Allocator>& __y)
    936  1.1  joerg {
    937  1.1  joerg     return !(__x == __y);
    938  1.1  joerg }
    939  1.1  joerg 
    940  1.1  joerg template <class _Key, class _Compare, class _Allocator>
    941  1.1  joerg inline _LIBCPP_INLINE_VISIBILITY
    942  1.1  joerg bool
    943  1.1  joerg operator> (const set<_Key, _Compare, _Allocator>& __x,
    944  1.1  joerg            const set<_Key, _Compare, _Allocator>& __y)
    945  1.1  joerg {
    946  1.1  joerg     return __y < __x;
    947  1.1  joerg }
    948  1.1  joerg 
    949  1.1  joerg template <class _Key, class _Compare, class _Allocator>
    950  1.1  joerg inline _LIBCPP_INLINE_VISIBILITY
    951  1.1  joerg bool
    952  1.1  joerg operator>=(const set<_Key, _Compare, _Allocator>& __x,
    953  1.1  joerg            const set<_Key, _Compare, _Allocator>& __y)
    954  1.1  joerg {
    955  1.1  joerg     return !(__x < __y);
    956  1.1  joerg }
    957  1.1  joerg 
    958  1.1  joerg template <class _Key, class _Compare, class _Allocator>
    959  1.1  joerg inline _LIBCPP_INLINE_VISIBILITY
    960  1.1  joerg bool
    961  1.1  joerg operator<=(const set<_Key, _Compare, _Allocator>& __x,
    962  1.1  joerg            const set<_Key, _Compare, _Allocator>& __y)
    963  1.1  joerg {
    964  1.1  joerg     return !(__y < __x);
    965  1.1  joerg }
    966  1.1  joerg 
    967  1.1  joerg // specialized algorithms:
    968  1.1  joerg template <class _Key, class _Compare, class _Allocator>
    969  1.1  joerg inline _LIBCPP_INLINE_VISIBILITY
    970  1.1  joerg void
    971  1.1  joerg swap(set<_Key, _Compare, _Allocator>& __x,
    972  1.1  joerg      set<_Key, _Compare, _Allocator>& __y)
    973  1.1  joerg     _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
    974  1.1  joerg {
    975  1.1  joerg     __x.swap(__y);
    976  1.1  joerg }
    977  1.1  joerg 
    978  1.1  joerg #if _LIBCPP_STD_VER > 17
    979  1.1  joerg template <class _Key, class _Compare, class _Allocator, class _Predicate>
    980  1.1  joerg inline _LIBCPP_INLINE_VISIBILITY
    981  1.1  joerg     typename set<_Key, _Compare, _Allocator>::size_type
    982  1.1  joerg     erase_if(set<_Key, _Compare, _Allocator>& __c, _Predicate __pred) {
    983  1.1  joerg   return _VSTD::__libcpp_erase_if_container(__c, __pred);
    984  1.1  joerg }
    985  1.1  joerg #endif
    986  1.1  joerg 
    987  1.1  joerg template <class _Key, class _Compare = less<_Key>,
    988  1.1  joerg           class _Allocator = allocator<_Key> >
    989  1.1  joerg class _LIBCPP_TEMPLATE_VIS multiset
    990  1.1  joerg {
    991  1.1  joerg public:
    992  1.1  joerg     // types:
    993  1.1  joerg     typedef _Key                                     key_type;
    994  1.1  joerg     typedef key_type                                 value_type;
    995  1.1  joerg     typedef _Compare                                 key_compare;
    996  1.1  joerg     typedef key_compare                              value_compare;
    997  1.1  joerg     typedef __identity_t<_Allocator>                 allocator_type;
    998  1.1  joerg     typedef value_type&                              reference;
    999  1.1  joerg     typedef const value_type&                        const_reference;
   1000  1.1  joerg 
   1001  1.1  joerg     static_assert((is_same<typename allocator_type::value_type, value_type>::value),
   1002  1.1  joerg                   "Allocator::value_type must be same type as value_type");
   1003  1.1  joerg 
   1004  1.1  joerg private:
   1005  1.1  joerg     typedef __tree<value_type, value_compare, allocator_type> __base;
   1006  1.1  joerg     typedef allocator_traits<allocator_type>                  __alloc_traits;
   1007  1.1  joerg     typedef typename __base::__node_holder                    __node_holder;
   1008  1.1  joerg 
   1009  1.1  joerg     __base __tree_;
   1010  1.1  joerg 
   1011  1.1  joerg public:
   1012  1.1  joerg     typedef typename __base::pointer               pointer;
   1013  1.1  joerg     typedef typename __base::const_pointer         const_pointer;
   1014  1.1  joerg     typedef typename __base::size_type             size_type;
   1015  1.1  joerg     typedef typename __base::difference_type       difference_type;
   1016  1.1  joerg     typedef typename __base::const_iterator        iterator;
   1017  1.1  joerg     typedef typename __base::const_iterator        const_iterator;
   1018  1.1  joerg     typedef _VSTD::reverse_iterator<iterator>       reverse_iterator;
   1019  1.1  joerg     typedef _VSTD::reverse_iterator<const_iterator> const_reverse_iterator;
   1020  1.1  joerg 
   1021  1.1  joerg #if _LIBCPP_STD_VER > 14
   1022  1.1  joerg     typedef __set_node_handle<typename __base::__node, allocator_type> node_type;
   1023  1.1  joerg #endif
   1024  1.1  joerg 
   1025  1.1  joerg     template <class _Key2, class _Compare2, class _Alloc2>
   1026  1.1  joerg         friend class _LIBCPP_TEMPLATE_VIS set;
   1027  1.1  joerg     template <class _Key2, class _Compare2, class _Alloc2>
   1028  1.1  joerg         friend class _LIBCPP_TEMPLATE_VIS multiset;
   1029  1.1  joerg 
   1030  1.1  joerg     // construct/copy/destroy:
   1031  1.1  joerg     _LIBCPP_INLINE_VISIBILITY
   1032  1.1  joerg     multiset()
   1033  1.1  joerg         _NOEXCEPT_(
   1034  1.1  joerg             is_nothrow_default_constructible<allocator_type>::value &&
   1035  1.1  joerg             is_nothrow_default_constructible<key_compare>::value &&
   1036  1.1  joerg             is_nothrow_copy_constructible<key_compare>::value)
   1037  1.1  joerg         : __tree_(value_compare()) {}
   1038  1.1  joerg 
   1039  1.1  joerg     _LIBCPP_INLINE_VISIBILITY
   1040  1.1  joerg     explicit multiset(const value_compare& __comp)
   1041  1.1  joerg         _NOEXCEPT_(
   1042  1.1  joerg             is_nothrow_default_constructible<allocator_type>::value &&
   1043  1.1  joerg             is_nothrow_copy_constructible<key_compare>::value)
   1044  1.1  joerg         : __tree_(__comp) {}
   1045  1.1  joerg 
   1046  1.1  joerg     _LIBCPP_INLINE_VISIBILITY
   1047  1.1  joerg     explicit multiset(const value_compare& __comp, const allocator_type& __a)
   1048  1.1  joerg         : __tree_(__comp, __a) {}
   1049  1.1  joerg     template <class _InputIterator>
   1050  1.1  joerg         _LIBCPP_INLINE_VISIBILITY
   1051  1.1  joerg         multiset(_InputIterator __f, _InputIterator __l,
   1052  1.1  joerg                  const value_compare& __comp = value_compare())
   1053  1.1  joerg         : __tree_(__comp)
   1054  1.1  joerg         {
   1055  1.1  joerg             insert(__f, __l);
   1056  1.1  joerg         }
   1057  1.1  joerg 
   1058  1.1  joerg #if _LIBCPP_STD_VER > 11
   1059  1.1  joerg         template <class _InputIterator>
   1060  1.1  joerg         _LIBCPP_INLINE_VISIBILITY
   1061  1.1  joerg         multiset(_InputIterator __f, _InputIterator __l, const allocator_type& __a)
   1062  1.1  joerg             : multiset(__f, __l, key_compare(), __a) {}
   1063  1.1  joerg #endif
   1064  1.1  joerg 
   1065  1.1  joerg     template <class _InputIterator>
   1066  1.1  joerg         _LIBCPP_INLINE_VISIBILITY
   1067  1.1  joerg         multiset(_InputIterator __f, _InputIterator __l,
   1068  1.1  joerg                  const value_compare& __comp, const allocator_type& __a)
   1069  1.1  joerg         : __tree_(__comp, __a)
   1070  1.1  joerg         {
   1071  1.1  joerg             insert(__f, __l);
   1072  1.1  joerg         }
   1073  1.1  joerg 
   1074  1.1  joerg     _LIBCPP_INLINE_VISIBILITY
   1075  1.1  joerg     multiset(const multiset& __s)
   1076  1.1  joerg         : __tree_(__s.__tree_.value_comp(),
   1077  1.1  joerg           __alloc_traits::select_on_container_copy_construction(__s.__tree_.__alloc()))
   1078  1.1  joerg         {
   1079  1.1  joerg             insert(__s.begin(), __s.end());
   1080  1.1  joerg         }
   1081  1.1  joerg 
   1082  1.1  joerg     _LIBCPP_INLINE_VISIBILITY
   1083  1.1  joerg     multiset& operator=(const multiset& __s)
   1084  1.1  joerg         {
   1085  1.1  joerg             __tree_ = __s.__tree_;
   1086  1.1  joerg             return *this;
   1087  1.1  joerg         }
   1088  1.1  joerg 
   1089  1.1  joerg #ifndef _LIBCPP_CXX03_LANG
   1090  1.1  joerg     _LIBCPP_INLINE_VISIBILITY
   1091  1.1  joerg     multiset(multiset&& __s)
   1092  1.1  joerg         _NOEXCEPT_(is_nothrow_move_constructible<__base>::value)
   1093  1.1  joerg         : __tree_(_VSTD::move(__s.__tree_)) {}
   1094  1.1  joerg 
   1095  1.1  joerg     multiset(multiset&& __s, const allocator_type& __a);
   1096  1.1  joerg #endif // _LIBCPP_CXX03_LANG
   1097  1.1  joerg     _LIBCPP_INLINE_VISIBILITY
   1098  1.1  joerg     explicit multiset(const allocator_type& __a)
   1099  1.1  joerg         : __tree_(__a) {}
   1100  1.1  joerg     _LIBCPP_INLINE_VISIBILITY
   1101  1.1  joerg     multiset(const multiset& __s, const allocator_type& __a)
   1102  1.1  joerg         : __tree_(__s.__tree_.value_comp(), __a)
   1103  1.1  joerg         {
   1104  1.1  joerg             insert(__s.begin(), __s.end());
   1105  1.1  joerg         }
   1106  1.1  joerg 
   1107  1.1  joerg #ifndef _LIBCPP_CXX03_LANG
   1108  1.1  joerg     _LIBCPP_INLINE_VISIBILITY
   1109  1.1  joerg     multiset(initializer_list<value_type> __il, const value_compare& __comp = value_compare())
   1110  1.1  joerg         : __tree_(__comp)
   1111  1.1  joerg         {
   1112  1.1  joerg             insert(__il.begin(), __il.end());
   1113  1.1  joerg         }
   1114  1.1  joerg 
   1115  1.1  joerg     _LIBCPP_INLINE_VISIBILITY
   1116  1.1  joerg     multiset(initializer_list<value_type> __il, const value_compare& __comp,
   1117  1.1  joerg         const allocator_type& __a)
   1118  1.1  joerg         : __tree_(__comp, __a)
   1119  1.1  joerg         {
   1120  1.1  joerg             insert(__il.begin(), __il.end());
   1121  1.1  joerg         }
   1122  1.1  joerg 
   1123  1.1  joerg #if _LIBCPP_STD_VER > 11
   1124  1.1  joerg     _LIBCPP_INLINE_VISIBILITY
   1125  1.1  joerg     multiset(initializer_list<value_type> __il, const allocator_type& __a)
   1126  1.1  joerg         : multiset(__il, key_compare(), __a) {}
   1127  1.1  joerg #endif
   1128  1.1  joerg 
   1129  1.1  joerg     _LIBCPP_INLINE_VISIBILITY
   1130  1.1  joerg     multiset& operator=(initializer_list<value_type> __il)
   1131  1.1  joerg         {
   1132  1.1  joerg             __tree_.__assign_multi(__il.begin(), __il.end());
   1133  1.1  joerg             return *this;
   1134  1.1  joerg         }
   1135  1.1  joerg 
   1136  1.1  joerg     _LIBCPP_INLINE_VISIBILITY
   1137  1.1  joerg     multiset& operator=(multiset&& __s)
   1138  1.1  joerg         _NOEXCEPT_(is_nothrow_move_assignable<__base>::value)
   1139  1.1  joerg         {
   1140  1.1  joerg             __tree_ = _VSTD::move(__s.__tree_);
   1141  1.1  joerg             return *this;
   1142  1.1  joerg         }
   1143  1.1  joerg #endif // _LIBCPP_CXX03_LANG
   1144  1.1  joerg 
   1145  1.1  joerg     _LIBCPP_INLINE_VISIBILITY
   1146  1.1  joerg     ~multiset() {
   1147  1.1  joerg         static_assert(sizeof(__diagnose_non_const_comparator<_Key, _Compare>()), "");
   1148  1.1  joerg     }
   1149  1.1  joerg 
   1150  1.1  joerg     _LIBCPP_INLINE_VISIBILITY
   1151  1.1  joerg           iterator begin() _NOEXCEPT       {return __tree_.begin();}
   1152  1.1  joerg     _LIBCPP_INLINE_VISIBILITY
   1153  1.1  joerg     const_iterator begin() const _NOEXCEPT {return __tree_.begin();}
   1154  1.1  joerg     _LIBCPP_INLINE_VISIBILITY
   1155  1.1  joerg           iterator end() _NOEXCEPT         {return __tree_.end();}
   1156  1.1  joerg     _LIBCPP_INLINE_VISIBILITY
   1157  1.1  joerg     const_iterator end()   const _NOEXCEPT {return __tree_.end();}
   1158  1.1  joerg 
   1159  1.1  joerg     _LIBCPP_INLINE_VISIBILITY
   1160  1.1  joerg           reverse_iterator rbegin() _NOEXCEPT
   1161  1.1  joerg             {return reverse_iterator(end());}
   1162  1.1  joerg     _LIBCPP_INLINE_VISIBILITY
   1163  1.1  joerg     const_reverse_iterator rbegin() const _NOEXCEPT
   1164  1.1  joerg         {return const_reverse_iterator(end());}
   1165  1.1  joerg     _LIBCPP_INLINE_VISIBILITY
   1166  1.1  joerg           reverse_iterator rend() _NOEXCEPT
   1167  1.1  joerg             {return       reverse_iterator(begin());}
   1168  1.1  joerg     _LIBCPP_INLINE_VISIBILITY
   1169  1.1  joerg     const_reverse_iterator rend() const _NOEXCEPT
   1170  1.1  joerg         {return const_reverse_iterator(begin());}
   1171  1.1  joerg 
   1172  1.1  joerg     _LIBCPP_INLINE_VISIBILITY
   1173  1.1  joerg     const_iterator cbegin()  const _NOEXCEPT {return begin();}
   1174  1.1  joerg     _LIBCPP_INLINE_VISIBILITY
   1175  1.1  joerg     const_iterator cend() const _NOEXCEPT {return end();}
   1176  1.1  joerg     _LIBCPP_INLINE_VISIBILITY
   1177  1.1  joerg     const_reverse_iterator crbegin() const _NOEXCEPT {return rbegin();}
   1178  1.1  joerg     _LIBCPP_INLINE_VISIBILITY
   1179  1.1  joerg     const_reverse_iterator crend() const _NOEXCEPT {return rend();}
   1180  1.1  joerg 
   1181  1.1  joerg     _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY
   1182  1.1  joerg     bool empty() const _NOEXCEPT {return __tree_.size() == 0;}
   1183  1.1  joerg     _LIBCPP_INLINE_VISIBILITY
   1184  1.1  joerg     size_type size() const _NOEXCEPT {return __tree_.size();}
   1185  1.1  joerg     _LIBCPP_INLINE_VISIBILITY
   1186  1.1  joerg     size_type max_size() const _NOEXCEPT {return __tree_.max_size();}
   1187  1.1  joerg 
   1188  1.1  joerg     // modifiers:
   1189  1.1  joerg #ifndef _LIBCPP_CXX03_LANG
   1190  1.1  joerg     template <class... _Args>
   1191  1.1  joerg         _LIBCPP_INLINE_VISIBILITY
   1192  1.1  joerg         iterator emplace(_Args&&... __args)
   1193  1.1  joerg             {return __tree_.__emplace_multi(_VSTD::forward<_Args>(__args)...);}
   1194  1.1  joerg     template <class... _Args>
   1195  1.1  joerg         _LIBCPP_INLINE_VISIBILITY
   1196  1.1  joerg         iterator emplace_hint(const_iterator __p, _Args&&... __args)
   1197  1.1  joerg             {return __tree_.__emplace_hint_multi(__p, _VSTD::forward<_Args>(__args)...);}
   1198  1.1  joerg #endif // _LIBCPP_CXX03_LANG
   1199  1.1  joerg 
   1200  1.1  joerg     _LIBCPP_INLINE_VISIBILITY
   1201  1.1  joerg     iterator insert(const value_type& __v)
   1202  1.1  joerg         {return __tree_.__insert_multi(__v);}
   1203  1.1  joerg     _LIBCPP_INLINE_VISIBILITY
   1204  1.1  joerg     iterator insert(const_iterator __p, const value_type& __v)
   1205  1.1  joerg         {return __tree_.__insert_multi(__p, __v);}
   1206  1.1  joerg 
   1207  1.1  joerg     template <class _InputIterator>
   1208  1.1  joerg         _LIBCPP_INLINE_VISIBILITY
   1209  1.1  joerg         void insert(_InputIterator __f, _InputIterator __l)
   1210  1.1  joerg         {
   1211  1.1  joerg             for (const_iterator __e = cend(); __f != __l; ++__f)
   1212  1.1  joerg                 __tree_.__insert_multi(__e, *__f);
   1213  1.1  joerg         }
   1214  1.1  joerg 
   1215  1.1  joerg #ifndef _LIBCPP_CXX03_LANG
   1216  1.1  joerg     _LIBCPP_INLINE_VISIBILITY
   1217  1.1  joerg     iterator insert(value_type&& __v)
   1218  1.1  joerg         {return __tree_.__insert_multi(_VSTD::move(__v));}
   1219  1.1  joerg 
   1220  1.1  joerg     _LIBCPP_INLINE_VISIBILITY
   1221  1.1  joerg     iterator insert(const_iterator __p, value_type&& __v)
   1222  1.1  joerg         {return __tree_.__insert_multi(__p, _VSTD::move(__v));}
   1223  1.1  joerg 
   1224  1.1  joerg     _LIBCPP_INLINE_VISIBILITY
   1225  1.1  joerg     void insert(initializer_list<value_type> __il)
   1226  1.1  joerg         {insert(__il.begin(), __il.end());}
   1227  1.1  joerg #endif // _LIBCPP_CXX03_LANG
   1228  1.1  joerg 
   1229  1.1  joerg     _LIBCPP_INLINE_VISIBILITY
   1230  1.1  joerg     iterator  erase(const_iterator __p) {return __tree_.erase(__p);}
   1231  1.1  joerg     _LIBCPP_INLINE_VISIBILITY
   1232  1.1  joerg     size_type erase(const key_type& __k) {return __tree_.__erase_multi(__k);}
   1233  1.1  joerg     _LIBCPP_INLINE_VISIBILITY
   1234  1.1  joerg     iterator  erase(const_iterator __f, const_iterator __l)
   1235  1.1  joerg         {return __tree_.erase(__f, __l);}
   1236  1.1  joerg     _LIBCPP_INLINE_VISIBILITY
   1237  1.1  joerg     void clear() _NOEXCEPT {__tree_.clear();}
   1238  1.1  joerg 
   1239  1.1  joerg #if _LIBCPP_STD_VER > 14
   1240  1.1  joerg     _LIBCPP_INLINE_VISIBILITY
   1241  1.1  joerg     iterator insert(node_type&& __nh)
   1242  1.1  joerg     {
   1243  1.1  joerg         _LIBCPP_ASSERT(__nh.empty() || __nh.get_allocator() == get_allocator(),
   1244  1.1  joerg             "node_type with incompatible allocator passed to multiset::insert()");
   1245  1.1  joerg         return __tree_.template __node_handle_insert_multi<node_type>(
   1246  1.1  joerg             _VSTD::move(__nh));
   1247  1.1  joerg     }
   1248  1.1  joerg     _LIBCPP_INLINE_VISIBILITY
   1249  1.1  joerg     iterator insert(const_iterator __hint, node_type&& __nh)
   1250  1.1  joerg     {
   1251  1.1  joerg         _LIBCPP_ASSERT(__nh.empty() || __nh.get_allocator() == get_allocator(),
   1252  1.1  joerg             "node_type with incompatible allocator passed to multiset::insert()");
   1253  1.1  joerg         return __tree_.template __node_handle_insert_multi<node_type>(
   1254  1.1  joerg             __hint, _VSTD::move(__nh));
   1255  1.1  joerg     }
   1256  1.1  joerg     _LIBCPP_INLINE_VISIBILITY
   1257  1.1  joerg     node_type extract(key_type const& __key)
   1258  1.1  joerg     {
   1259  1.1  joerg         return __tree_.template __node_handle_extract<node_type>(__key);
   1260  1.1  joerg     }
   1261  1.1  joerg     _LIBCPP_INLINE_VISIBILITY
   1262  1.1  joerg     node_type extract(const_iterator __it)
   1263  1.1  joerg     {
   1264  1.1  joerg         return __tree_.template __node_handle_extract<node_type>(__it);
   1265  1.1  joerg     }
   1266  1.1  joerg     template <class _Compare2>
   1267  1.1  joerg     _LIBCPP_INLINE_VISIBILITY
   1268  1.1  joerg     void merge(multiset<key_type, _Compare2, allocator_type>& __source)
   1269  1.1  joerg     {
   1270  1.1  joerg         _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
   1271  1.1  joerg                        "merging container with incompatible allocator");
   1272  1.1  joerg         __tree_.__node_handle_merge_multi(__source.__tree_);
   1273  1.1  joerg     }
   1274  1.1  joerg     template <class _Compare2>
   1275  1.1  joerg     _LIBCPP_INLINE_VISIBILITY
   1276  1.1  joerg     void merge(multiset<key_type, _Compare2, allocator_type>&& __source)
   1277  1.1  joerg     {
   1278  1.1  joerg         _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
   1279  1.1  joerg                        "merging container with incompatible allocator");
   1280  1.1  joerg         __tree_.__node_handle_merge_multi(__source.__tree_);
   1281  1.1  joerg     }
   1282  1.1  joerg     template <class _Compare2>
   1283  1.1  joerg     _LIBCPP_INLINE_VISIBILITY
   1284  1.1  joerg     void merge(set<key_type, _Compare2, allocator_type>& __source)
   1285  1.1  joerg     {
   1286  1.1  joerg         _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
   1287  1.1  joerg                        "merging container with incompatible allocator");
   1288  1.1  joerg         __tree_.__node_handle_merge_multi(__source.__tree_);
   1289  1.1  joerg     }
   1290  1.1  joerg     template <class _Compare2>
   1291  1.1  joerg     _LIBCPP_INLINE_VISIBILITY
   1292  1.1  joerg     void merge(set<key_type, _Compare2, allocator_type>&& __source)
   1293  1.1  joerg     {
   1294  1.1  joerg         _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
   1295  1.1  joerg                        "merging container with incompatible allocator");
   1296  1.1  joerg         __tree_.__node_handle_merge_multi(__source.__tree_);
   1297  1.1  joerg     }
   1298  1.1  joerg #endif
   1299  1.1  joerg 
   1300  1.1  joerg     _LIBCPP_INLINE_VISIBILITY
   1301  1.1  joerg     void swap(multiset& __s)
   1302  1.1  joerg         _NOEXCEPT_(__is_nothrow_swappable<__base>::value)
   1303  1.1  joerg         {__tree_.swap(__s.__tree_);}
   1304  1.1  joerg 
   1305  1.1  joerg     _LIBCPP_INLINE_VISIBILITY
   1306  1.1  joerg     allocator_type get_allocator() const _NOEXCEPT {return __tree_.__alloc();}
   1307  1.1  joerg     _LIBCPP_INLINE_VISIBILITY
   1308  1.1  joerg     key_compare    key_comp()      const {return __tree_.value_comp();}
   1309  1.1  joerg     _LIBCPP_INLINE_VISIBILITY
   1310  1.1  joerg     value_compare  value_comp()    const {return __tree_.value_comp();}
   1311  1.1  joerg 
   1312  1.1  joerg     // set operations:
   1313  1.1  joerg     _LIBCPP_INLINE_VISIBILITY
   1314  1.1  joerg     iterator find(const key_type& __k)             {return __tree_.find(__k);}
   1315  1.1  joerg     _LIBCPP_INLINE_VISIBILITY
   1316  1.1  joerg     const_iterator find(const key_type& __k) const {return __tree_.find(__k);}
   1317  1.1  joerg #if _LIBCPP_STD_VER > 11
   1318  1.1  joerg     template <typename _K2>
   1319  1.1  joerg     _LIBCPP_INLINE_VISIBILITY
   1320  1.1  joerg     typename enable_if<__is_transparent<_Compare, _K2>::value,iterator>::type
   1321  1.1  joerg     find(const _K2& __k)                           {return __tree_.find(__k);}
   1322  1.1  joerg     template <typename _K2>
   1323  1.1  joerg     _LIBCPP_INLINE_VISIBILITY
   1324  1.1  joerg     typename enable_if<__is_transparent<_Compare, _K2>::value,const_iterator>::type
   1325  1.1  joerg     find(const _K2& __k) const                     {return __tree_.find(__k);}
   1326  1.1  joerg #endif
   1327  1.1  joerg 
   1328  1.1  joerg     _LIBCPP_INLINE_VISIBILITY
   1329  1.1  joerg     size_type      count(const key_type& __k) const
   1330  1.1  joerg         {return __tree_.__count_multi(__k);}
   1331  1.1  joerg #if _LIBCPP_STD_VER > 11
   1332  1.1  joerg     template <typename _K2>
   1333  1.1  joerg     _LIBCPP_INLINE_VISIBILITY
   1334  1.1  joerg     typename enable_if<__is_transparent<_Compare, _K2>::value,size_type>::type
   1335  1.1  joerg     count(const _K2& __k) const            {return __tree_.__count_multi(__k);}
   1336  1.1  joerg #endif
   1337  1.1  joerg 
   1338  1.1  joerg #if _LIBCPP_STD_VER > 17
   1339  1.1  joerg     _LIBCPP_INLINE_VISIBILITY
   1340  1.1  joerg     bool contains(const key_type& __k) const {return find(__k) != end();}
   1341  1.1  joerg     template <typename _K2>
   1342  1.1  joerg     _LIBCPP_INLINE_VISIBILITY
   1343  1.1  joerg     typename enable_if<__is_transparent<_Compare, _K2>::value, bool>::type
   1344  1.1  joerg     contains(const _K2& __k) const { return find(__k) != end(); }
   1345  1.1  joerg #endif // _LIBCPP_STD_VER > 17
   1346  1.1  joerg 
   1347  1.1  joerg     _LIBCPP_INLINE_VISIBILITY
   1348  1.1  joerg     iterator lower_bound(const key_type& __k)
   1349  1.1  joerg         {return __tree_.lower_bound(__k);}
   1350  1.1  joerg     _LIBCPP_INLINE_VISIBILITY
   1351  1.1  joerg     const_iterator lower_bound(const key_type& __k) const
   1352  1.1  joerg             {return __tree_.lower_bound(__k);}
   1353  1.1  joerg #if _LIBCPP_STD_VER > 11
   1354  1.1  joerg     template <typename _K2>
   1355  1.1  joerg     _LIBCPP_INLINE_VISIBILITY
   1356  1.1  joerg     typename enable_if<__is_transparent<_Compare, _K2>::value,iterator>::type
   1357  1.1  joerg     lower_bound(const _K2& __k)       {return __tree_.lower_bound(__k);}
   1358  1.1  joerg 
   1359  1.1  joerg     template <typename _K2>
   1360  1.1  joerg     _LIBCPP_INLINE_VISIBILITY
   1361  1.1  joerg     typename enable_if<__is_transparent<_Compare, _K2>::value,const_iterator>::type
   1362  1.1  joerg     lower_bound(const _K2& __k) const {return __tree_.lower_bound(__k);}
   1363  1.1  joerg #endif
   1364  1.1  joerg 
   1365  1.1  joerg     _LIBCPP_INLINE_VISIBILITY
   1366  1.1  joerg     iterator upper_bound(const key_type& __k)
   1367  1.1  joerg             {return __tree_.upper_bound(__k);}
   1368  1.1  joerg     _LIBCPP_INLINE_VISIBILITY
   1369  1.1  joerg     const_iterator upper_bound(const key_type& __k) const
   1370  1.1  joerg             {return __tree_.upper_bound(__k);}
   1371  1.1  joerg #if _LIBCPP_STD_VER > 11
   1372  1.1  joerg     template <typename _K2>
   1373  1.1  joerg     _LIBCPP_INLINE_VISIBILITY
   1374  1.1  joerg     typename enable_if<__is_transparent<_Compare, _K2>::value,iterator>::type
   1375  1.1  joerg     upper_bound(const _K2& __k)       {return __tree_.upper_bound(__k);}
   1376  1.1  joerg     template <typename _K2>
   1377  1.1  joerg     _LIBCPP_INLINE_VISIBILITY
   1378  1.1  joerg     typename enable_if<__is_transparent<_Compare, _K2>::value,const_iterator>::type
   1379  1.1  joerg     upper_bound(const _K2& __k) const {return __tree_.upper_bound(__k);}
   1380  1.1  joerg #endif
   1381  1.1  joerg 
   1382  1.1  joerg     _LIBCPP_INLINE_VISIBILITY
   1383  1.1  joerg     pair<iterator,iterator>             equal_range(const key_type& __k)
   1384  1.1  joerg             {return __tree_.__equal_range_multi(__k);}
   1385  1.1  joerg     _LIBCPP_INLINE_VISIBILITY
   1386  1.1  joerg     pair<const_iterator,const_iterator> equal_range(const key_type& __k) const
   1387  1.1  joerg             {return __tree_.__equal_range_multi(__k);}
   1388  1.1  joerg #if _LIBCPP_STD_VER > 11
   1389  1.1  joerg     template <typename _K2>
   1390  1.1  joerg     _LIBCPP_INLINE_VISIBILITY
   1391  1.1  joerg     typename enable_if<__is_transparent<_Compare, _K2>::value,pair<iterator,iterator>>::type
   1392  1.1  joerg     equal_range(const _K2& __k)       {return __tree_.__equal_range_multi(__k);}
   1393  1.1  joerg     template <typename _K2>
   1394  1.1  joerg     _LIBCPP_INLINE_VISIBILITY
   1395  1.1  joerg     typename enable_if<__is_transparent<_Compare, _K2>::value,pair<const_iterator,const_iterator>>::type
   1396  1.1  joerg     equal_range(const _K2& __k) const {return __tree_.__equal_range_multi(__k);}
   1397  1.1  joerg #endif
   1398  1.1  joerg };
   1399  1.1  joerg 
   1400  1.1  joerg #ifndef _LIBCPP_HAS_NO_DEDUCTION_GUIDES
   1401  1.1  joerg template<class _InputIterator,
   1402  1.1  joerg          class _Compare = less<__iter_value_type<_InputIterator>>,
   1403  1.1  joerg          class _Allocator = allocator<__iter_value_type<_InputIterator>>,
   1404  1.1  joerg          class = _EnableIf<__is_allocator<_Allocator>::value, void>,
   1405  1.1  joerg          class = _EnableIf<!__is_allocator<_Compare>::value, void>>
   1406  1.1  joerg multiset(_InputIterator, _InputIterator, _Compare = _Compare(), _Allocator = _Allocator())
   1407  1.1  joerg   -> multiset<__iter_value_type<_InputIterator>, _Compare, _Allocator>;
   1408  1.1  joerg 
   1409  1.1  joerg template<class _Key, class _Compare = less<_Key>,
   1410  1.1  joerg          class _Allocator = allocator<_Key>,
   1411  1.1  joerg          class = _EnableIf<__is_allocator<_Allocator>::value, void>,
   1412  1.1  joerg          class = _EnableIf<!__is_allocator<_Compare>::value, void>>
   1413  1.1  joerg multiset(initializer_list<_Key>, _Compare = _Compare(), _Allocator = _Allocator())
   1414  1.1  joerg   -> multiset<_Key, _Compare, _Allocator>;
   1415  1.1  joerg 
   1416  1.1  joerg template<class _InputIterator, class _Allocator,
   1417  1.1  joerg          class = _EnableIf<__is_allocator<_Allocator>::value, void>>
   1418  1.1  joerg multiset(_InputIterator, _InputIterator, _Allocator)
   1419  1.1  joerg   -> multiset<__iter_value_type<_InputIterator>,
   1420  1.1  joerg          less<__iter_value_type<_InputIterator>>, _Allocator>;
   1421  1.1  joerg 
   1422  1.1  joerg template<class _Key, class _Allocator,
   1423  1.1  joerg          class = _EnableIf<__is_allocator<_Allocator>::value, void>>
   1424  1.1  joerg multiset(initializer_list<_Key>, _Allocator)
   1425  1.1  joerg   -> multiset<_Key, less<_Key>, _Allocator>;
   1426  1.1  joerg #endif
   1427  1.1  joerg 
   1428  1.1  joerg #ifndef _LIBCPP_CXX03_LANG
   1429  1.1  joerg 
   1430  1.1  joerg template <class _Key, class _Compare, class _Allocator>
   1431  1.1  joerg multiset<_Key, _Compare, _Allocator>::multiset(multiset&& __s, const allocator_type& __a)
   1432  1.1  joerg     : __tree_(_VSTD::move(__s.__tree_), __a)
   1433  1.1  joerg {
   1434  1.1  joerg     if (__a != __s.get_allocator())
   1435  1.1  joerg     {
   1436  1.1  joerg         const_iterator __e = cend();
   1437  1.1  joerg         while (!__s.empty())
   1438  1.1  joerg             insert(__e, _VSTD::move(__s.__tree_.remove(__s.begin())->__value_));
   1439  1.1  joerg     }
   1440  1.1  joerg }
   1441  1.1  joerg 
   1442  1.1  joerg #endif // _LIBCPP_CXX03_LANG
   1443  1.1  joerg 
   1444  1.1  joerg template <class _Key, class _Compare, class _Allocator>
   1445  1.1  joerg inline _LIBCPP_INLINE_VISIBILITY
   1446  1.1  joerg bool
   1447  1.1  joerg operator==(const multiset<_Key, _Compare, _Allocator>& __x,
   1448  1.1  joerg            const multiset<_Key, _Compare, _Allocator>& __y)
   1449  1.1  joerg {
   1450  1.1  joerg     return __x.size() == __y.size() && _VSTD::equal(__x.begin(), __x.end(), __y.begin());
   1451  1.1  joerg }
   1452  1.1  joerg 
   1453  1.1  joerg template <class _Key, class _Compare, class _Allocator>
   1454  1.1  joerg inline _LIBCPP_INLINE_VISIBILITY
   1455  1.1  joerg bool
   1456  1.1  joerg operator< (const multiset<_Key, _Compare, _Allocator>& __x,
   1457  1.1  joerg            const multiset<_Key, _Compare, _Allocator>& __y)
   1458  1.1  joerg {
   1459  1.1  joerg     return _VSTD::lexicographical_compare(__x.begin(), __x.end(), __y.begin(), __y.end());
   1460  1.1  joerg }
   1461  1.1  joerg 
   1462  1.1  joerg template <class _Key, class _Compare, class _Allocator>
   1463  1.1  joerg inline _LIBCPP_INLINE_VISIBILITY
   1464  1.1  joerg bool
   1465  1.1  joerg operator!=(const multiset<_Key, _Compare, _Allocator>& __x,
   1466  1.1  joerg            const multiset<_Key, _Compare, _Allocator>& __y)
   1467  1.1  joerg {
   1468  1.1  joerg     return !(__x == __y);
   1469  1.1  joerg }
   1470  1.1  joerg 
   1471  1.1  joerg template <class _Key, class _Compare, class _Allocator>
   1472  1.1  joerg inline _LIBCPP_INLINE_VISIBILITY
   1473  1.1  joerg bool
   1474  1.1  joerg operator> (const multiset<_Key, _Compare, _Allocator>& __x,
   1475  1.1  joerg            const multiset<_Key, _Compare, _Allocator>& __y)
   1476  1.1  joerg {
   1477  1.1  joerg     return __y < __x;
   1478  1.1  joerg }
   1479  1.1  joerg 
   1480  1.1  joerg template <class _Key, class _Compare, class _Allocator>
   1481  1.1  joerg inline _LIBCPP_INLINE_VISIBILITY
   1482  1.1  joerg bool
   1483  1.1  joerg operator>=(const multiset<_Key, _Compare, _Allocator>& __x,
   1484  1.1  joerg            const multiset<_Key, _Compare, _Allocator>& __y)
   1485  1.1  joerg {
   1486  1.1  joerg     return !(__x < __y);
   1487  1.1  joerg }
   1488  1.1  joerg 
   1489  1.1  joerg template <class _Key, class _Compare, class _Allocator>
   1490  1.1  joerg inline _LIBCPP_INLINE_VISIBILITY
   1491  1.1  joerg bool
   1492  1.1  joerg operator<=(const multiset<_Key, _Compare, _Allocator>& __x,
   1493  1.1  joerg            const multiset<_Key, _Compare, _Allocator>& __y)
   1494  1.1  joerg {
   1495  1.1  joerg     return !(__y < __x);
   1496  1.1  joerg }
   1497  1.1  joerg 
   1498  1.1  joerg template <class _Key, class _Compare, class _Allocator>
   1499  1.1  joerg inline _LIBCPP_INLINE_VISIBILITY
   1500  1.1  joerg void
   1501  1.1  joerg swap(multiset<_Key, _Compare, _Allocator>& __x,
   1502  1.1  joerg      multiset<_Key, _Compare, _Allocator>& __y)
   1503  1.1  joerg     _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
   1504  1.1  joerg {
   1505  1.1  joerg     __x.swap(__y);
   1506  1.1  joerg }
   1507  1.1  joerg 
   1508  1.1  joerg #if _LIBCPP_STD_VER > 17
   1509  1.1  joerg template <class _Key, class _Compare, class _Allocator, class _Predicate>
   1510  1.1  joerg inline _LIBCPP_INLINE_VISIBILITY
   1511  1.1  joerg     typename multiset<_Key, _Compare, _Allocator>::size_type
   1512  1.1  joerg     erase_if(multiset<_Key, _Compare, _Allocator>& __c, _Predicate __pred) {
   1513  1.1  joerg   return _VSTD::__libcpp_erase_if_container(__c, __pred);
   1514  1.1  joerg }
   1515  1.1  joerg #endif
   1516  1.1  joerg 
   1517  1.1  joerg _LIBCPP_END_NAMESPACE_STD
   1518  1.1  joerg 
   1519  1.1  joerg #endif // _LIBCPP_SET
   1520