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; 433e519524SHoward Hinnant 443e519524SHoward Hinnant class value_compare 453e519524SHoward Hinnant : public binary_function<value_type, value_type, bool> 463e519524SHoward Hinnant { 473e519524SHoward Hinnant friend class map; 483e519524SHoward Hinnant protected: 493e519524SHoward Hinnant key_compare comp; 503e519524SHoward Hinnant 513e519524SHoward Hinnant value_compare(key_compare c); 523e519524SHoward Hinnant public: 533e519524SHoward Hinnant bool operator()(const value_type& x, const value_type& y) const; 543e519524SHoward Hinnant }; 553e519524SHoward Hinnant 563e519524SHoward Hinnant // construct/copy/destroy: 571052ee39SHoward Hinnant map() 581052ee39SHoward Hinnant noexcept( 591052ee39SHoward Hinnant is_nothrow_default_constructible<allocator_type>::value && 601052ee39SHoward Hinnant is_nothrow_default_constructible<key_compare>::value && 611052ee39SHoward Hinnant is_nothrow_copy_constructible<key_compare>::value); 623e519524SHoward Hinnant explicit map(const key_compare& comp); 633e519524SHoward Hinnant map(const key_compare& comp, const allocator_type& a); 643e519524SHoward Hinnant template <class InputIterator> 653e519524SHoward Hinnant map(InputIterator first, InputIterator last, 663e519524SHoward Hinnant const key_compare& comp = key_compare()); 673e519524SHoward Hinnant template <class InputIterator> 683e519524SHoward Hinnant map(InputIterator first, InputIterator last, 693e519524SHoward Hinnant const key_compare& comp, const allocator_type& a); 703e519524SHoward Hinnant map(const map& m); 711052ee39SHoward Hinnant map(map&& m) 721052ee39SHoward Hinnant noexcept( 731052ee39SHoward Hinnant is_nothrow_move_constructible<allocator_type>::value && 741052ee39SHoward Hinnant is_nothrow_move_constructible<key_compare>::value); 753e519524SHoward Hinnant explicit map(const allocator_type& a); 763e519524SHoward Hinnant map(const map& m, const allocator_type& a); 773e519524SHoward Hinnant map(map&& m, const allocator_type& a); 783e519524SHoward Hinnant map(initializer_list<value_type> il, const key_compare& comp = key_compare()); 793e519524SHoward Hinnant map(initializer_list<value_type> il, const key_compare& comp, const allocator_type& a); 80fbc317d4SMarshall Clow template <class InputIterator> 81fbc317d4SMarshall Clow map(InputIterator first, InputIterator last, const allocator_type& a) 82fbc317d4SMarshall Clow : map(first, last, Compare(), a) {} // C++14 83fbc317d4SMarshall Clow map(initializer_list<value_type> il, const allocator_type& a) 84fbc317d4SMarshall Clow : map(il, Compare(), a) {} // C++14 853e519524SHoward Hinnant ~map(); 863e519524SHoward Hinnant 873e519524SHoward Hinnant map& operator=(const map& m); 881052ee39SHoward Hinnant map& operator=(map&& m) 891052ee39SHoward Hinnant noexcept( 901052ee39SHoward Hinnant allocator_type::propagate_on_container_move_assignment::value && 911052ee39SHoward Hinnant is_nothrow_move_assignable<allocator_type>::value && 920e9f71c1SHoward Hinnant is_nothrow_move_assignable<key_compare>::value); 933e519524SHoward Hinnant map& operator=(initializer_list<value_type> il); 943e519524SHoward Hinnant 953e519524SHoward Hinnant // iterators: 960e9f71c1SHoward Hinnant iterator begin() noexcept; 970e9f71c1SHoward Hinnant const_iterator begin() const noexcept; 980e9f71c1SHoward Hinnant iterator end() noexcept; 990e9f71c1SHoward Hinnant const_iterator end() const noexcept; 1003e519524SHoward Hinnant 1010e9f71c1SHoward Hinnant reverse_iterator rbegin() noexcept; 1020e9f71c1SHoward Hinnant const_reverse_iterator rbegin() const noexcept; 1030e9f71c1SHoward Hinnant reverse_iterator rend() noexcept; 1040e9f71c1SHoward Hinnant const_reverse_iterator rend() const noexcept; 1053e519524SHoward Hinnant 1060e9f71c1SHoward Hinnant const_iterator cbegin() const noexcept; 1070e9f71c1SHoward Hinnant const_iterator cend() const noexcept; 1080e9f71c1SHoward Hinnant const_reverse_iterator crbegin() const noexcept; 1090e9f71c1SHoward Hinnant const_reverse_iterator crend() const noexcept; 1103e519524SHoward Hinnant 1113e519524SHoward Hinnant // capacity: 1120e9f71c1SHoward Hinnant bool empty() const noexcept; 1130e9f71c1SHoward Hinnant size_type size() const noexcept; 1140e9f71c1SHoward Hinnant size_type max_size() const noexcept; 1153e519524SHoward Hinnant 1163e519524SHoward Hinnant // element access: 1173e519524SHoward Hinnant mapped_type& operator[](const key_type& k); 1183e519524SHoward Hinnant mapped_type& operator[](key_type&& k); 1193e519524SHoward Hinnant 1203e519524SHoward Hinnant mapped_type& at(const key_type& k); 1213e519524SHoward Hinnant const mapped_type& at(const key_type& k) const; 1223e519524SHoward Hinnant 1233e519524SHoward Hinnant // modifiers: 1243e519524SHoward Hinnant template <class... Args> 1253e519524SHoward Hinnant pair<iterator, bool> emplace(Args&&... args); 1263e519524SHoward Hinnant template <class... Args> 1273e519524SHoward Hinnant iterator emplace_hint(const_iterator position, Args&&... args); 1283e519524SHoward Hinnant pair<iterator, bool> insert(const value_type& v); 129afc9ff99SMarshall Clow pair<iterator, bool> insert( value_type&& v); // C++17 1303e519524SHoward Hinnant template <class P> 1313e519524SHoward Hinnant pair<iterator, bool> insert(P&& p); 1323e519524SHoward Hinnant iterator insert(const_iterator position, const value_type& v); 133afc9ff99SMarshall Clow iterator insert(const_iterator position, value_type&& v); // C++17 1343e519524SHoward Hinnant template <class P> 1353e519524SHoward Hinnant iterator insert(const_iterator position, P&& p); 1363e519524SHoward Hinnant template <class InputIterator> 1373e519524SHoward Hinnant void insert(InputIterator first, InputIterator last); 1383e519524SHoward Hinnant void insert(initializer_list<value_type> il); 1393e519524SHoward Hinnant 1408aaf517dSMarshall Clow template <class... Args> 1418aaf517dSMarshall Clow pair<iterator, bool> try_emplace(const key_type& k, Args&&... args); // C++17 1428aaf517dSMarshall Clow template <class... Args> 1438aaf517dSMarshall Clow pair<iterator, bool> try_emplace(key_type&& k, Args&&... args); // C++17 1448aaf517dSMarshall Clow template <class... Args> 1458aaf517dSMarshall Clow iterator try_emplace(const_iterator hint, const key_type& k, Args&&... args); // C++17 1468aaf517dSMarshall Clow template <class... Args> 1478aaf517dSMarshall Clow iterator try_emplace(const_iterator hint, key_type&& k, Args&&... args); // C++17 1488aaf517dSMarshall Clow template <class M> 1498aaf517dSMarshall Clow pair<iterator, bool> insert_or_assign(const key_type& k, M&& obj); // C++17 1508aaf517dSMarshall Clow template <class M> 1518aaf517dSMarshall Clow pair<iterator, bool> insert_or_assign(key_type&& k, M&& obj); // C++17 1528aaf517dSMarshall Clow template <class M> 1538aaf517dSMarshall Clow iterator insert_or_assign(const_iterator hint, const key_type& k, M&& obj); // C++17 1548aaf517dSMarshall Clow template <class M> 1558aaf517dSMarshall Clow iterator insert_or_assign(const_iterator hint, key_type&& k, M&& obj); // C++17 1568aaf517dSMarshall Clow 1573e519524SHoward Hinnant iterator erase(const_iterator position); 158ec392968SMarshall Clow iterator erase(iterator position); // C++14 1593e519524SHoward Hinnant size_type erase(const key_type& k); 1603e519524SHoward Hinnant iterator erase(const_iterator first, const_iterator last); 1610e9f71c1SHoward Hinnant void clear() noexcept; 1623e519524SHoward Hinnant 1631052ee39SHoward Hinnant void swap(map& m) 164e3fbe143SMarshall Clow noexcept(allocator_traits<allocator_type>::is_always_equal::value && 165f07dd8d0SEric Fiselier is_nothrow_swappable<key_compare>::value); // C++17 1663e519524SHoward Hinnant 1673e519524SHoward Hinnant // observers: 1680e9f71c1SHoward Hinnant allocator_type get_allocator() const noexcept; 1693e519524SHoward Hinnant key_compare key_comp() const; 1703e519524SHoward Hinnant value_compare value_comp() const; 1713e519524SHoward Hinnant 1723e519524SHoward Hinnant // map operations: 1733e519524SHoward Hinnant iterator find(const key_type& k); 1743e519524SHoward Hinnant const_iterator find(const key_type& k) const; 1752585835cSMarshall Clow template<typename K> 1762585835cSMarshall Clow iterator find(const K& x); // C++14 1772585835cSMarshall Clow template<typename K> 1782585835cSMarshall Clow const_iterator find(const K& x) const; // C++14 1792585835cSMarshall Clow template<typename K> 1800aacbc92SMarshall Clow size_type count(const K& x) const; // C++14 1812585835cSMarshall Clow 1823e519524SHoward Hinnant size_type count(const key_type& k) const; 1833e519524SHoward Hinnant iterator lower_bound(const key_type& k); 1843e519524SHoward Hinnant const_iterator lower_bound(const key_type& k) const; 1852585835cSMarshall Clow template<typename K> 1862585835cSMarshall Clow iterator lower_bound(const K& x); // C++14 1872585835cSMarshall Clow template<typename K> 1882585835cSMarshall Clow const_iterator lower_bound(const K& x) const; // C++14 1892585835cSMarshall Clow 1903e519524SHoward Hinnant iterator upper_bound(const key_type& k); 1913e519524SHoward Hinnant const_iterator upper_bound(const key_type& k) const; 1922585835cSMarshall Clow template<typename K> 1932585835cSMarshall Clow iterator upper_bound(const K& x); // C++14 1942585835cSMarshall Clow template<typename K> 1952585835cSMarshall Clow const_iterator upper_bound(const K& x) const; // C++14 1962585835cSMarshall Clow 1973e519524SHoward Hinnant pair<iterator,iterator> equal_range(const key_type& k); 1983e519524SHoward Hinnant pair<const_iterator,const_iterator> equal_range(const key_type& k) const; 1992585835cSMarshall Clow template<typename K> 2002585835cSMarshall Clow pair<iterator,iterator> equal_range(const K& x); // C++14 2012585835cSMarshall Clow template<typename K> 2022585835cSMarshall Clow pair<const_iterator,const_iterator> equal_range(const K& x) const; // C++14 2033e519524SHoward Hinnant}; 2043e519524SHoward Hinnant 2053e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator> 2063e519524SHoward Hinnantbool 2073e519524SHoward Hinnantoperator==(const map<Key, T, Compare, Allocator>& x, 2083e519524SHoward Hinnant const map<Key, T, Compare, Allocator>& y); 2093e519524SHoward Hinnant 2103e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator> 2113e519524SHoward Hinnantbool 2123e519524SHoward Hinnantoperator< (const map<Key, T, Compare, Allocator>& x, 2133e519524SHoward Hinnant const map<Key, T, Compare, Allocator>& y); 2143e519524SHoward Hinnant 2153e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator> 2163e519524SHoward Hinnantbool 2173e519524SHoward Hinnantoperator!=(const map<Key, T, Compare, Allocator>& x, 2183e519524SHoward Hinnant const map<Key, T, Compare, Allocator>& y); 2193e519524SHoward Hinnant 2203e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator> 2213e519524SHoward Hinnantbool 2223e519524SHoward Hinnantoperator> (const map<Key, T, Compare, Allocator>& x, 2233e519524SHoward Hinnant const map<Key, T, Compare, Allocator>& y); 2243e519524SHoward Hinnant 2253e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator> 2263e519524SHoward Hinnantbool 2273e519524SHoward Hinnantoperator>=(const map<Key, T, Compare, Allocator>& x, 2283e519524SHoward Hinnant const map<Key, T, Compare, Allocator>& y); 2293e519524SHoward Hinnant 2303e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator> 2313e519524SHoward Hinnantbool 2323e519524SHoward Hinnantoperator<=(const map<Key, T, Compare, Allocator>& x, 2333e519524SHoward Hinnant const map<Key, T, Compare, Allocator>& y); 2343e519524SHoward Hinnant 2353e519524SHoward Hinnant// specialized algorithms: 2363e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator> 2373e519524SHoward Hinnantvoid 2381052ee39SHoward Hinnantswap(map<Key, T, Compare, Allocator>& x, map<Key, T, Compare, Allocator>& y) 2391052ee39SHoward Hinnant noexcept(noexcept(x.swap(y))); 2403e519524SHoward Hinnant 2413e519524SHoward Hinnanttemplate <class Key, class T, class Compare = less<Key>, 2423e519524SHoward Hinnant class Allocator = allocator<pair<const Key, T>>> 2433e519524SHoward Hinnantclass multimap 2443e519524SHoward Hinnant{ 2453e519524SHoward Hinnantpublic: 2463e519524SHoward Hinnant // types: 2473e519524SHoward Hinnant typedef Key key_type; 2483e519524SHoward Hinnant typedef T mapped_type; 2493e519524SHoward Hinnant typedef pair<const key_type,mapped_type> value_type; 2503e519524SHoward Hinnant typedef Compare key_compare; 2513e519524SHoward Hinnant typedef Allocator allocator_type; 2523e519524SHoward Hinnant typedef typename allocator_type::reference reference; 2533e519524SHoward Hinnant typedef typename allocator_type::const_reference const_reference; 2543e519524SHoward Hinnant typedef typename allocator_type::size_type size_type; 2553e519524SHoward Hinnant typedef typename allocator_type::difference_type difference_type; 2563e519524SHoward Hinnant typedef typename allocator_type::pointer pointer; 2573e519524SHoward Hinnant typedef typename allocator_type::const_pointer const_pointer; 2583e519524SHoward Hinnant 2593e519524SHoward Hinnant typedef implementation-defined iterator; 2603e519524SHoward Hinnant typedef implementation-defined const_iterator; 2613e519524SHoward Hinnant typedef std::reverse_iterator<iterator> reverse_iterator; 2623e519524SHoward Hinnant typedef std::reverse_iterator<const_iterator> const_reverse_iterator; 2633e519524SHoward Hinnant 2643e519524SHoward Hinnant class value_compare 2653e519524SHoward Hinnant : public binary_function<value_type,value_type,bool> 2663e519524SHoward Hinnant { 2673e519524SHoward Hinnant friend class multimap; 2683e519524SHoward Hinnant protected: 2693e519524SHoward Hinnant key_compare comp; 2703e519524SHoward Hinnant value_compare(key_compare c); 2713e519524SHoward Hinnant public: 2723e519524SHoward Hinnant bool operator()(const value_type& x, const value_type& y) const; 2733e519524SHoward Hinnant }; 2743e519524SHoward Hinnant 2753e519524SHoward Hinnant // construct/copy/destroy: 2761052ee39SHoward Hinnant multimap() 2771052ee39SHoward Hinnant noexcept( 2781052ee39SHoward Hinnant is_nothrow_default_constructible<allocator_type>::value && 2791052ee39SHoward Hinnant is_nothrow_default_constructible<key_compare>::value && 2801052ee39SHoward Hinnant is_nothrow_copy_constructible<key_compare>::value); 2811052ee39SHoward Hinnant explicit multimap(const key_compare& comp); 2823e519524SHoward Hinnant multimap(const key_compare& comp, const allocator_type& a); 2833e519524SHoward Hinnant template <class InputIterator> 2843e519524SHoward Hinnant multimap(InputIterator first, InputIterator last, const key_compare& comp); 2853e519524SHoward Hinnant template <class InputIterator> 2863e519524SHoward Hinnant multimap(InputIterator first, InputIterator last, const key_compare& comp, 2873e519524SHoward Hinnant const allocator_type& a); 2883e519524SHoward Hinnant multimap(const multimap& m); 2891052ee39SHoward Hinnant multimap(multimap&& m) 2901052ee39SHoward Hinnant noexcept( 2911052ee39SHoward Hinnant is_nothrow_move_constructible<allocator_type>::value && 2921052ee39SHoward Hinnant is_nothrow_move_constructible<key_compare>::value); 2933e519524SHoward Hinnant explicit multimap(const allocator_type& a); 2943e519524SHoward Hinnant multimap(const multimap& m, const allocator_type& a); 2953e519524SHoward Hinnant multimap(multimap&& m, const allocator_type& a); 2963e519524SHoward Hinnant multimap(initializer_list<value_type> il, const key_compare& comp = key_compare()); 2973e519524SHoward Hinnant multimap(initializer_list<value_type> il, const key_compare& comp, 2983e519524SHoward Hinnant const allocator_type& a); 299fbc317d4SMarshall Clow template <class InputIterator> 300fbc317d4SMarshall Clow multimap(InputIterator first, InputIterator last, const allocator_type& a) 301fbc317d4SMarshall Clow : multimap(first, last, Compare(), a) {} // C++14 302fbc317d4SMarshall Clow multimap(initializer_list<value_type> il, const allocator_type& a) 303fbc317d4SMarshall Clow : multimap(il, Compare(), a) {} // C++14 3043e519524SHoward Hinnant ~multimap(); 3053e519524SHoward Hinnant 3063e519524SHoward Hinnant multimap& operator=(const multimap& m); 3071052ee39SHoward Hinnant multimap& operator=(multimap&& m) 3081052ee39SHoward Hinnant noexcept( 3091052ee39SHoward Hinnant allocator_type::propagate_on_container_move_assignment::value && 3101052ee39SHoward Hinnant is_nothrow_move_assignable<allocator_type>::value && 3110e9f71c1SHoward Hinnant is_nothrow_move_assignable<key_compare>::value); 3123e519524SHoward Hinnant multimap& operator=(initializer_list<value_type> il); 3133e519524SHoward Hinnant 3143e519524SHoward Hinnant // iterators: 3150e9f71c1SHoward Hinnant iterator begin() noexcept; 3160e9f71c1SHoward Hinnant const_iterator begin() const noexcept; 3170e9f71c1SHoward Hinnant iterator end() noexcept; 3180e9f71c1SHoward Hinnant const_iterator end() const noexcept; 3193e519524SHoward Hinnant 3200e9f71c1SHoward Hinnant reverse_iterator rbegin() noexcept; 3210e9f71c1SHoward Hinnant const_reverse_iterator rbegin() const noexcept; 3220e9f71c1SHoward Hinnant reverse_iterator rend() noexcept; 3230e9f71c1SHoward Hinnant const_reverse_iterator rend() const noexcept; 3243e519524SHoward Hinnant 3250e9f71c1SHoward Hinnant const_iterator cbegin() const noexcept; 3260e9f71c1SHoward Hinnant const_iterator cend() const noexcept; 3270e9f71c1SHoward Hinnant const_reverse_iterator crbegin() const noexcept; 3280e9f71c1SHoward Hinnant const_reverse_iterator crend() const noexcept; 3293e519524SHoward Hinnant 3303e519524SHoward Hinnant // capacity: 3310e9f71c1SHoward Hinnant bool empty() const noexcept; 3320e9f71c1SHoward Hinnant size_type size() const noexcept; 3330e9f71c1SHoward Hinnant size_type max_size() const noexcept; 3343e519524SHoward Hinnant 3353e519524SHoward Hinnant // modifiers: 3363e519524SHoward Hinnant template <class... Args> 3373e519524SHoward Hinnant iterator emplace(Args&&... args); 3383e519524SHoward Hinnant template <class... Args> 3393e519524SHoward Hinnant iterator emplace_hint(const_iterator position, Args&&... args); 3403e519524SHoward Hinnant iterator insert(const value_type& v); 341afc9ff99SMarshall Clow iterator insert( value_type&& v); // C++17 3423e519524SHoward Hinnant template <class P> 3433e519524SHoward Hinnant iterator insert(P&& p); 3443e519524SHoward Hinnant iterator insert(const_iterator position, const value_type& v); 345afc9ff99SMarshall Clow iterator insert(const_iterator position, value_type&& v); // C++17 3463e519524SHoward Hinnant template <class P> 3473e519524SHoward Hinnant iterator insert(const_iterator position, P&& p); 3483e519524SHoward Hinnant template <class InputIterator> 3493e519524SHoward Hinnant void insert(InputIterator first, InputIterator last); 3503e519524SHoward Hinnant void insert(initializer_list<value_type> il); 3513e519524SHoward Hinnant 3523e519524SHoward Hinnant iterator erase(const_iterator position); 353ec392968SMarshall Clow iterator erase(iterator position); // C++14 3543e519524SHoward Hinnant size_type erase(const key_type& k); 3553e519524SHoward Hinnant iterator erase(const_iterator first, const_iterator last); 3560e9f71c1SHoward Hinnant void clear() noexcept; 3573e519524SHoward Hinnant 3581052ee39SHoward Hinnant void swap(multimap& m) 359e3fbe143SMarshall Clow noexcept(allocator_traits<allocator_type>::is_always_equal::value && 360f07dd8d0SEric Fiselier is_nothrow_swappable<key_compare>::value); // C++17 3613e519524SHoward Hinnant 3623e519524SHoward Hinnant // observers: 3630e9f71c1SHoward Hinnant allocator_type get_allocator() const noexcept; 3643e519524SHoward Hinnant key_compare key_comp() const; 3653e519524SHoward Hinnant value_compare value_comp() const; 3663e519524SHoward Hinnant 3673e519524SHoward Hinnant // map operations: 3683e519524SHoward Hinnant iterator find(const key_type& k); 3693e519524SHoward Hinnant const_iterator find(const key_type& k) const; 3702585835cSMarshall Clow template<typename K> 3712585835cSMarshall Clow iterator find(const K& x); // C++14 3722585835cSMarshall Clow template<typename K> 3732585835cSMarshall Clow const_iterator find(const K& x) const; // C++14 3742585835cSMarshall Clow template<typename K> 3750aacbc92SMarshall Clow size_type count(const K& x) const; // C++14 3762585835cSMarshall Clow 3773e519524SHoward Hinnant size_type count(const key_type& k) const; 3783e519524SHoward Hinnant iterator lower_bound(const key_type& k); 3793e519524SHoward Hinnant const_iterator lower_bound(const key_type& k) const; 3802585835cSMarshall Clow template<typename K> 3812585835cSMarshall Clow iterator lower_bound(const K& x); // C++14 3822585835cSMarshall Clow template<typename K> 3832585835cSMarshall Clow const_iterator lower_bound(const K& x) const; // C++14 3842585835cSMarshall Clow 3853e519524SHoward Hinnant iterator upper_bound(const key_type& k); 3863e519524SHoward Hinnant const_iterator upper_bound(const key_type& k) const; 3872585835cSMarshall Clow template<typename K> 3882585835cSMarshall Clow iterator upper_bound(const K& x); // C++14 3892585835cSMarshall Clow template<typename K> 3902585835cSMarshall Clow const_iterator upper_bound(const K& x) const; // C++14 3912585835cSMarshall Clow 3923e519524SHoward Hinnant pair<iterator,iterator> equal_range(const key_type& k); 3933e519524SHoward Hinnant pair<const_iterator,const_iterator> equal_range(const key_type& k) const; 3942585835cSMarshall Clow template<typename K> 3952585835cSMarshall Clow pair<iterator,iterator> equal_range(const K& x); // C++14 3962585835cSMarshall Clow template<typename K> 3972585835cSMarshall Clow pair<const_iterator,const_iterator> equal_range(const K& x) const; // C++14 3983e519524SHoward Hinnant}; 3993e519524SHoward Hinnant 4003e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator> 4013e519524SHoward Hinnantbool 4023e519524SHoward Hinnantoperator==(const multimap<Key, T, Compare, Allocator>& x, 4033e519524SHoward Hinnant const multimap<Key, T, Compare, Allocator>& y); 4043e519524SHoward Hinnant 4053e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator> 4063e519524SHoward Hinnantbool 4073e519524SHoward Hinnantoperator< (const multimap<Key, T, Compare, Allocator>& x, 4083e519524SHoward Hinnant const multimap<Key, T, Compare, Allocator>& y); 4093e519524SHoward Hinnant 4103e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator> 4113e519524SHoward Hinnantbool 4123e519524SHoward Hinnantoperator!=(const multimap<Key, T, Compare, Allocator>& x, 4133e519524SHoward Hinnant const multimap<Key, T, Compare, Allocator>& y); 4143e519524SHoward Hinnant 4153e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator> 4163e519524SHoward Hinnantbool 4173e519524SHoward Hinnantoperator> (const multimap<Key, T, Compare, Allocator>& x, 4183e519524SHoward Hinnant const multimap<Key, T, Compare, Allocator>& y); 4193e519524SHoward Hinnant 4203e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator> 4213e519524SHoward Hinnantbool 4223e519524SHoward Hinnantoperator>=(const multimap<Key, T, Compare, Allocator>& x, 4233e519524SHoward Hinnant const multimap<Key, T, Compare, Allocator>& y); 4243e519524SHoward Hinnant 4253e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator> 4263e519524SHoward Hinnantbool 4273e519524SHoward Hinnantoperator<=(const multimap<Key, T, Compare, Allocator>& x, 4283e519524SHoward Hinnant const multimap<Key, T, Compare, Allocator>& y); 4293e519524SHoward Hinnant 4303e519524SHoward Hinnant// specialized algorithms: 4313e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator> 4323e519524SHoward Hinnantvoid 4333e519524SHoward Hinnantswap(multimap<Key, T, Compare, Allocator>& x, 4341052ee39SHoward Hinnant multimap<Key, T, Compare, Allocator>& y) 4351052ee39SHoward Hinnant noexcept(noexcept(x.swap(y))); 4363e519524SHoward Hinnant 4373e519524SHoward Hinnant} // std 4383e519524SHoward Hinnant 4393e519524SHoward Hinnant*/ 4403e519524SHoward Hinnant 4413e519524SHoward Hinnant#include <__config> 4423e519524SHoward Hinnant#include <__tree> 4433e519524SHoward Hinnant#include <iterator> 4443e519524SHoward Hinnant#include <memory> 4453e519524SHoward Hinnant#include <utility> 4463e519524SHoward Hinnant#include <functional> 4473e519524SHoward Hinnant#include <initializer_list> 448ee187e24SEric Fiselier#include <type_traits> 4493e519524SHoward Hinnant 450073458b1SHoward Hinnant#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 4513e519524SHoward Hinnant#pragma GCC system_header 452073458b1SHoward Hinnant#endif 4533e519524SHoward Hinnant 4543e519524SHoward Hinnant_LIBCPP_BEGIN_NAMESPACE_STD 4553e519524SHoward Hinnant 456ee187e24SEric Fiseliertemplate <class _Key, class _CP, class _Compare, 457ee187e24SEric Fiselier bool = is_empty<_Compare>::value && !__libcpp_is_final<_Compare>::value 45842b8bb50SHoward Hinnant > 4593e519524SHoward Hinnantclass __map_value_compare 4603e519524SHoward Hinnant : private _Compare 4613e519524SHoward Hinnant{ 4623e519524SHoward Hinnantpublic: 463848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 4641052ee39SHoward Hinnant __map_value_compare() 4651052ee39SHoward Hinnant _NOEXCEPT_(is_nothrow_default_constructible<_Compare>::value) 4661052ee39SHoward Hinnant : _Compare() {} 467848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 4681052ee39SHoward Hinnant __map_value_compare(_Compare c) 4691052ee39SHoward Hinnant _NOEXCEPT_(is_nothrow_copy_constructible<_Compare>::value) 4701052ee39SHoward Hinnant : _Compare(c) {} 471848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 4721052ee39SHoward Hinnant const _Compare& key_comp() const _NOEXCEPT {return *this;} 473848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 4743e519524SHoward Hinnant bool operator()(const _CP& __x, const _CP& __y) const 475abb160e6SHoward Hinnant {return static_cast<const _Compare&>(*this)(__x.__cc.first, __y.__cc.first);} 476848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 4773e519524SHoward Hinnant bool operator()(const _CP& __x, const _Key& __y) const 478abb160e6SHoward Hinnant {return static_cast<const _Compare&>(*this)(__x.__cc.first, __y);} 479848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 4803e519524SHoward Hinnant bool operator()(const _Key& __x, const _CP& __y) const 481abb160e6SHoward Hinnant {return static_cast<const _Compare&>(*this)(__x, __y.__cc.first);} 482e3fbe143SMarshall Clow void swap(__map_value_compare&__y) 483e3fbe143SMarshall Clow _NOEXCEPT_(__is_nothrow_swappable<_Compare>::value) 484e3fbe143SMarshall Clow { 485e3fbe143SMarshall Clow using _VSTD::swap; 486e3fbe143SMarshall Clow swap(static_cast<const _Compare&>(*this), static_cast<const _Compare&>(__y)); 487e3fbe143SMarshall Clow } 4882585835cSMarshall Clow 4892585835cSMarshall Clow#if _LIBCPP_STD_VER > 11 4902585835cSMarshall Clow template <typename _K2> 4912585835cSMarshall Clow _LIBCPP_INLINE_VISIBILITY 4922585835cSMarshall Clow typename enable_if<__is_transparent<_Compare, _K2>::value, bool>::type 4932585835cSMarshall Clow operator () ( const _K2& __x, const _CP& __y ) const 4942585835cSMarshall Clow {return static_cast<const _Compare&>(*this) (__x, __y.__cc.first);} 4952585835cSMarshall Clow 4962585835cSMarshall Clow template <typename _K2> 4972585835cSMarshall Clow _LIBCPP_INLINE_VISIBILITY 4982585835cSMarshall Clow typename enable_if<__is_transparent<_Compare, _K2>::value, bool>::type 4992585835cSMarshall Clow operator () (const _CP& __x, const _K2& __y) const 5002585835cSMarshall Clow {return static_cast<const _Compare&>(*this) (__x.__cc.first, __y);} 5012585835cSMarshall Clow#endif 5023e519524SHoward Hinnant}; 5033e519524SHoward Hinnant 504abb160e6SHoward Hinnanttemplate <class _Key, class _CP, class _Compare> 505abb160e6SHoward Hinnantclass __map_value_compare<_Key, _CP, _Compare, false> 5063e519524SHoward Hinnant{ 5073e519524SHoward Hinnant _Compare comp; 5083e519524SHoward Hinnant 5093e519524SHoward Hinnantpublic: 510848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 5111052ee39SHoward Hinnant __map_value_compare() 5121052ee39SHoward Hinnant _NOEXCEPT_(is_nothrow_default_constructible<_Compare>::value) 5131052ee39SHoward Hinnant : comp() {} 514848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 5151052ee39SHoward Hinnant __map_value_compare(_Compare c) 5161052ee39SHoward Hinnant _NOEXCEPT_(is_nothrow_copy_constructible<_Compare>::value) 5171052ee39SHoward Hinnant : comp(c) {} 518848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 5191052ee39SHoward Hinnant const _Compare& key_comp() const _NOEXCEPT {return comp;} 5203e519524SHoward Hinnant 521848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 5223e519524SHoward Hinnant bool operator()(const _CP& __x, const _CP& __y) const 523abb160e6SHoward Hinnant {return comp(__x.__cc.first, __y.__cc.first);} 524848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 5253e519524SHoward Hinnant bool operator()(const _CP& __x, const _Key& __y) const 526abb160e6SHoward Hinnant {return comp(__x.__cc.first, __y);} 527848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 5283e519524SHoward Hinnant bool operator()(const _Key& __x, const _CP& __y) const 529abb160e6SHoward Hinnant {return comp(__x, __y.__cc.first);} 530e3fbe143SMarshall Clow void swap(__map_value_compare&__y) 531e3fbe143SMarshall Clow _NOEXCEPT_(__is_nothrow_swappable<_Compare>::value) 532e3fbe143SMarshall Clow { 533e3fbe143SMarshall Clow using _VSTD::swap; 534e3fbe143SMarshall Clow swap(comp, __y.comp); 535e3fbe143SMarshall Clow } 5362585835cSMarshall Clow 5372585835cSMarshall Clow#if _LIBCPP_STD_VER > 11 5382585835cSMarshall Clow template <typename _K2> 5392585835cSMarshall Clow _LIBCPP_INLINE_VISIBILITY 5402585835cSMarshall Clow typename enable_if<__is_transparent<_Compare, _K2>::value, bool>::type 5412585835cSMarshall Clow operator () ( const _K2& __x, const _CP& __y ) const 5422585835cSMarshall Clow {return comp (__x, __y.__cc.first);} 5432585835cSMarshall Clow 5442585835cSMarshall Clow template <typename _K2> 5452585835cSMarshall Clow _LIBCPP_INLINE_VISIBILITY 5462585835cSMarshall Clow typename enable_if<__is_transparent<_Compare, _K2>::value, bool>::type 5472585835cSMarshall Clow operator () (const _CP& __x, const _K2& __y) const 5482585835cSMarshall Clow {return comp (__x.__cc.first, __y);} 5492585835cSMarshall Clow#endif 5503e519524SHoward Hinnant}; 5513e519524SHoward Hinnant 552e3fbe143SMarshall Clowtemplate <class _Key, class _CP, class _Compare, bool __b> 553e3fbe143SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY 554e3fbe143SMarshall Clowvoid 555e3fbe143SMarshall Clowswap(__map_value_compare<_Key, _CP, _Compare, __b>& __x, 556e3fbe143SMarshall Clow __map_value_compare<_Key, _CP, _Compare, __b>& __y) 557e3fbe143SMarshall Clow _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y))) 558e3fbe143SMarshall Clow{ 559e3fbe143SMarshall Clow __x.swap(__y); 560e3fbe143SMarshall Clow} 561e3fbe143SMarshall Clow 5623e519524SHoward Hinnanttemplate <class _Allocator> 5633e519524SHoward Hinnantclass __map_node_destructor 5643e519524SHoward Hinnant{ 5653e519524SHoward Hinnant typedef _Allocator allocator_type; 5663e519524SHoward Hinnant typedef allocator_traits<allocator_type> __alloc_traits; 567089a7cc5SEric Fiselier 5683e519524SHoward Hinnantpublic: 5693e519524SHoward Hinnant typedef typename __alloc_traits::pointer pointer; 5703e519524SHoward Hinnant 571089a7cc5SEric Fiselierprivate: 5723e519524SHoward Hinnant allocator_type& __na_; 5733e519524SHoward Hinnant 5743e519524SHoward Hinnant __map_node_destructor& operator=(const __map_node_destructor&); 5753e519524SHoward Hinnant 5763e519524SHoward Hinnantpublic: 5773e519524SHoward Hinnant bool __first_constructed; 5783e519524SHoward Hinnant bool __second_constructed; 5793e519524SHoward Hinnant 580848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 5811052ee39SHoward Hinnant explicit __map_node_destructor(allocator_type& __na) _NOEXCEPT 5823e519524SHoward Hinnant : __na_(__na), 5833e519524SHoward Hinnant __first_constructed(false), 5843e519524SHoward Hinnant __second_constructed(false) 5853e519524SHoward Hinnant {} 5863e519524SHoward Hinnant 5877609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 588848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 5891052ee39SHoward Hinnant __map_node_destructor(__tree_node_destructor<allocator_type>&& __x) _NOEXCEPT 5903e519524SHoward Hinnant : __na_(__x.__na_), 5913e519524SHoward Hinnant __first_constructed(__x.__value_constructed), 5923e519524SHoward Hinnant __second_constructed(__x.__value_constructed) 5933e519524SHoward Hinnant { 5943e519524SHoward Hinnant __x.__value_constructed = false; 5953e519524SHoward Hinnant } 596959cf8aeSHoward Hinnant#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 5973e519524SHoward Hinnant 598848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 5991052ee39SHoward Hinnant void operator()(pointer __p) _NOEXCEPT 6003e519524SHoward Hinnant { 6013e519524SHoward Hinnant if (__second_constructed) 60207d3eccdSHoward Hinnant __alloc_traits::destroy(__na_, _VSTD::addressof(__p->__value_.__cc.second)); 6033e519524SHoward Hinnant if (__first_constructed) 60407d3eccdSHoward Hinnant __alloc_traits::destroy(__na_, _VSTD::addressof(__p->__value_.__cc.first)); 6053e519524SHoward Hinnant if (__p) 6063e519524SHoward Hinnant __alloc_traits::deallocate(__na_, __p, 1); 6073e519524SHoward Hinnant } 6083e519524SHoward Hinnant}; 6093e519524SHoward Hinnant 610ce53420eSHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 611ce53420eSHoward Hinnant class map; 612ce53420eSHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 613ce53420eSHoward Hinnant class multimap; 614ce53420eSHoward Hinnanttemplate <class _TreeIterator> class __map_const_iterator; 6153e519524SHoward Hinnant 616089a7cc5SEric Fiselier#ifndef _LIBCPP_CXX03_LANG 6179fd9f84fSHoward Hinnant 6189fd9f84fSHoward Hinnanttemplate <class _Key, class _Tp> 6199fd9f84fSHoward Hinnantunion __value_type 6209fd9f84fSHoward Hinnant{ 6219fd9f84fSHoward Hinnant typedef _Key key_type; 6229fd9f84fSHoward Hinnant typedef _Tp mapped_type; 6239fd9f84fSHoward Hinnant typedef pair<const key_type, mapped_type> value_type; 6249fd9f84fSHoward Hinnant typedef pair<key_type, mapped_type> __nc_value_type; 6259fd9f84fSHoward Hinnant 6269fd9f84fSHoward Hinnant value_type __cc; 6279fd9f84fSHoward Hinnant __nc_value_type __nc; 6289fd9f84fSHoward Hinnant 6299fd9f84fSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 6309fd9f84fSHoward Hinnant __value_type& operator=(const __value_type& __v) 6319fd9f84fSHoward Hinnant {__nc = __v.__cc; return *this;} 6329fd9f84fSHoward Hinnant 6339fd9f84fSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 6349fd9f84fSHoward Hinnant __value_type& operator=(__value_type&& __v) 6355e3ea4ddSEric Fiselier {__nc = _VSTD::move(__v.__nc); return *this;} 6369fd9f84fSHoward Hinnant 6375e3ea4ddSEric Fiselier template <class _ValueTp, 6385e3ea4ddSEric Fiselier class = typename enable_if< 6395e3ea4ddSEric Fiselier __is_same_uncvref<_ValueTp, value_type>::value 6405e3ea4ddSEric Fiselier >::type 6415e3ea4ddSEric Fiselier > 6429fd9f84fSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 6435e3ea4ddSEric Fiselier __value_type& operator=(_ValueTp&& __v) { 6445e3ea4ddSEric Fiselier __nc = _VSTD::forward<_ValueTp>(__v); return *this; 6455e3ea4ddSEric Fiselier } 6465e3ea4ddSEric Fiselier 6475e3ea4ddSEric Fiselierprivate: 6485e3ea4ddSEric Fiselier __value_type() _LIBCPP_EQUAL_DELETE; 6495e3ea4ddSEric Fiselier ~__value_type() _LIBCPP_EQUAL_DELETE; 6505e3ea4ddSEric Fiselier __value_type(const __value_type& __v) _LIBCPP_EQUAL_DELETE; 6515e3ea4ddSEric Fiselier __value_type(__value_type&& __v) _LIBCPP_EQUAL_DELETE; 6529fd9f84fSHoward Hinnant}; 6539fd9f84fSHoward Hinnant 6549fd9f84fSHoward Hinnant#else 6559fd9f84fSHoward Hinnant 6569fd9f84fSHoward Hinnanttemplate <class _Key, class _Tp> 6579fd9f84fSHoward Hinnantstruct __value_type 6589fd9f84fSHoward Hinnant{ 6599fd9f84fSHoward Hinnant typedef _Key key_type; 6609fd9f84fSHoward Hinnant typedef _Tp mapped_type; 6619fd9f84fSHoward Hinnant typedef pair<const key_type, mapped_type> value_type; 6629fd9f84fSHoward Hinnant 6639fd9f84fSHoward Hinnant value_type __cc; 6649fd9f84fSHoward Hinnant 6655e3ea4ddSEric Fiselierprivate: 6665e3ea4ddSEric Fiselier __value_type(); 6675e3ea4ddSEric Fiselier __value_type(__value_type const&); 6685e3ea4ddSEric Fiselier __value_type& operator=(__value_type const&); 6695e3ea4ddSEric Fiselier ~__value_type(); 6709fd9f84fSHoward Hinnant}; 6719fd9f84fSHoward Hinnant 6729fd9f84fSHoward Hinnant#endif 6739fd9f84fSHoward Hinnant 674b3be398cSEric Fiseliertemplate <class _Tp> 675b3be398cSEric Fiselierstruct __extract_key_value_types; 676b3be398cSEric Fiselier 677b3be398cSEric Fiseliertemplate <class _Key, class _Tp> 678b3be398cSEric Fiselierstruct __extract_key_value_types<__value_type<_Key, _Tp> > 679b3be398cSEric Fiselier{ 680b3be398cSEric Fiselier typedef _Key const __key_type; 681b3be398cSEric Fiselier typedef _Tp __mapped_type; 682b3be398cSEric Fiselier}; 683b3be398cSEric Fiselier 6843e519524SHoward Hinnanttemplate <class _TreeIterator> 685*e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS __map_iterator 6863e519524SHoward Hinnant{ 687089a7cc5SEric Fiselier typedef typename _TreeIterator::_NodeTypes _NodeTypes; 688089a7cc5SEric Fiselier typedef typename _TreeIterator::__pointer_traits __pointer_traits; 689089a7cc5SEric Fiselier 6903e519524SHoward Hinnant _TreeIterator __i_; 6913e519524SHoward Hinnant 6923e519524SHoward Hinnantpublic: 6933e519524SHoward Hinnant typedef bidirectional_iterator_tag iterator_category; 694089a7cc5SEric Fiselier typedef typename _NodeTypes::__map_value_type value_type; 6953e519524SHoward Hinnant typedef typename _TreeIterator::difference_type difference_type; 6963e519524SHoward Hinnant typedef value_type& reference; 697089a7cc5SEric Fiselier typedef typename _NodeTypes::__map_value_type_pointer pointer; 6983e519524SHoward Hinnant 699848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 7001052ee39SHoward Hinnant __map_iterator() _NOEXCEPT {} 7013e519524SHoward Hinnant 702848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 7031052ee39SHoward Hinnant __map_iterator(_TreeIterator __i) _NOEXCEPT : __i_(__i) {} 7043e519524SHoward Hinnant 705848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 70607d3eccdSHoward Hinnant reference operator*() const {return __i_->__cc;} 707848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 70807d3eccdSHoward Hinnant pointer operator->() const {return pointer_traits<pointer>::pointer_to(__i_->__cc);} 7093e519524SHoward Hinnant 710848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 7113e519524SHoward Hinnant __map_iterator& operator++() {++__i_; return *this;} 712848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 7133e519524SHoward Hinnant __map_iterator operator++(int) 7143e519524SHoward Hinnant { 7153e519524SHoward Hinnant __map_iterator __t(*this); 7163e519524SHoward Hinnant ++(*this); 7173e519524SHoward Hinnant return __t; 7183e519524SHoward Hinnant } 7193e519524SHoward Hinnant 720848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 7213e519524SHoward Hinnant __map_iterator& operator--() {--__i_; return *this;} 722848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 7233e519524SHoward Hinnant __map_iterator operator--(int) 7243e519524SHoward Hinnant { 7253e519524SHoward Hinnant __map_iterator __t(*this); 7263e519524SHoward Hinnant --(*this); 7273e519524SHoward Hinnant return __t; 7283e519524SHoward Hinnant } 7293e519524SHoward Hinnant 730848a5374SHoward Hinnant friend _LIBCPP_INLINE_VISIBILITY 731848a5374SHoward Hinnant bool operator==(const __map_iterator& __x, const __map_iterator& __y) 7323e519524SHoward Hinnant {return __x.__i_ == __y.__i_;} 733848a5374SHoward Hinnant friend 734848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 735848a5374SHoward Hinnant bool operator!=(const __map_iterator& __x, const __map_iterator& __y) 7363e519524SHoward Hinnant {return __x.__i_ != __y.__i_;} 7373e519524SHoward Hinnant 738*e2f2d1edSEric Fiselier template <class, class, class, class> friend class _LIBCPP_TEMPLATE_VIS map; 739*e2f2d1edSEric Fiselier template <class, class, class, class> friend class _LIBCPP_TEMPLATE_VIS multimap; 740*e2f2d1edSEric Fiselier template <class> friend class _LIBCPP_TEMPLATE_VIS __map_const_iterator; 7413e519524SHoward Hinnant}; 7423e519524SHoward Hinnant 7433e519524SHoward Hinnanttemplate <class _TreeIterator> 744*e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS __map_const_iterator 7453e519524SHoward Hinnant{ 746089a7cc5SEric Fiselier typedef typename _TreeIterator::_NodeTypes _NodeTypes; 747089a7cc5SEric Fiselier typedef typename _TreeIterator::__pointer_traits __pointer_traits; 748089a7cc5SEric Fiselier 7493e519524SHoward Hinnant _TreeIterator __i_; 7503e519524SHoward Hinnant 7513e519524SHoward Hinnantpublic: 7523e519524SHoward Hinnant typedef bidirectional_iterator_tag iterator_category; 753089a7cc5SEric Fiselier typedef typename _NodeTypes::__map_value_type value_type; 7543e519524SHoward Hinnant typedef typename _TreeIterator::difference_type difference_type; 7553e519524SHoward Hinnant typedef const value_type& reference; 756089a7cc5SEric Fiselier typedef typename _NodeTypes::__const_map_value_type_pointer pointer; 7573e519524SHoward Hinnant 758848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 7591052ee39SHoward Hinnant __map_const_iterator() _NOEXCEPT {} 7603e519524SHoward Hinnant 761848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 7621052ee39SHoward Hinnant __map_const_iterator(_TreeIterator __i) _NOEXCEPT : __i_(__i) {} 763848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 764b3be398cSEric Fiselier __map_const_iterator(__map_iterator< 765b3be398cSEric Fiselier typename _TreeIterator::__non_const_iterator> __i) _NOEXCEPT 7663e519524SHoward Hinnant : __i_(__i.__i_) {} 7673e519524SHoward Hinnant 768848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 76907d3eccdSHoward Hinnant reference operator*() const {return __i_->__cc;} 770848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 77107d3eccdSHoward Hinnant pointer operator->() const {return pointer_traits<pointer>::pointer_to(__i_->__cc);} 7723e519524SHoward Hinnant 773848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 7743e519524SHoward Hinnant __map_const_iterator& operator++() {++__i_; return *this;} 775848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 7763e519524SHoward Hinnant __map_const_iterator operator++(int) 7773e519524SHoward Hinnant { 7783e519524SHoward Hinnant __map_const_iterator __t(*this); 7793e519524SHoward Hinnant ++(*this); 7803e519524SHoward Hinnant return __t; 7813e519524SHoward Hinnant } 7823e519524SHoward Hinnant 783848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 7843e519524SHoward Hinnant __map_const_iterator& operator--() {--__i_; return *this;} 785848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 7863e519524SHoward Hinnant __map_const_iterator operator--(int) 7873e519524SHoward Hinnant { 7883e519524SHoward Hinnant __map_const_iterator __t(*this); 7893e519524SHoward Hinnant --(*this); 7903e519524SHoward Hinnant return __t; 7913e519524SHoward Hinnant } 7923e519524SHoward Hinnant 793848a5374SHoward Hinnant friend _LIBCPP_INLINE_VISIBILITY 794848a5374SHoward Hinnant bool operator==(const __map_const_iterator& __x, const __map_const_iterator& __y) 7953e519524SHoward Hinnant {return __x.__i_ == __y.__i_;} 796848a5374SHoward Hinnant friend _LIBCPP_INLINE_VISIBILITY 797848a5374SHoward Hinnant bool operator!=(const __map_const_iterator& __x, const __map_const_iterator& __y) 7983e519524SHoward Hinnant {return __x.__i_ != __y.__i_;} 7993e519524SHoward Hinnant 800*e2f2d1edSEric Fiselier template <class, class, class, class> friend class _LIBCPP_TEMPLATE_VIS map; 801*e2f2d1edSEric Fiselier template <class, class, class, class> friend class _LIBCPP_TEMPLATE_VIS multimap; 802*e2f2d1edSEric Fiselier template <class, class, class> friend class _LIBCPP_TEMPLATE_VIS __tree_const_iterator; 8033e519524SHoward Hinnant}; 8043e519524SHoward Hinnant 8053e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare = less<_Key>, 8063e519524SHoward Hinnant class _Allocator = allocator<pair<const _Key, _Tp> > > 807*e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS map 8083e519524SHoward Hinnant{ 8093e519524SHoward Hinnantpublic: 8103e519524SHoward Hinnant // types: 8113e519524SHoward Hinnant typedef _Key key_type; 8123e519524SHoward Hinnant typedef _Tp mapped_type; 8133e519524SHoward Hinnant typedef pair<const key_type, mapped_type> value_type; 81407d3eccdSHoward Hinnant typedef pair<key_type, mapped_type> __nc_value_type; 8153e519524SHoward Hinnant typedef _Compare key_compare; 8163e519524SHoward Hinnant typedef _Allocator allocator_type; 8173e519524SHoward Hinnant typedef value_type& reference; 8183e519524SHoward Hinnant typedef const value_type& const_reference; 8193e519524SHoward Hinnant 82094f89aeeSMarshall Clow static_assert((is_same<typename allocator_type::value_type, value_type>::value), 82194f89aeeSMarshall Clow "Allocator::value_type must be same type as value_type"); 82294f89aeeSMarshall Clow 823*e2f2d1edSEric Fiselier class _LIBCPP_TEMPLATE_VIS value_compare 8243e519524SHoward Hinnant : public binary_function<value_type, value_type, bool> 8253e519524SHoward Hinnant { 8263e519524SHoward Hinnant friend class map; 8273e519524SHoward Hinnant protected: 8283e519524SHoward Hinnant key_compare comp; 8293e519524SHoward Hinnant 830848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY value_compare(key_compare c) : comp(c) {} 8313e519524SHoward Hinnant public: 832848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 8333e519524SHoward Hinnant bool operator()(const value_type& __x, const value_type& __y) const 8343e519524SHoward Hinnant {return comp(__x.first, __y.first);} 8353e519524SHoward Hinnant }; 8363e519524SHoward Hinnant 8373e519524SHoward Hinnantprivate: 83807d3eccdSHoward Hinnant 8399fd9f84fSHoward Hinnant typedef _VSTD::__value_type<key_type, mapped_type> __value_type; 840abb160e6SHoward Hinnant typedef __map_value_compare<key_type, __value_type, key_compare> __vc; 8411f508014SMarshall Clow typedef typename __rebind_alloc_helper<allocator_traits<allocator_type>, 8421f508014SMarshall Clow __value_type>::type __allocator_type; 8433e519524SHoward Hinnant typedef __tree<__value_type, __vc, __allocator_type> __base; 8443e519524SHoward Hinnant typedef typename __base::__node_traits __node_traits; 8453e519524SHoward Hinnant typedef allocator_traits<allocator_type> __alloc_traits; 8463e519524SHoward Hinnant 8473e519524SHoward Hinnant __base __tree_; 8483e519524SHoward Hinnant 8493e519524SHoward Hinnantpublic: 8503e519524SHoward Hinnant typedef typename __alloc_traits::pointer pointer; 8513e519524SHoward Hinnant typedef typename __alloc_traits::const_pointer const_pointer; 8523e519524SHoward Hinnant typedef typename __alloc_traits::size_type size_type; 8533e519524SHoward Hinnant typedef typename __alloc_traits::difference_type difference_type; 8543e519524SHoward Hinnant typedef __map_iterator<typename __base::iterator> iterator; 8553e519524SHoward Hinnant typedef __map_const_iterator<typename __base::const_iterator> const_iterator; 856ce48a113SHoward Hinnant typedef _VSTD::reverse_iterator<iterator> reverse_iterator; 857ce48a113SHoward Hinnant typedef _VSTD::reverse_iterator<const_iterator> const_reverse_iterator; 8583e519524SHoward Hinnant 859848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 860415a24e4SMarshall Clow map() 861415a24e4SMarshall Clow _NOEXCEPT_( 862415a24e4SMarshall Clow is_nothrow_default_constructible<allocator_type>::value && 863415a24e4SMarshall Clow is_nothrow_default_constructible<key_compare>::value && 864415a24e4SMarshall Clow is_nothrow_copy_constructible<key_compare>::value) 865415a24e4SMarshall Clow : __tree_(__vc(key_compare())) {} 866415a24e4SMarshall Clow 867415a24e4SMarshall Clow _LIBCPP_INLINE_VISIBILITY 868415a24e4SMarshall Clow explicit map(const key_compare& __comp) 8691052ee39SHoward Hinnant _NOEXCEPT_( 8701052ee39SHoward Hinnant is_nothrow_default_constructible<allocator_type>::value && 8711052ee39SHoward Hinnant is_nothrow_copy_constructible<key_compare>::value) 8723e519524SHoward Hinnant : __tree_(__vc(__comp)) {} 8733e519524SHoward Hinnant 874848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 8753e519524SHoward Hinnant explicit map(const key_compare& __comp, const allocator_type& __a) 8762a10c960SMarshall Clow : __tree_(__vc(__comp), typename __base::allocator_type(__a)) {} 8773e519524SHoward Hinnant 8783e519524SHoward Hinnant template <class _InputIterator> 879848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 8803e519524SHoward Hinnant map(_InputIterator __f, _InputIterator __l, 8813e519524SHoward Hinnant const key_compare& __comp = key_compare()) 8823e519524SHoward Hinnant : __tree_(__vc(__comp)) 8833e519524SHoward Hinnant { 8843e519524SHoward Hinnant insert(__f, __l); 8853e519524SHoward Hinnant } 8863e519524SHoward Hinnant 8873e519524SHoward Hinnant template <class _InputIterator> 888848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 8893e519524SHoward Hinnant map(_InputIterator __f, _InputIterator __l, 8903e519524SHoward Hinnant const key_compare& __comp, const allocator_type& __a) 8912a10c960SMarshall Clow : __tree_(__vc(__comp), typename __base::allocator_type(__a)) 8923e519524SHoward Hinnant { 8933e519524SHoward Hinnant insert(__f, __l); 8943e519524SHoward Hinnant } 8953e519524SHoward Hinnant 896fbc317d4SMarshall Clow#if _LIBCPP_STD_VER > 11 897fbc317d4SMarshall Clow template <class _InputIterator> 898fbc317d4SMarshall Clow _LIBCPP_INLINE_VISIBILITY 899fbc317d4SMarshall Clow map(_InputIterator __f, _InputIterator __l, const allocator_type& __a) 900fbc317d4SMarshall Clow : map(__f, __l, key_compare(), __a) {} 901fbc317d4SMarshall Clow#endif 902fbc317d4SMarshall Clow 903848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 9043e519524SHoward Hinnant map(const map& __m) 9053e519524SHoward Hinnant : __tree_(__m.__tree_) 9063e519524SHoward Hinnant { 9073e519524SHoward Hinnant insert(__m.begin(), __m.end()); 9083e519524SHoward Hinnant } 9093e519524SHoward Hinnant 9105a33687dSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 9115a33687dSHoward Hinnant map& operator=(const map& __m) 9125a33687dSHoward Hinnant { 9132ee83725SMarshall Clow#ifndef _LIBCPP_CXX03_LANG 9145a33687dSHoward Hinnant __tree_ = __m.__tree_; 91507d3eccdSHoward Hinnant#else 91674cf6ff5SMarshall Clow if (this != &__m) { 91707d3eccdSHoward Hinnant __tree_.clear(); 91807d3eccdSHoward Hinnant __tree_.value_comp() = __m.__tree_.value_comp(); 91907d3eccdSHoward Hinnant __tree_.__copy_assign_alloc(__m.__tree_); 92007d3eccdSHoward Hinnant insert(__m.begin(), __m.end()); 92174cf6ff5SMarshall Clow } 92207d3eccdSHoward Hinnant#endif 9235a33687dSHoward Hinnant return *this; 9245a33687dSHoward Hinnant } 9255a33687dSHoward Hinnant 9267609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 9273e519524SHoward Hinnant 928848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 9293e519524SHoward Hinnant map(map&& __m) 9301052ee39SHoward Hinnant _NOEXCEPT_(is_nothrow_move_constructible<__base>::value) 931ce48a113SHoward Hinnant : __tree_(_VSTD::move(__m.__tree_)) 9323e519524SHoward Hinnant { 9333e519524SHoward Hinnant } 9343e519524SHoward Hinnant 9353e519524SHoward Hinnant map(map&& __m, const allocator_type& __a); 9363e519524SHoward Hinnant 937848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 93854976f26SHoward Hinnant map& operator=(map&& __m) 93954976f26SHoward Hinnant _NOEXCEPT_(is_nothrow_move_assignable<__base>::value) 94054976f26SHoward Hinnant { 94154976f26SHoward Hinnant __tree_ = _VSTD::move(__m.__tree_); 94254976f26SHoward Hinnant return *this; 94354976f26SHoward Hinnant } 94454976f26SHoward Hinnant 94554976f26SHoward Hinnant#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 94654976f26SHoward Hinnant 94754976f26SHoward Hinnant#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS 94854976f26SHoward Hinnant 94954976f26SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 9503e519524SHoward Hinnant map(initializer_list<value_type> __il, const key_compare& __comp = key_compare()) 9513e519524SHoward Hinnant : __tree_(__vc(__comp)) 9523e519524SHoward Hinnant { 9533e519524SHoward Hinnant insert(__il.begin(), __il.end()); 9543e519524SHoward Hinnant } 9553e519524SHoward Hinnant 956848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 9573e519524SHoward Hinnant map(initializer_list<value_type> __il, const key_compare& __comp, const allocator_type& __a) 9582a10c960SMarshall Clow : __tree_(__vc(__comp), typename __base::allocator_type(__a)) 9593e519524SHoward Hinnant { 9603e519524SHoward Hinnant insert(__il.begin(), __il.end()); 9613e519524SHoward Hinnant } 9623e519524SHoward Hinnant 963fbc317d4SMarshall Clow#if _LIBCPP_STD_VER > 11 964fbc317d4SMarshall Clow _LIBCPP_INLINE_VISIBILITY 965fbc317d4SMarshall Clow map(initializer_list<value_type> __il, const allocator_type& __a) 966fbc317d4SMarshall Clow : map(__il, key_compare(), __a) {} 967fbc317d4SMarshall Clow#endif 968fbc317d4SMarshall Clow 969848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 9703e519524SHoward Hinnant map& operator=(initializer_list<value_type> __il) 9713e519524SHoward Hinnant { 9723e519524SHoward Hinnant __tree_.__assign_unique(__il.begin(), __il.end()); 9733e519524SHoward Hinnant return *this; 9743e519524SHoward Hinnant } 9753e519524SHoward Hinnant 97654976f26SHoward Hinnant#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS 9773e519524SHoward Hinnant 978848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 9793e519524SHoward Hinnant explicit map(const allocator_type& __a) 9802a10c960SMarshall Clow : __tree_(typename __base::allocator_type(__a)) 9813e519524SHoward Hinnant { 9823e519524SHoward Hinnant } 9833e519524SHoward Hinnant 984848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 9853e519524SHoward Hinnant map(const map& __m, const allocator_type& __a) 9862a10c960SMarshall Clow : __tree_(__m.__tree_.value_comp(), typename __base::allocator_type(__a)) 9873e519524SHoward Hinnant { 9883e519524SHoward Hinnant insert(__m.begin(), __m.end()); 9893e519524SHoward Hinnant } 9903e519524SHoward Hinnant 991848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 9921052ee39SHoward Hinnant iterator begin() _NOEXCEPT {return __tree_.begin();} 993848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 9941052ee39SHoward Hinnant const_iterator begin() const _NOEXCEPT {return __tree_.begin();} 995848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 9961052ee39SHoward Hinnant iterator end() _NOEXCEPT {return __tree_.end();} 997848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 9981052ee39SHoward Hinnant const_iterator end() const _NOEXCEPT {return __tree_.end();} 9993e519524SHoward Hinnant 1000848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 10011052ee39SHoward Hinnant reverse_iterator rbegin() _NOEXCEPT {return reverse_iterator(end());} 1002848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 10031052ee39SHoward Hinnant const_reverse_iterator rbegin() const _NOEXCEPT 10041052ee39SHoward Hinnant {return const_reverse_iterator(end());} 1005848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 10061052ee39SHoward Hinnant reverse_iterator rend() _NOEXCEPT 10071052ee39SHoward Hinnant {return reverse_iterator(begin());} 1008848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 10091052ee39SHoward Hinnant const_reverse_iterator rend() const _NOEXCEPT 10101052ee39SHoward Hinnant {return const_reverse_iterator(begin());} 10113e519524SHoward Hinnant 1012848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 10131052ee39SHoward Hinnant const_iterator cbegin() const _NOEXCEPT {return begin();} 1014848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 10151052ee39SHoward Hinnant const_iterator cend() const _NOEXCEPT {return end();} 1016848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 10171052ee39SHoward Hinnant const_reverse_iterator crbegin() const _NOEXCEPT {return rbegin();} 1018848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 10191052ee39SHoward Hinnant const_reverse_iterator crend() const _NOEXCEPT {return rend();} 10203e519524SHoward Hinnant 1021848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 10221052ee39SHoward Hinnant bool empty() const _NOEXCEPT {return __tree_.size() == 0;} 1023848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 10241052ee39SHoward Hinnant size_type size() const _NOEXCEPT {return __tree_.size();} 1025848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 10261052ee39SHoward Hinnant size_type max_size() const _NOEXCEPT {return __tree_.max_size();} 10273e519524SHoward Hinnant 10283e519524SHoward Hinnant mapped_type& operator[](const key_type& __k); 102954f0cda6SEric Fiselier#ifndef _LIBCPP_CXX03_LANG 10303e519524SHoward Hinnant mapped_type& operator[](key_type&& __k); 10313e519524SHoward Hinnant#endif 10323e519524SHoward Hinnant 10333e519524SHoward Hinnant mapped_type& at(const key_type& __k); 10343e519524SHoward Hinnant const mapped_type& at(const key_type& __k) const; 10353e519524SHoward Hinnant 1036848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 10372a10c960SMarshall Clow allocator_type get_allocator() const _NOEXCEPT {return allocator_type(__tree_.__alloc());} 1038848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 10393e519524SHoward Hinnant key_compare key_comp() const {return __tree_.value_comp().key_comp();} 1040848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 10413e519524SHoward Hinnant value_compare value_comp() const {return value_compare(__tree_.value_comp().key_comp());} 10423e519524SHoward Hinnant 10435e3ea4ddSEric Fiselier#ifndef _LIBCPP_CXX03_LANG 10445e3ea4ddSEric Fiselier template <class ..._Args> 10455e3ea4ddSEric Fiselier _LIBCPP_INLINE_VISIBILITY 10465e3ea4ddSEric Fiselier pair<iterator, bool> emplace(_Args&& ...__args) { 10475e3ea4ddSEric Fiselier return __tree_.__emplace_unique(_VSTD::forward<_Args>(__args)...); 10485e3ea4ddSEric Fiselier } 10497609c9b6SHoward Hinnant 10508b805c91SHoward Hinnant template <class ..._Args> 10515e3ea4ddSEric Fiselier _LIBCPP_INLINE_VISIBILITY 10525e3ea4ddSEric Fiselier iterator emplace_hint(const_iterator __p, _Args&& ...__args) { 10535e3ea4ddSEric Fiselier return __tree_.__emplace_hint_unique(__p.__i_, _VSTD::forward<_Args>(__args)...); 10545e3ea4ddSEric Fiselier } 10557609c9b6SHoward Hinnant 1056c003db1fSHoward Hinnant template <class _Pp, 1057c003db1fSHoward Hinnant class = typename enable_if<is_constructible<value_type, _Pp>::value>::type> 1058848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 1059c003db1fSHoward Hinnant pair<iterator, bool> insert(_Pp&& __p) 1060c003db1fSHoward Hinnant {return __tree_.__insert_unique(_VSTD::forward<_Pp>(__p));} 10613e519524SHoward Hinnant 1062c003db1fSHoward Hinnant template <class _Pp, 1063c003db1fSHoward Hinnant class = typename enable_if<is_constructible<value_type, _Pp>::value>::type> 1064848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 1065c003db1fSHoward Hinnant iterator insert(const_iterator __pos, _Pp&& __p) 1066c003db1fSHoward Hinnant {return __tree_.__insert_unique(__pos.__i_, _VSTD::forward<_Pp>(__p));} 10673e519524SHoward Hinnant 10685e3ea4ddSEric Fiselier#endif // _LIBCPP_CXX03_LANG 10693e519524SHoward Hinnant 1070848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 10713e519524SHoward Hinnant pair<iterator, bool> 10723e519524SHoward Hinnant insert(const value_type& __v) {return __tree_.__insert_unique(__v);} 10733e519524SHoward Hinnant 1074848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 10753e519524SHoward Hinnant iterator 10763e519524SHoward Hinnant insert(const_iterator __p, const value_type& __v) 10773e519524SHoward Hinnant {return __tree_.__insert_unique(__p.__i_, __v);} 10783e519524SHoward Hinnant 10797a9f500fSEric Fiselier#ifndef _LIBCPP_CXX03_LANG 1080afc9ff99SMarshall Clow _LIBCPP_INLINE_VISIBILITY 1081afc9ff99SMarshall Clow pair<iterator, bool> 10825e3ea4ddSEric Fiselier insert(value_type&& __v) {return __tree_.__insert_unique(_VSTD::move(__v));} 1083afc9ff99SMarshall Clow 1084afc9ff99SMarshall Clow _LIBCPP_INLINE_VISIBILITY 10855e3ea4ddSEric Fiselier iterator insert(const_iterator __p, value_type&& __v) 10865e3ea4ddSEric Fiselier {return __tree_.__insert_unique(__p.__i_, _VSTD::move(__v));} 1087afc9ff99SMarshall Clow#endif 1088afc9ff99SMarshall Clow 10893e519524SHoward Hinnant template <class _InputIterator> 1090848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 10913e519524SHoward Hinnant void insert(_InputIterator __f, _InputIterator __l) 10923e519524SHoward Hinnant { 10933e519524SHoward Hinnant for (const_iterator __e = cend(); __f != __l; ++__f) 10943e519524SHoward Hinnant insert(__e.__i_, *__f); 10953e519524SHoward Hinnant } 10963e519524SHoward Hinnant 109754976f26SHoward Hinnant#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS 109854976f26SHoward Hinnant 1099848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 11003e519524SHoward Hinnant void insert(initializer_list<value_type> __il) 11013e519524SHoward Hinnant {insert(__il.begin(), __il.end());} 11023e519524SHoward Hinnant 110354976f26SHoward Hinnant#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS 110454976f26SHoward Hinnant 11058aaf517dSMarshall Clow#if _LIBCPP_STD_VER > 14 110654f0cda6SEric Fiselier 11078aaf517dSMarshall Clow template <class... _Args> 11088aaf517dSMarshall Clow _LIBCPP_INLINE_VISIBILITY 11098aaf517dSMarshall Clow pair<iterator, bool> try_emplace(const key_type& __k, _Args&&... __args) 11108aaf517dSMarshall Clow { 111154f0cda6SEric Fiselier return __tree_.__emplace_unique_key_args(__k, 111254f0cda6SEric Fiselier _VSTD::piecewise_construct, 111354f0cda6SEric Fiselier _VSTD::forward_as_tuple(__k), 111454f0cda6SEric Fiselier _VSTD::forward_as_tuple(_VSTD::forward<_Args>(__args)...)); 11158aaf517dSMarshall Clow } 11168aaf517dSMarshall Clow 11178aaf517dSMarshall Clow template <class... _Args> 11188aaf517dSMarshall Clow _LIBCPP_INLINE_VISIBILITY 11198aaf517dSMarshall Clow pair<iterator, bool> try_emplace(key_type&& __k, _Args&&... __args) 11208aaf517dSMarshall Clow { 112154f0cda6SEric Fiselier return __tree_.__emplace_unique_key_args(__k, 112254f0cda6SEric Fiselier _VSTD::piecewise_construct, 112354f0cda6SEric Fiselier _VSTD::forward_as_tuple(_VSTD::move(__k)), 112454f0cda6SEric Fiselier _VSTD::forward_as_tuple(_VSTD::forward<_Args>(__args)...)); 11258aaf517dSMarshall Clow } 11268aaf517dSMarshall Clow 11278aaf517dSMarshall Clow template <class... _Args> 11288aaf517dSMarshall Clow _LIBCPP_INLINE_VISIBILITY 11298aaf517dSMarshall Clow iterator try_emplace(const_iterator __h, const key_type& __k, _Args&&... __args) 11308aaf517dSMarshall Clow { 113154f0cda6SEric Fiselier return __tree_.__emplace_hint_unique_key_args(__h.__i_, __k, 113254f0cda6SEric Fiselier _VSTD::piecewise_construct, 113354f0cda6SEric Fiselier _VSTD::forward_as_tuple(__k), 11348aaf517dSMarshall Clow _VSTD::forward_as_tuple(_VSTD::forward<_Args>(__args)...)); 11358aaf517dSMarshall Clow } 11368aaf517dSMarshall Clow 11378aaf517dSMarshall Clow template <class... _Args> 11388aaf517dSMarshall Clow _LIBCPP_INLINE_VISIBILITY 11398aaf517dSMarshall Clow iterator try_emplace(const_iterator __h, key_type&& __k, _Args&&... __args) 11408aaf517dSMarshall Clow { 114154f0cda6SEric Fiselier return __tree_.__emplace_hint_unique_key_args(__h.__i_, __k, 114254f0cda6SEric Fiselier _VSTD::piecewise_construct, 114354f0cda6SEric Fiselier _VSTD::forward_as_tuple(_VSTD::move(__k)), 11448aaf517dSMarshall Clow _VSTD::forward_as_tuple(_VSTD::forward<_Args>(__args)...)); 11458aaf517dSMarshall Clow } 11468aaf517dSMarshall Clow 11478aaf517dSMarshall Clow template <class _Vp> 11488aaf517dSMarshall Clow _LIBCPP_INLINE_VISIBILITY 11498aaf517dSMarshall Clow pair<iterator, bool> insert_or_assign(const key_type& __k, _Vp&& __v) 11508aaf517dSMarshall Clow { 11518aaf517dSMarshall Clow iterator __p = lower_bound(__k); 11528aaf517dSMarshall Clow if ( __p != end() && !key_comp()(__k, __p->first)) 11538aaf517dSMarshall Clow { 11548aaf517dSMarshall Clow __p->second = _VSTD::forward<_Vp>(__v); 11558aaf517dSMarshall Clow return _VSTD::make_pair(__p, false); 11568aaf517dSMarshall Clow } 11578aaf517dSMarshall Clow return _VSTD::make_pair(emplace_hint(__p, __k, _VSTD::forward<_Vp>(__v)), true); 11588aaf517dSMarshall Clow } 11598aaf517dSMarshall Clow 11608aaf517dSMarshall Clow template <class _Vp> 11618aaf517dSMarshall Clow _LIBCPP_INLINE_VISIBILITY 11628aaf517dSMarshall Clow pair<iterator, bool> insert_or_assign(key_type&& __k, _Vp&& __v) 11638aaf517dSMarshall Clow { 11648aaf517dSMarshall Clow iterator __p = lower_bound(__k); 11658aaf517dSMarshall Clow if ( __p != end() && !key_comp()(__k, __p->first)) 11668aaf517dSMarshall Clow { 11678aaf517dSMarshall Clow __p->second = _VSTD::forward<_Vp>(__v); 11688aaf517dSMarshall Clow return _VSTD::make_pair(__p, false); 11698aaf517dSMarshall Clow } 11708aaf517dSMarshall Clow return _VSTD::make_pair(emplace_hint(__p, _VSTD::move(__k), _VSTD::forward<_Vp>(__v)), true); 11718aaf517dSMarshall Clow } 11728aaf517dSMarshall Clow 11738aaf517dSMarshall Clow template <class _Vp> 11748aaf517dSMarshall Clow _LIBCPP_INLINE_VISIBILITY 11758aaf517dSMarshall Clow iterator insert_or_assign(const_iterator __h, const key_type& __k, _Vp&& __v) 11768aaf517dSMarshall Clow { 11778aaf517dSMarshall Clow iterator __p = lower_bound(__k); 11788aaf517dSMarshall Clow if ( __p != end() && !key_comp()(__k, __p->first)) 11798aaf517dSMarshall Clow { 11808aaf517dSMarshall Clow __p->second = _VSTD::forward<_Vp>(__v); 11818aaf517dSMarshall Clow return __p; 11828aaf517dSMarshall Clow } 11838aaf517dSMarshall Clow return emplace_hint(__h, __k, _VSTD::forward<_Vp>(__v)); 11848aaf517dSMarshall Clow } 11858aaf517dSMarshall Clow 11868aaf517dSMarshall Clow template <class _Vp> 11878aaf517dSMarshall Clow _LIBCPP_INLINE_VISIBILITY 11888aaf517dSMarshall Clow iterator insert_or_assign(const_iterator __h, key_type&& __k, _Vp&& __v) 11898aaf517dSMarshall Clow { 11908aaf517dSMarshall Clow iterator __p = lower_bound(__k); 11918aaf517dSMarshall Clow if ( __p != end() && !key_comp()(__k, __p->first)) 11928aaf517dSMarshall Clow { 11938aaf517dSMarshall Clow __p->second = _VSTD::forward<_Vp>(__v); 11948aaf517dSMarshall Clow return __p; 11958aaf517dSMarshall Clow } 11968aaf517dSMarshall Clow return emplace_hint(__h, _VSTD::move(__k), _VSTD::forward<_Vp>(__v)); 11978aaf517dSMarshall Clow } 119854f0cda6SEric Fiselier 11998aaf517dSMarshall Clow#endif 12008aaf517dSMarshall Clow 1201848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 12023e519524SHoward Hinnant iterator erase(const_iterator __p) {return __tree_.erase(__p.__i_);} 1203848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 1204ec392968SMarshall Clow iterator erase(iterator __p) {return __tree_.erase(__p.__i_);} 1205ec392968SMarshall Clow _LIBCPP_INLINE_VISIBILITY 12063e519524SHoward Hinnant size_type erase(const key_type& __k) 12073e519524SHoward Hinnant {return __tree_.__erase_unique(__k);} 1208848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 12093e519524SHoward Hinnant iterator erase(const_iterator __f, const_iterator __l) 12103e519524SHoward Hinnant {return __tree_.erase(__f.__i_, __l.__i_);} 1211848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 12121052ee39SHoward Hinnant void clear() _NOEXCEPT {__tree_.clear();} 12133e519524SHoward Hinnant 1214848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 12151052ee39SHoward Hinnant void swap(map& __m) 12161052ee39SHoward Hinnant _NOEXCEPT_(__is_nothrow_swappable<__base>::value) 12171052ee39SHoward Hinnant {__tree_.swap(__m.__tree_);} 12183e519524SHoward Hinnant 1219848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 12203e519524SHoward Hinnant iterator find(const key_type& __k) {return __tree_.find(__k);} 1221848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 12223e519524SHoward Hinnant const_iterator find(const key_type& __k) const {return __tree_.find(__k);} 12232585835cSMarshall Clow#if _LIBCPP_STD_VER > 11 12242585835cSMarshall Clow template <typename _K2> 12252585835cSMarshall Clow _LIBCPP_INLINE_VISIBILITY 12262585835cSMarshall Clow typename enable_if<__is_transparent<_Compare, _K2>::value,iterator>::type 12272585835cSMarshall Clow find(const _K2& __k) {return __tree_.find(__k);} 12282585835cSMarshall Clow template <typename _K2> 12292585835cSMarshall Clow _LIBCPP_INLINE_VISIBILITY 12302585835cSMarshall Clow typename enable_if<__is_transparent<_Compare, _K2>::value,const_iterator>::type 12312585835cSMarshall Clow find(const _K2& __k) const {return __tree_.find(__k);} 12322585835cSMarshall Clow#endif 12332585835cSMarshall Clow 1234848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 12353e519524SHoward Hinnant size_type count(const key_type& __k) const 12363e519524SHoward Hinnant {return __tree_.__count_unique(__k);} 12370aacbc92SMarshall Clow#if _LIBCPP_STD_VER > 11 12380aacbc92SMarshall Clow template <typename _K2> 12390aacbc92SMarshall Clow _LIBCPP_INLINE_VISIBILITY 12400aacbc92SMarshall Clow typename enable_if<__is_transparent<_Compare, _K2>::value,size_type>::type 1241f8457a07SMarshall Clow count(const _K2& __k) const {return __tree_.__count_unique(__k);} 12420aacbc92SMarshall Clow#endif 1243848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 12443e519524SHoward Hinnant iterator lower_bound(const key_type& __k) 12453e519524SHoward Hinnant {return __tree_.lower_bound(__k);} 1246848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 12473e519524SHoward Hinnant const_iterator lower_bound(const key_type& __k) const 12483e519524SHoward Hinnant {return __tree_.lower_bound(__k);} 12492585835cSMarshall Clow#if _LIBCPP_STD_VER > 11 12502585835cSMarshall Clow template <typename _K2> 12512585835cSMarshall Clow _LIBCPP_INLINE_VISIBILITY 12522585835cSMarshall Clow typename enable_if<__is_transparent<_Compare, _K2>::value,iterator>::type 12532585835cSMarshall Clow lower_bound(const _K2& __k) {return __tree_.lower_bound(__k);} 12542585835cSMarshall Clow 12552585835cSMarshall Clow template <typename _K2> 12562585835cSMarshall Clow _LIBCPP_INLINE_VISIBILITY 12572585835cSMarshall Clow typename enable_if<__is_transparent<_Compare, _K2>::value,const_iterator>::type 12582585835cSMarshall Clow lower_bound(const _K2& __k) const {return __tree_.lower_bound(__k);} 12592585835cSMarshall Clow#endif 12602585835cSMarshall Clow 1261848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 12623e519524SHoward Hinnant iterator upper_bound(const key_type& __k) 12633e519524SHoward Hinnant {return __tree_.upper_bound(__k);} 1264848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 12653e519524SHoward Hinnant const_iterator upper_bound(const key_type& __k) const 12663e519524SHoward Hinnant {return __tree_.upper_bound(__k);} 12672585835cSMarshall Clow#if _LIBCPP_STD_VER > 11 12682585835cSMarshall Clow template <typename _K2> 12692585835cSMarshall Clow _LIBCPP_INLINE_VISIBILITY 12702585835cSMarshall Clow typename enable_if<__is_transparent<_Compare, _K2>::value,iterator>::type 12712585835cSMarshall Clow upper_bound(const _K2& __k) {return __tree_.upper_bound(__k);} 12722585835cSMarshall Clow template <typename _K2> 12732585835cSMarshall Clow _LIBCPP_INLINE_VISIBILITY 12742585835cSMarshall Clow typename enable_if<__is_transparent<_Compare, _K2>::value,const_iterator>::type 12752585835cSMarshall Clow upper_bound(const _K2& __k) const {return __tree_.upper_bound(__k);} 12762585835cSMarshall Clow#endif 12772585835cSMarshall Clow 1278848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 12793e519524SHoward Hinnant pair<iterator,iterator> equal_range(const key_type& __k) 12803e519524SHoward Hinnant {return __tree_.__equal_range_unique(__k);} 1281848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 12823e519524SHoward Hinnant pair<const_iterator,const_iterator> equal_range(const key_type& __k) const 12833e519524SHoward Hinnant {return __tree_.__equal_range_unique(__k);} 12842585835cSMarshall Clow#if _LIBCPP_STD_VER > 11 12852585835cSMarshall Clow template <typename _K2> 12862585835cSMarshall Clow _LIBCPP_INLINE_VISIBILITY 12872585835cSMarshall Clow typename enable_if<__is_transparent<_Compare, _K2>::value,pair<iterator,iterator>>::type 12882585835cSMarshall Clow equal_range(const _K2& __k) {return __tree_.__equal_range_unique(__k);} 12892585835cSMarshall Clow template <typename _K2> 12902585835cSMarshall Clow _LIBCPP_INLINE_VISIBILITY 12912585835cSMarshall Clow typename enable_if<__is_transparent<_Compare, _K2>::value,pair<const_iterator,const_iterator>>::type 12922585835cSMarshall Clow equal_range(const _K2& __k) const {return __tree_.__equal_range_unique(__k);} 12932585835cSMarshall Clow#endif 12943e519524SHoward Hinnant 12953e519524SHoward Hinnantprivate: 12963e519524SHoward Hinnant typedef typename __base::__node __node; 12973e519524SHoward Hinnant typedef typename __base::__node_allocator __node_allocator; 12983e519524SHoward Hinnant typedef typename __base::__node_pointer __node_pointer; 12993e519524SHoward Hinnant typedef typename __base::__node_base_pointer __node_base_pointer; 13000594ad71SEric Fiselier 1301c003db1fSHoward Hinnant typedef __map_node_destructor<__node_allocator> _Dp; 1302c003db1fSHoward Hinnant typedef unique_ptr<__node, _Dp> __node_holder; 13033e519524SHoward Hinnant 130454f0cda6SEric Fiselier#ifdef _LIBCPP_CXX03_LANG 13054a95f9ebSHoward Hinnant __node_holder __construct_node_with_key(const key_type& __k); 130654f0cda6SEric Fiselier#endif 13073e519524SHoward Hinnant 13080594ad71SEric Fiselier __node_base_pointer const& 13090594ad71SEric Fiselier __find_equal_key(__node_base_pointer& __parent, const key_type& __k) const; 13100594ad71SEric Fiselier 13110594ad71SEric Fiselier _LIBCPP_INLINE_VISIBILITY 13123e519524SHoward Hinnant __node_base_pointer& 13130594ad71SEric Fiselier __find_equal_key(__node_base_pointer& __parent, const key_type& __k) { 13140594ad71SEric Fiselier map const* __const_this = this; 13150594ad71SEric Fiselier return const_cast<__node_base_pointer&>( 13160594ad71SEric Fiselier __const_this->__find_equal_key(__parent, __k)); 13170594ad71SEric Fiselier } 13183e519524SHoward Hinnant}; 13193e519524SHoward Hinnant 13200594ad71SEric Fiselier 13210594ad71SEric Fiselier// Find __k 13220594ad71SEric Fiselier// Set __parent to parent of null leaf and 13230594ad71SEric Fiselier// return reference to null leaf iv __k does not exist. 13243e519524SHoward Hinnant// If __k exists, set parent to node of __k and return reference to node of __k 13253e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 13260594ad71SEric Fiseliertypename map<_Key, _Tp, _Compare, _Allocator>::__node_base_pointer const& 13273e519524SHoward Hinnantmap<_Key, _Tp, _Compare, _Allocator>::__find_equal_key(__node_base_pointer& __parent, 13280594ad71SEric Fiselier const key_type& __k) const 13293e519524SHoward Hinnant{ 13303e519524SHoward Hinnant __node_pointer __nd = __tree_.__root(); 13313e519524SHoward Hinnant if (__nd != nullptr) 13323e519524SHoward Hinnant { 13333e519524SHoward Hinnant while (true) 13343e519524SHoward Hinnant { 133507d3eccdSHoward Hinnant if (__tree_.value_comp().key_comp()(__k, __nd->__value_.__cc.first)) 13363e519524SHoward Hinnant { 13373e519524SHoward Hinnant if (__nd->__left_ != nullptr) 13383e519524SHoward Hinnant __nd = static_cast<__node_pointer>(__nd->__left_); 13393e519524SHoward Hinnant else 13403e519524SHoward Hinnant { 134107d3eccdSHoward Hinnant __parent = static_cast<__node_base_pointer>(__nd); 13423e519524SHoward Hinnant return __parent->__left_; 13433e519524SHoward Hinnant } 13443e519524SHoward Hinnant } 134507d3eccdSHoward Hinnant else if (__tree_.value_comp().key_comp()(__nd->__value_.__cc.first, __k)) 13463e519524SHoward Hinnant { 13473e519524SHoward Hinnant if (__nd->__right_ != nullptr) 13483e519524SHoward Hinnant __nd = static_cast<__node_pointer>(__nd->__right_); 13493e519524SHoward Hinnant else 13503e519524SHoward Hinnant { 135107d3eccdSHoward Hinnant __parent = static_cast<__node_base_pointer>(__nd); 13523e519524SHoward Hinnant return __parent->__right_; 13533e519524SHoward Hinnant } 13543e519524SHoward Hinnant } 13553e519524SHoward Hinnant else 13563e519524SHoward Hinnant { 135707d3eccdSHoward Hinnant __parent = static_cast<__node_base_pointer>(__nd); 13583e519524SHoward Hinnant return __parent; 13593e519524SHoward Hinnant } 13603e519524SHoward Hinnant } 13613e519524SHoward Hinnant } 136207d3eccdSHoward Hinnant __parent = static_cast<__node_base_pointer>(__tree_.__end_node()); 13633e519524SHoward Hinnant return __parent->__left_; 13643e519524SHoward Hinnant} 13653e519524SHoward Hinnant 13665e3ea4ddSEric Fiselier#ifndef _LIBCPP_CXX03_LANG 13673e519524SHoward Hinnant 13683e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 13693e519524SHoward Hinnantmap<_Key, _Tp, _Compare, _Allocator>::map(map&& __m, const allocator_type& __a) 13702a10c960SMarshall Clow : __tree_(_VSTD::move(__m.__tree_), typename __base::allocator_type(__a)) 13713e519524SHoward Hinnant{ 13723e519524SHoward Hinnant if (__a != __m.get_allocator()) 13733e519524SHoward Hinnant { 13743e519524SHoward Hinnant const_iterator __e = cend(); 13753e519524SHoward Hinnant while (!__m.empty()) 13763e519524SHoward Hinnant __tree_.__insert_unique(__e.__i_, 13775e3ea4ddSEric Fiselier _VSTD::move(__m.__tree_.remove(__m.begin().__i_)->__value_.__nc)); 13783e519524SHoward Hinnant } 13793e519524SHoward Hinnant} 13803e519524SHoward Hinnant 13815e3ea4ddSEric Fiselier#endif // !_LIBCPP_CXX03_LANG 13823e519524SHoward Hinnant 138354f0cda6SEric Fiselier 138454f0cda6SEric Fiselier#ifdef _LIBCPP_CXX03_LANG 138554f0cda6SEric Fiselier 13863e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 13873e519524SHoward Hinnanttypename map<_Key, _Tp, _Compare, _Allocator>::__node_holder 13884a95f9ebSHoward Hinnantmap<_Key, _Tp, _Compare, _Allocator>::__construct_node_with_key(const key_type& __k) 13893e519524SHoward Hinnant{ 13903e519524SHoward Hinnant __node_allocator& __na = __tree_.__node_alloc(); 1391c003db1fSHoward Hinnant __node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na)); 139207d3eccdSHoward Hinnant __node_traits::construct(__na, _VSTD::addressof(__h->__value_.__cc.first), __k); 13933e519524SHoward Hinnant __h.get_deleter().__first_constructed = true; 139407d3eccdSHoward Hinnant __node_traits::construct(__na, _VSTD::addressof(__h->__value_.__cc.second)); 13953e519524SHoward Hinnant __h.get_deleter().__second_constructed = true; 1396251c6291SDimitry Andric return _LIBCPP_EXPLICIT_MOVE(__h); // explicitly moved for C++03 13973e519524SHoward Hinnant} 13983e519524SHoward Hinnant 13993e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 14003e519524SHoward Hinnant_Tp& 14013e519524SHoward Hinnantmap<_Key, _Tp, _Compare, _Allocator>::operator[](const key_type& __k) 14023e519524SHoward Hinnant{ 14033e519524SHoward Hinnant __node_base_pointer __parent; 14043e519524SHoward Hinnant __node_base_pointer& __child = __find_equal_key(__parent, __k); 14053e519524SHoward Hinnant __node_pointer __r = static_cast<__node_pointer>(__child); 14063e519524SHoward Hinnant if (__child == nullptr) 14073e519524SHoward Hinnant { 14084a95f9ebSHoward Hinnant __node_holder __h = __construct_node_with_key(__k); 140907d3eccdSHoward Hinnant __tree_.__insert_node_at(__parent, __child, static_cast<__node_base_pointer>(__h.get())); 14103e519524SHoward Hinnant __r = __h.release(); 14113e519524SHoward Hinnant } 141207d3eccdSHoward Hinnant return __r->__value_.__cc.second; 14133e519524SHoward Hinnant} 14143e519524SHoward Hinnant 141554f0cda6SEric Fiselier#else 141654f0cda6SEric Fiselier 141754f0cda6SEric Fiseliertemplate <class _Key, class _Tp, class _Compare, class _Allocator> 141854f0cda6SEric Fiselier_Tp& 141954f0cda6SEric Fiseliermap<_Key, _Tp, _Compare, _Allocator>::operator[](const key_type& __k) 142054f0cda6SEric Fiselier{ 142154f0cda6SEric Fiselier return __tree_.__emplace_unique_key_args(__k, 142254f0cda6SEric Fiselier _VSTD::piecewise_construct, 142354f0cda6SEric Fiselier _VSTD::forward_as_tuple(__k), 142454f0cda6SEric Fiselier _VSTD::forward_as_tuple()).first->__cc.second; 142554f0cda6SEric Fiselier} 14263e519524SHoward Hinnant 14273e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 14283e519524SHoward Hinnant_Tp& 14293e519524SHoward Hinnantmap<_Key, _Tp, _Compare, _Allocator>::operator[](key_type&& __k) 14303e519524SHoward Hinnant{ 143154f0cda6SEric Fiselier return __tree_.__emplace_unique_key_args(__k, 143254f0cda6SEric Fiselier _VSTD::piecewise_construct, 143354f0cda6SEric Fiselier _VSTD::forward_as_tuple(_VSTD::move(__k)), 143454f0cda6SEric Fiselier _VSTD::forward_as_tuple()).first->__cc.second; 14353e519524SHoward Hinnant} 14363e519524SHoward Hinnant 143754f0cda6SEric Fiselier#endif // !_LIBCPP_CXX03_LANG 14383e519524SHoward Hinnant 14393e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 14403e519524SHoward Hinnant_Tp& 14413e519524SHoward Hinnantmap<_Key, _Tp, _Compare, _Allocator>::at(const key_type& __k) 14423e519524SHoward Hinnant{ 14433e519524SHoward Hinnant __node_base_pointer __parent; 14443e519524SHoward Hinnant __node_base_pointer& __child = __find_equal_key(__parent, __k); 144554b409fdSHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 14463e519524SHoward Hinnant if (__child == nullptr) 14473e519524SHoward Hinnant throw out_of_range("map::at: key not found"); 1448b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS 144907d3eccdSHoward Hinnant return static_cast<__node_pointer>(__child)->__value_.__cc.second; 14503e519524SHoward Hinnant} 14513e519524SHoward Hinnant 14523e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 14533e519524SHoward Hinnantconst _Tp& 14543e519524SHoward Hinnantmap<_Key, _Tp, _Compare, _Allocator>::at(const key_type& __k) const 14553e519524SHoward Hinnant{ 14560594ad71SEric Fiselier __node_base_pointer __parent; 14570594ad71SEric Fiselier __node_base_pointer __child = __find_equal_key(__parent, __k); 145854b409fdSHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 14593e519524SHoward Hinnant if (__child == nullptr) 14603e519524SHoward Hinnant throw out_of_range("map::at: key not found"); 1461b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS 14620594ad71SEric Fiselier return static_cast<__node_pointer>(__child)->__value_.__cc.second; 14633e519524SHoward Hinnant} 14643e519524SHoward Hinnant 14653e519524SHoward Hinnant 14663e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 1467848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 14683e519524SHoward Hinnantbool 14693e519524SHoward Hinnantoperator==(const map<_Key, _Tp, _Compare, _Allocator>& __x, 14703e519524SHoward Hinnant const map<_Key, _Tp, _Compare, _Allocator>& __y) 14713e519524SHoward Hinnant{ 1472ce48a113SHoward Hinnant return __x.size() == __y.size() && _VSTD::equal(__x.begin(), __x.end(), __y.begin()); 14733e519524SHoward Hinnant} 14743e519524SHoward Hinnant 14753e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 1476848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 14773e519524SHoward Hinnantbool 14783e519524SHoward Hinnantoperator< (const map<_Key, _Tp, _Compare, _Allocator>& __x, 14793e519524SHoward Hinnant const map<_Key, _Tp, _Compare, _Allocator>& __y) 14803e519524SHoward Hinnant{ 1481ce48a113SHoward Hinnant return _VSTD::lexicographical_compare(__x.begin(), __x.end(), __y.begin(), __y.end()); 14823e519524SHoward Hinnant} 14833e519524SHoward Hinnant 14843e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 1485848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 14863e519524SHoward Hinnantbool 14873e519524SHoward Hinnantoperator!=(const map<_Key, _Tp, _Compare, _Allocator>& __x, 14883e519524SHoward Hinnant const map<_Key, _Tp, _Compare, _Allocator>& __y) 14893e519524SHoward Hinnant{ 14903e519524SHoward Hinnant return !(__x == __y); 14913e519524SHoward Hinnant} 14923e519524SHoward Hinnant 14933e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 1494848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 14953e519524SHoward Hinnantbool 14963e519524SHoward Hinnantoperator> (const map<_Key, _Tp, _Compare, _Allocator>& __x, 14973e519524SHoward Hinnant const map<_Key, _Tp, _Compare, _Allocator>& __y) 14983e519524SHoward Hinnant{ 14993e519524SHoward Hinnant return __y < __x; 15003e519524SHoward Hinnant} 15013e519524SHoward Hinnant 15023e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 1503848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 15043e519524SHoward Hinnantbool 15053e519524SHoward Hinnantoperator>=(const map<_Key, _Tp, _Compare, _Allocator>& __x, 15063e519524SHoward Hinnant const map<_Key, _Tp, _Compare, _Allocator>& __y) 15073e519524SHoward Hinnant{ 15083e519524SHoward Hinnant return !(__x < __y); 15093e519524SHoward Hinnant} 15103e519524SHoward Hinnant 15113e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 1512848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 15133e519524SHoward Hinnantbool 15143e519524SHoward Hinnantoperator<=(const map<_Key, _Tp, _Compare, _Allocator>& __x, 15153e519524SHoward Hinnant const map<_Key, _Tp, _Compare, _Allocator>& __y) 15163e519524SHoward Hinnant{ 15173e519524SHoward Hinnant return !(__y < __x); 15183e519524SHoward Hinnant} 15193e519524SHoward Hinnant 15203e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 1521848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 15223e519524SHoward Hinnantvoid 15233e519524SHoward Hinnantswap(map<_Key, _Tp, _Compare, _Allocator>& __x, 15243e519524SHoward Hinnant map<_Key, _Tp, _Compare, _Allocator>& __y) 15251052ee39SHoward Hinnant _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y))) 15263e519524SHoward Hinnant{ 15273e519524SHoward Hinnant __x.swap(__y); 15283e519524SHoward Hinnant} 15293e519524SHoward Hinnant 15303e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare = less<_Key>, 15313e519524SHoward Hinnant class _Allocator = allocator<pair<const _Key, _Tp> > > 1532*e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS multimap 15333e519524SHoward Hinnant{ 15343e519524SHoward Hinnantpublic: 15353e519524SHoward Hinnant // types: 15363e519524SHoward Hinnant typedef _Key key_type; 15373e519524SHoward Hinnant typedef _Tp mapped_type; 15383e519524SHoward Hinnant typedef pair<const key_type, mapped_type> value_type; 153907d3eccdSHoward Hinnant typedef pair<key_type, mapped_type> __nc_value_type; 15403e519524SHoward Hinnant typedef _Compare key_compare; 15413e519524SHoward Hinnant typedef _Allocator allocator_type; 15423e519524SHoward Hinnant typedef value_type& reference; 15433e519524SHoward Hinnant typedef const value_type& const_reference; 15443e519524SHoward Hinnant 154594f89aeeSMarshall Clow static_assert((is_same<typename allocator_type::value_type, value_type>::value), 154694f89aeeSMarshall Clow "Allocator::value_type must be same type as value_type"); 154794f89aeeSMarshall Clow 1548*e2f2d1edSEric Fiselier class _LIBCPP_TEMPLATE_VIS value_compare 15493e519524SHoward Hinnant : public binary_function<value_type, value_type, bool> 15503e519524SHoward Hinnant { 15513e519524SHoward Hinnant friend class multimap; 15523e519524SHoward Hinnant protected: 15533e519524SHoward Hinnant key_compare comp; 15543e519524SHoward Hinnant 1555848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 15563e519524SHoward Hinnant value_compare(key_compare c) : comp(c) {} 15573e519524SHoward Hinnant public: 1558848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 15593e519524SHoward Hinnant bool operator()(const value_type& __x, const value_type& __y) const 15603e519524SHoward Hinnant {return comp(__x.first, __y.first);} 15613e519524SHoward Hinnant }; 15623e519524SHoward Hinnant 15633e519524SHoward Hinnantprivate: 156407d3eccdSHoward Hinnant 15659fd9f84fSHoward Hinnant typedef _VSTD::__value_type<key_type, mapped_type> __value_type; 1566abb160e6SHoward Hinnant typedef __map_value_compare<key_type, __value_type, key_compare> __vc; 15671f508014SMarshall Clow typedef typename __rebind_alloc_helper<allocator_traits<allocator_type>, 15681f508014SMarshall Clow __value_type>::type __allocator_type; 15693e519524SHoward Hinnant typedef __tree<__value_type, __vc, __allocator_type> __base; 15703e519524SHoward Hinnant typedef typename __base::__node_traits __node_traits; 15713e519524SHoward Hinnant typedef allocator_traits<allocator_type> __alloc_traits; 15723e519524SHoward Hinnant 15733e519524SHoward Hinnant __base __tree_; 15743e519524SHoward Hinnant 15753e519524SHoward Hinnantpublic: 15763e519524SHoward Hinnant typedef typename __alloc_traits::pointer pointer; 15773e519524SHoward Hinnant typedef typename __alloc_traits::const_pointer const_pointer; 15783e519524SHoward Hinnant typedef typename __alloc_traits::size_type size_type; 15793e519524SHoward Hinnant typedef typename __alloc_traits::difference_type difference_type; 15803e519524SHoward Hinnant typedef __map_iterator<typename __base::iterator> iterator; 15813e519524SHoward Hinnant typedef __map_const_iterator<typename __base::const_iterator> const_iterator; 1582ce48a113SHoward Hinnant typedef _VSTD::reverse_iterator<iterator> reverse_iterator; 1583ce48a113SHoward Hinnant typedef _VSTD::reverse_iterator<const_iterator> const_reverse_iterator; 15843e519524SHoward Hinnant 1585848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 1586415a24e4SMarshall Clow multimap() 1587415a24e4SMarshall Clow _NOEXCEPT_( 1588415a24e4SMarshall Clow is_nothrow_default_constructible<allocator_type>::value && 1589415a24e4SMarshall Clow is_nothrow_default_constructible<key_compare>::value && 1590415a24e4SMarshall Clow is_nothrow_copy_constructible<key_compare>::value) 1591415a24e4SMarshall Clow : __tree_(__vc(key_compare())) {} 1592415a24e4SMarshall Clow 1593415a24e4SMarshall Clow _LIBCPP_INLINE_VISIBILITY 1594415a24e4SMarshall Clow explicit multimap(const key_compare& __comp) 15951052ee39SHoward Hinnant _NOEXCEPT_( 15961052ee39SHoward Hinnant is_nothrow_default_constructible<allocator_type>::value && 15971052ee39SHoward Hinnant is_nothrow_copy_constructible<key_compare>::value) 15983e519524SHoward Hinnant : __tree_(__vc(__comp)) {} 15993e519524SHoward Hinnant 1600848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 16013e519524SHoward Hinnant explicit multimap(const key_compare& __comp, const allocator_type& __a) 16022a10c960SMarshall Clow : __tree_(__vc(__comp), typename __base::allocator_type(__a)) {} 16033e519524SHoward Hinnant 16043e519524SHoward Hinnant template <class _InputIterator> 1605848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 16063e519524SHoward Hinnant multimap(_InputIterator __f, _InputIterator __l, 16073e519524SHoward Hinnant const key_compare& __comp = key_compare()) 16083e519524SHoward Hinnant : __tree_(__vc(__comp)) 16093e519524SHoward Hinnant { 16103e519524SHoward Hinnant insert(__f, __l); 16113e519524SHoward Hinnant } 16123e519524SHoward Hinnant 16133e519524SHoward Hinnant template <class _InputIterator> 1614848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 16153e519524SHoward Hinnant multimap(_InputIterator __f, _InputIterator __l, 16163e519524SHoward Hinnant const key_compare& __comp, const allocator_type& __a) 16172a10c960SMarshall Clow : __tree_(__vc(__comp), typename __base::allocator_type(__a)) 16183e519524SHoward Hinnant { 16193e519524SHoward Hinnant insert(__f, __l); 16203e519524SHoward Hinnant } 16213e519524SHoward Hinnant 1622fbc317d4SMarshall Clow#if _LIBCPP_STD_VER > 11 1623fbc317d4SMarshall Clow template <class _InputIterator> 1624fbc317d4SMarshall Clow _LIBCPP_INLINE_VISIBILITY 1625fbc317d4SMarshall Clow multimap(_InputIterator __f, _InputIterator __l, const allocator_type& __a) 1626fbc317d4SMarshall Clow : multimap(__f, __l, key_compare(), __a) {} 1627fbc317d4SMarshall Clow#endif 1628fbc317d4SMarshall Clow 1629848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 16303e519524SHoward Hinnant multimap(const multimap& __m) 16313e519524SHoward Hinnant : __tree_(__m.__tree_.value_comp(), 16323e519524SHoward Hinnant __alloc_traits::select_on_container_copy_construction(__m.__tree_.__alloc())) 16333e519524SHoward Hinnant { 16343e519524SHoward Hinnant insert(__m.begin(), __m.end()); 16353e519524SHoward Hinnant } 16363e519524SHoward Hinnant 16375a33687dSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 16385a33687dSHoward Hinnant multimap& operator=(const multimap& __m) 16395a33687dSHoward Hinnant { 16402ee83725SMarshall Clow#ifndef _LIBCPP_CXX03_LANG 16415a33687dSHoward Hinnant __tree_ = __m.__tree_; 164207d3eccdSHoward Hinnant#else 164374cf6ff5SMarshall Clow if (this != &__m) { 164407d3eccdSHoward Hinnant __tree_.clear(); 164507d3eccdSHoward Hinnant __tree_.value_comp() = __m.__tree_.value_comp(); 164607d3eccdSHoward Hinnant __tree_.__copy_assign_alloc(__m.__tree_); 164707d3eccdSHoward Hinnant insert(__m.begin(), __m.end()); 164874cf6ff5SMarshall Clow } 164907d3eccdSHoward Hinnant#endif 16505a33687dSHoward Hinnant return *this; 16515a33687dSHoward Hinnant } 16525a33687dSHoward Hinnant 16537609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 16543e519524SHoward Hinnant 1655848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 16563e519524SHoward Hinnant multimap(multimap&& __m) 16571052ee39SHoward Hinnant _NOEXCEPT_(is_nothrow_move_constructible<__base>::value) 1658ce48a113SHoward Hinnant : __tree_(_VSTD::move(__m.__tree_)) 16593e519524SHoward Hinnant { 16603e519524SHoward Hinnant } 16613e519524SHoward Hinnant 16623e519524SHoward Hinnant multimap(multimap&& __m, const allocator_type& __a); 16633e519524SHoward Hinnant 1664848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 166554976f26SHoward Hinnant multimap& operator=(multimap&& __m) 166654976f26SHoward Hinnant _NOEXCEPT_(is_nothrow_move_assignable<__base>::value) 166754976f26SHoward Hinnant { 166854976f26SHoward Hinnant __tree_ = _VSTD::move(__m.__tree_); 166954976f26SHoward Hinnant return *this; 167054976f26SHoward Hinnant } 167154976f26SHoward Hinnant 167254976f26SHoward Hinnant#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 167354976f26SHoward Hinnant 167454976f26SHoward Hinnant#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS 167554976f26SHoward Hinnant 167654976f26SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 16773e519524SHoward Hinnant multimap(initializer_list<value_type> __il, const key_compare& __comp = key_compare()) 16783e519524SHoward Hinnant : __tree_(__vc(__comp)) 16793e519524SHoward Hinnant { 16803e519524SHoward Hinnant insert(__il.begin(), __il.end()); 16813e519524SHoward Hinnant } 16823e519524SHoward Hinnant 1683848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 16843e519524SHoward Hinnant multimap(initializer_list<value_type> __il, const key_compare& __comp, const allocator_type& __a) 16852a10c960SMarshall Clow : __tree_(__vc(__comp), typename __base::allocator_type(__a)) 16863e519524SHoward Hinnant { 16873e519524SHoward Hinnant insert(__il.begin(), __il.end()); 16883e519524SHoward Hinnant } 16893e519524SHoward Hinnant 1690fbc317d4SMarshall Clow#if _LIBCPP_STD_VER > 11 1691fbc317d4SMarshall Clow _LIBCPP_INLINE_VISIBILITY 1692fbc317d4SMarshall Clow multimap(initializer_list<value_type> __il, const allocator_type& __a) 1693fbc317d4SMarshall Clow : multimap(__il, key_compare(), __a) {} 1694fbc317d4SMarshall Clow#endif 1695fbc317d4SMarshall Clow 1696848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 16973e519524SHoward Hinnant multimap& operator=(initializer_list<value_type> __il) 16983e519524SHoward Hinnant { 16993e519524SHoward Hinnant __tree_.__assign_multi(__il.begin(), __il.end()); 17003e519524SHoward Hinnant return *this; 17013e519524SHoward Hinnant } 170254976f26SHoward Hinnant 170354976f26SHoward Hinnant#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS 17043e519524SHoward Hinnant 1705848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 17063e519524SHoward Hinnant explicit multimap(const allocator_type& __a) 17072a10c960SMarshall Clow : __tree_(typename __base::allocator_type(__a)) 17083e519524SHoward Hinnant { 17093e519524SHoward Hinnant } 17103e519524SHoward Hinnant 1711848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 17123e519524SHoward Hinnant multimap(const multimap& __m, const allocator_type& __a) 17132a10c960SMarshall Clow : __tree_(__m.__tree_.value_comp(), typename __base::allocator_type(__a)) 17143e519524SHoward Hinnant { 17153e519524SHoward Hinnant insert(__m.begin(), __m.end()); 17163e519524SHoward Hinnant } 17173e519524SHoward Hinnant 1718848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 17191052ee39SHoward Hinnant iterator begin() _NOEXCEPT {return __tree_.begin();} 1720848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 17211052ee39SHoward Hinnant const_iterator begin() const _NOEXCEPT {return __tree_.begin();} 1722848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 17231052ee39SHoward Hinnant iterator end() _NOEXCEPT {return __tree_.end();} 1724848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 17251052ee39SHoward Hinnant const_iterator end() const _NOEXCEPT {return __tree_.end();} 17263e519524SHoward Hinnant 1727848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 17281052ee39SHoward Hinnant reverse_iterator rbegin() _NOEXCEPT {return reverse_iterator(end());} 1729848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 17301052ee39SHoward Hinnant const_reverse_iterator rbegin() const _NOEXCEPT 17311052ee39SHoward Hinnant {return const_reverse_iterator(end());} 1732848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 17331052ee39SHoward Hinnant reverse_iterator rend() _NOEXCEPT {return reverse_iterator(begin());} 1734848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 17351052ee39SHoward Hinnant const_reverse_iterator rend() const _NOEXCEPT 17361052ee39SHoward Hinnant {return const_reverse_iterator(begin());} 17373e519524SHoward Hinnant 1738848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 17391052ee39SHoward Hinnant const_iterator cbegin() const _NOEXCEPT {return begin();} 1740848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 17411052ee39SHoward Hinnant const_iterator cend() const _NOEXCEPT {return end();} 1742848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 17431052ee39SHoward Hinnant const_reverse_iterator crbegin() const _NOEXCEPT {return rbegin();} 1744848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 17451052ee39SHoward Hinnant const_reverse_iterator crend() const _NOEXCEPT {return rend();} 17463e519524SHoward Hinnant 1747848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 17481052ee39SHoward Hinnant bool empty() const _NOEXCEPT {return __tree_.size() == 0;} 1749848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 17501052ee39SHoward Hinnant size_type size() const _NOEXCEPT {return __tree_.size();} 1751848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 17521052ee39SHoward Hinnant size_type max_size() const _NOEXCEPT {return __tree_.max_size();} 17533e519524SHoward Hinnant 1754848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 17552a10c960SMarshall Clow allocator_type get_allocator() const _NOEXCEPT {return allocator_type(__tree_.__alloc());} 1756848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 17573e519524SHoward Hinnant key_compare key_comp() const {return __tree_.value_comp().key_comp();} 1758848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 17591052ee39SHoward Hinnant value_compare value_comp() const 17601052ee39SHoward Hinnant {return value_compare(__tree_.value_comp().key_comp());} 17613e519524SHoward Hinnant 17625e3ea4ddSEric Fiselier#ifndef _LIBCPP_CXX03_LANG 17637609c9b6SHoward Hinnant 17648b805c91SHoward Hinnant template <class ..._Args> 17655e3ea4ddSEric Fiselier _LIBCPP_INLINE_VISIBILITY 17665e3ea4ddSEric Fiselier iterator emplace(_Args&& ...__args) { 17675e3ea4ddSEric Fiselier return __tree_.__emplace_multi(_VSTD::forward<_Args>(__args)...); 17685e3ea4ddSEric Fiselier } 17693e519524SHoward Hinnant 17708b805c91SHoward Hinnant template <class ..._Args> 17715e3ea4ddSEric Fiselier _LIBCPP_INLINE_VISIBILITY 17725e3ea4ddSEric Fiselier iterator emplace_hint(const_iterator __p, _Args&& ...__args) { 17735e3ea4ddSEric Fiselier return __tree_.__emplace_hint_multi(__p.__i_, _VSTD::forward<_Args>(__args)...); 17745e3ea4ddSEric Fiselier } 17757609c9b6SHoward Hinnant 1776c003db1fSHoward Hinnant template <class _Pp, 1777c003db1fSHoward Hinnant class = typename enable_if<is_constructible<value_type, _Pp>::value>::type> 1778848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 1779c003db1fSHoward Hinnant iterator insert(_Pp&& __p) 1780c003db1fSHoward Hinnant {return __tree_.__insert_multi(_VSTD::forward<_Pp>(__p));} 17813e519524SHoward Hinnant 1782c003db1fSHoward Hinnant template <class _Pp, 1783c003db1fSHoward Hinnant class = typename enable_if<is_constructible<value_type, _Pp>::value>::type> 1784848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 1785c003db1fSHoward Hinnant iterator insert(const_iterator __pos, _Pp&& __p) 1786c003db1fSHoward Hinnant {return __tree_.__insert_multi(__pos.__i_, _VSTD::forward<_Pp>(__p));} 17873e519524SHoward Hinnant 17887a9f500fSEric Fiselier _LIBCPP_INLINE_VISIBILITY 17897a9f500fSEric Fiselier iterator insert(value_type&& __v) 17907a9f500fSEric Fiselier {return __tree_.__insert_multi(_VSTD::move(__v));} 17917a9f500fSEric Fiselier 17927a9f500fSEric Fiselier _LIBCPP_INLINE_VISIBILITY 17937a9f500fSEric Fiselier iterator insert(const_iterator __p, value_type&& __v) 17947a9f500fSEric Fiselier {return __tree_.__insert_multi(__p.__i_, _VSTD::move(__v));} 17957a9f500fSEric Fiselier 17965e3ea4ddSEric Fiselier#endif // _LIBCPP_CXX03_LANG 17973e519524SHoward Hinnant 1798848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 17993e519524SHoward Hinnant iterator insert(const value_type& __v) {return __tree_.__insert_multi(__v);} 18003e519524SHoward Hinnant 1801848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 18023e519524SHoward Hinnant iterator insert(const_iterator __p, const value_type& __v) 18033e519524SHoward Hinnant {return __tree_.__insert_multi(__p.__i_, __v);} 18043e519524SHoward Hinnant 18053e519524SHoward Hinnant template <class _InputIterator> 1806848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 18073e519524SHoward Hinnant void insert(_InputIterator __f, _InputIterator __l) 18083e519524SHoward Hinnant { 18093e519524SHoward Hinnant for (const_iterator __e = cend(); __f != __l; ++__f) 18103e519524SHoward Hinnant __tree_.__insert_multi(__e.__i_, *__f); 18113e519524SHoward Hinnant } 18123e519524SHoward Hinnant 181354976f26SHoward Hinnant#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS 181454976f26SHoward Hinnant 1815848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 18163e519524SHoward Hinnant void insert(initializer_list<value_type> __il) 18173e519524SHoward Hinnant {insert(__il.begin(), __il.end());} 18183e519524SHoward Hinnant 181954976f26SHoward Hinnant#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS 182054976f26SHoward Hinnant 1821848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 18223e519524SHoward Hinnant iterator erase(const_iterator __p) {return __tree_.erase(__p.__i_);} 1823848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 1824ec392968SMarshall Clow iterator erase(iterator __p) {return __tree_.erase(__p.__i_);} 1825ec392968SMarshall Clow _LIBCPP_INLINE_VISIBILITY 18263e519524SHoward Hinnant size_type erase(const key_type& __k) {return __tree_.__erase_multi(__k);} 1827848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 18283e519524SHoward Hinnant iterator erase(const_iterator __f, const_iterator __l) 18293e519524SHoward Hinnant {return __tree_.erase(__f.__i_, __l.__i_);} 1830848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 18313e519524SHoward Hinnant void clear() {__tree_.clear();} 18323e519524SHoward Hinnant 1833848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 18341052ee39SHoward Hinnant void swap(multimap& __m) 18351052ee39SHoward Hinnant _NOEXCEPT_(__is_nothrow_swappable<__base>::value) 18361052ee39SHoward Hinnant {__tree_.swap(__m.__tree_);} 18373e519524SHoward Hinnant 1838848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 18393e519524SHoward Hinnant iterator find(const key_type& __k) {return __tree_.find(__k);} 1840848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 18413e519524SHoward Hinnant const_iterator find(const key_type& __k) const {return __tree_.find(__k);} 18422585835cSMarshall Clow#if _LIBCPP_STD_VER > 11 18432585835cSMarshall Clow template <typename _K2> 18442585835cSMarshall Clow _LIBCPP_INLINE_VISIBILITY 18452585835cSMarshall Clow typename enable_if<__is_transparent<_Compare, _K2>::value,iterator>::type 18462585835cSMarshall Clow find(const _K2& __k) {return __tree_.find(__k);} 18472585835cSMarshall Clow template <typename _K2> 18482585835cSMarshall Clow _LIBCPP_INLINE_VISIBILITY 18492585835cSMarshall Clow typename enable_if<__is_transparent<_Compare, _K2>::value,const_iterator>::type 18502585835cSMarshall Clow find(const _K2& __k) const {return __tree_.find(__k);} 18512585835cSMarshall Clow#endif 18522585835cSMarshall Clow 1853848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 18543e519524SHoward Hinnant size_type count(const key_type& __k) const 18553e519524SHoward Hinnant {return __tree_.__count_multi(__k);} 18560aacbc92SMarshall Clow#if _LIBCPP_STD_VER > 11 18570aacbc92SMarshall Clow template <typename _K2> 18580aacbc92SMarshall Clow _LIBCPP_INLINE_VISIBILITY 18590aacbc92SMarshall Clow typename enable_if<__is_transparent<_Compare, _K2>::value,size_type>::type 1860f8457a07SMarshall Clow count(const _K2& __k) const {return __tree_.__count_multi(__k);} 18610aacbc92SMarshall Clow#endif 1862848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 18633e519524SHoward Hinnant iterator lower_bound(const key_type& __k) 18643e519524SHoward Hinnant {return __tree_.lower_bound(__k);} 1865848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 18663e519524SHoward Hinnant const_iterator lower_bound(const key_type& __k) const 18673e519524SHoward Hinnant {return __tree_.lower_bound(__k);} 18682585835cSMarshall Clow#if _LIBCPP_STD_VER > 11 18692585835cSMarshall Clow template <typename _K2> 18702585835cSMarshall Clow _LIBCPP_INLINE_VISIBILITY 18712585835cSMarshall Clow typename enable_if<__is_transparent<_Compare, _K2>::value,iterator>::type 18722585835cSMarshall Clow lower_bound(const _K2& __k) {return __tree_.lower_bound(__k);} 18732585835cSMarshall Clow 18742585835cSMarshall Clow template <typename _K2> 18752585835cSMarshall Clow _LIBCPP_INLINE_VISIBILITY 18762585835cSMarshall Clow typename enable_if<__is_transparent<_Compare, _K2>::value,const_iterator>::type 18772585835cSMarshall Clow lower_bound(const _K2& __k) const {return __tree_.lower_bound(__k);} 18782585835cSMarshall Clow#endif 18792585835cSMarshall Clow 1880848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 18813e519524SHoward Hinnant iterator upper_bound(const key_type& __k) 18823e519524SHoward Hinnant {return __tree_.upper_bound(__k);} 1883848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 18843e519524SHoward Hinnant const_iterator upper_bound(const key_type& __k) const 18853e519524SHoward Hinnant {return __tree_.upper_bound(__k);} 18862585835cSMarshall Clow#if _LIBCPP_STD_VER > 11 18872585835cSMarshall Clow template <typename _K2> 18882585835cSMarshall Clow _LIBCPP_INLINE_VISIBILITY 18892585835cSMarshall Clow typename enable_if<__is_transparent<_Compare, _K2>::value,iterator>::type 18902585835cSMarshall Clow upper_bound(const _K2& __k) {return __tree_.upper_bound(__k);} 18912585835cSMarshall Clow template <typename _K2> 18922585835cSMarshall Clow _LIBCPP_INLINE_VISIBILITY 18932585835cSMarshall Clow typename enable_if<__is_transparent<_Compare, _K2>::value,const_iterator>::type 18942585835cSMarshall Clow upper_bound(const _K2& __k) const {return __tree_.upper_bound(__k);} 18952585835cSMarshall Clow#endif 18962585835cSMarshall Clow 1897848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 18983e519524SHoward Hinnant pair<iterator,iterator> equal_range(const key_type& __k) 18993e519524SHoward Hinnant {return __tree_.__equal_range_multi(__k);} 1900848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 19013e519524SHoward Hinnant pair<const_iterator,const_iterator> equal_range(const key_type& __k) const 19023e519524SHoward Hinnant {return __tree_.__equal_range_multi(__k);} 19032585835cSMarshall Clow#if _LIBCPP_STD_VER > 11 19042585835cSMarshall Clow template <typename _K2> 19052585835cSMarshall Clow _LIBCPP_INLINE_VISIBILITY 19062585835cSMarshall Clow typename enable_if<__is_transparent<_Compare, _K2>::value,pair<iterator,iterator>>::type 19072585835cSMarshall Clow equal_range(const _K2& __k) {return __tree_.__equal_range_multi(__k);} 19082585835cSMarshall Clow template <typename _K2> 19092585835cSMarshall Clow _LIBCPP_INLINE_VISIBILITY 19102585835cSMarshall Clow typename enable_if<__is_transparent<_Compare, _K2>::value,pair<const_iterator,const_iterator>>::type 19112585835cSMarshall Clow equal_range(const _K2& __k) const {return __tree_.__equal_range_multi(__k);} 19122585835cSMarshall Clow#endif 19133e519524SHoward Hinnant 19143e519524SHoward Hinnantprivate: 19153e519524SHoward Hinnant typedef typename __base::__node __node; 19163e519524SHoward Hinnant typedef typename __base::__node_allocator __node_allocator; 19173e519524SHoward Hinnant typedef typename __base::__node_pointer __node_pointer; 19180594ad71SEric Fiselier 1919c003db1fSHoward Hinnant typedef __map_node_destructor<__node_allocator> _Dp; 1920c003db1fSHoward Hinnant typedef unique_ptr<__node, _Dp> __node_holder; 19213e519524SHoward Hinnant}; 19223e519524SHoward Hinnant 19235e3ea4ddSEric Fiselier#ifndef _LIBCPP_CXX03_LANG 19243e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 19253e519524SHoward Hinnantmultimap<_Key, _Tp, _Compare, _Allocator>::multimap(multimap&& __m, const allocator_type& __a) 19262a10c960SMarshall Clow : __tree_(_VSTD::move(__m.__tree_), typename __base::allocator_type(__a)) 19273e519524SHoward Hinnant{ 19283e519524SHoward Hinnant if (__a != __m.get_allocator()) 19293e519524SHoward Hinnant { 19303e519524SHoward Hinnant const_iterator __e = cend(); 19313e519524SHoward Hinnant while (!__m.empty()) 19323e519524SHoward Hinnant __tree_.__insert_multi(__e.__i_, 19335e3ea4ddSEric Fiselier _VSTD::move(__m.__tree_.remove(__m.begin().__i_)->__value_.__nc)); 19343e519524SHoward Hinnant } 19353e519524SHoward Hinnant} 19365e3ea4ddSEric Fiselier#endif 19373e519524SHoward Hinnant 19383e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 1939848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 19403e519524SHoward Hinnantbool 19413e519524SHoward Hinnantoperator==(const multimap<_Key, _Tp, _Compare, _Allocator>& __x, 19423e519524SHoward Hinnant const multimap<_Key, _Tp, _Compare, _Allocator>& __y) 19433e519524SHoward Hinnant{ 1944ce48a113SHoward Hinnant return __x.size() == __y.size() && _VSTD::equal(__x.begin(), __x.end(), __y.begin()); 19453e519524SHoward Hinnant} 19463e519524SHoward Hinnant 19473e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 1948848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 19493e519524SHoward Hinnantbool 19503e519524SHoward Hinnantoperator< (const multimap<_Key, _Tp, _Compare, _Allocator>& __x, 19513e519524SHoward Hinnant const multimap<_Key, _Tp, _Compare, _Allocator>& __y) 19523e519524SHoward Hinnant{ 1953ce48a113SHoward Hinnant return _VSTD::lexicographical_compare(__x.begin(), __x.end(), __y.begin(), __y.end()); 19543e519524SHoward Hinnant} 19553e519524SHoward Hinnant 19563e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 1957848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 19583e519524SHoward Hinnantbool 19593e519524SHoward Hinnantoperator!=(const multimap<_Key, _Tp, _Compare, _Allocator>& __x, 19603e519524SHoward Hinnant const multimap<_Key, _Tp, _Compare, _Allocator>& __y) 19613e519524SHoward Hinnant{ 19623e519524SHoward Hinnant return !(__x == __y); 19633e519524SHoward Hinnant} 19643e519524SHoward Hinnant 19653e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 1966848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 19673e519524SHoward Hinnantbool 19683e519524SHoward Hinnantoperator> (const multimap<_Key, _Tp, _Compare, _Allocator>& __x, 19693e519524SHoward Hinnant const multimap<_Key, _Tp, _Compare, _Allocator>& __y) 19703e519524SHoward Hinnant{ 19713e519524SHoward Hinnant return __y < __x; 19723e519524SHoward Hinnant} 19733e519524SHoward Hinnant 19743e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 1975848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 19763e519524SHoward Hinnantbool 19773e519524SHoward Hinnantoperator>=(const multimap<_Key, _Tp, _Compare, _Allocator>& __x, 19783e519524SHoward Hinnant const multimap<_Key, _Tp, _Compare, _Allocator>& __y) 19793e519524SHoward Hinnant{ 19803e519524SHoward Hinnant return !(__x < __y); 19813e519524SHoward Hinnant} 19823e519524SHoward Hinnant 19833e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 1984848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 19853e519524SHoward Hinnantbool 19863e519524SHoward Hinnantoperator<=(const multimap<_Key, _Tp, _Compare, _Allocator>& __x, 19873e519524SHoward Hinnant const multimap<_Key, _Tp, _Compare, _Allocator>& __y) 19883e519524SHoward Hinnant{ 19893e519524SHoward Hinnant return !(__y < __x); 19903e519524SHoward Hinnant} 19913e519524SHoward Hinnant 19923e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 1993848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 19943e519524SHoward Hinnantvoid 19953e519524SHoward Hinnantswap(multimap<_Key, _Tp, _Compare, _Allocator>& __x, 19963e519524SHoward Hinnant multimap<_Key, _Tp, _Compare, _Allocator>& __y) 19971052ee39SHoward Hinnant _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y))) 19983e519524SHoward Hinnant{ 19993e519524SHoward Hinnant __x.swap(__y); 20003e519524SHoward Hinnant} 20013e519524SHoward Hinnant 20023e519524SHoward Hinnant_LIBCPP_END_NAMESPACE_STD 20033e519524SHoward Hinnant 20043e519524SHoward Hinnant#endif // _LIBCPP_MAP 2005