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