13e519524SHoward Hinnant// -*- C++ -*- 23e519524SHoward Hinnant//===----------------------------- map ------------------------------------===// 33e519524SHoward Hinnant// 45b08a8a4SHoward Hinnant// The LLVM Compiler Infrastructure 53e519524SHoward Hinnant// 6412dbebeSHoward Hinnant// This file is dual licensed under the MIT and the University of Illinois Open 7412dbebeSHoward Hinnant// Source Licenses. See LICENSE.TXT for details. 83e519524SHoward Hinnant// 93e519524SHoward Hinnant//===----------------------------------------------------------------------===// 103e519524SHoward Hinnant 113e519524SHoward Hinnant#ifndef _LIBCPP_MAP 123e519524SHoward Hinnant#define _LIBCPP_MAP 133e519524SHoward Hinnant 143e519524SHoward Hinnant/* 153e519524SHoward Hinnant 163e519524SHoward Hinnant map synopsis 173e519524SHoward Hinnant 183e519524SHoward Hinnantnamespace std 193e519524SHoward Hinnant{ 203e519524SHoward Hinnant 213e519524SHoward Hinnanttemplate <class Key, class T, class Compare = less<Key>, 223e519524SHoward Hinnant class Allocator = allocator<pair<const Key, T>>> 233e519524SHoward Hinnantclass map 243e519524SHoward Hinnant{ 253e519524SHoward Hinnantpublic: 263e519524SHoward Hinnant // types: 273e519524SHoward Hinnant typedef Key key_type; 283e519524SHoward Hinnant typedef T mapped_type; 293e519524SHoward Hinnant typedef pair<const key_type, mapped_type> value_type; 303e519524SHoward Hinnant typedef Compare key_compare; 313e519524SHoward Hinnant typedef Allocator allocator_type; 323e519524SHoward Hinnant typedef typename allocator_type::reference reference; 333e519524SHoward Hinnant typedef typename allocator_type::const_reference const_reference; 343e519524SHoward Hinnant typedef typename allocator_type::pointer pointer; 353e519524SHoward Hinnant typedef typename allocator_type::const_pointer const_pointer; 363e519524SHoward Hinnant typedef typename allocator_type::size_type size_type; 373e519524SHoward Hinnant typedef typename allocator_type::difference_type difference_type; 383e519524SHoward Hinnant 393e519524SHoward Hinnant typedef implementation-defined iterator; 403e519524SHoward Hinnant typedef implementation-defined const_iterator; 413e519524SHoward Hinnant typedef std::reverse_iterator<iterator> reverse_iterator; 423e519524SHoward Hinnant typedef std::reverse_iterator<const_iterator> const_reverse_iterator; 43b0386a51SErik Pilkington typedef unspecified node_type; // C++17 44b0386a51SErik Pilkington typedef INSERT_RETURN_TYPE<iterator, node_type> insert_return_type; // C++17 453e519524SHoward Hinnant 463e519524SHoward Hinnant class value_compare 473e519524SHoward Hinnant : public binary_function<value_type, value_type, bool> 483e519524SHoward Hinnant { 493e519524SHoward Hinnant friend class map; 503e519524SHoward Hinnant protected: 513e519524SHoward Hinnant key_compare comp; 523e519524SHoward Hinnant 533e519524SHoward Hinnant value_compare(key_compare c); 543e519524SHoward Hinnant public: 553e519524SHoward Hinnant bool operator()(const value_type& x, const value_type& y) const; 563e519524SHoward Hinnant }; 573e519524SHoward Hinnant 583e519524SHoward Hinnant // construct/copy/destroy: 591052ee39SHoward Hinnant map() 601052ee39SHoward Hinnant noexcept( 611052ee39SHoward Hinnant is_nothrow_default_constructible<allocator_type>::value && 621052ee39SHoward Hinnant is_nothrow_default_constructible<key_compare>::value && 631052ee39SHoward Hinnant is_nothrow_copy_constructible<key_compare>::value); 643e519524SHoward Hinnant explicit map(const key_compare& comp); 653e519524SHoward Hinnant map(const key_compare& comp, const allocator_type& a); 663e519524SHoward Hinnant template <class InputIterator> 673e519524SHoward Hinnant map(InputIterator first, InputIterator last, 683e519524SHoward Hinnant const key_compare& comp = key_compare()); 693e519524SHoward Hinnant template <class InputIterator> 703e519524SHoward Hinnant map(InputIterator first, InputIterator last, 713e519524SHoward Hinnant const key_compare& comp, const allocator_type& a); 723e519524SHoward Hinnant map(const map& m); 731052ee39SHoward Hinnant map(map&& m) 741052ee39SHoward Hinnant noexcept( 751052ee39SHoward Hinnant is_nothrow_move_constructible<allocator_type>::value && 761052ee39SHoward Hinnant is_nothrow_move_constructible<key_compare>::value); 773e519524SHoward Hinnant explicit map(const allocator_type& a); 783e519524SHoward Hinnant map(const map& m, const allocator_type& a); 793e519524SHoward Hinnant map(map&& m, const allocator_type& a); 803e519524SHoward Hinnant map(initializer_list<value_type> il, const key_compare& comp = key_compare()); 813e519524SHoward Hinnant map(initializer_list<value_type> il, const key_compare& comp, const allocator_type& a); 82fbc317d4SMarshall Clow template <class InputIterator> 83fbc317d4SMarshall Clow map(InputIterator first, InputIterator last, const allocator_type& a) 84fbc317d4SMarshall Clow : map(first, last, Compare(), a) {} // C++14 85fbc317d4SMarshall Clow map(initializer_list<value_type> il, const allocator_type& a) 86fbc317d4SMarshall Clow : map(il, Compare(), a) {} // C++14 873e519524SHoward Hinnant ~map(); 883e519524SHoward Hinnant 893e519524SHoward Hinnant map& operator=(const map& m); 901052ee39SHoward Hinnant map& operator=(map&& m) 911052ee39SHoward Hinnant noexcept( 921052ee39SHoward Hinnant allocator_type::propagate_on_container_move_assignment::value && 931052ee39SHoward Hinnant is_nothrow_move_assignable<allocator_type>::value && 940e9f71c1SHoward Hinnant is_nothrow_move_assignable<key_compare>::value); 953e519524SHoward Hinnant map& operator=(initializer_list<value_type> il); 963e519524SHoward Hinnant 973e519524SHoward Hinnant // iterators: 980e9f71c1SHoward Hinnant iterator begin() noexcept; 990e9f71c1SHoward Hinnant const_iterator begin() const noexcept; 1000e9f71c1SHoward Hinnant iterator end() noexcept; 1010e9f71c1SHoward Hinnant const_iterator end() const noexcept; 1023e519524SHoward Hinnant 1030e9f71c1SHoward Hinnant reverse_iterator rbegin() noexcept; 1040e9f71c1SHoward Hinnant const_reverse_iterator rbegin() const noexcept; 1050e9f71c1SHoward Hinnant reverse_iterator rend() noexcept; 1060e9f71c1SHoward Hinnant const_reverse_iterator rend() const noexcept; 1073e519524SHoward Hinnant 1080e9f71c1SHoward Hinnant const_iterator cbegin() const noexcept; 1090e9f71c1SHoward Hinnant const_iterator cend() const noexcept; 1100e9f71c1SHoward Hinnant const_reverse_iterator crbegin() const noexcept; 1110e9f71c1SHoward Hinnant const_reverse_iterator crend() const noexcept; 1123e519524SHoward Hinnant 1133e519524SHoward Hinnant // capacity: 1140e9f71c1SHoward Hinnant bool empty() const noexcept; 1150e9f71c1SHoward Hinnant size_type size() const noexcept; 1160e9f71c1SHoward Hinnant size_type max_size() const noexcept; 1173e519524SHoward Hinnant 1183e519524SHoward Hinnant // element access: 1193e519524SHoward Hinnant mapped_type& operator[](const key_type& k); 1203e519524SHoward Hinnant mapped_type& operator[](key_type&& k); 1213e519524SHoward Hinnant 1223e519524SHoward Hinnant mapped_type& at(const key_type& k); 1233e519524SHoward Hinnant const mapped_type& at(const key_type& k) const; 1243e519524SHoward Hinnant 1253e519524SHoward Hinnant // modifiers: 1263e519524SHoward Hinnant template <class... Args> 1273e519524SHoward Hinnant pair<iterator, bool> emplace(Args&&... args); 1283e519524SHoward Hinnant template <class... Args> 1293e519524SHoward Hinnant iterator emplace_hint(const_iterator position, Args&&... args); 1303e519524SHoward Hinnant pair<iterator, bool> insert(const value_type& v); 131afc9ff99SMarshall Clow pair<iterator, bool> insert( value_type&& v); // C++17 1323e519524SHoward Hinnant template <class P> 1333e519524SHoward Hinnant pair<iterator, bool> insert(P&& p); 1343e519524SHoward Hinnant iterator insert(const_iterator position, const value_type& v); 135afc9ff99SMarshall Clow iterator insert(const_iterator position, value_type&& v); // C++17 1363e519524SHoward Hinnant template <class P> 1373e519524SHoward Hinnant iterator insert(const_iterator position, P&& p); 1383e519524SHoward Hinnant template <class InputIterator> 1393e519524SHoward Hinnant void insert(InputIterator first, InputIterator last); 1403e519524SHoward Hinnant void insert(initializer_list<value_type> il); 1413e519524SHoward Hinnant 142b0386a51SErik Pilkington node_type extract(const_iterator position); // C++17 143b0386a51SErik Pilkington node_type extract(const key_type& x); // C++17 144b0386a51SErik Pilkington insert_return_type insert(node_type&& nh); // C++17 145b0386a51SErik Pilkington iterator insert(const_iterator hint, node_type&& nh); // C++17 146b0386a51SErik Pilkington 1478aaf517dSMarshall Clow template <class... Args> 1488aaf517dSMarshall Clow pair<iterator, bool> try_emplace(const key_type& k, Args&&... args); // C++17 1498aaf517dSMarshall Clow template <class... Args> 1508aaf517dSMarshall Clow pair<iterator, bool> try_emplace(key_type&& k, Args&&... args); // C++17 1518aaf517dSMarshall Clow template <class... Args> 1528aaf517dSMarshall Clow iterator try_emplace(const_iterator hint, const key_type& k, Args&&... args); // C++17 1538aaf517dSMarshall Clow template <class... Args> 1548aaf517dSMarshall Clow iterator try_emplace(const_iterator hint, key_type&& k, Args&&... args); // C++17 1558aaf517dSMarshall Clow template <class M> 1568aaf517dSMarshall Clow pair<iterator, bool> insert_or_assign(const key_type& k, M&& obj); // C++17 1578aaf517dSMarshall Clow template <class M> 1588aaf517dSMarshall Clow pair<iterator, bool> insert_or_assign(key_type&& k, M&& obj); // C++17 1598aaf517dSMarshall Clow template <class M> 1608aaf517dSMarshall Clow iterator insert_or_assign(const_iterator hint, const key_type& k, M&& obj); // C++17 1618aaf517dSMarshall Clow template <class M> 1628aaf517dSMarshall Clow iterator insert_or_assign(const_iterator hint, key_type&& k, M&& obj); // C++17 1638aaf517dSMarshall Clow 1643e519524SHoward Hinnant iterator erase(const_iterator position); 165ec392968SMarshall Clow iterator erase(iterator position); // C++14 1663e519524SHoward Hinnant size_type erase(const key_type& k); 1673e519524SHoward Hinnant iterator erase(const_iterator first, const_iterator last); 1680e9f71c1SHoward Hinnant void clear() noexcept; 1693e519524SHoward Hinnant 1701052ee39SHoward Hinnant void swap(map& m) 171e3fbe143SMarshall Clow noexcept(allocator_traits<allocator_type>::is_always_equal::value && 172f07dd8d0SEric Fiselier is_nothrow_swappable<key_compare>::value); // C++17 1733e519524SHoward Hinnant 1743e519524SHoward Hinnant // observers: 1750e9f71c1SHoward Hinnant allocator_type get_allocator() const noexcept; 1763e519524SHoward Hinnant key_compare key_comp() const; 1773e519524SHoward Hinnant value_compare value_comp() const; 1783e519524SHoward Hinnant 1793e519524SHoward Hinnant // map operations: 1803e519524SHoward Hinnant iterator find(const key_type& k); 1813e519524SHoward Hinnant const_iterator find(const key_type& k) const; 1822585835cSMarshall Clow template<typename K> 1832585835cSMarshall Clow iterator find(const K& x); // C++14 1842585835cSMarshall Clow template<typename K> 1852585835cSMarshall Clow const_iterator find(const K& x) const; // C++14 1862585835cSMarshall Clow template<typename K> 1870aacbc92SMarshall Clow size_type count(const K& x) const; // C++14 1882585835cSMarshall Clow 1893e519524SHoward Hinnant size_type count(const key_type& k) const; 1903e519524SHoward Hinnant iterator lower_bound(const key_type& k); 1913e519524SHoward Hinnant const_iterator lower_bound(const key_type& k) const; 1922585835cSMarshall Clow template<typename K> 1932585835cSMarshall Clow iterator lower_bound(const K& x); // C++14 1942585835cSMarshall Clow template<typename K> 1952585835cSMarshall Clow const_iterator lower_bound(const K& x) const; // C++14 1962585835cSMarshall Clow 1973e519524SHoward Hinnant iterator upper_bound(const key_type& k); 1983e519524SHoward Hinnant const_iterator upper_bound(const key_type& k) const; 1992585835cSMarshall Clow template<typename K> 2002585835cSMarshall Clow iterator upper_bound(const K& x); // C++14 2012585835cSMarshall Clow template<typename K> 2022585835cSMarshall Clow const_iterator upper_bound(const K& x) const; // C++14 2032585835cSMarshall Clow 2043e519524SHoward Hinnant pair<iterator,iterator> equal_range(const key_type& k); 2053e519524SHoward Hinnant pair<const_iterator,const_iterator> equal_range(const key_type& k) const; 2062585835cSMarshall Clow template<typename K> 2072585835cSMarshall Clow pair<iterator,iterator> equal_range(const K& x); // C++14 2082585835cSMarshall Clow template<typename K> 2092585835cSMarshall Clow pair<const_iterator,const_iterator> equal_range(const K& x) const; // C++14 2103e519524SHoward Hinnant}; 2113e519524SHoward Hinnant 2123e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator> 2133e519524SHoward Hinnantbool 2143e519524SHoward Hinnantoperator==(const map<Key, T, Compare, Allocator>& x, 2153e519524SHoward Hinnant const map<Key, T, Compare, Allocator>& y); 2163e519524SHoward Hinnant 2173e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator> 2183e519524SHoward Hinnantbool 2193e519524SHoward Hinnantoperator< (const map<Key, T, Compare, Allocator>& x, 2203e519524SHoward Hinnant const map<Key, T, Compare, Allocator>& y); 2213e519524SHoward Hinnant 2223e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator> 2233e519524SHoward Hinnantbool 2243e519524SHoward Hinnantoperator!=(const map<Key, T, Compare, Allocator>& x, 2253e519524SHoward Hinnant const map<Key, T, Compare, Allocator>& y); 2263e519524SHoward Hinnant 2273e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator> 2283e519524SHoward Hinnantbool 2293e519524SHoward Hinnantoperator> (const map<Key, T, Compare, Allocator>& x, 2303e519524SHoward Hinnant const map<Key, T, Compare, Allocator>& y); 2313e519524SHoward Hinnant 2323e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator> 2333e519524SHoward Hinnantbool 2343e519524SHoward Hinnantoperator>=(const map<Key, T, Compare, Allocator>& x, 2353e519524SHoward Hinnant const map<Key, T, Compare, Allocator>& y); 2363e519524SHoward Hinnant 2373e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator> 2383e519524SHoward Hinnantbool 2393e519524SHoward Hinnantoperator<=(const map<Key, T, Compare, Allocator>& x, 2403e519524SHoward Hinnant const map<Key, T, Compare, Allocator>& y); 2413e519524SHoward Hinnant 2423e519524SHoward Hinnant// specialized algorithms: 2433e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator> 2443e519524SHoward Hinnantvoid 2451052ee39SHoward Hinnantswap(map<Key, T, Compare, Allocator>& x, map<Key, T, Compare, Allocator>& y) 2461052ee39SHoward Hinnant noexcept(noexcept(x.swap(y))); 2473e519524SHoward Hinnant 2483e519524SHoward Hinnanttemplate <class Key, class T, class Compare = less<Key>, 2493e519524SHoward Hinnant class Allocator = allocator<pair<const Key, T>>> 2503e519524SHoward Hinnantclass multimap 2513e519524SHoward Hinnant{ 2523e519524SHoward Hinnantpublic: 2533e519524SHoward Hinnant // types: 2543e519524SHoward Hinnant typedef Key key_type; 2553e519524SHoward Hinnant typedef T mapped_type; 2563e519524SHoward Hinnant typedef pair<const key_type,mapped_type> value_type; 2573e519524SHoward Hinnant typedef Compare key_compare; 2583e519524SHoward Hinnant typedef Allocator allocator_type; 2593e519524SHoward Hinnant typedef typename allocator_type::reference reference; 2603e519524SHoward Hinnant typedef typename allocator_type::const_reference const_reference; 2613e519524SHoward Hinnant typedef typename allocator_type::size_type size_type; 2623e519524SHoward Hinnant typedef typename allocator_type::difference_type difference_type; 2633e519524SHoward Hinnant typedef typename allocator_type::pointer pointer; 2643e519524SHoward Hinnant typedef typename allocator_type::const_pointer const_pointer; 2653e519524SHoward Hinnant 2663e519524SHoward Hinnant typedef implementation-defined iterator; 2673e519524SHoward Hinnant typedef implementation-defined const_iterator; 2683e519524SHoward Hinnant typedef std::reverse_iterator<iterator> reverse_iterator; 2693e519524SHoward Hinnant typedef std::reverse_iterator<const_iterator> const_reverse_iterator; 270b0386a51SErik Pilkington typedef unspecified node_type; // C++17 2713e519524SHoward Hinnant 2723e519524SHoward Hinnant class value_compare 2733e519524SHoward Hinnant : public binary_function<value_type,value_type,bool> 2743e519524SHoward Hinnant { 2753e519524SHoward Hinnant friend class multimap; 2763e519524SHoward Hinnant protected: 2773e519524SHoward Hinnant key_compare comp; 2783e519524SHoward Hinnant value_compare(key_compare c); 2793e519524SHoward Hinnant public: 2803e519524SHoward Hinnant bool operator()(const value_type& x, const value_type& y) const; 2813e519524SHoward Hinnant }; 2823e519524SHoward Hinnant 2833e519524SHoward Hinnant // construct/copy/destroy: 2841052ee39SHoward Hinnant multimap() 2851052ee39SHoward Hinnant noexcept( 2861052ee39SHoward Hinnant is_nothrow_default_constructible<allocator_type>::value && 2871052ee39SHoward Hinnant is_nothrow_default_constructible<key_compare>::value && 2881052ee39SHoward Hinnant is_nothrow_copy_constructible<key_compare>::value); 2891052ee39SHoward Hinnant explicit multimap(const key_compare& comp); 2903e519524SHoward Hinnant multimap(const key_compare& comp, const allocator_type& a); 2913e519524SHoward Hinnant template <class InputIterator> 2923e519524SHoward Hinnant multimap(InputIterator first, InputIterator last, const key_compare& comp); 2933e519524SHoward Hinnant template <class InputIterator> 2943e519524SHoward Hinnant multimap(InputIterator first, InputIterator last, const key_compare& comp, 2953e519524SHoward Hinnant const allocator_type& a); 2963e519524SHoward Hinnant multimap(const multimap& m); 2971052ee39SHoward Hinnant multimap(multimap&& m) 2981052ee39SHoward Hinnant noexcept( 2991052ee39SHoward Hinnant is_nothrow_move_constructible<allocator_type>::value && 3001052ee39SHoward Hinnant is_nothrow_move_constructible<key_compare>::value); 3013e519524SHoward Hinnant explicit multimap(const allocator_type& a); 3023e519524SHoward Hinnant multimap(const multimap& m, const allocator_type& a); 3033e519524SHoward Hinnant multimap(multimap&& m, const allocator_type& a); 3043e519524SHoward Hinnant multimap(initializer_list<value_type> il, const key_compare& comp = key_compare()); 3053e519524SHoward Hinnant multimap(initializer_list<value_type> il, const key_compare& comp, 3063e519524SHoward Hinnant const allocator_type& a); 307fbc317d4SMarshall Clow template <class InputIterator> 308fbc317d4SMarshall Clow multimap(InputIterator first, InputIterator last, const allocator_type& a) 309fbc317d4SMarshall Clow : multimap(first, last, Compare(), a) {} // C++14 310fbc317d4SMarshall Clow multimap(initializer_list<value_type> il, const allocator_type& a) 311fbc317d4SMarshall Clow : multimap(il, Compare(), a) {} // C++14 3123e519524SHoward Hinnant ~multimap(); 3133e519524SHoward Hinnant 3143e519524SHoward Hinnant multimap& operator=(const multimap& m); 3151052ee39SHoward Hinnant multimap& operator=(multimap&& m) 3161052ee39SHoward Hinnant noexcept( 3171052ee39SHoward Hinnant allocator_type::propagate_on_container_move_assignment::value && 3181052ee39SHoward Hinnant is_nothrow_move_assignable<allocator_type>::value && 3190e9f71c1SHoward Hinnant is_nothrow_move_assignable<key_compare>::value); 3203e519524SHoward Hinnant multimap& operator=(initializer_list<value_type> il); 3213e519524SHoward Hinnant 3223e519524SHoward Hinnant // iterators: 3230e9f71c1SHoward Hinnant iterator begin() noexcept; 3240e9f71c1SHoward Hinnant const_iterator begin() const noexcept; 3250e9f71c1SHoward Hinnant iterator end() noexcept; 3260e9f71c1SHoward Hinnant const_iterator end() const noexcept; 3273e519524SHoward Hinnant 3280e9f71c1SHoward Hinnant reverse_iterator rbegin() noexcept; 3290e9f71c1SHoward Hinnant const_reverse_iterator rbegin() const noexcept; 3300e9f71c1SHoward Hinnant reverse_iterator rend() noexcept; 3310e9f71c1SHoward Hinnant const_reverse_iterator rend() const noexcept; 3323e519524SHoward Hinnant 3330e9f71c1SHoward Hinnant const_iterator cbegin() const noexcept; 3340e9f71c1SHoward Hinnant const_iterator cend() const noexcept; 3350e9f71c1SHoward Hinnant const_reverse_iterator crbegin() const noexcept; 3360e9f71c1SHoward Hinnant const_reverse_iterator crend() const noexcept; 3373e519524SHoward Hinnant 3383e519524SHoward Hinnant // capacity: 3390e9f71c1SHoward Hinnant bool empty() const noexcept; 3400e9f71c1SHoward Hinnant size_type size() const noexcept; 3410e9f71c1SHoward Hinnant size_type max_size() const noexcept; 3423e519524SHoward Hinnant 3433e519524SHoward Hinnant // modifiers: 3443e519524SHoward Hinnant template <class... Args> 3453e519524SHoward Hinnant iterator emplace(Args&&... args); 3463e519524SHoward Hinnant template <class... Args> 3473e519524SHoward Hinnant iterator emplace_hint(const_iterator position, Args&&... args); 3483e519524SHoward Hinnant iterator insert(const value_type& v); 349afc9ff99SMarshall Clow iterator insert( value_type&& v); // C++17 3503e519524SHoward Hinnant template <class P> 3513e519524SHoward Hinnant iterator insert(P&& p); 3523e519524SHoward Hinnant iterator insert(const_iterator position, const value_type& v); 353afc9ff99SMarshall Clow iterator insert(const_iterator position, value_type&& v); // C++17 3543e519524SHoward Hinnant template <class P> 3553e519524SHoward Hinnant iterator insert(const_iterator position, P&& p); 3563e519524SHoward Hinnant template <class InputIterator> 3573e519524SHoward Hinnant void insert(InputIterator first, InputIterator last); 3583e519524SHoward Hinnant void insert(initializer_list<value_type> il); 3593e519524SHoward Hinnant 360b0386a51SErik Pilkington node_type extract(const_iterator position); // C++17 361b0386a51SErik Pilkington node_type extract(const key_type& x); // C++17 362b0386a51SErik Pilkington iterator insert(node_type&& nh); // C++17 363b0386a51SErik Pilkington iterator insert(const_iterator hint, node_type&& nh); // C++17 364b0386a51SErik Pilkington 3653e519524SHoward Hinnant iterator erase(const_iterator position); 366ec392968SMarshall Clow iterator erase(iterator position); // C++14 3673e519524SHoward Hinnant size_type erase(const key_type& k); 3683e519524SHoward Hinnant iterator erase(const_iterator first, const_iterator last); 3690e9f71c1SHoward Hinnant void clear() noexcept; 3703e519524SHoward Hinnant 3711052ee39SHoward Hinnant void swap(multimap& m) 372e3fbe143SMarshall Clow noexcept(allocator_traits<allocator_type>::is_always_equal::value && 373f07dd8d0SEric Fiselier is_nothrow_swappable<key_compare>::value); // C++17 3743e519524SHoward Hinnant 3753e519524SHoward Hinnant // observers: 3760e9f71c1SHoward Hinnant allocator_type get_allocator() const noexcept; 3773e519524SHoward Hinnant key_compare key_comp() const; 3783e519524SHoward Hinnant value_compare value_comp() const; 3793e519524SHoward Hinnant 3803e519524SHoward Hinnant // map operations: 3813e519524SHoward Hinnant iterator find(const key_type& k); 3823e519524SHoward Hinnant const_iterator find(const key_type& k) const; 3832585835cSMarshall Clow template<typename K> 3842585835cSMarshall Clow iterator find(const K& x); // C++14 3852585835cSMarshall Clow template<typename K> 3862585835cSMarshall Clow const_iterator find(const K& x) const; // C++14 3872585835cSMarshall Clow template<typename K> 3880aacbc92SMarshall Clow size_type count(const K& x) const; // C++14 3892585835cSMarshall Clow 3903e519524SHoward Hinnant size_type count(const key_type& k) const; 3913e519524SHoward Hinnant iterator lower_bound(const key_type& k); 3923e519524SHoward Hinnant const_iterator lower_bound(const key_type& k) const; 3932585835cSMarshall Clow template<typename K> 3942585835cSMarshall Clow iterator lower_bound(const K& x); // C++14 3952585835cSMarshall Clow template<typename K> 3962585835cSMarshall Clow const_iterator lower_bound(const K& x) const; // C++14 3972585835cSMarshall Clow 3983e519524SHoward Hinnant iterator upper_bound(const key_type& k); 3993e519524SHoward Hinnant const_iterator upper_bound(const key_type& k) const; 4002585835cSMarshall Clow template<typename K> 4012585835cSMarshall Clow iterator upper_bound(const K& x); // C++14 4022585835cSMarshall Clow template<typename K> 4032585835cSMarshall Clow const_iterator upper_bound(const K& x) const; // C++14 4042585835cSMarshall Clow 4053e519524SHoward Hinnant pair<iterator,iterator> equal_range(const key_type& k); 4063e519524SHoward Hinnant pair<const_iterator,const_iterator> equal_range(const key_type& k) const; 4072585835cSMarshall Clow template<typename K> 4082585835cSMarshall Clow pair<iterator,iterator> equal_range(const K& x); // C++14 4092585835cSMarshall Clow template<typename K> 4102585835cSMarshall Clow pair<const_iterator,const_iterator> equal_range(const K& x) const; // C++14 4113e519524SHoward Hinnant}; 4123e519524SHoward Hinnant 4133e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator> 4143e519524SHoward Hinnantbool 4153e519524SHoward Hinnantoperator==(const multimap<Key, T, Compare, Allocator>& x, 4163e519524SHoward Hinnant const multimap<Key, T, Compare, Allocator>& y); 4173e519524SHoward Hinnant 4183e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator> 4193e519524SHoward Hinnantbool 4203e519524SHoward Hinnantoperator< (const multimap<Key, T, Compare, Allocator>& x, 4213e519524SHoward Hinnant const multimap<Key, T, Compare, Allocator>& y); 4223e519524SHoward Hinnant 4233e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator> 4243e519524SHoward Hinnantbool 4253e519524SHoward Hinnantoperator!=(const multimap<Key, T, Compare, Allocator>& x, 4263e519524SHoward Hinnant const multimap<Key, T, Compare, Allocator>& y); 4273e519524SHoward Hinnant 4283e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator> 4293e519524SHoward Hinnantbool 4303e519524SHoward Hinnantoperator> (const multimap<Key, T, Compare, Allocator>& x, 4313e519524SHoward Hinnant const multimap<Key, T, Compare, Allocator>& y); 4323e519524SHoward Hinnant 4333e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator> 4343e519524SHoward Hinnantbool 4353e519524SHoward Hinnantoperator>=(const multimap<Key, T, Compare, Allocator>& x, 4363e519524SHoward Hinnant const multimap<Key, T, Compare, Allocator>& y); 4373e519524SHoward Hinnant 4383e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator> 4393e519524SHoward Hinnantbool 4403e519524SHoward Hinnantoperator<=(const multimap<Key, T, Compare, Allocator>& x, 4413e519524SHoward Hinnant const multimap<Key, T, Compare, Allocator>& y); 4423e519524SHoward Hinnant 4433e519524SHoward Hinnant// specialized algorithms: 4443e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator> 4453e519524SHoward Hinnantvoid 4463e519524SHoward Hinnantswap(multimap<Key, T, Compare, Allocator>& x, 4471052ee39SHoward Hinnant multimap<Key, T, Compare, Allocator>& y) 4481052ee39SHoward Hinnant noexcept(noexcept(x.swap(y))); 4493e519524SHoward Hinnant 4503e519524SHoward Hinnant} // std 4513e519524SHoward Hinnant 4523e519524SHoward Hinnant*/ 4533e519524SHoward Hinnant 4543e519524SHoward Hinnant#include <__config> 4553e519524SHoward Hinnant#include <__tree> 456b0386a51SErik Pilkington#include <__node_handle> 4573e519524SHoward Hinnant#include <iterator> 4583e519524SHoward Hinnant#include <memory> 4593e519524SHoward Hinnant#include <utility> 4603e519524SHoward Hinnant#include <functional> 4613e519524SHoward Hinnant#include <initializer_list> 462ee187e24SEric Fiselier#include <type_traits> 463*f56972e2SMarshall Clow#include <version> 4643e519524SHoward Hinnant 465073458b1SHoward Hinnant#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 4663e519524SHoward Hinnant#pragma GCC system_header 467073458b1SHoward Hinnant#endif 4683e519524SHoward Hinnant 4693e519524SHoward Hinnant_LIBCPP_BEGIN_NAMESPACE_STD 4703e519524SHoward Hinnant 471b1e7a12eSEric Fiseliertemplate <class _Key, class _CP, class _Compare, bool _IsSmall> 4723e519524SHoward Hinnantclass __map_value_compare 4733e519524SHoward Hinnant : private _Compare 4743e519524SHoward Hinnant{ 4753e519524SHoward Hinnantpublic: 476848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 4771052ee39SHoward Hinnant __map_value_compare() 4781052ee39SHoward Hinnant _NOEXCEPT_(is_nothrow_default_constructible<_Compare>::value) 4791052ee39SHoward Hinnant : _Compare() {} 480848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 4811052ee39SHoward Hinnant __map_value_compare(_Compare c) 4821052ee39SHoward Hinnant _NOEXCEPT_(is_nothrow_copy_constructible<_Compare>::value) 4831052ee39SHoward Hinnant : _Compare(c) {} 484848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 4851052ee39SHoward Hinnant const _Compare& key_comp() const _NOEXCEPT {return *this;} 486848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 4873e519524SHoward Hinnant bool operator()(const _CP& __x, const _CP& __y) const 488f52318b4SErik Pilkington {return static_cast<const _Compare&>(*this)(__x.__get_value().first, __y.__get_value().first);} 489848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 4903e519524SHoward Hinnant bool operator()(const _CP& __x, const _Key& __y) const 491f52318b4SErik Pilkington {return static_cast<const _Compare&>(*this)(__x.__get_value().first, __y);} 492848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 4933e519524SHoward Hinnant bool operator()(const _Key& __x, const _CP& __y) const 494f52318b4SErik Pilkington {return static_cast<const _Compare&>(*this)(__x, __y.__get_value().first);} 495e3fbe143SMarshall Clow void swap(__map_value_compare&__y) 496e3fbe143SMarshall Clow _NOEXCEPT_(__is_nothrow_swappable<_Compare>::value) 497e3fbe143SMarshall Clow { 498e3fbe143SMarshall Clow using _VSTD::swap; 499e1ec2986SEric Fiselier swap(static_cast<_Compare&>(*this), static_cast<_Compare&>(__y)); 500e3fbe143SMarshall Clow } 5012585835cSMarshall Clow 5022585835cSMarshall Clow#if _LIBCPP_STD_VER > 11 5032585835cSMarshall Clow template <typename _K2> 5042585835cSMarshall Clow _LIBCPP_INLINE_VISIBILITY 5052585835cSMarshall Clow typename enable_if<__is_transparent<_Compare, _K2>::value, bool>::type 5062585835cSMarshall Clow operator () ( const _K2& __x, const _CP& __y ) const 507f52318b4SErik Pilkington {return static_cast<const _Compare&>(*this) (__x, __y.__get_value().first);} 5082585835cSMarshall Clow 5092585835cSMarshall Clow template <typename _K2> 5102585835cSMarshall Clow _LIBCPP_INLINE_VISIBILITY 5112585835cSMarshall Clow typename enable_if<__is_transparent<_Compare, _K2>::value, bool>::type 5122585835cSMarshall Clow operator () (const _CP& __x, const _K2& __y) const 513f52318b4SErik Pilkington {return static_cast<const _Compare&>(*this) (__x.__get_value().first, __y);} 5142585835cSMarshall Clow#endif 5153e519524SHoward Hinnant}; 5163e519524SHoward Hinnant 517abb160e6SHoward Hinnanttemplate <class _Key, class _CP, class _Compare> 518abb160e6SHoward Hinnantclass __map_value_compare<_Key, _CP, _Compare, false> 5193e519524SHoward Hinnant{ 5203e519524SHoward Hinnant _Compare comp; 5213e519524SHoward Hinnant 5223e519524SHoward Hinnantpublic: 523848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 5241052ee39SHoward Hinnant __map_value_compare() 5251052ee39SHoward Hinnant _NOEXCEPT_(is_nothrow_default_constructible<_Compare>::value) 5261052ee39SHoward Hinnant : comp() {} 527848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 5281052ee39SHoward Hinnant __map_value_compare(_Compare c) 5291052ee39SHoward Hinnant _NOEXCEPT_(is_nothrow_copy_constructible<_Compare>::value) 5301052ee39SHoward Hinnant : comp(c) {} 531848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 5321052ee39SHoward Hinnant const _Compare& key_comp() const _NOEXCEPT {return comp;} 5333e519524SHoward Hinnant 534848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 5353e519524SHoward Hinnant bool operator()(const _CP& __x, const _CP& __y) const 536f52318b4SErik Pilkington {return comp(__x.__get_value().first, __y.__get_value().first);} 537848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 5383e519524SHoward Hinnant bool operator()(const _CP& __x, const _Key& __y) const 539f52318b4SErik Pilkington {return comp(__x.__get_value().first, __y);} 540848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 5413e519524SHoward Hinnant bool operator()(const _Key& __x, const _CP& __y) const 542f52318b4SErik Pilkington {return comp(__x, __y.__get_value().first);} 543e3fbe143SMarshall Clow void swap(__map_value_compare&__y) 544e3fbe143SMarshall Clow _NOEXCEPT_(__is_nothrow_swappable<_Compare>::value) 545e3fbe143SMarshall Clow { 546e3fbe143SMarshall Clow using _VSTD::swap; 547e3fbe143SMarshall Clow swap(comp, __y.comp); 548e3fbe143SMarshall Clow } 5492585835cSMarshall Clow 5502585835cSMarshall Clow#if _LIBCPP_STD_VER > 11 5512585835cSMarshall Clow template <typename _K2> 5522585835cSMarshall Clow _LIBCPP_INLINE_VISIBILITY 5532585835cSMarshall Clow typename enable_if<__is_transparent<_Compare, _K2>::value, bool>::type 5542585835cSMarshall Clow operator () ( const _K2& __x, const _CP& __y ) const 555f52318b4SErik Pilkington {return comp (__x, __y.__get_value().first);} 5562585835cSMarshall Clow 5572585835cSMarshall Clow template <typename _K2> 5582585835cSMarshall Clow _LIBCPP_INLINE_VISIBILITY 5592585835cSMarshall Clow typename enable_if<__is_transparent<_Compare, _K2>::value, bool>::type 5602585835cSMarshall Clow operator () (const _CP& __x, const _K2& __y) const 561f52318b4SErik Pilkington {return comp (__x.__get_value().first, __y);} 5622585835cSMarshall Clow#endif 5633e519524SHoward Hinnant}; 5643e519524SHoward Hinnant 565e3fbe143SMarshall Clowtemplate <class _Key, class _CP, class _Compare, bool __b> 566e3fbe143SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY 567e3fbe143SMarshall Clowvoid 568e3fbe143SMarshall Clowswap(__map_value_compare<_Key, _CP, _Compare, __b>& __x, 569e3fbe143SMarshall Clow __map_value_compare<_Key, _CP, _Compare, __b>& __y) 570e3fbe143SMarshall Clow _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y))) 571e3fbe143SMarshall Clow{ 572e3fbe143SMarshall Clow __x.swap(__y); 573e3fbe143SMarshall Clow} 574e3fbe143SMarshall Clow 5753e519524SHoward Hinnanttemplate <class _Allocator> 5763e519524SHoward Hinnantclass __map_node_destructor 5773e519524SHoward Hinnant{ 5783e519524SHoward Hinnant typedef _Allocator allocator_type; 5793e519524SHoward Hinnant typedef allocator_traits<allocator_type> __alloc_traits; 580089a7cc5SEric Fiselier 5813e519524SHoward Hinnantpublic: 5823e519524SHoward Hinnant typedef typename __alloc_traits::pointer pointer; 5833e519524SHoward Hinnant 584089a7cc5SEric Fiselierprivate: 5853e519524SHoward Hinnant allocator_type& __na_; 5863e519524SHoward Hinnant 5873e519524SHoward Hinnant __map_node_destructor& operator=(const __map_node_destructor&); 5883e519524SHoward Hinnant 5893e519524SHoward Hinnantpublic: 5903e519524SHoward Hinnant bool __first_constructed; 5913e519524SHoward Hinnant bool __second_constructed; 5923e519524SHoward Hinnant 593848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 5941052ee39SHoward Hinnant explicit __map_node_destructor(allocator_type& __na) _NOEXCEPT 5953e519524SHoward Hinnant : __na_(__na), 5963e519524SHoward Hinnant __first_constructed(false), 5973e519524SHoward Hinnant __second_constructed(false) 5983e519524SHoward Hinnant {} 5993e519524SHoward Hinnant 60018293116SEric Fiselier#ifndef _LIBCPP_CXX03_LANG 601848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 6021052ee39SHoward Hinnant __map_node_destructor(__tree_node_destructor<allocator_type>&& __x) _NOEXCEPT 6033e519524SHoward Hinnant : __na_(__x.__na_), 6043e519524SHoward Hinnant __first_constructed(__x.__value_constructed), 6053e519524SHoward Hinnant __second_constructed(__x.__value_constructed) 6063e519524SHoward Hinnant { 6073e519524SHoward Hinnant __x.__value_constructed = false; 6083e519524SHoward Hinnant } 60918293116SEric Fiselier#endif // _LIBCPP_CXX03_LANG 6103e519524SHoward Hinnant 611848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 6121052ee39SHoward Hinnant void operator()(pointer __p) _NOEXCEPT 6133e519524SHoward Hinnant { 6143e519524SHoward Hinnant if (__second_constructed) 615f52318b4SErik Pilkington __alloc_traits::destroy(__na_, _VSTD::addressof(__p->__value_.__get_value().second)); 6163e519524SHoward Hinnant if (__first_constructed) 617f52318b4SErik Pilkington __alloc_traits::destroy(__na_, _VSTD::addressof(__p->__value_.__get_value().first)); 6183e519524SHoward Hinnant if (__p) 6193e519524SHoward Hinnant __alloc_traits::deallocate(__na_, __p, 1); 6203e519524SHoward Hinnant } 6213e519524SHoward Hinnant}; 6223e519524SHoward Hinnant 623ce53420eSHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 624ce53420eSHoward Hinnant class map; 625ce53420eSHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 626ce53420eSHoward Hinnant class multimap; 627ce53420eSHoward Hinnanttemplate <class _TreeIterator> class __map_const_iterator; 6283e519524SHoward Hinnant 629089a7cc5SEric Fiselier#ifndef _LIBCPP_CXX03_LANG 6309fd9f84fSHoward Hinnant 6319fd9f84fSHoward Hinnanttemplate <class _Key, class _Tp> 632f52318b4SErik Pilkingtonstruct __value_type 6339fd9f84fSHoward Hinnant{ 6349fd9f84fSHoward Hinnant typedef _Key key_type; 6359fd9f84fSHoward Hinnant typedef _Tp mapped_type; 6369fd9f84fSHoward Hinnant typedef pair<const key_type, mapped_type> value_type; 637f52318b4SErik Pilkington typedef pair<key_type&, mapped_type&> __nc_ref_pair_type; 638f52318b4SErik Pilkington typedef pair<key_type&&, mapped_type&&> __nc_rref_pair_type; 6399fd9f84fSHoward Hinnant 640f52318b4SErik Pilkingtonprivate: 6419fd9f84fSHoward Hinnant value_type __cc; 642f52318b4SErik Pilkington 643f52318b4SErik Pilkingtonpublic: 644f52318b4SErik Pilkington _LIBCPP_INLINE_VISIBILITY 645f52318b4SErik Pilkington value_type& __get_value() 646f52318b4SErik Pilkington { 647f52318b4SErik Pilkington#if _LIBCPP_STD_VER > 14 648f52318b4SErik Pilkington return *_VSTD::launder(_VSTD::addressof(__cc)); 649f52318b4SErik Pilkington#else 650f52318b4SErik Pilkington return __cc; 651f52318b4SErik Pilkington#endif 652f52318b4SErik Pilkington } 653f52318b4SErik Pilkington 654f52318b4SErik Pilkington _LIBCPP_INLINE_VISIBILITY 655f52318b4SErik Pilkington const value_type& __get_value() const 656f52318b4SErik Pilkington { 657f52318b4SErik Pilkington#if _LIBCPP_STD_VER > 14 658f52318b4SErik Pilkington return *_VSTD::launder(_VSTD::addressof(__cc)); 659f52318b4SErik Pilkington#else 660f52318b4SErik Pilkington return __cc; 661f52318b4SErik Pilkington#endif 662f52318b4SErik Pilkington } 663f52318b4SErik Pilkington 664f52318b4SErik Pilkington _LIBCPP_INLINE_VISIBILITY 665f52318b4SErik Pilkington __nc_ref_pair_type __ref() 666f52318b4SErik Pilkington { 667f52318b4SErik Pilkington value_type& __v = __get_value(); 668f52318b4SErik Pilkington return __nc_ref_pair_type(const_cast<key_type&>(__v.first), __v.second); 669f52318b4SErik Pilkington } 670f52318b4SErik Pilkington 671f52318b4SErik Pilkington _LIBCPP_INLINE_VISIBILITY 672f52318b4SErik Pilkington __nc_rref_pair_type __move() 673f52318b4SErik Pilkington { 674f52318b4SErik Pilkington value_type& __v = __get_value(); 675f52318b4SErik Pilkington return __nc_rref_pair_type( 676f52318b4SErik Pilkington _VSTD::move(const_cast<key_type&>(__v.first)), 677f52318b4SErik Pilkington _VSTD::move(__v.second)); 678f52318b4SErik Pilkington } 6799fd9f84fSHoward Hinnant 6809fd9f84fSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 6819fd9f84fSHoward Hinnant __value_type& operator=(const __value_type& __v) 682f52318b4SErik Pilkington { 683f52318b4SErik Pilkington __ref() = __v.__get_value(); 684f52318b4SErik Pilkington return *this; 685f52318b4SErik Pilkington } 6869fd9f84fSHoward Hinnant 6879fd9f84fSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 6889fd9f84fSHoward Hinnant __value_type& operator=(__value_type&& __v) 689f52318b4SErik Pilkington { 690f52318b4SErik Pilkington __ref() = __v.__move(); 691f52318b4SErik Pilkington return *this; 692f52318b4SErik Pilkington } 6939fd9f84fSHoward Hinnant 6945e3ea4ddSEric Fiselier template <class _ValueTp, 6955e3ea4ddSEric Fiselier class = typename enable_if< 6965e3ea4ddSEric Fiselier __is_same_uncvref<_ValueTp, value_type>::value 6975e3ea4ddSEric Fiselier >::type 6985e3ea4ddSEric Fiselier > 6999fd9f84fSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 700f52318b4SErik Pilkington __value_type& operator=(_ValueTp&& __v) 701f52318b4SErik Pilkington { 702f52318b4SErik Pilkington __ref() = _VSTD::forward<_ValueTp>(__v); 703f52318b4SErik Pilkington return *this; 7045e3ea4ddSEric Fiselier } 7055e3ea4ddSEric Fiselier 7065e3ea4ddSEric Fiselierprivate: 7075e3ea4ddSEric Fiselier __value_type() _LIBCPP_EQUAL_DELETE; 7085e3ea4ddSEric Fiselier ~__value_type() _LIBCPP_EQUAL_DELETE; 7095e3ea4ddSEric Fiselier __value_type(const __value_type& __v) _LIBCPP_EQUAL_DELETE; 7105e3ea4ddSEric Fiselier __value_type(__value_type&& __v) _LIBCPP_EQUAL_DELETE; 7119fd9f84fSHoward Hinnant}; 7129fd9f84fSHoward Hinnant 7139fd9f84fSHoward Hinnant#else 7149fd9f84fSHoward Hinnant 7159fd9f84fSHoward Hinnanttemplate <class _Key, class _Tp> 7169fd9f84fSHoward Hinnantstruct __value_type 7179fd9f84fSHoward Hinnant{ 7189fd9f84fSHoward Hinnant typedef _Key key_type; 7199fd9f84fSHoward Hinnant typedef _Tp mapped_type; 7209fd9f84fSHoward Hinnant typedef pair<const key_type, mapped_type> value_type; 7219fd9f84fSHoward Hinnant 722f52318b4SErik Pilkingtonprivate: 7239fd9f84fSHoward Hinnant value_type __cc; 7249fd9f84fSHoward Hinnant 725f52318b4SErik Pilkingtonpublic: 726f52318b4SErik Pilkington _LIBCPP_INLINE_VISIBILITY 727f52318b4SErik Pilkington value_type& __get_value() { return __cc; } 728f52318b4SErik Pilkington _LIBCPP_INLINE_VISIBILITY 729f52318b4SErik Pilkington const value_type& __get_value() const { return __cc; } 730f52318b4SErik Pilkington 7315e3ea4ddSEric Fiselierprivate: 7325e3ea4ddSEric Fiselier __value_type(); 7335e3ea4ddSEric Fiselier __value_type(__value_type const&); 7345e3ea4ddSEric Fiselier __value_type& operator=(__value_type const&); 7355e3ea4ddSEric Fiselier ~__value_type(); 7369fd9f84fSHoward Hinnant}; 7379fd9f84fSHoward Hinnant 73818293116SEric Fiselier#endif // _LIBCPP_CXX03_LANG 7399fd9f84fSHoward Hinnant 740b3be398cSEric Fiseliertemplate <class _Tp> 741b3be398cSEric Fiselierstruct __extract_key_value_types; 742b3be398cSEric Fiselier 743b3be398cSEric Fiseliertemplate <class _Key, class _Tp> 744b3be398cSEric Fiselierstruct __extract_key_value_types<__value_type<_Key, _Tp> > 745b3be398cSEric Fiselier{ 746b3be398cSEric Fiselier typedef _Key const __key_type; 747b3be398cSEric Fiselier typedef _Tp __mapped_type; 748b3be398cSEric Fiselier}; 749b3be398cSEric Fiselier 7503e519524SHoward Hinnanttemplate <class _TreeIterator> 751e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS __map_iterator 7523e519524SHoward Hinnant{ 753089a7cc5SEric Fiselier typedef typename _TreeIterator::_NodeTypes _NodeTypes; 754089a7cc5SEric Fiselier typedef typename _TreeIterator::__pointer_traits __pointer_traits; 755089a7cc5SEric Fiselier 7563e519524SHoward Hinnant _TreeIterator __i_; 7573e519524SHoward Hinnant 7583e519524SHoward Hinnantpublic: 7593e519524SHoward Hinnant typedef bidirectional_iterator_tag iterator_category; 760089a7cc5SEric Fiselier typedef typename _NodeTypes::__map_value_type value_type; 7613e519524SHoward Hinnant typedef typename _TreeIterator::difference_type difference_type; 7623e519524SHoward Hinnant typedef value_type& reference; 763089a7cc5SEric Fiselier typedef typename _NodeTypes::__map_value_type_pointer pointer; 7643e519524SHoward Hinnant 765848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 7661052ee39SHoward Hinnant __map_iterator() _NOEXCEPT {} 7673e519524SHoward Hinnant 768848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 7691052ee39SHoward Hinnant __map_iterator(_TreeIterator __i) _NOEXCEPT : __i_(__i) {} 7703e519524SHoward Hinnant 771848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 772f52318b4SErik Pilkington reference operator*() const {return __i_->__get_value();} 773848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 774f52318b4SErik Pilkington pointer operator->() const {return pointer_traits<pointer>::pointer_to(__i_->__get_value());} 7753e519524SHoward Hinnant 776848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 7773e519524SHoward Hinnant __map_iterator& operator++() {++__i_; return *this;} 778848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 7793e519524SHoward Hinnant __map_iterator operator++(int) 7803e519524SHoward Hinnant { 7813e519524SHoward Hinnant __map_iterator __t(*this); 7823e519524SHoward Hinnant ++(*this); 7833e519524SHoward Hinnant return __t; 7843e519524SHoward Hinnant } 7853e519524SHoward Hinnant 786848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 7873e519524SHoward Hinnant __map_iterator& operator--() {--__i_; return *this;} 788848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 7893e519524SHoward Hinnant __map_iterator operator--(int) 7903e519524SHoward Hinnant { 7913e519524SHoward Hinnant __map_iterator __t(*this); 7923e519524SHoward Hinnant --(*this); 7933e519524SHoward Hinnant return __t; 7943e519524SHoward Hinnant } 7953e519524SHoward Hinnant 796848a5374SHoward Hinnant friend _LIBCPP_INLINE_VISIBILITY 797848a5374SHoward Hinnant bool operator==(const __map_iterator& __x, const __map_iterator& __y) 7983e519524SHoward Hinnant {return __x.__i_ == __y.__i_;} 799848a5374SHoward Hinnant friend 800848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 801848a5374SHoward Hinnant bool operator!=(const __map_iterator& __x, const __map_iterator& __y) 8023e519524SHoward Hinnant {return __x.__i_ != __y.__i_;} 8033e519524SHoward Hinnant 804e2f2d1edSEric Fiselier template <class, class, class, class> friend class _LIBCPP_TEMPLATE_VIS map; 805e2f2d1edSEric Fiselier template <class, class, class, class> friend class _LIBCPP_TEMPLATE_VIS multimap; 806e2f2d1edSEric Fiselier template <class> friend class _LIBCPP_TEMPLATE_VIS __map_const_iterator; 8073e519524SHoward Hinnant}; 8083e519524SHoward Hinnant 8093e519524SHoward Hinnanttemplate <class _TreeIterator> 810e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS __map_const_iterator 8113e519524SHoward Hinnant{ 812089a7cc5SEric Fiselier typedef typename _TreeIterator::_NodeTypes _NodeTypes; 813089a7cc5SEric Fiselier typedef typename _TreeIterator::__pointer_traits __pointer_traits; 814089a7cc5SEric Fiselier 8153e519524SHoward Hinnant _TreeIterator __i_; 8163e519524SHoward Hinnant 8173e519524SHoward Hinnantpublic: 8183e519524SHoward Hinnant typedef bidirectional_iterator_tag iterator_category; 819089a7cc5SEric Fiselier typedef typename _NodeTypes::__map_value_type value_type; 8203e519524SHoward Hinnant typedef typename _TreeIterator::difference_type difference_type; 8213e519524SHoward Hinnant typedef const value_type& reference; 822089a7cc5SEric Fiselier typedef typename _NodeTypes::__const_map_value_type_pointer pointer; 8233e519524SHoward Hinnant 824848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 8251052ee39SHoward Hinnant __map_const_iterator() _NOEXCEPT {} 8263e519524SHoward Hinnant 827848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 8281052ee39SHoward Hinnant __map_const_iterator(_TreeIterator __i) _NOEXCEPT : __i_(__i) {} 829848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 830b3be398cSEric Fiselier __map_const_iterator(__map_iterator< 831b3be398cSEric Fiselier typename _TreeIterator::__non_const_iterator> __i) _NOEXCEPT 8323e519524SHoward Hinnant : __i_(__i.__i_) {} 8333e519524SHoward Hinnant 834848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 835f52318b4SErik Pilkington reference operator*() const {return __i_->__get_value();} 836848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 837f52318b4SErik Pilkington pointer operator->() const {return pointer_traits<pointer>::pointer_to(__i_->__get_value());} 8383e519524SHoward Hinnant 839848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 8403e519524SHoward Hinnant __map_const_iterator& operator++() {++__i_; return *this;} 841848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 8423e519524SHoward Hinnant __map_const_iterator operator++(int) 8433e519524SHoward Hinnant { 8443e519524SHoward Hinnant __map_const_iterator __t(*this); 8453e519524SHoward Hinnant ++(*this); 8463e519524SHoward Hinnant return __t; 8473e519524SHoward Hinnant } 8483e519524SHoward Hinnant 849848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 8503e519524SHoward Hinnant __map_const_iterator& operator--() {--__i_; return *this;} 851848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 8523e519524SHoward Hinnant __map_const_iterator operator--(int) 8533e519524SHoward Hinnant { 8543e519524SHoward Hinnant __map_const_iterator __t(*this); 8553e519524SHoward Hinnant --(*this); 8563e519524SHoward Hinnant return __t; 8573e519524SHoward Hinnant } 8583e519524SHoward Hinnant 859848a5374SHoward Hinnant friend _LIBCPP_INLINE_VISIBILITY 860848a5374SHoward Hinnant bool operator==(const __map_const_iterator& __x, const __map_const_iterator& __y) 8613e519524SHoward Hinnant {return __x.__i_ == __y.__i_;} 862848a5374SHoward Hinnant friend _LIBCPP_INLINE_VISIBILITY 863848a5374SHoward Hinnant bool operator!=(const __map_const_iterator& __x, const __map_const_iterator& __y) 8643e519524SHoward Hinnant {return __x.__i_ != __y.__i_;} 8653e519524SHoward Hinnant 866e2f2d1edSEric Fiselier template <class, class, class, class> friend class _LIBCPP_TEMPLATE_VIS map; 867e2f2d1edSEric Fiselier template <class, class, class, class> friend class _LIBCPP_TEMPLATE_VIS multimap; 868e2f2d1edSEric Fiselier template <class, class, class> friend class _LIBCPP_TEMPLATE_VIS __tree_const_iterator; 8693e519524SHoward Hinnant}; 8703e519524SHoward Hinnant 8713e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare = less<_Key>, 8723e519524SHoward Hinnant class _Allocator = allocator<pair<const _Key, _Tp> > > 873e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS map 8743e519524SHoward Hinnant{ 8753e519524SHoward Hinnantpublic: 8763e519524SHoward Hinnant // types: 8773e519524SHoward Hinnant typedef _Key key_type; 8783e519524SHoward Hinnant typedef _Tp mapped_type; 8793e519524SHoward Hinnant typedef pair<const key_type, mapped_type> value_type; 8803e519524SHoward Hinnant typedef _Compare key_compare; 8813e519524SHoward Hinnant typedef _Allocator allocator_type; 8823e519524SHoward Hinnant typedef value_type& reference; 8833e519524SHoward Hinnant typedef const value_type& const_reference; 8843e519524SHoward Hinnant 88594f89aeeSMarshall Clow static_assert((is_same<typename allocator_type::value_type, value_type>::value), 88694f89aeeSMarshall Clow "Allocator::value_type must be same type as value_type"); 88794f89aeeSMarshall Clow 888e2f2d1edSEric Fiselier class _LIBCPP_TEMPLATE_VIS value_compare 8893e519524SHoward Hinnant : public binary_function<value_type, value_type, bool> 8903e519524SHoward Hinnant { 8913e519524SHoward Hinnant friend class map; 8923e519524SHoward Hinnant protected: 8933e519524SHoward Hinnant key_compare comp; 8943e519524SHoward Hinnant 895848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY value_compare(key_compare c) : comp(c) {} 8963e519524SHoward Hinnant public: 897848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 8983e519524SHoward Hinnant bool operator()(const value_type& __x, const value_type& __y) const 8993e519524SHoward Hinnant {return comp(__x.first, __y.first);} 9003e519524SHoward Hinnant }; 9013e519524SHoward Hinnant 9023e519524SHoward Hinnantprivate: 90307d3eccdSHoward Hinnant 9049fd9f84fSHoward Hinnant typedef _VSTD::__value_type<key_type, mapped_type> __value_type; 905abb160e6SHoward Hinnant typedef __map_value_compare<key_type, __value_type, key_compare> __vc; 9061f508014SMarshall Clow typedef typename __rebind_alloc_helper<allocator_traits<allocator_type>, 9071f508014SMarshall Clow __value_type>::type __allocator_type; 9083e519524SHoward Hinnant typedef __tree<__value_type, __vc, __allocator_type> __base; 9093e519524SHoward Hinnant typedef typename __base::__node_traits __node_traits; 9103e519524SHoward Hinnant typedef allocator_traits<allocator_type> __alloc_traits; 9113e519524SHoward Hinnant 9123e519524SHoward Hinnant __base __tree_; 9133e519524SHoward Hinnant 9143e519524SHoward Hinnantpublic: 9153e519524SHoward Hinnant typedef typename __alloc_traits::pointer pointer; 9163e519524SHoward Hinnant typedef typename __alloc_traits::const_pointer const_pointer; 9173e519524SHoward Hinnant typedef typename __alloc_traits::size_type size_type; 9183e519524SHoward Hinnant typedef typename __alloc_traits::difference_type difference_type; 9193e519524SHoward Hinnant typedef __map_iterator<typename __base::iterator> iterator; 9203e519524SHoward Hinnant typedef __map_const_iterator<typename __base::const_iterator> const_iterator; 921ce48a113SHoward Hinnant typedef _VSTD::reverse_iterator<iterator> reverse_iterator; 922ce48a113SHoward Hinnant typedef _VSTD::reverse_iterator<const_iterator> const_reverse_iterator; 9233e519524SHoward Hinnant 924b0386a51SErik Pilkington#if _LIBCPP_STD_VER > 14 925b0386a51SErik Pilkington typedef __map_node_handle<typename __base::__node, allocator_type> node_type; 926b0386a51SErik Pilkington typedef __insert_return_type<iterator, node_type> insert_return_type; 927b0386a51SErik Pilkington#endif 928b0386a51SErik Pilkington 929848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 930415a24e4SMarshall Clow map() 931415a24e4SMarshall Clow _NOEXCEPT_( 932415a24e4SMarshall Clow is_nothrow_default_constructible<allocator_type>::value && 933415a24e4SMarshall Clow is_nothrow_default_constructible<key_compare>::value && 934415a24e4SMarshall Clow is_nothrow_copy_constructible<key_compare>::value) 935415a24e4SMarshall Clow : __tree_(__vc(key_compare())) {} 936415a24e4SMarshall Clow 937415a24e4SMarshall Clow _LIBCPP_INLINE_VISIBILITY 938415a24e4SMarshall Clow explicit map(const key_compare& __comp) 9391052ee39SHoward Hinnant _NOEXCEPT_( 9401052ee39SHoward Hinnant is_nothrow_default_constructible<allocator_type>::value && 9411052ee39SHoward Hinnant is_nothrow_copy_constructible<key_compare>::value) 9423e519524SHoward Hinnant : __tree_(__vc(__comp)) {} 9433e519524SHoward Hinnant 944848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 9453e519524SHoward Hinnant explicit map(const key_compare& __comp, const allocator_type& __a) 9462a10c960SMarshall Clow : __tree_(__vc(__comp), typename __base::allocator_type(__a)) {} 9473e519524SHoward Hinnant 9483e519524SHoward Hinnant template <class _InputIterator> 949848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 9503e519524SHoward Hinnant map(_InputIterator __f, _InputIterator __l, 9513e519524SHoward Hinnant const key_compare& __comp = key_compare()) 9523e519524SHoward Hinnant : __tree_(__vc(__comp)) 9533e519524SHoward Hinnant { 9543e519524SHoward Hinnant insert(__f, __l); 9553e519524SHoward Hinnant } 9563e519524SHoward Hinnant 9573e519524SHoward Hinnant template <class _InputIterator> 958848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 9593e519524SHoward Hinnant map(_InputIterator __f, _InputIterator __l, 9603e519524SHoward Hinnant const key_compare& __comp, const allocator_type& __a) 9612a10c960SMarshall Clow : __tree_(__vc(__comp), typename __base::allocator_type(__a)) 9623e519524SHoward Hinnant { 9633e519524SHoward Hinnant insert(__f, __l); 9643e519524SHoward Hinnant } 9653e519524SHoward Hinnant 966fbc317d4SMarshall Clow#if _LIBCPP_STD_VER > 11 967fbc317d4SMarshall Clow template <class _InputIterator> 968fbc317d4SMarshall Clow _LIBCPP_INLINE_VISIBILITY 969fbc317d4SMarshall Clow map(_InputIterator __f, _InputIterator __l, const allocator_type& __a) 970fbc317d4SMarshall Clow : map(__f, __l, key_compare(), __a) {} 971fbc317d4SMarshall Clow#endif 972fbc317d4SMarshall Clow 973848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 9743e519524SHoward Hinnant map(const map& __m) 9753e519524SHoward Hinnant : __tree_(__m.__tree_) 9763e519524SHoward Hinnant { 9773e519524SHoward Hinnant insert(__m.begin(), __m.end()); 9783e519524SHoward Hinnant } 9793e519524SHoward Hinnant 9805a33687dSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 9815a33687dSHoward Hinnant map& operator=(const map& __m) 9825a33687dSHoward Hinnant { 9832ee83725SMarshall Clow#ifndef _LIBCPP_CXX03_LANG 9845a33687dSHoward Hinnant __tree_ = __m.__tree_; 98507d3eccdSHoward Hinnant#else 98674cf6ff5SMarshall Clow if (this != &__m) { 98707d3eccdSHoward Hinnant __tree_.clear(); 98807d3eccdSHoward Hinnant __tree_.value_comp() = __m.__tree_.value_comp(); 98907d3eccdSHoward Hinnant __tree_.__copy_assign_alloc(__m.__tree_); 99007d3eccdSHoward Hinnant insert(__m.begin(), __m.end()); 99174cf6ff5SMarshall Clow } 99207d3eccdSHoward Hinnant#endif 9935a33687dSHoward Hinnant return *this; 9945a33687dSHoward Hinnant } 9955a33687dSHoward Hinnant 99618293116SEric Fiselier#ifndef _LIBCPP_CXX03_LANG 9973e519524SHoward Hinnant 998848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 9993e519524SHoward Hinnant map(map&& __m) 10001052ee39SHoward Hinnant _NOEXCEPT_(is_nothrow_move_constructible<__base>::value) 1001ce48a113SHoward Hinnant : __tree_(_VSTD::move(__m.__tree_)) 10023e519524SHoward Hinnant { 10033e519524SHoward Hinnant } 10043e519524SHoward Hinnant 10053e519524SHoward Hinnant map(map&& __m, const allocator_type& __a); 10063e519524SHoward Hinnant 1007848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 100854976f26SHoward Hinnant map& operator=(map&& __m) 100954976f26SHoward Hinnant _NOEXCEPT_(is_nothrow_move_assignable<__base>::value) 101054976f26SHoward Hinnant { 101154976f26SHoward Hinnant __tree_ = _VSTD::move(__m.__tree_); 101254976f26SHoward Hinnant return *this; 101354976f26SHoward Hinnant } 101454976f26SHoward Hinnant 101554976f26SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 10163e519524SHoward Hinnant map(initializer_list<value_type> __il, const key_compare& __comp = key_compare()) 10173e519524SHoward Hinnant : __tree_(__vc(__comp)) 10183e519524SHoward Hinnant { 10193e519524SHoward Hinnant insert(__il.begin(), __il.end()); 10203e519524SHoward Hinnant } 10213e519524SHoward Hinnant 1022848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 10233e519524SHoward Hinnant map(initializer_list<value_type> __il, const key_compare& __comp, const allocator_type& __a) 10242a10c960SMarshall Clow : __tree_(__vc(__comp), typename __base::allocator_type(__a)) 10253e519524SHoward Hinnant { 10263e519524SHoward Hinnant insert(__il.begin(), __il.end()); 10273e519524SHoward Hinnant } 10283e519524SHoward Hinnant 1029fbc317d4SMarshall Clow#if _LIBCPP_STD_VER > 11 1030fbc317d4SMarshall Clow _LIBCPP_INLINE_VISIBILITY 1031fbc317d4SMarshall Clow map(initializer_list<value_type> __il, const allocator_type& __a) 1032fbc317d4SMarshall Clow : map(__il, key_compare(), __a) {} 1033fbc317d4SMarshall Clow#endif 1034fbc317d4SMarshall Clow 1035848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 10363e519524SHoward Hinnant map& operator=(initializer_list<value_type> __il) 10373e519524SHoward Hinnant { 10383e519524SHoward Hinnant __tree_.__assign_unique(__il.begin(), __il.end()); 10393e519524SHoward Hinnant return *this; 10403e519524SHoward Hinnant } 10413e519524SHoward Hinnant 104218293116SEric Fiselier#endif // _LIBCPP_CXX03_LANG 10433e519524SHoward Hinnant 1044848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 10453e519524SHoward Hinnant explicit map(const allocator_type& __a) 10462a10c960SMarshall Clow : __tree_(typename __base::allocator_type(__a)) 10473e519524SHoward Hinnant { 10483e519524SHoward Hinnant } 10493e519524SHoward Hinnant 1050848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 10513e519524SHoward Hinnant map(const map& __m, const allocator_type& __a) 10522a10c960SMarshall Clow : __tree_(__m.__tree_.value_comp(), typename __base::allocator_type(__a)) 10533e519524SHoward Hinnant { 10543e519524SHoward Hinnant insert(__m.begin(), __m.end()); 10553e519524SHoward Hinnant } 10563e519524SHoward Hinnant 1057848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 10581052ee39SHoward Hinnant iterator begin() _NOEXCEPT {return __tree_.begin();} 1059848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 10601052ee39SHoward Hinnant const_iterator begin() const _NOEXCEPT {return __tree_.begin();} 1061848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 10621052ee39SHoward Hinnant iterator end() _NOEXCEPT {return __tree_.end();} 1063848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 10641052ee39SHoward Hinnant const_iterator end() const _NOEXCEPT {return __tree_.end();} 10653e519524SHoward Hinnant 1066848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 10671052ee39SHoward Hinnant reverse_iterator rbegin() _NOEXCEPT {return reverse_iterator(end());} 1068848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 10691052ee39SHoward Hinnant const_reverse_iterator rbegin() const _NOEXCEPT 10701052ee39SHoward Hinnant {return const_reverse_iterator(end());} 1071848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 10721052ee39SHoward Hinnant reverse_iterator rend() _NOEXCEPT 10731052ee39SHoward Hinnant {return reverse_iterator(begin());} 1074848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 10751052ee39SHoward Hinnant const_reverse_iterator rend() const _NOEXCEPT 10761052ee39SHoward Hinnant {return const_reverse_iterator(begin());} 10773e519524SHoward Hinnant 1078848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 10791052ee39SHoward Hinnant const_iterator cbegin() const _NOEXCEPT {return begin();} 1080848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 10811052ee39SHoward Hinnant const_iterator cend() const _NOEXCEPT {return end();} 1082848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 10831052ee39SHoward Hinnant const_reverse_iterator crbegin() const _NOEXCEPT {return rbegin();} 1084848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 10851052ee39SHoward Hinnant const_reverse_iterator crend() const _NOEXCEPT {return rend();} 10863e519524SHoward Hinnant 108772c8fad4SMarshall Clow _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY 10881052ee39SHoward Hinnant bool empty() const _NOEXCEPT {return __tree_.size() == 0;} 1089848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 10901052ee39SHoward Hinnant size_type size() const _NOEXCEPT {return __tree_.size();} 1091848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 10921052ee39SHoward Hinnant size_type max_size() const _NOEXCEPT {return __tree_.max_size();} 10933e519524SHoward Hinnant 10943e519524SHoward Hinnant mapped_type& operator[](const key_type& __k); 109554f0cda6SEric Fiselier#ifndef _LIBCPP_CXX03_LANG 10963e519524SHoward Hinnant mapped_type& operator[](key_type&& __k); 10973e519524SHoward Hinnant#endif 10983e519524SHoward Hinnant 10993e519524SHoward Hinnant mapped_type& at(const key_type& __k); 11003e519524SHoward Hinnant const mapped_type& at(const key_type& __k) const; 11013e519524SHoward Hinnant 1102848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 11032a10c960SMarshall Clow allocator_type get_allocator() const _NOEXCEPT {return allocator_type(__tree_.__alloc());} 1104848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 11053e519524SHoward Hinnant key_compare key_comp() const {return __tree_.value_comp().key_comp();} 1106848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 11073e519524SHoward Hinnant value_compare value_comp() const {return value_compare(__tree_.value_comp().key_comp());} 11083e519524SHoward Hinnant 11095e3ea4ddSEric Fiselier#ifndef _LIBCPP_CXX03_LANG 11105e3ea4ddSEric Fiselier template <class ..._Args> 11115e3ea4ddSEric Fiselier _LIBCPP_INLINE_VISIBILITY 11125e3ea4ddSEric Fiselier pair<iterator, bool> emplace(_Args&& ...__args) { 11135e3ea4ddSEric Fiselier return __tree_.__emplace_unique(_VSTD::forward<_Args>(__args)...); 11145e3ea4ddSEric Fiselier } 11157609c9b6SHoward Hinnant 11168b805c91SHoward Hinnant template <class ..._Args> 11175e3ea4ddSEric Fiselier _LIBCPP_INLINE_VISIBILITY 11185e3ea4ddSEric Fiselier iterator emplace_hint(const_iterator __p, _Args&& ...__args) { 11195e3ea4ddSEric Fiselier return __tree_.__emplace_hint_unique(__p.__i_, _VSTD::forward<_Args>(__args)...); 11205e3ea4ddSEric Fiselier } 11217609c9b6SHoward Hinnant 1122c003db1fSHoward Hinnant template <class _Pp, 1123c003db1fSHoward Hinnant class = typename enable_if<is_constructible<value_type, _Pp>::value>::type> 1124848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 1125c003db1fSHoward Hinnant pair<iterator, bool> insert(_Pp&& __p) 1126c003db1fSHoward Hinnant {return __tree_.__insert_unique(_VSTD::forward<_Pp>(__p));} 11273e519524SHoward Hinnant 1128c003db1fSHoward Hinnant template <class _Pp, 1129c003db1fSHoward Hinnant class = typename enable_if<is_constructible<value_type, _Pp>::value>::type> 1130848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 1131c003db1fSHoward Hinnant iterator insert(const_iterator __pos, _Pp&& __p) 1132c003db1fSHoward Hinnant {return __tree_.__insert_unique(__pos.__i_, _VSTD::forward<_Pp>(__p));} 11333e519524SHoward Hinnant 11345e3ea4ddSEric Fiselier#endif // _LIBCPP_CXX03_LANG 11353e519524SHoward Hinnant 1136848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 11373e519524SHoward Hinnant pair<iterator, bool> 11383e519524SHoward Hinnant insert(const value_type& __v) {return __tree_.__insert_unique(__v);} 11393e519524SHoward Hinnant 1140848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 11413e519524SHoward Hinnant iterator 11423e519524SHoward Hinnant insert(const_iterator __p, const value_type& __v) 11433e519524SHoward Hinnant {return __tree_.__insert_unique(__p.__i_, __v);} 11443e519524SHoward Hinnant 11457a9f500fSEric Fiselier#ifndef _LIBCPP_CXX03_LANG 1146afc9ff99SMarshall Clow _LIBCPP_INLINE_VISIBILITY 1147afc9ff99SMarshall Clow pair<iterator, bool> 11485e3ea4ddSEric Fiselier insert(value_type&& __v) {return __tree_.__insert_unique(_VSTD::move(__v));} 1149afc9ff99SMarshall Clow 1150afc9ff99SMarshall Clow _LIBCPP_INLINE_VISIBILITY 11515e3ea4ddSEric Fiselier iterator insert(const_iterator __p, value_type&& __v) 11525e3ea4ddSEric Fiselier {return __tree_.__insert_unique(__p.__i_, _VSTD::move(__v));} 115318293116SEric Fiselier 115418293116SEric Fiselier _LIBCPP_INLINE_VISIBILITY 115518293116SEric Fiselier void insert(initializer_list<value_type> __il) 115618293116SEric Fiselier {insert(__il.begin(), __il.end());} 1157afc9ff99SMarshall Clow#endif 1158afc9ff99SMarshall Clow 11593e519524SHoward Hinnant template <class _InputIterator> 1160848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 11613e519524SHoward Hinnant void insert(_InputIterator __f, _InputIterator __l) 11623e519524SHoward Hinnant { 11633e519524SHoward Hinnant for (const_iterator __e = cend(); __f != __l; ++__f) 11643e519524SHoward Hinnant insert(__e.__i_, *__f); 11653e519524SHoward Hinnant } 11663e519524SHoward Hinnant 11678aaf517dSMarshall Clow#if _LIBCPP_STD_VER > 14 116854f0cda6SEric Fiselier 11698aaf517dSMarshall Clow template <class... _Args> 11708aaf517dSMarshall Clow _LIBCPP_INLINE_VISIBILITY 11718aaf517dSMarshall Clow pair<iterator, bool> try_emplace(const key_type& __k, _Args&&... __args) 11728aaf517dSMarshall Clow { 117354f0cda6SEric Fiselier return __tree_.__emplace_unique_key_args(__k, 117454f0cda6SEric Fiselier _VSTD::piecewise_construct, 117554f0cda6SEric Fiselier _VSTD::forward_as_tuple(__k), 117654f0cda6SEric Fiselier _VSTD::forward_as_tuple(_VSTD::forward<_Args>(__args)...)); 11778aaf517dSMarshall Clow } 11788aaf517dSMarshall Clow 11798aaf517dSMarshall Clow template <class... _Args> 11808aaf517dSMarshall Clow _LIBCPP_INLINE_VISIBILITY 11818aaf517dSMarshall Clow pair<iterator, bool> try_emplace(key_type&& __k, _Args&&... __args) 11828aaf517dSMarshall Clow { 118354f0cda6SEric Fiselier return __tree_.__emplace_unique_key_args(__k, 118454f0cda6SEric Fiselier _VSTD::piecewise_construct, 118554f0cda6SEric Fiselier _VSTD::forward_as_tuple(_VSTD::move(__k)), 118654f0cda6SEric Fiselier _VSTD::forward_as_tuple(_VSTD::forward<_Args>(__args)...)); 11878aaf517dSMarshall Clow } 11888aaf517dSMarshall Clow 11898aaf517dSMarshall Clow template <class... _Args> 11908aaf517dSMarshall Clow _LIBCPP_INLINE_VISIBILITY 11918aaf517dSMarshall Clow iterator try_emplace(const_iterator __h, const key_type& __k, _Args&&... __args) 11928aaf517dSMarshall Clow { 119354f0cda6SEric Fiselier return __tree_.__emplace_hint_unique_key_args(__h.__i_, __k, 119454f0cda6SEric Fiselier _VSTD::piecewise_construct, 119554f0cda6SEric Fiselier _VSTD::forward_as_tuple(__k), 11968aaf517dSMarshall Clow _VSTD::forward_as_tuple(_VSTD::forward<_Args>(__args)...)); 11978aaf517dSMarshall Clow } 11988aaf517dSMarshall Clow 11998aaf517dSMarshall Clow template <class... _Args> 12008aaf517dSMarshall Clow _LIBCPP_INLINE_VISIBILITY 12018aaf517dSMarshall Clow iterator try_emplace(const_iterator __h, key_type&& __k, _Args&&... __args) 12028aaf517dSMarshall Clow { 120354f0cda6SEric Fiselier return __tree_.__emplace_hint_unique_key_args(__h.__i_, __k, 120454f0cda6SEric Fiselier _VSTD::piecewise_construct, 120554f0cda6SEric Fiselier _VSTD::forward_as_tuple(_VSTD::move(__k)), 12068aaf517dSMarshall Clow _VSTD::forward_as_tuple(_VSTD::forward<_Args>(__args)...)); 12078aaf517dSMarshall Clow } 12088aaf517dSMarshall Clow 12098aaf517dSMarshall Clow template <class _Vp> 12108aaf517dSMarshall Clow _LIBCPP_INLINE_VISIBILITY 12118aaf517dSMarshall Clow pair<iterator, bool> insert_or_assign(const key_type& __k, _Vp&& __v) 12128aaf517dSMarshall Clow { 12138aaf517dSMarshall Clow iterator __p = lower_bound(__k); 12148aaf517dSMarshall Clow if ( __p != end() && !key_comp()(__k, __p->first)) 12158aaf517dSMarshall Clow { 12168aaf517dSMarshall Clow __p->second = _VSTD::forward<_Vp>(__v); 12178aaf517dSMarshall Clow return _VSTD::make_pair(__p, false); 12188aaf517dSMarshall Clow } 12198aaf517dSMarshall Clow return _VSTD::make_pair(emplace_hint(__p, __k, _VSTD::forward<_Vp>(__v)), true); 12208aaf517dSMarshall Clow } 12218aaf517dSMarshall Clow 12228aaf517dSMarshall Clow template <class _Vp> 12238aaf517dSMarshall Clow _LIBCPP_INLINE_VISIBILITY 12248aaf517dSMarshall Clow pair<iterator, bool> insert_or_assign(key_type&& __k, _Vp&& __v) 12258aaf517dSMarshall Clow { 12268aaf517dSMarshall Clow iterator __p = lower_bound(__k); 12278aaf517dSMarshall Clow if ( __p != end() && !key_comp()(__k, __p->first)) 12288aaf517dSMarshall Clow { 12298aaf517dSMarshall Clow __p->second = _VSTD::forward<_Vp>(__v); 12308aaf517dSMarshall Clow return _VSTD::make_pair(__p, false); 12318aaf517dSMarshall Clow } 12328aaf517dSMarshall Clow return _VSTD::make_pair(emplace_hint(__p, _VSTD::move(__k), _VSTD::forward<_Vp>(__v)), true); 12338aaf517dSMarshall Clow } 12348aaf517dSMarshall Clow 12358aaf517dSMarshall Clow template <class _Vp> 12368aaf517dSMarshall Clow _LIBCPP_INLINE_VISIBILITY 12378aaf517dSMarshall Clow iterator insert_or_assign(const_iterator __h, const key_type& __k, _Vp&& __v) 12388aaf517dSMarshall Clow { 12398aaf517dSMarshall Clow iterator __p = lower_bound(__k); 12408aaf517dSMarshall Clow if ( __p != end() && !key_comp()(__k, __p->first)) 12418aaf517dSMarshall Clow { 12428aaf517dSMarshall Clow __p->second = _VSTD::forward<_Vp>(__v); 12438aaf517dSMarshall Clow return __p; 12448aaf517dSMarshall Clow } 12458aaf517dSMarshall Clow return emplace_hint(__h, __k, _VSTD::forward<_Vp>(__v)); 12468aaf517dSMarshall Clow } 12478aaf517dSMarshall Clow 12488aaf517dSMarshall Clow template <class _Vp> 12498aaf517dSMarshall Clow _LIBCPP_INLINE_VISIBILITY 12508aaf517dSMarshall Clow iterator insert_or_assign(const_iterator __h, key_type&& __k, _Vp&& __v) 12518aaf517dSMarshall Clow { 12528aaf517dSMarshall Clow iterator __p = lower_bound(__k); 12538aaf517dSMarshall Clow if ( __p != end() && !key_comp()(__k, __p->first)) 12548aaf517dSMarshall Clow { 12558aaf517dSMarshall Clow __p->second = _VSTD::forward<_Vp>(__v); 12568aaf517dSMarshall Clow return __p; 12578aaf517dSMarshall Clow } 12588aaf517dSMarshall Clow return emplace_hint(__h, _VSTD::move(__k), _VSTD::forward<_Vp>(__v)); 12598aaf517dSMarshall Clow } 126054f0cda6SEric Fiselier 126118293116SEric Fiselier#endif // _LIBCPP_STD_VER > 14 12628aaf517dSMarshall Clow 1263848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 12643e519524SHoward Hinnant iterator erase(const_iterator __p) {return __tree_.erase(__p.__i_);} 1265848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 1266ec392968SMarshall Clow iterator erase(iterator __p) {return __tree_.erase(__p.__i_);} 1267ec392968SMarshall Clow _LIBCPP_INLINE_VISIBILITY 12683e519524SHoward Hinnant size_type erase(const key_type& __k) 12693e519524SHoward Hinnant {return __tree_.__erase_unique(__k);} 1270848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 12713e519524SHoward Hinnant iterator erase(const_iterator __f, const_iterator __l) 12723e519524SHoward Hinnant {return __tree_.erase(__f.__i_, __l.__i_);} 1273848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 12741052ee39SHoward Hinnant void clear() _NOEXCEPT {__tree_.clear();} 12753e519524SHoward Hinnant 1276b0386a51SErik Pilkington#if _LIBCPP_STD_VER > 14 1277b0386a51SErik Pilkington _LIBCPP_INLINE_VISIBILITY 1278b0386a51SErik Pilkington insert_return_type insert(node_type&& __nh) 1279b0386a51SErik Pilkington { 1280b0386a51SErik Pilkington _LIBCPP_ASSERT(__nh.empty() || __nh.get_allocator() == get_allocator(), 1281b0386a51SErik Pilkington "node_type with incompatible allocator passed to map::insert()"); 1282b0386a51SErik Pilkington return __tree_.template __node_handle_insert_unique< 1283b0386a51SErik Pilkington node_type, insert_return_type>(_VSTD::move(__nh)); 1284b0386a51SErik Pilkington } 1285b0386a51SErik Pilkington _LIBCPP_INLINE_VISIBILITY 1286b0386a51SErik Pilkington iterator insert(const_iterator __hint, node_type&& __nh) 1287b0386a51SErik Pilkington { 1288b0386a51SErik Pilkington _LIBCPP_ASSERT(__nh.empty() || __nh.get_allocator() == get_allocator(), 1289b0386a51SErik Pilkington "node_type with incompatible allocator passed to map::insert()"); 1290b0386a51SErik Pilkington return __tree_.template __node_handle_insert_unique<node_type>( 1291b0386a51SErik Pilkington __hint.__i_, _VSTD::move(__nh)); 1292b0386a51SErik Pilkington } 1293b0386a51SErik Pilkington _LIBCPP_INLINE_VISIBILITY 1294b0386a51SErik Pilkington node_type extract(key_type const& __key) 1295b0386a51SErik Pilkington { 1296b0386a51SErik Pilkington return __tree_.template __node_handle_extract<node_type>(__key); 1297b0386a51SErik Pilkington } 1298b0386a51SErik Pilkington _LIBCPP_INLINE_VISIBILITY 1299b0386a51SErik Pilkington node_type extract(const_iterator __it) 1300b0386a51SErik Pilkington { 1301b0386a51SErik Pilkington return __tree_.template __node_handle_extract<node_type>(__it.__i_); 1302b0386a51SErik Pilkington } 1303b0386a51SErik Pilkington#endif 1304b0386a51SErik Pilkington 1305848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 13061052ee39SHoward Hinnant void swap(map& __m) 13071052ee39SHoward Hinnant _NOEXCEPT_(__is_nothrow_swappable<__base>::value) 13081052ee39SHoward Hinnant {__tree_.swap(__m.__tree_);} 13093e519524SHoward Hinnant 1310848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 13113e519524SHoward Hinnant iterator find(const key_type& __k) {return __tree_.find(__k);} 1312848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 13133e519524SHoward Hinnant const_iterator find(const key_type& __k) const {return __tree_.find(__k);} 13142585835cSMarshall Clow#if _LIBCPP_STD_VER > 11 13152585835cSMarshall Clow template <typename _K2> 13162585835cSMarshall Clow _LIBCPP_INLINE_VISIBILITY 13172585835cSMarshall Clow typename enable_if<__is_transparent<_Compare, _K2>::value,iterator>::type 13182585835cSMarshall Clow find(const _K2& __k) {return __tree_.find(__k);} 13192585835cSMarshall Clow template <typename _K2> 13202585835cSMarshall Clow _LIBCPP_INLINE_VISIBILITY 13212585835cSMarshall Clow typename enable_if<__is_transparent<_Compare, _K2>::value,const_iterator>::type 13222585835cSMarshall Clow find(const _K2& __k) const {return __tree_.find(__k);} 13232585835cSMarshall Clow#endif 13242585835cSMarshall Clow 1325848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 13263e519524SHoward Hinnant size_type count(const key_type& __k) const 13273e519524SHoward Hinnant {return __tree_.__count_unique(__k);} 13280aacbc92SMarshall Clow#if _LIBCPP_STD_VER > 11 13290aacbc92SMarshall Clow template <typename _K2> 13300aacbc92SMarshall Clow _LIBCPP_INLINE_VISIBILITY 13310aacbc92SMarshall Clow typename enable_if<__is_transparent<_Compare, _K2>::value,size_type>::type 13329bfdb770SEric Fiselier count(const _K2& __k) const {return __tree_.__count_multi(__k);} 13330aacbc92SMarshall Clow#endif 1334848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 13353e519524SHoward Hinnant iterator lower_bound(const key_type& __k) 13363e519524SHoward Hinnant {return __tree_.lower_bound(__k);} 1337848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 13383e519524SHoward Hinnant const_iterator lower_bound(const key_type& __k) const 13393e519524SHoward Hinnant {return __tree_.lower_bound(__k);} 13402585835cSMarshall Clow#if _LIBCPP_STD_VER > 11 13412585835cSMarshall Clow template <typename _K2> 13422585835cSMarshall Clow _LIBCPP_INLINE_VISIBILITY 13432585835cSMarshall Clow typename enable_if<__is_transparent<_Compare, _K2>::value,iterator>::type 13442585835cSMarshall Clow lower_bound(const _K2& __k) {return __tree_.lower_bound(__k);} 13452585835cSMarshall Clow 13462585835cSMarshall Clow template <typename _K2> 13472585835cSMarshall Clow _LIBCPP_INLINE_VISIBILITY 13482585835cSMarshall Clow typename enable_if<__is_transparent<_Compare, _K2>::value,const_iterator>::type 13492585835cSMarshall Clow lower_bound(const _K2& __k) const {return __tree_.lower_bound(__k);} 13502585835cSMarshall Clow#endif 13512585835cSMarshall Clow 1352848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 13533e519524SHoward Hinnant iterator upper_bound(const key_type& __k) 13543e519524SHoward Hinnant {return __tree_.upper_bound(__k);} 1355848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 13563e519524SHoward Hinnant const_iterator upper_bound(const key_type& __k) const 13573e519524SHoward Hinnant {return __tree_.upper_bound(__k);} 13582585835cSMarshall Clow#if _LIBCPP_STD_VER > 11 13592585835cSMarshall Clow template <typename _K2> 13602585835cSMarshall Clow _LIBCPP_INLINE_VISIBILITY 13612585835cSMarshall Clow typename enable_if<__is_transparent<_Compare, _K2>::value,iterator>::type 13622585835cSMarshall Clow upper_bound(const _K2& __k) {return __tree_.upper_bound(__k);} 13632585835cSMarshall Clow template <typename _K2> 13642585835cSMarshall Clow _LIBCPP_INLINE_VISIBILITY 13652585835cSMarshall Clow typename enable_if<__is_transparent<_Compare, _K2>::value,const_iterator>::type 13662585835cSMarshall Clow upper_bound(const _K2& __k) const {return __tree_.upper_bound(__k);} 13672585835cSMarshall Clow#endif 13682585835cSMarshall Clow 1369848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 13703e519524SHoward Hinnant pair<iterator,iterator> equal_range(const key_type& __k) 13713e519524SHoward Hinnant {return __tree_.__equal_range_unique(__k);} 1372848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 13733e519524SHoward Hinnant pair<const_iterator,const_iterator> equal_range(const key_type& __k) const 13743e519524SHoward Hinnant {return __tree_.__equal_range_unique(__k);} 13752585835cSMarshall Clow#if _LIBCPP_STD_VER > 11 13762585835cSMarshall Clow template <typename _K2> 13772585835cSMarshall Clow _LIBCPP_INLINE_VISIBILITY 13782585835cSMarshall Clow typename enable_if<__is_transparent<_Compare, _K2>::value,pair<iterator,iterator>>::type 13799bfdb770SEric Fiselier equal_range(const _K2& __k) {return __tree_.__equal_range_multi(__k);} 13802585835cSMarshall Clow template <typename _K2> 13812585835cSMarshall Clow _LIBCPP_INLINE_VISIBILITY 13822585835cSMarshall Clow typename enable_if<__is_transparent<_Compare, _K2>::value,pair<const_iterator,const_iterator>>::type 13839bfdb770SEric Fiselier equal_range(const _K2& __k) const {return __tree_.__equal_range_multi(__k);} 13842585835cSMarshall Clow#endif 13853e519524SHoward Hinnant 13863e519524SHoward Hinnantprivate: 13873e519524SHoward Hinnant typedef typename __base::__node __node; 13883e519524SHoward Hinnant typedef typename __base::__node_allocator __node_allocator; 13893e519524SHoward Hinnant typedef typename __base::__node_pointer __node_pointer; 13903e519524SHoward Hinnant typedef typename __base::__node_base_pointer __node_base_pointer; 1391cb5cbc8bSEric Fiselier typedef typename __base::__parent_pointer __parent_pointer; 13920594ad71SEric Fiselier 1393c003db1fSHoward Hinnant typedef __map_node_destructor<__node_allocator> _Dp; 1394c003db1fSHoward Hinnant typedef unique_ptr<__node, _Dp> __node_holder; 13953e519524SHoward Hinnant 139654f0cda6SEric Fiselier#ifdef _LIBCPP_CXX03_LANG 13974a95f9ebSHoward Hinnant __node_holder __construct_node_with_key(const key_type& __k); 139854f0cda6SEric Fiselier#endif 13993e519524SHoward Hinnant}; 14003e519524SHoward Hinnant 14010594ad71SEric Fiselier 14025e3ea4ddSEric Fiselier#ifndef _LIBCPP_CXX03_LANG 14033e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 14043e519524SHoward Hinnantmap<_Key, _Tp, _Compare, _Allocator>::map(map&& __m, const allocator_type& __a) 14052a10c960SMarshall Clow : __tree_(_VSTD::move(__m.__tree_), typename __base::allocator_type(__a)) 14063e519524SHoward Hinnant{ 14073e519524SHoward Hinnant if (__a != __m.get_allocator()) 14083e519524SHoward Hinnant { 14093e519524SHoward Hinnant const_iterator __e = cend(); 14103e519524SHoward Hinnant while (!__m.empty()) 14113e519524SHoward Hinnant __tree_.__insert_unique(__e.__i_, 1412f52318b4SErik Pilkington __m.__tree_.remove(__m.begin().__i_)->__value_.__move()); 14133e519524SHoward Hinnant } 14143e519524SHoward Hinnant} 14153e519524SHoward Hinnant 141618293116SEric Fiseliertemplate <class _Key, class _Tp, class _Compare, class _Allocator> 141718293116SEric Fiselier_Tp& 141818293116SEric Fiseliermap<_Key, _Tp, _Compare, _Allocator>::operator[](const key_type& __k) 141918293116SEric Fiselier{ 142018293116SEric Fiselier return __tree_.__emplace_unique_key_args(__k, 142118293116SEric Fiselier _VSTD::piecewise_construct, 142218293116SEric Fiselier _VSTD::forward_as_tuple(__k), 1423f52318b4SErik Pilkington _VSTD::forward_as_tuple()).first->__get_value().second; 142418293116SEric Fiselier} 14253e519524SHoward Hinnant 142618293116SEric Fiseliertemplate <class _Key, class _Tp, class _Compare, class _Allocator> 142718293116SEric Fiselier_Tp& 142818293116SEric Fiseliermap<_Key, _Tp, _Compare, _Allocator>::operator[](key_type&& __k) 142918293116SEric Fiselier{ 143018293116SEric Fiselier return __tree_.__emplace_unique_key_args(__k, 143118293116SEric Fiselier _VSTD::piecewise_construct, 143218293116SEric Fiselier _VSTD::forward_as_tuple(_VSTD::move(__k)), 1433f52318b4SErik Pilkington _VSTD::forward_as_tuple()).first->__get_value().second; 143418293116SEric Fiselier} 143554f0cda6SEric Fiselier 143618293116SEric Fiselier#else // _LIBCPP_CXX03_LANG 143754f0cda6SEric Fiselier 14383e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 14393e519524SHoward Hinnanttypename map<_Key, _Tp, _Compare, _Allocator>::__node_holder 14404a95f9ebSHoward Hinnantmap<_Key, _Tp, _Compare, _Allocator>::__construct_node_with_key(const key_type& __k) 14413e519524SHoward Hinnant{ 14423e519524SHoward Hinnant __node_allocator& __na = __tree_.__node_alloc(); 1443c003db1fSHoward Hinnant __node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na)); 1444f52318b4SErik Pilkington __node_traits::construct(__na, _VSTD::addressof(__h->__value_.__get_value().first), __k); 14453e519524SHoward Hinnant __h.get_deleter().__first_constructed = true; 1446f52318b4SErik Pilkington __node_traits::construct(__na, _VSTD::addressof(__h->__value_.__get_value().second)); 14473e519524SHoward Hinnant __h.get_deleter().__second_constructed = true; 1448251c6291SDimitry Andric return _LIBCPP_EXPLICIT_MOVE(__h); // explicitly moved for C++03 14493e519524SHoward Hinnant} 14503e519524SHoward Hinnant 14513e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 14523e519524SHoward Hinnant_Tp& 14533e519524SHoward Hinnantmap<_Key, _Tp, _Compare, _Allocator>::operator[](const key_type& __k) 14543e519524SHoward Hinnant{ 1455cb5cbc8bSEric Fiselier __parent_pointer __parent; 1456cb5cbc8bSEric Fiselier __node_base_pointer& __child = __tree_.__find_equal(__parent, __k); 14573e519524SHoward Hinnant __node_pointer __r = static_cast<__node_pointer>(__child); 14583e519524SHoward Hinnant if (__child == nullptr) 14593e519524SHoward Hinnant { 14604a95f9ebSHoward Hinnant __node_holder __h = __construct_node_with_key(__k); 146107d3eccdSHoward Hinnant __tree_.__insert_node_at(__parent, __child, static_cast<__node_base_pointer>(__h.get())); 14623e519524SHoward Hinnant __r = __h.release(); 14633e519524SHoward Hinnant } 1464f52318b4SErik Pilkington return __r->__value_.__get_value().second; 14653e519524SHoward Hinnant} 14663e519524SHoward Hinnant 146718293116SEric Fiselier#endif // _LIBCPP_CXX03_LANG 14683e519524SHoward Hinnant 14693e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 14703e519524SHoward Hinnant_Tp& 14713e519524SHoward Hinnantmap<_Key, _Tp, _Compare, _Allocator>::at(const key_type& __k) 14723e519524SHoward Hinnant{ 1473cb5cbc8bSEric Fiselier __parent_pointer __parent; 1474cb5cbc8bSEric Fiselier __node_base_pointer& __child = __tree_.__find_equal(__parent, __k); 147554b409fdSHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 14763e519524SHoward Hinnant if (__child == nullptr) 14773e519524SHoward Hinnant throw out_of_range("map::at: key not found"); 1478b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS 1479f52318b4SErik Pilkington return static_cast<__node_pointer>(__child)->__value_.__get_value().second; 14803e519524SHoward Hinnant} 14813e519524SHoward Hinnant 14823e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 14833e519524SHoward Hinnantconst _Tp& 14843e519524SHoward Hinnantmap<_Key, _Tp, _Compare, _Allocator>::at(const key_type& __k) const 14853e519524SHoward Hinnant{ 1486cb5cbc8bSEric Fiselier __parent_pointer __parent; 1487cb5cbc8bSEric Fiselier __node_base_pointer __child = __tree_.__find_equal(__parent, __k); 148854b409fdSHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 14893e519524SHoward Hinnant if (__child == nullptr) 14903e519524SHoward Hinnant throw out_of_range("map::at: key not found"); 1491b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS 1492f52318b4SErik Pilkington return static_cast<__node_pointer>(__child)->__value_.__get_value().second; 14933e519524SHoward Hinnant} 14943e519524SHoward Hinnant 14953e519524SHoward Hinnant 14963e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 1497848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 14983e519524SHoward Hinnantbool 14993e519524SHoward Hinnantoperator==(const map<_Key, _Tp, _Compare, _Allocator>& __x, 15003e519524SHoward Hinnant const map<_Key, _Tp, _Compare, _Allocator>& __y) 15013e519524SHoward Hinnant{ 1502ce48a113SHoward Hinnant return __x.size() == __y.size() && _VSTD::equal(__x.begin(), __x.end(), __y.begin()); 15033e519524SHoward Hinnant} 15043e519524SHoward Hinnant 15053e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 1506848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 15073e519524SHoward Hinnantbool 15083e519524SHoward Hinnantoperator< (const map<_Key, _Tp, _Compare, _Allocator>& __x, 15093e519524SHoward Hinnant const map<_Key, _Tp, _Compare, _Allocator>& __y) 15103e519524SHoward Hinnant{ 1511ce48a113SHoward Hinnant return _VSTD::lexicographical_compare(__x.begin(), __x.end(), __y.begin(), __y.end()); 15123e519524SHoward Hinnant} 15133e519524SHoward Hinnant 15143e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 1515848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 15163e519524SHoward Hinnantbool 15173e519524SHoward Hinnantoperator!=(const map<_Key, _Tp, _Compare, _Allocator>& __x, 15183e519524SHoward Hinnant const map<_Key, _Tp, _Compare, _Allocator>& __y) 15193e519524SHoward Hinnant{ 15203e519524SHoward Hinnant return !(__x == __y); 15213e519524SHoward Hinnant} 15223e519524SHoward Hinnant 15233e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 1524848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 15253e519524SHoward Hinnantbool 15263e519524SHoward Hinnantoperator> (const map<_Key, _Tp, _Compare, _Allocator>& __x, 15273e519524SHoward Hinnant const map<_Key, _Tp, _Compare, _Allocator>& __y) 15283e519524SHoward Hinnant{ 15293e519524SHoward Hinnant return __y < __x; 15303e519524SHoward Hinnant} 15313e519524SHoward Hinnant 15323e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 1533848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 15343e519524SHoward Hinnantbool 15353e519524SHoward Hinnantoperator>=(const map<_Key, _Tp, _Compare, _Allocator>& __x, 15363e519524SHoward Hinnant const map<_Key, _Tp, _Compare, _Allocator>& __y) 15373e519524SHoward Hinnant{ 15383e519524SHoward Hinnant return !(__x < __y); 15393e519524SHoward Hinnant} 15403e519524SHoward Hinnant 15413e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 1542848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 15433e519524SHoward Hinnantbool 15443e519524SHoward Hinnantoperator<=(const map<_Key, _Tp, _Compare, _Allocator>& __x, 15453e519524SHoward Hinnant const map<_Key, _Tp, _Compare, _Allocator>& __y) 15463e519524SHoward Hinnant{ 15473e519524SHoward Hinnant return !(__y < __x); 15483e519524SHoward Hinnant} 15493e519524SHoward Hinnant 15503e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 1551848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 15523e519524SHoward Hinnantvoid 15533e519524SHoward Hinnantswap(map<_Key, _Tp, _Compare, _Allocator>& __x, 15543e519524SHoward Hinnant map<_Key, _Tp, _Compare, _Allocator>& __y) 15551052ee39SHoward Hinnant _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y))) 15563e519524SHoward Hinnant{ 15573e519524SHoward Hinnant __x.swap(__y); 15583e519524SHoward Hinnant} 15593e519524SHoward Hinnant 15603e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare = less<_Key>, 15613e519524SHoward Hinnant class _Allocator = allocator<pair<const _Key, _Tp> > > 1562e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS multimap 15633e519524SHoward Hinnant{ 15643e519524SHoward Hinnantpublic: 15653e519524SHoward Hinnant // types: 15663e519524SHoward Hinnant typedef _Key key_type; 15673e519524SHoward Hinnant typedef _Tp mapped_type; 15683e519524SHoward Hinnant typedef pair<const key_type, mapped_type> value_type; 15693e519524SHoward Hinnant typedef _Compare key_compare; 15703e519524SHoward Hinnant typedef _Allocator allocator_type; 15713e519524SHoward Hinnant typedef value_type& reference; 15723e519524SHoward Hinnant typedef const value_type& const_reference; 15733e519524SHoward Hinnant 157494f89aeeSMarshall Clow static_assert((is_same<typename allocator_type::value_type, value_type>::value), 157594f89aeeSMarshall Clow "Allocator::value_type must be same type as value_type"); 157694f89aeeSMarshall Clow 1577e2f2d1edSEric Fiselier class _LIBCPP_TEMPLATE_VIS value_compare 15783e519524SHoward Hinnant : public binary_function<value_type, value_type, bool> 15793e519524SHoward Hinnant { 15803e519524SHoward Hinnant friend class multimap; 15813e519524SHoward Hinnant protected: 15823e519524SHoward Hinnant key_compare comp; 15833e519524SHoward Hinnant 1584848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 15853e519524SHoward Hinnant value_compare(key_compare c) : comp(c) {} 15863e519524SHoward Hinnant public: 1587848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 15883e519524SHoward Hinnant bool operator()(const value_type& __x, const value_type& __y) const 15893e519524SHoward Hinnant {return comp(__x.first, __y.first);} 15903e519524SHoward Hinnant }; 15913e519524SHoward Hinnant 15923e519524SHoward Hinnantprivate: 159307d3eccdSHoward Hinnant 15949fd9f84fSHoward Hinnant typedef _VSTD::__value_type<key_type, mapped_type> __value_type; 1595abb160e6SHoward Hinnant typedef __map_value_compare<key_type, __value_type, key_compare> __vc; 15961f508014SMarshall Clow typedef typename __rebind_alloc_helper<allocator_traits<allocator_type>, 15971f508014SMarshall Clow __value_type>::type __allocator_type; 15983e519524SHoward Hinnant typedef __tree<__value_type, __vc, __allocator_type> __base; 15993e519524SHoward Hinnant typedef typename __base::__node_traits __node_traits; 16003e519524SHoward Hinnant typedef allocator_traits<allocator_type> __alloc_traits; 16013e519524SHoward Hinnant 16023e519524SHoward Hinnant __base __tree_; 16033e519524SHoward Hinnant 16043e519524SHoward Hinnantpublic: 16053e519524SHoward Hinnant typedef typename __alloc_traits::pointer pointer; 16063e519524SHoward Hinnant typedef typename __alloc_traits::const_pointer const_pointer; 16073e519524SHoward Hinnant typedef typename __alloc_traits::size_type size_type; 16083e519524SHoward Hinnant typedef typename __alloc_traits::difference_type difference_type; 16093e519524SHoward Hinnant typedef __map_iterator<typename __base::iterator> iterator; 16103e519524SHoward Hinnant typedef __map_const_iterator<typename __base::const_iterator> const_iterator; 1611ce48a113SHoward Hinnant typedef _VSTD::reverse_iterator<iterator> reverse_iterator; 1612ce48a113SHoward Hinnant typedef _VSTD::reverse_iterator<const_iterator> const_reverse_iterator; 16133e519524SHoward Hinnant 1614b0386a51SErik Pilkington#if _LIBCPP_STD_VER > 14 1615b0386a51SErik Pilkington typedef __map_node_handle<typename __base::__node, allocator_type> node_type; 1616b0386a51SErik Pilkington#endif 1617b0386a51SErik Pilkington 1618848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 1619415a24e4SMarshall Clow multimap() 1620415a24e4SMarshall Clow _NOEXCEPT_( 1621415a24e4SMarshall Clow is_nothrow_default_constructible<allocator_type>::value && 1622415a24e4SMarshall Clow is_nothrow_default_constructible<key_compare>::value && 1623415a24e4SMarshall Clow is_nothrow_copy_constructible<key_compare>::value) 1624415a24e4SMarshall Clow : __tree_(__vc(key_compare())) {} 1625415a24e4SMarshall Clow 1626415a24e4SMarshall Clow _LIBCPP_INLINE_VISIBILITY 1627415a24e4SMarshall Clow explicit multimap(const key_compare& __comp) 16281052ee39SHoward Hinnant _NOEXCEPT_( 16291052ee39SHoward Hinnant is_nothrow_default_constructible<allocator_type>::value && 16301052ee39SHoward Hinnant is_nothrow_copy_constructible<key_compare>::value) 16313e519524SHoward Hinnant : __tree_(__vc(__comp)) {} 16323e519524SHoward Hinnant 1633848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 16343e519524SHoward Hinnant explicit multimap(const key_compare& __comp, const allocator_type& __a) 16352a10c960SMarshall Clow : __tree_(__vc(__comp), typename __base::allocator_type(__a)) {} 16363e519524SHoward Hinnant 16373e519524SHoward Hinnant template <class _InputIterator> 1638848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 16393e519524SHoward Hinnant multimap(_InputIterator __f, _InputIterator __l, 16403e519524SHoward Hinnant const key_compare& __comp = key_compare()) 16413e519524SHoward Hinnant : __tree_(__vc(__comp)) 16423e519524SHoward Hinnant { 16433e519524SHoward Hinnant insert(__f, __l); 16443e519524SHoward Hinnant } 16453e519524SHoward Hinnant 16463e519524SHoward Hinnant template <class _InputIterator> 1647848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 16483e519524SHoward Hinnant multimap(_InputIterator __f, _InputIterator __l, 16493e519524SHoward Hinnant const key_compare& __comp, const allocator_type& __a) 16502a10c960SMarshall Clow : __tree_(__vc(__comp), typename __base::allocator_type(__a)) 16513e519524SHoward Hinnant { 16523e519524SHoward Hinnant insert(__f, __l); 16533e519524SHoward Hinnant } 16543e519524SHoward Hinnant 1655fbc317d4SMarshall Clow#if _LIBCPP_STD_VER > 11 1656fbc317d4SMarshall Clow template <class _InputIterator> 1657fbc317d4SMarshall Clow _LIBCPP_INLINE_VISIBILITY 1658fbc317d4SMarshall Clow multimap(_InputIterator __f, _InputIterator __l, const allocator_type& __a) 1659fbc317d4SMarshall Clow : multimap(__f, __l, key_compare(), __a) {} 1660fbc317d4SMarshall Clow#endif 1661fbc317d4SMarshall Clow 1662848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 16633e519524SHoward Hinnant multimap(const multimap& __m) 16643e519524SHoward Hinnant : __tree_(__m.__tree_.value_comp(), 16653e519524SHoward Hinnant __alloc_traits::select_on_container_copy_construction(__m.__tree_.__alloc())) 16663e519524SHoward Hinnant { 16673e519524SHoward Hinnant insert(__m.begin(), __m.end()); 16683e519524SHoward Hinnant } 16693e519524SHoward Hinnant 16705a33687dSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 16715a33687dSHoward Hinnant multimap& operator=(const multimap& __m) 16725a33687dSHoward Hinnant { 16732ee83725SMarshall Clow#ifndef _LIBCPP_CXX03_LANG 16745a33687dSHoward Hinnant __tree_ = __m.__tree_; 167507d3eccdSHoward Hinnant#else 167674cf6ff5SMarshall Clow if (this != &__m) { 167707d3eccdSHoward Hinnant __tree_.clear(); 167807d3eccdSHoward Hinnant __tree_.value_comp() = __m.__tree_.value_comp(); 167907d3eccdSHoward Hinnant __tree_.__copy_assign_alloc(__m.__tree_); 168007d3eccdSHoward Hinnant insert(__m.begin(), __m.end()); 168174cf6ff5SMarshall Clow } 168207d3eccdSHoward Hinnant#endif 16835a33687dSHoward Hinnant return *this; 16845a33687dSHoward Hinnant } 16855a33687dSHoward Hinnant 168618293116SEric Fiselier#ifndef _LIBCPP_CXX03_LANG 16873e519524SHoward Hinnant 1688848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 16893e519524SHoward Hinnant multimap(multimap&& __m) 16901052ee39SHoward Hinnant _NOEXCEPT_(is_nothrow_move_constructible<__base>::value) 1691ce48a113SHoward Hinnant : __tree_(_VSTD::move(__m.__tree_)) 16923e519524SHoward Hinnant { 16933e519524SHoward Hinnant } 16943e519524SHoward Hinnant 16953e519524SHoward Hinnant multimap(multimap&& __m, const allocator_type& __a); 16963e519524SHoward Hinnant 1697848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 169854976f26SHoward Hinnant multimap& operator=(multimap&& __m) 169954976f26SHoward Hinnant _NOEXCEPT_(is_nothrow_move_assignable<__base>::value) 170054976f26SHoward Hinnant { 170154976f26SHoward Hinnant __tree_ = _VSTD::move(__m.__tree_); 170254976f26SHoward Hinnant return *this; 170354976f26SHoward Hinnant } 170454976f26SHoward Hinnant 170554976f26SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 17063e519524SHoward Hinnant multimap(initializer_list<value_type> __il, const key_compare& __comp = key_compare()) 17073e519524SHoward Hinnant : __tree_(__vc(__comp)) 17083e519524SHoward Hinnant { 17093e519524SHoward Hinnant insert(__il.begin(), __il.end()); 17103e519524SHoward Hinnant } 17113e519524SHoward Hinnant 1712848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 17133e519524SHoward Hinnant multimap(initializer_list<value_type> __il, const key_compare& __comp, const allocator_type& __a) 17142a10c960SMarshall Clow : __tree_(__vc(__comp), typename __base::allocator_type(__a)) 17153e519524SHoward Hinnant { 17163e519524SHoward Hinnant insert(__il.begin(), __il.end()); 17173e519524SHoward Hinnant } 17183e519524SHoward Hinnant 1719fbc317d4SMarshall Clow#if _LIBCPP_STD_VER > 11 1720fbc317d4SMarshall Clow _LIBCPP_INLINE_VISIBILITY 1721fbc317d4SMarshall Clow multimap(initializer_list<value_type> __il, const allocator_type& __a) 1722fbc317d4SMarshall Clow : multimap(__il, key_compare(), __a) {} 1723fbc317d4SMarshall Clow#endif 1724fbc317d4SMarshall Clow 1725848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 17263e519524SHoward Hinnant multimap& operator=(initializer_list<value_type> __il) 17273e519524SHoward Hinnant { 17283e519524SHoward Hinnant __tree_.__assign_multi(__il.begin(), __il.end()); 17293e519524SHoward Hinnant return *this; 17303e519524SHoward Hinnant } 173154976f26SHoward Hinnant 173218293116SEric Fiselier#endif // _LIBCPP_CXX03_LANG 17333e519524SHoward Hinnant 1734848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 17353e519524SHoward Hinnant explicit multimap(const allocator_type& __a) 17362a10c960SMarshall Clow : __tree_(typename __base::allocator_type(__a)) 17373e519524SHoward Hinnant { 17383e519524SHoward Hinnant } 17393e519524SHoward Hinnant 1740848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 17413e519524SHoward Hinnant multimap(const multimap& __m, const allocator_type& __a) 17422a10c960SMarshall Clow : __tree_(__m.__tree_.value_comp(), typename __base::allocator_type(__a)) 17433e519524SHoward Hinnant { 17443e519524SHoward Hinnant insert(__m.begin(), __m.end()); 17453e519524SHoward Hinnant } 17463e519524SHoward Hinnant 1747848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 17481052ee39SHoward Hinnant iterator begin() _NOEXCEPT {return __tree_.begin();} 1749848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 17501052ee39SHoward Hinnant const_iterator begin() const _NOEXCEPT {return __tree_.begin();} 1751848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 17521052ee39SHoward Hinnant iterator end() _NOEXCEPT {return __tree_.end();} 1753848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 17541052ee39SHoward Hinnant const_iterator end() const _NOEXCEPT {return __tree_.end();} 17553e519524SHoward Hinnant 1756848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 17571052ee39SHoward Hinnant reverse_iterator rbegin() _NOEXCEPT {return reverse_iterator(end());} 1758848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 17591052ee39SHoward Hinnant const_reverse_iterator rbegin() const _NOEXCEPT 17601052ee39SHoward Hinnant {return const_reverse_iterator(end());} 1761848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 17621052ee39SHoward Hinnant reverse_iterator rend() _NOEXCEPT {return reverse_iterator(begin());} 1763848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 17641052ee39SHoward Hinnant const_reverse_iterator rend() const _NOEXCEPT 17651052ee39SHoward Hinnant {return const_reverse_iterator(begin());} 17663e519524SHoward Hinnant 1767848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 17681052ee39SHoward Hinnant const_iterator cbegin() const _NOEXCEPT {return begin();} 1769848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 17701052ee39SHoward Hinnant const_iterator cend() const _NOEXCEPT {return end();} 1771848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 17721052ee39SHoward Hinnant const_reverse_iterator crbegin() const _NOEXCEPT {return rbegin();} 1773848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 17741052ee39SHoward Hinnant const_reverse_iterator crend() const _NOEXCEPT {return rend();} 17753e519524SHoward Hinnant 177672c8fad4SMarshall Clow _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY 17771052ee39SHoward Hinnant bool empty() const _NOEXCEPT {return __tree_.size() == 0;} 1778848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 17791052ee39SHoward Hinnant size_type size() const _NOEXCEPT {return __tree_.size();} 1780848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 17811052ee39SHoward Hinnant size_type max_size() const _NOEXCEPT {return __tree_.max_size();} 17823e519524SHoward Hinnant 1783848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 17842a10c960SMarshall Clow allocator_type get_allocator() const _NOEXCEPT {return allocator_type(__tree_.__alloc());} 1785848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 17863e519524SHoward Hinnant key_compare key_comp() const {return __tree_.value_comp().key_comp();} 1787848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 17881052ee39SHoward Hinnant value_compare value_comp() const 17891052ee39SHoward Hinnant {return value_compare(__tree_.value_comp().key_comp());} 17903e519524SHoward Hinnant 17915e3ea4ddSEric Fiselier#ifndef _LIBCPP_CXX03_LANG 17927609c9b6SHoward Hinnant 17938b805c91SHoward Hinnant template <class ..._Args> 17945e3ea4ddSEric Fiselier _LIBCPP_INLINE_VISIBILITY 17955e3ea4ddSEric Fiselier iterator emplace(_Args&& ...__args) { 17965e3ea4ddSEric Fiselier return __tree_.__emplace_multi(_VSTD::forward<_Args>(__args)...); 17975e3ea4ddSEric Fiselier } 17983e519524SHoward Hinnant 17998b805c91SHoward Hinnant template <class ..._Args> 18005e3ea4ddSEric Fiselier _LIBCPP_INLINE_VISIBILITY 18015e3ea4ddSEric Fiselier iterator emplace_hint(const_iterator __p, _Args&& ...__args) { 18025e3ea4ddSEric Fiselier return __tree_.__emplace_hint_multi(__p.__i_, _VSTD::forward<_Args>(__args)...); 18035e3ea4ddSEric Fiselier } 18047609c9b6SHoward Hinnant 1805c003db1fSHoward Hinnant template <class _Pp, 1806c003db1fSHoward Hinnant class = typename enable_if<is_constructible<value_type, _Pp>::value>::type> 1807848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 1808c003db1fSHoward Hinnant iterator insert(_Pp&& __p) 1809c003db1fSHoward Hinnant {return __tree_.__insert_multi(_VSTD::forward<_Pp>(__p));} 18103e519524SHoward Hinnant 1811c003db1fSHoward Hinnant template <class _Pp, 1812c003db1fSHoward Hinnant class = typename enable_if<is_constructible<value_type, _Pp>::value>::type> 1813848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 1814c003db1fSHoward Hinnant iterator insert(const_iterator __pos, _Pp&& __p) 1815c003db1fSHoward Hinnant {return __tree_.__insert_multi(__pos.__i_, _VSTD::forward<_Pp>(__p));} 18163e519524SHoward Hinnant 18177a9f500fSEric Fiselier _LIBCPP_INLINE_VISIBILITY 18187a9f500fSEric Fiselier iterator insert(value_type&& __v) 18197a9f500fSEric Fiselier {return __tree_.__insert_multi(_VSTD::move(__v));} 18207a9f500fSEric Fiselier 18217a9f500fSEric Fiselier _LIBCPP_INLINE_VISIBILITY 18227a9f500fSEric Fiselier iterator insert(const_iterator __p, value_type&& __v) 18237a9f500fSEric Fiselier {return __tree_.__insert_multi(__p.__i_, _VSTD::move(__v));} 18247a9f500fSEric Fiselier 182518293116SEric Fiselier 182618293116SEric Fiselier _LIBCPP_INLINE_VISIBILITY 182718293116SEric Fiselier void insert(initializer_list<value_type> __il) 182818293116SEric Fiselier {insert(__il.begin(), __il.end());} 182918293116SEric Fiselier 18305e3ea4ddSEric Fiselier#endif // _LIBCPP_CXX03_LANG 18313e519524SHoward Hinnant 1832848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 18333e519524SHoward Hinnant iterator insert(const value_type& __v) {return __tree_.__insert_multi(__v);} 18343e519524SHoward Hinnant 1835848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 18363e519524SHoward Hinnant iterator insert(const_iterator __p, const value_type& __v) 18373e519524SHoward Hinnant {return __tree_.__insert_multi(__p.__i_, __v);} 18383e519524SHoward Hinnant 18393e519524SHoward Hinnant template <class _InputIterator> 1840848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 18413e519524SHoward Hinnant void insert(_InputIterator __f, _InputIterator __l) 18423e519524SHoward Hinnant { 18433e519524SHoward Hinnant for (const_iterator __e = cend(); __f != __l; ++__f) 18443e519524SHoward Hinnant __tree_.__insert_multi(__e.__i_, *__f); 18453e519524SHoward Hinnant } 18463e519524SHoward Hinnant 1847848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 18483e519524SHoward Hinnant iterator erase(const_iterator __p) {return __tree_.erase(__p.__i_);} 1849848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 1850ec392968SMarshall Clow iterator erase(iterator __p) {return __tree_.erase(__p.__i_);} 1851ec392968SMarshall Clow _LIBCPP_INLINE_VISIBILITY 18523e519524SHoward Hinnant size_type erase(const key_type& __k) {return __tree_.__erase_multi(__k);} 1853848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 18543e519524SHoward Hinnant iterator erase(const_iterator __f, const_iterator __l) 18553e519524SHoward Hinnant {return __tree_.erase(__f.__i_, __l.__i_);} 1856b0386a51SErik Pilkington 1857b0386a51SErik Pilkington#if _LIBCPP_STD_VER > 14 1858b0386a51SErik Pilkington _LIBCPP_INLINE_VISIBILITY 1859b0386a51SErik Pilkington iterator insert(node_type&& __nh) 1860b0386a51SErik Pilkington { 1861b0386a51SErik Pilkington _LIBCPP_ASSERT(__nh.empty() || __nh.get_allocator() == get_allocator(), 1862b0386a51SErik Pilkington "node_type with incompatible allocator passed to multimap::insert()"); 1863b0386a51SErik Pilkington return __tree_.template __node_handle_insert_multi<node_type>( 1864b0386a51SErik Pilkington _VSTD::move(__nh)); 1865b0386a51SErik Pilkington } 1866b0386a51SErik Pilkington _LIBCPP_INLINE_VISIBILITY 1867b0386a51SErik Pilkington iterator insert(const_iterator __hint, node_type&& __nh) 1868b0386a51SErik Pilkington { 1869b0386a51SErik Pilkington _LIBCPP_ASSERT(__nh.empty() || __nh.get_allocator() == get_allocator(), 1870b0386a51SErik Pilkington "node_type with incompatible allocator passed to multimap::insert()"); 1871b0386a51SErik Pilkington return __tree_.template __node_handle_insert_multi<node_type>( 1872b0386a51SErik Pilkington __hint.__i_, _VSTD::move(__nh)); 1873b0386a51SErik Pilkington } 1874b0386a51SErik Pilkington _LIBCPP_INLINE_VISIBILITY 1875b0386a51SErik Pilkington node_type extract(key_type const& __key) 1876b0386a51SErik Pilkington { 1877b0386a51SErik Pilkington return __tree_.template __node_handle_extract<node_type>(__key); 1878b0386a51SErik Pilkington } 1879b0386a51SErik Pilkington _LIBCPP_INLINE_VISIBILITY 1880b0386a51SErik Pilkington node_type extract(const_iterator __it) 1881b0386a51SErik Pilkington { 1882b0386a51SErik Pilkington return __tree_.template __node_handle_extract<node_type>( 1883b0386a51SErik Pilkington __it.__i_); 1884b0386a51SErik Pilkington } 1885b0386a51SErik Pilkington#endif 1886b0386a51SErik Pilkington 1887848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 1888934e9a39SMarshall Clow void clear() _NOEXCEPT {__tree_.clear();} 18893e519524SHoward Hinnant 1890848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 18911052ee39SHoward Hinnant void swap(multimap& __m) 18921052ee39SHoward Hinnant _NOEXCEPT_(__is_nothrow_swappable<__base>::value) 18931052ee39SHoward Hinnant {__tree_.swap(__m.__tree_);} 18943e519524SHoward Hinnant 1895848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 18963e519524SHoward Hinnant iterator find(const key_type& __k) {return __tree_.find(__k);} 1897848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 18983e519524SHoward Hinnant const_iterator find(const key_type& __k) const {return __tree_.find(__k);} 18992585835cSMarshall Clow#if _LIBCPP_STD_VER > 11 19002585835cSMarshall Clow template <typename _K2> 19012585835cSMarshall Clow _LIBCPP_INLINE_VISIBILITY 19022585835cSMarshall Clow typename enable_if<__is_transparent<_Compare, _K2>::value,iterator>::type 19032585835cSMarshall Clow find(const _K2& __k) {return __tree_.find(__k);} 19042585835cSMarshall Clow template <typename _K2> 19052585835cSMarshall Clow _LIBCPP_INLINE_VISIBILITY 19062585835cSMarshall Clow typename enable_if<__is_transparent<_Compare, _K2>::value,const_iterator>::type 19072585835cSMarshall Clow find(const _K2& __k) const {return __tree_.find(__k);} 19082585835cSMarshall Clow#endif 19092585835cSMarshall Clow 1910848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 19113e519524SHoward Hinnant size_type count(const key_type& __k) const 19123e519524SHoward Hinnant {return __tree_.__count_multi(__k);} 19130aacbc92SMarshall Clow#if _LIBCPP_STD_VER > 11 19140aacbc92SMarshall Clow template <typename _K2> 19150aacbc92SMarshall Clow _LIBCPP_INLINE_VISIBILITY 19160aacbc92SMarshall Clow typename enable_if<__is_transparent<_Compare, _K2>::value,size_type>::type 1917f8457a07SMarshall Clow count(const _K2& __k) const {return __tree_.__count_multi(__k);} 19180aacbc92SMarshall Clow#endif 1919848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 19203e519524SHoward Hinnant iterator lower_bound(const key_type& __k) 19213e519524SHoward Hinnant {return __tree_.lower_bound(__k);} 1922848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 19233e519524SHoward Hinnant const_iterator lower_bound(const key_type& __k) const 19243e519524SHoward Hinnant {return __tree_.lower_bound(__k);} 19252585835cSMarshall Clow#if _LIBCPP_STD_VER > 11 19262585835cSMarshall Clow template <typename _K2> 19272585835cSMarshall Clow _LIBCPP_INLINE_VISIBILITY 19282585835cSMarshall Clow typename enable_if<__is_transparent<_Compare, _K2>::value,iterator>::type 19292585835cSMarshall Clow lower_bound(const _K2& __k) {return __tree_.lower_bound(__k);} 19302585835cSMarshall Clow 19312585835cSMarshall Clow template <typename _K2> 19322585835cSMarshall Clow _LIBCPP_INLINE_VISIBILITY 19332585835cSMarshall Clow typename enable_if<__is_transparent<_Compare, _K2>::value,const_iterator>::type 19342585835cSMarshall Clow lower_bound(const _K2& __k) const {return __tree_.lower_bound(__k);} 19352585835cSMarshall Clow#endif 19362585835cSMarshall Clow 1937848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 19383e519524SHoward Hinnant iterator upper_bound(const key_type& __k) 19393e519524SHoward Hinnant {return __tree_.upper_bound(__k);} 1940848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 19413e519524SHoward Hinnant const_iterator upper_bound(const key_type& __k) const 19423e519524SHoward Hinnant {return __tree_.upper_bound(__k);} 19432585835cSMarshall Clow#if _LIBCPP_STD_VER > 11 19442585835cSMarshall Clow template <typename _K2> 19452585835cSMarshall Clow _LIBCPP_INLINE_VISIBILITY 19462585835cSMarshall Clow typename enable_if<__is_transparent<_Compare, _K2>::value,iterator>::type 19472585835cSMarshall Clow upper_bound(const _K2& __k) {return __tree_.upper_bound(__k);} 19482585835cSMarshall Clow template <typename _K2> 19492585835cSMarshall Clow _LIBCPP_INLINE_VISIBILITY 19502585835cSMarshall Clow typename enable_if<__is_transparent<_Compare, _K2>::value,const_iterator>::type 19512585835cSMarshall Clow upper_bound(const _K2& __k) const {return __tree_.upper_bound(__k);} 19522585835cSMarshall Clow#endif 19532585835cSMarshall Clow 1954848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 19553e519524SHoward Hinnant pair<iterator,iterator> equal_range(const key_type& __k) 19563e519524SHoward Hinnant {return __tree_.__equal_range_multi(__k);} 1957848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 19583e519524SHoward Hinnant pair<const_iterator,const_iterator> equal_range(const key_type& __k) const 19593e519524SHoward Hinnant {return __tree_.__equal_range_multi(__k);} 19602585835cSMarshall Clow#if _LIBCPP_STD_VER > 11 19612585835cSMarshall Clow template <typename _K2> 19622585835cSMarshall Clow _LIBCPP_INLINE_VISIBILITY 19632585835cSMarshall Clow typename enable_if<__is_transparent<_Compare, _K2>::value,pair<iterator,iterator>>::type 19642585835cSMarshall Clow equal_range(const _K2& __k) {return __tree_.__equal_range_multi(__k);} 19652585835cSMarshall Clow template <typename _K2> 19662585835cSMarshall Clow _LIBCPP_INLINE_VISIBILITY 19672585835cSMarshall Clow typename enable_if<__is_transparent<_Compare, _K2>::value,pair<const_iterator,const_iterator>>::type 19682585835cSMarshall Clow equal_range(const _K2& __k) const {return __tree_.__equal_range_multi(__k);} 19692585835cSMarshall Clow#endif 19703e519524SHoward Hinnant 19713e519524SHoward Hinnantprivate: 19723e519524SHoward Hinnant typedef typename __base::__node __node; 19733e519524SHoward Hinnant typedef typename __base::__node_allocator __node_allocator; 19743e519524SHoward Hinnant typedef typename __base::__node_pointer __node_pointer; 19750594ad71SEric Fiselier 1976c003db1fSHoward Hinnant typedef __map_node_destructor<__node_allocator> _Dp; 1977c003db1fSHoward Hinnant typedef unique_ptr<__node, _Dp> __node_holder; 19783e519524SHoward Hinnant}; 19793e519524SHoward Hinnant 19805e3ea4ddSEric Fiselier#ifndef _LIBCPP_CXX03_LANG 19813e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 19823e519524SHoward Hinnantmultimap<_Key, _Tp, _Compare, _Allocator>::multimap(multimap&& __m, const allocator_type& __a) 19832a10c960SMarshall Clow : __tree_(_VSTD::move(__m.__tree_), typename __base::allocator_type(__a)) 19843e519524SHoward Hinnant{ 19853e519524SHoward Hinnant if (__a != __m.get_allocator()) 19863e519524SHoward Hinnant { 19873e519524SHoward Hinnant const_iterator __e = cend(); 19883e519524SHoward Hinnant while (!__m.empty()) 19893e519524SHoward Hinnant __tree_.__insert_multi(__e.__i_, 1990f52318b4SErik Pilkington _VSTD::move(__m.__tree_.remove(__m.begin().__i_)->__value_.__move())); 19913e519524SHoward Hinnant } 19923e519524SHoward Hinnant} 19935e3ea4ddSEric Fiselier#endif 19943e519524SHoward Hinnant 19953e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 1996848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 19973e519524SHoward Hinnantbool 19983e519524SHoward Hinnantoperator==(const multimap<_Key, _Tp, _Compare, _Allocator>& __x, 19993e519524SHoward Hinnant const multimap<_Key, _Tp, _Compare, _Allocator>& __y) 20003e519524SHoward Hinnant{ 2001ce48a113SHoward Hinnant return __x.size() == __y.size() && _VSTD::equal(__x.begin(), __x.end(), __y.begin()); 20023e519524SHoward Hinnant} 20033e519524SHoward Hinnant 20043e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 2005848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 20063e519524SHoward Hinnantbool 20073e519524SHoward Hinnantoperator< (const multimap<_Key, _Tp, _Compare, _Allocator>& __x, 20083e519524SHoward Hinnant const multimap<_Key, _Tp, _Compare, _Allocator>& __y) 20093e519524SHoward Hinnant{ 2010ce48a113SHoward Hinnant return _VSTD::lexicographical_compare(__x.begin(), __x.end(), __y.begin(), __y.end()); 20113e519524SHoward Hinnant} 20123e519524SHoward Hinnant 20133e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 2014848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 20153e519524SHoward Hinnantbool 20163e519524SHoward Hinnantoperator!=(const multimap<_Key, _Tp, _Compare, _Allocator>& __x, 20173e519524SHoward Hinnant const multimap<_Key, _Tp, _Compare, _Allocator>& __y) 20183e519524SHoward Hinnant{ 20193e519524SHoward Hinnant return !(__x == __y); 20203e519524SHoward Hinnant} 20213e519524SHoward Hinnant 20223e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 2023848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 20243e519524SHoward Hinnantbool 20253e519524SHoward Hinnantoperator> (const multimap<_Key, _Tp, _Compare, _Allocator>& __x, 20263e519524SHoward Hinnant const multimap<_Key, _Tp, _Compare, _Allocator>& __y) 20273e519524SHoward Hinnant{ 20283e519524SHoward Hinnant return __y < __x; 20293e519524SHoward Hinnant} 20303e519524SHoward Hinnant 20313e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 2032848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 20333e519524SHoward Hinnantbool 20343e519524SHoward Hinnantoperator>=(const multimap<_Key, _Tp, _Compare, _Allocator>& __x, 20353e519524SHoward Hinnant const multimap<_Key, _Tp, _Compare, _Allocator>& __y) 20363e519524SHoward Hinnant{ 20373e519524SHoward Hinnant return !(__x < __y); 20383e519524SHoward Hinnant} 20393e519524SHoward Hinnant 20403e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 2041848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 20423e519524SHoward Hinnantbool 20433e519524SHoward Hinnantoperator<=(const multimap<_Key, _Tp, _Compare, _Allocator>& __x, 20443e519524SHoward Hinnant const multimap<_Key, _Tp, _Compare, _Allocator>& __y) 20453e519524SHoward Hinnant{ 20463e519524SHoward Hinnant return !(__y < __x); 20473e519524SHoward Hinnant} 20483e519524SHoward Hinnant 20493e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 2050848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 20513e519524SHoward Hinnantvoid 20523e519524SHoward Hinnantswap(multimap<_Key, _Tp, _Compare, _Allocator>& __x, 20533e519524SHoward Hinnant multimap<_Key, _Tp, _Compare, _Allocator>& __y) 20541052ee39SHoward Hinnant _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y))) 20553e519524SHoward Hinnant{ 20563e519524SHoward Hinnant __x.swap(__y); 20573e519524SHoward Hinnant} 20583e519524SHoward Hinnant 20593e519524SHoward Hinnant_LIBCPP_END_NAMESPACE_STD 20603e519524SHoward Hinnant 20613e519524SHoward Hinnant#endif // _LIBCPP_MAP 2062