13e519524SHoward Hinnant// -*- C++ -*- 23e519524SHoward Hinnant//===----------------------------- map ------------------------------------===// 33e519524SHoward Hinnant// 457b08b09SChandler Carruth// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 557b08b09SChandler Carruth// See https://llvm.org/LICENSE.txt for license information. 657b08b09SChandler Carruth// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 73e519524SHoward Hinnant// 83e519524SHoward Hinnant//===----------------------------------------------------------------------===// 93e519524SHoward Hinnant 103e519524SHoward Hinnant#ifndef _LIBCPP_MAP 113e519524SHoward Hinnant#define _LIBCPP_MAP 123e519524SHoward Hinnant 133e519524SHoward Hinnant/* 143e519524SHoward Hinnant 153e519524SHoward Hinnant map synopsis 163e519524SHoward Hinnant 173e519524SHoward Hinnantnamespace std 183e519524SHoward Hinnant{ 193e519524SHoward Hinnant 203e519524SHoward Hinnanttemplate <class Key, class T, class Compare = less<Key>, 213e519524SHoward Hinnant class Allocator = allocator<pair<const Key, T>>> 223e519524SHoward Hinnantclass map 233e519524SHoward Hinnant{ 243e519524SHoward Hinnantpublic: 253e519524SHoward Hinnant // types: 263e519524SHoward Hinnant typedef Key key_type; 273e519524SHoward Hinnant typedef T mapped_type; 283e519524SHoward Hinnant typedef pair<const key_type, mapped_type> value_type; 293e519524SHoward Hinnant typedef Compare key_compare; 303e519524SHoward Hinnant typedef Allocator allocator_type; 313e519524SHoward Hinnant typedef typename allocator_type::reference reference; 323e519524SHoward Hinnant typedef typename allocator_type::const_reference const_reference; 333e519524SHoward Hinnant typedef typename allocator_type::pointer pointer; 343e519524SHoward Hinnant typedef typename allocator_type::const_pointer const_pointer; 353e519524SHoward Hinnant typedef typename allocator_type::size_type size_type; 363e519524SHoward Hinnant typedef typename allocator_type::difference_type difference_type; 373e519524SHoward Hinnant 383e519524SHoward Hinnant typedef implementation-defined iterator; 393e519524SHoward Hinnant typedef implementation-defined const_iterator; 403e519524SHoward Hinnant typedef std::reverse_iterator<iterator> reverse_iterator; 413e519524SHoward Hinnant typedef std::reverse_iterator<const_iterator> const_reverse_iterator; 42b0386a51SErik Pilkington typedef unspecified node_type; // C++17 43b0386a51SErik Pilkington typedef INSERT_RETURN_TYPE<iterator, node_type> insert_return_type; // C++17 443e519524SHoward Hinnant 453e519524SHoward Hinnant class value_compare 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: 53dc066888SArthur O'Dwyer typedef bool result_type; // deprecated in C++17, removed in C++20 54dc066888SArthur O'Dwyer typedef value_type first_argument_type; // deprecated in C++17, removed in C++20 55dc066888SArthur O'Dwyer typedef value_type second_argument_type; // deprecated in C++17, removed in C++20 563e519524SHoward Hinnant bool operator()(const value_type& x, const value_type& y) const; 573e519524SHoward Hinnant }; 583e519524SHoward Hinnant 593e519524SHoward Hinnant // construct/copy/destroy: 601052ee39SHoward Hinnant map() 611052ee39SHoward Hinnant noexcept( 621052ee39SHoward Hinnant is_nothrow_default_constructible<allocator_type>::value && 631052ee39SHoward Hinnant is_nothrow_default_constructible<key_compare>::value && 641052ee39SHoward Hinnant is_nothrow_copy_constructible<key_compare>::value); 653e519524SHoward Hinnant explicit map(const key_compare& comp); 663e519524SHoward Hinnant map(const key_compare& comp, const allocator_type& a); 673e519524SHoward Hinnant template <class InputIterator> 683e519524SHoward Hinnant map(InputIterator first, InputIterator last, 693e519524SHoward Hinnant const key_compare& comp = key_compare()); 703e519524SHoward Hinnant template <class InputIterator> 713e519524SHoward Hinnant map(InputIterator first, InputIterator last, 723e519524SHoward Hinnant const key_compare& comp, const allocator_type& a); 733e519524SHoward Hinnant map(const map& m); 741052ee39SHoward Hinnant map(map&& m) 751052ee39SHoward Hinnant noexcept( 761052ee39SHoward Hinnant is_nothrow_move_constructible<allocator_type>::value && 771052ee39SHoward Hinnant is_nothrow_move_constructible<key_compare>::value); 783e519524SHoward Hinnant explicit map(const allocator_type& a); 793e519524SHoward Hinnant map(const map& m, const allocator_type& a); 803e519524SHoward Hinnant map(map&& m, const allocator_type& a); 813e519524SHoward Hinnant map(initializer_list<value_type> il, const key_compare& comp = key_compare()); 823e519524SHoward Hinnant map(initializer_list<value_type> il, const key_compare& comp, const allocator_type& a); 83fbc317d4SMarshall Clow template <class InputIterator> 84fbc317d4SMarshall Clow map(InputIterator first, InputIterator last, const allocator_type& a) 85fbc317d4SMarshall Clow : map(first, last, Compare(), a) {} // C++14 86fbc317d4SMarshall Clow map(initializer_list<value_type> il, const allocator_type& a) 87fbc317d4SMarshall Clow : map(il, Compare(), a) {} // C++14 883e519524SHoward Hinnant ~map(); 893e519524SHoward Hinnant 903e519524SHoward Hinnant map& operator=(const map& m); 911052ee39SHoward Hinnant map& operator=(map&& m) 921052ee39SHoward Hinnant noexcept( 931052ee39SHoward Hinnant allocator_type::propagate_on_container_move_assignment::value && 941052ee39SHoward Hinnant is_nothrow_move_assignable<allocator_type>::value && 950e9f71c1SHoward Hinnant is_nothrow_move_assignable<key_compare>::value); 963e519524SHoward Hinnant map& operator=(initializer_list<value_type> il); 973e519524SHoward Hinnant 983e519524SHoward Hinnant // iterators: 990e9f71c1SHoward Hinnant iterator begin() noexcept; 1000e9f71c1SHoward Hinnant const_iterator begin() const noexcept; 1010e9f71c1SHoward Hinnant iterator end() noexcept; 1020e9f71c1SHoward Hinnant const_iterator end() const noexcept; 1033e519524SHoward Hinnant 1040e9f71c1SHoward Hinnant reverse_iterator rbegin() noexcept; 1050e9f71c1SHoward Hinnant const_reverse_iterator rbegin() const noexcept; 1060e9f71c1SHoward Hinnant reverse_iterator rend() noexcept; 1070e9f71c1SHoward Hinnant const_reverse_iterator rend() const noexcept; 1083e519524SHoward Hinnant 1090e9f71c1SHoward Hinnant const_iterator cbegin() const noexcept; 1100e9f71c1SHoward Hinnant const_iterator cend() const noexcept; 1110e9f71c1SHoward Hinnant const_reverse_iterator crbegin() const noexcept; 1120e9f71c1SHoward Hinnant const_reverse_iterator crend() const noexcept; 1133e519524SHoward Hinnant 1143e519524SHoward Hinnant // capacity: 1150e9f71c1SHoward Hinnant bool empty() const noexcept; 1160e9f71c1SHoward Hinnant size_type size() const noexcept; 1170e9f71c1SHoward Hinnant size_type max_size() const noexcept; 1183e519524SHoward Hinnant 1193e519524SHoward Hinnant // element access: 1203e519524SHoward Hinnant mapped_type& operator[](const key_type& k); 1213e519524SHoward Hinnant mapped_type& operator[](key_type&& k); 1223e519524SHoward Hinnant 1233e519524SHoward Hinnant mapped_type& at(const key_type& k); 1243e519524SHoward Hinnant const mapped_type& at(const key_type& k) const; 1253e519524SHoward Hinnant 1263e519524SHoward Hinnant // modifiers: 1273e519524SHoward Hinnant template <class... Args> 1283e519524SHoward Hinnant pair<iterator, bool> emplace(Args&&... args); 1293e519524SHoward Hinnant template <class... Args> 1303e519524SHoward Hinnant iterator emplace_hint(const_iterator position, Args&&... args); 1313e519524SHoward Hinnant pair<iterator, bool> insert(const value_type& v); 132afc9ff99SMarshall Clow pair<iterator, bool> insert( value_type&& v); // C++17 1333e519524SHoward Hinnant template <class P> 1343e519524SHoward Hinnant pair<iterator, bool> insert(P&& p); 1353e519524SHoward Hinnant iterator insert(const_iterator position, const value_type& v); 136afc9ff99SMarshall Clow iterator insert(const_iterator position, value_type&& v); // C++17 1373e519524SHoward Hinnant template <class P> 1383e519524SHoward Hinnant iterator insert(const_iterator position, P&& p); 1393e519524SHoward Hinnant template <class InputIterator> 1403e519524SHoward Hinnant void insert(InputIterator first, InputIterator last); 1413e519524SHoward Hinnant void insert(initializer_list<value_type> il); 1423e519524SHoward Hinnant 143b0386a51SErik Pilkington node_type extract(const_iterator position); // C++17 144b0386a51SErik Pilkington node_type extract(const key_type& x); // C++17 145b0386a51SErik Pilkington insert_return_type insert(node_type&& nh); // C++17 146b0386a51SErik Pilkington iterator insert(const_iterator hint, node_type&& nh); // C++17 147b0386a51SErik Pilkington 1488aaf517dSMarshall Clow template <class... Args> 1498aaf517dSMarshall Clow pair<iterator, bool> try_emplace(const key_type& k, Args&&... args); // C++17 1508aaf517dSMarshall Clow template <class... Args> 1518aaf517dSMarshall Clow pair<iterator, bool> try_emplace(key_type&& k, Args&&... args); // C++17 1528aaf517dSMarshall Clow template <class... Args> 1538aaf517dSMarshall Clow iterator try_emplace(const_iterator hint, const key_type& k, Args&&... args); // C++17 1548aaf517dSMarshall Clow template <class... Args> 1558aaf517dSMarshall Clow iterator try_emplace(const_iterator hint, key_type&& k, Args&&... args); // C++17 1568aaf517dSMarshall Clow template <class M> 1578aaf517dSMarshall Clow pair<iterator, bool> insert_or_assign(const key_type& k, M&& obj); // C++17 1588aaf517dSMarshall Clow template <class M> 1598aaf517dSMarshall Clow pair<iterator, bool> insert_or_assign(key_type&& k, M&& obj); // C++17 1608aaf517dSMarshall Clow template <class M> 1618aaf517dSMarshall Clow iterator insert_or_assign(const_iterator hint, const key_type& k, M&& obj); // C++17 1628aaf517dSMarshall Clow template <class M> 1638aaf517dSMarshall Clow iterator insert_or_assign(const_iterator hint, key_type&& k, M&& obj); // C++17 1648aaf517dSMarshall Clow 1653e519524SHoward Hinnant iterator erase(const_iterator position); 166ec392968SMarshall Clow iterator erase(iterator position); // C++14 1673e519524SHoward Hinnant size_type erase(const key_type& k); 1683e519524SHoward Hinnant iterator erase(const_iterator first, const_iterator last); 1690e9f71c1SHoward Hinnant void clear() noexcept; 1703e519524SHoward Hinnant 1715c4e07aeSErik Pilkington template<class C2> 1725c4e07aeSErik Pilkington void merge(map<Key, T, C2, Allocator>& source); // C++17 1735c4e07aeSErik Pilkington template<class C2> 1745c4e07aeSErik Pilkington void merge(map<Key, T, C2, Allocator>&& source); // C++17 1755c4e07aeSErik Pilkington template<class C2> 1765c4e07aeSErik Pilkington void merge(multimap<Key, T, C2, Allocator>& source); // C++17 1775c4e07aeSErik Pilkington template<class C2> 1785c4e07aeSErik Pilkington void merge(multimap<Key, T, C2, Allocator>&& source); // C++17 1795c4e07aeSErik Pilkington 1801052ee39SHoward Hinnant void swap(map& m) 181e3fbe143SMarshall Clow noexcept(allocator_traits<allocator_type>::is_always_equal::value && 182f07dd8d0SEric Fiselier is_nothrow_swappable<key_compare>::value); // C++17 1833e519524SHoward Hinnant 1843e519524SHoward Hinnant // observers: 1850e9f71c1SHoward Hinnant allocator_type get_allocator() const noexcept; 1863e519524SHoward Hinnant key_compare key_comp() const; 1873e519524SHoward Hinnant value_compare value_comp() const; 1883e519524SHoward Hinnant 1893e519524SHoward Hinnant // map operations: 1903e519524SHoward Hinnant iterator find(const key_type& k); 1913e519524SHoward Hinnant const_iterator find(const key_type& k) const; 1922585835cSMarshall Clow template<typename K> 1932585835cSMarshall Clow iterator find(const K& x); // C++14 1942585835cSMarshall Clow template<typename K> 1952585835cSMarshall Clow const_iterator find(const K& x) const; // C++14 1963fca07d7SMarek Kurdej 1972585835cSMarshall Clow template<typename K> 1980aacbc92SMarshall Clow size_type count(const K& x) const; // C++14 1993e519524SHoward Hinnant size_type count(const key_type& k) const; 2003fca07d7SMarek Kurdej 201a17b1aedSZoe Carver bool contains(const key_type& x) const; // C++20 2023fca07d7SMarek Kurdej template<class K> bool contains(const K& x) const; // C++20 2033fca07d7SMarek Kurdej 2043e519524SHoward Hinnant iterator lower_bound(const key_type& k); 2053e519524SHoward Hinnant const_iterator lower_bound(const key_type& k) const; 2062585835cSMarshall Clow template<typename K> 2072585835cSMarshall Clow iterator lower_bound(const K& x); // C++14 2082585835cSMarshall Clow template<typename K> 2092585835cSMarshall Clow const_iterator lower_bound(const K& x) const; // C++14 2102585835cSMarshall Clow 2113e519524SHoward Hinnant iterator upper_bound(const key_type& k); 2123e519524SHoward Hinnant const_iterator upper_bound(const key_type& k) const; 2132585835cSMarshall Clow template<typename K> 2142585835cSMarshall Clow iterator upper_bound(const K& x); // C++14 2152585835cSMarshall Clow template<typename K> 2162585835cSMarshall Clow const_iterator upper_bound(const K& x) const; // C++14 2172585835cSMarshall Clow 2183e519524SHoward Hinnant pair<iterator,iterator> equal_range(const key_type& k); 2193e519524SHoward Hinnant pair<const_iterator,const_iterator> equal_range(const key_type& k) const; 2202585835cSMarshall Clow template<typename K> 2212585835cSMarshall Clow pair<iterator,iterator> equal_range(const K& x); // C++14 2222585835cSMarshall Clow template<typename K> 2232585835cSMarshall Clow pair<const_iterator,const_iterator> equal_range(const K& x) const; // C++14 2243e519524SHoward Hinnant}; 2253e519524SHoward Hinnant 2263e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator> 2273e519524SHoward Hinnantbool 2283e519524SHoward Hinnantoperator==(const map<Key, T, Compare, Allocator>& x, 2293e519524SHoward Hinnant const map<Key, T, Compare, Allocator>& y); 2303e519524SHoward Hinnant 2313e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator> 2323e519524SHoward Hinnantbool 2333e519524SHoward Hinnantoperator< (const map<Key, T, Compare, Allocator>& x, 2343e519524SHoward Hinnant const map<Key, T, Compare, Allocator>& y); 2353e519524SHoward Hinnant 2363e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator> 2373e519524SHoward Hinnantbool 2383e519524SHoward Hinnantoperator!=(const map<Key, T, Compare, Allocator>& x, 2393e519524SHoward Hinnant const map<Key, T, Compare, Allocator>& y); 2403e519524SHoward Hinnant 2413e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator> 2423e519524SHoward Hinnantbool 2433e519524SHoward Hinnantoperator> (const map<Key, T, Compare, Allocator>& x, 2443e519524SHoward Hinnant const map<Key, T, Compare, Allocator>& y); 2453e519524SHoward Hinnant 2463e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator> 2473e519524SHoward Hinnantbool 2483e519524SHoward Hinnantoperator>=(const map<Key, T, Compare, Allocator>& x, 2493e519524SHoward Hinnant const map<Key, T, Compare, Allocator>& y); 2503e519524SHoward Hinnant 2513e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator> 2523e519524SHoward Hinnantbool 2533e519524SHoward Hinnantoperator<=(const map<Key, T, Compare, Allocator>& x, 2543e519524SHoward Hinnant const map<Key, T, Compare, Allocator>& y); 2553e519524SHoward Hinnant 2563e519524SHoward Hinnant// specialized algorithms: 2573e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator> 2583e519524SHoward Hinnantvoid 2591052ee39SHoward Hinnantswap(map<Key, T, Compare, Allocator>& x, map<Key, T, Compare, Allocator>& y) 2601052ee39SHoward Hinnant noexcept(noexcept(x.swap(y))); 2613e519524SHoward Hinnant 262f60c63c0SMarshall Clowtemplate <class Key, class T, class Compare, class Allocator, class Predicate> 2633e895085SMarek Kurdejtypename map<Key, T, Compare, Allocator>::size_type 2643e895085SMarek Kurdejerase_if(map<Key, T, Compare, Allocator>& c, Predicate pred); // C++20 265f60c63c0SMarshall Clow 266f60c63c0SMarshall Clow 2673e519524SHoward Hinnanttemplate <class Key, class T, class Compare = less<Key>, 2683e519524SHoward Hinnant class Allocator = allocator<pair<const Key, T>>> 2693e519524SHoward Hinnantclass multimap 2703e519524SHoward Hinnant{ 2713e519524SHoward Hinnantpublic: 2723e519524SHoward Hinnant // types: 2733e519524SHoward Hinnant typedef Key key_type; 2743e519524SHoward Hinnant typedef T mapped_type; 2753e519524SHoward Hinnant typedef pair<const key_type,mapped_type> value_type; 2763e519524SHoward Hinnant typedef Compare key_compare; 2773e519524SHoward Hinnant typedef Allocator allocator_type; 2783e519524SHoward Hinnant typedef typename allocator_type::reference reference; 2793e519524SHoward Hinnant typedef typename allocator_type::const_reference const_reference; 2803e519524SHoward Hinnant typedef typename allocator_type::size_type size_type; 2813e519524SHoward Hinnant typedef typename allocator_type::difference_type difference_type; 2823e519524SHoward Hinnant typedef typename allocator_type::pointer pointer; 2833e519524SHoward Hinnant typedef typename allocator_type::const_pointer const_pointer; 2843e519524SHoward Hinnant 2853e519524SHoward Hinnant typedef implementation-defined iterator; 2863e519524SHoward Hinnant typedef implementation-defined const_iterator; 2873e519524SHoward Hinnant typedef std::reverse_iterator<iterator> reverse_iterator; 2883e519524SHoward Hinnant typedef std::reverse_iterator<const_iterator> const_reverse_iterator; 289b0386a51SErik Pilkington typedef unspecified node_type; // C++17 2903e519524SHoward Hinnant 2913e519524SHoward Hinnant class value_compare 2923e519524SHoward Hinnant { 2933e519524SHoward Hinnant friend class multimap; 2943e519524SHoward Hinnant protected: 2953e519524SHoward Hinnant key_compare comp; 2963e519524SHoward Hinnant value_compare(key_compare c); 2973e519524SHoward Hinnant public: 298dc066888SArthur O'Dwyer typedef bool result_type; // deprecated in C++17, removed in C++20 299dc066888SArthur O'Dwyer typedef value_type first_argument_type; // deprecated in C++17, removed in C++20 300dc066888SArthur O'Dwyer typedef value_type second_argument_type; // deprecated in C++17, removed in C++20 3013e519524SHoward Hinnant bool operator()(const value_type& x, const value_type& y) const; 3023e519524SHoward Hinnant }; 3033e519524SHoward Hinnant 3043e519524SHoward Hinnant // construct/copy/destroy: 3051052ee39SHoward Hinnant multimap() 3061052ee39SHoward Hinnant noexcept( 3071052ee39SHoward Hinnant is_nothrow_default_constructible<allocator_type>::value && 3081052ee39SHoward Hinnant is_nothrow_default_constructible<key_compare>::value && 3091052ee39SHoward Hinnant is_nothrow_copy_constructible<key_compare>::value); 3101052ee39SHoward Hinnant explicit multimap(const key_compare& comp); 3113e519524SHoward Hinnant multimap(const key_compare& comp, const allocator_type& a); 3123e519524SHoward Hinnant template <class InputIterator> 3133e519524SHoward Hinnant multimap(InputIterator first, InputIterator last, const key_compare& comp); 3143e519524SHoward Hinnant template <class InputIterator> 3153e519524SHoward Hinnant multimap(InputIterator first, InputIterator last, const key_compare& comp, 3163e519524SHoward Hinnant const allocator_type& a); 3173e519524SHoward Hinnant multimap(const multimap& m); 3181052ee39SHoward Hinnant multimap(multimap&& m) 3191052ee39SHoward Hinnant noexcept( 3201052ee39SHoward Hinnant is_nothrow_move_constructible<allocator_type>::value && 3211052ee39SHoward Hinnant is_nothrow_move_constructible<key_compare>::value); 3223e519524SHoward Hinnant explicit multimap(const allocator_type& a); 3233e519524SHoward Hinnant multimap(const multimap& m, const allocator_type& a); 3243e519524SHoward Hinnant multimap(multimap&& m, const allocator_type& a); 3253e519524SHoward Hinnant multimap(initializer_list<value_type> il, const key_compare& comp = key_compare()); 3263e519524SHoward Hinnant multimap(initializer_list<value_type> il, const key_compare& comp, 3273e519524SHoward Hinnant const allocator_type& a); 328fbc317d4SMarshall Clow template <class InputIterator> 329fbc317d4SMarshall Clow multimap(InputIterator first, InputIterator last, const allocator_type& a) 330fbc317d4SMarshall Clow : multimap(first, last, Compare(), a) {} // C++14 331fbc317d4SMarshall Clow multimap(initializer_list<value_type> il, const allocator_type& a) 332fbc317d4SMarshall Clow : multimap(il, Compare(), a) {} // C++14 3333e519524SHoward Hinnant ~multimap(); 3343e519524SHoward Hinnant 3353e519524SHoward Hinnant multimap& operator=(const multimap& m); 3361052ee39SHoward Hinnant multimap& operator=(multimap&& m) 3371052ee39SHoward Hinnant noexcept( 3381052ee39SHoward Hinnant allocator_type::propagate_on_container_move_assignment::value && 3391052ee39SHoward Hinnant is_nothrow_move_assignable<allocator_type>::value && 3400e9f71c1SHoward Hinnant is_nothrow_move_assignable<key_compare>::value); 3413e519524SHoward Hinnant multimap& operator=(initializer_list<value_type> il); 3423e519524SHoward Hinnant 3433e519524SHoward Hinnant // iterators: 3440e9f71c1SHoward Hinnant iterator begin() noexcept; 3450e9f71c1SHoward Hinnant const_iterator begin() const noexcept; 3460e9f71c1SHoward Hinnant iterator end() noexcept; 3470e9f71c1SHoward Hinnant const_iterator end() const noexcept; 3483e519524SHoward Hinnant 3490e9f71c1SHoward Hinnant reverse_iterator rbegin() noexcept; 3500e9f71c1SHoward Hinnant const_reverse_iterator rbegin() const noexcept; 3510e9f71c1SHoward Hinnant reverse_iterator rend() noexcept; 3520e9f71c1SHoward Hinnant const_reverse_iterator rend() const noexcept; 3533e519524SHoward Hinnant 3540e9f71c1SHoward Hinnant const_iterator cbegin() const noexcept; 3550e9f71c1SHoward Hinnant const_iterator cend() const noexcept; 3560e9f71c1SHoward Hinnant const_reverse_iterator crbegin() const noexcept; 3570e9f71c1SHoward Hinnant const_reverse_iterator crend() const noexcept; 3583e519524SHoward Hinnant 3593e519524SHoward Hinnant // capacity: 3600e9f71c1SHoward Hinnant bool empty() const noexcept; 3610e9f71c1SHoward Hinnant size_type size() const noexcept; 3620e9f71c1SHoward Hinnant size_type max_size() const noexcept; 3633e519524SHoward Hinnant 3643e519524SHoward Hinnant // modifiers: 3653e519524SHoward Hinnant template <class... Args> 3663e519524SHoward Hinnant iterator emplace(Args&&... args); 3673e519524SHoward Hinnant template <class... Args> 3683e519524SHoward Hinnant iterator emplace_hint(const_iterator position, Args&&... args); 3693e519524SHoward Hinnant iterator insert(const value_type& v); 370afc9ff99SMarshall Clow iterator insert( value_type&& v); // C++17 3713e519524SHoward Hinnant template <class P> 3723e519524SHoward Hinnant iterator insert(P&& p); 3733e519524SHoward Hinnant iterator insert(const_iterator position, const value_type& v); 374afc9ff99SMarshall Clow iterator insert(const_iterator position, value_type&& v); // C++17 3753e519524SHoward Hinnant template <class P> 3763e519524SHoward Hinnant iterator insert(const_iterator position, P&& p); 3773e519524SHoward Hinnant template <class InputIterator> 3783e519524SHoward Hinnant void insert(InputIterator first, InputIterator last); 3793e519524SHoward Hinnant void insert(initializer_list<value_type> il); 3803e519524SHoward Hinnant 381b0386a51SErik Pilkington node_type extract(const_iterator position); // C++17 382b0386a51SErik Pilkington node_type extract(const key_type& x); // C++17 383b0386a51SErik Pilkington iterator insert(node_type&& nh); // C++17 384b0386a51SErik Pilkington iterator insert(const_iterator hint, node_type&& nh); // C++17 385b0386a51SErik Pilkington 3863e519524SHoward Hinnant iterator erase(const_iterator position); 387ec392968SMarshall Clow iterator erase(iterator position); // C++14 3883e519524SHoward Hinnant size_type erase(const key_type& k); 3893e519524SHoward Hinnant iterator erase(const_iterator first, const_iterator last); 3900e9f71c1SHoward Hinnant void clear() noexcept; 3913e519524SHoward Hinnant 3925c4e07aeSErik Pilkington template<class C2> 3935c4e07aeSErik Pilkington void merge(multimap<Key, T, C2, Allocator>& source); // C++17 3945c4e07aeSErik Pilkington template<class C2> 3955c4e07aeSErik Pilkington void merge(multimap<Key, T, C2, Allocator>&& source); // C++17 3965c4e07aeSErik Pilkington template<class C2> 3975c4e07aeSErik Pilkington void merge(map<Key, T, C2, Allocator>& source); // C++17 3985c4e07aeSErik Pilkington template<class C2> 3995c4e07aeSErik Pilkington void merge(map<Key, T, C2, Allocator>&& source); // C++17 4005c4e07aeSErik Pilkington 4011052ee39SHoward Hinnant void swap(multimap& m) 402e3fbe143SMarshall Clow noexcept(allocator_traits<allocator_type>::is_always_equal::value && 403f07dd8d0SEric Fiselier is_nothrow_swappable<key_compare>::value); // C++17 4043e519524SHoward Hinnant 4053e519524SHoward Hinnant // observers: 4060e9f71c1SHoward Hinnant allocator_type get_allocator() const noexcept; 4073e519524SHoward Hinnant key_compare key_comp() const; 4083e519524SHoward Hinnant value_compare value_comp() const; 4093e519524SHoward Hinnant 4103e519524SHoward Hinnant // map operations: 4113e519524SHoward Hinnant iterator find(const key_type& k); 4123e519524SHoward Hinnant const_iterator find(const key_type& k) const; 4132585835cSMarshall Clow template<typename K> 4142585835cSMarshall Clow iterator find(const K& x); // C++14 4152585835cSMarshall Clow template<typename K> 4162585835cSMarshall Clow const_iterator find(const K& x) const; // C++14 4173fca07d7SMarek Kurdej 4182585835cSMarshall Clow template<typename K> 4190aacbc92SMarshall Clow size_type count(const K& x) const; // C++14 4203e519524SHoward Hinnant size_type count(const key_type& k) const; 4213fca07d7SMarek Kurdej 422a17b1aedSZoe Carver bool contains(const key_type& x) const; // C++20 4233fca07d7SMarek Kurdej template<class K> bool contains(const K& x) const; // C++20 4243fca07d7SMarek Kurdej 4253e519524SHoward Hinnant iterator lower_bound(const key_type& k); 4263e519524SHoward Hinnant const_iterator lower_bound(const key_type& k) const; 4272585835cSMarshall Clow template<typename K> 4282585835cSMarshall Clow iterator lower_bound(const K& x); // C++14 4292585835cSMarshall Clow template<typename K> 4302585835cSMarshall Clow const_iterator lower_bound(const K& x) const; // C++14 4312585835cSMarshall Clow 4323e519524SHoward Hinnant iterator upper_bound(const key_type& k); 4333e519524SHoward Hinnant const_iterator upper_bound(const key_type& k) const; 4342585835cSMarshall Clow template<typename K> 4352585835cSMarshall Clow iterator upper_bound(const K& x); // C++14 4362585835cSMarshall Clow template<typename K> 4372585835cSMarshall Clow const_iterator upper_bound(const K& x) const; // C++14 4382585835cSMarshall Clow 4393e519524SHoward Hinnant pair<iterator,iterator> equal_range(const key_type& k); 4403e519524SHoward Hinnant pair<const_iterator,const_iterator> equal_range(const key_type& k) const; 4412585835cSMarshall Clow template<typename K> 4422585835cSMarshall Clow pair<iterator,iterator> equal_range(const K& x); // C++14 4432585835cSMarshall Clow template<typename K> 4442585835cSMarshall Clow pair<const_iterator,const_iterator> equal_range(const K& x) const; // C++14 4453e519524SHoward Hinnant}; 4463e519524SHoward Hinnant 4473e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator> 4483e519524SHoward Hinnantbool 4493e519524SHoward Hinnantoperator==(const multimap<Key, T, Compare, Allocator>& x, 4503e519524SHoward Hinnant const multimap<Key, T, Compare, Allocator>& y); 4513e519524SHoward Hinnant 4523e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator> 4533e519524SHoward Hinnantbool 4543e519524SHoward Hinnantoperator< (const multimap<Key, T, Compare, Allocator>& x, 4553e519524SHoward Hinnant const multimap<Key, T, Compare, Allocator>& y); 4563e519524SHoward Hinnant 4573e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator> 4583e519524SHoward Hinnantbool 4593e519524SHoward Hinnantoperator!=(const multimap<Key, T, Compare, Allocator>& x, 4603e519524SHoward Hinnant const multimap<Key, T, Compare, Allocator>& y); 4613e519524SHoward Hinnant 4623e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator> 4633e519524SHoward Hinnantbool 4643e519524SHoward Hinnantoperator> (const multimap<Key, T, Compare, Allocator>& x, 4653e519524SHoward Hinnant const multimap<Key, T, Compare, Allocator>& y); 4663e519524SHoward Hinnant 4673e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator> 4683e519524SHoward Hinnantbool 4693e519524SHoward Hinnantoperator>=(const multimap<Key, T, Compare, Allocator>& x, 4703e519524SHoward Hinnant const multimap<Key, T, Compare, Allocator>& y); 4713e519524SHoward Hinnant 4723e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator> 4733e519524SHoward Hinnantbool 4743e519524SHoward Hinnantoperator<=(const multimap<Key, T, Compare, Allocator>& x, 4753e519524SHoward Hinnant const multimap<Key, T, Compare, Allocator>& y); 4763e519524SHoward Hinnant 4773e519524SHoward Hinnant// specialized algorithms: 4783e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator> 4793e519524SHoward Hinnantvoid 4803e519524SHoward Hinnantswap(multimap<Key, T, Compare, Allocator>& x, 4811052ee39SHoward Hinnant multimap<Key, T, Compare, Allocator>& y) 4821052ee39SHoward Hinnant noexcept(noexcept(x.swap(y))); 4833e519524SHoward Hinnant 484f60c63c0SMarshall Clowtemplate <class Key, class T, class Compare, class Allocator, class Predicate> 4853e895085SMarek Kurdejtypename multimap<Key, T, Compare, Allocator>::size_type 4863e895085SMarek Kurdejerase_if(multimap<Key, T, Compare, Allocator>& c, Predicate pred); // C++20 487f60c63c0SMarshall Clow 4883e519524SHoward Hinnant} // std 4893e519524SHoward Hinnant 4903e519524SHoward Hinnant*/ 4913e519524SHoward Hinnant 4923e519524SHoward Hinnant#include <__config> 49306b40e80SArthur O'Dwyer#include <__debug> 494050b064fSChristopher Di Bella#include <__functional/is_transparent.h> 495b0386a51SErik Pilkington#include <__node_handle> 49606b40e80SArthur O'Dwyer#include <__tree> 4976adbc83eSChristopher Di Bella#include <__utility/forward.h> 4982d0f1fa4SArthur O'Dwyer#include <compare> 499bfbd73f8SArthur O'Dwyer#include <functional> 5002d0f1fa4SArthur O'Dwyer#include <initializer_list> 5012ac6babcSArthur O'Dwyer#include <iterator> // __libcpp_erase_if_container 5023e519524SHoward Hinnant#include <memory> 503ee187e24SEric Fiselier#include <type_traits> 504bfbd73f8SArthur O'Dwyer#include <utility> 505f56972e2SMarshall Clow#include <version> 5063e519524SHoward Hinnant 507073458b1SHoward Hinnant#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 5083e519524SHoward Hinnant#pragma GCC system_header 509073458b1SHoward Hinnant#endif 5103e519524SHoward Hinnant 5113e519524SHoward Hinnant_LIBCPP_BEGIN_NAMESPACE_STD 5123e519524SHoward Hinnant 5133560fbf3SLouis Dionnetemplate <class _Key, class _CP, class _Compare, 5143560fbf3SLouis Dionne bool = is_empty<_Compare>::value && !__libcpp_is_final<_Compare>::value> 5153e519524SHoward Hinnantclass __map_value_compare 5163e519524SHoward Hinnant : private _Compare 5173e519524SHoward Hinnant{ 5183e519524SHoward Hinnantpublic: 519848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 5201052ee39SHoward Hinnant __map_value_compare() 5211052ee39SHoward Hinnant _NOEXCEPT_(is_nothrow_default_constructible<_Compare>::value) 5221052ee39SHoward Hinnant : _Compare() {} 523848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 5241052ee39SHoward Hinnant __map_value_compare(_Compare c) 5251052ee39SHoward Hinnant _NOEXCEPT_(is_nothrow_copy_constructible<_Compare>::value) 5261052ee39SHoward Hinnant : _Compare(c) {} 527848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 5281052ee39SHoward Hinnant const _Compare& key_comp() const _NOEXCEPT {return *this;} 529848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 5303e519524SHoward Hinnant bool operator()(const _CP& __x, const _CP& __y) const 531f52318b4SErik Pilkington {return static_cast<const _Compare&>(*this)(__x.__get_value().first, __y.__get_value().first);} 532848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 5333e519524SHoward Hinnant bool operator()(const _CP& __x, const _Key& __y) const 534f52318b4SErik Pilkington {return static_cast<const _Compare&>(*this)(__x.__get_value().first, __y);} 535848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 5363e519524SHoward Hinnant bool operator()(const _Key& __x, const _CP& __y) const 537f52318b4SErik Pilkington {return static_cast<const _Compare&>(*this)(__x, __y.__get_value().first);} 538e3fbe143SMarshall Clow void swap(__map_value_compare& __y) 539e3fbe143SMarshall Clow _NOEXCEPT_(__is_nothrow_swappable<_Compare>::value) 540e3fbe143SMarshall Clow { 541e3fbe143SMarshall Clow using _VSTD::swap; 542e1ec2986SEric Fiselier swap(static_cast<_Compare&>(*this), static_cast<_Compare&>(__y)); 543e3fbe143SMarshall Clow } 5442585835cSMarshall Clow 5452585835cSMarshall Clow#if _LIBCPP_STD_VER > 11 5462585835cSMarshall Clow template <typename _K2> 5472585835cSMarshall Clow _LIBCPP_INLINE_VISIBILITY 5482585835cSMarshall Clow typename enable_if<__is_transparent<_Compare, _K2>::value, bool>::type 5492585835cSMarshall Clow operator () ( const _K2& __x, const _CP& __y ) const 550f52318b4SErik Pilkington {return static_cast<const _Compare&>(*this) (__x, __y.__get_value().first);} 5512585835cSMarshall Clow 5522585835cSMarshall Clow template <typename _K2> 5532585835cSMarshall Clow _LIBCPP_INLINE_VISIBILITY 5542585835cSMarshall Clow typename enable_if<__is_transparent<_Compare, _K2>::value, bool>::type 5552585835cSMarshall Clow operator () (const _CP& __x, const _K2& __y) const 556f52318b4SErik Pilkington {return static_cast<const _Compare&>(*this) (__x.__get_value().first, __y);} 5572585835cSMarshall Clow#endif 5583e519524SHoward Hinnant}; 5593e519524SHoward Hinnant 560abb160e6SHoward Hinnanttemplate <class _Key, class _CP, class _Compare> 561abb160e6SHoward Hinnantclass __map_value_compare<_Key, _CP, _Compare, false> 5623e519524SHoward Hinnant{ 5633e519524SHoward Hinnant _Compare comp; 5643e519524SHoward Hinnant 5653e519524SHoward Hinnantpublic: 566848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 5671052ee39SHoward Hinnant __map_value_compare() 5681052ee39SHoward Hinnant _NOEXCEPT_(is_nothrow_default_constructible<_Compare>::value) 5691052ee39SHoward Hinnant : comp() {} 570848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 5711052ee39SHoward Hinnant __map_value_compare(_Compare c) 5721052ee39SHoward Hinnant _NOEXCEPT_(is_nothrow_copy_constructible<_Compare>::value) 5731052ee39SHoward Hinnant : comp(c) {} 574848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 5751052ee39SHoward Hinnant const _Compare& key_comp() const _NOEXCEPT {return comp;} 5763e519524SHoward Hinnant 577848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 5783e519524SHoward Hinnant bool operator()(const _CP& __x, const _CP& __y) const 579f52318b4SErik Pilkington {return comp(__x.__get_value().first, __y.__get_value().first);} 580848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 5813e519524SHoward Hinnant bool operator()(const _CP& __x, const _Key& __y) const 582f52318b4SErik Pilkington {return comp(__x.__get_value().first, __y);} 583848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 5843e519524SHoward Hinnant bool operator()(const _Key& __x, const _CP& __y) const 585f52318b4SErik Pilkington {return comp(__x, __y.__get_value().first);} 586e3fbe143SMarshall Clow void swap(__map_value_compare& __y) 587e3fbe143SMarshall Clow _NOEXCEPT_(__is_nothrow_swappable<_Compare>::value) 588e3fbe143SMarshall Clow { 589e3fbe143SMarshall Clow using _VSTD::swap; 590e3fbe143SMarshall Clow swap(comp, __y.comp); 591e3fbe143SMarshall Clow } 5922585835cSMarshall Clow 5932585835cSMarshall Clow#if _LIBCPP_STD_VER > 11 5942585835cSMarshall Clow template <typename _K2> 5952585835cSMarshall Clow _LIBCPP_INLINE_VISIBILITY 5962585835cSMarshall Clow typename enable_if<__is_transparent<_Compare, _K2>::value, bool>::type 5972585835cSMarshall Clow operator () ( const _K2& __x, const _CP& __y ) const 598f52318b4SErik Pilkington {return comp (__x, __y.__get_value().first);} 5992585835cSMarshall Clow 6002585835cSMarshall Clow template <typename _K2> 6012585835cSMarshall Clow _LIBCPP_INLINE_VISIBILITY 6022585835cSMarshall Clow typename enable_if<__is_transparent<_Compare, _K2>::value, bool>::type 6032585835cSMarshall Clow operator () (const _CP& __x, const _K2& __y) const 604f52318b4SErik Pilkington {return comp (__x.__get_value().first, __y);} 6052585835cSMarshall Clow#endif 6063e519524SHoward Hinnant}; 6073e519524SHoward Hinnant 608e3fbe143SMarshall Clowtemplate <class _Key, class _CP, class _Compare, bool __b> 609e3fbe143SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY 610e3fbe143SMarshall Clowvoid 611e3fbe143SMarshall Clowswap(__map_value_compare<_Key, _CP, _Compare, __b>& __x, 612e3fbe143SMarshall Clow __map_value_compare<_Key, _CP, _Compare, __b>& __y) 613e3fbe143SMarshall Clow _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y))) 614e3fbe143SMarshall Clow{ 615e3fbe143SMarshall Clow __x.swap(__y); 616e3fbe143SMarshall Clow} 617e3fbe143SMarshall Clow 6183e519524SHoward Hinnanttemplate <class _Allocator> 6193e519524SHoward Hinnantclass __map_node_destructor 6203e519524SHoward Hinnant{ 6213e519524SHoward Hinnant typedef _Allocator allocator_type; 6223e519524SHoward Hinnant typedef allocator_traits<allocator_type> __alloc_traits; 623089a7cc5SEric Fiselier 6243e519524SHoward Hinnantpublic: 6253e519524SHoward Hinnant typedef typename __alloc_traits::pointer pointer; 6263e519524SHoward Hinnant 627089a7cc5SEric Fiselierprivate: 6283e519524SHoward Hinnant allocator_type& __na_; 6293e519524SHoward Hinnant 6303e519524SHoward Hinnant __map_node_destructor& operator=(const __map_node_destructor&); 6313e519524SHoward Hinnant 6323e519524SHoward Hinnantpublic: 6333e519524SHoward Hinnant bool __first_constructed; 6343e519524SHoward Hinnant bool __second_constructed; 6353e519524SHoward Hinnant 636848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 6371052ee39SHoward Hinnant explicit __map_node_destructor(allocator_type& __na) _NOEXCEPT 6383e519524SHoward Hinnant : __na_(__na), 6393e519524SHoward Hinnant __first_constructed(false), 6403e519524SHoward Hinnant __second_constructed(false) 6413e519524SHoward Hinnant {} 6423e519524SHoward Hinnant 64318293116SEric Fiselier#ifndef _LIBCPP_CXX03_LANG 644848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 6451052ee39SHoward Hinnant __map_node_destructor(__tree_node_destructor<allocator_type>&& __x) _NOEXCEPT 6463e519524SHoward Hinnant : __na_(__x.__na_), 6473e519524SHoward Hinnant __first_constructed(__x.__value_constructed), 6483e519524SHoward Hinnant __second_constructed(__x.__value_constructed) 6493e519524SHoward Hinnant { 6503e519524SHoward Hinnant __x.__value_constructed = false; 6513e519524SHoward Hinnant } 65218293116SEric Fiselier#endif // _LIBCPP_CXX03_LANG 6533e519524SHoward Hinnant 654848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 6551052ee39SHoward Hinnant void operator()(pointer __p) _NOEXCEPT 6563e519524SHoward Hinnant { 6573e519524SHoward Hinnant if (__second_constructed) 658f52318b4SErik Pilkington __alloc_traits::destroy(__na_, _VSTD::addressof(__p->__value_.__get_value().second)); 6593e519524SHoward Hinnant if (__first_constructed) 660f52318b4SErik Pilkington __alloc_traits::destroy(__na_, _VSTD::addressof(__p->__value_.__get_value().first)); 6613e519524SHoward Hinnant if (__p) 6623e519524SHoward Hinnant __alloc_traits::deallocate(__na_, __p, 1); 6633e519524SHoward Hinnant } 6643e519524SHoward Hinnant}; 6653e519524SHoward Hinnant 666ce53420eSHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 667ce53420eSHoward Hinnant class map; 668ce53420eSHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 669ce53420eSHoward Hinnant class multimap; 670ce53420eSHoward Hinnanttemplate <class _TreeIterator> class __map_const_iterator; 6713e519524SHoward Hinnant 672089a7cc5SEric Fiselier#ifndef _LIBCPP_CXX03_LANG 6739fd9f84fSHoward Hinnant 6749fd9f84fSHoward Hinnanttemplate <class _Key, class _Tp> 6757c2f5827SAmy Huangstruct _LIBCPP_STANDALONE_DEBUG __value_type 6769fd9f84fSHoward Hinnant{ 6779fd9f84fSHoward Hinnant typedef _Key key_type; 6789fd9f84fSHoward Hinnant typedef _Tp mapped_type; 6799fd9f84fSHoward Hinnant typedef pair<const key_type, mapped_type> value_type; 680f52318b4SErik Pilkington typedef pair<key_type&, mapped_type&> __nc_ref_pair_type; 681f52318b4SErik Pilkington typedef pair<key_type&&, mapped_type&&> __nc_rref_pair_type; 6829fd9f84fSHoward Hinnant 683f52318b4SErik Pilkingtonprivate: 6849fd9f84fSHoward Hinnant value_type __cc; 685f52318b4SErik Pilkington 686f52318b4SErik Pilkingtonpublic: 687f52318b4SErik Pilkington _LIBCPP_INLINE_VISIBILITY 688f52318b4SErik Pilkington value_type& __get_value() 689f52318b4SErik Pilkington { 690f52318b4SErik Pilkington#if _LIBCPP_STD_VER > 14 691f52318b4SErik Pilkington return *_VSTD::launder(_VSTD::addressof(__cc)); 692f52318b4SErik Pilkington#else 693f52318b4SErik Pilkington return __cc; 694f52318b4SErik Pilkington#endif 695f52318b4SErik Pilkington } 696f52318b4SErik Pilkington 697f52318b4SErik Pilkington _LIBCPP_INLINE_VISIBILITY 698f52318b4SErik Pilkington const value_type& __get_value() const 699f52318b4SErik Pilkington { 700f52318b4SErik Pilkington#if _LIBCPP_STD_VER > 14 701f52318b4SErik Pilkington return *_VSTD::launder(_VSTD::addressof(__cc)); 702f52318b4SErik Pilkington#else 703f52318b4SErik Pilkington return __cc; 704f52318b4SErik Pilkington#endif 705f52318b4SErik Pilkington } 706f52318b4SErik Pilkington 707f52318b4SErik Pilkington _LIBCPP_INLINE_VISIBILITY 708f52318b4SErik Pilkington __nc_ref_pair_type __ref() 709f52318b4SErik Pilkington { 710f52318b4SErik Pilkington value_type& __v = __get_value(); 711f52318b4SErik Pilkington return __nc_ref_pair_type(const_cast<key_type&>(__v.first), __v.second); 712f52318b4SErik Pilkington } 713f52318b4SErik Pilkington 714f52318b4SErik Pilkington _LIBCPP_INLINE_VISIBILITY 715f52318b4SErik Pilkington __nc_rref_pair_type __move() 716f52318b4SErik Pilkington { 717f52318b4SErik Pilkington value_type& __v = __get_value(); 718f52318b4SErik Pilkington return __nc_rref_pair_type( 719f52318b4SErik Pilkington _VSTD::move(const_cast<key_type&>(__v.first)), 720f52318b4SErik Pilkington _VSTD::move(__v.second)); 721f52318b4SErik Pilkington } 7229fd9f84fSHoward Hinnant 7239fd9f84fSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 7249fd9f84fSHoward Hinnant __value_type& operator=(const __value_type& __v) 725f52318b4SErik Pilkington { 726f52318b4SErik Pilkington __ref() = __v.__get_value(); 727f52318b4SErik Pilkington return *this; 728f52318b4SErik Pilkington } 7299fd9f84fSHoward Hinnant 7309fd9f84fSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 7319fd9f84fSHoward Hinnant __value_type& operator=(__value_type&& __v) 732f52318b4SErik Pilkington { 733f52318b4SErik Pilkington __ref() = __v.__move(); 734f52318b4SErik Pilkington return *this; 735f52318b4SErik Pilkington } 7369fd9f84fSHoward Hinnant 7375e3ea4ddSEric Fiselier template <class _ValueTp, 7385e3ea4ddSEric Fiselier class = typename enable_if< 7395e3ea4ddSEric Fiselier __is_same_uncvref<_ValueTp, value_type>::value 7405e3ea4ddSEric Fiselier >::type 7415e3ea4ddSEric Fiselier > 7429fd9f84fSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 743f52318b4SErik Pilkington __value_type& operator=(_ValueTp&& __v) 744f52318b4SErik Pilkington { 745f52318b4SErik Pilkington __ref() = _VSTD::forward<_ValueTp>(__v); 746f52318b4SErik Pilkington return *this; 7475e3ea4ddSEric Fiselier } 7485e3ea4ddSEric Fiselier 7495e3ea4ddSEric Fiselierprivate: 7505e3ea4ddSEric Fiselier __value_type() _LIBCPP_EQUAL_DELETE; 7515e3ea4ddSEric Fiselier ~__value_type() _LIBCPP_EQUAL_DELETE; 7525e3ea4ddSEric Fiselier __value_type(const __value_type& __v) _LIBCPP_EQUAL_DELETE; 7535e3ea4ddSEric Fiselier __value_type(__value_type&& __v) _LIBCPP_EQUAL_DELETE; 7549fd9f84fSHoward Hinnant}; 7559fd9f84fSHoward Hinnant 7569fd9f84fSHoward Hinnant#else 7579fd9f84fSHoward Hinnant 7589fd9f84fSHoward Hinnanttemplate <class _Key, class _Tp> 7599fd9f84fSHoward Hinnantstruct __value_type 7609fd9f84fSHoward Hinnant{ 7619fd9f84fSHoward Hinnant typedef _Key key_type; 7629fd9f84fSHoward Hinnant typedef _Tp mapped_type; 7639fd9f84fSHoward Hinnant typedef pair<const key_type, mapped_type> value_type; 7649fd9f84fSHoward Hinnant 765f52318b4SErik Pilkingtonprivate: 7669fd9f84fSHoward Hinnant value_type __cc; 7679fd9f84fSHoward Hinnant 768f52318b4SErik Pilkingtonpublic: 769f52318b4SErik Pilkington _LIBCPP_INLINE_VISIBILITY 770f52318b4SErik Pilkington value_type& __get_value() { return __cc; } 771f52318b4SErik Pilkington _LIBCPP_INLINE_VISIBILITY 772f52318b4SErik Pilkington const value_type& __get_value() const { return __cc; } 773f52318b4SErik Pilkington 7745e3ea4ddSEric Fiselierprivate: 7755e3ea4ddSEric Fiselier __value_type(); 7765e3ea4ddSEric Fiselier __value_type(__value_type const&); 7775e3ea4ddSEric Fiselier __value_type& operator=(__value_type const&); 7785e3ea4ddSEric Fiselier ~__value_type(); 7799fd9f84fSHoward Hinnant}; 7809fd9f84fSHoward Hinnant 78118293116SEric Fiselier#endif // _LIBCPP_CXX03_LANG 7829fd9f84fSHoward Hinnant 783b3be398cSEric Fiseliertemplate <class _Tp> 784b3be398cSEric Fiselierstruct __extract_key_value_types; 785b3be398cSEric Fiselier 786b3be398cSEric Fiseliertemplate <class _Key, class _Tp> 787b3be398cSEric Fiselierstruct __extract_key_value_types<__value_type<_Key, _Tp> > 788b3be398cSEric Fiselier{ 789b3be398cSEric Fiselier typedef _Key const __key_type; 790b3be398cSEric Fiselier typedef _Tp __mapped_type; 791b3be398cSEric Fiselier}; 792b3be398cSEric Fiselier 7933e519524SHoward Hinnanttemplate <class _TreeIterator> 794e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS __map_iterator 7953e519524SHoward Hinnant{ 796089a7cc5SEric Fiselier typedef typename _TreeIterator::_NodeTypes _NodeTypes; 797089a7cc5SEric Fiselier typedef typename _TreeIterator::__pointer_traits __pointer_traits; 798089a7cc5SEric Fiselier 7993e519524SHoward Hinnant _TreeIterator __i_; 8003e519524SHoward Hinnant 8013e519524SHoward Hinnantpublic: 8023e519524SHoward Hinnant typedef bidirectional_iterator_tag iterator_category; 803089a7cc5SEric Fiselier typedef typename _NodeTypes::__map_value_type value_type; 8043e519524SHoward Hinnant typedef typename _TreeIterator::difference_type difference_type; 8053e519524SHoward Hinnant typedef value_type& reference; 806089a7cc5SEric Fiselier typedef typename _NodeTypes::__map_value_type_pointer pointer; 8073e519524SHoward Hinnant 808848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 8091052ee39SHoward Hinnant __map_iterator() _NOEXCEPT {} 8103e519524SHoward Hinnant 811848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 8121052ee39SHoward Hinnant __map_iterator(_TreeIterator __i) _NOEXCEPT : __i_(__i) {} 8133e519524SHoward Hinnant 814848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 815f52318b4SErik Pilkington reference operator*() const {return __i_->__get_value();} 816848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 817f52318b4SErik Pilkington pointer operator->() const {return pointer_traits<pointer>::pointer_to(__i_->__get_value());} 8183e519524SHoward Hinnant 819848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 8203e519524SHoward Hinnant __map_iterator& operator++() {++__i_; return *this;} 821848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 8223e519524SHoward Hinnant __map_iterator operator++(int) 8233e519524SHoward Hinnant { 8243e519524SHoward Hinnant __map_iterator __t(*this); 8253e519524SHoward Hinnant ++(*this); 8263e519524SHoward Hinnant return __t; 8273e519524SHoward Hinnant } 8283e519524SHoward Hinnant 829848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 8303e519524SHoward Hinnant __map_iterator& operator--() {--__i_; return *this;} 831848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 8323e519524SHoward Hinnant __map_iterator operator--(int) 8333e519524SHoward Hinnant { 8343e519524SHoward Hinnant __map_iterator __t(*this); 8353e519524SHoward Hinnant --(*this); 8363e519524SHoward Hinnant return __t; 8373e519524SHoward Hinnant } 8383e519524SHoward Hinnant 839848a5374SHoward Hinnant friend _LIBCPP_INLINE_VISIBILITY 840848a5374SHoward Hinnant bool operator==(const __map_iterator& __x, const __map_iterator& __y) 8413e519524SHoward Hinnant {return __x.__i_ == __y.__i_;} 842848a5374SHoward Hinnant friend 843848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 844848a5374SHoward Hinnant bool operator!=(const __map_iterator& __x, const __map_iterator& __y) 8453e519524SHoward Hinnant {return __x.__i_ != __y.__i_;} 8463e519524SHoward Hinnant 847e2f2d1edSEric Fiselier template <class, class, class, class> friend class _LIBCPP_TEMPLATE_VIS map; 848e2f2d1edSEric Fiselier template <class, class, class, class> friend class _LIBCPP_TEMPLATE_VIS multimap; 849e2f2d1edSEric Fiselier template <class> friend class _LIBCPP_TEMPLATE_VIS __map_const_iterator; 8503e519524SHoward Hinnant}; 8513e519524SHoward Hinnant 8523e519524SHoward Hinnanttemplate <class _TreeIterator> 853e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS __map_const_iterator 8543e519524SHoward Hinnant{ 855089a7cc5SEric Fiselier typedef typename _TreeIterator::_NodeTypes _NodeTypes; 856089a7cc5SEric Fiselier typedef typename _TreeIterator::__pointer_traits __pointer_traits; 857089a7cc5SEric Fiselier 8583e519524SHoward Hinnant _TreeIterator __i_; 8593e519524SHoward Hinnant 8603e519524SHoward Hinnantpublic: 8613e519524SHoward Hinnant typedef bidirectional_iterator_tag iterator_category; 862089a7cc5SEric Fiselier typedef typename _NodeTypes::__map_value_type value_type; 8633e519524SHoward Hinnant typedef typename _TreeIterator::difference_type difference_type; 8643e519524SHoward Hinnant typedef const value_type& reference; 865089a7cc5SEric Fiselier typedef typename _NodeTypes::__const_map_value_type_pointer pointer; 8663e519524SHoward Hinnant 867848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 8681052ee39SHoward Hinnant __map_const_iterator() _NOEXCEPT {} 8693e519524SHoward Hinnant 870848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 8711052ee39SHoward Hinnant __map_const_iterator(_TreeIterator __i) _NOEXCEPT : __i_(__i) {} 872848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 873b3be398cSEric Fiselier __map_const_iterator(__map_iterator< 874b3be398cSEric Fiselier typename _TreeIterator::__non_const_iterator> __i) _NOEXCEPT 8753e519524SHoward Hinnant : __i_(__i.__i_) {} 8763e519524SHoward Hinnant 877848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 878f52318b4SErik Pilkington reference operator*() const {return __i_->__get_value();} 879848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 880f52318b4SErik Pilkington pointer operator->() const {return pointer_traits<pointer>::pointer_to(__i_->__get_value());} 8813e519524SHoward Hinnant 882848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 8833e519524SHoward Hinnant __map_const_iterator& operator++() {++__i_; return *this;} 884848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 8853e519524SHoward Hinnant __map_const_iterator operator++(int) 8863e519524SHoward Hinnant { 8873e519524SHoward Hinnant __map_const_iterator __t(*this); 8883e519524SHoward Hinnant ++(*this); 8893e519524SHoward Hinnant return __t; 8903e519524SHoward Hinnant } 8913e519524SHoward Hinnant 892848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 8933e519524SHoward Hinnant __map_const_iterator& operator--() {--__i_; return *this;} 894848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 8953e519524SHoward Hinnant __map_const_iterator operator--(int) 8963e519524SHoward Hinnant { 8973e519524SHoward Hinnant __map_const_iterator __t(*this); 8983e519524SHoward Hinnant --(*this); 8993e519524SHoward Hinnant return __t; 9003e519524SHoward Hinnant } 9013e519524SHoward Hinnant 902848a5374SHoward Hinnant friend _LIBCPP_INLINE_VISIBILITY 903848a5374SHoward Hinnant bool operator==(const __map_const_iterator& __x, const __map_const_iterator& __y) 9043e519524SHoward Hinnant {return __x.__i_ == __y.__i_;} 905848a5374SHoward Hinnant friend _LIBCPP_INLINE_VISIBILITY 906848a5374SHoward Hinnant bool operator!=(const __map_const_iterator& __x, const __map_const_iterator& __y) 9073e519524SHoward Hinnant {return __x.__i_ != __y.__i_;} 9083e519524SHoward Hinnant 909e2f2d1edSEric Fiselier template <class, class, class, class> friend class _LIBCPP_TEMPLATE_VIS map; 910e2f2d1edSEric Fiselier template <class, class, class, class> friend class _LIBCPP_TEMPLATE_VIS multimap; 911e2f2d1edSEric Fiselier template <class, class, class> friend class _LIBCPP_TEMPLATE_VIS __tree_const_iterator; 9123e519524SHoward Hinnant}; 9133e519524SHoward Hinnant 9143e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare = less<_Key>, 9153e519524SHoward Hinnant class _Allocator = allocator<pair<const _Key, _Tp> > > 916e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS map 9173e519524SHoward Hinnant{ 9183e519524SHoward Hinnantpublic: 9193e519524SHoward Hinnant // types: 9203e519524SHoward Hinnant typedef _Key key_type; 9213e519524SHoward Hinnant typedef _Tp mapped_type; 9223e519524SHoward Hinnant typedef pair<const key_type, mapped_type> value_type; 92309fa1d0eSArthur O'Dwyer typedef __identity_t<_Compare> key_compare; 92409fa1d0eSArthur O'Dwyer typedef __identity_t<_Allocator> allocator_type; 9253e519524SHoward Hinnant typedef value_type& reference; 9263e519524SHoward Hinnant typedef const value_type& const_reference; 9273e519524SHoward Hinnant 92894f89aeeSMarshall Clow static_assert((is_same<typename allocator_type::value_type, value_type>::value), 92994f89aeeSMarshall Clow "Allocator::value_type must be same type as value_type"); 93094f89aeeSMarshall Clow 931dc066888SArthur O'Dwyer_LIBCPP_SUPPRESS_DEPRECATED_PUSH 932e2f2d1edSEric Fiselier class _LIBCPP_TEMPLATE_VIS value_compare 933dc066888SArthur O'Dwyer#if defined(_LIBCPP_ENABLE_CXX20_REMOVED_BINDER_TYPEDEFS) 9343e519524SHoward Hinnant : public binary_function<value_type, value_type, bool> 935dc066888SArthur O'Dwyer#endif 9363e519524SHoward Hinnant { 937dc066888SArthur O'Dwyer_LIBCPP_SUPPRESS_DEPRECATED_POP 9383e519524SHoward Hinnant friend class map; 9393e519524SHoward Hinnant protected: 9403e519524SHoward Hinnant key_compare comp; 9413e519524SHoward Hinnant 942848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY value_compare(key_compare c) : comp(c) {} 9433e519524SHoward Hinnant public: 944dc066888SArthur O'Dwyer#if _LIBCPP_STD_VER <= 17 || defined(_LIBCPP_ENABLE_CXX20_REMOVED_BINDER_TYPEDEFS) 945dc066888SArthur O'Dwyer _LIBCPP_DEPRECATED_IN_CXX17 typedef bool result_type; 946dc066888SArthur O'Dwyer _LIBCPP_DEPRECATED_IN_CXX17 typedef value_type first_argument_type; 947dc066888SArthur O'Dwyer _LIBCPP_DEPRECATED_IN_CXX17 typedef value_type second_argument_type; 948dc066888SArthur O'Dwyer#endif 949848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 9503e519524SHoward Hinnant bool operator()(const value_type& __x, const value_type& __y) const 9513e519524SHoward Hinnant {return comp(__x.first, __y.first);} 9523e519524SHoward Hinnant }; 9533e519524SHoward Hinnant 9543e519524SHoward Hinnantprivate: 95507d3eccdSHoward Hinnant 9569fd9f84fSHoward Hinnant typedef _VSTD::__value_type<key_type, mapped_type> __value_type; 957abb160e6SHoward Hinnant typedef __map_value_compare<key_type, __value_type, key_compare> __vc; 9581f508014SMarshall Clow typedef typename __rebind_alloc_helper<allocator_traits<allocator_type>, 9591f508014SMarshall Clow __value_type>::type __allocator_type; 9603e519524SHoward Hinnant typedef __tree<__value_type, __vc, __allocator_type> __base; 9613e519524SHoward Hinnant typedef typename __base::__node_traits __node_traits; 9623e519524SHoward Hinnant typedef allocator_traits<allocator_type> __alloc_traits; 9633e519524SHoward Hinnant 9643e519524SHoward Hinnant __base __tree_; 9653e519524SHoward Hinnant 9663e519524SHoward Hinnantpublic: 9673e519524SHoward Hinnant typedef typename __alloc_traits::pointer pointer; 9683e519524SHoward Hinnant typedef typename __alloc_traits::const_pointer const_pointer; 9693e519524SHoward Hinnant typedef typename __alloc_traits::size_type size_type; 9703e519524SHoward Hinnant typedef typename __alloc_traits::difference_type difference_type; 9713e519524SHoward Hinnant typedef __map_iterator<typename __base::iterator> iterator; 9723e519524SHoward Hinnant typedef __map_const_iterator<typename __base::const_iterator> const_iterator; 973ce48a113SHoward Hinnant typedef _VSTD::reverse_iterator<iterator> reverse_iterator; 974ce48a113SHoward Hinnant typedef _VSTD::reverse_iterator<const_iterator> const_reverse_iterator; 9753e519524SHoward Hinnant 976b0386a51SErik Pilkington#if _LIBCPP_STD_VER > 14 977b0386a51SErik Pilkington typedef __map_node_handle<typename __base::__node, allocator_type> node_type; 978b0386a51SErik Pilkington typedef __insert_return_type<iterator, node_type> insert_return_type; 979b0386a51SErik Pilkington#endif 980b0386a51SErik Pilkington 9815c4e07aeSErik Pilkington template <class _Key2, class _Value2, class _Comp2, class _Alloc2> 9825c4e07aeSErik Pilkington friend class _LIBCPP_TEMPLATE_VIS map; 9835c4e07aeSErik Pilkington template <class _Key2, class _Value2, class _Comp2, class _Alloc2> 9845c4e07aeSErik Pilkington friend class _LIBCPP_TEMPLATE_VIS multimap; 9855c4e07aeSErik Pilkington 986848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 987415a24e4SMarshall Clow map() 988415a24e4SMarshall Clow _NOEXCEPT_( 989415a24e4SMarshall Clow is_nothrow_default_constructible<allocator_type>::value && 990415a24e4SMarshall Clow is_nothrow_default_constructible<key_compare>::value && 991415a24e4SMarshall Clow is_nothrow_copy_constructible<key_compare>::value) 992415a24e4SMarshall Clow : __tree_(__vc(key_compare())) {} 993415a24e4SMarshall Clow 994415a24e4SMarshall Clow _LIBCPP_INLINE_VISIBILITY 995415a24e4SMarshall Clow explicit map(const key_compare& __comp) 9961052ee39SHoward Hinnant _NOEXCEPT_( 9971052ee39SHoward Hinnant is_nothrow_default_constructible<allocator_type>::value && 9981052ee39SHoward Hinnant is_nothrow_copy_constructible<key_compare>::value) 9993e519524SHoward Hinnant : __tree_(__vc(__comp)) {} 10003e519524SHoward Hinnant 1001848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 10023e519524SHoward Hinnant explicit map(const key_compare& __comp, const allocator_type& __a) 10032a10c960SMarshall Clow : __tree_(__vc(__comp), typename __base::allocator_type(__a)) {} 10043e519524SHoward Hinnant 10053e519524SHoward Hinnant template <class _InputIterator> 1006848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 10073e519524SHoward Hinnant map(_InputIterator __f, _InputIterator __l, 10083e519524SHoward Hinnant const key_compare& __comp = key_compare()) 10093e519524SHoward Hinnant : __tree_(__vc(__comp)) 10103e519524SHoward Hinnant { 10113e519524SHoward Hinnant insert(__f, __l); 10123e519524SHoward Hinnant } 10133e519524SHoward Hinnant 10143e519524SHoward Hinnant template <class _InputIterator> 1015848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 10163e519524SHoward Hinnant map(_InputIterator __f, _InputIterator __l, 10173e519524SHoward Hinnant const key_compare& __comp, const allocator_type& __a) 10182a10c960SMarshall Clow : __tree_(__vc(__comp), typename __base::allocator_type(__a)) 10193e519524SHoward Hinnant { 10203e519524SHoward Hinnant insert(__f, __l); 10213e519524SHoward Hinnant } 10223e519524SHoward Hinnant 1023fbc317d4SMarshall Clow#if _LIBCPP_STD_VER > 11 1024fbc317d4SMarshall Clow template <class _InputIterator> 1025fbc317d4SMarshall Clow _LIBCPP_INLINE_VISIBILITY 1026fbc317d4SMarshall Clow map(_InputIterator __f, _InputIterator __l, const allocator_type& __a) 1027fbc317d4SMarshall Clow : map(__f, __l, key_compare(), __a) {} 1028fbc317d4SMarshall Clow#endif 1029fbc317d4SMarshall Clow 1030848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 10313e519524SHoward Hinnant map(const map& __m) 10323e519524SHoward Hinnant : __tree_(__m.__tree_) 10333e519524SHoward Hinnant { 10343e519524SHoward Hinnant insert(__m.begin(), __m.end()); 10353e519524SHoward Hinnant } 10363e519524SHoward Hinnant 10375a33687dSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 10385a33687dSHoward Hinnant map& operator=(const map& __m) 10395a33687dSHoward Hinnant { 10402ee83725SMarshall Clow#ifndef _LIBCPP_CXX03_LANG 10415a33687dSHoward Hinnant __tree_ = __m.__tree_; 104207d3eccdSHoward Hinnant#else 104374cf6ff5SMarshall Clow if (this != &__m) { 104407d3eccdSHoward Hinnant __tree_.clear(); 104507d3eccdSHoward Hinnant __tree_.value_comp() = __m.__tree_.value_comp(); 104607d3eccdSHoward Hinnant __tree_.__copy_assign_alloc(__m.__tree_); 104707d3eccdSHoward Hinnant insert(__m.begin(), __m.end()); 104874cf6ff5SMarshall Clow } 104907d3eccdSHoward Hinnant#endif 10505a33687dSHoward Hinnant return *this; 10515a33687dSHoward Hinnant } 10525a33687dSHoward Hinnant 105318293116SEric Fiselier#ifndef _LIBCPP_CXX03_LANG 10543e519524SHoward Hinnant 1055848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 10563e519524SHoward Hinnant map(map&& __m) 10571052ee39SHoward Hinnant _NOEXCEPT_(is_nothrow_move_constructible<__base>::value) 1058ce48a113SHoward Hinnant : __tree_(_VSTD::move(__m.__tree_)) 10593e519524SHoward Hinnant { 10603e519524SHoward Hinnant } 10613e519524SHoward Hinnant 10623e519524SHoward Hinnant map(map&& __m, const allocator_type& __a); 10633e519524SHoward Hinnant 1064848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 106554976f26SHoward Hinnant map& operator=(map&& __m) 106654976f26SHoward Hinnant _NOEXCEPT_(is_nothrow_move_assignable<__base>::value) 106754976f26SHoward Hinnant { 106854976f26SHoward Hinnant __tree_ = _VSTD::move(__m.__tree_); 106954976f26SHoward Hinnant return *this; 107054976f26SHoward Hinnant } 107154976f26SHoward Hinnant 107254976f26SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 10733e519524SHoward Hinnant map(initializer_list<value_type> __il, const key_compare& __comp = key_compare()) 10743e519524SHoward Hinnant : __tree_(__vc(__comp)) 10753e519524SHoward Hinnant { 10763e519524SHoward Hinnant insert(__il.begin(), __il.end()); 10773e519524SHoward Hinnant } 10783e519524SHoward Hinnant 1079848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 10803e519524SHoward Hinnant map(initializer_list<value_type> __il, const key_compare& __comp, const allocator_type& __a) 10812a10c960SMarshall Clow : __tree_(__vc(__comp), typename __base::allocator_type(__a)) 10823e519524SHoward Hinnant { 10833e519524SHoward Hinnant insert(__il.begin(), __il.end()); 10843e519524SHoward Hinnant } 10853e519524SHoward Hinnant 1086fbc317d4SMarshall Clow#if _LIBCPP_STD_VER > 11 1087fbc317d4SMarshall Clow _LIBCPP_INLINE_VISIBILITY 1088fbc317d4SMarshall Clow map(initializer_list<value_type> __il, const allocator_type& __a) 1089fbc317d4SMarshall Clow : map(__il, key_compare(), __a) {} 1090fbc317d4SMarshall Clow#endif 1091fbc317d4SMarshall Clow 1092848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 10933e519524SHoward Hinnant map& operator=(initializer_list<value_type> __il) 10943e519524SHoward Hinnant { 10953e519524SHoward Hinnant __tree_.__assign_unique(__il.begin(), __il.end()); 10963e519524SHoward Hinnant return *this; 10973e519524SHoward Hinnant } 10983e519524SHoward Hinnant 109918293116SEric Fiselier#endif // _LIBCPP_CXX03_LANG 11003e519524SHoward Hinnant 1101848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 11023e519524SHoward Hinnant explicit map(const allocator_type& __a) 11032a10c960SMarshall Clow : __tree_(typename __base::allocator_type(__a)) 11043e519524SHoward Hinnant { 11053e519524SHoward Hinnant } 11063e519524SHoward Hinnant 1107848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 11083e519524SHoward Hinnant map(const map& __m, const allocator_type& __a) 11092a10c960SMarshall Clow : __tree_(__m.__tree_.value_comp(), typename __base::allocator_type(__a)) 11103e519524SHoward Hinnant { 11113e519524SHoward Hinnant insert(__m.begin(), __m.end()); 11123e519524SHoward Hinnant } 11133e519524SHoward Hinnant 1114848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 11157c142fccSLouis Dionne ~map() { 11167c142fccSLouis Dionne static_assert(sizeof(__diagnose_non_const_comparator<_Key, _Compare>()), ""); 11177c142fccSLouis Dionne } 11187c142fccSLouis Dionne 11197c142fccSLouis Dionne _LIBCPP_INLINE_VISIBILITY 11201052ee39SHoward Hinnant iterator begin() _NOEXCEPT {return __tree_.begin();} 1121848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 11221052ee39SHoward Hinnant const_iterator begin() const _NOEXCEPT {return __tree_.begin();} 1123848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 11241052ee39SHoward Hinnant iterator end() _NOEXCEPT {return __tree_.end();} 1125848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 11261052ee39SHoward Hinnant const_iterator end() const _NOEXCEPT {return __tree_.end();} 11273e519524SHoward Hinnant 1128848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 11291052ee39SHoward Hinnant reverse_iterator rbegin() _NOEXCEPT {return reverse_iterator(end());} 1130848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 11311052ee39SHoward Hinnant const_reverse_iterator rbegin() const _NOEXCEPT 11321052ee39SHoward Hinnant {return const_reverse_iterator(end());} 1133848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 11341052ee39SHoward Hinnant reverse_iterator rend() _NOEXCEPT 11351052ee39SHoward Hinnant {return reverse_iterator(begin());} 1136848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 11371052ee39SHoward Hinnant const_reverse_iterator rend() const _NOEXCEPT 11381052ee39SHoward Hinnant {return const_reverse_iterator(begin());} 11393e519524SHoward Hinnant 1140848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 11411052ee39SHoward Hinnant const_iterator cbegin() const _NOEXCEPT {return begin();} 1142848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 11431052ee39SHoward Hinnant const_iterator cend() const _NOEXCEPT {return end();} 1144848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 11451052ee39SHoward Hinnant const_reverse_iterator crbegin() const _NOEXCEPT {return rbegin();} 1146848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 11471052ee39SHoward Hinnant const_reverse_iterator crend() const _NOEXCEPT {return rend();} 11483e519524SHoward Hinnant 114972c8fad4SMarshall Clow _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY 11501052ee39SHoward Hinnant bool empty() const _NOEXCEPT {return __tree_.size() == 0;} 1151848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 11521052ee39SHoward Hinnant size_type size() const _NOEXCEPT {return __tree_.size();} 1153848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 11541052ee39SHoward Hinnant size_type max_size() const _NOEXCEPT {return __tree_.max_size();} 11553e519524SHoward Hinnant 11563e519524SHoward Hinnant mapped_type& operator[](const key_type& __k); 115754f0cda6SEric Fiselier#ifndef _LIBCPP_CXX03_LANG 11583e519524SHoward Hinnant mapped_type& operator[](key_type&& __k); 11593e519524SHoward Hinnant#endif 11603e519524SHoward Hinnant 11613e519524SHoward Hinnant mapped_type& at(const key_type& __k); 11623e519524SHoward Hinnant const mapped_type& at(const key_type& __k) const; 11633e519524SHoward Hinnant 1164848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 11652a10c960SMarshall Clow allocator_type get_allocator() const _NOEXCEPT {return allocator_type(__tree_.__alloc());} 1166848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 11673e519524SHoward Hinnant key_compare key_comp() const {return __tree_.value_comp().key_comp();} 1168848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 11693e519524SHoward Hinnant value_compare value_comp() const {return value_compare(__tree_.value_comp().key_comp());} 11703e519524SHoward Hinnant 11715e3ea4ddSEric Fiselier#ifndef _LIBCPP_CXX03_LANG 11725e3ea4ddSEric Fiselier template <class ..._Args> 11735e3ea4ddSEric Fiselier _LIBCPP_INLINE_VISIBILITY 11745e3ea4ddSEric Fiselier pair<iterator, bool> emplace(_Args&& ...__args) { 11755e3ea4ddSEric Fiselier return __tree_.__emplace_unique(_VSTD::forward<_Args>(__args)...); 11765e3ea4ddSEric Fiselier } 11777609c9b6SHoward Hinnant 11788b805c91SHoward Hinnant template <class ..._Args> 11795e3ea4ddSEric Fiselier _LIBCPP_INLINE_VISIBILITY 11805e3ea4ddSEric Fiselier iterator emplace_hint(const_iterator __p, _Args&& ...__args) { 11815e3ea4ddSEric Fiselier return __tree_.__emplace_hint_unique(__p.__i_, _VSTD::forward<_Args>(__args)...); 11825e3ea4ddSEric Fiselier } 11837609c9b6SHoward Hinnant 1184c003db1fSHoward Hinnant template <class _Pp, 1185c003db1fSHoward Hinnant class = typename enable_if<is_constructible<value_type, _Pp>::value>::type> 1186848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 1187c003db1fSHoward Hinnant pair<iterator, bool> insert(_Pp&& __p) 1188c003db1fSHoward Hinnant {return __tree_.__insert_unique(_VSTD::forward<_Pp>(__p));} 11893e519524SHoward Hinnant 1190c003db1fSHoward Hinnant template <class _Pp, 1191c003db1fSHoward Hinnant class = typename enable_if<is_constructible<value_type, _Pp>::value>::type> 1192848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 1193c003db1fSHoward Hinnant iterator insert(const_iterator __pos, _Pp&& __p) 1194c003db1fSHoward Hinnant {return __tree_.__insert_unique(__pos.__i_, _VSTD::forward<_Pp>(__p));} 11953e519524SHoward Hinnant 11965e3ea4ddSEric Fiselier#endif // _LIBCPP_CXX03_LANG 11973e519524SHoward Hinnant 1198848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 11993e519524SHoward Hinnant pair<iterator, bool> 12003e519524SHoward Hinnant insert(const value_type& __v) {return __tree_.__insert_unique(__v);} 12013e519524SHoward Hinnant 1202848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 12033e519524SHoward Hinnant iterator 12043e519524SHoward Hinnant insert(const_iterator __p, const value_type& __v) 12053e519524SHoward Hinnant {return __tree_.__insert_unique(__p.__i_, __v);} 12063e519524SHoward Hinnant 12077a9f500fSEric Fiselier#ifndef _LIBCPP_CXX03_LANG 1208afc9ff99SMarshall Clow _LIBCPP_INLINE_VISIBILITY 1209afc9ff99SMarshall Clow pair<iterator, bool> 12105e3ea4ddSEric Fiselier insert(value_type&& __v) {return __tree_.__insert_unique(_VSTD::move(__v));} 1211afc9ff99SMarshall Clow 1212afc9ff99SMarshall Clow _LIBCPP_INLINE_VISIBILITY 12135e3ea4ddSEric Fiselier iterator insert(const_iterator __p, value_type&& __v) 12145e3ea4ddSEric Fiselier {return __tree_.__insert_unique(__p.__i_, _VSTD::move(__v));} 121518293116SEric Fiselier 121618293116SEric Fiselier _LIBCPP_INLINE_VISIBILITY 121718293116SEric Fiselier void insert(initializer_list<value_type> __il) 121818293116SEric Fiselier {insert(__il.begin(), __il.end());} 1219afc9ff99SMarshall Clow#endif 1220afc9ff99SMarshall Clow 12213e519524SHoward Hinnant template <class _InputIterator> 1222848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 12233e519524SHoward Hinnant void insert(_InputIterator __f, _InputIterator __l) 12243e519524SHoward Hinnant { 12253e519524SHoward Hinnant for (const_iterator __e = cend(); __f != __l; ++__f) 12263e519524SHoward Hinnant insert(__e.__i_, *__f); 12273e519524SHoward Hinnant } 12283e519524SHoward Hinnant 12298aaf517dSMarshall Clow#if _LIBCPP_STD_VER > 14 123054f0cda6SEric Fiselier 12318aaf517dSMarshall Clow template <class... _Args> 12328aaf517dSMarshall Clow _LIBCPP_INLINE_VISIBILITY 12338aaf517dSMarshall Clow pair<iterator, bool> try_emplace(const key_type& __k, _Args&&... __args) 12348aaf517dSMarshall Clow { 123554f0cda6SEric Fiselier return __tree_.__emplace_unique_key_args(__k, 123654f0cda6SEric Fiselier _VSTD::piecewise_construct, 123754f0cda6SEric Fiselier _VSTD::forward_as_tuple(__k), 123854f0cda6SEric Fiselier _VSTD::forward_as_tuple(_VSTD::forward<_Args>(__args)...)); 12398aaf517dSMarshall Clow } 12408aaf517dSMarshall Clow 12418aaf517dSMarshall Clow template <class... _Args> 12428aaf517dSMarshall Clow _LIBCPP_INLINE_VISIBILITY 12438aaf517dSMarshall Clow pair<iterator, bool> try_emplace(key_type&& __k, _Args&&... __args) 12448aaf517dSMarshall Clow { 124554f0cda6SEric Fiselier return __tree_.__emplace_unique_key_args(__k, 124654f0cda6SEric Fiselier _VSTD::piecewise_construct, 124754f0cda6SEric Fiselier _VSTD::forward_as_tuple(_VSTD::move(__k)), 124854f0cda6SEric Fiselier _VSTD::forward_as_tuple(_VSTD::forward<_Args>(__args)...)); 12498aaf517dSMarshall Clow } 12508aaf517dSMarshall Clow 12518aaf517dSMarshall Clow template <class... _Args> 12528aaf517dSMarshall Clow _LIBCPP_INLINE_VISIBILITY 12538aaf517dSMarshall Clow iterator try_emplace(const_iterator __h, const key_type& __k, _Args&&... __args) 12548aaf517dSMarshall Clow { 125554f0cda6SEric Fiselier return __tree_.__emplace_hint_unique_key_args(__h.__i_, __k, 125654f0cda6SEric Fiselier _VSTD::piecewise_construct, 125754f0cda6SEric Fiselier _VSTD::forward_as_tuple(__k), 1258d4dd9613SMark de Wever _VSTD::forward_as_tuple(_VSTD::forward<_Args>(__args)...)).first; 12598aaf517dSMarshall Clow } 12608aaf517dSMarshall Clow 12618aaf517dSMarshall Clow template <class... _Args> 12628aaf517dSMarshall Clow _LIBCPP_INLINE_VISIBILITY 12638aaf517dSMarshall Clow iterator try_emplace(const_iterator __h, key_type&& __k, _Args&&... __args) 12648aaf517dSMarshall Clow { 126554f0cda6SEric Fiselier return __tree_.__emplace_hint_unique_key_args(__h.__i_, __k, 126654f0cda6SEric Fiselier _VSTD::piecewise_construct, 126754f0cda6SEric Fiselier _VSTD::forward_as_tuple(_VSTD::move(__k)), 1268d4dd9613SMark de Wever _VSTD::forward_as_tuple(_VSTD::forward<_Args>(__args)...)).first; 12698aaf517dSMarshall Clow } 12708aaf517dSMarshall Clow 12718aaf517dSMarshall Clow template <class _Vp> 12728aaf517dSMarshall Clow _LIBCPP_INLINE_VISIBILITY 12738aaf517dSMarshall Clow pair<iterator, bool> insert_or_assign(const key_type& __k, _Vp&& __v) 12748aaf517dSMarshall Clow { 12758aaf517dSMarshall Clow iterator __p = lower_bound(__k); 12768aaf517dSMarshall Clow if ( __p != end() && !key_comp()(__k, __p->first)) 12778aaf517dSMarshall Clow { 12788aaf517dSMarshall Clow __p->second = _VSTD::forward<_Vp>(__v); 12798aaf517dSMarshall Clow return _VSTD::make_pair(__p, false); 12808aaf517dSMarshall Clow } 12818aaf517dSMarshall Clow return _VSTD::make_pair(emplace_hint(__p, __k, _VSTD::forward<_Vp>(__v)), true); 12828aaf517dSMarshall Clow } 12838aaf517dSMarshall Clow 12848aaf517dSMarshall Clow template <class _Vp> 12858aaf517dSMarshall Clow _LIBCPP_INLINE_VISIBILITY 12868aaf517dSMarshall Clow pair<iterator, bool> insert_or_assign(key_type&& __k, _Vp&& __v) 12878aaf517dSMarshall Clow { 12888aaf517dSMarshall Clow iterator __p = lower_bound(__k); 12898aaf517dSMarshall Clow if ( __p != end() && !key_comp()(__k, __p->first)) 12908aaf517dSMarshall Clow { 12918aaf517dSMarshall Clow __p->second = _VSTD::forward<_Vp>(__v); 12928aaf517dSMarshall Clow return _VSTD::make_pair(__p, false); 12938aaf517dSMarshall Clow } 12948aaf517dSMarshall Clow return _VSTD::make_pair(emplace_hint(__p, _VSTD::move(__k), _VSTD::forward<_Vp>(__v)), true); 12958aaf517dSMarshall Clow } 12968aaf517dSMarshall Clow 12978aaf517dSMarshall Clow template <class _Vp> 1298d4dd9613SMark de Wever _LIBCPP_INLINE_VISIBILITY iterator insert_or_assign(const_iterator __h, 1299d4dd9613SMark de Wever const key_type& __k, 1300d4dd9613SMark de Wever _Vp&& __v) { 1301d4dd9613SMark de Wever auto [__r, __inserted] = __tree_.__emplace_hint_unique_key_args( 1302d4dd9613SMark de Wever __h.__i_, __k, __k, _VSTD::forward<_Vp>(__v)); 1303d4dd9613SMark de Wever 1304d4dd9613SMark de Wever if (!__inserted) 1305d4dd9613SMark de Wever __r->__get_value().second = _VSTD::forward<_Vp>(__v); 1306d4dd9613SMark de Wever 1307d4dd9613SMark de Wever return __r; 13088aaf517dSMarshall Clow } 13098aaf517dSMarshall Clow 13108aaf517dSMarshall Clow template <class _Vp> 1311d4dd9613SMark de Wever _LIBCPP_INLINE_VISIBILITY iterator insert_or_assign(const_iterator __h, 1312d4dd9613SMark de Wever key_type&& __k, 1313d4dd9613SMark de Wever _Vp&& __v) { 1314d4dd9613SMark de Wever auto [__r, __inserted] = __tree_.__emplace_hint_unique_key_args( 1315d4dd9613SMark de Wever __h.__i_, __k, _VSTD::move(__k), _VSTD::forward<_Vp>(__v)); 1316d4dd9613SMark de Wever 1317d4dd9613SMark de Wever if (!__inserted) 1318d4dd9613SMark de Wever __r->__get_value().second = _VSTD::forward<_Vp>(__v); 1319d4dd9613SMark de Wever 1320d4dd9613SMark de Wever return __r; 13218aaf517dSMarshall Clow } 132254f0cda6SEric Fiselier 132318293116SEric Fiselier#endif // _LIBCPP_STD_VER > 14 13248aaf517dSMarshall Clow 1325848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 13263e519524SHoward Hinnant iterator erase(const_iterator __p) {return __tree_.erase(__p.__i_);} 1327848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 1328ec392968SMarshall Clow iterator erase(iterator __p) {return __tree_.erase(__p.__i_);} 1329ec392968SMarshall Clow _LIBCPP_INLINE_VISIBILITY 13303e519524SHoward Hinnant size_type erase(const key_type& __k) 13313e519524SHoward Hinnant {return __tree_.__erase_unique(__k);} 1332848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 13333e519524SHoward Hinnant iterator erase(const_iterator __f, const_iterator __l) 13343e519524SHoward Hinnant {return __tree_.erase(__f.__i_, __l.__i_);} 1335848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 13361052ee39SHoward Hinnant void clear() _NOEXCEPT {__tree_.clear();} 13373e519524SHoward Hinnant 1338b0386a51SErik Pilkington#if _LIBCPP_STD_VER > 14 1339b0386a51SErik Pilkington _LIBCPP_INLINE_VISIBILITY 1340b0386a51SErik Pilkington insert_return_type insert(node_type&& __nh) 1341b0386a51SErik Pilkington { 1342b0386a51SErik Pilkington _LIBCPP_ASSERT(__nh.empty() || __nh.get_allocator() == get_allocator(), 1343b0386a51SErik Pilkington "node_type with incompatible allocator passed to map::insert()"); 1344b0386a51SErik Pilkington return __tree_.template __node_handle_insert_unique< 1345b0386a51SErik Pilkington node_type, insert_return_type>(_VSTD::move(__nh)); 1346b0386a51SErik Pilkington } 1347b0386a51SErik Pilkington _LIBCPP_INLINE_VISIBILITY 1348b0386a51SErik Pilkington iterator insert(const_iterator __hint, node_type&& __nh) 1349b0386a51SErik Pilkington { 1350b0386a51SErik Pilkington _LIBCPP_ASSERT(__nh.empty() || __nh.get_allocator() == get_allocator(), 1351b0386a51SErik Pilkington "node_type with incompatible allocator passed to map::insert()"); 1352b0386a51SErik Pilkington return __tree_.template __node_handle_insert_unique<node_type>( 1353b0386a51SErik Pilkington __hint.__i_, _VSTD::move(__nh)); 1354b0386a51SErik Pilkington } 1355b0386a51SErik Pilkington _LIBCPP_INLINE_VISIBILITY 1356b0386a51SErik Pilkington node_type extract(key_type const& __key) 1357b0386a51SErik Pilkington { 1358b0386a51SErik Pilkington return __tree_.template __node_handle_extract<node_type>(__key); 1359b0386a51SErik Pilkington } 1360b0386a51SErik Pilkington _LIBCPP_INLINE_VISIBILITY 1361b0386a51SErik Pilkington node_type extract(const_iterator __it) 1362b0386a51SErik Pilkington { 1363b0386a51SErik Pilkington return __tree_.template __node_handle_extract<node_type>(__it.__i_); 1364b0386a51SErik Pilkington } 13658df1d5a5SLouis Dionne template <class _Compare2> 13665c4e07aeSErik Pilkington _LIBCPP_INLINE_VISIBILITY 13678df1d5a5SLouis Dionne void merge(map<key_type, mapped_type, _Compare2, allocator_type>& __source) 13685c4e07aeSErik Pilkington { 13695c4e07aeSErik Pilkington _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(), 13705c4e07aeSErik Pilkington "merging container with incompatible allocator"); 13715c4e07aeSErik Pilkington __tree_.__node_handle_merge_unique(__source.__tree_); 13725c4e07aeSErik Pilkington } 13738df1d5a5SLouis Dionne template <class _Compare2> 13745c4e07aeSErik Pilkington _LIBCPP_INLINE_VISIBILITY 13758df1d5a5SLouis Dionne void merge(map<key_type, mapped_type, _Compare2, allocator_type>&& __source) 13765c4e07aeSErik Pilkington { 13775c4e07aeSErik Pilkington _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(), 13785c4e07aeSErik Pilkington "merging container with incompatible allocator"); 13795c4e07aeSErik Pilkington __tree_.__node_handle_merge_unique(__source.__tree_); 13805c4e07aeSErik Pilkington } 13818df1d5a5SLouis Dionne template <class _Compare2> 13825c4e07aeSErik Pilkington _LIBCPP_INLINE_VISIBILITY 13838df1d5a5SLouis Dionne void merge(multimap<key_type, mapped_type, _Compare2, allocator_type>& __source) 13845c4e07aeSErik Pilkington { 13855c4e07aeSErik Pilkington _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(), 13865c4e07aeSErik Pilkington "merging container with incompatible allocator"); 13875c4e07aeSErik Pilkington __tree_.__node_handle_merge_unique(__source.__tree_); 13885c4e07aeSErik Pilkington } 13898df1d5a5SLouis Dionne template <class _Compare2> 13905c4e07aeSErik Pilkington _LIBCPP_INLINE_VISIBILITY 13918df1d5a5SLouis Dionne void merge(multimap<key_type, mapped_type, _Compare2, allocator_type>&& __source) 13925c4e07aeSErik Pilkington { 13935c4e07aeSErik Pilkington _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(), 13945c4e07aeSErik Pilkington "merging container with incompatible allocator"); 13955c4e07aeSErik Pilkington __tree_.__node_handle_merge_unique(__source.__tree_); 13965c4e07aeSErik Pilkington } 1397b0386a51SErik Pilkington#endif 1398b0386a51SErik Pilkington 1399848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 14001052ee39SHoward Hinnant void swap(map& __m) 14011052ee39SHoward Hinnant _NOEXCEPT_(__is_nothrow_swappable<__base>::value) 14021052ee39SHoward Hinnant {__tree_.swap(__m.__tree_);} 14033e519524SHoward Hinnant 1404848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 14053e519524SHoward Hinnant iterator find(const key_type& __k) {return __tree_.find(__k);} 1406848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 14073e519524SHoward Hinnant const_iterator find(const key_type& __k) const {return __tree_.find(__k);} 14082585835cSMarshall Clow#if _LIBCPP_STD_VER > 11 14092585835cSMarshall Clow template <typename _K2> 14102585835cSMarshall Clow _LIBCPP_INLINE_VISIBILITY 14112585835cSMarshall Clow typename enable_if<__is_transparent<_Compare, _K2>::value,iterator>::type 14122585835cSMarshall Clow find(const _K2& __k) {return __tree_.find(__k);} 14132585835cSMarshall Clow template <typename _K2> 14142585835cSMarshall Clow _LIBCPP_INLINE_VISIBILITY 14152585835cSMarshall Clow typename enable_if<__is_transparent<_Compare, _K2>::value,const_iterator>::type 14162585835cSMarshall Clow find(const _K2& __k) const {return __tree_.find(__k);} 14172585835cSMarshall Clow#endif 14182585835cSMarshall Clow 1419848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 14203e519524SHoward Hinnant size_type count(const key_type& __k) const 14213e519524SHoward Hinnant {return __tree_.__count_unique(__k);} 14220aacbc92SMarshall Clow#if _LIBCPP_STD_VER > 11 14230aacbc92SMarshall Clow template <typename _K2> 14240aacbc92SMarshall Clow _LIBCPP_INLINE_VISIBILITY 14250aacbc92SMarshall Clow typename enable_if<__is_transparent<_Compare, _K2>::value,size_type>::type 14269bfdb770SEric Fiselier count(const _K2& __k) const {return __tree_.__count_multi(__k);} 14270aacbc92SMarshall Clow#endif 1428a17b1aedSZoe Carver 1429a17b1aedSZoe Carver#if _LIBCPP_STD_VER > 17 1430a17b1aedSZoe Carver _LIBCPP_INLINE_VISIBILITY 1431a17b1aedSZoe Carver bool contains(const key_type& __k) const {return find(__k) != end();} 14323fca07d7SMarek Kurdej template <typename _K2> 14333fca07d7SMarek Kurdej _LIBCPP_INLINE_VISIBILITY 14343fca07d7SMarek Kurdej typename enable_if<__is_transparent<_Compare, _K2>::value, bool>::type 14353fca07d7SMarek Kurdej contains(const _K2& __k) const { return find(__k) != end(); } 1436a17b1aedSZoe Carver#endif // _LIBCPP_STD_VER > 17 1437a17b1aedSZoe Carver 1438848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 14393e519524SHoward Hinnant iterator lower_bound(const key_type& __k) 14403e519524SHoward Hinnant {return __tree_.lower_bound(__k);} 1441848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 14423e519524SHoward Hinnant const_iterator lower_bound(const key_type& __k) const 14433e519524SHoward Hinnant {return __tree_.lower_bound(__k);} 14442585835cSMarshall Clow#if _LIBCPP_STD_VER > 11 14452585835cSMarshall Clow template <typename _K2> 14462585835cSMarshall Clow _LIBCPP_INLINE_VISIBILITY 14472585835cSMarshall Clow typename enable_if<__is_transparent<_Compare, _K2>::value,iterator>::type 14482585835cSMarshall Clow lower_bound(const _K2& __k) {return __tree_.lower_bound(__k);} 14492585835cSMarshall Clow 14502585835cSMarshall Clow template <typename _K2> 14512585835cSMarshall Clow _LIBCPP_INLINE_VISIBILITY 14522585835cSMarshall Clow typename enable_if<__is_transparent<_Compare, _K2>::value,const_iterator>::type 14532585835cSMarshall Clow lower_bound(const _K2& __k) const {return __tree_.lower_bound(__k);} 14542585835cSMarshall Clow#endif 14552585835cSMarshall Clow 1456848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 14573e519524SHoward Hinnant iterator upper_bound(const key_type& __k) 14583e519524SHoward Hinnant {return __tree_.upper_bound(__k);} 1459848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 14603e519524SHoward Hinnant const_iterator upper_bound(const key_type& __k) const 14613e519524SHoward Hinnant {return __tree_.upper_bound(__k);} 14622585835cSMarshall Clow#if _LIBCPP_STD_VER > 11 14632585835cSMarshall Clow template <typename _K2> 14642585835cSMarshall Clow _LIBCPP_INLINE_VISIBILITY 14652585835cSMarshall Clow typename enable_if<__is_transparent<_Compare, _K2>::value,iterator>::type 14662585835cSMarshall Clow upper_bound(const _K2& __k) {return __tree_.upper_bound(__k);} 14672585835cSMarshall Clow template <typename _K2> 14682585835cSMarshall Clow _LIBCPP_INLINE_VISIBILITY 14692585835cSMarshall Clow typename enable_if<__is_transparent<_Compare, _K2>::value,const_iterator>::type 14702585835cSMarshall Clow upper_bound(const _K2& __k) const {return __tree_.upper_bound(__k);} 14712585835cSMarshall Clow#endif 14722585835cSMarshall Clow 1473848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 14743e519524SHoward Hinnant pair<iterator,iterator> equal_range(const key_type& __k) 14753e519524SHoward Hinnant {return __tree_.__equal_range_unique(__k);} 1476848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 14773e519524SHoward Hinnant pair<const_iterator,const_iterator> equal_range(const key_type& __k) const 14783e519524SHoward Hinnant {return __tree_.__equal_range_unique(__k);} 14792585835cSMarshall Clow#if _LIBCPP_STD_VER > 11 14802585835cSMarshall Clow template <typename _K2> 14812585835cSMarshall Clow _LIBCPP_INLINE_VISIBILITY 14822585835cSMarshall Clow typename enable_if<__is_transparent<_Compare, _K2>::value,pair<iterator,iterator>>::type 14839bfdb770SEric Fiselier equal_range(const _K2& __k) {return __tree_.__equal_range_multi(__k);} 14842585835cSMarshall Clow template <typename _K2> 14852585835cSMarshall Clow _LIBCPP_INLINE_VISIBILITY 14862585835cSMarshall Clow typename enable_if<__is_transparent<_Compare, _K2>::value,pair<const_iterator,const_iterator>>::type 14879bfdb770SEric Fiselier equal_range(const _K2& __k) const {return __tree_.__equal_range_multi(__k);} 14882585835cSMarshall Clow#endif 14893e519524SHoward Hinnant 14903e519524SHoward Hinnantprivate: 14913e519524SHoward Hinnant typedef typename __base::__node __node; 14923e519524SHoward Hinnant typedef typename __base::__node_allocator __node_allocator; 14933e519524SHoward Hinnant typedef typename __base::__node_pointer __node_pointer; 14943e519524SHoward Hinnant typedef typename __base::__node_base_pointer __node_base_pointer; 1495cb5cbc8bSEric Fiselier typedef typename __base::__parent_pointer __parent_pointer; 14960594ad71SEric Fiselier 1497c003db1fSHoward Hinnant typedef __map_node_destructor<__node_allocator> _Dp; 1498c003db1fSHoward Hinnant typedef unique_ptr<__node, _Dp> __node_holder; 14993e519524SHoward Hinnant 150054f0cda6SEric Fiselier#ifdef _LIBCPP_CXX03_LANG 15014a95f9ebSHoward Hinnant __node_holder __construct_node_with_key(const key_type& __k); 150254f0cda6SEric Fiselier#endif 15033e519524SHoward Hinnant}; 15043e519524SHoward Hinnant 150501666904SLouis Dionne#if _LIBCPP_STD_VER >= 17 1506f2f7d72fSLouis Dionnetemplate<class _InputIterator, class _Compare = less<__iter_key_type<_InputIterator>>, 1507f2f7d72fSLouis Dionne class _Allocator = allocator<__iter_to_alloc_type<_InputIterator>>, 1508*4e0ea2cfSLouis Dionne class = enable_if_t<!__is_allocator<_Compare>::value, void>, 1509*4e0ea2cfSLouis Dionne class = enable_if_t<__is_allocator<_Allocator>::value, void>> 1510f2f7d72fSLouis Dionnemap(_InputIterator, _InputIterator, _Compare = _Compare(), _Allocator = _Allocator()) 1511f2f7d72fSLouis Dionne -> map<__iter_key_type<_InputIterator>, __iter_mapped_type<_InputIterator>, _Compare, _Allocator>; 1512f2f7d72fSLouis Dionne 1513f2f7d72fSLouis Dionnetemplate<class _Key, class _Tp, class _Compare = less<remove_const_t<_Key>>, 1514f2f7d72fSLouis Dionne class _Allocator = allocator<pair<const _Key, _Tp>>, 1515*4e0ea2cfSLouis Dionne class = enable_if_t<!__is_allocator<_Compare>::value, void>, 1516*4e0ea2cfSLouis Dionne class = enable_if_t<__is_allocator<_Allocator>::value, void>> 1517f2f7d72fSLouis Dionnemap(initializer_list<pair<_Key, _Tp>>, _Compare = _Compare(), _Allocator = _Allocator()) 1518f2f7d72fSLouis Dionne -> map<remove_const_t<_Key>, _Tp, _Compare, _Allocator>; 1519f2f7d72fSLouis Dionne 1520f2f7d72fSLouis Dionnetemplate<class _InputIterator, class _Allocator, 1521*4e0ea2cfSLouis Dionne class = enable_if_t<__is_allocator<_Allocator>::value, void>> 1522f2f7d72fSLouis Dionnemap(_InputIterator, _InputIterator, _Allocator) 1523f2f7d72fSLouis Dionne -> map<__iter_key_type<_InputIterator>, __iter_mapped_type<_InputIterator>, 1524f2f7d72fSLouis Dionne less<__iter_key_type<_InputIterator>>, _Allocator>; 1525f2f7d72fSLouis Dionne 1526f2f7d72fSLouis Dionnetemplate<class _Key, class _Tp, class _Allocator, 1527*4e0ea2cfSLouis Dionne class = enable_if_t<__is_allocator<_Allocator>::value, void>> 1528f2f7d72fSLouis Dionnemap(initializer_list<pair<_Key, _Tp>>, _Allocator) 1529f2f7d72fSLouis Dionne -> map<remove_const_t<_Key>, _Tp, less<remove_const_t<_Key>>, _Allocator>; 1530f2f7d72fSLouis Dionne#endif 15310594ad71SEric Fiselier 15325e3ea4ddSEric Fiselier#ifndef _LIBCPP_CXX03_LANG 15333e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 15343e519524SHoward Hinnantmap<_Key, _Tp, _Compare, _Allocator>::map(map&& __m, const allocator_type& __a) 15352a10c960SMarshall Clow : __tree_(_VSTD::move(__m.__tree_), typename __base::allocator_type(__a)) 15363e519524SHoward Hinnant{ 15373e519524SHoward Hinnant if (__a != __m.get_allocator()) 15383e519524SHoward Hinnant { 15393e519524SHoward Hinnant const_iterator __e = cend(); 15403e519524SHoward Hinnant while (!__m.empty()) 15413e519524SHoward Hinnant __tree_.__insert_unique(__e.__i_, 1542f52318b4SErik Pilkington __m.__tree_.remove(__m.begin().__i_)->__value_.__move()); 15433e519524SHoward Hinnant } 15443e519524SHoward Hinnant} 15453e519524SHoward Hinnant 154618293116SEric Fiseliertemplate <class _Key, class _Tp, class _Compare, class _Allocator> 154718293116SEric Fiselier_Tp& 154818293116SEric Fiseliermap<_Key, _Tp, _Compare, _Allocator>::operator[](const key_type& __k) 154918293116SEric Fiselier{ 155018293116SEric Fiselier return __tree_.__emplace_unique_key_args(__k, 155118293116SEric Fiselier _VSTD::piecewise_construct, 155218293116SEric Fiselier _VSTD::forward_as_tuple(__k), 1553f52318b4SErik Pilkington _VSTD::forward_as_tuple()).first->__get_value().second; 155418293116SEric Fiselier} 15553e519524SHoward Hinnant 155618293116SEric Fiseliertemplate <class _Key, class _Tp, class _Compare, class _Allocator> 155718293116SEric Fiselier_Tp& 155818293116SEric Fiseliermap<_Key, _Tp, _Compare, _Allocator>::operator[](key_type&& __k) 155918293116SEric Fiselier{ 156018293116SEric Fiselier return __tree_.__emplace_unique_key_args(__k, 156118293116SEric Fiselier _VSTD::piecewise_construct, 156218293116SEric Fiselier _VSTD::forward_as_tuple(_VSTD::move(__k)), 1563f52318b4SErik Pilkington _VSTD::forward_as_tuple()).first->__get_value().second; 156418293116SEric Fiselier} 156554f0cda6SEric Fiselier 156618293116SEric Fiselier#else // _LIBCPP_CXX03_LANG 156754f0cda6SEric Fiselier 15683e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 15693e519524SHoward Hinnanttypename map<_Key, _Tp, _Compare, _Allocator>::__node_holder 15704a95f9ebSHoward Hinnantmap<_Key, _Tp, _Compare, _Allocator>::__construct_node_with_key(const key_type& __k) 15713e519524SHoward Hinnant{ 15723e519524SHoward Hinnant __node_allocator& __na = __tree_.__node_alloc(); 1573c003db1fSHoward Hinnant __node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na)); 1574f52318b4SErik Pilkington __node_traits::construct(__na, _VSTD::addressof(__h->__value_.__get_value().first), __k); 15753e519524SHoward Hinnant __h.get_deleter().__first_constructed = true; 1576f52318b4SErik Pilkington __node_traits::construct(__na, _VSTD::addressof(__h->__value_.__get_value().second)); 15773e519524SHoward Hinnant __h.get_deleter().__second_constructed = true; 15788d4860aaSLouis Dionne return __h; 15793e519524SHoward Hinnant} 15803e519524SHoward Hinnant 15813e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 15823e519524SHoward Hinnant_Tp& 15833e519524SHoward Hinnantmap<_Key, _Tp, _Compare, _Allocator>::operator[](const key_type& __k) 15843e519524SHoward Hinnant{ 1585cb5cbc8bSEric Fiselier __parent_pointer __parent; 1586cb5cbc8bSEric Fiselier __node_base_pointer& __child = __tree_.__find_equal(__parent, __k); 15873e519524SHoward Hinnant __node_pointer __r = static_cast<__node_pointer>(__child); 15883e519524SHoward Hinnant if (__child == nullptr) 15893e519524SHoward Hinnant { 15904a95f9ebSHoward Hinnant __node_holder __h = __construct_node_with_key(__k); 159107d3eccdSHoward Hinnant __tree_.__insert_node_at(__parent, __child, static_cast<__node_base_pointer>(__h.get())); 15923e519524SHoward Hinnant __r = __h.release(); 15933e519524SHoward Hinnant } 1594f52318b4SErik Pilkington return __r->__value_.__get_value().second; 15953e519524SHoward Hinnant} 15963e519524SHoward Hinnant 159718293116SEric Fiselier#endif // _LIBCPP_CXX03_LANG 15983e519524SHoward Hinnant 15993e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 16003e519524SHoward Hinnant_Tp& 16013e519524SHoward Hinnantmap<_Key, _Tp, _Compare, _Allocator>::at(const key_type& __k) 16023e519524SHoward Hinnant{ 1603cb5cbc8bSEric Fiselier __parent_pointer __parent; 1604cb5cbc8bSEric Fiselier __node_base_pointer& __child = __tree_.__find_equal(__parent, __k); 16053e519524SHoward Hinnant if (__child == nullptr) 16067232a84eSLouis Dionne __throw_out_of_range("map::at: key not found"); 1607f52318b4SErik Pilkington return static_cast<__node_pointer>(__child)->__value_.__get_value().second; 16083e519524SHoward Hinnant} 16093e519524SHoward Hinnant 16103e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 16113e519524SHoward Hinnantconst _Tp& 16123e519524SHoward Hinnantmap<_Key, _Tp, _Compare, _Allocator>::at(const key_type& __k) const 16133e519524SHoward Hinnant{ 1614cb5cbc8bSEric Fiselier __parent_pointer __parent; 1615cb5cbc8bSEric Fiselier __node_base_pointer __child = __tree_.__find_equal(__parent, __k); 16163e519524SHoward Hinnant if (__child == nullptr) 16177232a84eSLouis Dionne __throw_out_of_range("map::at: key not found"); 1618f52318b4SErik Pilkington return static_cast<__node_pointer>(__child)->__value_.__get_value().second; 16193e519524SHoward Hinnant} 16203e519524SHoward Hinnant 16213e519524SHoward Hinnant 16223e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 1623848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 16243e519524SHoward Hinnantbool 16253e519524SHoward Hinnantoperator==(const map<_Key, _Tp, _Compare, _Allocator>& __x, 16263e519524SHoward Hinnant const map<_Key, _Tp, _Compare, _Allocator>& __y) 16273e519524SHoward Hinnant{ 1628ce48a113SHoward Hinnant return __x.size() == __y.size() && _VSTD::equal(__x.begin(), __x.end(), __y.begin()); 16293e519524SHoward Hinnant} 16303e519524SHoward Hinnant 16313e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 1632848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 16333e519524SHoward Hinnantbool 16343e519524SHoward Hinnantoperator< (const map<_Key, _Tp, _Compare, _Allocator>& __x, 16353e519524SHoward Hinnant const map<_Key, _Tp, _Compare, _Allocator>& __y) 16363e519524SHoward Hinnant{ 1637ce48a113SHoward Hinnant return _VSTD::lexicographical_compare(__x.begin(), __x.end(), __y.begin(), __y.end()); 16383e519524SHoward Hinnant} 16393e519524SHoward Hinnant 16403e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 1641848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 16423e519524SHoward Hinnantbool 16433e519524SHoward Hinnantoperator!=(const map<_Key, _Tp, _Compare, _Allocator>& __x, 16443e519524SHoward Hinnant const map<_Key, _Tp, _Compare, _Allocator>& __y) 16453e519524SHoward Hinnant{ 16463e519524SHoward Hinnant return !(__x == __y); 16473e519524SHoward Hinnant} 16483e519524SHoward Hinnant 16493e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 1650848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 16513e519524SHoward Hinnantbool 16523e519524SHoward Hinnantoperator> (const map<_Key, _Tp, _Compare, _Allocator>& __x, 16533e519524SHoward Hinnant const map<_Key, _Tp, _Compare, _Allocator>& __y) 16543e519524SHoward Hinnant{ 16553e519524SHoward Hinnant return __y < __x; 16563e519524SHoward Hinnant} 16573e519524SHoward Hinnant 16583e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 1659848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 16603e519524SHoward Hinnantbool 16613e519524SHoward Hinnantoperator>=(const map<_Key, _Tp, _Compare, _Allocator>& __x, 16623e519524SHoward Hinnant const map<_Key, _Tp, _Compare, _Allocator>& __y) 16633e519524SHoward Hinnant{ 16643e519524SHoward Hinnant return !(__x < __y); 16653e519524SHoward Hinnant} 16663e519524SHoward Hinnant 16673e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 1668848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 16693e519524SHoward Hinnantbool 16703e519524SHoward Hinnantoperator<=(const map<_Key, _Tp, _Compare, _Allocator>& __x, 16713e519524SHoward Hinnant const map<_Key, _Tp, _Compare, _Allocator>& __y) 16723e519524SHoward Hinnant{ 16733e519524SHoward Hinnant return !(__y < __x); 16743e519524SHoward Hinnant} 16753e519524SHoward Hinnant 16763e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 1677848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 16783e519524SHoward Hinnantvoid 16793e519524SHoward Hinnantswap(map<_Key, _Tp, _Compare, _Allocator>& __x, 16803e519524SHoward Hinnant map<_Key, _Tp, _Compare, _Allocator>& __y) 16811052ee39SHoward Hinnant _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y))) 16823e519524SHoward Hinnant{ 16833e519524SHoward Hinnant __x.swap(__y); 16843e519524SHoward Hinnant} 16853e519524SHoward Hinnant 1686f60c63c0SMarshall Clow#if _LIBCPP_STD_VER > 17 16873e895085SMarek Kurdejtemplate <class _Key, class _Tp, class _Compare, class _Allocator, 16883e895085SMarek Kurdej class _Predicate> 1689f60c63c0SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY 16903e895085SMarek Kurdej typename map<_Key, _Tp, _Compare, _Allocator>::size_type 16913e895085SMarek Kurdej erase_if(map<_Key, _Tp, _Compare, _Allocator>& __c, _Predicate __pred) { 16922ac6babcSArthur O'Dwyer return _VSTD::__libcpp_erase_if_container(__c, __pred); 16933e895085SMarek Kurdej} 1694f60c63c0SMarshall Clow#endif 1695f60c63c0SMarshall Clow 1696f60c63c0SMarshall Clow 16973e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare = less<_Key>, 16983e519524SHoward Hinnant class _Allocator = allocator<pair<const _Key, _Tp> > > 1699e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS multimap 17003e519524SHoward Hinnant{ 17013e519524SHoward Hinnantpublic: 17023e519524SHoward Hinnant // types: 17033e519524SHoward Hinnant typedef _Key key_type; 17043e519524SHoward Hinnant typedef _Tp mapped_type; 17053e519524SHoward Hinnant typedef pair<const key_type, mapped_type> value_type; 170609fa1d0eSArthur O'Dwyer typedef __identity_t<_Compare> key_compare; 170709fa1d0eSArthur O'Dwyer typedef __identity_t<_Allocator> allocator_type; 17083e519524SHoward Hinnant typedef value_type& reference; 17093e519524SHoward Hinnant typedef const value_type& const_reference; 17103e519524SHoward Hinnant 171194f89aeeSMarshall Clow static_assert((is_same<typename allocator_type::value_type, value_type>::value), 171294f89aeeSMarshall Clow "Allocator::value_type must be same type as value_type"); 171394f89aeeSMarshall Clow 1714dc066888SArthur O'Dwyer_LIBCPP_SUPPRESS_DEPRECATED_PUSH 1715e2f2d1edSEric Fiselier class _LIBCPP_TEMPLATE_VIS value_compare 1716dc066888SArthur O'Dwyer#if defined(_LIBCPP_ENABLE_CXX20_REMOVED_BINDER_TYPEDEFS) 17173e519524SHoward Hinnant : public binary_function<value_type, value_type, bool> 1718dc066888SArthur O'Dwyer#endif 17193e519524SHoward Hinnant { 1720dc066888SArthur O'Dwyer_LIBCPP_SUPPRESS_DEPRECATED_POP 17213e519524SHoward Hinnant friend class multimap; 17223e519524SHoward Hinnant protected: 17233e519524SHoward Hinnant key_compare comp; 17243e519524SHoward Hinnant 1725848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 17263e519524SHoward Hinnant value_compare(key_compare c) : comp(c) {} 17273e519524SHoward Hinnant public: 1728dc066888SArthur O'Dwyer#if _LIBCPP_STD_VER <= 17 || defined(_LIBCPP_ENABLE_CXX20_REMOVED_BINDER_TYPEDEFS) 1729dc066888SArthur O'Dwyer _LIBCPP_DEPRECATED_IN_CXX17 typedef bool result_type; 1730dc066888SArthur O'Dwyer _LIBCPP_DEPRECATED_IN_CXX17 typedef value_type first_argument_type; 1731dc066888SArthur O'Dwyer _LIBCPP_DEPRECATED_IN_CXX17 typedef value_type second_argument_type; 1732dc066888SArthur O'Dwyer#endif 1733848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 17343e519524SHoward Hinnant bool operator()(const value_type& __x, const value_type& __y) const 17353e519524SHoward Hinnant {return comp(__x.first, __y.first);} 17363e519524SHoward Hinnant }; 17373e519524SHoward Hinnant 17383e519524SHoward Hinnantprivate: 173907d3eccdSHoward Hinnant 17409fd9f84fSHoward Hinnant typedef _VSTD::__value_type<key_type, mapped_type> __value_type; 1741abb160e6SHoward Hinnant typedef __map_value_compare<key_type, __value_type, key_compare> __vc; 17421f508014SMarshall Clow typedef typename __rebind_alloc_helper<allocator_traits<allocator_type>, 17431f508014SMarshall Clow __value_type>::type __allocator_type; 17443e519524SHoward Hinnant typedef __tree<__value_type, __vc, __allocator_type> __base; 17453e519524SHoward Hinnant typedef typename __base::__node_traits __node_traits; 17463e519524SHoward Hinnant typedef allocator_traits<allocator_type> __alloc_traits; 17473e519524SHoward Hinnant 17483e519524SHoward Hinnant __base __tree_; 17493e519524SHoward Hinnant 17503e519524SHoward Hinnantpublic: 17513e519524SHoward Hinnant typedef typename __alloc_traits::pointer pointer; 17523e519524SHoward Hinnant typedef typename __alloc_traits::const_pointer const_pointer; 17533e519524SHoward Hinnant typedef typename __alloc_traits::size_type size_type; 17543e519524SHoward Hinnant typedef typename __alloc_traits::difference_type difference_type; 17553e519524SHoward Hinnant typedef __map_iterator<typename __base::iterator> iterator; 17563e519524SHoward Hinnant typedef __map_const_iterator<typename __base::const_iterator> const_iterator; 1757ce48a113SHoward Hinnant typedef _VSTD::reverse_iterator<iterator> reverse_iterator; 1758ce48a113SHoward Hinnant typedef _VSTD::reverse_iterator<const_iterator> const_reverse_iterator; 17593e519524SHoward Hinnant 1760b0386a51SErik Pilkington#if _LIBCPP_STD_VER > 14 1761b0386a51SErik Pilkington typedef __map_node_handle<typename __base::__node, allocator_type> node_type; 1762b0386a51SErik Pilkington#endif 1763b0386a51SErik Pilkington 17645c4e07aeSErik Pilkington template <class _Key2, class _Value2, class _Comp2, class _Alloc2> 17655c4e07aeSErik Pilkington friend class _LIBCPP_TEMPLATE_VIS map; 17665c4e07aeSErik Pilkington template <class _Key2, class _Value2, class _Comp2, class _Alloc2> 17675c4e07aeSErik Pilkington friend class _LIBCPP_TEMPLATE_VIS multimap; 17685c4e07aeSErik Pilkington 1769848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 1770415a24e4SMarshall Clow multimap() 1771415a24e4SMarshall Clow _NOEXCEPT_( 1772415a24e4SMarshall Clow is_nothrow_default_constructible<allocator_type>::value && 1773415a24e4SMarshall Clow is_nothrow_default_constructible<key_compare>::value && 1774415a24e4SMarshall Clow is_nothrow_copy_constructible<key_compare>::value) 1775415a24e4SMarshall Clow : __tree_(__vc(key_compare())) {} 1776415a24e4SMarshall Clow 1777415a24e4SMarshall Clow _LIBCPP_INLINE_VISIBILITY 1778415a24e4SMarshall Clow explicit multimap(const key_compare& __comp) 17791052ee39SHoward Hinnant _NOEXCEPT_( 17801052ee39SHoward Hinnant is_nothrow_default_constructible<allocator_type>::value && 17811052ee39SHoward Hinnant is_nothrow_copy_constructible<key_compare>::value) 17823e519524SHoward Hinnant : __tree_(__vc(__comp)) {} 17833e519524SHoward Hinnant 1784848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 17853e519524SHoward Hinnant explicit multimap(const key_compare& __comp, const allocator_type& __a) 17862a10c960SMarshall Clow : __tree_(__vc(__comp), typename __base::allocator_type(__a)) {} 17873e519524SHoward Hinnant 17883e519524SHoward Hinnant template <class _InputIterator> 1789848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 17903e519524SHoward Hinnant multimap(_InputIterator __f, _InputIterator __l, 17913e519524SHoward Hinnant const key_compare& __comp = key_compare()) 17923e519524SHoward Hinnant : __tree_(__vc(__comp)) 17933e519524SHoward Hinnant { 17943e519524SHoward Hinnant insert(__f, __l); 17953e519524SHoward Hinnant } 17963e519524SHoward Hinnant 17973e519524SHoward Hinnant template <class _InputIterator> 1798848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 17993e519524SHoward Hinnant multimap(_InputIterator __f, _InputIterator __l, 18003e519524SHoward Hinnant const key_compare& __comp, const allocator_type& __a) 18012a10c960SMarshall Clow : __tree_(__vc(__comp), typename __base::allocator_type(__a)) 18023e519524SHoward Hinnant { 18033e519524SHoward Hinnant insert(__f, __l); 18043e519524SHoward Hinnant } 18053e519524SHoward Hinnant 1806fbc317d4SMarshall Clow#if _LIBCPP_STD_VER > 11 1807fbc317d4SMarshall Clow template <class _InputIterator> 1808fbc317d4SMarshall Clow _LIBCPP_INLINE_VISIBILITY 1809fbc317d4SMarshall Clow multimap(_InputIterator __f, _InputIterator __l, const allocator_type& __a) 1810fbc317d4SMarshall Clow : multimap(__f, __l, key_compare(), __a) {} 1811fbc317d4SMarshall Clow#endif 1812fbc317d4SMarshall Clow 1813848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 18143e519524SHoward Hinnant multimap(const multimap& __m) 18153e519524SHoward Hinnant : __tree_(__m.__tree_.value_comp(), 18163e519524SHoward Hinnant __alloc_traits::select_on_container_copy_construction(__m.__tree_.__alloc())) 18173e519524SHoward Hinnant { 18183e519524SHoward Hinnant insert(__m.begin(), __m.end()); 18193e519524SHoward Hinnant } 18203e519524SHoward Hinnant 18215a33687dSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 18225a33687dSHoward Hinnant multimap& operator=(const multimap& __m) 18235a33687dSHoward Hinnant { 18242ee83725SMarshall Clow#ifndef _LIBCPP_CXX03_LANG 18255a33687dSHoward Hinnant __tree_ = __m.__tree_; 182607d3eccdSHoward Hinnant#else 182774cf6ff5SMarshall Clow if (this != &__m) { 182807d3eccdSHoward Hinnant __tree_.clear(); 182907d3eccdSHoward Hinnant __tree_.value_comp() = __m.__tree_.value_comp(); 183007d3eccdSHoward Hinnant __tree_.__copy_assign_alloc(__m.__tree_); 183107d3eccdSHoward Hinnant insert(__m.begin(), __m.end()); 183274cf6ff5SMarshall Clow } 183307d3eccdSHoward Hinnant#endif 18345a33687dSHoward Hinnant return *this; 18355a33687dSHoward Hinnant } 18365a33687dSHoward Hinnant 183718293116SEric Fiselier#ifndef _LIBCPP_CXX03_LANG 18383e519524SHoward Hinnant 1839848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 18403e519524SHoward Hinnant multimap(multimap&& __m) 18411052ee39SHoward Hinnant _NOEXCEPT_(is_nothrow_move_constructible<__base>::value) 1842ce48a113SHoward Hinnant : __tree_(_VSTD::move(__m.__tree_)) 18433e519524SHoward Hinnant { 18443e519524SHoward Hinnant } 18453e519524SHoward Hinnant 18463e519524SHoward Hinnant multimap(multimap&& __m, const allocator_type& __a); 18473e519524SHoward Hinnant 1848848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 184954976f26SHoward Hinnant multimap& operator=(multimap&& __m) 185054976f26SHoward Hinnant _NOEXCEPT_(is_nothrow_move_assignable<__base>::value) 185154976f26SHoward Hinnant { 185254976f26SHoward Hinnant __tree_ = _VSTD::move(__m.__tree_); 185354976f26SHoward Hinnant return *this; 185454976f26SHoward Hinnant } 185554976f26SHoward Hinnant 185654976f26SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 18573e519524SHoward Hinnant multimap(initializer_list<value_type> __il, const key_compare& __comp = key_compare()) 18583e519524SHoward Hinnant : __tree_(__vc(__comp)) 18593e519524SHoward Hinnant { 18603e519524SHoward Hinnant insert(__il.begin(), __il.end()); 18613e519524SHoward Hinnant } 18623e519524SHoward Hinnant 1863848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 18643e519524SHoward Hinnant multimap(initializer_list<value_type> __il, const key_compare& __comp, const allocator_type& __a) 18652a10c960SMarshall Clow : __tree_(__vc(__comp), typename __base::allocator_type(__a)) 18663e519524SHoward Hinnant { 18673e519524SHoward Hinnant insert(__il.begin(), __il.end()); 18683e519524SHoward Hinnant } 18693e519524SHoward Hinnant 1870fbc317d4SMarshall Clow#if _LIBCPP_STD_VER > 11 1871fbc317d4SMarshall Clow _LIBCPP_INLINE_VISIBILITY 1872fbc317d4SMarshall Clow multimap(initializer_list<value_type> __il, const allocator_type& __a) 1873fbc317d4SMarshall Clow : multimap(__il, key_compare(), __a) {} 1874fbc317d4SMarshall Clow#endif 1875fbc317d4SMarshall Clow 1876848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 18773e519524SHoward Hinnant multimap& operator=(initializer_list<value_type> __il) 18783e519524SHoward Hinnant { 18793e519524SHoward Hinnant __tree_.__assign_multi(__il.begin(), __il.end()); 18803e519524SHoward Hinnant return *this; 18813e519524SHoward Hinnant } 188254976f26SHoward Hinnant 188318293116SEric Fiselier#endif // _LIBCPP_CXX03_LANG 18843e519524SHoward Hinnant 1885848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 18863e519524SHoward Hinnant explicit multimap(const allocator_type& __a) 18872a10c960SMarshall Clow : __tree_(typename __base::allocator_type(__a)) 18883e519524SHoward Hinnant { 18893e519524SHoward Hinnant } 18903e519524SHoward Hinnant 1891848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 18923e519524SHoward Hinnant multimap(const multimap& __m, const allocator_type& __a) 18932a10c960SMarshall Clow : __tree_(__m.__tree_.value_comp(), typename __base::allocator_type(__a)) 18943e519524SHoward Hinnant { 18953e519524SHoward Hinnant insert(__m.begin(), __m.end()); 18963e519524SHoward Hinnant } 18973e519524SHoward Hinnant 1898848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 18997c142fccSLouis Dionne ~multimap() { 19007c142fccSLouis Dionne static_assert(sizeof(__diagnose_non_const_comparator<_Key, _Compare>()), ""); 19017c142fccSLouis Dionne } 19027c142fccSLouis Dionne 19037c142fccSLouis Dionne _LIBCPP_INLINE_VISIBILITY 19041052ee39SHoward Hinnant iterator begin() _NOEXCEPT {return __tree_.begin();} 1905848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 19061052ee39SHoward Hinnant const_iterator begin() const _NOEXCEPT {return __tree_.begin();} 1907848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 19081052ee39SHoward Hinnant iterator end() _NOEXCEPT {return __tree_.end();} 1909848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 19101052ee39SHoward Hinnant const_iterator end() const _NOEXCEPT {return __tree_.end();} 19113e519524SHoward Hinnant 1912848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 19131052ee39SHoward Hinnant reverse_iterator rbegin() _NOEXCEPT {return reverse_iterator(end());} 1914848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 19151052ee39SHoward Hinnant const_reverse_iterator rbegin() const _NOEXCEPT 19161052ee39SHoward Hinnant {return const_reverse_iterator(end());} 1917848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 19181052ee39SHoward Hinnant reverse_iterator rend() _NOEXCEPT {return reverse_iterator(begin());} 1919848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 19201052ee39SHoward Hinnant const_reverse_iterator rend() const _NOEXCEPT 19211052ee39SHoward Hinnant {return const_reverse_iterator(begin());} 19223e519524SHoward Hinnant 1923848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 19241052ee39SHoward Hinnant const_iterator cbegin() const _NOEXCEPT {return begin();} 1925848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 19261052ee39SHoward Hinnant const_iterator cend() const _NOEXCEPT {return end();} 1927848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 19281052ee39SHoward Hinnant const_reverse_iterator crbegin() const _NOEXCEPT {return rbegin();} 1929848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 19301052ee39SHoward Hinnant const_reverse_iterator crend() const _NOEXCEPT {return rend();} 19313e519524SHoward Hinnant 193272c8fad4SMarshall Clow _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY 19331052ee39SHoward Hinnant bool empty() const _NOEXCEPT {return __tree_.size() == 0;} 1934848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 19351052ee39SHoward Hinnant size_type size() const _NOEXCEPT {return __tree_.size();} 1936848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 19371052ee39SHoward Hinnant size_type max_size() const _NOEXCEPT {return __tree_.max_size();} 19383e519524SHoward Hinnant 1939848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 19402a10c960SMarshall Clow allocator_type get_allocator() const _NOEXCEPT {return allocator_type(__tree_.__alloc());} 1941848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 19423e519524SHoward Hinnant key_compare key_comp() const {return __tree_.value_comp().key_comp();} 1943848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 19441052ee39SHoward Hinnant value_compare value_comp() const 19451052ee39SHoward Hinnant {return value_compare(__tree_.value_comp().key_comp());} 19463e519524SHoward Hinnant 19475e3ea4ddSEric Fiselier#ifndef _LIBCPP_CXX03_LANG 19487609c9b6SHoward Hinnant 19498b805c91SHoward Hinnant template <class ..._Args> 19505e3ea4ddSEric Fiselier _LIBCPP_INLINE_VISIBILITY 19515e3ea4ddSEric Fiselier iterator emplace(_Args&& ...__args) { 19525e3ea4ddSEric Fiselier return __tree_.__emplace_multi(_VSTD::forward<_Args>(__args)...); 19535e3ea4ddSEric Fiselier } 19543e519524SHoward Hinnant 19558b805c91SHoward Hinnant template <class ..._Args> 19565e3ea4ddSEric Fiselier _LIBCPP_INLINE_VISIBILITY 19575e3ea4ddSEric Fiselier iterator emplace_hint(const_iterator __p, _Args&& ...__args) { 19585e3ea4ddSEric Fiselier return __tree_.__emplace_hint_multi(__p.__i_, _VSTD::forward<_Args>(__args)...); 19595e3ea4ddSEric Fiselier } 19607609c9b6SHoward Hinnant 1961c003db1fSHoward Hinnant template <class _Pp, 1962c003db1fSHoward Hinnant class = typename enable_if<is_constructible<value_type, _Pp>::value>::type> 1963848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 1964c003db1fSHoward Hinnant iterator insert(_Pp&& __p) 1965c003db1fSHoward Hinnant {return __tree_.__insert_multi(_VSTD::forward<_Pp>(__p));} 19663e519524SHoward Hinnant 1967c003db1fSHoward Hinnant template <class _Pp, 1968c003db1fSHoward Hinnant class = typename enable_if<is_constructible<value_type, _Pp>::value>::type> 1969848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 1970c003db1fSHoward Hinnant iterator insert(const_iterator __pos, _Pp&& __p) 1971c003db1fSHoward Hinnant {return __tree_.__insert_multi(__pos.__i_, _VSTD::forward<_Pp>(__p));} 19723e519524SHoward Hinnant 19737a9f500fSEric Fiselier _LIBCPP_INLINE_VISIBILITY 19747a9f500fSEric Fiselier iterator insert(value_type&& __v) 19757a9f500fSEric Fiselier {return __tree_.__insert_multi(_VSTD::move(__v));} 19767a9f500fSEric Fiselier 19777a9f500fSEric Fiselier _LIBCPP_INLINE_VISIBILITY 19787a9f500fSEric Fiselier iterator insert(const_iterator __p, value_type&& __v) 19797a9f500fSEric Fiselier {return __tree_.__insert_multi(__p.__i_, _VSTD::move(__v));} 19807a9f500fSEric Fiselier 198118293116SEric Fiselier 198218293116SEric Fiselier _LIBCPP_INLINE_VISIBILITY 198318293116SEric Fiselier void insert(initializer_list<value_type> __il) 198418293116SEric Fiselier {insert(__il.begin(), __il.end());} 198518293116SEric Fiselier 19865e3ea4ddSEric Fiselier#endif // _LIBCPP_CXX03_LANG 19873e519524SHoward Hinnant 1988848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 19893e519524SHoward Hinnant iterator insert(const value_type& __v) {return __tree_.__insert_multi(__v);} 19903e519524SHoward Hinnant 1991848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 19923e519524SHoward Hinnant iterator insert(const_iterator __p, const value_type& __v) 19933e519524SHoward Hinnant {return __tree_.__insert_multi(__p.__i_, __v);} 19943e519524SHoward Hinnant 19953e519524SHoward Hinnant template <class _InputIterator> 1996848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 19973e519524SHoward Hinnant void insert(_InputIterator __f, _InputIterator __l) 19983e519524SHoward Hinnant { 19993e519524SHoward Hinnant for (const_iterator __e = cend(); __f != __l; ++__f) 20003e519524SHoward Hinnant __tree_.__insert_multi(__e.__i_, *__f); 20013e519524SHoward Hinnant } 20023e519524SHoward Hinnant 2003848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 20043e519524SHoward Hinnant iterator erase(const_iterator __p) {return __tree_.erase(__p.__i_);} 2005848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 2006ec392968SMarshall Clow iterator erase(iterator __p) {return __tree_.erase(__p.__i_);} 2007ec392968SMarshall Clow _LIBCPP_INLINE_VISIBILITY 20083e519524SHoward Hinnant size_type erase(const key_type& __k) {return __tree_.__erase_multi(__k);} 2009848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 20103e519524SHoward Hinnant iterator erase(const_iterator __f, const_iterator __l) 20113e519524SHoward Hinnant {return __tree_.erase(__f.__i_, __l.__i_);} 2012b0386a51SErik Pilkington 2013b0386a51SErik Pilkington#if _LIBCPP_STD_VER > 14 2014b0386a51SErik Pilkington _LIBCPP_INLINE_VISIBILITY 2015b0386a51SErik Pilkington iterator insert(node_type&& __nh) 2016b0386a51SErik Pilkington { 2017b0386a51SErik Pilkington _LIBCPP_ASSERT(__nh.empty() || __nh.get_allocator() == get_allocator(), 2018b0386a51SErik Pilkington "node_type with incompatible allocator passed to multimap::insert()"); 2019b0386a51SErik Pilkington return __tree_.template __node_handle_insert_multi<node_type>( 2020b0386a51SErik Pilkington _VSTD::move(__nh)); 2021b0386a51SErik Pilkington } 2022b0386a51SErik Pilkington _LIBCPP_INLINE_VISIBILITY 2023b0386a51SErik Pilkington iterator insert(const_iterator __hint, node_type&& __nh) 2024b0386a51SErik Pilkington { 2025b0386a51SErik Pilkington _LIBCPP_ASSERT(__nh.empty() || __nh.get_allocator() == get_allocator(), 2026b0386a51SErik Pilkington "node_type with incompatible allocator passed to multimap::insert()"); 2027b0386a51SErik Pilkington return __tree_.template __node_handle_insert_multi<node_type>( 2028b0386a51SErik Pilkington __hint.__i_, _VSTD::move(__nh)); 2029b0386a51SErik Pilkington } 2030b0386a51SErik Pilkington _LIBCPP_INLINE_VISIBILITY 2031b0386a51SErik Pilkington node_type extract(key_type const& __key) 2032b0386a51SErik Pilkington { 2033b0386a51SErik Pilkington return __tree_.template __node_handle_extract<node_type>(__key); 2034b0386a51SErik Pilkington } 2035b0386a51SErik Pilkington _LIBCPP_INLINE_VISIBILITY 2036b0386a51SErik Pilkington node_type extract(const_iterator __it) 2037b0386a51SErik Pilkington { 2038b0386a51SErik Pilkington return __tree_.template __node_handle_extract<node_type>( 2039b0386a51SErik Pilkington __it.__i_); 2040b0386a51SErik Pilkington } 20418df1d5a5SLouis Dionne template <class _Compare2> 20425c4e07aeSErik Pilkington _LIBCPP_INLINE_VISIBILITY 20438df1d5a5SLouis Dionne void merge(multimap<key_type, mapped_type, _Compare2, allocator_type>& __source) 20445c4e07aeSErik Pilkington { 20455c4e07aeSErik Pilkington _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(), 20465c4e07aeSErik Pilkington "merging container with incompatible allocator"); 20475c4e07aeSErik Pilkington return __tree_.__node_handle_merge_multi(__source.__tree_); 20485c4e07aeSErik Pilkington } 20498df1d5a5SLouis Dionne template <class _Compare2> 20505c4e07aeSErik Pilkington _LIBCPP_INLINE_VISIBILITY 20518df1d5a5SLouis Dionne void merge(multimap<key_type, mapped_type, _Compare2, allocator_type>&& __source) 20525c4e07aeSErik Pilkington { 20535c4e07aeSErik Pilkington _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(), 20545c4e07aeSErik Pilkington "merging container with incompatible allocator"); 20555c4e07aeSErik Pilkington return __tree_.__node_handle_merge_multi(__source.__tree_); 20565c4e07aeSErik Pilkington } 20578df1d5a5SLouis Dionne template <class _Compare2> 20585c4e07aeSErik Pilkington _LIBCPP_INLINE_VISIBILITY 20598df1d5a5SLouis Dionne void merge(map<key_type, mapped_type, _Compare2, allocator_type>& __source) 20605c4e07aeSErik Pilkington { 20615c4e07aeSErik Pilkington _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(), 20625c4e07aeSErik Pilkington "merging container with incompatible allocator"); 20635c4e07aeSErik Pilkington return __tree_.__node_handle_merge_multi(__source.__tree_); 20645c4e07aeSErik Pilkington } 20658df1d5a5SLouis Dionne template <class _Compare2> 20665c4e07aeSErik Pilkington _LIBCPP_INLINE_VISIBILITY 20678df1d5a5SLouis Dionne void merge(map<key_type, mapped_type, _Compare2, allocator_type>&& __source) 20685c4e07aeSErik Pilkington { 20695c4e07aeSErik Pilkington _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(), 20705c4e07aeSErik Pilkington "merging container with incompatible allocator"); 20715c4e07aeSErik Pilkington return __tree_.__node_handle_merge_multi(__source.__tree_); 20725c4e07aeSErik Pilkington } 2073b0386a51SErik Pilkington#endif 2074b0386a51SErik Pilkington 2075848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 2076934e9a39SMarshall Clow void clear() _NOEXCEPT {__tree_.clear();} 20773e519524SHoward Hinnant 2078848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 20791052ee39SHoward Hinnant void swap(multimap& __m) 20801052ee39SHoward Hinnant _NOEXCEPT_(__is_nothrow_swappable<__base>::value) 20811052ee39SHoward Hinnant {__tree_.swap(__m.__tree_);} 20823e519524SHoward Hinnant 2083848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 20843e519524SHoward Hinnant iterator find(const key_type& __k) {return __tree_.find(__k);} 2085848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 20863e519524SHoward Hinnant const_iterator find(const key_type& __k) const {return __tree_.find(__k);} 20872585835cSMarshall Clow#if _LIBCPP_STD_VER > 11 20882585835cSMarshall Clow template <typename _K2> 20892585835cSMarshall Clow _LIBCPP_INLINE_VISIBILITY 20902585835cSMarshall Clow typename enable_if<__is_transparent<_Compare, _K2>::value,iterator>::type 20912585835cSMarshall Clow find(const _K2& __k) {return __tree_.find(__k);} 20922585835cSMarshall Clow template <typename _K2> 20932585835cSMarshall Clow _LIBCPP_INLINE_VISIBILITY 20942585835cSMarshall Clow typename enable_if<__is_transparent<_Compare, _K2>::value,const_iterator>::type 20952585835cSMarshall Clow find(const _K2& __k) const {return __tree_.find(__k);} 20962585835cSMarshall Clow#endif 20972585835cSMarshall Clow 2098848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 20993e519524SHoward Hinnant size_type count(const key_type& __k) const 21003e519524SHoward Hinnant {return __tree_.__count_multi(__k);} 21010aacbc92SMarshall Clow#if _LIBCPP_STD_VER > 11 21020aacbc92SMarshall Clow template <typename _K2> 21030aacbc92SMarshall Clow _LIBCPP_INLINE_VISIBILITY 21040aacbc92SMarshall Clow typename enable_if<__is_transparent<_Compare, _K2>::value,size_type>::type 2105f8457a07SMarshall Clow count(const _K2& __k) const {return __tree_.__count_multi(__k);} 21060aacbc92SMarshall Clow#endif 2107a17b1aedSZoe Carver 2108a17b1aedSZoe Carver#if _LIBCPP_STD_VER > 17 2109a17b1aedSZoe Carver _LIBCPP_INLINE_VISIBILITY 2110a17b1aedSZoe Carver bool contains(const key_type& __k) const {return find(__k) != end();} 21113fca07d7SMarek Kurdej template <typename _K2> 21123fca07d7SMarek Kurdej _LIBCPP_INLINE_VISIBILITY 21133fca07d7SMarek Kurdej typename enable_if<__is_transparent<_Compare, _K2>::value, bool>::type 21143fca07d7SMarek Kurdej contains(const _K2& __k) const { return find(__k) != end(); } 2115a17b1aedSZoe Carver#endif // _LIBCPP_STD_VER > 17 2116a17b1aedSZoe Carver 2117848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 21183e519524SHoward Hinnant iterator lower_bound(const key_type& __k) 21193e519524SHoward Hinnant {return __tree_.lower_bound(__k);} 2120848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 21213e519524SHoward Hinnant const_iterator lower_bound(const key_type& __k) const 21223e519524SHoward Hinnant {return __tree_.lower_bound(__k);} 21232585835cSMarshall Clow#if _LIBCPP_STD_VER > 11 21242585835cSMarshall Clow template <typename _K2> 21252585835cSMarshall Clow _LIBCPP_INLINE_VISIBILITY 21262585835cSMarshall Clow typename enable_if<__is_transparent<_Compare, _K2>::value,iterator>::type 21272585835cSMarshall Clow lower_bound(const _K2& __k) {return __tree_.lower_bound(__k);} 21282585835cSMarshall Clow 21292585835cSMarshall Clow template <typename _K2> 21302585835cSMarshall Clow _LIBCPP_INLINE_VISIBILITY 21312585835cSMarshall Clow typename enable_if<__is_transparent<_Compare, _K2>::value,const_iterator>::type 21322585835cSMarshall Clow lower_bound(const _K2& __k) const {return __tree_.lower_bound(__k);} 21332585835cSMarshall Clow#endif 21342585835cSMarshall Clow 2135848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 21363e519524SHoward Hinnant iterator upper_bound(const key_type& __k) 21373e519524SHoward Hinnant {return __tree_.upper_bound(__k);} 2138848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 21393e519524SHoward Hinnant const_iterator upper_bound(const key_type& __k) const 21403e519524SHoward Hinnant {return __tree_.upper_bound(__k);} 21412585835cSMarshall Clow#if _LIBCPP_STD_VER > 11 21422585835cSMarshall Clow template <typename _K2> 21432585835cSMarshall Clow _LIBCPP_INLINE_VISIBILITY 21442585835cSMarshall Clow typename enable_if<__is_transparent<_Compare, _K2>::value,iterator>::type 21452585835cSMarshall Clow upper_bound(const _K2& __k) {return __tree_.upper_bound(__k);} 21462585835cSMarshall Clow template <typename _K2> 21472585835cSMarshall Clow _LIBCPP_INLINE_VISIBILITY 21482585835cSMarshall Clow typename enable_if<__is_transparent<_Compare, _K2>::value,const_iterator>::type 21492585835cSMarshall Clow upper_bound(const _K2& __k) const {return __tree_.upper_bound(__k);} 21502585835cSMarshall Clow#endif 21512585835cSMarshall Clow 2152848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 21533e519524SHoward Hinnant pair<iterator,iterator> equal_range(const key_type& __k) 21543e519524SHoward Hinnant {return __tree_.__equal_range_multi(__k);} 2155848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 21563e519524SHoward Hinnant pair<const_iterator,const_iterator> equal_range(const key_type& __k) const 21573e519524SHoward Hinnant {return __tree_.__equal_range_multi(__k);} 21582585835cSMarshall Clow#if _LIBCPP_STD_VER > 11 21592585835cSMarshall Clow template <typename _K2> 21602585835cSMarshall Clow _LIBCPP_INLINE_VISIBILITY 21612585835cSMarshall Clow typename enable_if<__is_transparent<_Compare, _K2>::value,pair<iterator,iterator>>::type 21622585835cSMarshall Clow equal_range(const _K2& __k) {return __tree_.__equal_range_multi(__k);} 21632585835cSMarshall Clow template <typename _K2> 21642585835cSMarshall Clow _LIBCPP_INLINE_VISIBILITY 21652585835cSMarshall Clow typename enable_if<__is_transparent<_Compare, _K2>::value,pair<const_iterator,const_iterator>>::type 21662585835cSMarshall Clow equal_range(const _K2& __k) const {return __tree_.__equal_range_multi(__k);} 21672585835cSMarshall Clow#endif 21683e519524SHoward Hinnant 21693e519524SHoward Hinnantprivate: 21703e519524SHoward Hinnant typedef typename __base::__node __node; 21713e519524SHoward Hinnant typedef typename __base::__node_allocator __node_allocator; 21723e519524SHoward Hinnant typedef typename __base::__node_pointer __node_pointer; 21730594ad71SEric Fiselier 2174c003db1fSHoward Hinnant typedef __map_node_destructor<__node_allocator> _Dp; 2175c003db1fSHoward Hinnant typedef unique_ptr<__node, _Dp> __node_holder; 21763e519524SHoward Hinnant}; 21773e519524SHoward Hinnant 217801666904SLouis Dionne#if _LIBCPP_STD_VER >= 17 2179f2f7d72fSLouis Dionnetemplate<class _InputIterator, class _Compare = less<__iter_key_type<_InputIterator>>, 2180f2f7d72fSLouis Dionne class _Allocator = allocator<__iter_to_alloc_type<_InputIterator>>, 2181*4e0ea2cfSLouis Dionne class = enable_if_t<!__is_allocator<_Compare>::value, void>, 2182*4e0ea2cfSLouis Dionne class = enable_if_t<__is_allocator<_Allocator>::value, void>> 2183f2f7d72fSLouis Dionnemultimap(_InputIterator, _InputIterator, _Compare = _Compare(), _Allocator = _Allocator()) 2184f2f7d72fSLouis Dionne -> multimap<__iter_key_type<_InputIterator>, __iter_mapped_type<_InputIterator>, _Compare, _Allocator>; 2185f2f7d72fSLouis Dionne 2186f2f7d72fSLouis Dionnetemplate<class _Key, class _Tp, class _Compare = less<remove_const_t<_Key>>, 2187f2f7d72fSLouis Dionne class _Allocator = allocator<pair<const _Key, _Tp>>, 2188*4e0ea2cfSLouis Dionne class = enable_if_t<!__is_allocator<_Compare>::value, void>, 2189*4e0ea2cfSLouis Dionne class = enable_if_t<__is_allocator<_Allocator>::value, void>> 2190f2f7d72fSLouis Dionnemultimap(initializer_list<pair<_Key, _Tp>>, _Compare = _Compare(), _Allocator = _Allocator()) 2191f2f7d72fSLouis Dionne -> multimap<remove_const_t<_Key>, _Tp, _Compare, _Allocator>; 2192f2f7d72fSLouis Dionne 2193f2f7d72fSLouis Dionnetemplate<class _InputIterator, class _Allocator, 2194*4e0ea2cfSLouis Dionne class = enable_if_t<__is_allocator<_Allocator>::value, void>> 2195f2f7d72fSLouis Dionnemultimap(_InputIterator, _InputIterator, _Allocator) 2196f2f7d72fSLouis Dionne -> multimap<__iter_key_type<_InputIterator>, __iter_mapped_type<_InputIterator>, 2197f2f7d72fSLouis Dionne less<__iter_key_type<_InputIterator>>, _Allocator>; 2198f2f7d72fSLouis Dionne 2199f2f7d72fSLouis Dionnetemplate<class _Key, class _Tp, class _Allocator, 2200*4e0ea2cfSLouis Dionne class = enable_if_t<__is_allocator<_Allocator>::value, void>> 2201f2f7d72fSLouis Dionnemultimap(initializer_list<pair<_Key, _Tp>>, _Allocator) 2202f2f7d72fSLouis Dionne -> multimap<remove_const_t<_Key>, _Tp, less<remove_const_t<_Key>>, _Allocator>; 2203f2f7d72fSLouis Dionne#endif 2204f2f7d72fSLouis Dionne 22055e3ea4ddSEric Fiselier#ifndef _LIBCPP_CXX03_LANG 22063e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 22073e519524SHoward Hinnantmultimap<_Key, _Tp, _Compare, _Allocator>::multimap(multimap&& __m, const allocator_type& __a) 22082a10c960SMarshall Clow : __tree_(_VSTD::move(__m.__tree_), typename __base::allocator_type(__a)) 22093e519524SHoward Hinnant{ 22103e519524SHoward Hinnant if (__a != __m.get_allocator()) 22113e519524SHoward Hinnant { 22123e519524SHoward Hinnant const_iterator __e = cend(); 22133e519524SHoward Hinnant while (!__m.empty()) 22143e519524SHoward Hinnant __tree_.__insert_multi(__e.__i_, 2215f52318b4SErik Pilkington _VSTD::move(__m.__tree_.remove(__m.begin().__i_)->__value_.__move())); 22163e519524SHoward Hinnant } 22173e519524SHoward Hinnant} 22185e3ea4ddSEric Fiselier#endif 22193e519524SHoward Hinnant 22203e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 2221848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 22223e519524SHoward Hinnantbool 22233e519524SHoward Hinnantoperator==(const multimap<_Key, _Tp, _Compare, _Allocator>& __x, 22243e519524SHoward Hinnant const multimap<_Key, _Tp, _Compare, _Allocator>& __y) 22253e519524SHoward Hinnant{ 2226ce48a113SHoward Hinnant return __x.size() == __y.size() && _VSTD::equal(__x.begin(), __x.end(), __y.begin()); 22273e519524SHoward Hinnant} 22283e519524SHoward Hinnant 22293e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 2230848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 22313e519524SHoward Hinnantbool 22323e519524SHoward Hinnantoperator< (const multimap<_Key, _Tp, _Compare, _Allocator>& __x, 22333e519524SHoward Hinnant const multimap<_Key, _Tp, _Compare, _Allocator>& __y) 22343e519524SHoward Hinnant{ 2235ce48a113SHoward Hinnant return _VSTD::lexicographical_compare(__x.begin(), __x.end(), __y.begin(), __y.end()); 22363e519524SHoward Hinnant} 22373e519524SHoward Hinnant 22383e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 2239848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 22403e519524SHoward Hinnantbool 22413e519524SHoward Hinnantoperator!=(const multimap<_Key, _Tp, _Compare, _Allocator>& __x, 22423e519524SHoward Hinnant const multimap<_Key, _Tp, _Compare, _Allocator>& __y) 22433e519524SHoward Hinnant{ 22443e519524SHoward Hinnant return !(__x == __y); 22453e519524SHoward Hinnant} 22463e519524SHoward Hinnant 22473e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 2248848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 22493e519524SHoward Hinnantbool 22503e519524SHoward Hinnantoperator> (const multimap<_Key, _Tp, _Compare, _Allocator>& __x, 22513e519524SHoward Hinnant const multimap<_Key, _Tp, _Compare, _Allocator>& __y) 22523e519524SHoward Hinnant{ 22533e519524SHoward Hinnant return __y < __x; 22543e519524SHoward Hinnant} 22553e519524SHoward Hinnant 22563e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 2257848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 22583e519524SHoward Hinnantbool 22593e519524SHoward Hinnantoperator>=(const multimap<_Key, _Tp, _Compare, _Allocator>& __x, 22603e519524SHoward Hinnant const multimap<_Key, _Tp, _Compare, _Allocator>& __y) 22613e519524SHoward Hinnant{ 22623e519524SHoward Hinnant return !(__x < __y); 22633e519524SHoward Hinnant} 22643e519524SHoward Hinnant 22653e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 2266848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 22673e519524SHoward Hinnantbool 22683e519524SHoward Hinnantoperator<=(const multimap<_Key, _Tp, _Compare, _Allocator>& __x, 22693e519524SHoward Hinnant const multimap<_Key, _Tp, _Compare, _Allocator>& __y) 22703e519524SHoward Hinnant{ 22713e519524SHoward Hinnant return !(__y < __x); 22723e519524SHoward Hinnant} 22733e519524SHoward Hinnant 22743e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 2275848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 22763e519524SHoward Hinnantvoid 22773e519524SHoward Hinnantswap(multimap<_Key, _Tp, _Compare, _Allocator>& __x, 22783e519524SHoward Hinnant multimap<_Key, _Tp, _Compare, _Allocator>& __y) 22791052ee39SHoward Hinnant _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y))) 22803e519524SHoward Hinnant{ 22813e519524SHoward Hinnant __x.swap(__y); 22823e519524SHoward Hinnant} 22833e519524SHoward Hinnant 2284f60c63c0SMarshall Clow#if _LIBCPP_STD_VER > 17 22853e895085SMarek Kurdejtemplate <class _Key, class _Tp, class _Compare, class _Allocator, 22863e895085SMarek Kurdej class _Predicate> 2287f60c63c0SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY 22883e895085SMarek Kurdej typename multimap<_Key, _Tp, _Compare, _Allocator>::size_type 22893e895085SMarek Kurdej erase_if(multimap<_Key, _Tp, _Compare, _Allocator>& __c, 22903e895085SMarek Kurdej _Predicate __pred) { 22912ac6babcSArthur O'Dwyer return _VSTD::__libcpp_erase_if_container(__c, __pred); 22923e895085SMarek Kurdej} 2293f60c63c0SMarshall Clow#endif 2294f60c63c0SMarshall Clow 22953e519524SHoward Hinnant_LIBCPP_END_NAMESPACE_STD 22963e519524SHoward Hinnant 22973e519524SHoward Hinnant#endif // _LIBCPP_MAP 2298