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