13e519524SHoward Hinnant// -*- C++ -*- 23e519524SHoward Hinnant//===----------------------------- map ------------------------------------===// 33e519524SHoward Hinnant// 45b08a8a4SHoward Hinnant// The LLVM Compiler Infrastructure 53e519524SHoward Hinnant// 6412dbebeSHoward Hinnant// This file is dual licensed under the MIT and the University of Illinois Open 7412dbebeSHoward Hinnant// Source Licenses. See LICENSE.TXT for details. 83e519524SHoward Hinnant// 93e519524SHoward Hinnant//===----------------------------------------------------------------------===// 103e519524SHoward Hinnant 113e519524SHoward Hinnant#ifndef _LIBCPP_MAP 123e519524SHoward Hinnant#define _LIBCPP_MAP 133e519524SHoward Hinnant 143e519524SHoward Hinnant/* 153e519524SHoward Hinnant 163e519524SHoward Hinnant map synopsis 173e519524SHoward Hinnant 183e519524SHoward Hinnantnamespace std 193e519524SHoward Hinnant{ 203e519524SHoward Hinnant 213e519524SHoward Hinnanttemplate <class Key, class T, class Compare = less<Key>, 223e519524SHoward Hinnant class Allocator = allocator<pair<const Key, T>>> 233e519524SHoward Hinnantclass map 243e519524SHoward Hinnant{ 253e519524SHoward Hinnantpublic: 263e519524SHoward Hinnant // types: 273e519524SHoward Hinnant typedef Key key_type; 283e519524SHoward Hinnant typedef T mapped_type; 293e519524SHoward Hinnant typedef pair<const key_type, mapped_type> value_type; 303e519524SHoward Hinnant typedef Compare key_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::pointer pointer; 353e519524SHoward Hinnant typedef typename allocator_type::const_pointer const_pointer; 363e519524SHoward Hinnant typedef typename allocator_type::size_type size_type; 373e519524SHoward Hinnant typedef typename allocator_type::difference_type difference_type; 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; 43b0386a51SErik Pilkington typedef unspecified node_type; // C++17 44b0386a51SErik Pilkington typedef INSERT_RETURN_TYPE<iterator, node_type> insert_return_type; // C++17 453e519524SHoward Hinnant 463e519524SHoward Hinnant class value_compare 473e519524SHoward Hinnant : public binary_function<value_type, value_type, bool> 483e519524SHoward Hinnant { 493e519524SHoward Hinnant friend class map; 503e519524SHoward Hinnant protected: 513e519524SHoward Hinnant key_compare comp; 523e519524SHoward Hinnant 533e519524SHoward Hinnant value_compare(key_compare c); 543e519524SHoward Hinnant public: 553e519524SHoward Hinnant bool operator()(const value_type& x, const value_type& y) const; 563e519524SHoward Hinnant }; 573e519524SHoward Hinnant 583e519524SHoward Hinnant // construct/copy/destroy: 591052ee39SHoward Hinnant map() 601052ee39SHoward Hinnant noexcept( 611052ee39SHoward Hinnant is_nothrow_default_constructible<allocator_type>::value && 621052ee39SHoward Hinnant is_nothrow_default_constructible<key_compare>::value && 631052ee39SHoward Hinnant is_nothrow_copy_constructible<key_compare>::value); 643e519524SHoward Hinnant explicit map(const key_compare& comp); 653e519524SHoward Hinnant map(const key_compare& comp, const allocator_type& a); 663e519524SHoward Hinnant template <class InputIterator> 673e519524SHoward Hinnant map(InputIterator first, InputIterator last, 683e519524SHoward Hinnant const key_compare& comp = key_compare()); 693e519524SHoward Hinnant template <class InputIterator> 703e519524SHoward Hinnant map(InputIterator first, InputIterator last, 713e519524SHoward Hinnant const key_compare& comp, const allocator_type& a); 723e519524SHoward Hinnant map(const map& m); 731052ee39SHoward Hinnant map(map&& m) 741052ee39SHoward Hinnant noexcept( 751052ee39SHoward Hinnant is_nothrow_move_constructible<allocator_type>::value && 761052ee39SHoward Hinnant is_nothrow_move_constructible<key_compare>::value); 773e519524SHoward Hinnant explicit map(const allocator_type& a); 783e519524SHoward Hinnant map(const map& m, const allocator_type& a); 793e519524SHoward Hinnant map(map&& m, const allocator_type& a); 803e519524SHoward Hinnant map(initializer_list<value_type> il, const key_compare& comp = key_compare()); 813e519524SHoward Hinnant map(initializer_list<value_type> il, const key_compare& comp, const allocator_type& a); 82fbc317d4SMarshall Clow template <class InputIterator> 83fbc317d4SMarshall Clow map(InputIterator first, InputIterator last, const allocator_type& a) 84fbc317d4SMarshall Clow : map(first, last, Compare(), a) {} // C++14 85fbc317d4SMarshall Clow map(initializer_list<value_type> il, const allocator_type& a) 86fbc317d4SMarshall Clow : map(il, Compare(), a) {} // C++14 873e519524SHoward Hinnant ~map(); 883e519524SHoward Hinnant 893e519524SHoward Hinnant map& operator=(const map& m); 901052ee39SHoward Hinnant map& operator=(map&& m) 911052ee39SHoward Hinnant noexcept( 921052ee39SHoward Hinnant allocator_type::propagate_on_container_move_assignment::value && 931052ee39SHoward Hinnant is_nothrow_move_assignable<allocator_type>::value && 940e9f71c1SHoward Hinnant is_nothrow_move_assignable<key_compare>::value); 953e519524SHoward Hinnant map& operator=(initializer_list<value_type> il); 963e519524SHoward Hinnant 973e519524SHoward Hinnant // iterators: 980e9f71c1SHoward Hinnant iterator begin() noexcept; 990e9f71c1SHoward Hinnant const_iterator begin() const noexcept; 1000e9f71c1SHoward Hinnant iterator end() noexcept; 1010e9f71c1SHoward Hinnant const_iterator end() const noexcept; 1023e519524SHoward Hinnant 1030e9f71c1SHoward Hinnant reverse_iterator rbegin() noexcept; 1040e9f71c1SHoward Hinnant const_reverse_iterator rbegin() const noexcept; 1050e9f71c1SHoward Hinnant reverse_iterator rend() noexcept; 1060e9f71c1SHoward Hinnant const_reverse_iterator rend() const noexcept; 1073e519524SHoward Hinnant 1080e9f71c1SHoward Hinnant const_iterator cbegin() const noexcept; 1090e9f71c1SHoward Hinnant const_iterator cend() const noexcept; 1100e9f71c1SHoward Hinnant const_reverse_iterator crbegin() const noexcept; 1110e9f71c1SHoward Hinnant const_reverse_iterator crend() const noexcept; 1123e519524SHoward Hinnant 1133e519524SHoward Hinnant // capacity: 1140e9f71c1SHoward Hinnant bool empty() const noexcept; 1150e9f71c1SHoward Hinnant size_type size() const noexcept; 1160e9f71c1SHoward Hinnant size_type max_size() const noexcept; 1173e519524SHoward Hinnant 1183e519524SHoward Hinnant // element access: 1193e519524SHoward Hinnant mapped_type& operator[](const key_type& k); 1203e519524SHoward Hinnant mapped_type& operator[](key_type&& k); 1213e519524SHoward Hinnant 1223e519524SHoward Hinnant mapped_type& at(const key_type& k); 1233e519524SHoward Hinnant const mapped_type& at(const key_type& k) const; 1243e519524SHoward Hinnant 1253e519524SHoward Hinnant // modifiers: 1263e519524SHoward Hinnant template <class... Args> 1273e519524SHoward Hinnant pair<iterator, bool> emplace(Args&&... args); 1283e519524SHoward Hinnant template <class... Args> 1293e519524SHoward Hinnant iterator emplace_hint(const_iterator position, Args&&... args); 1303e519524SHoward Hinnant pair<iterator, bool> insert(const value_type& v); 131afc9ff99SMarshall Clow pair<iterator, bool> insert( value_type&& v); // C++17 1323e519524SHoward Hinnant template <class P> 1333e519524SHoward Hinnant pair<iterator, bool> insert(P&& p); 1343e519524SHoward Hinnant iterator insert(const_iterator position, const value_type& v); 135afc9ff99SMarshall Clow iterator insert(const_iterator position, value_type&& v); // C++17 1363e519524SHoward Hinnant template <class P> 1373e519524SHoward Hinnant iterator insert(const_iterator position, P&& p); 1383e519524SHoward Hinnant template <class InputIterator> 1393e519524SHoward Hinnant void insert(InputIterator first, InputIterator last); 1403e519524SHoward Hinnant void insert(initializer_list<value_type> il); 1413e519524SHoward Hinnant 142b0386a51SErik Pilkington node_type extract(const_iterator position); // C++17 143b0386a51SErik Pilkington node_type extract(const key_type& x); // C++17 144b0386a51SErik Pilkington insert_return_type insert(node_type&& nh); // C++17 145b0386a51SErik Pilkington iterator insert(const_iterator hint, node_type&& nh); // C++17 146b0386a51SErik Pilkington 1478aaf517dSMarshall Clow template <class... Args> 1488aaf517dSMarshall Clow pair<iterator, bool> try_emplace(const key_type& k, Args&&... args); // C++17 1498aaf517dSMarshall Clow template <class... Args> 1508aaf517dSMarshall Clow pair<iterator, bool> try_emplace(key_type&& k, Args&&... args); // C++17 1518aaf517dSMarshall Clow template <class... Args> 1528aaf517dSMarshall Clow iterator try_emplace(const_iterator hint, const key_type& k, Args&&... args); // C++17 1538aaf517dSMarshall Clow template <class... Args> 1548aaf517dSMarshall Clow iterator try_emplace(const_iterator hint, key_type&& k, Args&&... args); // C++17 1558aaf517dSMarshall Clow template <class M> 1568aaf517dSMarshall Clow pair<iterator, bool> insert_or_assign(const key_type& k, M&& obj); // C++17 1578aaf517dSMarshall Clow template <class M> 1588aaf517dSMarshall Clow pair<iterator, bool> insert_or_assign(key_type&& k, M&& obj); // C++17 1598aaf517dSMarshall Clow template <class M> 1608aaf517dSMarshall Clow iterator insert_or_assign(const_iterator hint, const key_type& k, M&& obj); // C++17 1618aaf517dSMarshall Clow template <class M> 1628aaf517dSMarshall Clow iterator insert_or_assign(const_iterator hint, key_type&& k, M&& obj); // C++17 1638aaf517dSMarshall Clow 1643e519524SHoward Hinnant iterator erase(const_iterator position); 165ec392968SMarshall Clow iterator erase(iterator position); // C++14 1663e519524SHoward Hinnant size_type erase(const key_type& k); 1673e519524SHoward Hinnant iterator erase(const_iterator first, const_iterator last); 1680e9f71c1SHoward Hinnant void clear() noexcept; 1693e519524SHoward Hinnant 170*5c4e07aeSErik Pilkington template<class C2> 171*5c4e07aeSErik Pilkington void merge(map<Key, T, C2, Allocator>& source); // C++17 172*5c4e07aeSErik Pilkington template<class C2> 173*5c4e07aeSErik Pilkington void merge(map<Key, T, C2, Allocator>&& source); // C++17 174*5c4e07aeSErik Pilkington template<class C2> 175*5c4e07aeSErik Pilkington void merge(multimap<Key, T, C2, Allocator>& source); // C++17 176*5c4e07aeSErik Pilkington template<class C2> 177*5c4e07aeSErik Pilkington void merge(multimap<Key, T, C2, Allocator>&& source); // C++17 178*5c4e07aeSErik Pilkington 1791052ee39SHoward Hinnant void swap(map& m) 180e3fbe143SMarshall Clow noexcept(allocator_traits<allocator_type>::is_always_equal::value && 181f07dd8d0SEric Fiselier is_nothrow_swappable<key_compare>::value); // C++17 1823e519524SHoward Hinnant 1833e519524SHoward Hinnant // observers: 1840e9f71c1SHoward Hinnant allocator_type get_allocator() const noexcept; 1853e519524SHoward Hinnant key_compare key_comp() const; 1863e519524SHoward Hinnant value_compare value_comp() const; 1873e519524SHoward Hinnant 1883e519524SHoward Hinnant // map operations: 1893e519524SHoward Hinnant iterator find(const key_type& k); 1903e519524SHoward Hinnant const_iterator find(const key_type& k) const; 1912585835cSMarshall Clow template<typename K> 1922585835cSMarshall Clow iterator find(const K& x); // C++14 1932585835cSMarshall Clow template<typename K> 1942585835cSMarshall Clow const_iterator find(const K& x) const; // C++14 1952585835cSMarshall Clow template<typename K> 1960aacbc92SMarshall Clow size_type count(const K& x) const; // C++14 1972585835cSMarshall Clow 1983e519524SHoward Hinnant size_type count(const key_type& k) const; 1993e519524SHoward Hinnant iterator lower_bound(const key_type& k); 2003e519524SHoward Hinnant const_iterator lower_bound(const key_type& k) const; 2012585835cSMarshall Clow template<typename K> 2022585835cSMarshall Clow iterator lower_bound(const K& x); // C++14 2032585835cSMarshall Clow template<typename K> 2042585835cSMarshall Clow const_iterator lower_bound(const K& x) const; // C++14 2052585835cSMarshall Clow 2063e519524SHoward Hinnant iterator upper_bound(const key_type& k); 2073e519524SHoward Hinnant const_iterator upper_bound(const key_type& k) const; 2082585835cSMarshall Clow template<typename K> 2092585835cSMarshall Clow iterator upper_bound(const K& x); // C++14 2102585835cSMarshall Clow template<typename K> 2112585835cSMarshall Clow const_iterator upper_bound(const K& x) const; // C++14 2122585835cSMarshall Clow 2133e519524SHoward Hinnant pair<iterator,iterator> equal_range(const key_type& k); 2143e519524SHoward Hinnant pair<const_iterator,const_iterator> equal_range(const key_type& k) const; 2152585835cSMarshall Clow template<typename K> 2162585835cSMarshall Clow pair<iterator,iterator> equal_range(const K& x); // C++14 2172585835cSMarshall Clow template<typename K> 2182585835cSMarshall Clow pair<const_iterator,const_iterator> equal_range(const K& x) const; // C++14 2193e519524SHoward Hinnant}; 2203e519524SHoward Hinnant 2213e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator> 2223e519524SHoward Hinnantbool 2233e519524SHoward Hinnantoperator==(const map<Key, T, Compare, Allocator>& x, 2243e519524SHoward Hinnant const map<Key, T, Compare, Allocator>& y); 2253e519524SHoward Hinnant 2263e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator> 2273e519524SHoward Hinnantbool 2283e519524SHoward Hinnantoperator< (const map<Key, T, Compare, Allocator>& x, 2293e519524SHoward Hinnant const map<Key, T, Compare, Allocator>& y); 2303e519524SHoward Hinnant 2313e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator> 2323e519524SHoward Hinnantbool 2333e519524SHoward Hinnantoperator!=(const map<Key, T, Compare, Allocator>& x, 2343e519524SHoward Hinnant const map<Key, T, Compare, Allocator>& y); 2353e519524SHoward Hinnant 2363e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator> 2373e519524SHoward Hinnantbool 2383e519524SHoward Hinnantoperator> (const map<Key, T, Compare, Allocator>& x, 2393e519524SHoward Hinnant const map<Key, T, Compare, Allocator>& y); 2403e519524SHoward Hinnant 2413e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator> 2423e519524SHoward Hinnantbool 2433e519524SHoward Hinnantoperator>=(const map<Key, T, Compare, Allocator>& x, 2443e519524SHoward Hinnant const map<Key, T, Compare, Allocator>& y); 2453e519524SHoward Hinnant 2463e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator> 2473e519524SHoward Hinnantbool 2483e519524SHoward Hinnantoperator<=(const map<Key, T, Compare, Allocator>& x, 2493e519524SHoward Hinnant const map<Key, T, Compare, Allocator>& y); 2503e519524SHoward Hinnant 2513e519524SHoward Hinnant// specialized algorithms: 2523e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator> 2533e519524SHoward Hinnantvoid 2541052ee39SHoward Hinnantswap(map<Key, T, Compare, Allocator>& x, map<Key, T, Compare, Allocator>& y) 2551052ee39SHoward Hinnant noexcept(noexcept(x.swap(y))); 2563e519524SHoward Hinnant 2573e519524SHoward Hinnanttemplate <class Key, class T, class Compare = less<Key>, 2583e519524SHoward Hinnant class Allocator = allocator<pair<const Key, T>>> 2593e519524SHoward Hinnantclass multimap 2603e519524SHoward Hinnant{ 2613e519524SHoward Hinnantpublic: 2623e519524SHoward Hinnant // types: 2633e519524SHoward Hinnant typedef Key key_type; 2643e519524SHoward Hinnant typedef T mapped_type; 2653e519524SHoward Hinnant typedef pair<const key_type,mapped_type> value_type; 2663e519524SHoward Hinnant typedef Compare key_compare; 2673e519524SHoward Hinnant typedef Allocator allocator_type; 2683e519524SHoward Hinnant typedef typename allocator_type::reference reference; 2693e519524SHoward Hinnant typedef typename allocator_type::const_reference const_reference; 2703e519524SHoward Hinnant typedef typename allocator_type::size_type size_type; 2713e519524SHoward Hinnant typedef typename allocator_type::difference_type difference_type; 2723e519524SHoward Hinnant typedef typename allocator_type::pointer pointer; 2733e519524SHoward Hinnant typedef typename allocator_type::const_pointer const_pointer; 2743e519524SHoward Hinnant 2753e519524SHoward Hinnant typedef implementation-defined iterator; 2763e519524SHoward Hinnant typedef implementation-defined const_iterator; 2773e519524SHoward Hinnant typedef std::reverse_iterator<iterator> reverse_iterator; 2783e519524SHoward Hinnant typedef std::reverse_iterator<const_iterator> const_reverse_iterator; 279b0386a51SErik Pilkington typedef unspecified node_type; // C++17 2803e519524SHoward Hinnant 2813e519524SHoward Hinnant class value_compare 2823e519524SHoward Hinnant : public binary_function<value_type,value_type,bool> 2833e519524SHoward Hinnant { 2843e519524SHoward Hinnant friend class multimap; 2853e519524SHoward Hinnant protected: 2863e519524SHoward Hinnant key_compare comp; 2873e519524SHoward Hinnant value_compare(key_compare c); 2883e519524SHoward Hinnant public: 2893e519524SHoward Hinnant bool operator()(const value_type& x, const value_type& y) const; 2903e519524SHoward Hinnant }; 2913e519524SHoward Hinnant 2923e519524SHoward Hinnant // construct/copy/destroy: 2931052ee39SHoward Hinnant multimap() 2941052ee39SHoward Hinnant noexcept( 2951052ee39SHoward Hinnant is_nothrow_default_constructible<allocator_type>::value && 2961052ee39SHoward Hinnant is_nothrow_default_constructible<key_compare>::value && 2971052ee39SHoward Hinnant is_nothrow_copy_constructible<key_compare>::value); 2981052ee39SHoward Hinnant explicit multimap(const key_compare& comp); 2993e519524SHoward Hinnant multimap(const key_compare& comp, const allocator_type& a); 3003e519524SHoward Hinnant template <class InputIterator> 3013e519524SHoward Hinnant multimap(InputIterator first, InputIterator last, const key_compare& comp); 3023e519524SHoward Hinnant template <class InputIterator> 3033e519524SHoward Hinnant multimap(InputIterator first, InputIterator last, const key_compare& comp, 3043e519524SHoward Hinnant const allocator_type& a); 3053e519524SHoward Hinnant multimap(const multimap& m); 3061052ee39SHoward Hinnant multimap(multimap&& m) 3071052ee39SHoward Hinnant noexcept( 3081052ee39SHoward Hinnant is_nothrow_move_constructible<allocator_type>::value && 3091052ee39SHoward Hinnant is_nothrow_move_constructible<key_compare>::value); 3103e519524SHoward Hinnant explicit multimap(const allocator_type& a); 3113e519524SHoward Hinnant multimap(const multimap& m, const allocator_type& a); 3123e519524SHoward Hinnant multimap(multimap&& m, const allocator_type& a); 3133e519524SHoward Hinnant multimap(initializer_list<value_type> il, const key_compare& comp = key_compare()); 3143e519524SHoward Hinnant multimap(initializer_list<value_type> il, const key_compare& comp, 3153e519524SHoward Hinnant const allocator_type& a); 316fbc317d4SMarshall Clow template <class InputIterator> 317fbc317d4SMarshall Clow multimap(InputIterator first, InputIterator last, const allocator_type& a) 318fbc317d4SMarshall Clow : multimap(first, last, Compare(), a) {} // C++14 319fbc317d4SMarshall Clow multimap(initializer_list<value_type> il, const allocator_type& a) 320fbc317d4SMarshall Clow : multimap(il, Compare(), a) {} // C++14 3213e519524SHoward Hinnant ~multimap(); 3223e519524SHoward Hinnant 3233e519524SHoward Hinnant multimap& operator=(const multimap& m); 3241052ee39SHoward Hinnant multimap& operator=(multimap&& m) 3251052ee39SHoward Hinnant noexcept( 3261052ee39SHoward Hinnant allocator_type::propagate_on_container_move_assignment::value && 3271052ee39SHoward Hinnant is_nothrow_move_assignable<allocator_type>::value && 3280e9f71c1SHoward Hinnant is_nothrow_move_assignable<key_compare>::value); 3293e519524SHoward Hinnant multimap& operator=(initializer_list<value_type> il); 3303e519524SHoward Hinnant 3313e519524SHoward Hinnant // iterators: 3320e9f71c1SHoward Hinnant iterator begin() noexcept; 3330e9f71c1SHoward Hinnant const_iterator begin() const noexcept; 3340e9f71c1SHoward Hinnant iterator end() noexcept; 3350e9f71c1SHoward Hinnant const_iterator end() const noexcept; 3363e519524SHoward Hinnant 3370e9f71c1SHoward Hinnant reverse_iterator rbegin() noexcept; 3380e9f71c1SHoward Hinnant const_reverse_iterator rbegin() const noexcept; 3390e9f71c1SHoward Hinnant reverse_iterator rend() noexcept; 3400e9f71c1SHoward Hinnant const_reverse_iterator rend() const noexcept; 3413e519524SHoward Hinnant 3420e9f71c1SHoward Hinnant const_iterator cbegin() const noexcept; 3430e9f71c1SHoward Hinnant const_iterator cend() const noexcept; 3440e9f71c1SHoward Hinnant const_reverse_iterator crbegin() const noexcept; 3450e9f71c1SHoward Hinnant const_reverse_iterator crend() const noexcept; 3463e519524SHoward Hinnant 3473e519524SHoward Hinnant // capacity: 3480e9f71c1SHoward Hinnant bool empty() const noexcept; 3490e9f71c1SHoward Hinnant size_type size() const noexcept; 3500e9f71c1SHoward Hinnant size_type max_size() const noexcept; 3513e519524SHoward Hinnant 3523e519524SHoward Hinnant // modifiers: 3533e519524SHoward Hinnant template <class... Args> 3543e519524SHoward Hinnant iterator emplace(Args&&... args); 3553e519524SHoward Hinnant template <class... Args> 3563e519524SHoward Hinnant iterator emplace_hint(const_iterator position, Args&&... args); 3573e519524SHoward Hinnant iterator insert(const value_type& v); 358afc9ff99SMarshall Clow iterator insert( value_type&& v); // C++17 3593e519524SHoward Hinnant template <class P> 3603e519524SHoward Hinnant iterator insert(P&& p); 3613e519524SHoward Hinnant iterator insert(const_iterator position, const value_type& v); 362afc9ff99SMarshall Clow iterator insert(const_iterator position, value_type&& v); // C++17 3633e519524SHoward Hinnant template <class P> 3643e519524SHoward Hinnant iterator insert(const_iterator position, P&& p); 3653e519524SHoward Hinnant template <class InputIterator> 3663e519524SHoward Hinnant void insert(InputIterator first, InputIterator last); 3673e519524SHoward Hinnant void insert(initializer_list<value_type> il); 3683e519524SHoward Hinnant 369b0386a51SErik Pilkington node_type extract(const_iterator position); // C++17 370b0386a51SErik Pilkington node_type extract(const key_type& x); // C++17 371b0386a51SErik Pilkington iterator insert(node_type&& nh); // C++17 372b0386a51SErik Pilkington iterator insert(const_iterator hint, node_type&& nh); // C++17 373b0386a51SErik Pilkington 3743e519524SHoward Hinnant iterator erase(const_iterator position); 375ec392968SMarshall Clow iterator erase(iterator position); // C++14 3763e519524SHoward Hinnant size_type erase(const key_type& k); 3773e519524SHoward Hinnant iterator erase(const_iterator first, const_iterator last); 3780e9f71c1SHoward Hinnant void clear() noexcept; 3793e519524SHoward Hinnant 380*5c4e07aeSErik Pilkington template<class C2> 381*5c4e07aeSErik Pilkington void merge(multimap<Key, T, C2, Allocator>& source); // C++17 382*5c4e07aeSErik Pilkington template<class C2> 383*5c4e07aeSErik Pilkington void merge(multimap<Key, T, C2, Allocator>&& source); // C++17 384*5c4e07aeSErik Pilkington template<class C2> 385*5c4e07aeSErik Pilkington void merge(map<Key, T, C2, Allocator>& source); // C++17 386*5c4e07aeSErik Pilkington template<class C2> 387*5c4e07aeSErik Pilkington void merge(map<Key, T, C2, Allocator>&& source); // C++17 388*5c4e07aeSErik Pilkington 3891052ee39SHoward Hinnant void swap(multimap& m) 390e3fbe143SMarshall Clow noexcept(allocator_traits<allocator_type>::is_always_equal::value && 391f07dd8d0SEric Fiselier is_nothrow_swappable<key_compare>::value); // C++17 3923e519524SHoward Hinnant 3933e519524SHoward Hinnant // observers: 3940e9f71c1SHoward Hinnant allocator_type get_allocator() const noexcept; 3953e519524SHoward Hinnant key_compare key_comp() const; 3963e519524SHoward Hinnant value_compare value_comp() const; 3973e519524SHoward Hinnant 3983e519524SHoward Hinnant // map operations: 3993e519524SHoward Hinnant iterator find(const key_type& k); 4003e519524SHoward Hinnant const_iterator find(const key_type& k) const; 4012585835cSMarshall Clow template<typename K> 4022585835cSMarshall Clow iterator find(const K& x); // C++14 4032585835cSMarshall Clow template<typename K> 4042585835cSMarshall Clow const_iterator find(const K& x) const; // C++14 4052585835cSMarshall Clow template<typename K> 4060aacbc92SMarshall Clow size_type count(const K& x) const; // C++14 4072585835cSMarshall Clow 4083e519524SHoward Hinnant size_type count(const key_type& k) const; 4093e519524SHoward Hinnant iterator lower_bound(const key_type& k); 4103e519524SHoward Hinnant const_iterator lower_bound(const key_type& k) const; 4112585835cSMarshall Clow template<typename K> 4122585835cSMarshall Clow iterator lower_bound(const K& x); // C++14 4132585835cSMarshall Clow template<typename K> 4142585835cSMarshall Clow const_iterator lower_bound(const K& x) const; // C++14 4152585835cSMarshall Clow 4163e519524SHoward Hinnant iterator upper_bound(const key_type& k); 4173e519524SHoward Hinnant const_iterator upper_bound(const key_type& k) const; 4182585835cSMarshall Clow template<typename K> 4192585835cSMarshall Clow iterator upper_bound(const K& x); // C++14 4202585835cSMarshall Clow template<typename K> 4212585835cSMarshall Clow const_iterator upper_bound(const K& x) const; // C++14 4222585835cSMarshall Clow 4233e519524SHoward Hinnant pair<iterator,iterator> equal_range(const key_type& k); 4243e519524SHoward Hinnant pair<const_iterator,const_iterator> equal_range(const key_type& k) const; 4252585835cSMarshall Clow template<typename K> 4262585835cSMarshall Clow pair<iterator,iterator> equal_range(const K& x); // C++14 4272585835cSMarshall Clow template<typename K> 4282585835cSMarshall Clow pair<const_iterator,const_iterator> equal_range(const K& x) const; // C++14 4293e519524SHoward Hinnant}; 4303e519524SHoward Hinnant 4313e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator> 4323e519524SHoward Hinnantbool 4333e519524SHoward Hinnantoperator==(const multimap<Key, T, Compare, Allocator>& x, 4343e519524SHoward Hinnant const multimap<Key, T, Compare, Allocator>& y); 4353e519524SHoward Hinnant 4363e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator> 4373e519524SHoward Hinnantbool 4383e519524SHoward Hinnantoperator< (const multimap<Key, T, Compare, Allocator>& x, 4393e519524SHoward Hinnant const multimap<Key, T, Compare, Allocator>& y); 4403e519524SHoward Hinnant 4413e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator> 4423e519524SHoward Hinnantbool 4433e519524SHoward Hinnantoperator!=(const multimap<Key, T, Compare, Allocator>& x, 4443e519524SHoward Hinnant const multimap<Key, T, Compare, Allocator>& y); 4453e519524SHoward Hinnant 4463e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator> 4473e519524SHoward Hinnantbool 4483e519524SHoward Hinnantoperator> (const multimap<Key, T, Compare, Allocator>& x, 4493e519524SHoward Hinnant const multimap<Key, T, Compare, Allocator>& y); 4503e519524SHoward Hinnant 4513e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator> 4523e519524SHoward Hinnantbool 4533e519524SHoward Hinnantoperator>=(const multimap<Key, T, Compare, Allocator>& x, 4543e519524SHoward Hinnant const multimap<Key, T, Compare, Allocator>& y); 4553e519524SHoward Hinnant 4563e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator> 4573e519524SHoward Hinnantbool 4583e519524SHoward Hinnantoperator<=(const multimap<Key, T, Compare, Allocator>& x, 4593e519524SHoward Hinnant const multimap<Key, T, Compare, Allocator>& y); 4603e519524SHoward Hinnant 4613e519524SHoward Hinnant// specialized algorithms: 4623e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator> 4633e519524SHoward Hinnantvoid 4643e519524SHoward Hinnantswap(multimap<Key, T, Compare, Allocator>& x, 4651052ee39SHoward Hinnant multimap<Key, T, Compare, Allocator>& y) 4661052ee39SHoward Hinnant noexcept(noexcept(x.swap(y))); 4673e519524SHoward Hinnant 4683e519524SHoward Hinnant} // std 4693e519524SHoward Hinnant 4703e519524SHoward Hinnant*/ 4713e519524SHoward Hinnant 4723e519524SHoward Hinnant#include <__config> 4733e519524SHoward Hinnant#include <__tree> 474b0386a51SErik Pilkington#include <__node_handle> 4753e519524SHoward Hinnant#include <iterator> 4763e519524SHoward Hinnant#include <memory> 4773e519524SHoward Hinnant#include <utility> 4783e519524SHoward Hinnant#include <functional> 4793e519524SHoward Hinnant#include <initializer_list> 480ee187e24SEric Fiselier#include <type_traits> 481f56972e2SMarshall Clow#include <version> 4823e519524SHoward Hinnant 483073458b1SHoward Hinnant#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 4843e519524SHoward Hinnant#pragma GCC system_header 485073458b1SHoward Hinnant#endif 4863e519524SHoward Hinnant 4873e519524SHoward Hinnant_LIBCPP_BEGIN_NAMESPACE_STD 4883e519524SHoward Hinnant 489b1e7a12eSEric Fiseliertemplate <class _Key, class _CP, class _Compare, bool _IsSmall> 4903e519524SHoward Hinnantclass __map_value_compare 4913e519524SHoward Hinnant : private _Compare 4923e519524SHoward Hinnant{ 4933e519524SHoward Hinnantpublic: 494848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 4951052ee39SHoward Hinnant __map_value_compare() 4961052ee39SHoward Hinnant _NOEXCEPT_(is_nothrow_default_constructible<_Compare>::value) 4971052ee39SHoward Hinnant : _Compare() {} 498848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 4991052ee39SHoward Hinnant __map_value_compare(_Compare c) 5001052ee39SHoward Hinnant _NOEXCEPT_(is_nothrow_copy_constructible<_Compare>::value) 5011052ee39SHoward Hinnant : _Compare(c) {} 502848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 5031052ee39SHoward Hinnant const _Compare& key_comp() const _NOEXCEPT {return *this;} 504848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 5053e519524SHoward Hinnant bool operator()(const _CP& __x, const _CP& __y) const 506f52318b4SErik Pilkington {return static_cast<const _Compare&>(*this)(__x.__get_value().first, __y.__get_value().first);} 507848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 5083e519524SHoward Hinnant bool operator()(const _CP& __x, const _Key& __y) const 509f52318b4SErik Pilkington {return static_cast<const _Compare&>(*this)(__x.__get_value().first, __y);} 510848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 5113e519524SHoward Hinnant bool operator()(const _Key& __x, const _CP& __y) const 512f52318b4SErik Pilkington {return static_cast<const _Compare&>(*this)(__x, __y.__get_value().first);} 513e3fbe143SMarshall Clow void swap(__map_value_compare&__y) 514e3fbe143SMarshall Clow _NOEXCEPT_(__is_nothrow_swappable<_Compare>::value) 515e3fbe143SMarshall Clow { 516e3fbe143SMarshall Clow using _VSTD::swap; 517e1ec2986SEric Fiselier swap(static_cast<_Compare&>(*this), static_cast<_Compare&>(__y)); 518e3fbe143SMarshall Clow } 5192585835cSMarshall Clow 5202585835cSMarshall Clow#if _LIBCPP_STD_VER > 11 5212585835cSMarshall Clow template <typename _K2> 5222585835cSMarshall Clow _LIBCPP_INLINE_VISIBILITY 5232585835cSMarshall Clow typename enable_if<__is_transparent<_Compare, _K2>::value, bool>::type 5242585835cSMarshall Clow operator () ( const _K2& __x, const _CP& __y ) const 525f52318b4SErik Pilkington {return static_cast<const _Compare&>(*this) (__x, __y.__get_value().first);} 5262585835cSMarshall Clow 5272585835cSMarshall Clow template <typename _K2> 5282585835cSMarshall Clow _LIBCPP_INLINE_VISIBILITY 5292585835cSMarshall Clow typename enable_if<__is_transparent<_Compare, _K2>::value, bool>::type 5302585835cSMarshall Clow operator () (const _CP& __x, const _K2& __y) const 531f52318b4SErik Pilkington {return static_cast<const _Compare&>(*this) (__x.__get_value().first, __y);} 5322585835cSMarshall Clow#endif 5333e519524SHoward Hinnant}; 5343e519524SHoward Hinnant 535abb160e6SHoward Hinnanttemplate <class _Key, class _CP, class _Compare> 536abb160e6SHoward Hinnantclass __map_value_compare<_Key, _CP, _Compare, false> 5373e519524SHoward Hinnant{ 5383e519524SHoward Hinnant _Compare comp; 5393e519524SHoward Hinnant 5403e519524SHoward Hinnantpublic: 541848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 5421052ee39SHoward Hinnant __map_value_compare() 5431052ee39SHoward Hinnant _NOEXCEPT_(is_nothrow_default_constructible<_Compare>::value) 5441052ee39SHoward Hinnant : comp() {} 545848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 5461052ee39SHoward Hinnant __map_value_compare(_Compare c) 5471052ee39SHoward Hinnant _NOEXCEPT_(is_nothrow_copy_constructible<_Compare>::value) 5481052ee39SHoward Hinnant : comp(c) {} 549848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 5501052ee39SHoward Hinnant const _Compare& key_comp() const _NOEXCEPT {return comp;} 5513e519524SHoward Hinnant 552848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 5533e519524SHoward Hinnant bool operator()(const _CP& __x, const _CP& __y) const 554f52318b4SErik Pilkington {return comp(__x.__get_value().first, __y.__get_value().first);} 555848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 5563e519524SHoward Hinnant bool operator()(const _CP& __x, const _Key& __y) const 557f52318b4SErik Pilkington {return comp(__x.__get_value().first, __y);} 558848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 5593e519524SHoward Hinnant bool operator()(const _Key& __x, const _CP& __y) const 560f52318b4SErik Pilkington {return comp(__x, __y.__get_value().first);} 561e3fbe143SMarshall Clow void swap(__map_value_compare&__y) 562e3fbe143SMarshall Clow _NOEXCEPT_(__is_nothrow_swappable<_Compare>::value) 563e3fbe143SMarshall Clow { 564e3fbe143SMarshall Clow using _VSTD::swap; 565e3fbe143SMarshall Clow swap(comp, __y.comp); 566e3fbe143SMarshall Clow } 5672585835cSMarshall Clow 5682585835cSMarshall Clow#if _LIBCPP_STD_VER > 11 5692585835cSMarshall Clow template <typename _K2> 5702585835cSMarshall Clow _LIBCPP_INLINE_VISIBILITY 5712585835cSMarshall Clow typename enable_if<__is_transparent<_Compare, _K2>::value, bool>::type 5722585835cSMarshall Clow operator () ( const _K2& __x, const _CP& __y ) const 573f52318b4SErik Pilkington {return comp (__x, __y.__get_value().first);} 5742585835cSMarshall Clow 5752585835cSMarshall Clow template <typename _K2> 5762585835cSMarshall Clow _LIBCPP_INLINE_VISIBILITY 5772585835cSMarshall Clow typename enable_if<__is_transparent<_Compare, _K2>::value, bool>::type 5782585835cSMarshall Clow operator () (const _CP& __x, const _K2& __y) const 579f52318b4SErik Pilkington {return comp (__x.__get_value().first, __y);} 5802585835cSMarshall Clow#endif 5813e519524SHoward Hinnant}; 5823e519524SHoward Hinnant 583e3fbe143SMarshall Clowtemplate <class _Key, class _CP, class _Compare, bool __b> 584e3fbe143SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY 585e3fbe143SMarshall Clowvoid 586e3fbe143SMarshall Clowswap(__map_value_compare<_Key, _CP, _Compare, __b>& __x, 587e3fbe143SMarshall Clow __map_value_compare<_Key, _CP, _Compare, __b>& __y) 588e3fbe143SMarshall Clow _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y))) 589e3fbe143SMarshall Clow{ 590e3fbe143SMarshall Clow __x.swap(__y); 591e3fbe143SMarshall Clow} 592e3fbe143SMarshall Clow 5933e519524SHoward Hinnanttemplate <class _Allocator> 5943e519524SHoward Hinnantclass __map_node_destructor 5953e519524SHoward Hinnant{ 5963e519524SHoward Hinnant typedef _Allocator allocator_type; 5973e519524SHoward Hinnant typedef allocator_traits<allocator_type> __alloc_traits; 598089a7cc5SEric Fiselier 5993e519524SHoward Hinnantpublic: 6003e519524SHoward Hinnant typedef typename __alloc_traits::pointer pointer; 6013e519524SHoward Hinnant 602089a7cc5SEric Fiselierprivate: 6033e519524SHoward Hinnant allocator_type& __na_; 6043e519524SHoward Hinnant 6053e519524SHoward Hinnant __map_node_destructor& operator=(const __map_node_destructor&); 6063e519524SHoward Hinnant 6073e519524SHoward Hinnantpublic: 6083e519524SHoward Hinnant bool __first_constructed; 6093e519524SHoward Hinnant bool __second_constructed; 6103e519524SHoward Hinnant 611848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 6121052ee39SHoward Hinnant explicit __map_node_destructor(allocator_type& __na) _NOEXCEPT 6133e519524SHoward Hinnant : __na_(__na), 6143e519524SHoward Hinnant __first_constructed(false), 6153e519524SHoward Hinnant __second_constructed(false) 6163e519524SHoward Hinnant {} 6173e519524SHoward Hinnant 61818293116SEric Fiselier#ifndef _LIBCPP_CXX03_LANG 619848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 6201052ee39SHoward Hinnant __map_node_destructor(__tree_node_destructor<allocator_type>&& __x) _NOEXCEPT 6213e519524SHoward Hinnant : __na_(__x.__na_), 6223e519524SHoward Hinnant __first_constructed(__x.__value_constructed), 6233e519524SHoward Hinnant __second_constructed(__x.__value_constructed) 6243e519524SHoward Hinnant { 6253e519524SHoward Hinnant __x.__value_constructed = false; 6263e519524SHoward Hinnant } 62718293116SEric Fiselier#endif // _LIBCPP_CXX03_LANG 6283e519524SHoward Hinnant 629848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 6301052ee39SHoward Hinnant void operator()(pointer __p) _NOEXCEPT 6313e519524SHoward Hinnant { 6323e519524SHoward Hinnant if (__second_constructed) 633f52318b4SErik Pilkington __alloc_traits::destroy(__na_, _VSTD::addressof(__p->__value_.__get_value().second)); 6343e519524SHoward Hinnant if (__first_constructed) 635f52318b4SErik Pilkington __alloc_traits::destroy(__na_, _VSTD::addressof(__p->__value_.__get_value().first)); 6363e519524SHoward Hinnant if (__p) 6373e519524SHoward Hinnant __alloc_traits::deallocate(__na_, __p, 1); 6383e519524SHoward Hinnant } 6393e519524SHoward Hinnant}; 6403e519524SHoward Hinnant 641ce53420eSHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 642ce53420eSHoward Hinnant class map; 643ce53420eSHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 644ce53420eSHoward Hinnant class multimap; 645ce53420eSHoward Hinnanttemplate <class _TreeIterator> class __map_const_iterator; 6463e519524SHoward Hinnant 647089a7cc5SEric Fiselier#ifndef _LIBCPP_CXX03_LANG 6489fd9f84fSHoward Hinnant 6499fd9f84fSHoward Hinnanttemplate <class _Key, class _Tp> 650f52318b4SErik Pilkingtonstruct __value_type 6519fd9f84fSHoward Hinnant{ 6529fd9f84fSHoward Hinnant typedef _Key key_type; 6539fd9f84fSHoward Hinnant typedef _Tp mapped_type; 6549fd9f84fSHoward Hinnant typedef pair<const key_type, mapped_type> value_type; 655f52318b4SErik Pilkington typedef pair<key_type&, mapped_type&> __nc_ref_pair_type; 656f52318b4SErik Pilkington typedef pair<key_type&&, mapped_type&&> __nc_rref_pair_type; 6579fd9f84fSHoward Hinnant 658f52318b4SErik Pilkingtonprivate: 6599fd9f84fSHoward Hinnant value_type __cc; 660f52318b4SErik Pilkington 661f52318b4SErik Pilkingtonpublic: 662f52318b4SErik Pilkington _LIBCPP_INLINE_VISIBILITY 663f52318b4SErik Pilkington value_type& __get_value() 664f52318b4SErik Pilkington { 665f52318b4SErik Pilkington#if _LIBCPP_STD_VER > 14 666f52318b4SErik Pilkington return *_VSTD::launder(_VSTD::addressof(__cc)); 667f52318b4SErik Pilkington#else 668f52318b4SErik Pilkington return __cc; 669f52318b4SErik Pilkington#endif 670f52318b4SErik Pilkington } 671f52318b4SErik Pilkington 672f52318b4SErik Pilkington _LIBCPP_INLINE_VISIBILITY 673f52318b4SErik Pilkington const value_type& __get_value() const 674f52318b4SErik Pilkington { 675f52318b4SErik Pilkington#if _LIBCPP_STD_VER > 14 676f52318b4SErik Pilkington return *_VSTD::launder(_VSTD::addressof(__cc)); 677f52318b4SErik Pilkington#else 678f52318b4SErik Pilkington return __cc; 679f52318b4SErik Pilkington#endif 680f52318b4SErik Pilkington } 681f52318b4SErik Pilkington 682f52318b4SErik Pilkington _LIBCPP_INLINE_VISIBILITY 683f52318b4SErik Pilkington __nc_ref_pair_type __ref() 684f52318b4SErik Pilkington { 685f52318b4SErik Pilkington value_type& __v = __get_value(); 686f52318b4SErik Pilkington return __nc_ref_pair_type(const_cast<key_type&>(__v.first), __v.second); 687f52318b4SErik Pilkington } 688f52318b4SErik Pilkington 689f52318b4SErik Pilkington _LIBCPP_INLINE_VISIBILITY 690f52318b4SErik Pilkington __nc_rref_pair_type __move() 691f52318b4SErik Pilkington { 692f52318b4SErik Pilkington value_type& __v = __get_value(); 693f52318b4SErik Pilkington return __nc_rref_pair_type( 694f52318b4SErik Pilkington _VSTD::move(const_cast<key_type&>(__v.first)), 695f52318b4SErik Pilkington _VSTD::move(__v.second)); 696f52318b4SErik Pilkington } 6979fd9f84fSHoward Hinnant 6989fd9f84fSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 6999fd9f84fSHoward Hinnant __value_type& operator=(const __value_type& __v) 700f52318b4SErik Pilkington { 701f52318b4SErik Pilkington __ref() = __v.__get_value(); 702f52318b4SErik Pilkington return *this; 703f52318b4SErik Pilkington } 7049fd9f84fSHoward Hinnant 7059fd9f84fSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 7069fd9f84fSHoward Hinnant __value_type& operator=(__value_type&& __v) 707f52318b4SErik Pilkington { 708f52318b4SErik Pilkington __ref() = __v.__move(); 709f52318b4SErik Pilkington return *this; 710f52318b4SErik Pilkington } 7119fd9f84fSHoward Hinnant 7125e3ea4ddSEric Fiselier template <class _ValueTp, 7135e3ea4ddSEric Fiselier class = typename enable_if< 7145e3ea4ddSEric Fiselier __is_same_uncvref<_ValueTp, value_type>::value 7155e3ea4ddSEric Fiselier >::type 7165e3ea4ddSEric Fiselier > 7179fd9f84fSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 718f52318b4SErik Pilkington __value_type& operator=(_ValueTp&& __v) 719f52318b4SErik Pilkington { 720f52318b4SErik Pilkington __ref() = _VSTD::forward<_ValueTp>(__v); 721f52318b4SErik Pilkington return *this; 7225e3ea4ddSEric Fiselier } 7235e3ea4ddSEric Fiselier 7245e3ea4ddSEric Fiselierprivate: 7255e3ea4ddSEric Fiselier __value_type() _LIBCPP_EQUAL_DELETE; 7265e3ea4ddSEric Fiselier ~__value_type() _LIBCPP_EQUAL_DELETE; 7275e3ea4ddSEric Fiselier __value_type(const __value_type& __v) _LIBCPP_EQUAL_DELETE; 7285e3ea4ddSEric Fiselier __value_type(__value_type&& __v) _LIBCPP_EQUAL_DELETE; 7299fd9f84fSHoward Hinnant}; 7309fd9f84fSHoward Hinnant 7319fd9f84fSHoward Hinnant#else 7329fd9f84fSHoward Hinnant 7339fd9f84fSHoward Hinnanttemplate <class _Key, class _Tp> 7349fd9f84fSHoward Hinnantstruct __value_type 7359fd9f84fSHoward Hinnant{ 7369fd9f84fSHoward Hinnant typedef _Key key_type; 7379fd9f84fSHoward Hinnant typedef _Tp mapped_type; 7389fd9f84fSHoward Hinnant typedef pair<const key_type, mapped_type> value_type; 7399fd9f84fSHoward Hinnant 740f52318b4SErik Pilkingtonprivate: 7419fd9f84fSHoward Hinnant value_type __cc; 7429fd9f84fSHoward Hinnant 743f52318b4SErik Pilkingtonpublic: 744f52318b4SErik Pilkington _LIBCPP_INLINE_VISIBILITY 745f52318b4SErik Pilkington value_type& __get_value() { return __cc; } 746f52318b4SErik Pilkington _LIBCPP_INLINE_VISIBILITY 747f52318b4SErik Pilkington const value_type& __get_value() const { return __cc; } 748f52318b4SErik Pilkington 7495e3ea4ddSEric Fiselierprivate: 7505e3ea4ddSEric Fiselier __value_type(); 7515e3ea4ddSEric Fiselier __value_type(__value_type const&); 7525e3ea4ddSEric Fiselier __value_type& operator=(__value_type const&); 7535e3ea4ddSEric Fiselier ~__value_type(); 7549fd9f84fSHoward Hinnant}; 7559fd9f84fSHoward Hinnant 75618293116SEric Fiselier#endif // _LIBCPP_CXX03_LANG 7579fd9f84fSHoward Hinnant 758b3be398cSEric Fiseliertemplate <class _Tp> 759b3be398cSEric Fiselierstruct __extract_key_value_types; 760b3be398cSEric Fiselier 761b3be398cSEric Fiseliertemplate <class _Key, class _Tp> 762b3be398cSEric Fiselierstruct __extract_key_value_types<__value_type<_Key, _Tp> > 763b3be398cSEric Fiselier{ 764b3be398cSEric Fiselier typedef _Key const __key_type; 765b3be398cSEric Fiselier typedef _Tp __mapped_type; 766b3be398cSEric Fiselier}; 767b3be398cSEric Fiselier 7683e519524SHoward Hinnanttemplate <class _TreeIterator> 769e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS __map_iterator 7703e519524SHoward Hinnant{ 771089a7cc5SEric Fiselier typedef typename _TreeIterator::_NodeTypes _NodeTypes; 772089a7cc5SEric Fiselier typedef typename _TreeIterator::__pointer_traits __pointer_traits; 773089a7cc5SEric Fiselier 7743e519524SHoward Hinnant _TreeIterator __i_; 7753e519524SHoward Hinnant 7763e519524SHoward Hinnantpublic: 7773e519524SHoward Hinnant typedef bidirectional_iterator_tag iterator_category; 778089a7cc5SEric Fiselier typedef typename _NodeTypes::__map_value_type value_type; 7793e519524SHoward Hinnant typedef typename _TreeIterator::difference_type difference_type; 7803e519524SHoward Hinnant typedef value_type& reference; 781089a7cc5SEric Fiselier typedef typename _NodeTypes::__map_value_type_pointer pointer; 7823e519524SHoward Hinnant 783848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 7841052ee39SHoward Hinnant __map_iterator() _NOEXCEPT {} 7853e519524SHoward Hinnant 786848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 7871052ee39SHoward Hinnant __map_iterator(_TreeIterator __i) _NOEXCEPT : __i_(__i) {} 7883e519524SHoward Hinnant 789848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 790f52318b4SErik Pilkington reference operator*() const {return __i_->__get_value();} 791848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 792f52318b4SErik Pilkington pointer operator->() const {return pointer_traits<pointer>::pointer_to(__i_->__get_value());} 7933e519524SHoward Hinnant 794848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 7953e519524SHoward Hinnant __map_iterator& operator++() {++__i_; return *this;} 796848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 7973e519524SHoward Hinnant __map_iterator operator++(int) 7983e519524SHoward Hinnant { 7993e519524SHoward Hinnant __map_iterator __t(*this); 8003e519524SHoward Hinnant ++(*this); 8013e519524SHoward Hinnant return __t; 8023e519524SHoward Hinnant } 8033e519524SHoward Hinnant 804848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 8053e519524SHoward Hinnant __map_iterator& operator--() {--__i_; return *this;} 806848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 8073e519524SHoward Hinnant __map_iterator operator--(int) 8083e519524SHoward Hinnant { 8093e519524SHoward Hinnant __map_iterator __t(*this); 8103e519524SHoward Hinnant --(*this); 8113e519524SHoward Hinnant return __t; 8123e519524SHoward Hinnant } 8133e519524SHoward Hinnant 814848a5374SHoward Hinnant friend _LIBCPP_INLINE_VISIBILITY 815848a5374SHoward Hinnant bool operator==(const __map_iterator& __x, const __map_iterator& __y) 8163e519524SHoward Hinnant {return __x.__i_ == __y.__i_;} 817848a5374SHoward Hinnant friend 818848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 819848a5374SHoward Hinnant bool operator!=(const __map_iterator& __x, const __map_iterator& __y) 8203e519524SHoward Hinnant {return __x.__i_ != __y.__i_;} 8213e519524SHoward Hinnant 822e2f2d1edSEric Fiselier template <class, class, class, class> friend class _LIBCPP_TEMPLATE_VIS map; 823e2f2d1edSEric Fiselier template <class, class, class, class> friend class _LIBCPP_TEMPLATE_VIS multimap; 824e2f2d1edSEric Fiselier template <class> friend class _LIBCPP_TEMPLATE_VIS __map_const_iterator; 8253e519524SHoward Hinnant}; 8263e519524SHoward Hinnant 8273e519524SHoward Hinnanttemplate <class _TreeIterator> 828e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS __map_const_iterator 8293e519524SHoward Hinnant{ 830089a7cc5SEric Fiselier typedef typename _TreeIterator::_NodeTypes _NodeTypes; 831089a7cc5SEric Fiselier typedef typename _TreeIterator::__pointer_traits __pointer_traits; 832089a7cc5SEric Fiselier 8333e519524SHoward Hinnant _TreeIterator __i_; 8343e519524SHoward Hinnant 8353e519524SHoward Hinnantpublic: 8363e519524SHoward Hinnant typedef bidirectional_iterator_tag iterator_category; 837089a7cc5SEric Fiselier typedef typename _NodeTypes::__map_value_type value_type; 8383e519524SHoward Hinnant typedef typename _TreeIterator::difference_type difference_type; 8393e519524SHoward Hinnant typedef const value_type& reference; 840089a7cc5SEric Fiselier typedef typename _NodeTypes::__const_map_value_type_pointer pointer; 8413e519524SHoward Hinnant 842848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 8431052ee39SHoward Hinnant __map_const_iterator() _NOEXCEPT {} 8443e519524SHoward Hinnant 845848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 8461052ee39SHoward Hinnant __map_const_iterator(_TreeIterator __i) _NOEXCEPT : __i_(__i) {} 847848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 848b3be398cSEric Fiselier __map_const_iterator(__map_iterator< 849b3be398cSEric Fiselier typename _TreeIterator::__non_const_iterator> __i) _NOEXCEPT 8503e519524SHoward Hinnant : __i_(__i.__i_) {} 8513e519524SHoward Hinnant 852848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 853f52318b4SErik Pilkington reference operator*() const {return __i_->__get_value();} 854848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 855f52318b4SErik Pilkington pointer operator->() const {return pointer_traits<pointer>::pointer_to(__i_->__get_value());} 8563e519524SHoward Hinnant 857848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 8583e519524SHoward Hinnant __map_const_iterator& operator++() {++__i_; return *this;} 859848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 8603e519524SHoward Hinnant __map_const_iterator operator++(int) 8613e519524SHoward Hinnant { 8623e519524SHoward Hinnant __map_const_iterator __t(*this); 8633e519524SHoward Hinnant ++(*this); 8643e519524SHoward Hinnant return __t; 8653e519524SHoward Hinnant } 8663e519524SHoward Hinnant 867848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 8683e519524SHoward Hinnant __map_const_iterator& operator--() {--__i_; return *this;} 869848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 8703e519524SHoward Hinnant __map_const_iterator operator--(int) 8713e519524SHoward Hinnant { 8723e519524SHoward Hinnant __map_const_iterator __t(*this); 8733e519524SHoward Hinnant --(*this); 8743e519524SHoward Hinnant return __t; 8753e519524SHoward Hinnant } 8763e519524SHoward Hinnant 877848a5374SHoward Hinnant friend _LIBCPP_INLINE_VISIBILITY 878848a5374SHoward Hinnant bool operator==(const __map_const_iterator& __x, const __map_const_iterator& __y) 8793e519524SHoward Hinnant {return __x.__i_ == __y.__i_;} 880848a5374SHoward Hinnant friend _LIBCPP_INLINE_VISIBILITY 881848a5374SHoward Hinnant bool operator!=(const __map_const_iterator& __x, const __map_const_iterator& __y) 8823e519524SHoward Hinnant {return __x.__i_ != __y.__i_;} 8833e519524SHoward Hinnant 884e2f2d1edSEric Fiselier template <class, class, class, class> friend class _LIBCPP_TEMPLATE_VIS map; 885e2f2d1edSEric Fiselier template <class, class, class, class> friend class _LIBCPP_TEMPLATE_VIS multimap; 886e2f2d1edSEric Fiselier template <class, class, class> friend class _LIBCPP_TEMPLATE_VIS __tree_const_iterator; 8873e519524SHoward Hinnant}; 8883e519524SHoward Hinnant 8893e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare = less<_Key>, 8903e519524SHoward Hinnant class _Allocator = allocator<pair<const _Key, _Tp> > > 891e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS map 8923e519524SHoward Hinnant{ 8933e519524SHoward Hinnantpublic: 8943e519524SHoward Hinnant // types: 8953e519524SHoward Hinnant typedef _Key key_type; 8963e519524SHoward Hinnant typedef _Tp mapped_type; 8973e519524SHoward Hinnant typedef pair<const key_type, mapped_type> value_type; 8983e519524SHoward Hinnant typedef _Compare key_compare; 8993e519524SHoward Hinnant typedef _Allocator allocator_type; 9003e519524SHoward Hinnant typedef value_type& reference; 9013e519524SHoward Hinnant typedef const value_type& const_reference; 9023e519524SHoward Hinnant 90394f89aeeSMarshall Clow static_assert((is_same<typename allocator_type::value_type, value_type>::value), 90494f89aeeSMarshall Clow "Allocator::value_type must be same type as value_type"); 90594f89aeeSMarshall Clow 906e2f2d1edSEric Fiselier class _LIBCPP_TEMPLATE_VIS value_compare 9073e519524SHoward Hinnant : public binary_function<value_type, value_type, bool> 9083e519524SHoward Hinnant { 9093e519524SHoward Hinnant friend class map; 9103e519524SHoward Hinnant protected: 9113e519524SHoward Hinnant key_compare comp; 9123e519524SHoward Hinnant 913848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY value_compare(key_compare c) : comp(c) {} 9143e519524SHoward Hinnant public: 915848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 9163e519524SHoward Hinnant bool operator()(const value_type& __x, const value_type& __y) const 9173e519524SHoward Hinnant {return comp(__x.first, __y.first);} 9183e519524SHoward Hinnant }; 9193e519524SHoward Hinnant 9203e519524SHoward Hinnantprivate: 92107d3eccdSHoward Hinnant 9229fd9f84fSHoward Hinnant typedef _VSTD::__value_type<key_type, mapped_type> __value_type; 923abb160e6SHoward Hinnant typedef __map_value_compare<key_type, __value_type, key_compare> __vc; 9241f508014SMarshall Clow typedef typename __rebind_alloc_helper<allocator_traits<allocator_type>, 9251f508014SMarshall Clow __value_type>::type __allocator_type; 9263e519524SHoward Hinnant typedef __tree<__value_type, __vc, __allocator_type> __base; 9273e519524SHoward Hinnant typedef typename __base::__node_traits __node_traits; 9283e519524SHoward Hinnant typedef allocator_traits<allocator_type> __alloc_traits; 9293e519524SHoward Hinnant 9303e519524SHoward Hinnant __base __tree_; 9313e519524SHoward Hinnant 9323e519524SHoward Hinnantpublic: 9333e519524SHoward Hinnant typedef typename __alloc_traits::pointer pointer; 9343e519524SHoward Hinnant typedef typename __alloc_traits::const_pointer const_pointer; 9353e519524SHoward Hinnant typedef typename __alloc_traits::size_type size_type; 9363e519524SHoward Hinnant typedef typename __alloc_traits::difference_type difference_type; 9373e519524SHoward Hinnant typedef __map_iterator<typename __base::iterator> iterator; 9383e519524SHoward Hinnant typedef __map_const_iterator<typename __base::const_iterator> const_iterator; 939ce48a113SHoward Hinnant typedef _VSTD::reverse_iterator<iterator> reverse_iterator; 940ce48a113SHoward Hinnant typedef _VSTD::reverse_iterator<const_iterator> const_reverse_iterator; 9413e519524SHoward Hinnant 942b0386a51SErik Pilkington#if _LIBCPP_STD_VER > 14 943b0386a51SErik Pilkington typedef __map_node_handle<typename __base::__node, allocator_type> node_type; 944b0386a51SErik Pilkington typedef __insert_return_type<iterator, node_type> insert_return_type; 945b0386a51SErik Pilkington#endif 946b0386a51SErik Pilkington 947*5c4e07aeSErik Pilkington template <class _Key2, class _Value2, class _Comp2, class _Alloc2> 948*5c4e07aeSErik Pilkington friend class _LIBCPP_TEMPLATE_VIS map; 949*5c4e07aeSErik Pilkington template <class _Key2, class _Value2, class _Comp2, class _Alloc2> 950*5c4e07aeSErik Pilkington friend class _LIBCPP_TEMPLATE_VIS multimap; 951*5c4e07aeSErik Pilkington 952848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 953415a24e4SMarshall Clow map() 954415a24e4SMarshall Clow _NOEXCEPT_( 955415a24e4SMarshall Clow is_nothrow_default_constructible<allocator_type>::value && 956415a24e4SMarshall Clow is_nothrow_default_constructible<key_compare>::value && 957415a24e4SMarshall Clow is_nothrow_copy_constructible<key_compare>::value) 958415a24e4SMarshall Clow : __tree_(__vc(key_compare())) {} 959415a24e4SMarshall Clow 960415a24e4SMarshall Clow _LIBCPP_INLINE_VISIBILITY 961415a24e4SMarshall Clow explicit map(const key_compare& __comp) 9621052ee39SHoward Hinnant _NOEXCEPT_( 9631052ee39SHoward Hinnant is_nothrow_default_constructible<allocator_type>::value && 9641052ee39SHoward Hinnant is_nothrow_copy_constructible<key_compare>::value) 9653e519524SHoward Hinnant : __tree_(__vc(__comp)) {} 9663e519524SHoward Hinnant 967848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 9683e519524SHoward Hinnant explicit map(const key_compare& __comp, const allocator_type& __a) 9692a10c960SMarshall Clow : __tree_(__vc(__comp), typename __base::allocator_type(__a)) {} 9703e519524SHoward Hinnant 9713e519524SHoward Hinnant template <class _InputIterator> 972848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 9733e519524SHoward Hinnant map(_InputIterator __f, _InputIterator __l, 9743e519524SHoward Hinnant const key_compare& __comp = key_compare()) 9753e519524SHoward Hinnant : __tree_(__vc(__comp)) 9763e519524SHoward Hinnant { 9773e519524SHoward Hinnant insert(__f, __l); 9783e519524SHoward Hinnant } 9793e519524SHoward Hinnant 9803e519524SHoward Hinnant template <class _InputIterator> 981848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 9823e519524SHoward Hinnant map(_InputIterator __f, _InputIterator __l, 9833e519524SHoward Hinnant const key_compare& __comp, const allocator_type& __a) 9842a10c960SMarshall Clow : __tree_(__vc(__comp), typename __base::allocator_type(__a)) 9853e519524SHoward Hinnant { 9863e519524SHoward Hinnant insert(__f, __l); 9873e519524SHoward Hinnant } 9883e519524SHoward Hinnant 989fbc317d4SMarshall Clow#if _LIBCPP_STD_VER > 11 990fbc317d4SMarshall Clow template <class _InputIterator> 991fbc317d4SMarshall Clow _LIBCPP_INLINE_VISIBILITY 992fbc317d4SMarshall Clow map(_InputIterator __f, _InputIterator __l, const allocator_type& __a) 993fbc317d4SMarshall Clow : map(__f, __l, key_compare(), __a) {} 994fbc317d4SMarshall Clow#endif 995fbc317d4SMarshall Clow 996848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 9973e519524SHoward Hinnant map(const map& __m) 9983e519524SHoward Hinnant : __tree_(__m.__tree_) 9993e519524SHoward Hinnant { 10003e519524SHoward Hinnant insert(__m.begin(), __m.end()); 10013e519524SHoward Hinnant } 10023e519524SHoward Hinnant 10035a33687dSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 10045a33687dSHoward Hinnant map& operator=(const map& __m) 10055a33687dSHoward Hinnant { 10062ee83725SMarshall Clow#ifndef _LIBCPP_CXX03_LANG 10075a33687dSHoward Hinnant __tree_ = __m.__tree_; 100807d3eccdSHoward Hinnant#else 100974cf6ff5SMarshall Clow if (this != &__m) { 101007d3eccdSHoward Hinnant __tree_.clear(); 101107d3eccdSHoward Hinnant __tree_.value_comp() = __m.__tree_.value_comp(); 101207d3eccdSHoward Hinnant __tree_.__copy_assign_alloc(__m.__tree_); 101307d3eccdSHoward Hinnant insert(__m.begin(), __m.end()); 101474cf6ff5SMarshall Clow } 101507d3eccdSHoward Hinnant#endif 10165a33687dSHoward Hinnant return *this; 10175a33687dSHoward Hinnant } 10185a33687dSHoward Hinnant 101918293116SEric Fiselier#ifndef _LIBCPP_CXX03_LANG 10203e519524SHoward Hinnant 1021848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 10223e519524SHoward Hinnant map(map&& __m) 10231052ee39SHoward Hinnant _NOEXCEPT_(is_nothrow_move_constructible<__base>::value) 1024ce48a113SHoward Hinnant : __tree_(_VSTD::move(__m.__tree_)) 10253e519524SHoward Hinnant { 10263e519524SHoward Hinnant } 10273e519524SHoward Hinnant 10283e519524SHoward Hinnant map(map&& __m, const allocator_type& __a); 10293e519524SHoward Hinnant 1030848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 103154976f26SHoward Hinnant map& operator=(map&& __m) 103254976f26SHoward Hinnant _NOEXCEPT_(is_nothrow_move_assignable<__base>::value) 103354976f26SHoward Hinnant { 103454976f26SHoward Hinnant __tree_ = _VSTD::move(__m.__tree_); 103554976f26SHoward Hinnant return *this; 103654976f26SHoward Hinnant } 103754976f26SHoward Hinnant 103854976f26SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 10393e519524SHoward Hinnant map(initializer_list<value_type> __il, const key_compare& __comp = key_compare()) 10403e519524SHoward Hinnant : __tree_(__vc(__comp)) 10413e519524SHoward Hinnant { 10423e519524SHoward Hinnant insert(__il.begin(), __il.end()); 10433e519524SHoward Hinnant } 10443e519524SHoward Hinnant 1045848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 10463e519524SHoward Hinnant map(initializer_list<value_type> __il, const key_compare& __comp, const allocator_type& __a) 10472a10c960SMarshall Clow : __tree_(__vc(__comp), typename __base::allocator_type(__a)) 10483e519524SHoward Hinnant { 10493e519524SHoward Hinnant insert(__il.begin(), __il.end()); 10503e519524SHoward Hinnant } 10513e519524SHoward Hinnant 1052fbc317d4SMarshall Clow#if _LIBCPP_STD_VER > 11 1053fbc317d4SMarshall Clow _LIBCPP_INLINE_VISIBILITY 1054fbc317d4SMarshall Clow map(initializer_list<value_type> __il, const allocator_type& __a) 1055fbc317d4SMarshall Clow : map(__il, key_compare(), __a) {} 1056fbc317d4SMarshall Clow#endif 1057fbc317d4SMarshall Clow 1058848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 10593e519524SHoward Hinnant map& operator=(initializer_list<value_type> __il) 10603e519524SHoward Hinnant { 10613e519524SHoward Hinnant __tree_.__assign_unique(__il.begin(), __il.end()); 10623e519524SHoward Hinnant return *this; 10633e519524SHoward Hinnant } 10643e519524SHoward Hinnant 106518293116SEric Fiselier#endif // _LIBCPP_CXX03_LANG 10663e519524SHoward Hinnant 1067848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 10683e519524SHoward Hinnant explicit map(const allocator_type& __a) 10692a10c960SMarshall Clow : __tree_(typename __base::allocator_type(__a)) 10703e519524SHoward Hinnant { 10713e519524SHoward Hinnant } 10723e519524SHoward Hinnant 1073848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 10743e519524SHoward Hinnant map(const map& __m, const allocator_type& __a) 10752a10c960SMarshall Clow : __tree_(__m.__tree_.value_comp(), typename __base::allocator_type(__a)) 10763e519524SHoward Hinnant { 10773e519524SHoward Hinnant insert(__m.begin(), __m.end()); 10783e519524SHoward Hinnant } 10793e519524SHoward Hinnant 1080848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 10811052ee39SHoward Hinnant iterator begin() _NOEXCEPT {return __tree_.begin();} 1082848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 10831052ee39SHoward Hinnant const_iterator begin() const _NOEXCEPT {return __tree_.begin();} 1084848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 10851052ee39SHoward Hinnant iterator end() _NOEXCEPT {return __tree_.end();} 1086848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 10871052ee39SHoward Hinnant const_iterator end() const _NOEXCEPT {return __tree_.end();} 10883e519524SHoward Hinnant 1089848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 10901052ee39SHoward Hinnant reverse_iterator rbegin() _NOEXCEPT {return reverse_iterator(end());} 1091848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 10921052ee39SHoward Hinnant const_reverse_iterator rbegin() const _NOEXCEPT 10931052ee39SHoward Hinnant {return const_reverse_iterator(end());} 1094848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 10951052ee39SHoward Hinnant reverse_iterator rend() _NOEXCEPT 10961052ee39SHoward Hinnant {return reverse_iterator(begin());} 1097848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 10981052ee39SHoward Hinnant const_reverse_iterator rend() const _NOEXCEPT 10991052ee39SHoward Hinnant {return const_reverse_iterator(begin());} 11003e519524SHoward Hinnant 1101848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 11021052ee39SHoward Hinnant const_iterator cbegin() const _NOEXCEPT {return begin();} 1103848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 11041052ee39SHoward Hinnant const_iterator cend() const _NOEXCEPT {return end();} 1105848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 11061052ee39SHoward Hinnant const_reverse_iterator crbegin() const _NOEXCEPT {return rbegin();} 1107848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 11081052ee39SHoward Hinnant const_reverse_iterator crend() const _NOEXCEPT {return rend();} 11093e519524SHoward Hinnant 111072c8fad4SMarshall Clow _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY 11111052ee39SHoward Hinnant bool empty() const _NOEXCEPT {return __tree_.size() == 0;} 1112848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 11131052ee39SHoward Hinnant size_type size() const _NOEXCEPT {return __tree_.size();} 1114848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 11151052ee39SHoward Hinnant size_type max_size() const _NOEXCEPT {return __tree_.max_size();} 11163e519524SHoward Hinnant 11173e519524SHoward Hinnant mapped_type& operator[](const key_type& __k); 111854f0cda6SEric Fiselier#ifndef _LIBCPP_CXX03_LANG 11193e519524SHoward Hinnant mapped_type& operator[](key_type&& __k); 11203e519524SHoward Hinnant#endif 11213e519524SHoward Hinnant 11223e519524SHoward Hinnant mapped_type& at(const key_type& __k); 11233e519524SHoward Hinnant const mapped_type& at(const key_type& __k) const; 11243e519524SHoward Hinnant 1125848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 11262a10c960SMarshall Clow allocator_type get_allocator() const _NOEXCEPT {return allocator_type(__tree_.__alloc());} 1127848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 11283e519524SHoward Hinnant key_compare key_comp() const {return __tree_.value_comp().key_comp();} 1129848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 11303e519524SHoward Hinnant value_compare value_comp() const {return value_compare(__tree_.value_comp().key_comp());} 11313e519524SHoward Hinnant 11325e3ea4ddSEric Fiselier#ifndef _LIBCPP_CXX03_LANG 11335e3ea4ddSEric Fiselier template <class ..._Args> 11345e3ea4ddSEric Fiselier _LIBCPP_INLINE_VISIBILITY 11355e3ea4ddSEric Fiselier pair<iterator, bool> emplace(_Args&& ...__args) { 11365e3ea4ddSEric Fiselier return __tree_.__emplace_unique(_VSTD::forward<_Args>(__args)...); 11375e3ea4ddSEric Fiselier } 11387609c9b6SHoward Hinnant 11398b805c91SHoward Hinnant template <class ..._Args> 11405e3ea4ddSEric Fiselier _LIBCPP_INLINE_VISIBILITY 11415e3ea4ddSEric Fiselier iterator emplace_hint(const_iterator __p, _Args&& ...__args) { 11425e3ea4ddSEric Fiselier return __tree_.__emplace_hint_unique(__p.__i_, _VSTD::forward<_Args>(__args)...); 11435e3ea4ddSEric Fiselier } 11447609c9b6SHoward Hinnant 1145c003db1fSHoward Hinnant template <class _Pp, 1146c003db1fSHoward Hinnant class = typename enable_if<is_constructible<value_type, _Pp>::value>::type> 1147848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 1148c003db1fSHoward Hinnant pair<iterator, bool> insert(_Pp&& __p) 1149c003db1fSHoward Hinnant {return __tree_.__insert_unique(_VSTD::forward<_Pp>(__p));} 11503e519524SHoward Hinnant 1151c003db1fSHoward Hinnant template <class _Pp, 1152c003db1fSHoward Hinnant class = typename enable_if<is_constructible<value_type, _Pp>::value>::type> 1153848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 1154c003db1fSHoward Hinnant iterator insert(const_iterator __pos, _Pp&& __p) 1155c003db1fSHoward Hinnant {return __tree_.__insert_unique(__pos.__i_, _VSTD::forward<_Pp>(__p));} 11563e519524SHoward Hinnant 11575e3ea4ddSEric Fiselier#endif // _LIBCPP_CXX03_LANG 11583e519524SHoward Hinnant 1159848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 11603e519524SHoward Hinnant pair<iterator, bool> 11613e519524SHoward Hinnant insert(const value_type& __v) {return __tree_.__insert_unique(__v);} 11623e519524SHoward Hinnant 1163848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 11643e519524SHoward Hinnant iterator 11653e519524SHoward Hinnant insert(const_iterator __p, const value_type& __v) 11663e519524SHoward Hinnant {return __tree_.__insert_unique(__p.__i_, __v);} 11673e519524SHoward Hinnant 11687a9f500fSEric Fiselier#ifndef _LIBCPP_CXX03_LANG 1169afc9ff99SMarshall Clow _LIBCPP_INLINE_VISIBILITY 1170afc9ff99SMarshall Clow pair<iterator, bool> 11715e3ea4ddSEric Fiselier insert(value_type&& __v) {return __tree_.__insert_unique(_VSTD::move(__v));} 1172afc9ff99SMarshall Clow 1173afc9ff99SMarshall Clow _LIBCPP_INLINE_VISIBILITY 11745e3ea4ddSEric Fiselier iterator insert(const_iterator __p, value_type&& __v) 11755e3ea4ddSEric Fiselier {return __tree_.__insert_unique(__p.__i_, _VSTD::move(__v));} 117618293116SEric Fiselier 117718293116SEric Fiselier _LIBCPP_INLINE_VISIBILITY 117818293116SEric Fiselier void insert(initializer_list<value_type> __il) 117918293116SEric Fiselier {insert(__il.begin(), __il.end());} 1180afc9ff99SMarshall Clow#endif 1181afc9ff99SMarshall Clow 11823e519524SHoward Hinnant template <class _InputIterator> 1183848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 11843e519524SHoward Hinnant void insert(_InputIterator __f, _InputIterator __l) 11853e519524SHoward Hinnant { 11863e519524SHoward Hinnant for (const_iterator __e = cend(); __f != __l; ++__f) 11873e519524SHoward Hinnant insert(__e.__i_, *__f); 11883e519524SHoward Hinnant } 11893e519524SHoward Hinnant 11908aaf517dSMarshall Clow#if _LIBCPP_STD_VER > 14 119154f0cda6SEric Fiselier 11928aaf517dSMarshall Clow template <class... _Args> 11938aaf517dSMarshall Clow _LIBCPP_INLINE_VISIBILITY 11948aaf517dSMarshall Clow pair<iterator, bool> try_emplace(const key_type& __k, _Args&&... __args) 11958aaf517dSMarshall Clow { 119654f0cda6SEric Fiselier return __tree_.__emplace_unique_key_args(__k, 119754f0cda6SEric Fiselier _VSTD::piecewise_construct, 119854f0cda6SEric Fiselier _VSTD::forward_as_tuple(__k), 119954f0cda6SEric Fiselier _VSTD::forward_as_tuple(_VSTD::forward<_Args>(__args)...)); 12008aaf517dSMarshall Clow } 12018aaf517dSMarshall Clow 12028aaf517dSMarshall Clow template <class... _Args> 12038aaf517dSMarshall Clow _LIBCPP_INLINE_VISIBILITY 12048aaf517dSMarshall Clow pair<iterator, bool> try_emplace(key_type&& __k, _Args&&... __args) 12058aaf517dSMarshall Clow { 120654f0cda6SEric Fiselier return __tree_.__emplace_unique_key_args(__k, 120754f0cda6SEric Fiselier _VSTD::piecewise_construct, 120854f0cda6SEric Fiselier _VSTD::forward_as_tuple(_VSTD::move(__k)), 120954f0cda6SEric Fiselier _VSTD::forward_as_tuple(_VSTD::forward<_Args>(__args)...)); 12108aaf517dSMarshall Clow } 12118aaf517dSMarshall Clow 12128aaf517dSMarshall Clow template <class... _Args> 12138aaf517dSMarshall Clow _LIBCPP_INLINE_VISIBILITY 12148aaf517dSMarshall Clow iterator try_emplace(const_iterator __h, const key_type& __k, _Args&&... __args) 12158aaf517dSMarshall Clow { 121654f0cda6SEric Fiselier return __tree_.__emplace_hint_unique_key_args(__h.__i_, __k, 121754f0cda6SEric Fiselier _VSTD::piecewise_construct, 121854f0cda6SEric Fiselier _VSTD::forward_as_tuple(__k), 12198aaf517dSMarshall Clow _VSTD::forward_as_tuple(_VSTD::forward<_Args>(__args)...)); 12208aaf517dSMarshall Clow } 12218aaf517dSMarshall Clow 12228aaf517dSMarshall Clow template <class... _Args> 12238aaf517dSMarshall Clow _LIBCPP_INLINE_VISIBILITY 12248aaf517dSMarshall Clow iterator try_emplace(const_iterator __h, key_type&& __k, _Args&&... __args) 12258aaf517dSMarshall Clow { 122654f0cda6SEric Fiselier return __tree_.__emplace_hint_unique_key_args(__h.__i_, __k, 122754f0cda6SEric Fiselier _VSTD::piecewise_construct, 122854f0cda6SEric Fiselier _VSTD::forward_as_tuple(_VSTD::move(__k)), 12298aaf517dSMarshall Clow _VSTD::forward_as_tuple(_VSTD::forward<_Args>(__args)...)); 12308aaf517dSMarshall Clow } 12318aaf517dSMarshall Clow 12328aaf517dSMarshall Clow template <class _Vp> 12338aaf517dSMarshall Clow _LIBCPP_INLINE_VISIBILITY 12348aaf517dSMarshall Clow pair<iterator, bool> insert_or_assign(const key_type& __k, _Vp&& __v) 12358aaf517dSMarshall Clow { 12368aaf517dSMarshall Clow iterator __p = lower_bound(__k); 12378aaf517dSMarshall Clow if ( __p != end() && !key_comp()(__k, __p->first)) 12388aaf517dSMarshall Clow { 12398aaf517dSMarshall Clow __p->second = _VSTD::forward<_Vp>(__v); 12408aaf517dSMarshall Clow return _VSTD::make_pair(__p, false); 12418aaf517dSMarshall Clow } 12428aaf517dSMarshall Clow return _VSTD::make_pair(emplace_hint(__p, __k, _VSTD::forward<_Vp>(__v)), true); 12438aaf517dSMarshall Clow } 12448aaf517dSMarshall Clow 12458aaf517dSMarshall Clow template <class _Vp> 12468aaf517dSMarshall Clow _LIBCPP_INLINE_VISIBILITY 12478aaf517dSMarshall Clow pair<iterator, bool> insert_or_assign(key_type&& __k, _Vp&& __v) 12488aaf517dSMarshall Clow { 12498aaf517dSMarshall Clow iterator __p = lower_bound(__k); 12508aaf517dSMarshall Clow if ( __p != end() && !key_comp()(__k, __p->first)) 12518aaf517dSMarshall Clow { 12528aaf517dSMarshall Clow __p->second = _VSTD::forward<_Vp>(__v); 12538aaf517dSMarshall Clow return _VSTD::make_pair(__p, false); 12548aaf517dSMarshall Clow } 12558aaf517dSMarshall Clow return _VSTD::make_pair(emplace_hint(__p, _VSTD::move(__k), _VSTD::forward<_Vp>(__v)), true); 12568aaf517dSMarshall Clow } 12578aaf517dSMarshall Clow 12588aaf517dSMarshall Clow template <class _Vp> 12598aaf517dSMarshall Clow _LIBCPP_INLINE_VISIBILITY 12608aaf517dSMarshall Clow iterator insert_or_assign(const_iterator __h, const key_type& __k, _Vp&& __v) 12618aaf517dSMarshall Clow { 12628aaf517dSMarshall Clow iterator __p = lower_bound(__k); 12638aaf517dSMarshall Clow if ( __p != end() && !key_comp()(__k, __p->first)) 12648aaf517dSMarshall Clow { 12658aaf517dSMarshall Clow __p->second = _VSTD::forward<_Vp>(__v); 12668aaf517dSMarshall Clow return __p; 12678aaf517dSMarshall Clow } 12688aaf517dSMarshall Clow return emplace_hint(__h, __k, _VSTD::forward<_Vp>(__v)); 12698aaf517dSMarshall Clow } 12708aaf517dSMarshall Clow 12718aaf517dSMarshall Clow template <class _Vp> 12728aaf517dSMarshall Clow _LIBCPP_INLINE_VISIBILITY 12738aaf517dSMarshall Clow iterator insert_or_assign(const_iterator __h, key_type&& __k, _Vp&& __v) 12748aaf517dSMarshall Clow { 12758aaf517dSMarshall Clow iterator __p = lower_bound(__k); 12768aaf517dSMarshall Clow if ( __p != end() && !key_comp()(__k, __p->first)) 12778aaf517dSMarshall Clow { 12788aaf517dSMarshall Clow __p->second = _VSTD::forward<_Vp>(__v); 12798aaf517dSMarshall Clow return __p; 12808aaf517dSMarshall Clow } 12818aaf517dSMarshall Clow return emplace_hint(__h, _VSTD::move(__k), _VSTD::forward<_Vp>(__v)); 12828aaf517dSMarshall Clow } 128354f0cda6SEric Fiselier 128418293116SEric Fiselier#endif // _LIBCPP_STD_VER > 14 12858aaf517dSMarshall Clow 1286848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 12873e519524SHoward Hinnant iterator erase(const_iterator __p) {return __tree_.erase(__p.__i_);} 1288848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 1289ec392968SMarshall Clow iterator erase(iterator __p) {return __tree_.erase(__p.__i_);} 1290ec392968SMarshall Clow _LIBCPP_INLINE_VISIBILITY 12913e519524SHoward Hinnant size_type erase(const key_type& __k) 12923e519524SHoward Hinnant {return __tree_.__erase_unique(__k);} 1293848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 12943e519524SHoward Hinnant iterator erase(const_iterator __f, const_iterator __l) 12953e519524SHoward Hinnant {return __tree_.erase(__f.__i_, __l.__i_);} 1296848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 12971052ee39SHoward Hinnant void clear() _NOEXCEPT {__tree_.clear();} 12983e519524SHoward Hinnant 1299b0386a51SErik Pilkington#if _LIBCPP_STD_VER > 14 1300b0386a51SErik Pilkington _LIBCPP_INLINE_VISIBILITY 1301b0386a51SErik Pilkington insert_return_type 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 map::insert()"); 1305b0386a51SErik Pilkington return __tree_.template __node_handle_insert_unique< 1306b0386a51SErik Pilkington node_type, insert_return_type>(_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 map::insert()"); 1313b0386a51SErik Pilkington return __tree_.template __node_handle_insert_unique<node_type>( 1314b0386a51SErik Pilkington __hint.__i_, _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.__i_); 1325b0386a51SErik Pilkington } 1326*5c4e07aeSErik Pilkington template <class _C2> 1327*5c4e07aeSErik Pilkington _LIBCPP_INLINE_VISIBILITY 1328*5c4e07aeSErik Pilkington void merge(map<key_type, mapped_type, _C2, allocator_type>& __source) 1329*5c4e07aeSErik Pilkington { 1330*5c4e07aeSErik Pilkington _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(), 1331*5c4e07aeSErik Pilkington "merging container with incompatible allocator"); 1332*5c4e07aeSErik Pilkington __tree_.__node_handle_merge_unique(__source.__tree_); 1333*5c4e07aeSErik Pilkington } 1334*5c4e07aeSErik Pilkington template <class _C2> 1335*5c4e07aeSErik Pilkington _LIBCPP_INLINE_VISIBILITY 1336*5c4e07aeSErik Pilkington void merge(map<key_type, mapped_type, _C2, allocator_type>&& __source) 1337*5c4e07aeSErik Pilkington { 1338*5c4e07aeSErik Pilkington _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(), 1339*5c4e07aeSErik Pilkington "merging container with incompatible allocator"); 1340*5c4e07aeSErik Pilkington __tree_.__node_handle_merge_unique(__source.__tree_); 1341*5c4e07aeSErik Pilkington } 1342*5c4e07aeSErik Pilkington template <class _C2> 1343*5c4e07aeSErik Pilkington _LIBCPP_INLINE_VISIBILITY 1344*5c4e07aeSErik Pilkington void merge(multimap<key_type, mapped_type, _C2, allocator_type>& __source) 1345*5c4e07aeSErik Pilkington { 1346*5c4e07aeSErik Pilkington _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(), 1347*5c4e07aeSErik Pilkington "merging container with incompatible allocator"); 1348*5c4e07aeSErik Pilkington __tree_.__node_handle_merge_unique(__source.__tree_); 1349*5c4e07aeSErik Pilkington } 1350*5c4e07aeSErik Pilkington template <class _C2> 1351*5c4e07aeSErik Pilkington _LIBCPP_INLINE_VISIBILITY 1352*5c4e07aeSErik Pilkington void merge(multimap<key_type, mapped_type, _C2, allocator_type>&& __source) 1353*5c4e07aeSErik Pilkington { 1354*5c4e07aeSErik Pilkington _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(), 1355*5c4e07aeSErik Pilkington "merging container with incompatible allocator"); 1356*5c4e07aeSErik Pilkington __tree_.__node_handle_merge_unique(__source.__tree_); 1357*5c4e07aeSErik Pilkington } 1358b0386a51SErik Pilkington#endif 1359b0386a51SErik Pilkington 1360848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 13611052ee39SHoward Hinnant void swap(map& __m) 13621052ee39SHoward Hinnant _NOEXCEPT_(__is_nothrow_swappable<__base>::value) 13631052ee39SHoward Hinnant {__tree_.swap(__m.__tree_);} 13643e519524SHoward Hinnant 1365848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 13663e519524SHoward Hinnant iterator find(const key_type& __k) {return __tree_.find(__k);} 1367848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 13683e519524SHoward Hinnant const_iterator find(const key_type& __k) const {return __tree_.find(__k);} 13692585835cSMarshall Clow#if _LIBCPP_STD_VER > 11 13702585835cSMarshall Clow template <typename _K2> 13712585835cSMarshall Clow _LIBCPP_INLINE_VISIBILITY 13722585835cSMarshall Clow typename enable_if<__is_transparent<_Compare, _K2>::value,iterator>::type 13732585835cSMarshall Clow find(const _K2& __k) {return __tree_.find(__k);} 13742585835cSMarshall Clow template <typename _K2> 13752585835cSMarshall Clow _LIBCPP_INLINE_VISIBILITY 13762585835cSMarshall Clow typename enable_if<__is_transparent<_Compare, _K2>::value,const_iterator>::type 13772585835cSMarshall Clow find(const _K2& __k) const {return __tree_.find(__k);} 13782585835cSMarshall Clow#endif 13792585835cSMarshall Clow 1380848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 13813e519524SHoward Hinnant size_type count(const key_type& __k) const 13823e519524SHoward Hinnant {return __tree_.__count_unique(__k);} 13830aacbc92SMarshall Clow#if _LIBCPP_STD_VER > 11 13840aacbc92SMarshall Clow template <typename _K2> 13850aacbc92SMarshall Clow _LIBCPP_INLINE_VISIBILITY 13860aacbc92SMarshall Clow typename enable_if<__is_transparent<_Compare, _K2>::value,size_type>::type 13879bfdb770SEric Fiselier count(const _K2& __k) const {return __tree_.__count_multi(__k);} 13880aacbc92SMarshall Clow#endif 1389848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 13903e519524SHoward Hinnant iterator lower_bound(const key_type& __k) 13913e519524SHoward Hinnant {return __tree_.lower_bound(__k);} 1392848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 13933e519524SHoward Hinnant const_iterator lower_bound(const key_type& __k) const 13943e519524SHoward Hinnant {return __tree_.lower_bound(__k);} 13952585835cSMarshall Clow#if _LIBCPP_STD_VER > 11 13962585835cSMarshall Clow template <typename _K2> 13972585835cSMarshall Clow _LIBCPP_INLINE_VISIBILITY 13982585835cSMarshall Clow typename enable_if<__is_transparent<_Compare, _K2>::value,iterator>::type 13992585835cSMarshall Clow lower_bound(const _K2& __k) {return __tree_.lower_bound(__k);} 14002585835cSMarshall Clow 14012585835cSMarshall Clow template <typename _K2> 14022585835cSMarshall Clow _LIBCPP_INLINE_VISIBILITY 14032585835cSMarshall Clow typename enable_if<__is_transparent<_Compare, _K2>::value,const_iterator>::type 14042585835cSMarshall Clow lower_bound(const _K2& __k) const {return __tree_.lower_bound(__k);} 14052585835cSMarshall Clow#endif 14062585835cSMarshall Clow 1407848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 14083e519524SHoward Hinnant iterator upper_bound(const key_type& __k) 14093e519524SHoward Hinnant {return __tree_.upper_bound(__k);} 1410848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 14113e519524SHoward Hinnant const_iterator upper_bound(const key_type& __k) const 14123e519524SHoward Hinnant {return __tree_.upper_bound(__k);} 14132585835cSMarshall Clow#if _LIBCPP_STD_VER > 11 14142585835cSMarshall Clow template <typename _K2> 14152585835cSMarshall Clow _LIBCPP_INLINE_VISIBILITY 14162585835cSMarshall Clow typename enable_if<__is_transparent<_Compare, _K2>::value,iterator>::type 14172585835cSMarshall Clow upper_bound(const _K2& __k) {return __tree_.upper_bound(__k);} 14182585835cSMarshall Clow template <typename _K2> 14192585835cSMarshall Clow _LIBCPP_INLINE_VISIBILITY 14202585835cSMarshall Clow typename enable_if<__is_transparent<_Compare, _K2>::value,const_iterator>::type 14212585835cSMarshall Clow upper_bound(const _K2& __k) const {return __tree_.upper_bound(__k);} 14222585835cSMarshall Clow#endif 14232585835cSMarshall Clow 1424848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 14253e519524SHoward Hinnant pair<iterator,iterator> equal_range(const key_type& __k) 14263e519524SHoward Hinnant {return __tree_.__equal_range_unique(__k);} 1427848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 14283e519524SHoward Hinnant pair<const_iterator,const_iterator> equal_range(const key_type& __k) const 14293e519524SHoward Hinnant {return __tree_.__equal_range_unique(__k);} 14302585835cSMarshall Clow#if _LIBCPP_STD_VER > 11 14312585835cSMarshall Clow template <typename _K2> 14322585835cSMarshall Clow _LIBCPP_INLINE_VISIBILITY 14332585835cSMarshall Clow typename enable_if<__is_transparent<_Compare, _K2>::value,pair<iterator,iterator>>::type 14349bfdb770SEric Fiselier equal_range(const _K2& __k) {return __tree_.__equal_range_multi(__k);} 14352585835cSMarshall Clow template <typename _K2> 14362585835cSMarshall Clow _LIBCPP_INLINE_VISIBILITY 14372585835cSMarshall Clow typename enable_if<__is_transparent<_Compare, _K2>::value,pair<const_iterator,const_iterator>>::type 14389bfdb770SEric Fiselier equal_range(const _K2& __k) const {return __tree_.__equal_range_multi(__k);} 14392585835cSMarshall Clow#endif 14403e519524SHoward Hinnant 14413e519524SHoward Hinnantprivate: 14423e519524SHoward Hinnant typedef typename __base::__node __node; 14433e519524SHoward Hinnant typedef typename __base::__node_allocator __node_allocator; 14443e519524SHoward Hinnant typedef typename __base::__node_pointer __node_pointer; 14453e519524SHoward Hinnant typedef typename __base::__node_base_pointer __node_base_pointer; 1446cb5cbc8bSEric Fiselier typedef typename __base::__parent_pointer __parent_pointer; 14470594ad71SEric Fiselier 1448c003db1fSHoward Hinnant typedef __map_node_destructor<__node_allocator> _Dp; 1449c003db1fSHoward Hinnant typedef unique_ptr<__node, _Dp> __node_holder; 14503e519524SHoward Hinnant 145154f0cda6SEric Fiselier#ifdef _LIBCPP_CXX03_LANG 14524a95f9ebSHoward Hinnant __node_holder __construct_node_with_key(const key_type& __k); 145354f0cda6SEric Fiselier#endif 14543e519524SHoward Hinnant}; 14553e519524SHoward Hinnant 14560594ad71SEric Fiselier 14575e3ea4ddSEric Fiselier#ifndef _LIBCPP_CXX03_LANG 14583e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 14593e519524SHoward Hinnantmap<_Key, _Tp, _Compare, _Allocator>::map(map&& __m, const allocator_type& __a) 14602a10c960SMarshall Clow : __tree_(_VSTD::move(__m.__tree_), typename __base::allocator_type(__a)) 14613e519524SHoward Hinnant{ 14623e519524SHoward Hinnant if (__a != __m.get_allocator()) 14633e519524SHoward Hinnant { 14643e519524SHoward Hinnant const_iterator __e = cend(); 14653e519524SHoward Hinnant while (!__m.empty()) 14663e519524SHoward Hinnant __tree_.__insert_unique(__e.__i_, 1467f52318b4SErik Pilkington __m.__tree_.remove(__m.begin().__i_)->__value_.__move()); 14683e519524SHoward Hinnant } 14693e519524SHoward Hinnant} 14703e519524SHoward Hinnant 147118293116SEric Fiseliertemplate <class _Key, class _Tp, class _Compare, class _Allocator> 147218293116SEric Fiselier_Tp& 147318293116SEric Fiseliermap<_Key, _Tp, _Compare, _Allocator>::operator[](const key_type& __k) 147418293116SEric Fiselier{ 147518293116SEric Fiselier return __tree_.__emplace_unique_key_args(__k, 147618293116SEric Fiselier _VSTD::piecewise_construct, 147718293116SEric Fiselier _VSTD::forward_as_tuple(__k), 1478f52318b4SErik Pilkington _VSTD::forward_as_tuple()).first->__get_value().second; 147918293116SEric Fiselier} 14803e519524SHoward Hinnant 148118293116SEric Fiseliertemplate <class _Key, class _Tp, class _Compare, class _Allocator> 148218293116SEric Fiselier_Tp& 148318293116SEric Fiseliermap<_Key, _Tp, _Compare, _Allocator>::operator[](key_type&& __k) 148418293116SEric Fiselier{ 148518293116SEric Fiselier return __tree_.__emplace_unique_key_args(__k, 148618293116SEric Fiselier _VSTD::piecewise_construct, 148718293116SEric Fiselier _VSTD::forward_as_tuple(_VSTD::move(__k)), 1488f52318b4SErik Pilkington _VSTD::forward_as_tuple()).first->__get_value().second; 148918293116SEric Fiselier} 149054f0cda6SEric Fiselier 149118293116SEric Fiselier#else // _LIBCPP_CXX03_LANG 149254f0cda6SEric Fiselier 14933e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 14943e519524SHoward Hinnanttypename map<_Key, _Tp, _Compare, _Allocator>::__node_holder 14954a95f9ebSHoward Hinnantmap<_Key, _Tp, _Compare, _Allocator>::__construct_node_with_key(const key_type& __k) 14963e519524SHoward Hinnant{ 14973e519524SHoward Hinnant __node_allocator& __na = __tree_.__node_alloc(); 1498c003db1fSHoward Hinnant __node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na)); 1499f52318b4SErik Pilkington __node_traits::construct(__na, _VSTD::addressof(__h->__value_.__get_value().first), __k); 15003e519524SHoward Hinnant __h.get_deleter().__first_constructed = true; 1501f52318b4SErik Pilkington __node_traits::construct(__na, _VSTD::addressof(__h->__value_.__get_value().second)); 15023e519524SHoward Hinnant __h.get_deleter().__second_constructed = true; 1503251c6291SDimitry Andric return _LIBCPP_EXPLICIT_MOVE(__h); // explicitly moved for C++03 15043e519524SHoward Hinnant} 15053e519524SHoward Hinnant 15063e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 15073e519524SHoward Hinnant_Tp& 15083e519524SHoward Hinnantmap<_Key, _Tp, _Compare, _Allocator>::operator[](const key_type& __k) 15093e519524SHoward Hinnant{ 1510cb5cbc8bSEric Fiselier __parent_pointer __parent; 1511cb5cbc8bSEric Fiselier __node_base_pointer& __child = __tree_.__find_equal(__parent, __k); 15123e519524SHoward Hinnant __node_pointer __r = static_cast<__node_pointer>(__child); 15133e519524SHoward Hinnant if (__child == nullptr) 15143e519524SHoward Hinnant { 15154a95f9ebSHoward Hinnant __node_holder __h = __construct_node_with_key(__k); 151607d3eccdSHoward Hinnant __tree_.__insert_node_at(__parent, __child, static_cast<__node_base_pointer>(__h.get())); 15173e519524SHoward Hinnant __r = __h.release(); 15183e519524SHoward Hinnant } 1519f52318b4SErik Pilkington return __r->__value_.__get_value().second; 15203e519524SHoward Hinnant} 15213e519524SHoward Hinnant 152218293116SEric Fiselier#endif // _LIBCPP_CXX03_LANG 15233e519524SHoward Hinnant 15243e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 15253e519524SHoward Hinnant_Tp& 15263e519524SHoward Hinnantmap<_Key, _Tp, _Compare, _Allocator>::at(const key_type& __k) 15273e519524SHoward Hinnant{ 1528cb5cbc8bSEric Fiselier __parent_pointer __parent; 1529cb5cbc8bSEric Fiselier __node_base_pointer& __child = __tree_.__find_equal(__parent, __k); 153054b409fdSHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 15313e519524SHoward Hinnant if (__child == nullptr) 15323e519524SHoward Hinnant throw out_of_range("map::at: key not found"); 1533b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS 1534f52318b4SErik Pilkington return static_cast<__node_pointer>(__child)->__value_.__get_value().second; 15353e519524SHoward Hinnant} 15363e519524SHoward Hinnant 15373e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 15383e519524SHoward Hinnantconst _Tp& 15393e519524SHoward Hinnantmap<_Key, _Tp, _Compare, _Allocator>::at(const key_type& __k) const 15403e519524SHoward Hinnant{ 1541cb5cbc8bSEric Fiselier __parent_pointer __parent; 1542cb5cbc8bSEric Fiselier __node_base_pointer __child = __tree_.__find_equal(__parent, __k); 154354b409fdSHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 15443e519524SHoward Hinnant if (__child == nullptr) 15453e519524SHoward Hinnant throw out_of_range("map::at: key not found"); 1546b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS 1547f52318b4SErik Pilkington return static_cast<__node_pointer>(__child)->__value_.__get_value().second; 15483e519524SHoward Hinnant} 15493e519524SHoward Hinnant 15503e519524SHoward Hinnant 15513e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 1552848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 15533e519524SHoward Hinnantbool 15543e519524SHoward Hinnantoperator==(const map<_Key, _Tp, _Compare, _Allocator>& __x, 15553e519524SHoward Hinnant const map<_Key, _Tp, _Compare, _Allocator>& __y) 15563e519524SHoward Hinnant{ 1557ce48a113SHoward Hinnant return __x.size() == __y.size() && _VSTD::equal(__x.begin(), __x.end(), __y.begin()); 15583e519524SHoward Hinnant} 15593e519524SHoward Hinnant 15603e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 1561848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 15623e519524SHoward Hinnantbool 15633e519524SHoward Hinnantoperator< (const map<_Key, _Tp, _Compare, _Allocator>& __x, 15643e519524SHoward Hinnant const map<_Key, _Tp, _Compare, _Allocator>& __y) 15653e519524SHoward Hinnant{ 1566ce48a113SHoward Hinnant return _VSTD::lexicographical_compare(__x.begin(), __x.end(), __y.begin(), __y.end()); 15673e519524SHoward Hinnant} 15683e519524SHoward Hinnant 15693e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 1570848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 15713e519524SHoward Hinnantbool 15723e519524SHoward Hinnantoperator!=(const map<_Key, _Tp, _Compare, _Allocator>& __x, 15733e519524SHoward Hinnant const map<_Key, _Tp, _Compare, _Allocator>& __y) 15743e519524SHoward Hinnant{ 15753e519524SHoward Hinnant return !(__x == __y); 15763e519524SHoward Hinnant} 15773e519524SHoward Hinnant 15783e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 1579848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 15803e519524SHoward Hinnantbool 15813e519524SHoward Hinnantoperator> (const map<_Key, _Tp, _Compare, _Allocator>& __x, 15823e519524SHoward Hinnant const map<_Key, _Tp, _Compare, _Allocator>& __y) 15833e519524SHoward Hinnant{ 15843e519524SHoward Hinnant return __y < __x; 15853e519524SHoward Hinnant} 15863e519524SHoward Hinnant 15873e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 1588848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 15893e519524SHoward Hinnantbool 15903e519524SHoward Hinnantoperator>=(const map<_Key, _Tp, _Compare, _Allocator>& __x, 15913e519524SHoward Hinnant const map<_Key, _Tp, _Compare, _Allocator>& __y) 15923e519524SHoward Hinnant{ 15933e519524SHoward Hinnant return !(__x < __y); 15943e519524SHoward Hinnant} 15953e519524SHoward Hinnant 15963e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 1597848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 15983e519524SHoward Hinnantbool 15993e519524SHoward Hinnantoperator<=(const map<_Key, _Tp, _Compare, _Allocator>& __x, 16003e519524SHoward Hinnant const map<_Key, _Tp, _Compare, _Allocator>& __y) 16013e519524SHoward Hinnant{ 16023e519524SHoward Hinnant return !(__y < __x); 16033e519524SHoward Hinnant} 16043e519524SHoward Hinnant 16053e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 1606848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 16073e519524SHoward Hinnantvoid 16083e519524SHoward Hinnantswap(map<_Key, _Tp, _Compare, _Allocator>& __x, 16093e519524SHoward Hinnant map<_Key, _Tp, _Compare, _Allocator>& __y) 16101052ee39SHoward Hinnant _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y))) 16113e519524SHoward Hinnant{ 16123e519524SHoward Hinnant __x.swap(__y); 16133e519524SHoward Hinnant} 16143e519524SHoward Hinnant 16153e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare = less<_Key>, 16163e519524SHoward Hinnant class _Allocator = allocator<pair<const _Key, _Tp> > > 1617e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS multimap 16183e519524SHoward Hinnant{ 16193e519524SHoward Hinnantpublic: 16203e519524SHoward Hinnant // types: 16213e519524SHoward Hinnant typedef _Key key_type; 16223e519524SHoward Hinnant typedef _Tp mapped_type; 16233e519524SHoward Hinnant typedef pair<const key_type, mapped_type> value_type; 16243e519524SHoward Hinnant typedef _Compare key_compare; 16253e519524SHoward Hinnant typedef _Allocator allocator_type; 16263e519524SHoward Hinnant typedef value_type& reference; 16273e519524SHoward Hinnant typedef const value_type& const_reference; 16283e519524SHoward Hinnant 162994f89aeeSMarshall Clow static_assert((is_same<typename allocator_type::value_type, value_type>::value), 163094f89aeeSMarshall Clow "Allocator::value_type must be same type as value_type"); 163194f89aeeSMarshall Clow 1632e2f2d1edSEric Fiselier class _LIBCPP_TEMPLATE_VIS value_compare 16333e519524SHoward Hinnant : public binary_function<value_type, value_type, bool> 16343e519524SHoward Hinnant { 16353e519524SHoward Hinnant friend class multimap; 16363e519524SHoward Hinnant protected: 16373e519524SHoward Hinnant key_compare comp; 16383e519524SHoward Hinnant 1639848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 16403e519524SHoward Hinnant value_compare(key_compare c) : comp(c) {} 16413e519524SHoward Hinnant public: 1642848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 16433e519524SHoward Hinnant bool operator()(const value_type& __x, const value_type& __y) const 16443e519524SHoward Hinnant {return comp(__x.first, __y.first);} 16453e519524SHoward Hinnant }; 16463e519524SHoward Hinnant 16473e519524SHoward Hinnantprivate: 164807d3eccdSHoward Hinnant 16499fd9f84fSHoward Hinnant typedef _VSTD::__value_type<key_type, mapped_type> __value_type; 1650abb160e6SHoward Hinnant typedef __map_value_compare<key_type, __value_type, key_compare> __vc; 16511f508014SMarshall Clow typedef typename __rebind_alloc_helper<allocator_traits<allocator_type>, 16521f508014SMarshall Clow __value_type>::type __allocator_type; 16533e519524SHoward Hinnant typedef __tree<__value_type, __vc, __allocator_type> __base; 16543e519524SHoward Hinnant typedef typename __base::__node_traits __node_traits; 16553e519524SHoward Hinnant typedef allocator_traits<allocator_type> __alloc_traits; 16563e519524SHoward Hinnant 16573e519524SHoward Hinnant __base __tree_; 16583e519524SHoward Hinnant 16593e519524SHoward Hinnantpublic: 16603e519524SHoward Hinnant typedef typename __alloc_traits::pointer pointer; 16613e519524SHoward Hinnant typedef typename __alloc_traits::const_pointer const_pointer; 16623e519524SHoward Hinnant typedef typename __alloc_traits::size_type size_type; 16633e519524SHoward Hinnant typedef typename __alloc_traits::difference_type difference_type; 16643e519524SHoward Hinnant typedef __map_iterator<typename __base::iterator> iterator; 16653e519524SHoward Hinnant typedef __map_const_iterator<typename __base::const_iterator> const_iterator; 1666ce48a113SHoward Hinnant typedef _VSTD::reverse_iterator<iterator> reverse_iterator; 1667ce48a113SHoward Hinnant typedef _VSTD::reverse_iterator<const_iterator> const_reverse_iterator; 16683e519524SHoward Hinnant 1669b0386a51SErik Pilkington#if _LIBCPP_STD_VER > 14 1670b0386a51SErik Pilkington typedef __map_node_handle<typename __base::__node, allocator_type> node_type; 1671b0386a51SErik Pilkington#endif 1672b0386a51SErik Pilkington 1673*5c4e07aeSErik Pilkington template <class _Key2, class _Value2, class _Comp2, class _Alloc2> 1674*5c4e07aeSErik Pilkington friend class _LIBCPP_TEMPLATE_VIS map; 1675*5c4e07aeSErik Pilkington template <class _Key2, class _Value2, class _Comp2, class _Alloc2> 1676*5c4e07aeSErik Pilkington friend class _LIBCPP_TEMPLATE_VIS multimap; 1677*5c4e07aeSErik Pilkington 1678848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 1679415a24e4SMarshall Clow multimap() 1680415a24e4SMarshall Clow _NOEXCEPT_( 1681415a24e4SMarshall Clow is_nothrow_default_constructible<allocator_type>::value && 1682415a24e4SMarshall Clow is_nothrow_default_constructible<key_compare>::value && 1683415a24e4SMarshall Clow is_nothrow_copy_constructible<key_compare>::value) 1684415a24e4SMarshall Clow : __tree_(__vc(key_compare())) {} 1685415a24e4SMarshall Clow 1686415a24e4SMarshall Clow _LIBCPP_INLINE_VISIBILITY 1687415a24e4SMarshall Clow explicit multimap(const key_compare& __comp) 16881052ee39SHoward Hinnant _NOEXCEPT_( 16891052ee39SHoward Hinnant is_nothrow_default_constructible<allocator_type>::value && 16901052ee39SHoward Hinnant is_nothrow_copy_constructible<key_compare>::value) 16913e519524SHoward Hinnant : __tree_(__vc(__comp)) {} 16923e519524SHoward Hinnant 1693848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 16943e519524SHoward Hinnant explicit multimap(const key_compare& __comp, const allocator_type& __a) 16952a10c960SMarshall Clow : __tree_(__vc(__comp), typename __base::allocator_type(__a)) {} 16963e519524SHoward Hinnant 16973e519524SHoward Hinnant template <class _InputIterator> 1698848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 16993e519524SHoward Hinnant multimap(_InputIterator __f, _InputIterator __l, 17003e519524SHoward Hinnant const key_compare& __comp = key_compare()) 17013e519524SHoward Hinnant : __tree_(__vc(__comp)) 17023e519524SHoward Hinnant { 17033e519524SHoward Hinnant insert(__f, __l); 17043e519524SHoward Hinnant } 17053e519524SHoward Hinnant 17063e519524SHoward Hinnant template <class _InputIterator> 1707848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 17083e519524SHoward Hinnant multimap(_InputIterator __f, _InputIterator __l, 17093e519524SHoward Hinnant const key_compare& __comp, const allocator_type& __a) 17102a10c960SMarshall Clow : __tree_(__vc(__comp), typename __base::allocator_type(__a)) 17113e519524SHoward Hinnant { 17123e519524SHoward Hinnant insert(__f, __l); 17133e519524SHoward Hinnant } 17143e519524SHoward Hinnant 1715fbc317d4SMarshall Clow#if _LIBCPP_STD_VER > 11 1716fbc317d4SMarshall Clow template <class _InputIterator> 1717fbc317d4SMarshall Clow _LIBCPP_INLINE_VISIBILITY 1718fbc317d4SMarshall Clow multimap(_InputIterator __f, _InputIterator __l, const allocator_type& __a) 1719fbc317d4SMarshall Clow : multimap(__f, __l, key_compare(), __a) {} 1720fbc317d4SMarshall Clow#endif 1721fbc317d4SMarshall Clow 1722848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 17233e519524SHoward Hinnant multimap(const multimap& __m) 17243e519524SHoward Hinnant : __tree_(__m.__tree_.value_comp(), 17253e519524SHoward Hinnant __alloc_traits::select_on_container_copy_construction(__m.__tree_.__alloc())) 17263e519524SHoward Hinnant { 17273e519524SHoward Hinnant insert(__m.begin(), __m.end()); 17283e519524SHoward Hinnant } 17293e519524SHoward Hinnant 17305a33687dSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 17315a33687dSHoward Hinnant multimap& operator=(const multimap& __m) 17325a33687dSHoward Hinnant { 17332ee83725SMarshall Clow#ifndef _LIBCPP_CXX03_LANG 17345a33687dSHoward Hinnant __tree_ = __m.__tree_; 173507d3eccdSHoward Hinnant#else 173674cf6ff5SMarshall Clow if (this != &__m) { 173707d3eccdSHoward Hinnant __tree_.clear(); 173807d3eccdSHoward Hinnant __tree_.value_comp() = __m.__tree_.value_comp(); 173907d3eccdSHoward Hinnant __tree_.__copy_assign_alloc(__m.__tree_); 174007d3eccdSHoward Hinnant insert(__m.begin(), __m.end()); 174174cf6ff5SMarshall Clow } 174207d3eccdSHoward Hinnant#endif 17435a33687dSHoward Hinnant return *this; 17445a33687dSHoward Hinnant } 17455a33687dSHoward Hinnant 174618293116SEric Fiselier#ifndef _LIBCPP_CXX03_LANG 17473e519524SHoward Hinnant 1748848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 17493e519524SHoward Hinnant multimap(multimap&& __m) 17501052ee39SHoward Hinnant _NOEXCEPT_(is_nothrow_move_constructible<__base>::value) 1751ce48a113SHoward Hinnant : __tree_(_VSTD::move(__m.__tree_)) 17523e519524SHoward Hinnant { 17533e519524SHoward Hinnant } 17543e519524SHoward Hinnant 17553e519524SHoward Hinnant multimap(multimap&& __m, const allocator_type& __a); 17563e519524SHoward Hinnant 1757848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 175854976f26SHoward Hinnant multimap& operator=(multimap&& __m) 175954976f26SHoward Hinnant _NOEXCEPT_(is_nothrow_move_assignable<__base>::value) 176054976f26SHoward Hinnant { 176154976f26SHoward Hinnant __tree_ = _VSTD::move(__m.__tree_); 176254976f26SHoward Hinnant return *this; 176354976f26SHoward Hinnant } 176454976f26SHoward Hinnant 176554976f26SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 17663e519524SHoward Hinnant multimap(initializer_list<value_type> __il, const key_compare& __comp = key_compare()) 17673e519524SHoward Hinnant : __tree_(__vc(__comp)) 17683e519524SHoward Hinnant { 17693e519524SHoward Hinnant insert(__il.begin(), __il.end()); 17703e519524SHoward Hinnant } 17713e519524SHoward Hinnant 1772848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 17733e519524SHoward Hinnant multimap(initializer_list<value_type> __il, const key_compare& __comp, const allocator_type& __a) 17742a10c960SMarshall Clow : __tree_(__vc(__comp), typename __base::allocator_type(__a)) 17753e519524SHoward Hinnant { 17763e519524SHoward Hinnant insert(__il.begin(), __il.end()); 17773e519524SHoward Hinnant } 17783e519524SHoward Hinnant 1779fbc317d4SMarshall Clow#if _LIBCPP_STD_VER > 11 1780fbc317d4SMarshall Clow _LIBCPP_INLINE_VISIBILITY 1781fbc317d4SMarshall Clow multimap(initializer_list<value_type> __il, const allocator_type& __a) 1782fbc317d4SMarshall Clow : multimap(__il, key_compare(), __a) {} 1783fbc317d4SMarshall Clow#endif 1784fbc317d4SMarshall Clow 1785848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 17863e519524SHoward Hinnant multimap& operator=(initializer_list<value_type> __il) 17873e519524SHoward Hinnant { 17883e519524SHoward Hinnant __tree_.__assign_multi(__il.begin(), __il.end()); 17893e519524SHoward Hinnant return *this; 17903e519524SHoward Hinnant } 179154976f26SHoward Hinnant 179218293116SEric Fiselier#endif // _LIBCPP_CXX03_LANG 17933e519524SHoward Hinnant 1794848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 17953e519524SHoward Hinnant explicit multimap(const allocator_type& __a) 17962a10c960SMarshall Clow : __tree_(typename __base::allocator_type(__a)) 17973e519524SHoward Hinnant { 17983e519524SHoward Hinnant } 17993e519524SHoward Hinnant 1800848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 18013e519524SHoward Hinnant multimap(const multimap& __m, const allocator_type& __a) 18022a10c960SMarshall Clow : __tree_(__m.__tree_.value_comp(), typename __base::allocator_type(__a)) 18033e519524SHoward Hinnant { 18043e519524SHoward Hinnant insert(__m.begin(), __m.end()); 18053e519524SHoward Hinnant } 18063e519524SHoward Hinnant 1807848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 18081052ee39SHoward Hinnant iterator begin() _NOEXCEPT {return __tree_.begin();} 1809848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 18101052ee39SHoward Hinnant const_iterator begin() const _NOEXCEPT {return __tree_.begin();} 1811848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 18121052ee39SHoward Hinnant iterator end() _NOEXCEPT {return __tree_.end();} 1813848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 18141052ee39SHoward Hinnant const_iterator end() const _NOEXCEPT {return __tree_.end();} 18153e519524SHoward Hinnant 1816848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 18171052ee39SHoward Hinnant reverse_iterator rbegin() _NOEXCEPT {return reverse_iterator(end());} 1818848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 18191052ee39SHoward Hinnant const_reverse_iterator rbegin() const _NOEXCEPT 18201052ee39SHoward Hinnant {return const_reverse_iterator(end());} 1821848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 18221052ee39SHoward Hinnant reverse_iterator rend() _NOEXCEPT {return reverse_iterator(begin());} 1823848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 18241052ee39SHoward Hinnant const_reverse_iterator rend() const _NOEXCEPT 18251052ee39SHoward Hinnant {return const_reverse_iterator(begin());} 18263e519524SHoward Hinnant 1827848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 18281052ee39SHoward Hinnant const_iterator cbegin() const _NOEXCEPT {return begin();} 1829848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 18301052ee39SHoward Hinnant const_iterator cend() const _NOEXCEPT {return end();} 1831848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 18321052ee39SHoward Hinnant const_reverse_iterator crbegin() const _NOEXCEPT {return rbegin();} 1833848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 18341052ee39SHoward Hinnant const_reverse_iterator crend() const _NOEXCEPT {return rend();} 18353e519524SHoward Hinnant 183672c8fad4SMarshall Clow _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY 18371052ee39SHoward Hinnant bool empty() const _NOEXCEPT {return __tree_.size() == 0;} 1838848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 18391052ee39SHoward Hinnant size_type size() const _NOEXCEPT {return __tree_.size();} 1840848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 18411052ee39SHoward Hinnant size_type max_size() const _NOEXCEPT {return __tree_.max_size();} 18423e519524SHoward Hinnant 1843848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 18442a10c960SMarshall Clow allocator_type get_allocator() const _NOEXCEPT {return allocator_type(__tree_.__alloc());} 1845848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 18463e519524SHoward Hinnant key_compare key_comp() const {return __tree_.value_comp().key_comp();} 1847848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 18481052ee39SHoward Hinnant value_compare value_comp() const 18491052ee39SHoward Hinnant {return value_compare(__tree_.value_comp().key_comp());} 18503e519524SHoward Hinnant 18515e3ea4ddSEric Fiselier#ifndef _LIBCPP_CXX03_LANG 18527609c9b6SHoward Hinnant 18538b805c91SHoward Hinnant template <class ..._Args> 18545e3ea4ddSEric Fiselier _LIBCPP_INLINE_VISIBILITY 18555e3ea4ddSEric Fiselier iterator emplace(_Args&& ...__args) { 18565e3ea4ddSEric Fiselier return __tree_.__emplace_multi(_VSTD::forward<_Args>(__args)...); 18575e3ea4ddSEric Fiselier } 18583e519524SHoward Hinnant 18598b805c91SHoward Hinnant template <class ..._Args> 18605e3ea4ddSEric Fiselier _LIBCPP_INLINE_VISIBILITY 18615e3ea4ddSEric Fiselier iterator emplace_hint(const_iterator __p, _Args&& ...__args) { 18625e3ea4ddSEric Fiselier return __tree_.__emplace_hint_multi(__p.__i_, _VSTD::forward<_Args>(__args)...); 18635e3ea4ddSEric Fiselier } 18647609c9b6SHoward Hinnant 1865c003db1fSHoward Hinnant template <class _Pp, 1866c003db1fSHoward Hinnant class = typename enable_if<is_constructible<value_type, _Pp>::value>::type> 1867848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 1868c003db1fSHoward Hinnant iterator insert(_Pp&& __p) 1869c003db1fSHoward Hinnant {return __tree_.__insert_multi(_VSTD::forward<_Pp>(__p));} 18703e519524SHoward Hinnant 1871c003db1fSHoward Hinnant template <class _Pp, 1872c003db1fSHoward Hinnant class = typename enable_if<is_constructible<value_type, _Pp>::value>::type> 1873848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 1874c003db1fSHoward Hinnant iterator insert(const_iterator __pos, _Pp&& __p) 1875c003db1fSHoward Hinnant {return __tree_.__insert_multi(__pos.__i_, _VSTD::forward<_Pp>(__p));} 18763e519524SHoward Hinnant 18777a9f500fSEric Fiselier _LIBCPP_INLINE_VISIBILITY 18787a9f500fSEric Fiselier iterator insert(value_type&& __v) 18797a9f500fSEric Fiselier {return __tree_.__insert_multi(_VSTD::move(__v));} 18807a9f500fSEric Fiselier 18817a9f500fSEric Fiselier _LIBCPP_INLINE_VISIBILITY 18827a9f500fSEric Fiselier iterator insert(const_iterator __p, value_type&& __v) 18837a9f500fSEric Fiselier {return __tree_.__insert_multi(__p.__i_, _VSTD::move(__v));} 18847a9f500fSEric Fiselier 188518293116SEric Fiselier 188618293116SEric Fiselier _LIBCPP_INLINE_VISIBILITY 188718293116SEric Fiselier void insert(initializer_list<value_type> __il) 188818293116SEric Fiselier {insert(__il.begin(), __il.end());} 188918293116SEric Fiselier 18905e3ea4ddSEric Fiselier#endif // _LIBCPP_CXX03_LANG 18913e519524SHoward Hinnant 1892848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 18933e519524SHoward Hinnant iterator insert(const value_type& __v) {return __tree_.__insert_multi(__v);} 18943e519524SHoward Hinnant 1895848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 18963e519524SHoward Hinnant iterator insert(const_iterator __p, const value_type& __v) 18973e519524SHoward Hinnant {return __tree_.__insert_multi(__p.__i_, __v);} 18983e519524SHoward Hinnant 18993e519524SHoward Hinnant template <class _InputIterator> 1900848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 19013e519524SHoward Hinnant void insert(_InputIterator __f, _InputIterator __l) 19023e519524SHoward Hinnant { 19033e519524SHoward Hinnant for (const_iterator __e = cend(); __f != __l; ++__f) 19043e519524SHoward Hinnant __tree_.__insert_multi(__e.__i_, *__f); 19053e519524SHoward Hinnant } 19063e519524SHoward Hinnant 1907848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 19083e519524SHoward Hinnant iterator erase(const_iterator __p) {return __tree_.erase(__p.__i_);} 1909848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 1910ec392968SMarshall Clow iterator erase(iterator __p) {return __tree_.erase(__p.__i_);} 1911ec392968SMarshall Clow _LIBCPP_INLINE_VISIBILITY 19123e519524SHoward Hinnant size_type erase(const key_type& __k) {return __tree_.__erase_multi(__k);} 1913848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 19143e519524SHoward Hinnant iterator erase(const_iterator __f, const_iterator __l) 19153e519524SHoward Hinnant {return __tree_.erase(__f.__i_, __l.__i_);} 1916b0386a51SErik Pilkington 1917b0386a51SErik Pilkington#if _LIBCPP_STD_VER > 14 1918b0386a51SErik Pilkington _LIBCPP_INLINE_VISIBILITY 1919b0386a51SErik Pilkington iterator insert(node_type&& __nh) 1920b0386a51SErik Pilkington { 1921b0386a51SErik Pilkington _LIBCPP_ASSERT(__nh.empty() || __nh.get_allocator() == get_allocator(), 1922b0386a51SErik Pilkington "node_type with incompatible allocator passed to multimap::insert()"); 1923b0386a51SErik Pilkington return __tree_.template __node_handle_insert_multi<node_type>( 1924b0386a51SErik Pilkington _VSTD::move(__nh)); 1925b0386a51SErik Pilkington } 1926b0386a51SErik Pilkington _LIBCPP_INLINE_VISIBILITY 1927b0386a51SErik Pilkington iterator insert(const_iterator __hint, node_type&& __nh) 1928b0386a51SErik Pilkington { 1929b0386a51SErik Pilkington _LIBCPP_ASSERT(__nh.empty() || __nh.get_allocator() == get_allocator(), 1930b0386a51SErik Pilkington "node_type with incompatible allocator passed to multimap::insert()"); 1931b0386a51SErik Pilkington return __tree_.template __node_handle_insert_multi<node_type>( 1932b0386a51SErik Pilkington __hint.__i_, _VSTD::move(__nh)); 1933b0386a51SErik Pilkington } 1934b0386a51SErik Pilkington _LIBCPP_INLINE_VISIBILITY 1935b0386a51SErik Pilkington node_type extract(key_type const& __key) 1936b0386a51SErik Pilkington { 1937b0386a51SErik Pilkington return __tree_.template __node_handle_extract<node_type>(__key); 1938b0386a51SErik Pilkington } 1939b0386a51SErik Pilkington _LIBCPP_INLINE_VISIBILITY 1940b0386a51SErik Pilkington node_type extract(const_iterator __it) 1941b0386a51SErik Pilkington { 1942b0386a51SErik Pilkington return __tree_.template __node_handle_extract<node_type>( 1943b0386a51SErik Pilkington __it.__i_); 1944b0386a51SErik Pilkington } 1945*5c4e07aeSErik Pilkington template <class _C2> 1946*5c4e07aeSErik Pilkington _LIBCPP_INLINE_VISIBILITY 1947*5c4e07aeSErik Pilkington void merge(multimap<key_type, mapped_type, _C2, allocator_type>& __source) 1948*5c4e07aeSErik Pilkington { 1949*5c4e07aeSErik Pilkington _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(), 1950*5c4e07aeSErik Pilkington "merging container with incompatible allocator"); 1951*5c4e07aeSErik Pilkington return __tree_.__node_handle_merge_multi(__source.__tree_); 1952*5c4e07aeSErik Pilkington } 1953*5c4e07aeSErik Pilkington template <class _C2> 1954*5c4e07aeSErik Pilkington _LIBCPP_INLINE_VISIBILITY 1955*5c4e07aeSErik Pilkington void merge(multimap<key_type, mapped_type, _C2, allocator_type>&& __source) 1956*5c4e07aeSErik Pilkington { 1957*5c4e07aeSErik Pilkington _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(), 1958*5c4e07aeSErik Pilkington "merging container with incompatible allocator"); 1959*5c4e07aeSErik Pilkington return __tree_.__node_handle_merge_multi(__source.__tree_); 1960*5c4e07aeSErik Pilkington } 1961*5c4e07aeSErik Pilkington template <class _C2> 1962*5c4e07aeSErik Pilkington _LIBCPP_INLINE_VISIBILITY 1963*5c4e07aeSErik Pilkington void merge(map<key_type, mapped_type, _C2, allocator_type>& __source) 1964*5c4e07aeSErik Pilkington { 1965*5c4e07aeSErik Pilkington _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(), 1966*5c4e07aeSErik Pilkington "merging container with incompatible allocator"); 1967*5c4e07aeSErik Pilkington return __tree_.__node_handle_merge_multi(__source.__tree_); 1968*5c4e07aeSErik Pilkington } 1969*5c4e07aeSErik Pilkington template <class _C2> 1970*5c4e07aeSErik Pilkington _LIBCPP_INLINE_VISIBILITY 1971*5c4e07aeSErik Pilkington void merge(map<key_type, mapped_type, _C2, allocator_type>&& __source) 1972*5c4e07aeSErik Pilkington { 1973*5c4e07aeSErik Pilkington _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(), 1974*5c4e07aeSErik Pilkington "merging container with incompatible allocator"); 1975*5c4e07aeSErik Pilkington return __tree_.__node_handle_merge_multi(__source.__tree_); 1976*5c4e07aeSErik Pilkington } 1977b0386a51SErik Pilkington#endif 1978b0386a51SErik Pilkington 1979848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 1980934e9a39SMarshall Clow void clear() _NOEXCEPT {__tree_.clear();} 19813e519524SHoward Hinnant 1982848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 19831052ee39SHoward Hinnant void swap(multimap& __m) 19841052ee39SHoward Hinnant _NOEXCEPT_(__is_nothrow_swappable<__base>::value) 19851052ee39SHoward Hinnant {__tree_.swap(__m.__tree_);} 19863e519524SHoward Hinnant 1987848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 19883e519524SHoward Hinnant iterator find(const key_type& __k) {return __tree_.find(__k);} 1989848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 19903e519524SHoward Hinnant const_iterator find(const key_type& __k) const {return __tree_.find(__k);} 19912585835cSMarshall Clow#if _LIBCPP_STD_VER > 11 19922585835cSMarshall Clow template <typename _K2> 19932585835cSMarshall Clow _LIBCPP_INLINE_VISIBILITY 19942585835cSMarshall Clow typename enable_if<__is_transparent<_Compare, _K2>::value,iterator>::type 19952585835cSMarshall Clow find(const _K2& __k) {return __tree_.find(__k);} 19962585835cSMarshall Clow template <typename _K2> 19972585835cSMarshall Clow _LIBCPP_INLINE_VISIBILITY 19982585835cSMarshall Clow typename enable_if<__is_transparent<_Compare, _K2>::value,const_iterator>::type 19992585835cSMarshall Clow find(const _K2& __k) const {return __tree_.find(__k);} 20002585835cSMarshall Clow#endif 20012585835cSMarshall Clow 2002848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 20033e519524SHoward Hinnant size_type count(const key_type& __k) const 20043e519524SHoward Hinnant {return __tree_.__count_multi(__k);} 20050aacbc92SMarshall Clow#if _LIBCPP_STD_VER > 11 20060aacbc92SMarshall Clow template <typename _K2> 20070aacbc92SMarshall Clow _LIBCPP_INLINE_VISIBILITY 20080aacbc92SMarshall Clow typename enable_if<__is_transparent<_Compare, _K2>::value,size_type>::type 2009f8457a07SMarshall Clow count(const _K2& __k) const {return __tree_.__count_multi(__k);} 20100aacbc92SMarshall Clow#endif 2011848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 20123e519524SHoward Hinnant iterator lower_bound(const key_type& __k) 20133e519524SHoward Hinnant {return __tree_.lower_bound(__k);} 2014848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 20153e519524SHoward Hinnant const_iterator lower_bound(const key_type& __k) const 20163e519524SHoward Hinnant {return __tree_.lower_bound(__k);} 20172585835cSMarshall Clow#if _LIBCPP_STD_VER > 11 20182585835cSMarshall Clow template <typename _K2> 20192585835cSMarshall Clow _LIBCPP_INLINE_VISIBILITY 20202585835cSMarshall Clow typename enable_if<__is_transparent<_Compare, _K2>::value,iterator>::type 20212585835cSMarshall Clow lower_bound(const _K2& __k) {return __tree_.lower_bound(__k);} 20222585835cSMarshall Clow 20232585835cSMarshall Clow template <typename _K2> 20242585835cSMarshall Clow _LIBCPP_INLINE_VISIBILITY 20252585835cSMarshall Clow typename enable_if<__is_transparent<_Compare, _K2>::value,const_iterator>::type 20262585835cSMarshall Clow lower_bound(const _K2& __k) const {return __tree_.lower_bound(__k);} 20272585835cSMarshall Clow#endif 20282585835cSMarshall Clow 2029848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 20303e519524SHoward Hinnant iterator upper_bound(const key_type& __k) 20313e519524SHoward Hinnant {return __tree_.upper_bound(__k);} 2032848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 20333e519524SHoward Hinnant const_iterator upper_bound(const key_type& __k) const 20343e519524SHoward Hinnant {return __tree_.upper_bound(__k);} 20352585835cSMarshall Clow#if _LIBCPP_STD_VER > 11 20362585835cSMarshall Clow template <typename _K2> 20372585835cSMarshall Clow _LIBCPP_INLINE_VISIBILITY 20382585835cSMarshall Clow typename enable_if<__is_transparent<_Compare, _K2>::value,iterator>::type 20392585835cSMarshall Clow upper_bound(const _K2& __k) {return __tree_.upper_bound(__k);} 20402585835cSMarshall Clow template <typename _K2> 20412585835cSMarshall Clow _LIBCPP_INLINE_VISIBILITY 20422585835cSMarshall Clow typename enable_if<__is_transparent<_Compare, _K2>::value,const_iterator>::type 20432585835cSMarshall Clow upper_bound(const _K2& __k) const {return __tree_.upper_bound(__k);} 20442585835cSMarshall Clow#endif 20452585835cSMarshall Clow 2046848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 20473e519524SHoward Hinnant pair<iterator,iterator> equal_range(const key_type& __k) 20483e519524SHoward Hinnant {return __tree_.__equal_range_multi(__k);} 2049848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 20503e519524SHoward Hinnant pair<const_iterator,const_iterator> equal_range(const key_type& __k) const 20513e519524SHoward Hinnant {return __tree_.__equal_range_multi(__k);} 20522585835cSMarshall Clow#if _LIBCPP_STD_VER > 11 20532585835cSMarshall Clow template <typename _K2> 20542585835cSMarshall Clow _LIBCPP_INLINE_VISIBILITY 20552585835cSMarshall Clow typename enable_if<__is_transparent<_Compare, _K2>::value,pair<iterator,iterator>>::type 20562585835cSMarshall Clow equal_range(const _K2& __k) {return __tree_.__equal_range_multi(__k);} 20572585835cSMarshall Clow template <typename _K2> 20582585835cSMarshall Clow _LIBCPP_INLINE_VISIBILITY 20592585835cSMarshall Clow typename enable_if<__is_transparent<_Compare, _K2>::value,pair<const_iterator,const_iterator>>::type 20602585835cSMarshall Clow equal_range(const _K2& __k) const {return __tree_.__equal_range_multi(__k);} 20612585835cSMarshall Clow#endif 20623e519524SHoward Hinnant 20633e519524SHoward Hinnantprivate: 20643e519524SHoward Hinnant typedef typename __base::__node __node; 20653e519524SHoward Hinnant typedef typename __base::__node_allocator __node_allocator; 20663e519524SHoward Hinnant typedef typename __base::__node_pointer __node_pointer; 20670594ad71SEric Fiselier 2068c003db1fSHoward Hinnant typedef __map_node_destructor<__node_allocator> _Dp; 2069c003db1fSHoward Hinnant typedef unique_ptr<__node, _Dp> __node_holder; 20703e519524SHoward Hinnant}; 20713e519524SHoward Hinnant 20725e3ea4ddSEric Fiselier#ifndef _LIBCPP_CXX03_LANG 20733e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 20743e519524SHoward Hinnantmultimap<_Key, _Tp, _Compare, _Allocator>::multimap(multimap&& __m, const allocator_type& __a) 20752a10c960SMarshall Clow : __tree_(_VSTD::move(__m.__tree_), typename __base::allocator_type(__a)) 20763e519524SHoward Hinnant{ 20773e519524SHoward Hinnant if (__a != __m.get_allocator()) 20783e519524SHoward Hinnant { 20793e519524SHoward Hinnant const_iterator __e = cend(); 20803e519524SHoward Hinnant while (!__m.empty()) 20813e519524SHoward Hinnant __tree_.__insert_multi(__e.__i_, 2082f52318b4SErik Pilkington _VSTD::move(__m.__tree_.remove(__m.begin().__i_)->__value_.__move())); 20833e519524SHoward Hinnant } 20843e519524SHoward Hinnant} 20855e3ea4ddSEric Fiselier#endif 20863e519524SHoward Hinnant 20873e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 2088848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 20893e519524SHoward Hinnantbool 20903e519524SHoward Hinnantoperator==(const multimap<_Key, _Tp, _Compare, _Allocator>& __x, 20913e519524SHoward Hinnant const multimap<_Key, _Tp, _Compare, _Allocator>& __y) 20923e519524SHoward Hinnant{ 2093ce48a113SHoward Hinnant return __x.size() == __y.size() && _VSTD::equal(__x.begin(), __x.end(), __y.begin()); 20943e519524SHoward Hinnant} 20953e519524SHoward Hinnant 20963e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 2097848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 20983e519524SHoward Hinnantbool 20993e519524SHoward Hinnantoperator< (const multimap<_Key, _Tp, _Compare, _Allocator>& __x, 21003e519524SHoward Hinnant const multimap<_Key, _Tp, _Compare, _Allocator>& __y) 21013e519524SHoward Hinnant{ 2102ce48a113SHoward Hinnant return _VSTD::lexicographical_compare(__x.begin(), __x.end(), __y.begin(), __y.end()); 21033e519524SHoward Hinnant} 21043e519524SHoward Hinnant 21053e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 2106848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 21073e519524SHoward Hinnantbool 21083e519524SHoward Hinnantoperator!=(const multimap<_Key, _Tp, _Compare, _Allocator>& __x, 21093e519524SHoward Hinnant const multimap<_Key, _Tp, _Compare, _Allocator>& __y) 21103e519524SHoward Hinnant{ 21113e519524SHoward Hinnant return !(__x == __y); 21123e519524SHoward Hinnant} 21133e519524SHoward Hinnant 21143e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 2115848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 21163e519524SHoward Hinnantbool 21173e519524SHoward Hinnantoperator> (const multimap<_Key, _Tp, _Compare, _Allocator>& __x, 21183e519524SHoward Hinnant const multimap<_Key, _Tp, _Compare, _Allocator>& __y) 21193e519524SHoward Hinnant{ 21203e519524SHoward Hinnant return __y < __x; 21213e519524SHoward Hinnant} 21223e519524SHoward Hinnant 21233e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 2124848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 21253e519524SHoward Hinnantbool 21263e519524SHoward Hinnantoperator>=(const multimap<_Key, _Tp, _Compare, _Allocator>& __x, 21273e519524SHoward Hinnant const multimap<_Key, _Tp, _Compare, _Allocator>& __y) 21283e519524SHoward Hinnant{ 21293e519524SHoward Hinnant return !(__x < __y); 21303e519524SHoward Hinnant} 21313e519524SHoward Hinnant 21323e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 2133848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 21343e519524SHoward Hinnantbool 21353e519524SHoward Hinnantoperator<=(const multimap<_Key, _Tp, _Compare, _Allocator>& __x, 21363e519524SHoward Hinnant const multimap<_Key, _Tp, _Compare, _Allocator>& __y) 21373e519524SHoward Hinnant{ 21383e519524SHoward Hinnant return !(__y < __x); 21393e519524SHoward Hinnant} 21403e519524SHoward Hinnant 21413e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 2142848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 21433e519524SHoward Hinnantvoid 21443e519524SHoward Hinnantswap(multimap<_Key, _Tp, _Compare, _Allocator>& __x, 21453e519524SHoward Hinnant multimap<_Key, _Tp, _Compare, _Allocator>& __y) 21461052ee39SHoward Hinnant _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y))) 21473e519524SHoward Hinnant{ 21483e519524SHoward Hinnant __x.swap(__y); 21493e519524SHoward Hinnant} 21503e519524SHoward Hinnant 21513e519524SHoward Hinnant_LIBCPP_END_NAMESPACE_STD 21523e519524SHoward Hinnant 21533e519524SHoward Hinnant#endif // _LIBCPP_MAP 2154