13e519524SHoward Hinnant// -*- C++ -*- 23e519524SHoward Hinnant//===---------------------------- set -------------------------------------===// 33e519524SHoward Hinnant// 45b08a8a4SHoward Hinnant// The LLVM Compiler Infrastructure 53e519524SHoward Hinnant// 63e519524SHoward Hinnant// This file is distributed under the University of Illinois Open Source 73e519524SHoward Hinnant// License. See LICENSE.TXT for details. 83e519524SHoward Hinnant// 93e519524SHoward Hinnant//===----------------------------------------------------------------------===// 103e519524SHoward Hinnant 113e519524SHoward Hinnant#ifndef _LIBCPP_SET 123e519524SHoward Hinnant#define _LIBCPP_SET 133e519524SHoward Hinnant 143e519524SHoward Hinnant/* 153e519524SHoward Hinnant 163e519524SHoward Hinnant set synopsis 173e519524SHoward Hinnant 183e519524SHoward Hinnantnamespace std 193e519524SHoward Hinnant{ 203e519524SHoward Hinnant 213e519524SHoward Hinnanttemplate <class Key, class Compare = less<Key>, 223e519524SHoward Hinnant class Allocator = allocator<Key>> 233e519524SHoward Hinnantclass set 243e519524SHoward Hinnant{ 253e519524SHoward Hinnantpublic: 263e519524SHoward Hinnant // types: 273e519524SHoward Hinnant typedef Key key_type; 283e519524SHoward Hinnant typedef key_type value_type; 293e519524SHoward Hinnant typedef Compare key_compare; 303e519524SHoward Hinnant typedef key_compare value_compare; 313e519524SHoward Hinnant typedef Allocator allocator_type; 323e519524SHoward Hinnant typedef typename allocator_type::reference reference; 333e519524SHoward Hinnant typedef typename allocator_type::const_reference const_reference; 343e519524SHoward Hinnant typedef typename allocator_type::size_type size_type; 353e519524SHoward Hinnant typedef typename allocator_type::difference_type difference_type; 363e519524SHoward Hinnant typedef typename allocator_type::pointer pointer; 373e519524SHoward Hinnant typedef typename allocator_type::const_pointer const_pointer; 383e519524SHoward Hinnant 393e519524SHoward Hinnant typedef implementation-defined iterator; 403e519524SHoward Hinnant typedef implementation-defined const_iterator; 413e519524SHoward Hinnant typedef std::reverse_iterator<iterator> reverse_iterator; 423e519524SHoward Hinnant typedef std::reverse_iterator<const_iterator> const_reverse_iterator; 433e519524SHoward Hinnant 443e519524SHoward Hinnant // construct/copy/destroy: 453e519524SHoward Hinnant explicit set(const value_compare& comp = value_compare()); 463e519524SHoward Hinnant set(const value_compare& comp, const allocator_type& a); 473e519524SHoward Hinnant template <class InputIterator> 483e519524SHoward Hinnant set(InputIterator first, InputIterator last, 493e519524SHoward Hinnant const value_compare& comp = value_compare()); 503e519524SHoward Hinnant template <class InputIterator> 513e519524SHoward Hinnant set(InputIterator first, InputIterator last, const value_compare& comp, 523e519524SHoward Hinnant const allocator_type& a); 533e519524SHoward Hinnant set(const set& s); 543e519524SHoward Hinnant set(set&& s); 553e519524SHoward Hinnant explicit set(const allocator_type& a); 563e519524SHoward Hinnant set(const set& s, const allocator_type& a); 573e519524SHoward Hinnant set(set&& s, const allocator_type& a); 583e519524SHoward Hinnant set(initializer_list<value_type> il, const value_compare& comp = value_compare()); 593e519524SHoward Hinnant set(initializer_list<value_type> il, const value_compare& comp, 603e519524SHoward Hinnant const allocator_type& a); 613e519524SHoward Hinnant ~set(); 623e519524SHoward Hinnant 633e519524SHoward Hinnant set& operator=(const set& s); 643e519524SHoward Hinnant set& operator=(set&& s); 653e519524SHoward Hinnant set& operator=(initializer_list<value_type> il); 663e519524SHoward Hinnant 673e519524SHoward Hinnant // iterators: 683e519524SHoward Hinnant iterator begin(); 693e519524SHoward Hinnant const_iterator begin() const; 703e519524SHoward Hinnant iterator end(); 713e519524SHoward Hinnant const_iterator end() const; 723e519524SHoward Hinnant 733e519524SHoward Hinnant reverse_iterator rbegin(); 743e519524SHoward Hinnant const_reverse_iterator rbegin() const; 753e519524SHoward Hinnant reverse_iterator rend(); 763e519524SHoward Hinnant const_reverse_iterator rend() const; 773e519524SHoward Hinnant 783e519524SHoward Hinnant const_iterator cbegin() const; 793e519524SHoward Hinnant const_iterator cend() const; 803e519524SHoward Hinnant const_reverse_iterator crbegin() const; 813e519524SHoward Hinnant const_reverse_iterator crend() const; 823e519524SHoward Hinnant 833e519524SHoward Hinnant // capacity: 843e519524SHoward Hinnant bool empty() const; 853e519524SHoward Hinnant size_type size() const; 863e519524SHoward Hinnant size_type max_size() const; 873e519524SHoward Hinnant 883e519524SHoward Hinnant // modifiers: 893e519524SHoward Hinnant template <class... Args> 903e519524SHoward Hinnant pair<iterator, bool> emplace(Args&&... args); 913e519524SHoward Hinnant template <class... Args> 923e519524SHoward Hinnant iterator emplace_hint(const_iterator position, Args&&... args); 933e519524SHoward Hinnant pair<iterator,bool> insert(const value_type& v); 943e519524SHoward Hinnant pair<iterator,bool> insert(value_type&& v); 953e519524SHoward Hinnant iterator insert(const_iterator position, const value_type& v); 963e519524SHoward Hinnant iterator insert(const_iterator position, value_type&& v); 973e519524SHoward Hinnant template <class InputIterator> 983e519524SHoward Hinnant void insert(InputIterator first, InputIterator last); 993e519524SHoward Hinnant void insert(initializer_list<value_type> il); 1003e519524SHoward Hinnant 1013e519524SHoward Hinnant iterator erase(const_iterator position); 1023e519524SHoward Hinnant size_type erase(const key_type& k); 1033e519524SHoward Hinnant iterator erase(const_iterator first, const_iterator last); 1043e519524SHoward Hinnant void clear(); 1053e519524SHoward Hinnant 1063e519524SHoward Hinnant void swap(set& s); 1073e519524SHoward Hinnant 1083e519524SHoward Hinnant // observers: 1093e519524SHoward Hinnant allocator_type get_allocator() const; 1103e519524SHoward Hinnant key_compare key_comp() const; 1113e519524SHoward Hinnant value_compare value_comp() const; 1123e519524SHoward Hinnant 1133e519524SHoward Hinnant // set operations: 1143e519524SHoward Hinnant iterator find(const key_type& k); 1153e519524SHoward Hinnant const_iterator find(const key_type& k) const; 1163e519524SHoward Hinnant size_type count(const key_type& k) const; 1173e519524SHoward Hinnant iterator lower_bound(const key_type& k); 1183e519524SHoward Hinnant const_iterator lower_bound(const key_type& k) const; 1193e519524SHoward Hinnant iterator upper_bound(const key_type& k); 1203e519524SHoward Hinnant const_iterator upper_bound(const key_type& k) const; 1213e519524SHoward Hinnant pair<iterator,iterator> equal_range(const key_type& k); 1223e519524SHoward Hinnant pair<const_iterator,const_iterator> equal_range(const key_type& k) const; 1233e519524SHoward Hinnant}; 1243e519524SHoward Hinnant 1253e519524SHoward Hinnanttemplate <class Key, class Compare, class Allocator> 1263e519524SHoward Hinnantbool 1273e519524SHoward Hinnantoperator==(const set<Key, Compare, Allocator>& x, 1283e519524SHoward Hinnant const set<Key, Compare, Allocator>& y); 1293e519524SHoward Hinnant 1303e519524SHoward Hinnanttemplate <class Key, class Compare, class Allocator> 1313e519524SHoward Hinnantbool 1323e519524SHoward Hinnantoperator< (const set<Key, Compare, Allocator>& x, 1333e519524SHoward Hinnant const set<Key, Compare, Allocator>& y); 1343e519524SHoward Hinnant 1353e519524SHoward Hinnanttemplate <class Key, class Compare, class Allocator> 1363e519524SHoward Hinnantbool 1373e519524SHoward Hinnantoperator!=(const set<Key, Compare, Allocator>& x, 1383e519524SHoward Hinnant const set<Key, Compare, Allocator>& y); 1393e519524SHoward Hinnant 1403e519524SHoward Hinnanttemplate <class Key, class Compare, class Allocator> 1413e519524SHoward Hinnantbool 1423e519524SHoward Hinnantoperator> (const set<Key, Compare, Allocator>& x, 1433e519524SHoward Hinnant const set<Key, Compare, Allocator>& y); 1443e519524SHoward Hinnant 1453e519524SHoward Hinnanttemplate <class Key, class Compare, class Allocator> 1463e519524SHoward Hinnantbool 1473e519524SHoward Hinnantoperator>=(const set<Key, Compare, Allocator>& x, 1483e519524SHoward Hinnant const set<Key, Compare, Allocator>& y); 1493e519524SHoward Hinnant 1503e519524SHoward Hinnanttemplate <class Key, class Compare, class Allocator> 1513e519524SHoward Hinnantbool 1523e519524SHoward Hinnantoperator<=(const set<Key, Compare, Allocator>& x, 1533e519524SHoward Hinnant const set<Key, Compare, Allocator>& y); 1543e519524SHoward Hinnant 1553e519524SHoward Hinnant// specialized algorithms: 1563e519524SHoward Hinnanttemplate <class Key, class Compare, class Allocator> 1573e519524SHoward Hinnantvoid 1583e519524SHoward Hinnantswap(set<Key, Compare, Allocator>& x, set<Key, Compare, Allocator>& y); 1593e519524SHoward Hinnant 1603e519524SHoward Hinnanttemplate <class Key, class Compare = less<Key>, 1613e519524SHoward Hinnant class Allocator = allocator<Key>> 1623e519524SHoward Hinnantclass multiset 1633e519524SHoward Hinnant{ 1643e519524SHoward Hinnantpublic: 1653e519524SHoward Hinnant // types: 1663e519524SHoward Hinnant typedef Key key_type; 1673e519524SHoward Hinnant typedef key_type value_type; 1683e519524SHoward Hinnant typedef Compare key_compare; 1693e519524SHoward Hinnant typedef key_compare value_compare; 1703e519524SHoward Hinnant typedef Allocator allocator_type; 1713e519524SHoward Hinnant typedef typename allocator_type::reference reference; 1723e519524SHoward Hinnant typedef typename allocator_type::const_reference const_reference; 1733e519524SHoward Hinnant typedef typename allocator_type::size_type size_type; 1743e519524SHoward Hinnant typedef typename allocator_type::difference_type difference_type; 1753e519524SHoward Hinnant typedef typename allocator_type::pointer pointer; 1763e519524SHoward Hinnant typedef typename allocator_type::const_pointer const_pointer; 1773e519524SHoward Hinnant 1783e519524SHoward Hinnant typedef implementation-defined iterator; 1793e519524SHoward Hinnant typedef implementation-defined const_iterator; 1803e519524SHoward Hinnant typedef std::reverse_iterator<iterator> reverse_iterator; 1813e519524SHoward Hinnant typedef std::reverse_iterator<const_iterator> const_reverse_iterator; 1823e519524SHoward Hinnant 1833e519524SHoward Hinnant // construct/copy/destroy: 1843e519524SHoward Hinnant explicit multiset(const value_compare& comp = value_compare()); 1853e519524SHoward Hinnant multiset(const value_compare& comp, const allocator_type& a); 1863e519524SHoward Hinnant template <class InputIterator> 1873e519524SHoward Hinnant multiset(InputIterator first, InputIterator last, 1883e519524SHoward Hinnant const value_compare& comp = value_compare()); 1893e519524SHoward Hinnant template <class InputIterator> 1903e519524SHoward Hinnant multiset(InputIterator first, InputIterator last, 1913e519524SHoward Hinnant const value_compare& comp, const allocator_type& a); 1923e519524SHoward Hinnant multiset(const multiset& s); 1933e519524SHoward Hinnant multiset(multiset&& s); 1943e519524SHoward Hinnant explicit multiset(const allocator_type& a); 1953e519524SHoward Hinnant multiset(const multiset& s, const allocator_type& a); 1963e519524SHoward Hinnant multiset(multiset&& s, const allocator_type& a); 1973e519524SHoward Hinnant multiset(initializer_list<value_type> il, const value_compare& comp = value_compare()); 1983e519524SHoward Hinnant multiset(initializer_list<value_type> il, const value_compare& comp, 1993e519524SHoward Hinnant const allocator_type& a); 2003e519524SHoward Hinnant ~multiset(); 2013e519524SHoward Hinnant 2023e519524SHoward Hinnant multiset& operator=(const multiset& s); 2033e519524SHoward Hinnant multiset& operator=(multiset&& s); 2043e519524SHoward Hinnant multiset& operator=(initializer_list<value_type> il); 2053e519524SHoward Hinnant 2063e519524SHoward Hinnant // iterators: 2073e519524SHoward Hinnant iterator begin(); 2083e519524SHoward Hinnant const_iterator begin() const; 2093e519524SHoward Hinnant iterator end(); 2103e519524SHoward Hinnant const_iterator end() const; 2113e519524SHoward Hinnant 2123e519524SHoward Hinnant reverse_iterator rbegin(); 2133e519524SHoward Hinnant const_reverse_iterator rbegin() const; 2143e519524SHoward Hinnant reverse_iterator rend(); 2153e519524SHoward Hinnant const_reverse_iterator rend() const; 2163e519524SHoward Hinnant 2173e519524SHoward Hinnant const_iterator cbegin() const; 2183e519524SHoward Hinnant const_iterator cend() const; 2193e519524SHoward Hinnant const_reverse_iterator crbegin() const; 2203e519524SHoward Hinnant const_reverse_iterator crend() const; 2213e519524SHoward Hinnant 2223e519524SHoward Hinnant // capacity: 2233e519524SHoward Hinnant bool empty() const; 2243e519524SHoward Hinnant size_type size() const; 2253e519524SHoward Hinnant size_type max_size() const; 2263e519524SHoward Hinnant 2273e519524SHoward Hinnant // modifiers: 2283e519524SHoward Hinnant template <class... Args> 2293e519524SHoward Hinnant iterator emplace(Args&&... args); 2303e519524SHoward Hinnant template <class... Args> 2313e519524SHoward Hinnant iterator emplace_hint(const_iterator position, Args&&... args); 2323e519524SHoward Hinnant iterator insert(const value_type& v); 2333e519524SHoward Hinnant iterator insert(value_type&& v); 2343e519524SHoward Hinnant iterator insert(const_iterator position, const value_type& v); 2353e519524SHoward Hinnant iterator insert(const_iterator position, value_type&& v); 2363e519524SHoward Hinnant template <class InputIterator> 2373e519524SHoward Hinnant void insert(InputIterator first, InputIterator last); 2383e519524SHoward Hinnant void insert(initializer_list<value_type> il); 2393e519524SHoward Hinnant 2403e519524SHoward Hinnant iterator erase(const_iterator position); 2413e519524SHoward Hinnant size_type erase(const key_type& k); 2423e519524SHoward Hinnant iterator erase(const_iterator first, const_iterator last); 2433e519524SHoward Hinnant void clear(); 2443e519524SHoward Hinnant 2453e519524SHoward Hinnant void swap(multiset& s); 2463e519524SHoward Hinnant 2473e519524SHoward Hinnant // observers: 2483e519524SHoward Hinnant allocator_type get_allocator() const; 2493e519524SHoward Hinnant key_compare key_comp() const; 2503e519524SHoward Hinnant value_compare value_comp() const; 2513e519524SHoward Hinnant 2523e519524SHoward Hinnant // set operations: 2533e519524SHoward Hinnant iterator find(const key_type& k); 2543e519524SHoward Hinnant const_iterator find(const key_type& k) const; 2553e519524SHoward Hinnant size_type count(const key_type& k) const; 2563e519524SHoward Hinnant iterator lower_bound(const key_type& k); 2573e519524SHoward Hinnant const_iterator lower_bound(const key_type& k) const; 2583e519524SHoward Hinnant iterator upper_bound(const key_type& k); 2593e519524SHoward Hinnant const_iterator upper_bound(const key_type& k) const; 2603e519524SHoward Hinnant pair<iterator,iterator> equal_range(const key_type& k); 2613e519524SHoward Hinnant pair<const_iterator,const_iterator> equal_range(const key_type& k) const; 2623e519524SHoward Hinnant}; 2633e519524SHoward Hinnant 2643e519524SHoward Hinnanttemplate <class Key, class Compare, class Allocator> 2653e519524SHoward Hinnantbool 2663e519524SHoward Hinnantoperator==(const multiset<Key, Compare, Allocator>& x, 2673e519524SHoward Hinnant const multiset<Key, Compare, Allocator>& y); 2683e519524SHoward Hinnant 2693e519524SHoward Hinnanttemplate <class Key, class Compare, class Allocator> 2703e519524SHoward Hinnantbool 2713e519524SHoward Hinnantoperator< (const multiset<Key, Compare, Allocator>& x, 2723e519524SHoward Hinnant const multiset<Key, Compare, Allocator>& y); 2733e519524SHoward Hinnant 2743e519524SHoward Hinnanttemplate <class Key, class Compare, class Allocator> 2753e519524SHoward Hinnantbool 2763e519524SHoward Hinnantoperator!=(const multiset<Key, Compare, Allocator>& x, 2773e519524SHoward Hinnant const multiset<Key, Compare, Allocator>& y); 2783e519524SHoward Hinnant 2793e519524SHoward Hinnanttemplate <class Key, class Compare, class Allocator> 2803e519524SHoward Hinnantbool 2813e519524SHoward Hinnantoperator> (const multiset<Key, Compare, Allocator>& x, 2823e519524SHoward Hinnant const multiset<Key, Compare, Allocator>& y); 2833e519524SHoward Hinnant 2843e519524SHoward Hinnanttemplate <class Key, class Compare, class Allocator> 2853e519524SHoward Hinnantbool 2863e519524SHoward Hinnantoperator>=(const multiset<Key, Compare, Allocator>& x, 2873e519524SHoward Hinnant const multiset<Key, Compare, Allocator>& y); 2883e519524SHoward Hinnant 2893e519524SHoward Hinnanttemplate <class Key, class Compare, class Allocator> 2903e519524SHoward Hinnantbool 2913e519524SHoward Hinnantoperator<=(const multiset<Key, Compare, Allocator>& x, 2923e519524SHoward Hinnant const multiset<Key, Compare, Allocator>& y); 2933e519524SHoward Hinnant 2943e519524SHoward Hinnant// specialized algorithms: 2953e519524SHoward Hinnanttemplate <class Key, class Compare, class Allocator> 2963e519524SHoward Hinnantvoid 2973e519524SHoward Hinnantswap(multiset<Key, Compare, Allocator>& x, multiset<Key, Compare, Allocator>& y); 2983e519524SHoward Hinnant 2993e519524SHoward Hinnant} // std 3003e519524SHoward Hinnant 3013e519524SHoward Hinnant*/ 3023e519524SHoward Hinnant 3033e519524SHoward Hinnant#include <__config> 3043e519524SHoward Hinnant#include <__tree> 3053e519524SHoward Hinnant#include <functional> 3063e519524SHoward Hinnant 3073e519524SHoward Hinnant#pragma GCC system_header 3083e519524SHoward Hinnant 3093e519524SHoward Hinnant_LIBCPP_BEGIN_NAMESPACE_STD 3103e519524SHoward Hinnant 3113e519524SHoward Hinnanttemplate <class _Key, class _Compare = less<_Key>, 3123e519524SHoward Hinnant class _Allocator = allocator<_Key> > 313*53ec0b4eSHoward Hinnantclass _LIBCPP_VISIBLE set 3143e519524SHoward Hinnant{ 3153e519524SHoward Hinnantpublic: 3163e519524SHoward Hinnant // types: 3173e519524SHoward Hinnant typedef _Key key_type; 3183e519524SHoward Hinnant typedef key_type value_type; 3193e519524SHoward Hinnant typedef _Compare key_compare; 3203e519524SHoward Hinnant typedef key_compare value_compare; 3213e519524SHoward Hinnant typedef _Allocator allocator_type; 3223e519524SHoward Hinnant typedef value_type& reference; 3233e519524SHoward Hinnant typedef const value_type& const_reference; 3243e519524SHoward Hinnant 3253e519524SHoward Hinnantprivate: 3263e519524SHoward Hinnant typedef __tree<value_type, value_compare, allocator_type> __base; 3273e519524SHoward Hinnant typedef allocator_traits<allocator_type> __alloc_traits; 3283e519524SHoward Hinnant typedef typename __base::__node_holder __node_holder; 3293e519524SHoward Hinnant 3303e519524SHoward Hinnant __base __tree_; 3313e519524SHoward Hinnant 3323e519524SHoward Hinnantpublic: 3333e519524SHoward Hinnant typedef typename __base::pointer pointer; 3343e519524SHoward Hinnant typedef typename __base::const_pointer const_pointer; 3353e519524SHoward Hinnant typedef typename __base::size_type size_type; 3363e519524SHoward Hinnant typedef typename __base::difference_type difference_type; 3373e519524SHoward Hinnant typedef typename __base::const_iterator iterator; 3383e519524SHoward Hinnant typedef typename __base::const_iterator const_iterator; 3393e519524SHoward Hinnant typedef _STD::reverse_iterator<iterator> reverse_iterator; 3403e519524SHoward Hinnant typedef _STD::reverse_iterator<const_iterator> const_reverse_iterator; 3413e519524SHoward Hinnant 342*53ec0b4eSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 3433e519524SHoward Hinnant explicit set(const value_compare& __comp = value_compare()) 3443e519524SHoward Hinnant : __tree_(__comp) {} 345*53ec0b4eSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 3463e519524SHoward Hinnant set(const value_compare& __comp, const allocator_type& __a) 3473e519524SHoward Hinnant : __tree_(__comp, __a) {} 3483e519524SHoward Hinnant template <class _InputIterator> 349*53ec0b4eSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 3503e519524SHoward Hinnant set(_InputIterator __f, _InputIterator __l, 3513e519524SHoward Hinnant const value_compare& __comp = value_compare()) 3523e519524SHoward Hinnant : __tree_(__comp) 3533e519524SHoward Hinnant { 3543e519524SHoward Hinnant insert(__f, __l); 3553e519524SHoward Hinnant } 3563e519524SHoward Hinnant 3573e519524SHoward Hinnant template <class _InputIterator> 358*53ec0b4eSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 3593e519524SHoward Hinnant set(_InputIterator __f, _InputIterator __l, const value_compare& __comp, 3603e519524SHoward Hinnant const allocator_type& __a) 3613e519524SHoward Hinnant : __tree_(__comp, __a) 3623e519524SHoward Hinnant { 3633e519524SHoward Hinnant insert(__f, __l); 3643e519524SHoward Hinnant } 3653e519524SHoward Hinnant 366*53ec0b4eSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 3673e519524SHoward Hinnant set(const set& __s) 3683e519524SHoward Hinnant : __tree_(__s.__tree_) 3693e519524SHoward Hinnant { 3703e519524SHoward Hinnant insert(__s.begin(), __s.end()); 3713e519524SHoward Hinnant } 3723e519524SHoward Hinnant 3737609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 374*53ec0b4eSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 3753e519524SHoward Hinnant set(set&& __s) 3763e519524SHoward Hinnant : __tree_(_STD::move(__s.__tree_)) {} 3777609c9b6SHoward Hinnant#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 3783e519524SHoward Hinnant 379*53ec0b4eSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 3803e519524SHoward Hinnant explicit set(const allocator_type& __a) 3813e519524SHoward Hinnant : __tree_(__a) {} 3823e519524SHoward Hinnant 383*53ec0b4eSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 3843e519524SHoward Hinnant set(const set& __s, const allocator_type& __a) 3853e519524SHoward Hinnant : __tree_(__s.__tree_.value_comp(), __a) 3863e519524SHoward Hinnant { 3873e519524SHoward Hinnant insert(__s.begin(), __s.end()); 3883e519524SHoward Hinnant } 3893e519524SHoward Hinnant 3907609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 3913e519524SHoward Hinnant set(set&& __s, const allocator_type& __a); 3923e519524SHoward Hinnant#endif 3933e519524SHoward Hinnant 394*53ec0b4eSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 3953e519524SHoward Hinnant set(initializer_list<value_type> __il, const value_compare& __comp = value_compare()) 3963e519524SHoward Hinnant : __tree_(__comp) 3973e519524SHoward Hinnant { 3983e519524SHoward Hinnant insert(__il.begin(), __il.end()); 3993e519524SHoward Hinnant } 4003e519524SHoward Hinnant 401*53ec0b4eSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 4023e519524SHoward Hinnant set(initializer_list<value_type> __il, const value_compare& __comp, 4033e519524SHoward Hinnant const allocator_type& __a) 4043e519524SHoward Hinnant : __tree_(__comp, __a) 4053e519524SHoward Hinnant { 4063e519524SHoward Hinnant insert(__il.begin(), __il.end()); 4073e519524SHoward Hinnant } 4083e519524SHoward Hinnant 409*53ec0b4eSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 4103e519524SHoward Hinnant set& operator=(initializer_list<value_type> __il) 4113e519524SHoward Hinnant { 4123e519524SHoward Hinnant __tree_.__assign_unique(__il.begin(), __il.end()); 4133e519524SHoward Hinnant return *this; 4143e519524SHoward Hinnant } 4153e519524SHoward Hinnant 4167609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 417*53ec0b4eSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 4183e519524SHoward Hinnant set& operator=(set&& __s) 4193e519524SHoward Hinnant { 4203e519524SHoward Hinnant __tree_ = _STD::move(__s.__tree_); 4213e519524SHoward Hinnant return *this; 4223e519524SHoward Hinnant } 4237609c9b6SHoward Hinnant#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 4243e519524SHoward Hinnant 425*53ec0b4eSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 4263e519524SHoward Hinnant iterator begin() {return __tree_.begin();} 427*53ec0b4eSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 4283e519524SHoward Hinnant const_iterator begin() const {return __tree_.begin();} 429*53ec0b4eSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 4303e519524SHoward Hinnant iterator end() {return __tree_.end();} 431*53ec0b4eSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 4323e519524SHoward Hinnant const_iterator end() const {return __tree_.end();} 4333e519524SHoward Hinnant 434*53ec0b4eSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 4353e519524SHoward Hinnant reverse_iterator rbegin() {return reverse_iterator(end());} 436*53ec0b4eSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 4373e519524SHoward Hinnant const_reverse_iterator rbegin() const {return const_reverse_iterator(end());} 438*53ec0b4eSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 4393e519524SHoward Hinnant reverse_iterator rend() {return reverse_iterator(begin());} 440*53ec0b4eSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 4413e519524SHoward Hinnant const_reverse_iterator rend() const {return const_reverse_iterator(begin());} 4423e519524SHoward Hinnant 443*53ec0b4eSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 4443e519524SHoward Hinnant const_iterator cbegin() const {return begin();} 445*53ec0b4eSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 4463e519524SHoward Hinnant const_iterator cend() const {return end();} 447*53ec0b4eSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 4483e519524SHoward Hinnant const_reverse_iterator crbegin() const {return rbegin();} 449*53ec0b4eSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 4503e519524SHoward Hinnant const_reverse_iterator crend() const {return rend();} 4513e519524SHoward Hinnant 452*53ec0b4eSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 4533e519524SHoward Hinnant bool empty() const {return __tree_.size() == 0;} 454*53ec0b4eSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 4553e519524SHoward Hinnant size_type size() const {return __tree_.size();} 456*53ec0b4eSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 4573e519524SHoward Hinnant size_type max_size() const {return __tree_.max_size();} 4583e519524SHoward Hinnant 4593e519524SHoward Hinnant // modifiers: 4607609c9b6SHoward Hinnant#if !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS) 4613e519524SHoward Hinnant template <class... _Args> 462*53ec0b4eSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 4633e519524SHoward Hinnant pair<iterator, bool> emplace(_Args&&... __args) 4643e519524SHoward Hinnant {return __tree_.__emplace_unique(_STD::forward<_Args>(__args)...);} 4653e519524SHoward Hinnant template <class... _Args> 466*53ec0b4eSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 4673e519524SHoward Hinnant iterator emplace_hint(const_iterator __p, _Args&&... __args) 4683e519524SHoward Hinnant {return __tree_.__emplace_hint_unique(__p, _STD::forward<_Args>(__args)...);} 4697609c9b6SHoward Hinnant#endif // !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS) 470*53ec0b4eSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 4713e519524SHoward Hinnant pair<iterator,bool> insert(const value_type& __v) 4723e519524SHoward Hinnant {return __tree_.__insert_unique(__v);} 4737609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 474*53ec0b4eSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 4753e519524SHoward Hinnant pair<iterator,bool> insert(value_type&& __v) 4763e519524SHoward Hinnant {return __tree_.__insert_unique(_STD::move(__v));} 4777609c9b6SHoward Hinnant#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 478*53ec0b4eSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 4793e519524SHoward Hinnant iterator insert(const_iterator __p, const value_type& __v) 4803e519524SHoward Hinnant {return __tree_.__insert_unique(__p, __v);} 4817609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 482*53ec0b4eSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 4833e519524SHoward Hinnant iterator insert(const_iterator __p, value_type&& __v) 4843e519524SHoward Hinnant {return __tree_.__insert_unique(__p, _STD::move(__v));} 4857609c9b6SHoward Hinnant#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 4863e519524SHoward Hinnant template <class _InputIterator> 487*53ec0b4eSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 4883e519524SHoward Hinnant void insert(_InputIterator __f, _InputIterator __l) 4893e519524SHoward Hinnant { 4903e519524SHoward Hinnant for (const_iterator __e = cend(); __f != __l; ++__f) 4913e519524SHoward Hinnant __tree_.__insert_unique(__e, *__f); 4923e519524SHoward Hinnant } 4933e519524SHoward Hinnant 494*53ec0b4eSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 4953e519524SHoward Hinnant void insert(initializer_list<value_type> __il) 4963e519524SHoward Hinnant {insert(__il.begin(), __il.end());} 4973e519524SHoward Hinnant 498*53ec0b4eSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 4993e519524SHoward Hinnant iterator erase(const_iterator __p) {return __tree_.erase(__p);} 500*53ec0b4eSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 5013e519524SHoward Hinnant size_type erase(const key_type& __k) 5023e519524SHoward Hinnant {return __tree_.__erase_unique(__k);} 503*53ec0b4eSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 5043e519524SHoward Hinnant iterator erase(const_iterator __f, const_iterator __l) 5053e519524SHoward Hinnant {return __tree_.erase(__f, __l);} 506*53ec0b4eSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 5073e519524SHoward Hinnant void clear() {__tree_.clear();} 5083e519524SHoward Hinnant 509*53ec0b4eSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 5103e519524SHoward Hinnant void swap(set& __s) {__tree_.swap(__s.__tree_);} 5113e519524SHoward Hinnant 512*53ec0b4eSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 5133e519524SHoward Hinnant allocator_type get_allocator() const {return __tree_.__alloc();} 514*53ec0b4eSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 5153e519524SHoward Hinnant key_compare key_comp() const {return __tree_.value_comp();} 516*53ec0b4eSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 5173e519524SHoward Hinnant value_compare value_comp() const {return __tree_.value_comp();} 5183e519524SHoward Hinnant 5193e519524SHoward Hinnant // set operations: 520*53ec0b4eSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 5213e519524SHoward Hinnant iterator find(const key_type& __k) {return __tree_.find(__k);} 522*53ec0b4eSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 5233e519524SHoward Hinnant const_iterator find(const key_type& __k) const {return __tree_.find(__k);} 524*53ec0b4eSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 5253e519524SHoward Hinnant size_type count(const key_type& __k) const 5263e519524SHoward Hinnant {return __tree_.__count_unique(__k);} 527*53ec0b4eSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 5283e519524SHoward Hinnant iterator lower_bound(const key_type& __k) 5293e519524SHoward Hinnant {return __tree_.lower_bound(__k);} 530*53ec0b4eSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 5313e519524SHoward Hinnant const_iterator lower_bound(const key_type& __k) const 5323e519524SHoward Hinnant {return __tree_.lower_bound(__k);} 533*53ec0b4eSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 5343e519524SHoward Hinnant iterator upper_bound(const key_type& __k) 5353e519524SHoward Hinnant {return __tree_.upper_bound(__k);} 536*53ec0b4eSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 5373e519524SHoward Hinnant const_iterator upper_bound(const key_type& __k) const 5383e519524SHoward Hinnant {return __tree_.upper_bound(__k);} 539*53ec0b4eSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 5403e519524SHoward Hinnant pair<iterator,iterator> equal_range(const key_type& __k) 5413e519524SHoward Hinnant {return __tree_.__equal_range_unique(__k);} 542*53ec0b4eSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 5433e519524SHoward Hinnant pair<const_iterator,const_iterator> equal_range(const key_type& __k) const 5443e519524SHoward Hinnant {return __tree_.__equal_range_unique(__k);} 5453e519524SHoward Hinnant}; 5463e519524SHoward Hinnant 5477609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 5483e519524SHoward Hinnant 5493e519524SHoward Hinnanttemplate <class _Key, class _Compare, class _Allocator> 5503e519524SHoward Hinnantset<_Key, _Compare, _Allocator>::set(set&& __s, const allocator_type& __a) 5513e519524SHoward Hinnant : __tree_(_STD::move(__s.__tree_), __a) 5523e519524SHoward Hinnant{ 5533e519524SHoward Hinnant if (__a != __s.get_allocator()) 5543e519524SHoward Hinnant { 5553e519524SHoward Hinnant const_iterator __e = cend(); 5563e519524SHoward Hinnant while (!__s.empty()) 5573e519524SHoward Hinnant insert(__e, _STD::move(__s.__tree_.remove(__s.begin())->__value_)); 5583e519524SHoward Hinnant } 5593e519524SHoward Hinnant} 5603e519524SHoward Hinnant 5617609c9b6SHoward Hinnant#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 5623e519524SHoward Hinnant 5633e519524SHoward Hinnanttemplate <class _Key, class _Compare, class _Allocator> 564*53ec0b4eSHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 5653e519524SHoward Hinnantbool 5663e519524SHoward Hinnantoperator==(const set<_Key, _Compare, _Allocator>& __x, 5673e519524SHoward Hinnant const set<_Key, _Compare, _Allocator>& __y) 5683e519524SHoward Hinnant{ 5693e519524SHoward Hinnant return __x.size() == __y.size() && _STD::equal(__x.begin(), __x.end(), __y.begin()); 5703e519524SHoward Hinnant} 5713e519524SHoward Hinnant 5723e519524SHoward Hinnanttemplate <class _Key, class _Compare, class _Allocator> 573*53ec0b4eSHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 5743e519524SHoward Hinnantbool 5753e519524SHoward Hinnantoperator< (const set<_Key, _Compare, _Allocator>& __x, 5763e519524SHoward Hinnant const set<_Key, _Compare, _Allocator>& __y) 5773e519524SHoward Hinnant{ 5783e519524SHoward Hinnant return _STD::lexicographical_compare(__x.begin(), __x.end(), __y.begin(), __y.end()); 5793e519524SHoward Hinnant} 5803e519524SHoward Hinnant 5813e519524SHoward Hinnanttemplate <class _Key, class _Compare, class _Allocator> 582*53ec0b4eSHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 5833e519524SHoward Hinnantbool 5843e519524SHoward Hinnantoperator!=(const set<_Key, _Compare, _Allocator>& __x, 5853e519524SHoward Hinnant const set<_Key, _Compare, _Allocator>& __y) 5863e519524SHoward Hinnant{ 5873e519524SHoward Hinnant return !(__x == __y); 5883e519524SHoward Hinnant} 5893e519524SHoward Hinnant 5903e519524SHoward Hinnanttemplate <class _Key, class _Compare, class _Allocator> 591*53ec0b4eSHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 5923e519524SHoward Hinnantbool 5933e519524SHoward Hinnantoperator> (const set<_Key, _Compare, _Allocator>& __x, 5943e519524SHoward Hinnant const set<_Key, _Compare, _Allocator>& __y) 5953e519524SHoward Hinnant{ 5963e519524SHoward Hinnant return __y < __x; 5973e519524SHoward Hinnant} 5983e519524SHoward Hinnant 5993e519524SHoward Hinnanttemplate <class _Key, class _Compare, class _Allocator> 600*53ec0b4eSHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 6013e519524SHoward Hinnantbool 6023e519524SHoward Hinnantoperator>=(const set<_Key, _Compare, _Allocator>& __x, 6033e519524SHoward Hinnant const set<_Key, _Compare, _Allocator>& __y) 6043e519524SHoward Hinnant{ 6053e519524SHoward Hinnant return !(__x < __y); 6063e519524SHoward Hinnant} 6073e519524SHoward Hinnant 6083e519524SHoward Hinnanttemplate <class _Key, class _Compare, class _Allocator> 609*53ec0b4eSHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 6103e519524SHoward Hinnantbool 6113e519524SHoward Hinnantoperator<=(const set<_Key, _Compare, _Allocator>& __x, 6123e519524SHoward Hinnant const set<_Key, _Compare, _Allocator>& __y) 6133e519524SHoward Hinnant{ 6143e519524SHoward Hinnant return !(__y < __x); 6153e519524SHoward Hinnant} 6163e519524SHoward Hinnant 6173e519524SHoward Hinnant// specialized algorithms: 6183e519524SHoward Hinnanttemplate <class _Key, class _Compare, class _Allocator> 619*53ec0b4eSHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 6203e519524SHoward Hinnantvoid 6213e519524SHoward Hinnantswap(set<_Key, _Compare, _Allocator>& __x, 6223e519524SHoward Hinnant set<_Key, _Compare, _Allocator>& __y) 6233e519524SHoward Hinnant{ 6243e519524SHoward Hinnant __x.swap(__y); 6253e519524SHoward Hinnant} 6263e519524SHoward Hinnant 6273e519524SHoward Hinnanttemplate <class _Key, class _Compare = less<_Key>, 6283e519524SHoward Hinnant class _Allocator = allocator<_Key> > 629*53ec0b4eSHoward Hinnantclass _LIBCPP_VISIBLE multiset 6303e519524SHoward Hinnant{ 6313e519524SHoward Hinnantpublic: 6323e519524SHoward Hinnant // types: 6333e519524SHoward Hinnant typedef _Key key_type; 6343e519524SHoward Hinnant typedef key_type value_type; 6353e519524SHoward Hinnant typedef _Compare key_compare; 6363e519524SHoward Hinnant typedef key_compare value_compare; 6373e519524SHoward Hinnant typedef _Allocator allocator_type; 6383e519524SHoward Hinnant typedef value_type& reference; 6393e519524SHoward Hinnant typedef const value_type& const_reference; 6403e519524SHoward Hinnant 6413e519524SHoward Hinnantprivate: 6423e519524SHoward Hinnant typedef __tree<value_type, value_compare, allocator_type> __base; 6433e519524SHoward Hinnant typedef allocator_traits<allocator_type> __alloc_traits; 6443e519524SHoward Hinnant typedef typename __base::__node_holder __node_holder; 6453e519524SHoward Hinnant 6463e519524SHoward Hinnant __base __tree_; 6473e519524SHoward Hinnant 6483e519524SHoward Hinnantpublic: 6493e519524SHoward Hinnant typedef typename __base::pointer pointer; 6503e519524SHoward Hinnant typedef typename __base::const_pointer const_pointer; 6513e519524SHoward Hinnant typedef typename __base::size_type size_type; 6523e519524SHoward Hinnant typedef typename __base::difference_type difference_type; 6533e519524SHoward Hinnant typedef typename __base::const_iterator iterator; 6543e519524SHoward Hinnant typedef typename __base::const_iterator const_iterator; 6553e519524SHoward Hinnant typedef _STD::reverse_iterator<iterator> reverse_iterator; 6563e519524SHoward Hinnant typedef _STD::reverse_iterator<const_iterator> const_reverse_iterator; 6573e519524SHoward Hinnant 6583e519524SHoward Hinnant // construct/copy/destroy: 659*53ec0b4eSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 6603e519524SHoward Hinnant explicit multiset(const value_compare& __comp = value_compare()) 6613e519524SHoward Hinnant : __tree_(__comp) {} 662*53ec0b4eSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 6633e519524SHoward Hinnant multiset(const value_compare& __comp, const allocator_type& __a) 6643e519524SHoward Hinnant : __tree_(__comp, __a) {} 6653e519524SHoward Hinnant template <class _InputIterator> 666*53ec0b4eSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 6673e519524SHoward Hinnant multiset(_InputIterator __f, _InputIterator __l, 6683e519524SHoward Hinnant const value_compare& __comp = value_compare()) 6693e519524SHoward Hinnant : __tree_(__comp) 6703e519524SHoward Hinnant { 6713e519524SHoward Hinnant insert(__f, __l); 6723e519524SHoward Hinnant } 6733e519524SHoward Hinnant 6743e519524SHoward Hinnant template <class _InputIterator> 675*53ec0b4eSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 6763e519524SHoward Hinnant multiset(_InputIterator __f, _InputIterator __l, 6773e519524SHoward Hinnant const value_compare& __comp, const allocator_type& __a) 6783e519524SHoward Hinnant : __tree_(__comp, __a) 6793e519524SHoward Hinnant { 6803e519524SHoward Hinnant insert(__f, __l); 6813e519524SHoward Hinnant } 6823e519524SHoward Hinnant 683*53ec0b4eSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 6843e519524SHoward Hinnant multiset(const multiset& __s) 6853e519524SHoward Hinnant : __tree_(__s.__tree_.value_comp(), 6863e519524SHoward Hinnant __alloc_traits::select_on_container_copy_construction(__s.__tree_.__alloc())) 6873e519524SHoward Hinnant { 6883e519524SHoward Hinnant insert(__s.begin(), __s.end()); 6893e519524SHoward Hinnant } 6903e519524SHoward Hinnant 6917609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 692*53ec0b4eSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 6933e519524SHoward Hinnant multiset(multiset&& __s) 6943e519524SHoward Hinnant : __tree_(_STD::move(__s.__tree_)) {} 6957609c9b6SHoward Hinnant#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 696*53ec0b4eSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 6973e519524SHoward Hinnant explicit multiset(const allocator_type& __a) 6983e519524SHoward Hinnant : __tree_(__a) {} 699*53ec0b4eSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 7003e519524SHoward Hinnant multiset(const multiset& __s, const allocator_type& __a) 7013e519524SHoward Hinnant : __tree_(__s.__tree_.value_comp(), __a) 7023e519524SHoward Hinnant { 7033e519524SHoward Hinnant insert(__s.begin(), __s.end()); 7043e519524SHoward Hinnant } 7057609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 7063e519524SHoward Hinnant multiset(multiset&& __s, const allocator_type& __a); 7073e519524SHoward Hinnant#endif 7083e519524SHoward Hinnant 709*53ec0b4eSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 7103e519524SHoward Hinnant multiset(initializer_list<value_type> __il, const value_compare& __comp = value_compare()) 7113e519524SHoward Hinnant : __tree_(__comp) 7123e519524SHoward Hinnant { 7133e519524SHoward Hinnant insert(__il.begin(), __il.end()); 7143e519524SHoward Hinnant } 7153e519524SHoward Hinnant 716*53ec0b4eSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 7173e519524SHoward Hinnant multiset(initializer_list<value_type> __il, const value_compare& __comp, 7183e519524SHoward Hinnant const allocator_type& __a) 7193e519524SHoward Hinnant : __tree_(__comp, __a) 7203e519524SHoward Hinnant { 7213e519524SHoward Hinnant insert(__il.begin(), __il.end()); 7223e519524SHoward Hinnant } 7233e519524SHoward Hinnant 724*53ec0b4eSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 7253e519524SHoward Hinnant multiset& operator=(initializer_list<value_type> __il) 7263e519524SHoward Hinnant { 7273e519524SHoward Hinnant __tree_.__assign_multi(__il.begin(), __il.end()); 7283e519524SHoward Hinnant return *this; 7293e519524SHoward Hinnant } 7303e519524SHoward Hinnant 7317609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 732*53ec0b4eSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 7333e519524SHoward Hinnant multiset& operator=(multiset&& __s) 7343e519524SHoward Hinnant { 7353e519524SHoward Hinnant __tree_ = _STD::move(__s.__tree_); 7363e519524SHoward Hinnant return *this; 7373e519524SHoward Hinnant } 7387609c9b6SHoward Hinnant#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 7393e519524SHoward Hinnant 740*53ec0b4eSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 7413e519524SHoward Hinnant iterator begin() {return __tree_.begin();} 742*53ec0b4eSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 7433e519524SHoward Hinnant const_iterator begin() const {return __tree_.begin();} 744*53ec0b4eSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 7453e519524SHoward Hinnant iterator end() {return __tree_.end();} 746*53ec0b4eSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 7473e519524SHoward Hinnant const_iterator end() const {return __tree_.end();} 7483e519524SHoward Hinnant 749*53ec0b4eSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 7503e519524SHoward Hinnant reverse_iterator rbegin() {return reverse_iterator(end());} 751*53ec0b4eSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 7523e519524SHoward Hinnant const_reverse_iterator rbegin() const {return const_reverse_iterator(end());} 753*53ec0b4eSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 7543e519524SHoward Hinnant reverse_iterator rend() {return reverse_iterator(begin());} 755*53ec0b4eSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 7563e519524SHoward Hinnant const_reverse_iterator rend() const {return const_reverse_iterator(begin());} 7573e519524SHoward Hinnant 758*53ec0b4eSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 7593e519524SHoward Hinnant const_iterator cbegin() const {return begin();} 760*53ec0b4eSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 7613e519524SHoward Hinnant const_iterator cend() const {return end();} 762*53ec0b4eSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 7633e519524SHoward Hinnant const_reverse_iterator crbegin() const {return rbegin();} 764*53ec0b4eSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 7653e519524SHoward Hinnant const_reverse_iterator crend() const {return rend();} 7663e519524SHoward Hinnant 767*53ec0b4eSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 7683e519524SHoward Hinnant bool empty() const {return __tree_.size() == 0;} 769*53ec0b4eSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 7703e519524SHoward Hinnant size_type size() const {return __tree_.size();} 771*53ec0b4eSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 7723e519524SHoward Hinnant size_type max_size() const {return __tree_.max_size();} 7733e519524SHoward Hinnant 7743e519524SHoward Hinnant // modifiers: 7757609c9b6SHoward Hinnant#if !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS) 7763e519524SHoward Hinnant template <class... _Args> 777*53ec0b4eSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 7783e519524SHoward Hinnant iterator emplace(_Args&&... __args) 7793e519524SHoward Hinnant {return __tree_.__emplace_multi(_STD::forward<_Args>(__args)...);} 7803e519524SHoward Hinnant template <class... _Args> 781*53ec0b4eSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 7823e519524SHoward Hinnant iterator emplace_hint(const_iterator __p, _Args&&... __args) 7833e519524SHoward Hinnant {return __tree_.__emplace_hint_multi(__p, _STD::forward<_Args>(__args)...);} 7847609c9b6SHoward Hinnant#endif // !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS) 785*53ec0b4eSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 7863e519524SHoward Hinnant iterator insert(const value_type& __v) 7873e519524SHoward Hinnant {return __tree_.__insert_multi(__v);} 7887609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 789*53ec0b4eSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 7903e519524SHoward Hinnant iterator insert(value_type&& __v) 7913e519524SHoward Hinnant {return __tree_.__insert_multi(_STD::move(__v));} 7927609c9b6SHoward Hinnant#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 793*53ec0b4eSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 7943e519524SHoward Hinnant iterator insert(const_iterator __p, const value_type& __v) 7953e519524SHoward Hinnant {return __tree_.__insert_multi(__p, __v);} 7967609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 797*53ec0b4eSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 7983e519524SHoward Hinnant iterator insert(const_iterator __p, value_type&& __v) 7993e519524SHoward Hinnant {return __tree_.__insert_multi(_STD::move(__v));} 8007609c9b6SHoward Hinnant#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 8013e519524SHoward Hinnant template <class _InputIterator> 802*53ec0b4eSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 8033e519524SHoward Hinnant void insert(_InputIterator __f, _InputIterator __l) 8043e519524SHoward Hinnant { 8053e519524SHoward Hinnant for (const_iterator __e = cend(); __f != __l; ++__f) 8063e519524SHoward Hinnant __tree_.__insert_multi(__e, *__f); 8073e519524SHoward Hinnant } 8083e519524SHoward Hinnant 809*53ec0b4eSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 8103e519524SHoward Hinnant void insert(initializer_list<value_type> __il) 8113e519524SHoward Hinnant {insert(__il.begin(), __il.end());} 8123e519524SHoward Hinnant 813*53ec0b4eSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 8143e519524SHoward Hinnant iterator erase(const_iterator __p) {return __tree_.erase(__p);} 815*53ec0b4eSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 8163e519524SHoward Hinnant size_type erase(const key_type& __k) {return __tree_.__erase_multi(__k);} 817*53ec0b4eSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 8183e519524SHoward Hinnant iterator erase(const_iterator __f, const_iterator __l) 8193e519524SHoward Hinnant {return __tree_.erase(__f, __l);} 820*53ec0b4eSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 8213e519524SHoward Hinnant void clear() {__tree_.clear();} 8223e519524SHoward Hinnant 823*53ec0b4eSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 8243e519524SHoward Hinnant void swap(multiset& __s) {__tree_.swap(__s.__tree_);} 8253e519524SHoward Hinnant 826*53ec0b4eSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 8273e519524SHoward Hinnant allocator_type get_allocator() const {return __tree_.__alloc();} 828*53ec0b4eSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 8293e519524SHoward Hinnant key_compare key_comp() const {return __tree_.value_comp();} 830*53ec0b4eSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 8313e519524SHoward Hinnant value_compare value_comp() const {return __tree_.value_comp();} 8323e519524SHoward Hinnant 8333e519524SHoward Hinnant // set operations: 834*53ec0b4eSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 8353e519524SHoward Hinnant iterator find(const key_type& __k) {return __tree_.find(__k);} 836*53ec0b4eSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 8373e519524SHoward Hinnant const_iterator find(const key_type& __k) const {return __tree_.find(__k);} 838*53ec0b4eSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 8393e519524SHoward Hinnant size_type count(const key_type& __k) const 8403e519524SHoward Hinnant {return __tree_.__count_multi(__k);} 841*53ec0b4eSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 8423e519524SHoward Hinnant iterator lower_bound(const key_type& __k) 8433e519524SHoward Hinnant {return __tree_.lower_bound(__k);} 844*53ec0b4eSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 8453e519524SHoward Hinnant const_iterator lower_bound(const key_type& __k) const 8463e519524SHoward Hinnant {return __tree_.lower_bound(__k);} 847*53ec0b4eSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 8483e519524SHoward Hinnant iterator upper_bound(const key_type& __k) 8493e519524SHoward Hinnant {return __tree_.upper_bound(__k);} 850*53ec0b4eSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 8513e519524SHoward Hinnant const_iterator upper_bound(const key_type& __k) const 8523e519524SHoward Hinnant {return __tree_.upper_bound(__k);} 853*53ec0b4eSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 8543e519524SHoward Hinnant pair<iterator,iterator> equal_range(const key_type& __k) 8553e519524SHoward Hinnant {return __tree_.__equal_range_multi(__k);} 856*53ec0b4eSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 8573e519524SHoward Hinnant pair<const_iterator,const_iterator> equal_range(const key_type& __k) const 8583e519524SHoward Hinnant {return __tree_.__equal_range_multi(__k);} 8593e519524SHoward Hinnant}; 8603e519524SHoward Hinnant 8617609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 8623e519524SHoward Hinnant 8633e519524SHoward Hinnanttemplate <class _Key, class _Compare, class _Allocator> 8643e519524SHoward Hinnantmultiset<_Key, _Compare, _Allocator>::multiset(multiset&& __s, const allocator_type& __a) 8653e519524SHoward Hinnant : __tree_(_STD::move(__s.__tree_), __a) 8663e519524SHoward Hinnant{ 8673e519524SHoward Hinnant if (__a != __s.get_allocator()) 8683e519524SHoward Hinnant { 8693e519524SHoward Hinnant const_iterator __e = cend(); 8703e519524SHoward Hinnant while (!__s.empty()) 8713e519524SHoward Hinnant insert(__e, _STD::move(__s.__tree_.remove(__s.begin())->__value_)); 8723e519524SHoward Hinnant } 8733e519524SHoward Hinnant} 8743e519524SHoward Hinnant 8757609c9b6SHoward Hinnant#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 8763e519524SHoward Hinnant 8773e519524SHoward Hinnanttemplate <class _Key, class _Compare, class _Allocator> 878*53ec0b4eSHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 8793e519524SHoward Hinnantbool 8803e519524SHoward Hinnantoperator==(const multiset<_Key, _Compare, _Allocator>& __x, 8813e519524SHoward Hinnant const multiset<_Key, _Compare, _Allocator>& __y) 8823e519524SHoward Hinnant{ 8833e519524SHoward Hinnant return __x.size() == __y.size() && _STD::equal(__x.begin(), __x.end(), __y.begin()); 8843e519524SHoward Hinnant} 8853e519524SHoward Hinnant 8863e519524SHoward Hinnanttemplate <class _Key, class _Compare, class _Allocator> 887*53ec0b4eSHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 8883e519524SHoward Hinnantbool 8893e519524SHoward Hinnantoperator< (const multiset<_Key, _Compare, _Allocator>& __x, 8903e519524SHoward Hinnant const multiset<_Key, _Compare, _Allocator>& __y) 8913e519524SHoward Hinnant{ 8923e519524SHoward Hinnant return _STD::lexicographical_compare(__x.begin(), __x.end(), __y.begin(), __y.end()); 8933e519524SHoward Hinnant} 8943e519524SHoward Hinnant 8953e519524SHoward Hinnanttemplate <class _Key, class _Compare, class _Allocator> 896*53ec0b4eSHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 8973e519524SHoward Hinnantbool 8983e519524SHoward Hinnantoperator!=(const multiset<_Key, _Compare, _Allocator>& __x, 8993e519524SHoward Hinnant const multiset<_Key, _Compare, _Allocator>& __y) 9003e519524SHoward Hinnant{ 9013e519524SHoward Hinnant return !(__x == __y); 9023e519524SHoward Hinnant} 9033e519524SHoward Hinnant 9043e519524SHoward Hinnanttemplate <class _Key, class _Compare, class _Allocator> 905*53ec0b4eSHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 9063e519524SHoward Hinnantbool 9073e519524SHoward Hinnantoperator> (const multiset<_Key, _Compare, _Allocator>& __x, 9083e519524SHoward Hinnant const multiset<_Key, _Compare, _Allocator>& __y) 9093e519524SHoward Hinnant{ 9103e519524SHoward Hinnant return __y < __x; 9113e519524SHoward Hinnant} 9123e519524SHoward Hinnant 9133e519524SHoward Hinnanttemplate <class _Key, class _Compare, class _Allocator> 914*53ec0b4eSHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 9153e519524SHoward Hinnantbool 9163e519524SHoward Hinnantoperator>=(const multiset<_Key, _Compare, _Allocator>& __x, 9173e519524SHoward Hinnant const multiset<_Key, _Compare, _Allocator>& __y) 9183e519524SHoward Hinnant{ 9193e519524SHoward Hinnant return !(__x < __y); 9203e519524SHoward Hinnant} 9213e519524SHoward Hinnant 9223e519524SHoward Hinnanttemplate <class _Key, class _Compare, class _Allocator> 923*53ec0b4eSHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 9243e519524SHoward Hinnantbool 9253e519524SHoward Hinnantoperator<=(const multiset<_Key, _Compare, _Allocator>& __x, 9263e519524SHoward Hinnant const multiset<_Key, _Compare, _Allocator>& __y) 9273e519524SHoward Hinnant{ 9283e519524SHoward Hinnant return !(__y < __x); 9293e519524SHoward Hinnant} 9303e519524SHoward Hinnant 9313e519524SHoward Hinnanttemplate <class _Key, class _Compare, class _Allocator> 932*53ec0b4eSHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 9333e519524SHoward Hinnantvoid 9343e519524SHoward Hinnantswap(multiset<_Key, _Compare, _Allocator>& __x, 9353e519524SHoward Hinnant multiset<_Key, _Compare, _Allocator>& __y) 9363e519524SHoward Hinnant{ 9373e519524SHoward Hinnant __x.swap(__y); 9383e519524SHoward Hinnant} 9393e519524SHoward Hinnant 9403e519524SHoward Hinnant_LIBCPP_END_NAMESPACE_STD 9413e519524SHoward Hinnant 9423e519524SHoward Hinnant#endif // _LIBCPP_SET 943