13e519524SHoward Hinnant// -*- C++ -*- 23e519524SHoward Hinnant//===----------------------------- map ------------------------------------===// 33e519524SHoward Hinnant// 45b08a8a4SHoward Hinnant// The LLVM Compiler Infrastructure 53e519524SHoward Hinnant// 6412dbebeSHoward Hinnant// This file is dual licensed under the MIT and the University of Illinois Open 7412dbebeSHoward Hinnant// Source Licenses. See LICENSE.TXT for details. 83e519524SHoward Hinnant// 93e519524SHoward Hinnant//===----------------------------------------------------------------------===// 103e519524SHoward Hinnant 113e519524SHoward Hinnant#ifndef _LIBCPP_MAP 123e519524SHoward Hinnant#define _LIBCPP_MAP 133e519524SHoward Hinnant 143e519524SHoward Hinnant/* 153e519524SHoward Hinnant 163e519524SHoward Hinnant map synopsis 173e519524SHoward Hinnant 183e519524SHoward Hinnantnamespace std 193e519524SHoward Hinnant{ 203e519524SHoward Hinnant 213e519524SHoward Hinnanttemplate <class Key, class T, class Compare = less<Key>, 223e519524SHoward Hinnant class Allocator = allocator<pair<const Key, T>>> 233e519524SHoward Hinnantclass map 243e519524SHoward Hinnant{ 253e519524SHoward Hinnantpublic: 263e519524SHoward Hinnant // types: 273e519524SHoward Hinnant typedef Key key_type; 283e519524SHoward Hinnant typedef T mapped_type; 293e519524SHoward Hinnant typedef pair<const key_type, mapped_type> value_type; 303e519524SHoward Hinnant typedef Compare key_compare; 313e519524SHoward Hinnant typedef Allocator allocator_type; 323e519524SHoward Hinnant typedef typename allocator_type::reference reference; 333e519524SHoward Hinnant typedef typename allocator_type::const_reference const_reference; 343e519524SHoward Hinnant typedef typename allocator_type::pointer pointer; 353e519524SHoward Hinnant typedef typename allocator_type::const_pointer const_pointer; 363e519524SHoward Hinnant typedef typename allocator_type::size_type size_type; 373e519524SHoward Hinnant typedef typename allocator_type::difference_type difference_type; 383e519524SHoward Hinnant 393e519524SHoward Hinnant typedef implementation-defined iterator; 403e519524SHoward Hinnant typedef implementation-defined const_iterator; 413e519524SHoward Hinnant typedef std::reverse_iterator<iterator> reverse_iterator; 423e519524SHoward Hinnant typedef std::reverse_iterator<const_iterator> const_reverse_iterator; 433e519524SHoward Hinnant 443e519524SHoward Hinnant class value_compare 453e519524SHoward Hinnant : public binary_function<value_type, value_type, bool> 463e519524SHoward Hinnant { 473e519524SHoward Hinnant friend class map; 483e519524SHoward Hinnant protected: 493e519524SHoward Hinnant key_compare comp; 503e519524SHoward Hinnant 513e519524SHoward Hinnant value_compare(key_compare c); 523e519524SHoward Hinnant public: 533e519524SHoward Hinnant bool operator()(const value_type& x, const value_type& y) const; 543e519524SHoward Hinnant }; 553e519524SHoward Hinnant 563e519524SHoward Hinnant // construct/copy/destroy: 571052ee39SHoward Hinnant map() 581052ee39SHoward Hinnant noexcept( 591052ee39SHoward Hinnant is_nothrow_default_constructible<allocator_type>::value && 601052ee39SHoward Hinnant is_nothrow_default_constructible<key_compare>::value && 611052ee39SHoward Hinnant is_nothrow_copy_constructible<key_compare>::value); 623e519524SHoward Hinnant explicit map(const key_compare& comp); 633e519524SHoward Hinnant map(const key_compare& comp, const allocator_type& a); 643e519524SHoward Hinnant template <class InputIterator> 653e519524SHoward Hinnant map(InputIterator first, InputIterator last, 663e519524SHoward Hinnant const key_compare& comp = key_compare()); 673e519524SHoward Hinnant template <class InputIterator> 683e519524SHoward Hinnant map(InputIterator first, InputIterator last, 693e519524SHoward Hinnant const key_compare& comp, const allocator_type& a); 703e519524SHoward Hinnant map(const map& m); 711052ee39SHoward Hinnant map(map&& m) 721052ee39SHoward Hinnant noexcept( 731052ee39SHoward Hinnant is_nothrow_move_constructible<allocator_type>::value && 741052ee39SHoward Hinnant is_nothrow_move_constructible<key_compare>::value); 753e519524SHoward Hinnant explicit map(const allocator_type& a); 763e519524SHoward Hinnant map(const map& m, const allocator_type& a); 773e519524SHoward Hinnant map(map&& m, const allocator_type& a); 783e519524SHoward Hinnant map(initializer_list<value_type> il, const key_compare& comp = key_compare()); 793e519524SHoward Hinnant map(initializer_list<value_type> il, const key_compare& comp, const allocator_type& a); 803e519524SHoward Hinnant ~map(); 813e519524SHoward Hinnant 823e519524SHoward Hinnant map& operator=(const map& m); 831052ee39SHoward Hinnant map& operator=(map&& m) 841052ee39SHoward Hinnant noexcept( 851052ee39SHoward Hinnant allocator_type::propagate_on_container_move_assignment::value && 861052ee39SHoward Hinnant is_nothrow_move_assignable<allocator_type>::value && 870e9f71c1SHoward Hinnant is_nothrow_move_assignable<key_compare>::value); 883e519524SHoward Hinnant map& operator=(initializer_list<value_type> il); 893e519524SHoward Hinnant 903e519524SHoward Hinnant // iterators: 910e9f71c1SHoward Hinnant iterator begin() noexcept; 920e9f71c1SHoward Hinnant const_iterator begin() const noexcept; 930e9f71c1SHoward Hinnant iterator end() noexcept; 940e9f71c1SHoward Hinnant const_iterator end() const noexcept; 953e519524SHoward Hinnant 960e9f71c1SHoward Hinnant reverse_iterator rbegin() noexcept; 970e9f71c1SHoward Hinnant const_reverse_iterator rbegin() const noexcept; 980e9f71c1SHoward Hinnant reverse_iterator rend() noexcept; 990e9f71c1SHoward Hinnant const_reverse_iterator rend() const noexcept; 1003e519524SHoward Hinnant 1010e9f71c1SHoward Hinnant const_iterator cbegin() const noexcept; 1020e9f71c1SHoward Hinnant const_iterator cend() const noexcept; 1030e9f71c1SHoward Hinnant const_reverse_iterator crbegin() const noexcept; 1040e9f71c1SHoward Hinnant const_reverse_iterator crend() const noexcept; 1053e519524SHoward Hinnant 1063e519524SHoward Hinnant // capacity: 1070e9f71c1SHoward Hinnant bool empty() const noexcept; 1080e9f71c1SHoward Hinnant size_type size() const noexcept; 1090e9f71c1SHoward Hinnant size_type max_size() const noexcept; 1103e519524SHoward Hinnant 1113e519524SHoward Hinnant // element access: 1123e519524SHoward Hinnant mapped_type& operator[](const key_type& k); 1133e519524SHoward Hinnant mapped_type& operator[](key_type&& k); 1143e519524SHoward Hinnant 1153e519524SHoward Hinnant mapped_type& at(const key_type& k); 1163e519524SHoward Hinnant const mapped_type& at(const key_type& k) const; 1173e519524SHoward Hinnant 1183e519524SHoward Hinnant // modifiers: 1193e519524SHoward Hinnant template <class... Args> 1203e519524SHoward Hinnant pair<iterator, bool> emplace(Args&&... args); 1213e519524SHoward Hinnant template <class... Args> 1223e519524SHoward Hinnant iterator emplace_hint(const_iterator position, Args&&... args); 1233e519524SHoward Hinnant pair<iterator, bool> insert(const value_type& v); 1243e519524SHoward Hinnant template <class P> 1253e519524SHoward Hinnant pair<iterator, bool> insert(P&& p); 1263e519524SHoward Hinnant iterator insert(const_iterator position, const value_type& v); 1273e519524SHoward Hinnant template <class P> 1283e519524SHoward Hinnant iterator insert(const_iterator position, P&& p); 1293e519524SHoward Hinnant template <class InputIterator> 1303e519524SHoward Hinnant void insert(InputIterator first, InputIterator last); 1313e519524SHoward Hinnant void insert(initializer_list<value_type> il); 1323e519524SHoward Hinnant 1333e519524SHoward Hinnant iterator erase(const_iterator position); 1343e519524SHoward Hinnant size_type erase(const key_type& k); 1353e519524SHoward Hinnant iterator erase(const_iterator first, const_iterator last); 1360e9f71c1SHoward Hinnant void clear() noexcept; 1373e519524SHoward Hinnant 1381052ee39SHoward Hinnant void swap(map& m) 1391052ee39SHoward Hinnant noexcept( 1401052ee39SHoward Hinnant __is_nothrow_swappable<key_compare>::value && 1411052ee39SHoward Hinnant (!allocator_type::propagate_on_container_swap::value || 1421052ee39SHoward Hinnant __is_nothrow_swappable<allocator_type>::value)); 1433e519524SHoward Hinnant 1443e519524SHoward Hinnant // observers: 1450e9f71c1SHoward Hinnant allocator_type get_allocator() const noexcept; 1463e519524SHoward Hinnant key_compare key_comp() const; 1473e519524SHoward Hinnant value_compare value_comp() const; 1483e519524SHoward Hinnant 1493e519524SHoward Hinnant // map operations: 1503e519524SHoward Hinnant iterator find(const key_type& k); 1513e519524SHoward Hinnant const_iterator find(const key_type& k) const; 1523e519524SHoward Hinnant size_type count(const key_type& k) const; 1533e519524SHoward Hinnant iterator lower_bound(const key_type& k); 1543e519524SHoward Hinnant const_iterator lower_bound(const key_type& k) const; 1553e519524SHoward Hinnant iterator upper_bound(const key_type& k); 1563e519524SHoward Hinnant const_iterator upper_bound(const key_type& k) const; 1573e519524SHoward Hinnant pair<iterator,iterator> equal_range(const key_type& k); 1583e519524SHoward Hinnant pair<const_iterator,const_iterator> equal_range(const key_type& k) const; 1593e519524SHoward Hinnant}; 1603e519524SHoward Hinnant 1613e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator> 1623e519524SHoward Hinnantbool 1633e519524SHoward Hinnantoperator==(const map<Key, T, Compare, Allocator>& x, 1643e519524SHoward Hinnant const map<Key, T, Compare, Allocator>& y); 1653e519524SHoward Hinnant 1663e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator> 1673e519524SHoward Hinnantbool 1683e519524SHoward Hinnantoperator< (const map<Key, T, Compare, Allocator>& x, 1693e519524SHoward Hinnant const map<Key, T, Compare, Allocator>& y); 1703e519524SHoward Hinnant 1713e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator> 1723e519524SHoward Hinnantbool 1733e519524SHoward Hinnantoperator!=(const map<Key, T, Compare, Allocator>& x, 1743e519524SHoward Hinnant const map<Key, T, Compare, Allocator>& y); 1753e519524SHoward Hinnant 1763e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator> 1773e519524SHoward Hinnantbool 1783e519524SHoward Hinnantoperator> (const map<Key, T, Compare, Allocator>& x, 1793e519524SHoward Hinnant const map<Key, T, Compare, Allocator>& y); 1803e519524SHoward Hinnant 1813e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator> 1823e519524SHoward Hinnantbool 1833e519524SHoward Hinnantoperator>=(const map<Key, T, Compare, Allocator>& x, 1843e519524SHoward Hinnant const map<Key, T, Compare, Allocator>& y); 1853e519524SHoward Hinnant 1863e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator> 1873e519524SHoward Hinnantbool 1883e519524SHoward Hinnantoperator<=(const map<Key, T, Compare, Allocator>& x, 1893e519524SHoward Hinnant const map<Key, T, Compare, Allocator>& y); 1903e519524SHoward Hinnant 1913e519524SHoward Hinnant// specialized algorithms: 1923e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator> 1933e519524SHoward Hinnantvoid 1941052ee39SHoward Hinnantswap(map<Key, T, Compare, Allocator>& x, map<Key, T, Compare, Allocator>& y) 1951052ee39SHoward Hinnant noexcept(noexcept(x.swap(y))); 1963e519524SHoward Hinnant 1973e519524SHoward Hinnanttemplate <class Key, class T, class Compare = less<Key>, 1983e519524SHoward Hinnant class Allocator = allocator<pair<const Key, T>>> 1993e519524SHoward Hinnantclass multimap 2003e519524SHoward Hinnant{ 2013e519524SHoward Hinnantpublic: 2023e519524SHoward Hinnant // types: 2033e519524SHoward Hinnant typedef Key key_type; 2043e519524SHoward Hinnant typedef T mapped_type; 2053e519524SHoward Hinnant typedef pair<const key_type,mapped_type> value_type; 2063e519524SHoward Hinnant typedef Compare key_compare; 2073e519524SHoward Hinnant typedef Allocator allocator_type; 2083e519524SHoward Hinnant typedef typename allocator_type::reference reference; 2093e519524SHoward Hinnant typedef typename allocator_type::const_reference const_reference; 2103e519524SHoward Hinnant typedef typename allocator_type::size_type size_type; 2113e519524SHoward Hinnant typedef typename allocator_type::difference_type difference_type; 2123e519524SHoward Hinnant typedef typename allocator_type::pointer pointer; 2133e519524SHoward Hinnant typedef typename allocator_type::const_pointer const_pointer; 2143e519524SHoward Hinnant 2153e519524SHoward Hinnant typedef implementation-defined iterator; 2163e519524SHoward Hinnant typedef implementation-defined const_iterator; 2173e519524SHoward Hinnant typedef std::reverse_iterator<iterator> reverse_iterator; 2183e519524SHoward Hinnant typedef std::reverse_iterator<const_iterator> const_reverse_iterator; 2193e519524SHoward Hinnant 2203e519524SHoward Hinnant class value_compare 2213e519524SHoward Hinnant : public binary_function<value_type,value_type,bool> 2223e519524SHoward Hinnant { 2233e519524SHoward Hinnant friend class multimap; 2243e519524SHoward Hinnant protected: 2253e519524SHoward Hinnant key_compare comp; 2263e519524SHoward Hinnant value_compare(key_compare c); 2273e519524SHoward Hinnant public: 2283e519524SHoward Hinnant bool operator()(const value_type& x, const value_type& y) const; 2293e519524SHoward Hinnant }; 2303e519524SHoward Hinnant 2313e519524SHoward Hinnant // construct/copy/destroy: 2321052ee39SHoward Hinnant multimap() 2331052ee39SHoward Hinnant noexcept( 2341052ee39SHoward Hinnant is_nothrow_default_constructible<allocator_type>::value && 2351052ee39SHoward Hinnant is_nothrow_default_constructible<key_compare>::value && 2361052ee39SHoward Hinnant is_nothrow_copy_constructible<key_compare>::value); 2371052ee39SHoward Hinnant explicit multimap(const key_compare& comp); 2383e519524SHoward Hinnant multimap(const key_compare& comp, const allocator_type& a); 2393e519524SHoward Hinnant template <class InputIterator> 2403e519524SHoward Hinnant multimap(InputIterator first, InputIterator last, const key_compare& comp); 2413e519524SHoward Hinnant template <class InputIterator> 2423e519524SHoward Hinnant multimap(InputIterator first, InputIterator last, const key_compare& comp, 2433e519524SHoward Hinnant const allocator_type& a); 2443e519524SHoward Hinnant multimap(const multimap& m); 2451052ee39SHoward Hinnant multimap(multimap&& m) 2461052ee39SHoward Hinnant noexcept( 2471052ee39SHoward Hinnant is_nothrow_move_constructible<allocator_type>::value && 2481052ee39SHoward Hinnant is_nothrow_move_constructible<key_compare>::value); 2493e519524SHoward Hinnant explicit multimap(const allocator_type& a); 2503e519524SHoward Hinnant multimap(const multimap& m, const allocator_type& a); 2513e519524SHoward Hinnant multimap(multimap&& m, const allocator_type& a); 2523e519524SHoward Hinnant multimap(initializer_list<value_type> il, const key_compare& comp = key_compare()); 2533e519524SHoward Hinnant multimap(initializer_list<value_type> il, const key_compare& comp, 2543e519524SHoward Hinnant const allocator_type& a); 2553e519524SHoward Hinnant ~multimap(); 2563e519524SHoward Hinnant 2573e519524SHoward Hinnant multimap& operator=(const multimap& m); 2581052ee39SHoward Hinnant multimap& operator=(multimap&& m) 2591052ee39SHoward Hinnant noexcept( 2601052ee39SHoward Hinnant allocator_type::propagate_on_container_move_assignment::value && 2611052ee39SHoward Hinnant is_nothrow_move_assignable<allocator_type>::value && 2620e9f71c1SHoward Hinnant is_nothrow_move_assignable<key_compare>::value); 2633e519524SHoward Hinnant multimap& operator=(initializer_list<value_type> il); 2643e519524SHoward Hinnant 2653e519524SHoward Hinnant // iterators: 2660e9f71c1SHoward Hinnant iterator begin() noexcept; 2670e9f71c1SHoward Hinnant const_iterator begin() const noexcept; 2680e9f71c1SHoward Hinnant iterator end() noexcept; 2690e9f71c1SHoward Hinnant const_iterator end() const noexcept; 2703e519524SHoward Hinnant 2710e9f71c1SHoward Hinnant reverse_iterator rbegin() noexcept; 2720e9f71c1SHoward Hinnant const_reverse_iterator rbegin() const noexcept; 2730e9f71c1SHoward Hinnant reverse_iterator rend() noexcept; 2740e9f71c1SHoward Hinnant const_reverse_iterator rend() const noexcept; 2753e519524SHoward Hinnant 2760e9f71c1SHoward Hinnant const_iterator cbegin() const noexcept; 2770e9f71c1SHoward Hinnant const_iterator cend() const noexcept; 2780e9f71c1SHoward Hinnant const_reverse_iterator crbegin() const noexcept; 2790e9f71c1SHoward Hinnant const_reverse_iterator crend() const noexcept; 2803e519524SHoward Hinnant 2813e519524SHoward Hinnant // capacity: 2820e9f71c1SHoward Hinnant bool empty() const noexcept; 2830e9f71c1SHoward Hinnant size_type size() const noexcept; 2840e9f71c1SHoward Hinnant size_type max_size() const noexcept; 2853e519524SHoward Hinnant 2863e519524SHoward Hinnant // modifiers: 2873e519524SHoward Hinnant template <class... Args> 2883e519524SHoward Hinnant iterator emplace(Args&&... args); 2893e519524SHoward Hinnant template <class... Args> 2903e519524SHoward Hinnant iterator emplace_hint(const_iterator position, Args&&... args); 2913e519524SHoward Hinnant iterator insert(const value_type& v); 2923e519524SHoward Hinnant template <class P> 2933e519524SHoward Hinnant iterator insert(P&& p); 2943e519524SHoward Hinnant iterator insert(const_iterator position, const value_type& v); 2953e519524SHoward Hinnant template <class P> 2963e519524SHoward Hinnant iterator insert(const_iterator position, P&& p); 2973e519524SHoward Hinnant template <class InputIterator> 2983e519524SHoward Hinnant void insert(InputIterator first, InputIterator last); 2993e519524SHoward Hinnant void insert(initializer_list<value_type> il); 3003e519524SHoward Hinnant 3013e519524SHoward Hinnant iterator erase(const_iterator position); 3023e519524SHoward Hinnant size_type erase(const key_type& k); 3033e519524SHoward Hinnant iterator erase(const_iterator first, const_iterator last); 3040e9f71c1SHoward Hinnant void clear() noexcept; 3053e519524SHoward Hinnant 3061052ee39SHoward Hinnant void swap(multimap& m) 3071052ee39SHoward Hinnant noexcept( 3081052ee39SHoward Hinnant __is_nothrow_swappable<key_compare>::value && 3091052ee39SHoward Hinnant (!allocator_type::propagate_on_container_swap::value || 3101052ee39SHoward Hinnant __is_nothrow_swappable<allocator_type>::value)); 3113e519524SHoward Hinnant 3123e519524SHoward Hinnant // observers: 3130e9f71c1SHoward Hinnant allocator_type get_allocator() const noexcept; 3143e519524SHoward Hinnant key_compare key_comp() const; 3153e519524SHoward Hinnant value_compare value_comp() const; 3163e519524SHoward Hinnant 3173e519524SHoward Hinnant // map operations: 3183e519524SHoward Hinnant iterator find(const key_type& k); 3193e519524SHoward Hinnant const_iterator find(const key_type& k) const; 3203e519524SHoward Hinnant size_type count(const key_type& k) const; 3213e519524SHoward Hinnant iterator lower_bound(const key_type& k); 3223e519524SHoward Hinnant const_iterator lower_bound(const key_type& k) const; 3233e519524SHoward Hinnant iterator upper_bound(const key_type& k); 3243e519524SHoward Hinnant const_iterator upper_bound(const key_type& k) const; 3253e519524SHoward Hinnant pair<iterator,iterator> equal_range(const key_type& k); 3263e519524SHoward Hinnant pair<const_iterator,const_iterator> equal_range(const key_type& k) const; 3273e519524SHoward Hinnant}; 3283e519524SHoward Hinnant 3293e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator> 3303e519524SHoward Hinnantbool 3313e519524SHoward Hinnantoperator==(const multimap<Key, T, Compare, Allocator>& x, 3323e519524SHoward Hinnant const multimap<Key, T, Compare, Allocator>& y); 3333e519524SHoward Hinnant 3343e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator> 3353e519524SHoward Hinnantbool 3363e519524SHoward Hinnantoperator< (const multimap<Key, T, Compare, Allocator>& x, 3373e519524SHoward Hinnant const multimap<Key, T, Compare, Allocator>& y); 3383e519524SHoward Hinnant 3393e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator> 3403e519524SHoward Hinnantbool 3413e519524SHoward Hinnantoperator!=(const multimap<Key, T, Compare, Allocator>& x, 3423e519524SHoward Hinnant const multimap<Key, T, Compare, Allocator>& y); 3433e519524SHoward Hinnant 3443e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator> 3453e519524SHoward Hinnantbool 3463e519524SHoward Hinnantoperator> (const multimap<Key, T, Compare, Allocator>& x, 3473e519524SHoward Hinnant const multimap<Key, T, Compare, Allocator>& y); 3483e519524SHoward Hinnant 3493e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator> 3503e519524SHoward Hinnantbool 3513e519524SHoward Hinnantoperator>=(const multimap<Key, T, Compare, Allocator>& x, 3523e519524SHoward Hinnant const multimap<Key, T, Compare, Allocator>& y); 3533e519524SHoward Hinnant 3543e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator> 3553e519524SHoward Hinnantbool 3563e519524SHoward Hinnantoperator<=(const multimap<Key, T, Compare, Allocator>& x, 3573e519524SHoward Hinnant const multimap<Key, T, Compare, Allocator>& y); 3583e519524SHoward Hinnant 3593e519524SHoward Hinnant// specialized algorithms: 3603e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator> 3613e519524SHoward Hinnantvoid 3623e519524SHoward Hinnantswap(multimap<Key, T, Compare, Allocator>& x, 3631052ee39SHoward Hinnant multimap<Key, T, Compare, Allocator>& y) 3641052ee39SHoward Hinnant noexcept(noexcept(x.swap(y))); 3653e519524SHoward Hinnant 3663e519524SHoward Hinnant} // std 3673e519524SHoward Hinnant 3683e519524SHoward Hinnant*/ 3693e519524SHoward Hinnant 3703e519524SHoward Hinnant#include <__config> 3713e519524SHoward Hinnant#include <__tree> 3723e519524SHoward Hinnant#include <iterator> 3733e519524SHoward Hinnant#include <memory> 3743e519524SHoward Hinnant#include <utility> 3753e519524SHoward Hinnant#include <functional> 3763e519524SHoward Hinnant#include <initializer_list> 3773e519524SHoward Hinnant 378073458b1SHoward Hinnant#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 3793e519524SHoward Hinnant#pragma GCC system_header 380073458b1SHoward Hinnant#endif 3813e519524SHoward Hinnant 3823e519524SHoward Hinnant_LIBCPP_BEGIN_NAMESPACE_STD 3833e519524SHoward Hinnant 38442b8bb50SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, bool = is_empty<_Compare>::value 38542b8bb50SHoward Hinnant#if __has_feature(is_final) 38642b8bb50SHoward Hinnant && !__is_final(_Compare) 38742b8bb50SHoward Hinnant#endif 38842b8bb50SHoward Hinnant > 3893e519524SHoward Hinnantclass __map_value_compare 3903e519524SHoward Hinnant : private _Compare 3913e519524SHoward Hinnant{ 392c003db1fSHoward Hinnant typedef pair<typename std::remove_const<_Key>::type, _Tp> _Pp; 3933e519524SHoward Hinnant typedef pair<const _Key, _Tp> _CP; 3943e519524SHoward Hinnantpublic: 395848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 3961052ee39SHoward Hinnant __map_value_compare() 3971052ee39SHoward Hinnant _NOEXCEPT_(is_nothrow_default_constructible<_Compare>::value) 3981052ee39SHoward Hinnant : _Compare() {} 399848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 4001052ee39SHoward Hinnant __map_value_compare(_Compare c) 4011052ee39SHoward Hinnant _NOEXCEPT_(is_nothrow_copy_constructible<_Compare>::value) 4021052ee39SHoward Hinnant : _Compare(c) {} 403848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 4041052ee39SHoward Hinnant const _Compare& key_comp() const _NOEXCEPT {return *this;} 405848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 4063e519524SHoward Hinnant bool operator()(const _CP& __x, const _CP& __y) const 4073e519524SHoward Hinnant {return static_cast<const _Compare&>(*this)(__x.first, __y.first);} 408848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 409c003db1fSHoward Hinnant bool operator()(const _CP& __x, const _Pp& __y) const 4103e519524SHoward Hinnant {return static_cast<const _Compare&>(*this)(__x.first, __y.first);} 411848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 4123e519524SHoward Hinnant bool operator()(const _CP& __x, const _Key& __y) const 4133e519524SHoward Hinnant {return static_cast<const _Compare&>(*this)(__x.first, __y);} 414848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 415c003db1fSHoward Hinnant bool operator()(const _Pp& __x, const _CP& __y) const 4163e519524SHoward Hinnant {return static_cast<const _Compare&>(*this)(__x.first, __y.first);} 417848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 418c003db1fSHoward Hinnant bool operator()(const _Pp& __x, const _Pp& __y) const 4193e519524SHoward Hinnant {return static_cast<const _Compare&>(*this)(__x.first, __y.first);} 420848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 421c003db1fSHoward Hinnant bool operator()(const _Pp& __x, const _Key& __y) const 4223e519524SHoward Hinnant {return static_cast<const _Compare&>(*this)(__x.first, __y);} 423848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 4243e519524SHoward Hinnant bool operator()(const _Key& __x, const _CP& __y) const 4253e519524SHoward Hinnant {return static_cast<const _Compare&>(*this)(__x, __y.first);} 426848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 427c003db1fSHoward Hinnant bool operator()(const _Key& __x, const _Pp& __y) const 4283e519524SHoward Hinnant {return static_cast<const _Compare&>(*this)(__x, __y.first);} 429848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 4303e519524SHoward Hinnant bool operator()(const _Key& __x, const _Key& __y) const 4313e519524SHoward Hinnant {return static_cast<const _Compare&>(*this)(__x, __y);} 4323e519524SHoward Hinnant}; 4333e519524SHoward Hinnant 4343e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare> 4353e519524SHoward Hinnantclass __map_value_compare<_Key, _Tp, _Compare, false> 4363e519524SHoward Hinnant{ 4373e519524SHoward Hinnant _Compare comp; 4383e519524SHoward Hinnant 439c003db1fSHoward Hinnant typedef pair<typename std::remove_const<_Key>::type, _Tp> _Pp; 4403e519524SHoward Hinnant typedef pair<const _Key, _Tp> _CP; 4413e519524SHoward Hinnant 4423e519524SHoward Hinnantpublic: 443848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 4441052ee39SHoward Hinnant __map_value_compare() 4451052ee39SHoward Hinnant _NOEXCEPT_(is_nothrow_default_constructible<_Compare>::value) 4461052ee39SHoward Hinnant : comp() {} 447848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 4481052ee39SHoward Hinnant __map_value_compare(_Compare c) 4491052ee39SHoward Hinnant _NOEXCEPT_(is_nothrow_copy_constructible<_Compare>::value) 4501052ee39SHoward Hinnant : comp(c) {} 451848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 4521052ee39SHoward Hinnant const _Compare& key_comp() const _NOEXCEPT {return comp;} 4533e519524SHoward Hinnant 454848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 4553e519524SHoward Hinnant bool operator()(const _CP& __x, const _CP& __y) const 4563e519524SHoward Hinnant {return comp(__x.first, __y.first);} 457848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 458c003db1fSHoward Hinnant bool operator()(const _CP& __x, const _Pp& __y) const 4593e519524SHoward Hinnant {return comp(__x.first, __y.first);} 460848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 4613e519524SHoward Hinnant bool operator()(const _CP& __x, const _Key& __y) const 4623e519524SHoward Hinnant {return comp(__x.first, __y);} 463848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 464c003db1fSHoward Hinnant bool operator()(const _Pp& __x, const _CP& __y) const 4653e519524SHoward Hinnant {return comp(__x.first, __y.first);} 466848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 467c003db1fSHoward Hinnant bool operator()(const _Pp& __x, const _Pp& __y) const 4683e519524SHoward Hinnant {return comp(__x.first, __y.first);} 469848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 470c003db1fSHoward Hinnant bool operator()(const _Pp& __x, const _Key& __y) const 4713e519524SHoward Hinnant {return comp(__x.first, __y);} 472848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 4733e519524SHoward Hinnant bool operator()(const _Key& __x, const _CP& __y) const 4743e519524SHoward Hinnant {return comp(__x, __y.first);} 475848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 476c003db1fSHoward Hinnant bool operator()(const _Key& __x, const _Pp& __y) const 4773e519524SHoward Hinnant {return comp(__x, __y.first);} 478848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 4793e519524SHoward Hinnant bool operator()(const _Key& __x, const _Key& __y) const 4803e519524SHoward Hinnant {return comp(__x, __y);} 4813e519524SHoward Hinnant}; 4823e519524SHoward Hinnant 4833e519524SHoward Hinnanttemplate <class _Allocator> 4843e519524SHoward Hinnantclass __map_node_destructor 4853e519524SHoward Hinnant{ 4863e519524SHoward Hinnant typedef _Allocator allocator_type; 4873e519524SHoward Hinnant typedef allocator_traits<allocator_type> __alloc_traits; 4883e519524SHoward Hinnant typedef typename __alloc_traits::value_type::value_type value_type; 4893e519524SHoward Hinnantpublic: 4903e519524SHoward Hinnant typedef typename __alloc_traits::pointer pointer; 4913e519524SHoward Hinnantprivate: 492*07d3eccdSHoward Hinnant typedef typename value_type::value_type::first_type first_type; 493*07d3eccdSHoward Hinnant typedef typename value_type::value_type::second_type second_type; 4943e519524SHoward Hinnant 4953e519524SHoward Hinnant allocator_type& __na_; 4963e519524SHoward Hinnant 4973e519524SHoward Hinnant __map_node_destructor& operator=(const __map_node_destructor&); 4983e519524SHoward Hinnant 4993e519524SHoward Hinnantpublic: 5003e519524SHoward Hinnant bool __first_constructed; 5013e519524SHoward Hinnant bool __second_constructed; 5023e519524SHoward Hinnant 503848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 5041052ee39SHoward Hinnant explicit __map_node_destructor(allocator_type& __na) _NOEXCEPT 5053e519524SHoward Hinnant : __na_(__na), 5063e519524SHoward Hinnant __first_constructed(false), 5073e519524SHoward Hinnant __second_constructed(false) 5083e519524SHoward Hinnant {} 5093e519524SHoward Hinnant 5107609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 511848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 5121052ee39SHoward Hinnant __map_node_destructor(__tree_node_destructor<allocator_type>&& __x) _NOEXCEPT 5133e519524SHoward Hinnant : __na_(__x.__na_), 5143e519524SHoward Hinnant __first_constructed(__x.__value_constructed), 5153e519524SHoward Hinnant __second_constructed(__x.__value_constructed) 5163e519524SHoward Hinnant { 5173e519524SHoward Hinnant __x.__value_constructed = false; 5183e519524SHoward Hinnant } 519959cf8aeSHoward Hinnant#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 5203e519524SHoward Hinnant 521848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 5221052ee39SHoward Hinnant void operator()(pointer __p) _NOEXCEPT 5233e519524SHoward Hinnant { 5243e519524SHoward Hinnant if (__second_constructed) 525*07d3eccdSHoward Hinnant __alloc_traits::destroy(__na_, _VSTD::addressof(__p->__value_.__cc.second)); 5263e519524SHoward Hinnant if (__first_constructed) 527*07d3eccdSHoward Hinnant __alloc_traits::destroy(__na_, _VSTD::addressof(__p->__value_.__cc.first)); 5283e519524SHoward Hinnant if (__p) 5293e519524SHoward Hinnant __alloc_traits::deallocate(__na_, __p, 1); 5303e519524SHoward Hinnant } 5313e519524SHoward Hinnant}; 5323e519524SHoward Hinnant 533ce53420eSHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 534ce53420eSHoward Hinnant class map; 535ce53420eSHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 536ce53420eSHoward Hinnant class multimap; 537ce53420eSHoward Hinnanttemplate <class _TreeIterator> class __map_const_iterator; 5383e519524SHoward Hinnant 5393e519524SHoward Hinnanttemplate <class _TreeIterator> 5406e41256fSHoward Hinnantclass _LIBCPP_TYPE_VIS __map_iterator 5413e519524SHoward Hinnant{ 5423e519524SHoward Hinnant _TreeIterator __i_; 5433e519524SHoward Hinnant 5443e519524SHoward Hinnant typedef typename _TreeIterator::__pointer_traits __pointer_traits; 545*07d3eccdSHoward Hinnant typedef const typename _TreeIterator::value_type::value_type::first_type __key_type; 546*07d3eccdSHoward Hinnant typedef typename _TreeIterator::value_type::value_type::second_type __mapped_type; 5473e519524SHoward Hinnantpublic: 5483e519524SHoward Hinnant typedef bidirectional_iterator_tag iterator_category; 54973736effSHoward Hinnant typedef pair<__key_type, __mapped_type> value_type; 5503e519524SHoward Hinnant typedef typename _TreeIterator::difference_type difference_type; 5513e519524SHoward Hinnant typedef value_type& reference; 5523e519524SHoward Hinnant typedef typename __pointer_traits::template 5533e519524SHoward Hinnant#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES 5543e519524SHoward Hinnant rebind<value_type> 5553e519524SHoward Hinnant#else 5563e519524SHoward Hinnant rebind<value_type>::other 5573e519524SHoward Hinnant#endif 5583e519524SHoward Hinnant pointer; 5593e519524SHoward Hinnant 560848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 5611052ee39SHoward Hinnant __map_iterator() _NOEXCEPT {} 5623e519524SHoward Hinnant 563848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 5641052ee39SHoward Hinnant __map_iterator(_TreeIterator __i) _NOEXCEPT : __i_(__i) {} 5653e519524SHoward Hinnant 566848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 567*07d3eccdSHoward Hinnant reference operator*() const {return __i_->__cc;} 568848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 569*07d3eccdSHoward Hinnant pointer operator->() const {return pointer_traits<pointer>::pointer_to(__i_->__cc);} 5703e519524SHoward Hinnant 571848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 5723e519524SHoward Hinnant __map_iterator& operator++() {++__i_; return *this;} 573848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 5743e519524SHoward Hinnant __map_iterator operator++(int) 5753e519524SHoward Hinnant { 5763e519524SHoward Hinnant __map_iterator __t(*this); 5773e519524SHoward Hinnant ++(*this); 5783e519524SHoward Hinnant return __t; 5793e519524SHoward Hinnant } 5803e519524SHoward Hinnant 581848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 5823e519524SHoward Hinnant __map_iterator& operator--() {--__i_; return *this;} 583848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 5843e519524SHoward Hinnant __map_iterator operator--(int) 5853e519524SHoward Hinnant { 5863e519524SHoward Hinnant __map_iterator __t(*this); 5873e519524SHoward Hinnant --(*this); 5883e519524SHoward Hinnant return __t; 5893e519524SHoward Hinnant } 5903e519524SHoward Hinnant 591848a5374SHoward Hinnant friend _LIBCPP_INLINE_VISIBILITY 592848a5374SHoward Hinnant bool operator==(const __map_iterator& __x, const __map_iterator& __y) 5933e519524SHoward Hinnant {return __x.__i_ == __y.__i_;} 594848a5374SHoward Hinnant friend 595848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 596848a5374SHoward Hinnant bool operator!=(const __map_iterator& __x, const __map_iterator& __y) 5973e519524SHoward Hinnant {return __x.__i_ != __y.__i_;} 5983e519524SHoward Hinnant 5996e41256fSHoward Hinnant template <class, class, class, class> friend class _LIBCPP_TYPE_VIS map; 6006e41256fSHoward Hinnant template <class, class, class, class> friend class _LIBCPP_TYPE_VIS multimap; 6016e41256fSHoward Hinnant template <class> friend class _LIBCPP_TYPE_VIS __map_const_iterator; 6023e519524SHoward Hinnant}; 6033e519524SHoward Hinnant 6043e519524SHoward Hinnanttemplate <class _TreeIterator> 6056e41256fSHoward Hinnantclass _LIBCPP_TYPE_VIS __map_const_iterator 6063e519524SHoward Hinnant{ 6073e519524SHoward Hinnant _TreeIterator __i_; 6083e519524SHoward Hinnant 6093e519524SHoward Hinnant typedef typename _TreeIterator::__pointer_traits __pointer_traits; 610*07d3eccdSHoward Hinnant typedef const typename _TreeIterator::value_type::value_type::first_type __key_type; 611*07d3eccdSHoward Hinnant typedef typename _TreeIterator::value_type::value_type::second_type __mapped_type; 6123e519524SHoward Hinnantpublic: 6133e519524SHoward Hinnant typedef bidirectional_iterator_tag iterator_category; 61473736effSHoward Hinnant typedef pair<__key_type, __mapped_type> value_type; 6153e519524SHoward Hinnant typedef typename _TreeIterator::difference_type difference_type; 6163e519524SHoward Hinnant typedef const value_type& reference; 6173e519524SHoward Hinnant typedef typename __pointer_traits::template 6183e519524SHoward Hinnant#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES 61940dab2ceSHoward Hinnant rebind<const value_type> 6203e519524SHoward Hinnant#else 62140dab2ceSHoward Hinnant rebind<const value_type>::other 6223e519524SHoward Hinnant#endif 6233e519524SHoward Hinnant pointer; 6243e519524SHoward Hinnant 625848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 6261052ee39SHoward Hinnant __map_const_iterator() _NOEXCEPT {} 6273e519524SHoward Hinnant 628848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 6291052ee39SHoward Hinnant __map_const_iterator(_TreeIterator __i) _NOEXCEPT : __i_(__i) {} 630848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 6313e519524SHoward Hinnant __map_const_iterator( 6323e519524SHoward Hinnant __map_iterator<typename _TreeIterator::__non_const_iterator> __i) 6331052ee39SHoward Hinnant _NOEXCEPT 6343e519524SHoward Hinnant : __i_(__i.__i_) {} 6353e519524SHoward Hinnant 636848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 637*07d3eccdSHoward Hinnant reference operator*() const {return __i_->__cc;} 638848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 639*07d3eccdSHoward Hinnant pointer operator->() const {return pointer_traits<pointer>::pointer_to(__i_->__cc);} 6403e519524SHoward Hinnant 641848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 6423e519524SHoward Hinnant __map_const_iterator& operator++() {++__i_; return *this;} 643848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 6443e519524SHoward Hinnant __map_const_iterator operator++(int) 6453e519524SHoward Hinnant { 6463e519524SHoward Hinnant __map_const_iterator __t(*this); 6473e519524SHoward Hinnant ++(*this); 6483e519524SHoward Hinnant return __t; 6493e519524SHoward Hinnant } 6503e519524SHoward Hinnant 651848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 6523e519524SHoward Hinnant __map_const_iterator& operator--() {--__i_; return *this;} 653848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 6543e519524SHoward Hinnant __map_const_iterator operator--(int) 6553e519524SHoward Hinnant { 6563e519524SHoward Hinnant __map_const_iterator __t(*this); 6573e519524SHoward Hinnant --(*this); 6583e519524SHoward Hinnant return __t; 6593e519524SHoward Hinnant } 6603e519524SHoward Hinnant 661848a5374SHoward Hinnant friend _LIBCPP_INLINE_VISIBILITY 662848a5374SHoward Hinnant bool operator==(const __map_const_iterator& __x, const __map_const_iterator& __y) 6633e519524SHoward Hinnant {return __x.__i_ == __y.__i_;} 664848a5374SHoward Hinnant friend _LIBCPP_INLINE_VISIBILITY 665848a5374SHoward Hinnant bool operator!=(const __map_const_iterator& __x, const __map_const_iterator& __y) 6663e519524SHoward Hinnant {return __x.__i_ != __y.__i_;} 6673e519524SHoward Hinnant 6686e41256fSHoward Hinnant template <class, class, class, class> friend class _LIBCPP_TYPE_VIS map; 6696e41256fSHoward Hinnant template <class, class, class, class> friend class _LIBCPP_TYPE_VIS multimap; 6706e41256fSHoward Hinnant template <class, class, class> friend class _LIBCPP_TYPE_VIS __tree_const_iterator; 6713e519524SHoward Hinnant}; 6723e519524SHoward Hinnant 6733e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare = less<_Key>, 6743e519524SHoward Hinnant class _Allocator = allocator<pair<const _Key, _Tp> > > 6756e41256fSHoward Hinnantclass _LIBCPP_TYPE_VIS map 6763e519524SHoward Hinnant{ 6773e519524SHoward Hinnantpublic: 6783e519524SHoward Hinnant // types: 6793e519524SHoward Hinnant typedef _Key key_type; 6803e519524SHoward Hinnant typedef _Tp mapped_type; 6813e519524SHoward Hinnant typedef pair<const key_type, mapped_type> value_type; 682*07d3eccdSHoward Hinnant typedef pair<key_type, mapped_type> __nc_value_type; 6833e519524SHoward Hinnant typedef _Compare key_compare; 6843e519524SHoward Hinnant typedef _Allocator allocator_type; 6853e519524SHoward Hinnant typedef value_type& reference; 6863e519524SHoward Hinnant typedef const value_type& const_reference; 6873e519524SHoward Hinnant 6886e41256fSHoward Hinnant class _LIBCPP_TYPE_VIS value_compare 6893e519524SHoward Hinnant : public binary_function<value_type, value_type, bool> 6903e519524SHoward Hinnant { 6913e519524SHoward Hinnant friend class map; 6923e519524SHoward Hinnant protected: 6933e519524SHoward Hinnant key_compare comp; 6943e519524SHoward Hinnant 695848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY value_compare(key_compare c) : comp(c) {} 6963e519524SHoward Hinnant public: 697848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 6983e519524SHoward Hinnant bool operator()(const value_type& __x, const value_type& __y) const 6993e519524SHoward Hinnant {return comp(__x.first, __y.first);} 7003e519524SHoward Hinnant }; 7013e519524SHoward Hinnant 7023e519524SHoward Hinnantprivate: 703*07d3eccdSHoward Hinnant 704*07d3eccdSHoward Hinnant#if __cplusplus >= 201103L 705*07d3eccdSHoward Hinnant union __value_type 706*07d3eccdSHoward Hinnant { 707*07d3eccdSHoward Hinnant typedef typename map::value_type value_type; 708*07d3eccdSHoward Hinnant typedef typename map::__nc_value_type __nc_value_type; 709*07d3eccdSHoward Hinnant value_type __cc; 710*07d3eccdSHoward Hinnant __nc_value_type __nc; 711*07d3eccdSHoward Hinnant 712*07d3eccdSHoward Hinnant template <class ..._Args> 713*07d3eccdSHoward Hinnant __value_type(_Args&& ...__args) 714*07d3eccdSHoward Hinnant : __cc(std::forward<_Args>(__args)...) {} 715*07d3eccdSHoward Hinnant 716*07d3eccdSHoward Hinnant __value_type(const __value_type& __v) 717*07d3eccdSHoward Hinnant : __cc(std::move(__v.__cc)) {} 718*07d3eccdSHoward Hinnant 719*07d3eccdSHoward Hinnant __value_type(__value_type&& __v) 720*07d3eccdSHoward Hinnant : __nc(std::move(__v.__nc)) {} 721*07d3eccdSHoward Hinnant 722*07d3eccdSHoward Hinnant __value_type& operator=(const __value_type& __v) 723*07d3eccdSHoward Hinnant {__nc = __v.__cc; return *this;} 724*07d3eccdSHoward Hinnant 725*07d3eccdSHoward Hinnant __value_type& operator=(__value_type&& __v) 726*07d3eccdSHoward Hinnant {__nc = std::move(__v.__nc); return *this;} 727*07d3eccdSHoward Hinnant 728*07d3eccdSHoward Hinnant ~__value_type() {__cc.~value_type();} 729*07d3eccdSHoward Hinnant 730*07d3eccdSHoward Hinnant operator const value_type& () const {return __cc;} 731*07d3eccdSHoward Hinnant }; 732*07d3eccdSHoward Hinnant#else 733*07d3eccdSHoward Hinnant struct __value_type 734*07d3eccdSHoward Hinnant { 735*07d3eccdSHoward Hinnant typedef typename map::value_type value_type; 736*07d3eccdSHoward Hinnant value_type __cc; 737*07d3eccdSHoward Hinnant 738*07d3eccdSHoward Hinnant __value_type() {} 739*07d3eccdSHoward Hinnant 740*07d3eccdSHoward Hinnant template <class _A0> 741*07d3eccdSHoward Hinnant __value_type(const _A0& __a0) 742*07d3eccdSHoward Hinnant : __cc(__a0) {} 743*07d3eccdSHoward Hinnant 744*07d3eccdSHoward Hinnant template <class _A0, class _A1> 745*07d3eccdSHoward Hinnant __value_type(const _A0& __a0, const _A1& __a1) 746*07d3eccdSHoward Hinnant : __cc(__a0, __a1) {} 747*07d3eccdSHoward Hinnant 748*07d3eccdSHoward Hinnant operator const value_type& () const {return __cc;} 749*07d3eccdSHoward Hinnant }; 750*07d3eccdSHoward Hinnant#endif 7513e519524SHoward Hinnant typedef __map_value_compare<key_type, mapped_type, key_compare> __vc; 7523e519524SHoward Hinnant typedef typename allocator_traits<allocator_type>::template 7533e519524SHoward Hinnant#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES 7543e519524SHoward Hinnant rebind_alloc<__value_type> 7553e519524SHoward Hinnant#else 7563e519524SHoward Hinnant rebind_alloc<__value_type>::other 7573e519524SHoward Hinnant#endif 7583e519524SHoward Hinnant __allocator_type; 7593e519524SHoward Hinnant typedef __tree<__value_type, __vc, __allocator_type> __base; 7603e519524SHoward Hinnant typedef typename __base::__node_traits __node_traits; 7613e519524SHoward Hinnant typedef allocator_traits<allocator_type> __alloc_traits; 7623e519524SHoward Hinnant 7633e519524SHoward Hinnant __base __tree_; 7643e519524SHoward Hinnant 7653e519524SHoward Hinnantpublic: 7663e519524SHoward Hinnant typedef typename __alloc_traits::pointer pointer; 7673e519524SHoward Hinnant typedef typename __alloc_traits::const_pointer const_pointer; 7683e519524SHoward Hinnant typedef typename __alloc_traits::size_type size_type; 7693e519524SHoward Hinnant typedef typename __alloc_traits::difference_type difference_type; 7703e519524SHoward Hinnant typedef __map_iterator<typename __base::iterator> iterator; 7713e519524SHoward Hinnant typedef __map_const_iterator<typename __base::const_iterator> const_iterator; 772ce48a113SHoward Hinnant typedef _VSTD::reverse_iterator<iterator> reverse_iterator; 773ce48a113SHoward Hinnant typedef _VSTD::reverse_iterator<const_iterator> const_reverse_iterator; 7743e519524SHoward Hinnant 775848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 7763e519524SHoward Hinnant explicit map(const key_compare& __comp = key_compare()) 7771052ee39SHoward Hinnant _NOEXCEPT_( 7781052ee39SHoward Hinnant is_nothrow_default_constructible<allocator_type>::value && 7791052ee39SHoward Hinnant is_nothrow_default_constructible<key_compare>::value && 7801052ee39SHoward Hinnant is_nothrow_copy_constructible<key_compare>::value) 7813e519524SHoward Hinnant : __tree_(__vc(__comp)) {} 7823e519524SHoward Hinnant 783848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 7843e519524SHoward Hinnant explicit map(const key_compare& __comp, const allocator_type& __a) 7853e519524SHoward Hinnant : __tree_(__vc(__comp), __a) {} 7863e519524SHoward Hinnant 7873e519524SHoward Hinnant template <class _InputIterator> 788848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 7893e519524SHoward Hinnant map(_InputIterator __f, _InputIterator __l, 7903e519524SHoward Hinnant const key_compare& __comp = key_compare()) 7913e519524SHoward Hinnant : __tree_(__vc(__comp)) 7923e519524SHoward Hinnant { 7933e519524SHoward Hinnant insert(__f, __l); 7943e519524SHoward Hinnant } 7953e519524SHoward Hinnant 7963e519524SHoward Hinnant template <class _InputIterator> 797848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 7983e519524SHoward Hinnant map(_InputIterator __f, _InputIterator __l, 7993e519524SHoward Hinnant const key_compare& __comp, const allocator_type& __a) 8003e519524SHoward Hinnant : __tree_(__vc(__comp), __a) 8013e519524SHoward Hinnant { 8023e519524SHoward Hinnant insert(__f, __l); 8033e519524SHoward Hinnant } 8043e519524SHoward Hinnant 805848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 8063e519524SHoward Hinnant map(const map& __m) 8073e519524SHoward Hinnant : __tree_(__m.__tree_) 8083e519524SHoward Hinnant { 8093e519524SHoward Hinnant insert(__m.begin(), __m.end()); 8103e519524SHoward Hinnant } 8113e519524SHoward Hinnant 8125a33687dSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 8135a33687dSHoward Hinnant map& operator=(const map& __m) 8145a33687dSHoward Hinnant { 815*07d3eccdSHoward Hinnant#if __cplusplus >= 201103L 8165a33687dSHoward Hinnant __tree_ = __m.__tree_; 817*07d3eccdSHoward Hinnant#else 818*07d3eccdSHoward Hinnant __tree_.clear(); 819*07d3eccdSHoward Hinnant __tree_.value_comp() = __m.__tree_.value_comp(); 820*07d3eccdSHoward Hinnant __tree_.__copy_assign_alloc(__m.__tree_); 821*07d3eccdSHoward Hinnant insert(__m.begin(), __m.end()); 822*07d3eccdSHoward Hinnant#endif 8235a33687dSHoward Hinnant return *this; 8245a33687dSHoward Hinnant } 8255a33687dSHoward Hinnant 8267609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 8273e519524SHoward Hinnant 828848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 8293e519524SHoward Hinnant map(map&& __m) 8301052ee39SHoward Hinnant _NOEXCEPT_(is_nothrow_move_constructible<__base>::value) 831ce48a113SHoward Hinnant : __tree_(_VSTD::move(__m.__tree_)) 8323e519524SHoward Hinnant { 8333e519524SHoward Hinnant } 8343e519524SHoward Hinnant 8353e519524SHoward Hinnant map(map&& __m, const allocator_type& __a); 8363e519524SHoward Hinnant 837848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 83854976f26SHoward Hinnant map& operator=(map&& __m) 83954976f26SHoward Hinnant _NOEXCEPT_(is_nothrow_move_assignable<__base>::value) 84054976f26SHoward Hinnant { 84154976f26SHoward Hinnant __tree_ = _VSTD::move(__m.__tree_); 84254976f26SHoward Hinnant return *this; 84354976f26SHoward Hinnant } 84454976f26SHoward Hinnant 84554976f26SHoward Hinnant#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 84654976f26SHoward Hinnant 84754976f26SHoward Hinnant#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS 84854976f26SHoward Hinnant 84954976f26SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 8503e519524SHoward Hinnant map(initializer_list<value_type> __il, const key_compare& __comp = key_compare()) 8513e519524SHoward Hinnant : __tree_(__vc(__comp)) 8523e519524SHoward Hinnant { 8533e519524SHoward Hinnant insert(__il.begin(), __il.end()); 8543e519524SHoward Hinnant } 8553e519524SHoward Hinnant 856848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 8573e519524SHoward Hinnant map(initializer_list<value_type> __il, const key_compare& __comp, const allocator_type& __a) 8583e519524SHoward Hinnant : __tree_(__vc(__comp), __a) 8593e519524SHoward Hinnant { 8603e519524SHoward Hinnant insert(__il.begin(), __il.end()); 8613e519524SHoward Hinnant } 8623e519524SHoward Hinnant 863848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 8643e519524SHoward Hinnant map& operator=(initializer_list<value_type> __il) 8653e519524SHoward Hinnant { 8663e519524SHoward Hinnant __tree_.__assign_unique(__il.begin(), __il.end()); 8673e519524SHoward Hinnant return *this; 8683e519524SHoward Hinnant } 8693e519524SHoward Hinnant 87054976f26SHoward Hinnant#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS 8713e519524SHoward Hinnant 872848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 8733e519524SHoward Hinnant explicit map(const allocator_type& __a) 8743e519524SHoward Hinnant : __tree_(__a) 8753e519524SHoward Hinnant { 8763e519524SHoward Hinnant } 8773e519524SHoward Hinnant 878848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 8793e519524SHoward Hinnant map(const map& __m, const allocator_type& __a) 8803e519524SHoward Hinnant : __tree_(__m.__tree_.value_comp(), __a) 8813e519524SHoward Hinnant { 8823e519524SHoward Hinnant insert(__m.begin(), __m.end()); 8833e519524SHoward Hinnant } 8843e519524SHoward Hinnant 885848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 8861052ee39SHoward Hinnant iterator begin() _NOEXCEPT {return __tree_.begin();} 887848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 8881052ee39SHoward Hinnant const_iterator begin() const _NOEXCEPT {return __tree_.begin();} 889848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 8901052ee39SHoward Hinnant iterator end() _NOEXCEPT {return __tree_.end();} 891848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 8921052ee39SHoward Hinnant const_iterator end() const _NOEXCEPT {return __tree_.end();} 8933e519524SHoward Hinnant 894848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 8951052ee39SHoward Hinnant reverse_iterator rbegin() _NOEXCEPT {return reverse_iterator(end());} 896848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 8971052ee39SHoward Hinnant const_reverse_iterator rbegin() const _NOEXCEPT 8981052ee39SHoward Hinnant {return const_reverse_iterator(end());} 899848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 9001052ee39SHoward Hinnant reverse_iterator rend() _NOEXCEPT 9011052ee39SHoward Hinnant {return reverse_iterator(begin());} 902848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 9031052ee39SHoward Hinnant const_reverse_iterator rend() const _NOEXCEPT 9041052ee39SHoward Hinnant {return const_reverse_iterator(begin());} 9053e519524SHoward Hinnant 906848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 9071052ee39SHoward Hinnant const_iterator cbegin() const _NOEXCEPT {return begin();} 908848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 9091052ee39SHoward Hinnant const_iterator cend() const _NOEXCEPT {return end();} 910848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 9111052ee39SHoward Hinnant const_reverse_iterator crbegin() const _NOEXCEPT {return rbegin();} 912848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 9131052ee39SHoward Hinnant const_reverse_iterator crend() const _NOEXCEPT {return rend();} 9143e519524SHoward Hinnant 915848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 9161052ee39SHoward Hinnant bool empty() const _NOEXCEPT {return __tree_.size() == 0;} 917848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 9181052ee39SHoward Hinnant size_type size() const _NOEXCEPT {return __tree_.size();} 919848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 9201052ee39SHoward Hinnant size_type max_size() const _NOEXCEPT {return __tree_.max_size();} 9213e519524SHoward Hinnant 9223e519524SHoward Hinnant mapped_type& operator[](const key_type& __k); 9237609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 9243e519524SHoward Hinnant mapped_type& operator[](key_type&& __k); 9253e519524SHoward Hinnant#endif 9263e519524SHoward Hinnant 9273e519524SHoward Hinnant mapped_type& at(const key_type& __k); 9283e519524SHoward Hinnant const mapped_type& at(const key_type& __k) const; 9293e519524SHoward Hinnant 930848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 9311052ee39SHoward Hinnant allocator_type get_allocator() const _NOEXCEPT {return __tree_.__alloc();} 932848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 9333e519524SHoward Hinnant key_compare key_comp() const {return __tree_.value_comp().key_comp();} 934848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 9353e519524SHoward Hinnant value_compare value_comp() const {return value_compare(__tree_.value_comp().key_comp());} 9363e519524SHoward Hinnant 9377609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 9387609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_VARIADICS 9397609c9b6SHoward Hinnant 9408b805c91SHoward Hinnant template <class ..._Args> 9413e519524SHoward Hinnant pair<iterator, bool> 9428b805c91SHoward Hinnant emplace(_Args&& ...__args); 9433e519524SHoward Hinnant 9448b805c91SHoward Hinnant template <class ..._Args> 9453e519524SHoward Hinnant iterator 9468b805c91SHoward Hinnant emplace_hint(const_iterator __p, _Args&& ...__args); 9473e519524SHoward Hinnant 9487609c9b6SHoward Hinnant#endif // _LIBCPP_HAS_NO_VARIADICS 9497609c9b6SHoward Hinnant 950c003db1fSHoward Hinnant template <class _Pp, 951c003db1fSHoward Hinnant class = typename enable_if<is_constructible<value_type, _Pp>::value>::type> 952848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 953c003db1fSHoward Hinnant pair<iterator, bool> insert(_Pp&& __p) 954c003db1fSHoward Hinnant {return __tree_.__insert_unique(_VSTD::forward<_Pp>(__p));} 9553e519524SHoward Hinnant 956c003db1fSHoward Hinnant template <class _Pp, 957c003db1fSHoward Hinnant class = typename enable_if<is_constructible<value_type, _Pp>::value>::type> 958848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 959c003db1fSHoward Hinnant iterator insert(const_iterator __pos, _Pp&& __p) 960c003db1fSHoward Hinnant {return __tree_.__insert_unique(__pos.__i_, _VSTD::forward<_Pp>(__p));} 9613e519524SHoward Hinnant 9627609c9b6SHoward Hinnant#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 9633e519524SHoward Hinnant 964848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 9653e519524SHoward Hinnant pair<iterator, bool> 9663e519524SHoward Hinnant insert(const value_type& __v) {return __tree_.__insert_unique(__v);} 9673e519524SHoward Hinnant 968848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 9693e519524SHoward Hinnant iterator 9703e519524SHoward Hinnant insert(const_iterator __p, const value_type& __v) 9713e519524SHoward Hinnant {return __tree_.__insert_unique(__p.__i_, __v);} 9723e519524SHoward Hinnant 9733e519524SHoward Hinnant template <class _InputIterator> 974848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 9753e519524SHoward Hinnant void insert(_InputIterator __f, _InputIterator __l) 9763e519524SHoward Hinnant { 9773e519524SHoward Hinnant for (const_iterator __e = cend(); __f != __l; ++__f) 9783e519524SHoward Hinnant insert(__e.__i_, *__f); 9793e519524SHoward Hinnant } 9803e519524SHoward Hinnant 98154976f26SHoward Hinnant#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS 98254976f26SHoward Hinnant 983848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 9843e519524SHoward Hinnant void insert(initializer_list<value_type> __il) 9853e519524SHoward Hinnant {insert(__il.begin(), __il.end());} 9863e519524SHoward Hinnant 98754976f26SHoward Hinnant#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS 98854976f26SHoward Hinnant 989848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 9903e519524SHoward Hinnant iterator erase(const_iterator __p) {return __tree_.erase(__p.__i_);} 991848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 9923e519524SHoward Hinnant size_type erase(const key_type& __k) 9933e519524SHoward Hinnant {return __tree_.__erase_unique(__k);} 994848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 9953e519524SHoward Hinnant iterator erase(const_iterator __f, const_iterator __l) 9963e519524SHoward Hinnant {return __tree_.erase(__f.__i_, __l.__i_);} 997848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 9981052ee39SHoward Hinnant void clear() _NOEXCEPT {__tree_.clear();} 9993e519524SHoward Hinnant 1000848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 10011052ee39SHoward Hinnant void swap(map& __m) 10021052ee39SHoward Hinnant _NOEXCEPT_(__is_nothrow_swappable<__base>::value) 10031052ee39SHoward Hinnant {__tree_.swap(__m.__tree_);} 10043e519524SHoward Hinnant 1005848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 10063e519524SHoward Hinnant iterator find(const key_type& __k) {return __tree_.find(__k);} 1007848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 10083e519524SHoward Hinnant const_iterator find(const key_type& __k) const {return __tree_.find(__k);} 1009848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 10103e519524SHoward Hinnant size_type count(const key_type& __k) const 10113e519524SHoward Hinnant {return __tree_.__count_unique(__k);} 1012848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 10133e519524SHoward Hinnant iterator lower_bound(const key_type& __k) 10143e519524SHoward Hinnant {return __tree_.lower_bound(__k);} 1015848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 10163e519524SHoward Hinnant const_iterator lower_bound(const key_type& __k) const 10173e519524SHoward Hinnant {return __tree_.lower_bound(__k);} 1018848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 10193e519524SHoward Hinnant iterator upper_bound(const key_type& __k) 10203e519524SHoward Hinnant {return __tree_.upper_bound(__k);} 1021848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 10223e519524SHoward Hinnant const_iterator upper_bound(const key_type& __k) const 10233e519524SHoward Hinnant {return __tree_.upper_bound(__k);} 1024848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 10253e519524SHoward Hinnant pair<iterator,iterator> equal_range(const key_type& __k) 10263e519524SHoward Hinnant {return __tree_.__equal_range_unique(__k);} 1027848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 10283e519524SHoward Hinnant pair<const_iterator,const_iterator> equal_range(const key_type& __k) const 10293e519524SHoward Hinnant {return __tree_.__equal_range_unique(__k);} 10303e519524SHoward Hinnant 10313e519524SHoward Hinnantprivate: 10323e519524SHoward Hinnant typedef typename __base::__node __node; 10333e519524SHoward Hinnant typedef typename __base::__node_allocator __node_allocator; 10343e519524SHoward Hinnant typedef typename __base::__node_pointer __node_pointer; 10353e519524SHoward Hinnant typedef typename __base::__node_const_pointer __node_const_pointer; 10363e519524SHoward Hinnant typedef typename __base::__node_base_pointer __node_base_pointer; 10373e519524SHoward Hinnant typedef typename __base::__node_base_const_pointer __node_base_const_pointer; 1038c003db1fSHoward Hinnant typedef __map_node_destructor<__node_allocator> _Dp; 1039c003db1fSHoward Hinnant typedef unique_ptr<__node, _Dp> __node_holder; 10403e519524SHoward Hinnant 10417609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 10423e519524SHoward Hinnant __node_holder __construct_node(); 10438b805c91SHoward Hinnant template <class _A0> 10448b805c91SHoward Hinnant typename enable_if 10458b805c91SHoward Hinnant < 10468b805c91SHoward Hinnant is_constructible<value_type, _A0>::value, 10478b805c91SHoward Hinnant __node_holder 10488b805c91SHoward Hinnant >::type 10498b805c91SHoward Hinnant __construct_node(_A0&& __a0); 10508b805c91SHoward Hinnant template <class _A0> 10518b805c91SHoward Hinnant typename enable_if 10528b805c91SHoward Hinnant < 10538b805c91SHoward Hinnant is_constructible<key_type, _A0>::value, 10548b805c91SHoward Hinnant __node_holder 10558b805c91SHoward Hinnant >::type 10568b805c91SHoward Hinnant __construct_node(_A0&& __a0); 10577609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_VARIADICS 10588b805c91SHoward Hinnant template <class _A0, class _A1, class ..._Args> 10598b805c91SHoward Hinnant __node_holder __construct_node(_A0&& __a0, _A1&& __a1, _Args&& ...__args); 10607609c9b6SHoward Hinnant#endif // _LIBCPP_HAS_NO_VARIADICS 10617609c9b6SHoward Hinnant#else // _LIBCPP_HAS_NO_RVALUE_REFERENCES 10623e519524SHoward Hinnant __node_holder __construct_node(const key_type& __k); 10633e519524SHoward Hinnant#endif 10643e519524SHoward Hinnant 10653e519524SHoward Hinnant __node_base_pointer& 10663e519524SHoward Hinnant __find_equal_key(__node_base_pointer& __parent, const key_type& __k); 10673e519524SHoward Hinnant __node_base_const_pointer 10683e519524SHoward Hinnant __find_equal_key(__node_base_const_pointer& __parent, const key_type& __k) const; 10693e519524SHoward Hinnant}; 10703e519524SHoward Hinnant 10713e519524SHoward Hinnant// Find place to insert if __k doesn't exist 10723e519524SHoward Hinnant// Set __parent to parent of null leaf 10733e519524SHoward Hinnant// Return reference to null leaf 10743e519524SHoward Hinnant// If __k exists, set parent to node of __k and return reference to node of __k 10753e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 10763e519524SHoward Hinnanttypename map<_Key, _Tp, _Compare, _Allocator>::__node_base_pointer& 10773e519524SHoward Hinnantmap<_Key, _Tp, _Compare, _Allocator>::__find_equal_key(__node_base_pointer& __parent, 10783e519524SHoward Hinnant const key_type& __k) 10793e519524SHoward Hinnant{ 10803e519524SHoward Hinnant __node_pointer __nd = __tree_.__root(); 10813e519524SHoward Hinnant if (__nd != nullptr) 10823e519524SHoward Hinnant { 10833e519524SHoward Hinnant while (true) 10843e519524SHoward Hinnant { 1085*07d3eccdSHoward Hinnant if (__tree_.value_comp().key_comp()(__k, __nd->__value_.__cc.first)) 10863e519524SHoward Hinnant { 10873e519524SHoward Hinnant if (__nd->__left_ != nullptr) 10883e519524SHoward Hinnant __nd = static_cast<__node_pointer>(__nd->__left_); 10893e519524SHoward Hinnant else 10903e519524SHoward Hinnant { 1091*07d3eccdSHoward Hinnant __parent = static_cast<__node_base_pointer>(__nd); 10923e519524SHoward Hinnant return __parent->__left_; 10933e519524SHoward Hinnant } 10943e519524SHoward Hinnant } 1095*07d3eccdSHoward Hinnant else if (__tree_.value_comp().key_comp()(__nd->__value_.__cc.first, __k)) 10963e519524SHoward Hinnant { 10973e519524SHoward Hinnant if (__nd->__right_ != nullptr) 10983e519524SHoward Hinnant __nd = static_cast<__node_pointer>(__nd->__right_); 10993e519524SHoward Hinnant else 11003e519524SHoward Hinnant { 1101*07d3eccdSHoward Hinnant __parent = static_cast<__node_base_pointer>(__nd); 11023e519524SHoward Hinnant return __parent->__right_; 11033e519524SHoward Hinnant } 11043e519524SHoward Hinnant } 11053e519524SHoward Hinnant else 11063e519524SHoward Hinnant { 1107*07d3eccdSHoward Hinnant __parent = static_cast<__node_base_pointer>(__nd); 11083e519524SHoward Hinnant return __parent; 11093e519524SHoward Hinnant } 11103e519524SHoward Hinnant } 11113e519524SHoward Hinnant } 1112*07d3eccdSHoward Hinnant __parent = static_cast<__node_base_pointer>(__tree_.__end_node()); 11133e519524SHoward Hinnant return __parent->__left_; 11143e519524SHoward Hinnant} 11153e519524SHoward Hinnant 11163e519524SHoward Hinnant// Find __k 11173e519524SHoward Hinnant// Set __parent to parent of null leaf and 11183e519524SHoward Hinnant// return reference to null leaf iv __k does not exist. 11193e519524SHoward Hinnant// If __k exists, set parent to node of __k and return reference to node of __k 11203e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 11213e519524SHoward Hinnanttypename map<_Key, _Tp, _Compare, _Allocator>::__node_base_const_pointer 11223e519524SHoward Hinnantmap<_Key, _Tp, _Compare, _Allocator>::__find_equal_key(__node_base_const_pointer& __parent, 11233e519524SHoward Hinnant const key_type& __k) const 11243e519524SHoward Hinnant{ 11253e519524SHoward Hinnant __node_const_pointer __nd = __tree_.__root(); 11263e519524SHoward Hinnant if (__nd != nullptr) 11273e519524SHoward Hinnant { 11283e519524SHoward Hinnant while (true) 11293e519524SHoward Hinnant { 1130*07d3eccdSHoward Hinnant if (__tree_.value_comp().key_comp()(__k, __nd->__value_.__cc.first)) 11313e519524SHoward Hinnant { 11323e519524SHoward Hinnant if (__nd->__left_ != nullptr) 11333e519524SHoward Hinnant __nd = static_cast<__node_pointer>(__nd->__left_); 11343e519524SHoward Hinnant else 11353e519524SHoward Hinnant { 1136*07d3eccdSHoward Hinnant __parent = static_cast<__node_base_pointer>(__nd); 11373e519524SHoward Hinnant return const_cast<const __node_base_const_pointer&>(__parent->__left_); 11383e519524SHoward Hinnant } 11393e519524SHoward Hinnant } 1140*07d3eccdSHoward Hinnant else if (__tree_.value_comp().key_comp()(__nd->__value_.__cc.first, __k)) 11413e519524SHoward Hinnant { 11423e519524SHoward Hinnant if (__nd->__right_ != nullptr) 11433e519524SHoward Hinnant __nd = static_cast<__node_pointer>(__nd->__right_); 11443e519524SHoward Hinnant else 11453e519524SHoward Hinnant { 1146*07d3eccdSHoward Hinnant __parent = static_cast<__node_base_pointer>(__nd); 11473e519524SHoward Hinnant return const_cast<const __node_base_const_pointer&>(__parent->__right_); 11483e519524SHoward Hinnant } 11493e519524SHoward Hinnant } 11503e519524SHoward Hinnant else 11513e519524SHoward Hinnant { 1152*07d3eccdSHoward Hinnant __parent = static_cast<__node_base_pointer>(__nd); 11533e519524SHoward Hinnant return __parent; 11543e519524SHoward Hinnant } 11553e519524SHoward Hinnant } 11563e519524SHoward Hinnant } 1157*07d3eccdSHoward Hinnant __parent = static_cast<__node_base_pointer>(__tree_.__end_node()); 11583e519524SHoward Hinnant return const_cast<const __node_base_const_pointer&>(__parent->__left_); 11593e519524SHoward Hinnant} 11603e519524SHoward Hinnant 11617609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 11623e519524SHoward Hinnant 11633e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 11643e519524SHoward Hinnantmap<_Key, _Tp, _Compare, _Allocator>::map(map&& __m, const allocator_type& __a) 1165ce48a113SHoward Hinnant : __tree_(_VSTD::move(__m.__tree_), __a) 11663e519524SHoward Hinnant{ 11673e519524SHoward Hinnant if (__a != __m.get_allocator()) 11683e519524SHoward Hinnant { 11693e519524SHoward Hinnant const_iterator __e = cend(); 11703e519524SHoward Hinnant while (!__m.empty()) 11713e519524SHoward Hinnant __tree_.__insert_unique(__e.__i_, 1172ce48a113SHoward Hinnant _VSTD::move(__m.__tree_.remove(__m.begin().__i_)->__value_)); 11733e519524SHoward Hinnant } 11743e519524SHoward Hinnant} 11753e519524SHoward Hinnant 11763e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 11773e519524SHoward Hinnanttypename map<_Key, _Tp, _Compare, _Allocator>::__node_holder 11783e519524SHoward Hinnantmap<_Key, _Tp, _Compare, _Allocator>::__construct_node() 11793e519524SHoward Hinnant{ 11803e519524SHoward Hinnant __node_allocator& __na = __tree_.__node_alloc(); 1181c003db1fSHoward Hinnant __node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na)); 1182*07d3eccdSHoward Hinnant __node_traits::construct(__na, _VSTD::addressof(__h->__value_.__cc.first)); 11833e519524SHoward Hinnant __h.get_deleter().__first_constructed = true; 1184*07d3eccdSHoward Hinnant __node_traits::construct(__na, _VSTD::addressof(__h->__value_.__cc.second)); 11853e519524SHoward Hinnant __h.get_deleter().__second_constructed = true; 11863e519524SHoward Hinnant return __h; 11873e519524SHoward Hinnant} 11883e519524SHoward Hinnant 11893e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 11908b805c91SHoward Hinnanttemplate <class _A0> 11918b805c91SHoward Hinnanttypename enable_if 11928b805c91SHoward Hinnant< 11938b805c91SHoward Hinnant is_constructible<pair<const _Key, _Tp>, _A0>::value, 11943e519524SHoward Hinnant typename map<_Key, _Tp, _Compare, _Allocator>::__node_holder 11958b805c91SHoward Hinnant>::type 11963e519524SHoward Hinnantmap<_Key, _Tp, _Compare, _Allocator>::__construct_node(_A0&& __a0) 11973e519524SHoward Hinnant{ 11983e519524SHoward Hinnant __node_allocator& __na = __tree_.__node_alloc(); 1199c003db1fSHoward Hinnant __node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na)); 1200ce48a113SHoward Hinnant __node_traits::construct(__na, _VSTD::addressof(__h->__value_), _VSTD::forward<_A0>(__a0)); 12013e519524SHoward Hinnant __h.get_deleter().__first_constructed = true; 12023e519524SHoward Hinnant __h.get_deleter().__second_constructed = true; 12033e519524SHoward Hinnant return __h; 12043e519524SHoward Hinnant} 12053e519524SHoward Hinnant 12063e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 12078b805c91SHoward Hinnanttemplate <class _A0> 12088b805c91SHoward Hinnanttypename enable_if 12098b805c91SHoward Hinnant< 12108b805c91SHoward Hinnant is_constructible<_Key, _A0>::value, 12113e519524SHoward Hinnant typename map<_Key, _Tp, _Compare, _Allocator>::__node_holder 12128b805c91SHoward Hinnant>::type 12138b805c91SHoward Hinnantmap<_Key, _Tp, _Compare, _Allocator>::__construct_node(_A0&& __a0) 12143e519524SHoward Hinnant{ 12153e519524SHoward Hinnant __node_allocator& __na = __tree_.__node_alloc(); 1216c003db1fSHoward Hinnant __node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na)); 1217*07d3eccdSHoward Hinnant __node_traits::construct(__na, _VSTD::addressof(__h->__value_.__cc.first), _VSTD::forward<_A0>(__a0)); 12183e519524SHoward Hinnant __h.get_deleter().__first_constructed = true; 1219*07d3eccdSHoward Hinnant __node_traits::construct(__na, _VSTD::addressof(__h->__value_.__cc.second)); 12208b805c91SHoward Hinnant __h.get_deleter().__second_constructed = true; 12218b805c91SHoward Hinnant return __h; 12228b805c91SHoward Hinnant} 12238b805c91SHoward Hinnant 12248b805c91SHoward Hinnant#ifndef _LIBCPP_HAS_NO_VARIADICS 12258b805c91SHoward Hinnant 12268b805c91SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 12278b805c91SHoward Hinnanttemplate <class _A0, class _A1, class ..._Args> 12288b805c91SHoward Hinnanttypename map<_Key, _Tp, _Compare, _Allocator>::__node_holder 12298b805c91SHoward Hinnantmap<_Key, _Tp, _Compare, _Allocator>::__construct_node(_A0&& __a0, _A1&& __a1, _Args&& ...__args) 12308b805c91SHoward Hinnant{ 12318b805c91SHoward Hinnant __node_allocator& __na = __tree_.__node_alloc(); 12328b805c91SHoward Hinnant __node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na)); 12338b805c91SHoward Hinnant __node_traits::construct(__na, _VSTD::addressof(__h->__value_), 12348b805c91SHoward Hinnant _VSTD::forward<_A0>(__a0), _VSTD::forward<_A1>(__a1), 12358b805c91SHoward Hinnant _VSTD::forward<_Args>(__args)...); 12368b805c91SHoward Hinnant __h.get_deleter().__first_constructed = true; 12373e519524SHoward Hinnant __h.get_deleter().__second_constructed = true; 12383e519524SHoward Hinnant return __h; 12393e519524SHoward Hinnant} 12403e519524SHoward Hinnant 12417609c9b6SHoward Hinnant#endif // _LIBCPP_HAS_NO_VARIADICS 12427609c9b6SHoward Hinnant 12437609c9b6SHoward Hinnant#else // _LIBCPP_HAS_NO_RVALUE_REFERENCES 12443e519524SHoward Hinnant 12453e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 12463e519524SHoward Hinnanttypename map<_Key, _Tp, _Compare, _Allocator>::__node_holder 12473e519524SHoward Hinnantmap<_Key, _Tp, _Compare, _Allocator>::__construct_node(const key_type& __k) 12483e519524SHoward Hinnant{ 12493e519524SHoward Hinnant __node_allocator& __na = __tree_.__node_alloc(); 1250c003db1fSHoward Hinnant __node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na)); 1251*07d3eccdSHoward Hinnant __node_traits::construct(__na, _VSTD::addressof(__h->__value_.__cc.first), __k); 12523e519524SHoward Hinnant __h.get_deleter().__first_constructed = true; 1253*07d3eccdSHoward Hinnant __node_traits::construct(__na, _VSTD::addressof(__h->__value_.__cc.second)); 12543e519524SHoward Hinnant __h.get_deleter().__second_constructed = true; 1255ce48a113SHoward Hinnant return _VSTD::move(__h); 12563e519524SHoward Hinnant} 12573e519524SHoward Hinnant 12587609c9b6SHoward Hinnant#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 12593e519524SHoward Hinnant 12603e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 12613e519524SHoward Hinnant_Tp& 12623e519524SHoward Hinnantmap<_Key, _Tp, _Compare, _Allocator>::operator[](const key_type& __k) 12633e519524SHoward Hinnant{ 12643e519524SHoward Hinnant __node_base_pointer __parent; 12653e519524SHoward Hinnant __node_base_pointer& __child = __find_equal_key(__parent, __k); 12663e519524SHoward Hinnant __node_pointer __r = static_cast<__node_pointer>(__child); 12673e519524SHoward Hinnant if (__child == nullptr) 12683e519524SHoward Hinnant { 12693e519524SHoward Hinnant __node_holder __h = __construct_node(__k); 1270*07d3eccdSHoward Hinnant __tree_.__insert_node_at(__parent, __child, static_cast<__node_base_pointer>(__h.get())); 12713e519524SHoward Hinnant __r = __h.release(); 12723e519524SHoward Hinnant } 1273*07d3eccdSHoward Hinnant return __r->__value_.__cc.second; 12743e519524SHoward Hinnant} 12753e519524SHoward Hinnant 12767609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 12773e519524SHoward Hinnant 12783e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 12793e519524SHoward Hinnant_Tp& 12803e519524SHoward Hinnantmap<_Key, _Tp, _Compare, _Allocator>::operator[](key_type&& __k) 12813e519524SHoward Hinnant{ 12823e519524SHoward Hinnant __node_base_pointer __parent; 12833e519524SHoward Hinnant __node_base_pointer& __child = __find_equal_key(__parent, __k); 12843e519524SHoward Hinnant __node_pointer __r = static_cast<__node_pointer>(__child); 12853e519524SHoward Hinnant if (__child == nullptr) 12863e519524SHoward Hinnant { 1287ce48a113SHoward Hinnant __node_holder __h = __construct_node(_VSTD::move(__k)); 1288*07d3eccdSHoward Hinnant __tree_.__insert_node_at(__parent, __child, static_cast<__node_base_pointer>(__h.get())); 12893e519524SHoward Hinnant __r = __h.release(); 12903e519524SHoward Hinnant } 1291*07d3eccdSHoward Hinnant return __r->__value_.__cc.second; 12923e519524SHoward Hinnant} 12933e519524SHoward Hinnant 12947609c9b6SHoward Hinnant#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 12953e519524SHoward Hinnant 12963e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 12973e519524SHoward Hinnant_Tp& 12983e519524SHoward Hinnantmap<_Key, _Tp, _Compare, _Allocator>::at(const key_type& __k) 12993e519524SHoward Hinnant{ 13003e519524SHoward Hinnant __node_base_pointer __parent; 13013e519524SHoward Hinnant __node_base_pointer& __child = __find_equal_key(__parent, __k); 130254b409fdSHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 13033e519524SHoward Hinnant if (__child == nullptr) 13043e519524SHoward Hinnant throw out_of_range("map::at: key not found"); 1305b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS 1306*07d3eccdSHoward Hinnant return static_cast<__node_pointer>(__child)->__value_.__cc.second; 13073e519524SHoward Hinnant} 13083e519524SHoward Hinnant 13093e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 13103e519524SHoward Hinnantconst _Tp& 13113e519524SHoward Hinnantmap<_Key, _Tp, _Compare, _Allocator>::at(const key_type& __k) const 13123e519524SHoward Hinnant{ 13133e519524SHoward Hinnant __node_base_const_pointer __parent; 13143e519524SHoward Hinnant __node_base_const_pointer __child = __find_equal_key(__parent, __k); 131554b409fdSHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS 13163e519524SHoward Hinnant if (__child == nullptr) 13173e519524SHoward Hinnant throw out_of_range("map::at: key not found"); 1318b3371f6fSHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS 1319*07d3eccdSHoward Hinnant return static_cast<__node_const_pointer>(__child)->__value_.__cc.second; 13203e519524SHoward Hinnant} 13213e519524SHoward Hinnant 13227609c9b6SHoward Hinnant#if !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS) 13233e519524SHoward Hinnant 13243e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 13258b805c91SHoward Hinnanttemplate <class ..._Args> 13263e519524SHoward Hinnantpair<typename map<_Key, _Tp, _Compare, _Allocator>::iterator, bool> 13278b805c91SHoward Hinnantmap<_Key, _Tp, _Compare, _Allocator>::emplace(_Args&& ...__args) 13283e519524SHoward Hinnant{ 13298b805c91SHoward Hinnant __node_holder __h = __construct_node(_VSTD::forward<_Args>(__args)...); 13303e519524SHoward Hinnant pair<iterator, bool> __r = __tree_.__node_insert_unique(__h.get()); 13313e519524SHoward Hinnant if (__r.second) 13323e519524SHoward Hinnant __h.release(); 13333e519524SHoward Hinnant return __r; 13343e519524SHoward Hinnant} 13353e519524SHoward Hinnant 13363e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 13378b805c91SHoward Hinnanttemplate <class ..._Args> 13383e519524SHoward Hinnanttypename map<_Key, _Tp, _Compare, _Allocator>::iterator 13393e519524SHoward Hinnantmap<_Key, _Tp, _Compare, _Allocator>::emplace_hint(const_iterator __p, 13408b805c91SHoward Hinnant _Args&& ...__args) 13413e519524SHoward Hinnant{ 13428b805c91SHoward Hinnant __node_holder __h = __construct_node(_VSTD::forward<_Args>(__args)...); 13433e519524SHoward Hinnant iterator __r = __tree_.__node_insert_unique(__p.__i_, __h.get()); 13443e519524SHoward Hinnant if (__r.__i_.__ptr_ == __h.get()) 13453e519524SHoward Hinnant __h.release(); 13463e519524SHoward Hinnant return __r; 13473e519524SHoward Hinnant} 13483e519524SHoward Hinnant 13497609c9b6SHoward Hinnant#endif // !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS) 13503e519524SHoward Hinnant 13513e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 1352848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 13533e519524SHoward Hinnantbool 13543e519524SHoward Hinnantoperator==(const map<_Key, _Tp, _Compare, _Allocator>& __x, 13553e519524SHoward Hinnant const map<_Key, _Tp, _Compare, _Allocator>& __y) 13563e519524SHoward Hinnant{ 1357ce48a113SHoward Hinnant return __x.size() == __y.size() && _VSTD::equal(__x.begin(), __x.end(), __y.begin()); 13583e519524SHoward Hinnant} 13593e519524SHoward Hinnant 13603e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 1361848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 13623e519524SHoward Hinnantbool 13633e519524SHoward Hinnantoperator< (const map<_Key, _Tp, _Compare, _Allocator>& __x, 13643e519524SHoward Hinnant const map<_Key, _Tp, _Compare, _Allocator>& __y) 13653e519524SHoward Hinnant{ 1366ce48a113SHoward Hinnant return _VSTD::lexicographical_compare(__x.begin(), __x.end(), __y.begin(), __y.end()); 13673e519524SHoward Hinnant} 13683e519524SHoward Hinnant 13693e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 1370848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 13713e519524SHoward Hinnantbool 13723e519524SHoward Hinnantoperator!=(const map<_Key, _Tp, _Compare, _Allocator>& __x, 13733e519524SHoward Hinnant const map<_Key, _Tp, _Compare, _Allocator>& __y) 13743e519524SHoward Hinnant{ 13753e519524SHoward Hinnant return !(__x == __y); 13763e519524SHoward Hinnant} 13773e519524SHoward Hinnant 13783e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 1379848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 13803e519524SHoward Hinnantbool 13813e519524SHoward Hinnantoperator> (const map<_Key, _Tp, _Compare, _Allocator>& __x, 13823e519524SHoward Hinnant const map<_Key, _Tp, _Compare, _Allocator>& __y) 13833e519524SHoward Hinnant{ 13843e519524SHoward Hinnant return __y < __x; 13853e519524SHoward Hinnant} 13863e519524SHoward Hinnant 13873e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 1388848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 13893e519524SHoward Hinnantbool 13903e519524SHoward Hinnantoperator>=(const map<_Key, _Tp, _Compare, _Allocator>& __x, 13913e519524SHoward Hinnant const map<_Key, _Tp, _Compare, _Allocator>& __y) 13923e519524SHoward Hinnant{ 13933e519524SHoward Hinnant return !(__x < __y); 13943e519524SHoward Hinnant} 13953e519524SHoward Hinnant 13963e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 1397848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 13983e519524SHoward Hinnantbool 13993e519524SHoward Hinnantoperator<=(const map<_Key, _Tp, _Compare, _Allocator>& __x, 14003e519524SHoward Hinnant const map<_Key, _Tp, _Compare, _Allocator>& __y) 14013e519524SHoward Hinnant{ 14023e519524SHoward Hinnant return !(__y < __x); 14033e519524SHoward Hinnant} 14043e519524SHoward Hinnant 14053e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 1406848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 14073e519524SHoward Hinnantvoid 14083e519524SHoward Hinnantswap(map<_Key, _Tp, _Compare, _Allocator>& __x, 14093e519524SHoward Hinnant map<_Key, _Tp, _Compare, _Allocator>& __y) 14101052ee39SHoward Hinnant _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y))) 14113e519524SHoward Hinnant{ 14123e519524SHoward Hinnant __x.swap(__y); 14133e519524SHoward Hinnant} 14143e519524SHoward Hinnant 14153e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare = less<_Key>, 14163e519524SHoward Hinnant class _Allocator = allocator<pair<const _Key, _Tp> > > 14176e41256fSHoward Hinnantclass _LIBCPP_TYPE_VIS multimap 14183e519524SHoward Hinnant{ 14193e519524SHoward Hinnantpublic: 14203e519524SHoward Hinnant // types: 14213e519524SHoward Hinnant typedef _Key key_type; 14223e519524SHoward Hinnant typedef _Tp mapped_type; 14233e519524SHoward Hinnant typedef pair<const key_type, mapped_type> value_type; 1424*07d3eccdSHoward Hinnant typedef pair<key_type, mapped_type> __nc_value_type; 14253e519524SHoward Hinnant typedef _Compare key_compare; 14263e519524SHoward Hinnant typedef _Allocator allocator_type; 14273e519524SHoward Hinnant typedef value_type& reference; 14283e519524SHoward Hinnant typedef const value_type& const_reference; 14293e519524SHoward Hinnant 14306e41256fSHoward Hinnant class _LIBCPP_TYPE_VIS value_compare 14313e519524SHoward Hinnant : public binary_function<value_type, value_type, bool> 14323e519524SHoward Hinnant { 14333e519524SHoward Hinnant friend class multimap; 14343e519524SHoward Hinnant protected: 14353e519524SHoward Hinnant key_compare comp; 14363e519524SHoward Hinnant 1437848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 14383e519524SHoward Hinnant value_compare(key_compare c) : comp(c) {} 14393e519524SHoward Hinnant public: 1440848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 14413e519524SHoward Hinnant bool operator()(const value_type& __x, const value_type& __y) const 14423e519524SHoward Hinnant {return comp(__x.first, __y.first);} 14433e519524SHoward Hinnant }; 14443e519524SHoward Hinnant 14453e519524SHoward Hinnantprivate: 1446*07d3eccdSHoward Hinnant#if __cplusplus >= 201103L 1447*07d3eccdSHoward Hinnant union __value_type 1448*07d3eccdSHoward Hinnant { 1449*07d3eccdSHoward Hinnant typedef typename multimap::value_type value_type; 1450*07d3eccdSHoward Hinnant typedef typename multimap::__nc_value_type __nc_value_type; 1451*07d3eccdSHoward Hinnant value_type __cc; 1452*07d3eccdSHoward Hinnant __nc_value_type __nc; 1453*07d3eccdSHoward Hinnant 1454*07d3eccdSHoward Hinnant template <class ..._Args> 1455*07d3eccdSHoward Hinnant __value_type(_Args&& ...__args) 1456*07d3eccdSHoward Hinnant : __cc(std::forward<_Args>(__args)...) {} 1457*07d3eccdSHoward Hinnant 1458*07d3eccdSHoward Hinnant __value_type(const __value_type& __v) 1459*07d3eccdSHoward Hinnant : __cc(std::move(__v.__cc)) {} 1460*07d3eccdSHoward Hinnant 1461*07d3eccdSHoward Hinnant __value_type(__value_type&& __v) 1462*07d3eccdSHoward Hinnant : __nc(std::move(__v.__nc)) {} 1463*07d3eccdSHoward Hinnant 1464*07d3eccdSHoward Hinnant __value_type& operator=(const __value_type& __v) 1465*07d3eccdSHoward Hinnant {__nc = __v.__cc; return *this;} 1466*07d3eccdSHoward Hinnant 1467*07d3eccdSHoward Hinnant __value_type& operator=(__value_type&& __v) 1468*07d3eccdSHoward Hinnant {__nc = std::move(__v.__nc); return *this;} 1469*07d3eccdSHoward Hinnant 1470*07d3eccdSHoward Hinnant ~__value_type() {__cc.~value_type();} 1471*07d3eccdSHoward Hinnant 1472*07d3eccdSHoward Hinnant operator const value_type& () const {return __cc;} 1473*07d3eccdSHoward Hinnant }; 1474*07d3eccdSHoward Hinnant#else 1475*07d3eccdSHoward Hinnant struct __value_type 1476*07d3eccdSHoward Hinnant { 1477*07d3eccdSHoward Hinnant typedef typename multimap::value_type value_type; 1478*07d3eccdSHoward Hinnant value_type __cc; 1479*07d3eccdSHoward Hinnant 1480*07d3eccdSHoward Hinnant __value_type() {} 1481*07d3eccdSHoward Hinnant 1482*07d3eccdSHoward Hinnant template <class _A0> 1483*07d3eccdSHoward Hinnant __value_type(const _A0& __a0) 1484*07d3eccdSHoward Hinnant : __cc(__a0) {} 1485*07d3eccdSHoward Hinnant 1486*07d3eccdSHoward Hinnant template <class _A0, class _A1> 1487*07d3eccdSHoward Hinnant __value_type(const _A0& __a0, const _A1& __a1) 1488*07d3eccdSHoward Hinnant : __cc(__a0, __a1) {} 1489*07d3eccdSHoward Hinnant 1490*07d3eccdSHoward Hinnant operator const value_type& () const {return __cc;} 1491*07d3eccdSHoward Hinnant }; 1492*07d3eccdSHoward Hinnant#endif 14933e519524SHoward Hinnant typedef __map_value_compare<key_type, mapped_type, key_compare> __vc; 14943e519524SHoward Hinnant typedef typename allocator_traits<allocator_type>::template 14953e519524SHoward Hinnant#ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES 14963e519524SHoward Hinnant rebind_alloc<__value_type> 14973e519524SHoward Hinnant#else 14983e519524SHoward Hinnant rebind_alloc<__value_type>::other 14993e519524SHoward Hinnant#endif 15003e519524SHoward Hinnant __allocator_type; 15013e519524SHoward Hinnant typedef __tree<__value_type, __vc, __allocator_type> __base; 15023e519524SHoward Hinnant typedef typename __base::__node_traits __node_traits; 15033e519524SHoward Hinnant typedef allocator_traits<allocator_type> __alloc_traits; 15043e519524SHoward Hinnant 15053e519524SHoward Hinnant __base __tree_; 15063e519524SHoward Hinnant 15073e519524SHoward Hinnantpublic: 15083e519524SHoward Hinnant typedef typename __alloc_traits::pointer pointer; 15093e519524SHoward Hinnant typedef typename __alloc_traits::const_pointer const_pointer; 15103e519524SHoward Hinnant typedef typename __alloc_traits::size_type size_type; 15113e519524SHoward Hinnant typedef typename __alloc_traits::difference_type difference_type; 15123e519524SHoward Hinnant typedef __map_iterator<typename __base::iterator> iterator; 15133e519524SHoward Hinnant typedef __map_const_iterator<typename __base::const_iterator> const_iterator; 1514ce48a113SHoward Hinnant typedef _VSTD::reverse_iterator<iterator> reverse_iterator; 1515ce48a113SHoward Hinnant typedef _VSTD::reverse_iterator<const_iterator> const_reverse_iterator; 15163e519524SHoward Hinnant 1517848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 15183e519524SHoward Hinnant explicit multimap(const key_compare& __comp = key_compare()) 15191052ee39SHoward Hinnant _NOEXCEPT_( 15201052ee39SHoward Hinnant is_nothrow_default_constructible<allocator_type>::value && 15211052ee39SHoward Hinnant is_nothrow_default_constructible<key_compare>::value && 15221052ee39SHoward Hinnant is_nothrow_copy_constructible<key_compare>::value) 15233e519524SHoward Hinnant : __tree_(__vc(__comp)) {} 15243e519524SHoward Hinnant 1525848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 15263e519524SHoward Hinnant explicit multimap(const key_compare& __comp, const allocator_type& __a) 15273e519524SHoward Hinnant : __tree_(__vc(__comp), __a) {} 15283e519524SHoward Hinnant 15293e519524SHoward Hinnant template <class _InputIterator> 1530848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 15313e519524SHoward Hinnant multimap(_InputIterator __f, _InputIterator __l, 15323e519524SHoward Hinnant const key_compare& __comp = key_compare()) 15333e519524SHoward Hinnant : __tree_(__vc(__comp)) 15343e519524SHoward Hinnant { 15353e519524SHoward Hinnant insert(__f, __l); 15363e519524SHoward Hinnant } 15373e519524SHoward Hinnant 15383e519524SHoward Hinnant template <class _InputIterator> 1539848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 15403e519524SHoward Hinnant multimap(_InputIterator __f, _InputIterator __l, 15413e519524SHoward Hinnant const key_compare& __comp, const allocator_type& __a) 15423e519524SHoward Hinnant : __tree_(__vc(__comp), __a) 15433e519524SHoward Hinnant { 15443e519524SHoward Hinnant insert(__f, __l); 15453e519524SHoward Hinnant } 15463e519524SHoward Hinnant 1547848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 15483e519524SHoward Hinnant multimap(const multimap& __m) 15493e519524SHoward Hinnant : __tree_(__m.__tree_.value_comp(), 15503e519524SHoward Hinnant __alloc_traits::select_on_container_copy_construction(__m.__tree_.__alloc())) 15513e519524SHoward Hinnant { 15523e519524SHoward Hinnant insert(__m.begin(), __m.end()); 15533e519524SHoward Hinnant } 15543e519524SHoward Hinnant 15555a33687dSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 15565a33687dSHoward Hinnant multimap& operator=(const multimap& __m) 15575a33687dSHoward Hinnant { 1558*07d3eccdSHoward Hinnant#if __cplusplus >= 201103L 15595a33687dSHoward Hinnant __tree_ = __m.__tree_; 1560*07d3eccdSHoward Hinnant#else 1561*07d3eccdSHoward Hinnant __tree_.clear(); 1562*07d3eccdSHoward Hinnant __tree_.value_comp() = __m.__tree_.value_comp(); 1563*07d3eccdSHoward Hinnant __tree_.__copy_assign_alloc(__m.__tree_); 1564*07d3eccdSHoward Hinnant insert(__m.begin(), __m.end()); 1565*07d3eccdSHoward Hinnant#endif 15665a33687dSHoward Hinnant return *this; 15675a33687dSHoward Hinnant } 15685a33687dSHoward Hinnant 15697609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 15703e519524SHoward Hinnant 1571848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 15723e519524SHoward Hinnant multimap(multimap&& __m) 15731052ee39SHoward Hinnant _NOEXCEPT_(is_nothrow_move_constructible<__base>::value) 1574ce48a113SHoward Hinnant : __tree_(_VSTD::move(__m.__tree_)) 15753e519524SHoward Hinnant { 15763e519524SHoward Hinnant } 15773e519524SHoward Hinnant 15783e519524SHoward Hinnant multimap(multimap&& __m, const allocator_type& __a); 15793e519524SHoward Hinnant 1580848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 158154976f26SHoward Hinnant multimap& operator=(multimap&& __m) 158254976f26SHoward Hinnant _NOEXCEPT_(is_nothrow_move_assignable<__base>::value) 158354976f26SHoward Hinnant { 158454976f26SHoward Hinnant __tree_ = _VSTD::move(__m.__tree_); 158554976f26SHoward Hinnant return *this; 158654976f26SHoward Hinnant } 158754976f26SHoward Hinnant 158854976f26SHoward Hinnant#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 158954976f26SHoward Hinnant 159054976f26SHoward Hinnant#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS 159154976f26SHoward Hinnant 159254976f26SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 15933e519524SHoward Hinnant multimap(initializer_list<value_type> __il, const key_compare& __comp = key_compare()) 15943e519524SHoward Hinnant : __tree_(__vc(__comp)) 15953e519524SHoward Hinnant { 15963e519524SHoward Hinnant insert(__il.begin(), __il.end()); 15973e519524SHoward Hinnant } 15983e519524SHoward Hinnant 1599848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 16003e519524SHoward Hinnant multimap(initializer_list<value_type> __il, const key_compare& __comp, const allocator_type& __a) 16013e519524SHoward Hinnant : __tree_(__vc(__comp), __a) 16023e519524SHoward Hinnant { 16033e519524SHoward Hinnant insert(__il.begin(), __il.end()); 16043e519524SHoward Hinnant } 16053e519524SHoward Hinnant 1606848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 16073e519524SHoward Hinnant multimap& operator=(initializer_list<value_type> __il) 16083e519524SHoward Hinnant { 16093e519524SHoward Hinnant __tree_.__assign_multi(__il.begin(), __il.end()); 16103e519524SHoward Hinnant return *this; 16113e519524SHoward Hinnant } 161254976f26SHoward Hinnant 161354976f26SHoward Hinnant#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS 16143e519524SHoward Hinnant 1615848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 16163e519524SHoward Hinnant explicit multimap(const allocator_type& __a) 16173e519524SHoward Hinnant : __tree_(__a) 16183e519524SHoward Hinnant { 16193e519524SHoward Hinnant } 16203e519524SHoward Hinnant 1621848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 16223e519524SHoward Hinnant multimap(const multimap& __m, const allocator_type& __a) 16233e519524SHoward Hinnant : __tree_(__m.__tree_.value_comp(), __a) 16243e519524SHoward Hinnant { 16253e519524SHoward Hinnant insert(__m.begin(), __m.end()); 16263e519524SHoward Hinnant } 16273e519524SHoward Hinnant 1628848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 16291052ee39SHoward Hinnant iterator begin() _NOEXCEPT {return __tree_.begin();} 1630848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 16311052ee39SHoward Hinnant const_iterator begin() const _NOEXCEPT {return __tree_.begin();} 1632848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 16331052ee39SHoward Hinnant iterator end() _NOEXCEPT {return __tree_.end();} 1634848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 16351052ee39SHoward Hinnant const_iterator end() const _NOEXCEPT {return __tree_.end();} 16363e519524SHoward Hinnant 1637848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 16381052ee39SHoward Hinnant reverse_iterator rbegin() _NOEXCEPT {return reverse_iterator(end());} 1639848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 16401052ee39SHoward Hinnant const_reverse_iterator rbegin() const _NOEXCEPT 16411052ee39SHoward Hinnant {return const_reverse_iterator(end());} 1642848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 16431052ee39SHoward Hinnant reverse_iterator rend() _NOEXCEPT {return reverse_iterator(begin());} 1644848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 16451052ee39SHoward Hinnant const_reverse_iterator rend() const _NOEXCEPT 16461052ee39SHoward Hinnant {return const_reverse_iterator(begin());} 16473e519524SHoward Hinnant 1648848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 16491052ee39SHoward Hinnant const_iterator cbegin() const _NOEXCEPT {return begin();} 1650848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 16511052ee39SHoward Hinnant const_iterator cend() const _NOEXCEPT {return end();} 1652848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 16531052ee39SHoward Hinnant const_reverse_iterator crbegin() const _NOEXCEPT {return rbegin();} 1654848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 16551052ee39SHoward Hinnant const_reverse_iterator crend() const _NOEXCEPT {return rend();} 16563e519524SHoward Hinnant 1657848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 16581052ee39SHoward Hinnant bool empty() const _NOEXCEPT {return __tree_.size() == 0;} 1659848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 16601052ee39SHoward Hinnant size_type size() const _NOEXCEPT {return __tree_.size();} 1661848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 16621052ee39SHoward Hinnant size_type max_size() const _NOEXCEPT {return __tree_.max_size();} 16633e519524SHoward Hinnant 1664848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 16651052ee39SHoward Hinnant allocator_type get_allocator() const _NOEXCEPT {return __tree_.__alloc();} 1666848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 16673e519524SHoward Hinnant key_compare key_comp() const {return __tree_.value_comp().key_comp();} 1668848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 16691052ee39SHoward Hinnant value_compare value_comp() const 16701052ee39SHoward Hinnant {return value_compare(__tree_.value_comp().key_comp());} 16713e519524SHoward Hinnant 16727609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 16737609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_VARIADICS 16747609c9b6SHoward Hinnant 16758b805c91SHoward Hinnant template <class ..._Args> 16763e519524SHoward Hinnant iterator 16778b805c91SHoward Hinnant emplace(_Args&& ...__args); 16783e519524SHoward Hinnant 16798b805c91SHoward Hinnant template <class ..._Args> 16803e519524SHoward Hinnant iterator 16818b805c91SHoward Hinnant emplace_hint(const_iterator __p, _Args&& ...__args); 16823e519524SHoward Hinnant 16837609c9b6SHoward Hinnant#endif // _LIBCPP_HAS_NO_VARIADICS 16847609c9b6SHoward Hinnant 1685c003db1fSHoward Hinnant template <class _Pp, 1686c003db1fSHoward Hinnant class = typename enable_if<is_constructible<value_type, _Pp>::value>::type> 1687848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 1688c003db1fSHoward Hinnant iterator insert(_Pp&& __p) 1689c003db1fSHoward Hinnant {return __tree_.__insert_multi(_VSTD::forward<_Pp>(__p));} 16903e519524SHoward Hinnant 1691c003db1fSHoward Hinnant template <class _Pp, 1692c003db1fSHoward Hinnant class = typename enable_if<is_constructible<value_type, _Pp>::value>::type> 1693848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 1694c003db1fSHoward Hinnant iterator insert(const_iterator __pos, _Pp&& __p) 1695c003db1fSHoward Hinnant {return __tree_.__insert_multi(__pos.__i_, _VSTD::forward<_Pp>(__p));} 16963e519524SHoward Hinnant 16977609c9b6SHoward Hinnant#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 16983e519524SHoward Hinnant 1699848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 17003e519524SHoward Hinnant iterator insert(const value_type& __v) {return __tree_.__insert_multi(__v);} 17013e519524SHoward Hinnant 1702848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 17033e519524SHoward Hinnant iterator insert(const_iterator __p, const value_type& __v) 17043e519524SHoward Hinnant {return __tree_.__insert_multi(__p.__i_, __v);} 17053e519524SHoward Hinnant 17063e519524SHoward Hinnant template <class _InputIterator> 1707848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 17083e519524SHoward Hinnant void insert(_InputIterator __f, _InputIterator __l) 17093e519524SHoward Hinnant { 17103e519524SHoward Hinnant for (const_iterator __e = cend(); __f != __l; ++__f) 17113e519524SHoward Hinnant __tree_.__insert_multi(__e.__i_, *__f); 17123e519524SHoward Hinnant } 17133e519524SHoward Hinnant 171454976f26SHoward Hinnant#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS 171554976f26SHoward Hinnant 1716848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 17173e519524SHoward Hinnant void insert(initializer_list<value_type> __il) 17183e519524SHoward Hinnant {insert(__il.begin(), __il.end());} 17193e519524SHoward Hinnant 172054976f26SHoward Hinnant#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS 172154976f26SHoward Hinnant 1722848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 17233e519524SHoward Hinnant iterator erase(const_iterator __p) {return __tree_.erase(__p.__i_);} 1724848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 17253e519524SHoward Hinnant size_type erase(const key_type& __k) {return __tree_.__erase_multi(__k);} 1726848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 17273e519524SHoward Hinnant iterator erase(const_iterator __f, const_iterator __l) 17283e519524SHoward Hinnant {return __tree_.erase(__f.__i_, __l.__i_);} 1729848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 17303e519524SHoward Hinnant void clear() {__tree_.clear();} 17313e519524SHoward Hinnant 1732848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 17331052ee39SHoward Hinnant void swap(multimap& __m) 17341052ee39SHoward Hinnant _NOEXCEPT_(__is_nothrow_swappable<__base>::value) 17351052ee39SHoward Hinnant {__tree_.swap(__m.__tree_);} 17363e519524SHoward Hinnant 1737848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 17383e519524SHoward Hinnant iterator find(const key_type& __k) {return __tree_.find(__k);} 1739848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 17403e519524SHoward Hinnant const_iterator find(const key_type& __k) const {return __tree_.find(__k);} 1741848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 17423e519524SHoward Hinnant size_type count(const key_type& __k) const 17433e519524SHoward Hinnant {return __tree_.__count_multi(__k);} 1744848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 17453e519524SHoward Hinnant iterator lower_bound(const key_type& __k) 17463e519524SHoward Hinnant {return __tree_.lower_bound(__k);} 1747848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 17483e519524SHoward Hinnant const_iterator lower_bound(const key_type& __k) const 17493e519524SHoward Hinnant {return __tree_.lower_bound(__k);} 1750848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 17513e519524SHoward Hinnant iterator upper_bound(const key_type& __k) 17523e519524SHoward Hinnant {return __tree_.upper_bound(__k);} 1753848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 17543e519524SHoward Hinnant const_iterator upper_bound(const key_type& __k) const 17553e519524SHoward Hinnant {return __tree_.upper_bound(__k);} 1756848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 17573e519524SHoward Hinnant pair<iterator,iterator> equal_range(const key_type& __k) 17583e519524SHoward Hinnant {return __tree_.__equal_range_multi(__k);} 1759848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 17603e519524SHoward Hinnant pair<const_iterator,const_iterator> equal_range(const key_type& __k) const 17613e519524SHoward Hinnant {return __tree_.__equal_range_multi(__k);} 17623e519524SHoward Hinnant 17633e519524SHoward Hinnantprivate: 17643e519524SHoward Hinnant typedef typename __base::__node __node; 17653e519524SHoward Hinnant typedef typename __base::__node_allocator __node_allocator; 17663e519524SHoward Hinnant typedef typename __base::__node_pointer __node_pointer; 17673e519524SHoward Hinnant typedef typename __base::__node_const_pointer __node_const_pointer; 1768c003db1fSHoward Hinnant typedef __map_node_destructor<__node_allocator> _Dp; 1769c003db1fSHoward Hinnant typedef unique_ptr<__node, _Dp> __node_holder; 17703e519524SHoward Hinnant 17717609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 17723e519524SHoward Hinnant __node_holder __construct_node(); 17738b805c91SHoward Hinnant template <class _A0> 17748b805c91SHoward Hinnant typename enable_if 17758b805c91SHoward Hinnant < 17768b805c91SHoward Hinnant is_constructible<value_type, _A0>::value, 17778b805c91SHoward Hinnant __node_holder 17788b805c91SHoward Hinnant >::type 17798b805c91SHoward Hinnant __construct_node(_A0&& __a0); 17808b805c91SHoward Hinnant template <class _A0> 17818b805c91SHoward Hinnant typename enable_if 17828b805c91SHoward Hinnant < 17838b805c91SHoward Hinnant is_constructible<key_type, _A0>::value, 17848b805c91SHoward Hinnant __node_holder 17858b805c91SHoward Hinnant >::type 17868b805c91SHoward Hinnant __construct_node(_A0&& __a0); 17877609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_VARIADICS 17888b805c91SHoward Hinnant template <class _A0, class _A1, class ..._Args> 17898b805c91SHoward Hinnant __node_holder __construct_node(_A0&& __a0, _A1&& __a1, _Args&& ...__args); 17907609c9b6SHoward Hinnant#endif // _LIBCPP_HAS_NO_VARIADICS 17917609c9b6SHoward Hinnant#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 17923e519524SHoward Hinnant}; 17933e519524SHoward Hinnant 17947609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 17953e519524SHoward Hinnant 17963e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 17973e519524SHoward Hinnantmultimap<_Key, _Tp, _Compare, _Allocator>::multimap(multimap&& __m, const allocator_type& __a) 1798ce48a113SHoward Hinnant : __tree_(_VSTD::move(__m.__tree_), __a) 17993e519524SHoward Hinnant{ 18003e519524SHoward Hinnant if (__a != __m.get_allocator()) 18013e519524SHoward Hinnant { 18023e519524SHoward Hinnant const_iterator __e = cend(); 18033e519524SHoward Hinnant while (!__m.empty()) 18043e519524SHoward Hinnant __tree_.__insert_multi(__e.__i_, 1805ce48a113SHoward Hinnant _VSTD::move(__m.__tree_.remove(__m.begin().__i_)->__value_)); 18063e519524SHoward Hinnant } 18073e519524SHoward Hinnant} 18083e519524SHoward Hinnant 18093e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 18103e519524SHoward Hinnanttypename multimap<_Key, _Tp, _Compare, _Allocator>::__node_holder 18113e519524SHoward Hinnantmultimap<_Key, _Tp, _Compare, _Allocator>::__construct_node() 18123e519524SHoward Hinnant{ 18133e519524SHoward Hinnant __node_allocator& __na = __tree_.__node_alloc(); 1814c003db1fSHoward Hinnant __node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na)); 1815*07d3eccdSHoward Hinnant __node_traits::construct(__na, _VSTD::addressof(__h->__value_.__cc.first)); 18163e519524SHoward Hinnant __h.get_deleter().__first_constructed = true; 1817*07d3eccdSHoward Hinnant __node_traits::construct(__na, _VSTD::addressof(__h->__value_.__cc.second)); 18183e519524SHoward Hinnant __h.get_deleter().__second_constructed = true; 18193e519524SHoward Hinnant return __h; 18203e519524SHoward Hinnant} 18213e519524SHoward Hinnant 18223e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 18238b805c91SHoward Hinnanttemplate <class _A0> 18248b805c91SHoward Hinnanttypename enable_if 18258b805c91SHoward Hinnant< 18268b805c91SHoward Hinnant is_constructible<pair<const _Key, _Tp>, _A0>::value, 18273e519524SHoward Hinnant typename multimap<_Key, _Tp, _Compare, _Allocator>::__node_holder 18288b805c91SHoward Hinnant>::type 18293e519524SHoward Hinnantmultimap<_Key, _Tp, _Compare, _Allocator>::__construct_node(_A0&& __a0) 18303e519524SHoward Hinnant{ 18313e519524SHoward Hinnant __node_allocator& __na = __tree_.__node_alloc(); 1832c003db1fSHoward Hinnant __node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na)); 1833ce48a113SHoward Hinnant __node_traits::construct(__na, _VSTD::addressof(__h->__value_), _VSTD::forward<_A0>(__a0)); 18343e519524SHoward Hinnant __h.get_deleter().__first_constructed = true; 18353e519524SHoward Hinnant __h.get_deleter().__second_constructed = true; 18363e519524SHoward Hinnant return __h; 18373e519524SHoward Hinnant} 18383e519524SHoward Hinnant 18393e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 18408b805c91SHoward Hinnanttemplate <class _A0> 18418b805c91SHoward Hinnanttypename enable_if 18428b805c91SHoward Hinnant< 18438b805c91SHoward Hinnant is_constructible<_Key, _A0>::value, 18443e519524SHoward Hinnant typename multimap<_Key, _Tp, _Compare, _Allocator>::__node_holder 18458b805c91SHoward Hinnant>::type 18468b805c91SHoward Hinnantmultimap<_Key, _Tp, _Compare, _Allocator>::__construct_node(_A0&& __a0) 18473e519524SHoward Hinnant{ 18483e519524SHoward Hinnant __node_allocator& __na = __tree_.__node_alloc(); 1849c003db1fSHoward Hinnant __node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na)); 1850*07d3eccdSHoward Hinnant __node_traits::construct(__na, _VSTD::addressof(__h->__value_.__cc.first), _VSTD::forward<_A0>(__a0)); 18513e519524SHoward Hinnant __h.get_deleter().__first_constructed = true; 1852*07d3eccdSHoward Hinnant __node_traits::construct(__na, _VSTD::addressof(__h->__value_.__cc.second)); 18538b805c91SHoward Hinnant __h.get_deleter().__second_constructed = true; 18548b805c91SHoward Hinnant return __h; 18558b805c91SHoward Hinnant} 18568b805c91SHoward Hinnant 18578b805c91SHoward Hinnant#ifndef _LIBCPP_HAS_NO_VARIADICS 18588b805c91SHoward Hinnant 18598b805c91SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 18608b805c91SHoward Hinnanttemplate <class _A0, class _A1, class ..._Args> 18618b805c91SHoward Hinnanttypename multimap<_Key, _Tp, _Compare, _Allocator>::__node_holder 18628b805c91SHoward Hinnantmultimap<_Key, _Tp, _Compare, _Allocator>::__construct_node(_A0&& __a0, _A1&& __a1, _Args&& ...__args) 18638b805c91SHoward Hinnant{ 18648b805c91SHoward Hinnant __node_allocator& __na = __tree_.__node_alloc(); 18658b805c91SHoward Hinnant __node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na)); 18668b805c91SHoward Hinnant __node_traits::construct(__na, _VSTD::addressof(__h->__value_), 18678b805c91SHoward Hinnant _VSTD::forward<_A0>(__a0), _VSTD::forward<_A1>(__a1), 18688b805c91SHoward Hinnant _VSTD::forward<_Args>(__args)...); 18698b805c91SHoward Hinnant __h.get_deleter().__first_constructed = true; 18703e519524SHoward Hinnant __h.get_deleter().__second_constructed = true; 18713e519524SHoward Hinnant return __h; 18723e519524SHoward Hinnant} 18733e519524SHoward Hinnant 18747609c9b6SHoward Hinnant#endif // _LIBCPP_HAS_NO_VARIADICS 18757609c9b6SHoward Hinnant#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 18763e519524SHoward Hinnant 18777609c9b6SHoward Hinnant#if !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS) 18783e519524SHoward Hinnant 18793e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 18808b805c91SHoward Hinnanttemplate <class ..._Args> 18813e519524SHoward Hinnanttypename multimap<_Key, _Tp, _Compare, _Allocator>::iterator 18828b805c91SHoward Hinnantmultimap<_Key, _Tp, _Compare, _Allocator>::emplace(_Args&& ...__args) 18833e519524SHoward Hinnant{ 18848b805c91SHoward Hinnant __node_holder __h = __construct_node(_VSTD::forward<_Args>(__args)...); 18853e519524SHoward Hinnant iterator __r = __tree_.__node_insert_multi(__h.get()); 18863e519524SHoward Hinnant __h.release(); 18873e519524SHoward Hinnant return __r; 18883e519524SHoward Hinnant} 18893e519524SHoward Hinnant 18903e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 18918b805c91SHoward Hinnanttemplate <class ..._Args> 18923e519524SHoward Hinnanttypename multimap<_Key, _Tp, _Compare, _Allocator>::iterator 18933e519524SHoward Hinnantmultimap<_Key, _Tp, _Compare, _Allocator>::emplace_hint(const_iterator __p, 18943e519524SHoward Hinnant _Args&& ...__args) 18953e519524SHoward Hinnant{ 18968b805c91SHoward Hinnant __node_holder __h = __construct_node(_VSTD::forward<_Args>(__args)...); 18973e519524SHoward Hinnant iterator __r = __tree_.__node_insert_multi(__p.__i_, __h.get()); 18983e519524SHoward Hinnant __h.release(); 18993e519524SHoward Hinnant return __r; 19003e519524SHoward Hinnant} 19013e519524SHoward Hinnant 19027609c9b6SHoward Hinnant#endif // !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS) 19033e519524SHoward Hinnant 19043e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 1905848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 19063e519524SHoward Hinnantbool 19073e519524SHoward Hinnantoperator==(const multimap<_Key, _Tp, _Compare, _Allocator>& __x, 19083e519524SHoward Hinnant const multimap<_Key, _Tp, _Compare, _Allocator>& __y) 19093e519524SHoward Hinnant{ 1910ce48a113SHoward Hinnant return __x.size() == __y.size() && _VSTD::equal(__x.begin(), __x.end(), __y.begin()); 19113e519524SHoward Hinnant} 19123e519524SHoward Hinnant 19133e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 1914848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 19153e519524SHoward Hinnantbool 19163e519524SHoward Hinnantoperator< (const multimap<_Key, _Tp, _Compare, _Allocator>& __x, 19173e519524SHoward Hinnant const multimap<_Key, _Tp, _Compare, _Allocator>& __y) 19183e519524SHoward Hinnant{ 1919ce48a113SHoward Hinnant return _VSTD::lexicographical_compare(__x.begin(), __x.end(), __y.begin(), __y.end()); 19203e519524SHoward Hinnant} 19213e519524SHoward Hinnant 19223e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 1923848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 19243e519524SHoward Hinnantbool 19253e519524SHoward Hinnantoperator!=(const multimap<_Key, _Tp, _Compare, _Allocator>& __x, 19263e519524SHoward Hinnant const multimap<_Key, _Tp, _Compare, _Allocator>& __y) 19273e519524SHoward Hinnant{ 19283e519524SHoward Hinnant return !(__x == __y); 19293e519524SHoward Hinnant} 19303e519524SHoward Hinnant 19313e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 1932848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 19333e519524SHoward Hinnantbool 19343e519524SHoward Hinnantoperator> (const multimap<_Key, _Tp, _Compare, _Allocator>& __x, 19353e519524SHoward Hinnant const multimap<_Key, _Tp, _Compare, _Allocator>& __y) 19363e519524SHoward Hinnant{ 19373e519524SHoward Hinnant return __y < __x; 19383e519524SHoward Hinnant} 19393e519524SHoward Hinnant 19403e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 1941848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 19423e519524SHoward Hinnantbool 19433e519524SHoward Hinnantoperator>=(const multimap<_Key, _Tp, _Compare, _Allocator>& __x, 19443e519524SHoward Hinnant const multimap<_Key, _Tp, _Compare, _Allocator>& __y) 19453e519524SHoward Hinnant{ 19463e519524SHoward Hinnant return !(__x < __y); 19473e519524SHoward Hinnant} 19483e519524SHoward Hinnant 19493e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 1950848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 19513e519524SHoward Hinnantbool 19523e519524SHoward Hinnantoperator<=(const multimap<_Key, _Tp, _Compare, _Allocator>& __x, 19533e519524SHoward Hinnant const multimap<_Key, _Tp, _Compare, _Allocator>& __y) 19543e519524SHoward Hinnant{ 19553e519524SHoward Hinnant return !(__y < __x); 19563e519524SHoward Hinnant} 19573e519524SHoward Hinnant 19583e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 1959848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 19603e519524SHoward Hinnantvoid 19613e519524SHoward Hinnantswap(multimap<_Key, _Tp, _Compare, _Allocator>& __x, 19623e519524SHoward Hinnant multimap<_Key, _Tp, _Compare, _Allocator>& __y) 19631052ee39SHoward Hinnant _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y))) 19643e519524SHoward Hinnant{ 19653e519524SHoward Hinnant __x.swap(__y); 19663e519524SHoward Hinnant} 19673e519524SHoward Hinnant 19683e519524SHoward Hinnant_LIBCPP_END_NAMESPACE_STD 19693e519524SHoward Hinnant 19703e519524SHoward Hinnant#endif // _LIBCPP_MAP 1971