13e519524SHoward Hinnant// -*- C++ -*- 2eb8650a7SLouis Dionne//===----------------------------------------------------------------------===// 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 22668072a71SKonstantin Varlamovtemplate <class InputIterator, 22768072a71SKonstantin Varlamov class Compare = less<iter_key_t<InputIterator>>, 22868072a71SKonstantin Varlamov class Allocator = allocator<iter_to_alloc_t<InputIterator>>> 22968072a71SKonstantin Varlamovmap(InputIterator, InputIterator, Compare = Compare(), Allocator = Allocator()) 23068072a71SKonstantin Varlamov -> map<iter_key_t<InputIterator>, iter_val_t<InputIterator>, Compare, Allocator>; // C++17 23168072a71SKonstantin Varlamov 23268072a71SKonstantin Varlamovtemplate<class Key, class T, class Compare = less<Key>, 23368072a71SKonstantin Varlamov class Allocator = allocator<pair<const Key, T>>> 23468072a71SKonstantin Varlamovmap(initializer_list<pair<const Key, T>>, Compare = Compare(), Allocator = Allocator()) 23568072a71SKonstantin Varlamov -> map<Key, T, Compare, Allocator>; // C++17 23668072a71SKonstantin Varlamov 23768072a71SKonstantin Varlamovtemplate <class InputIterator, class Allocator> 23868072a71SKonstantin Varlamovmap(InputIterator, InputIterator, Allocator) 23968072a71SKonstantin Varlamov -> map<iter_key_t<InputIterator>, iter_val_t<InputIterator>, less<iter_key_t<InputIterator>>, 24068072a71SKonstantin Varlamov Allocator>; // C++17 24168072a71SKonstantin Varlamov 24268072a71SKonstantin Varlamovtemplate<class Key, class T, class Allocator> 24368072a71SKonstantin Varlamovmap(initializer_list<pair<const Key, T>>, Allocator) -> map<Key, T, less<Key>, Allocator>; // C++17 24468072a71SKonstantin Varlamov 2453e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator> 2463e519524SHoward Hinnantbool 2473e519524SHoward Hinnantoperator==(const map<Key, T, Compare, Allocator>& x, 2483e519524SHoward Hinnant const map<Key, T, Compare, Allocator>& y); 2493e519524SHoward Hinnant 2503e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator> 2513e519524SHoward Hinnantbool 2523e519524SHoward Hinnantoperator< (const map<Key, T, Compare, Allocator>& x, 2533e519524SHoward Hinnant const map<Key, T, Compare, Allocator>& y); 2543e519524SHoward Hinnant 2553e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator> 2563e519524SHoward Hinnantbool 2573e519524SHoward Hinnantoperator!=(const map<Key, T, Compare, Allocator>& x, 2583e519524SHoward Hinnant const map<Key, T, Compare, Allocator>& y); 2593e519524SHoward Hinnant 2603e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator> 2613e519524SHoward Hinnantbool 2623e519524SHoward Hinnantoperator> (const map<Key, T, Compare, Allocator>& x, 2633e519524SHoward Hinnant const map<Key, T, Compare, Allocator>& y); 2643e519524SHoward Hinnant 2653e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator> 2663e519524SHoward Hinnantbool 2673e519524SHoward Hinnantoperator>=(const map<Key, T, Compare, Allocator>& x, 2683e519524SHoward Hinnant const map<Key, T, Compare, Allocator>& y); 2693e519524SHoward Hinnant 2703e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator> 2713e519524SHoward Hinnantbool 2723e519524SHoward Hinnantoperator<=(const map<Key, T, Compare, Allocator>& x, 2733e519524SHoward Hinnant const map<Key, T, Compare, Allocator>& y); 2743e519524SHoward Hinnant 2753e519524SHoward Hinnant// specialized algorithms: 2763e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator> 2773e519524SHoward Hinnantvoid 2781052ee39SHoward Hinnantswap(map<Key, T, Compare, Allocator>& x, map<Key, T, Compare, Allocator>& y) 2791052ee39SHoward Hinnant noexcept(noexcept(x.swap(y))); 2803e519524SHoward Hinnant 281f60c63c0SMarshall Clowtemplate <class Key, class T, class Compare, class Allocator, class Predicate> 2823e895085SMarek Kurdejtypename map<Key, T, Compare, Allocator>::size_type 2833e895085SMarek Kurdejerase_if(map<Key, T, Compare, Allocator>& c, Predicate pred); // C++20 284f60c63c0SMarshall Clow 285f60c63c0SMarshall Clow 2863e519524SHoward Hinnanttemplate <class Key, class T, class Compare = less<Key>, 2873e519524SHoward Hinnant class Allocator = allocator<pair<const Key, T>>> 2883e519524SHoward Hinnantclass multimap 2893e519524SHoward Hinnant{ 2903e519524SHoward Hinnantpublic: 2913e519524SHoward Hinnant // types: 2923e519524SHoward Hinnant typedef Key key_type; 2933e519524SHoward Hinnant typedef T mapped_type; 2943e519524SHoward Hinnant typedef pair<const key_type,mapped_type> value_type; 2953e519524SHoward Hinnant typedef Compare key_compare; 2963e519524SHoward Hinnant typedef Allocator allocator_type; 2973e519524SHoward Hinnant typedef typename allocator_type::reference reference; 2983e519524SHoward Hinnant typedef typename allocator_type::const_reference const_reference; 2993e519524SHoward Hinnant typedef typename allocator_type::size_type size_type; 3003e519524SHoward Hinnant typedef typename allocator_type::difference_type difference_type; 3013e519524SHoward Hinnant typedef typename allocator_type::pointer pointer; 3023e519524SHoward Hinnant typedef typename allocator_type::const_pointer const_pointer; 3033e519524SHoward Hinnant 3043e519524SHoward Hinnant typedef implementation-defined iterator; 3053e519524SHoward Hinnant typedef implementation-defined const_iterator; 3063e519524SHoward Hinnant typedef std::reverse_iterator<iterator> reverse_iterator; 3073e519524SHoward Hinnant typedef std::reverse_iterator<const_iterator> const_reverse_iterator; 308b0386a51SErik Pilkington typedef unspecified node_type; // C++17 3093e519524SHoward Hinnant 3103e519524SHoward Hinnant class value_compare 3113e519524SHoward Hinnant { 3123e519524SHoward Hinnant friend class multimap; 3133e519524SHoward Hinnant protected: 3143e519524SHoward Hinnant key_compare comp; 3153e519524SHoward Hinnant value_compare(key_compare c); 3163e519524SHoward Hinnant public: 317dc066888SArthur O'Dwyer typedef bool result_type; // deprecated in C++17, removed in C++20 318dc066888SArthur O'Dwyer typedef value_type first_argument_type; // deprecated in C++17, removed in C++20 319dc066888SArthur O'Dwyer typedef value_type second_argument_type; // deprecated in C++17, removed in C++20 3203e519524SHoward Hinnant bool operator()(const value_type& x, const value_type& y) const; 3213e519524SHoward Hinnant }; 3223e519524SHoward Hinnant 3233e519524SHoward Hinnant // construct/copy/destroy: 3241052ee39SHoward Hinnant multimap() 3251052ee39SHoward Hinnant noexcept( 3261052ee39SHoward Hinnant is_nothrow_default_constructible<allocator_type>::value && 3271052ee39SHoward Hinnant is_nothrow_default_constructible<key_compare>::value && 3281052ee39SHoward Hinnant is_nothrow_copy_constructible<key_compare>::value); 3291052ee39SHoward Hinnant explicit multimap(const key_compare& comp); 3303e519524SHoward Hinnant multimap(const key_compare& comp, const allocator_type& a); 3313e519524SHoward Hinnant template <class InputIterator> 3323e519524SHoward Hinnant multimap(InputIterator first, InputIterator last, const key_compare& comp); 3333e519524SHoward Hinnant template <class InputIterator> 3343e519524SHoward Hinnant multimap(InputIterator first, InputIterator last, const key_compare& comp, 3353e519524SHoward Hinnant const allocator_type& a); 3363e519524SHoward Hinnant multimap(const multimap& m); 3371052ee39SHoward Hinnant multimap(multimap&& m) 3381052ee39SHoward Hinnant noexcept( 3391052ee39SHoward Hinnant is_nothrow_move_constructible<allocator_type>::value && 3401052ee39SHoward Hinnant is_nothrow_move_constructible<key_compare>::value); 3413e519524SHoward Hinnant explicit multimap(const allocator_type& a); 3423e519524SHoward Hinnant multimap(const multimap& m, const allocator_type& a); 3433e519524SHoward Hinnant multimap(multimap&& m, const allocator_type& a); 3443e519524SHoward Hinnant multimap(initializer_list<value_type> il, const key_compare& comp = key_compare()); 3453e519524SHoward Hinnant multimap(initializer_list<value_type> il, const key_compare& comp, 3463e519524SHoward Hinnant const allocator_type& a); 347fbc317d4SMarshall Clow template <class InputIterator> 348fbc317d4SMarshall Clow multimap(InputIterator first, InputIterator last, const allocator_type& a) 349fbc317d4SMarshall Clow : multimap(first, last, Compare(), a) {} // C++14 350fbc317d4SMarshall Clow multimap(initializer_list<value_type> il, const allocator_type& a) 351fbc317d4SMarshall Clow : multimap(il, Compare(), a) {} // C++14 3523e519524SHoward Hinnant ~multimap(); 3533e519524SHoward Hinnant 3543e519524SHoward Hinnant multimap& operator=(const multimap& m); 3551052ee39SHoward Hinnant multimap& operator=(multimap&& m) 3561052ee39SHoward Hinnant noexcept( 3571052ee39SHoward Hinnant allocator_type::propagate_on_container_move_assignment::value && 3581052ee39SHoward Hinnant is_nothrow_move_assignable<allocator_type>::value && 3590e9f71c1SHoward Hinnant is_nothrow_move_assignable<key_compare>::value); 3603e519524SHoward Hinnant multimap& operator=(initializer_list<value_type> il); 3613e519524SHoward Hinnant 3623e519524SHoward Hinnant // iterators: 3630e9f71c1SHoward Hinnant iterator begin() noexcept; 3640e9f71c1SHoward Hinnant const_iterator begin() const noexcept; 3650e9f71c1SHoward Hinnant iterator end() noexcept; 3660e9f71c1SHoward Hinnant const_iterator end() const noexcept; 3673e519524SHoward Hinnant 3680e9f71c1SHoward Hinnant reverse_iterator rbegin() noexcept; 3690e9f71c1SHoward Hinnant const_reverse_iterator rbegin() const noexcept; 3700e9f71c1SHoward Hinnant reverse_iterator rend() noexcept; 3710e9f71c1SHoward Hinnant const_reverse_iterator rend() const noexcept; 3723e519524SHoward Hinnant 3730e9f71c1SHoward Hinnant const_iterator cbegin() const noexcept; 3740e9f71c1SHoward Hinnant const_iterator cend() const noexcept; 3750e9f71c1SHoward Hinnant const_reverse_iterator crbegin() const noexcept; 3760e9f71c1SHoward Hinnant const_reverse_iterator crend() const noexcept; 3773e519524SHoward Hinnant 3783e519524SHoward Hinnant // capacity: 3790e9f71c1SHoward Hinnant bool empty() const noexcept; 3800e9f71c1SHoward Hinnant size_type size() const noexcept; 3810e9f71c1SHoward Hinnant size_type max_size() const noexcept; 3823e519524SHoward Hinnant 3833e519524SHoward Hinnant // modifiers: 3843e519524SHoward Hinnant template <class... Args> 3853e519524SHoward Hinnant iterator emplace(Args&&... args); 3863e519524SHoward Hinnant template <class... Args> 3873e519524SHoward Hinnant iterator emplace_hint(const_iterator position, Args&&... args); 3883e519524SHoward Hinnant iterator insert(const value_type& v); 389afc9ff99SMarshall Clow iterator insert( value_type&& v); // C++17 3903e519524SHoward Hinnant template <class P> 3913e519524SHoward Hinnant iterator insert(P&& p); 3923e519524SHoward Hinnant iterator insert(const_iterator position, const value_type& v); 393afc9ff99SMarshall Clow iterator insert(const_iterator position, value_type&& v); // C++17 3943e519524SHoward Hinnant template <class P> 3953e519524SHoward Hinnant iterator insert(const_iterator position, P&& p); 3963e519524SHoward Hinnant template <class InputIterator> 3973e519524SHoward Hinnant void insert(InputIterator first, InputIterator last); 3983e519524SHoward Hinnant void insert(initializer_list<value_type> il); 3993e519524SHoward Hinnant 400b0386a51SErik Pilkington node_type extract(const_iterator position); // C++17 401b0386a51SErik Pilkington node_type extract(const key_type& x); // C++17 402b0386a51SErik Pilkington iterator insert(node_type&& nh); // C++17 403b0386a51SErik Pilkington iterator insert(const_iterator hint, node_type&& nh); // C++17 404b0386a51SErik Pilkington 4053e519524SHoward Hinnant iterator erase(const_iterator position); 406ec392968SMarshall Clow iterator erase(iterator position); // C++14 4073e519524SHoward Hinnant size_type erase(const key_type& k); 4083e519524SHoward Hinnant iterator erase(const_iterator first, const_iterator last); 4090e9f71c1SHoward Hinnant void clear() noexcept; 4103e519524SHoward Hinnant 4115c4e07aeSErik Pilkington template<class C2> 4125c4e07aeSErik Pilkington void merge(multimap<Key, T, C2, Allocator>& source); // C++17 4135c4e07aeSErik Pilkington template<class C2> 4145c4e07aeSErik Pilkington void merge(multimap<Key, T, C2, Allocator>&& source); // C++17 4155c4e07aeSErik Pilkington template<class C2> 4165c4e07aeSErik Pilkington void merge(map<Key, T, C2, Allocator>& source); // C++17 4175c4e07aeSErik Pilkington template<class C2> 4185c4e07aeSErik Pilkington void merge(map<Key, T, C2, Allocator>&& source); // C++17 4195c4e07aeSErik Pilkington 4201052ee39SHoward Hinnant void swap(multimap& m) 421e3fbe143SMarshall Clow noexcept(allocator_traits<allocator_type>::is_always_equal::value && 422f07dd8d0SEric Fiselier is_nothrow_swappable<key_compare>::value); // C++17 4233e519524SHoward Hinnant 4243e519524SHoward Hinnant // observers: 4250e9f71c1SHoward Hinnant allocator_type get_allocator() const noexcept; 4263e519524SHoward Hinnant key_compare key_comp() const; 4273e519524SHoward Hinnant value_compare value_comp() const; 4283e519524SHoward Hinnant 4293e519524SHoward Hinnant // map operations: 4303e519524SHoward Hinnant iterator find(const key_type& k); 4313e519524SHoward Hinnant const_iterator find(const key_type& k) const; 4322585835cSMarshall Clow template<typename K> 4332585835cSMarshall Clow iterator find(const K& x); // C++14 4342585835cSMarshall Clow template<typename K> 4352585835cSMarshall Clow const_iterator find(const K& x) const; // C++14 4363fca07d7SMarek Kurdej 4372585835cSMarshall Clow template<typename K> 4380aacbc92SMarshall Clow size_type count(const K& x) const; // C++14 4393e519524SHoward Hinnant size_type count(const key_type& k) const; 4403fca07d7SMarek Kurdej 441a17b1aedSZoe Carver bool contains(const key_type& x) const; // C++20 4423fca07d7SMarek Kurdej template<class K> bool contains(const K& x) const; // C++20 4433fca07d7SMarek Kurdej 4443e519524SHoward Hinnant iterator lower_bound(const key_type& k); 4453e519524SHoward Hinnant const_iterator lower_bound(const key_type& k) const; 4462585835cSMarshall Clow template<typename K> 4472585835cSMarshall Clow iterator lower_bound(const K& x); // C++14 4482585835cSMarshall Clow template<typename K> 4492585835cSMarshall Clow const_iterator lower_bound(const K& x) const; // C++14 4502585835cSMarshall Clow 4513e519524SHoward Hinnant iterator upper_bound(const key_type& k); 4523e519524SHoward Hinnant const_iterator upper_bound(const key_type& k) const; 4532585835cSMarshall Clow template<typename K> 4542585835cSMarshall Clow iterator upper_bound(const K& x); // C++14 4552585835cSMarshall Clow template<typename K> 4562585835cSMarshall Clow const_iterator upper_bound(const K& x) const; // C++14 4572585835cSMarshall Clow 4583e519524SHoward Hinnant pair<iterator,iterator> equal_range(const key_type& k); 4593e519524SHoward Hinnant pair<const_iterator,const_iterator> equal_range(const key_type& k) const; 4602585835cSMarshall Clow template<typename K> 4612585835cSMarshall Clow pair<iterator,iterator> equal_range(const K& x); // C++14 4622585835cSMarshall Clow template<typename K> 4632585835cSMarshall Clow pair<const_iterator,const_iterator> equal_range(const K& x) const; // C++14 4643e519524SHoward Hinnant}; 4653e519524SHoward Hinnant 46668072a71SKonstantin Varlamovtemplate <class InputIterator, 46768072a71SKonstantin Varlamov class Compare = less<iter_key_t<InputIterator>>, 46868072a71SKonstantin Varlamov class Allocator = allocator<iter_to_alloc_t<InputIterator>>> 46968072a71SKonstantin Varlamovmultimap(InputIterator, InputIterator, Compare = Compare(), Allocator = Allocator()) 47068072a71SKonstantin Varlamov -> multimap<iter_key_t<InputIterator>, iter_val_t<InputIterator>, Compare, Allocator>; // C++17 47168072a71SKonstantin Varlamov 47268072a71SKonstantin Varlamovtemplate<class Key, class T, class Compare = less<Key>, 47368072a71SKonstantin Varlamov class Allocator = allocator<pair<const Key, T>>> 47468072a71SKonstantin Varlamovmultimap(initializer_list<pair<const Key, T>>, Compare = Compare(), Allocator = Allocator()) 47568072a71SKonstantin Varlamov -> multimap<Key, T, Compare, Allocator>; // C++17 47668072a71SKonstantin Varlamov 47768072a71SKonstantin Varlamovtemplate <class InputIterator, class Allocator> 47868072a71SKonstantin Varlamovmultimap(InputIterator, InputIterator, Allocator) 47968072a71SKonstantin Varlamov -> multimap<iter_key_t<InputIterator>, iter_val_t<InputIterator>, 48068072a71SKonstantin Varlamov less<iter_key_t<InputIterator>>, Allocator>; // C++17 48168072a71SKonstantin Varlamov 48268072a71SKonstantin Varlamovtemplate<class Key, class T, class Allocator> 48368072a71SKonstantin Varlamovmultimap(initializer_list<pair<const Key, T>>, Allocator) 48468072a71SKonstantin Varlamov -> multimap<Key, T, less<Key>, Allocator>; // C++17 48568072a71SKonstantin Varlamov 4863e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator> 4873e519524SHoward Hinnantbool 4883e519524SHoward Hinnantoperator==(const multimap<Key, T, Compare, Allocator>& x, 4893e519524SHoward Hinnant const multimap<Key, T, Compare, Allocator>& y); 4903e519524SHoward Hinnant 4913e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator> 4923e519524SHoward Hinnantbool 4933e519524SHoward Hinnantoperator< (const multimap<Key, T, Compare, Allocator>& x, 4943e519524SHoward Hinnant const multimap<Key, T, Compare, Allocator>& y); 4953e519524SHoward Hinnant 4963e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator> 4973e519524SHoward Hinnantbool 4983e519524SHoward Hinnantoperator!=(const multimap<Key, T, Compare, Allocator>& x, 4993e519524SHoward Hinnant const multimap<Key, T, Compare, Allocator>& y); 5003e519524SHoward Hinnant 5013e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator> 5023e519524SHoward Hinnantbool 5033e519524SHoward Hinnantoperator> (const multimap<Key, T, Compare, Allocator>& x, 5043e519524SHoward Hinnant const multimap<Key, T, Compare, Allocator>& y); 5053e519524SHoward Hinnant 5063e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator> 5073e519524SHoward Hinnantbool 5083e519524SHoward Hinnantoperator>=(const multimap<Key, T, Compare, Allocator>& x, 5093e519524SHoward Hinnant const multimap<Key, T, Compare, Allocator>& y); 5103e519524SHoward Hinnant 5113e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator> 5123e519524SHoward Hinnantbool 5133e519524SHoward Hinnantoperator<=(const multimap<Key, T, Compare, Allocator>& x, 5143e519524SHoward Hinnant const multimap<Key, T, Compare, Allocator>& y); 5153e519524SHoward Hinnant 5163e519524SHoward Hinnant// specialized algorithms: 5173e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator> 5183e519524SHoward Hinnantvoid 5193e519524SHoward Hinnantswap(multimap<Key, T, Compare, Allocator>& x, 5201052ee39SHoward Hinnant multimap<Key, T, Compare, Allocator>& y) 5211052ee39SHoward Hinnant noexcept(noexcept(x.swap(y))); 5223e519524SHoward Hinnant 523f60c63c0SMarshall Clowtemplate <class Key, class T, class Compare, class Allocator, class Predicate> 5243e895085SMarek Kurdejtypename multimap<Key, T, Compare, Allocator>::size_type 5253e895085SMarek Kurdejerase_if(multimap<Key, T, Compare, Allocator>& c, Predicate pred); // C++20 526f60c63c0SMarshall Clow 5273e519524SHoward Hinnant} // std 5283e519524SHoward Hinnant 5293e519524SHoward Hinnant*/ 5303e519524SHoward Hinnant 5312e2f3158SNikolas Klauser#include <__algorithm/equal.h> 5322e2f3158SNikolas Klauser#include <__algorithm/lexicographical_compare.h> 533385cc25aSLouis Dionne#include <__assert> // all public C++ headers provide the assertion handler 5343e519524SHoward Hinnant#include <__config> 53534f73804SNikolas Klauser#include <__functional/binary_function.h> 536050b064fSChristopher Di Bella#include <__functional/is_transparent.h> 53734f73804SNikolas Klauser#include <__functional/operations.h> 5383cd4531bSNikolas Klauser#include <__iterator/erase_if_container.h> 53968072a71SKonstantin Varlamov#include <__iterator/iterator_traits.h> 5403cd4531bSNikolas Klauser#include <__iterator/reverse_iterator.h> 541b0386a51SErik Pilkington#include <__node_handle> 54206b40e80SArthur O'Dwyer#include <__tree> 5436adbc83eSChristopher Di Bella#include <__utility/forward.h> 54452915d78SNikolas Klauser#include <__utility/swap.h> 5453e519524SHoward Hinnant#include <memory> 546ee187e24SEric Fiselier#include <type_traits> 547f56972e2SMarshall Clow#include <version> 5483e519524SHoward Hinnant 549de4a57cbSLouis Dionne#ifndef _LIBCPP_REMOVE_TRANSITIVE_INCLUDES 550de4a57cbSLouis Dionne# include <functional> 551de4a57cbSLouis Dionne# include <iterator> 552de4a57cbSLouis Dionne# include <utility> 553de4a57cbSLouis Dionne#endif 554de4a57cbSLouis Dionne 555db1978b6SNikolas Klauser// standard-mandated includes 556db1978b6SNikolas Klauser 557db1978b6SNikolas Klauser// [iterator.range] 558db1978b6SNikolas Klauser#include <__iterator/access.h> 559db1978b6SNikolas Klauser#include <__iterator/data.h> 560db1978b6SNikolas Klauser#include <__iterator/empty.h> 561db1978b6SNikolas Klauser#include <__iterator/reverse_access.h> 562db1978b6SNikolas Klauser#include <__iterator/size.h> 563db1978b6SNikolas Klauser 564db1978b6SNikolas Klauser// [associative.map.syn] 565db1978b6SNikolas Klauser#include <compare> 566db1978b6SNikolas Klauser#include <initializer_list> 567db1978b6SNikolas Klauser 568073458b1SHoward Hinnant#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 5693e519524SHoward Hinnant# pragma GCC system_header 570073458b1SHoward Hinnant#endif 5713e519524SHoward Hinnant 5723e519524SHoward Hinnant_LIBCPP_BEGIN_NAMESPACE_STD 5733e519524SHoward Hinnant 5743560fbf3SLouis Dionnetemplate <class _Key, class _CP, class _Compare, 5753560fbf3SLouis Dionne bool = is_empty<_Compare>::value && !__libcpp_is_final<_Compare>::value> 5763e519524SHoward Hinnantclass __map_value_compare 5773e519524SHoward Hinnant : private _Compare 5783e519524SHoward Hinnant{ 5793e519524SHoward Hinnantpublic: 580848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 5811052ee39SHoward Hinnant __map_value_compare() 5821052ee39SHoward Hinnant _NOEXCEPT_(is_nothrow_default_constructible<_Compare>::value) 5831052ee39SHoward Hinnant : _Compare() {} 584848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 585*b48c5010SNikolas Klauser __map_value_compare(_Compare __c) 5861052ee39SHoward Hinnant _NOEXCEPT_(is_nothrow_copy_constructible<_Compare>::value) 587*b48c5010SNikolas Klauser : _Compare(__c) {} 588848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 5891052ee39SHoward Hinnant const _Compare& key_comp() const _NOEXCEPT {return *this;} 590848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 5913e519524SHoward Hinnant bool operator()(const _CP& __x, const _CP& __y) const 592f52318b4SErik Pilkington {return static_cast<const _Compare&>(*this)(__x.__get_value().first, __y.__get_value().first);} 593848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 5943e519524SHoward Hinnant bool operator()(const _CP& __x, const _Key& __y) const 595f52318b4SErik Pilkington {return static_cast<const _Compare&>(*this)(__x.__get_value().first, __y);} 596848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 5973e519524SHoward Hinnant bool operator()(const _Key& __x, const _CP& __y) const 598f52318b4SErik Pilkington {return static_cast<const _Compare&>(*this)(__x, __y.__get_value().first);} 599e3fbe143SMarshall Clow void swap(__map_value_compare& __y) 600e3fbe143SMarshall Clow _NOEXCEPT_(__is_nothrow_swappable<_Compare>::value) 601e3fbe143SMarshall Clow { 602e3fbe143SMarshall Clow using _VSTD::swap; 603e1ec2986SEric Fiselier swap(static_cast<_Compare&>(*this), static_cast<_Compare&>(__y)); 604e3fbe143SMarshall Clow } 6052585835cSMarshall Clow 6062585835cSMarshall Clow#if _LIBCPP_STD_VER > 11 6072585835cSMarshall Clow template <typename _K2> 6082585835cSMarshall Clow _LIBCPP_INLINE_VISIBILITY 609d5db71d1SArthur O'Dwyer bool operator()(const _K2& __x, const _CP& __y) const 610f52318b4SErik Pilkington {return static_cast<const _Compare&>(*this)(__x, __y.__get_value().first);} 6112585835cSMarshall Clow 6122585835cSMarshall Clow template <typename _K2> 6132585835cSMarshall Clow _LIBCPP_INLINE_VISIBILITY 614d5db71d1SArthur O'Dwyer bool operator()(const _CP& __x, const _K2& __y) const 615f52318b4SErik Pilkington {return static_cast<const _Compare&>(*this)(__x.__get_value().first, __y);} 6162585835cSMarshall Clow#endif 6173e519524SHoward Hinnant}; 6183e519524SHoward Hinnant 619abb160e6SHoward Hinnanttemplate <class _Key, class _CP, class _Compare> 620abb160e6SHoward Hinnantclass __map_value_compare<_Key, _CP, _Compare, false> 6213e519524SHoward Hinnant{ 6223e519524SHoward Hinnant _Compare comp; 6233e519524SHoward Hinnant 6243e519524SHoward Hinnantpublic: 625848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 6261052ee39SHoward Hinnant __map_value_compare() 6271052ee39SHoward Hinnant _NOEXCEPT_(is_nothrow_default_constructible<_Compare>::value) 6281052ee39SHoward Hinnant : comp() {} 629848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 630*b48c5010SNikolas Klauser __map_value_compare(_Compare __c) 6311052ee39SHoward Hinnant _NOEXCEPT_(is_nothrow_copy_constructible<_Compare>::value) 632*b48c5010SNikolas Klauser : comp(__c) {} 633848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 6341052ee39SHoward Hinnant const _Compare& key_comp() const _NOEXCEPT {return comp;} 6353e519524SHoward Hinnant 636848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 6373e519524SHoward Hinnant bool operator()(const _CP& __x, const _CP& __y) const 638f52318b4SErik Pilkington {return comp(__x.__get_value().first, __y.__get_value().first);} 639848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 6403e519524SHoward Hinnant bool operator()(const _CP& __x, const _Key& __y) const 641f52318b4SErik Pilkington {return comp(__x.__get_value().first, __y);} 642848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 6433e519524SHoward Hinnant bool operator()(const _Key& __x, const _CP& __y) const 644f52318b4SErik Pilkington {return comp(__x, __y.__get_value().first);} 645e3fbe143SMarshall Clow void swap(__map_value_compare& __y) 646e3fbe143SMarshall Clow _NOEXCEPT_(__is_nothrow_swappable<_Compare>::value) 647e3fbe143SMarshall Clow { 648e3fbe143SMarshall Clow using _VSTD::swap; 649e3fbe143SMarshall Clow swap(comp, __y.comp); 650e3fbe143SMarshall Clow } 6512585835cSMarshall Clow 6522585835cSMarshall Clow#if _LIBCPP_STD_VER > 11 6532585835cSMarshall Clow template <typename _K2> 6542585835cSMarshall Clow _LIBCPP_INLINE_VISIBILITY 655d5db71d1SArthur O'Dwyer bool operator()(const _K2& __x, const _CP& __y) const 656f52318b4SErik Pilkington {return comp(__x, __y.__get_value().first);} 6572585835cSMarshall Clow 6582585835cSMarshall Clow template <typename _K2> 6592585835cSMarshall Clow _LIBCPP_INLINE_VISIBILITY 660d5db71d1SArthur O'Dwyer bool operator()(const _CP& __x, const _K2& __y) const 661f52318b4SErik Pilkington {return comp(__x.__get_value().first, __y);} 6622585835cSMarshall Clow#endif 6633e519524SHoward Hinnant}; 6643e519524SHoward Hinnant 665e3fbe143SMarshall Clowtemplate <class _Key, class _CP, class _Compare, bool __b> 666e3fbe143SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY 667e3fbe143SMarshall Clowvoid 668e3fbe143SMarshall Clowswap(__map_value_compare<_Key, _CP, _Compare, __b>& __x, 669e3fbe143SMarshall Clow __map_value_compare<_Key, _CP, _Compare, __b>& __y) 670e3fbe143SMarshall Clow _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y))) 671e3fbe143SMarshall Clow{ 672e3fbe143SMarshall Clow __x.swap(__y); 673e3fbe143SMarshall Clow} 674e3fbe143SMarshall Clow 6753e519524SHoward Hinnanttemplate <class _Allocator> 6763e519524SHoward Hinnantclass __map_node_destructor 6773e519524SHoward Hinnant{ 6783e519524SHoward Hinnant typedef _Allocator allocator_type; 6793e519524SHoward Hinnant typedef allocator_traits<allocator_type> __alloc_traits; 680089a7cc5SEric Fiselier 6813e519524SHoward Hinnantpublic: 6823e519524SHoward Hinnant typedef typename __alloc_traits::pointer pointer; 6833e519524SHoward Hinnant 684089a7cc5SEric Fiselierprivate: 6853e519524SHoward Hinnant allocator_type& __na_; 6863e519524SHoward Hinnant 6873e519524SHoward Hinnant __map_node_destructor& operator=(const __map_node_destructor&); 6883e519524SHoward Hinnant 6893e519524SHoward Hinnantpublic: 6903e519524SHoward Hinnant bool __first_constructed; 6913e519524SHoward Hinnant bool __second_constructed; 6923e519524SHoward Hinnant 693848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 6941052ee39SHoward Hinnant explicit __map_node_destructor(allocator_type& __na) _NOEXCEPT 6953e519524SHoward Hinnant : __na_(__na), 6963e519524SHoward Hinnant __first_constructed(false), 6973e519524SHoward Hinnant __second_constructed(false) 6983e519524SHoward Hinnant {} 6993e519524SHoward Hinnant 70018293116SEric Fiselier#ifndef _LIBCPP_CXX03_LANG 701848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 7021052ee39SHoward Hinnant __map_node_destructor(__tree_node_destructor<allocator_type>&& __x) _NOEXCEPT 7033e519524SHoward Hinnant : __na_(__x.__na_), 7043e519524SHoward Hinnant __first_constructed(__x.__value_constructed), 7053e519524SHoward Hinnant __second_constructed(__x.__value_constructed) 7063e519524SHoward Hinnant { 7073e519524SHoward Hinnant __x.__value_constructed = false; 7083e519524SHoward Hinnant } 70918293116SEric Fiselier#endif // _LIBCPP_CXX03_LANG 7103e519524SHoward Hinnant 711848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 7121052ee39SHoward Hinnant void operator()(pointer __p) _NOEXCEPT 7133e519524SHoward Hinnant { 7143e519524SHoward Hinnant if (__second_constructed) 715f52318b4SErik Pilkington __alloc_traits::destroy(__na_, _VSTD::addressof(__p->__value_.__get_value().second)); 7163e519524SHoward Hinnant if (__first_constructed) 717f52318b4SErik Pilkington __alloc_traits::destroy(__na_, _VSTD::addressof(__p->__value_.__get_value().first)); 7183e519524SHoward Hinnant if (__p) 7193e519524SHoward Hinnant __alloc_traits::deallocate(__na_, __p, 1); 7203e519524SHoward Hinnant } 7213e519524SHoward Hinnant}; 7223e519524SHoward Hinnant 723ce53420eSHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 724ce53420eSHoward Hinnant class map; 725ce53420eSHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 726ce53420eSHoward Hinnant class multimap; 727ce53420eSHoward Hinnanttemplate <class _TreeIterator> class __map_const_iterator; 7283e519524SHoward Hinnant 729089a7cc5SEric Fiselier#ifndef _LIBCPP_CXX03_LANG 7309fd9f84fSHoward Hinnant 7319fd9f84fSHoward Hinnanttemplate <class _Key, class _Tp> 7327c2f5827SAmy Huangstruct _LIBCPP_STANDALONE_DEBUG __value_type 7339fd9f84fSHoward Hinnant{ 7349fd9f84fSHoward Hinnant typedef _Key key_type; 7359fd9f84fSHoward Hinnant typedef _Tp mapped_type; 7369fd9f84fSHoward Hinnant typedef pair<const key_type, mapped_type> value_type; 737f52318b4SErik Pilkington typedef pair<key_type&, mapped_type&> __nc_ref_pair_type; 738f52318b4SErik Pilkington typedef pair<key_type&&, mapped_type&&> __nc_rref_pair_type; 7399fd9f84fSHoward Hinnant 740f52318b4SErik Pilkingtonprivate: 7419fd9f84fSHoward Hinnant value_type __cc; 742f52318b4SErik Pilkington 743f52318b4SErik Pilkingtonpublic: 744f52318b4SErik Pilkington _LIBCPP_INLINE_VISIBILITY 745f52318b4SErik Pilkington value_type& __get_value() 746f52318b4SErik Pilkington { 747f52318b4SErik Pilkington#if _LIBCPP_STD_VER > 14 748f52318b4SErik Pilkington return *_VSTD::launder(_VSTD::addressof(__cc)); 749f52318b4SErik Pilkington#else 750f52318b4SErik Pilkington return __cc; 751f52318b4SErik Pilkington#endif 752f52318b4SErik Pilkington } 753f52318b4SErik Pilkington 754f52318b4SErik Pilkington _LIBCPP_INLINE_VISIBILITY 755f52318b4SErik Pilkington const value_type& __get_value() const 756f52318b4SErik Pilkington { 757f52318b4SErik Pilkington#if _LIBCPP_STD_VER > 14 758f52318b4SErik Pilkington return *_VSTD::launder(_VSTD::addressof(__cc)); 759f52318b4SErik Pilkington#else 760f52318b4SErik Pilkington return __cc; 761f52318b4SErik Pilkington#endif 762f52318b4SErik Pilkington } 763f52318b4SErik Pilkington 764f52318b4SErik Pilkington _LIBCPP_INLINE_VISIBILITY 765f52318b4SErik Pilkington __nc_ref_pair_type __ref() 766f52318b4SErik Pilkington { 767f52318b4SErik Pilkington value_type& __v = __get_value(); 768f52318b4SErik Pilkington return __nc_ref_pair_type(const_cast<key_type&>(__v.first), __v.second); 769f52318b4SErik Pilkington } 770f52318b4SErik Pilkington 771f52318b4SErik Pilkington _LIBCPP_INLINE_VISIBILITY 772f52318b4SErik Pilkington __nc_rref_pair_type __move() 773f52318b4SErik Pilkington { 774f52318b4SErik Pilkington value_type& __v = __get_value(); 775f52318b4SErik Pilkington return __nc_rref_pair_type( 776f52318b4SErik Pilkington _VSTD::move(const_cast<key_type&>(__v.first)), 777f52318b4SErik Pilkington _VSTD::move(__v.second)); 778f52318b4SErik Pilkington } 7799fd9f84fSHoward Hinnant 7809fd9f84fSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 7819fd9f84fSHoward Hinnant __value_type& operator=(const __value_type& __v) 782f52318b4SErik Pilkington { 783f52318b4SErik Pilkington __ref() = __v.__get_value(); 784f52318b4SErik Pilkington return *this; 785f52318b4SErik Pilkington } 7869fd9f84fSHoward Hinnant 7879fd9f84fSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 7889fd9f84fSHoward Hinnant __value_type& operator=(__value_type&& __v) 789f52318b4SErik Pilkington { 790f52318b4SErik Pilkington __ref() = __v.__move(); 791f52318b4SErik Pilkington return *this; 792f52318b4SErik Pilkington } 7939fd9f84fSHoward Hinnant 7945e3ea4ddSEric Fiselier template <class _ValueTp, 7954887d047SNikolas Klauser class = __enable_if_t<__is_same_uncvref<_ValueTp, value_type>::value> 7965e3ea4ddSEric Fiselier > 7979fd9f84fSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 798f52318b4SErik Pilkington __value_type& operator=(_ValueTp&& __v) 799f52318b4SErik Pilkington { 800f52318b4SErik Pilkington __ref() = _VSTD::forward<_ValueTp>(__v); 801f52318b4SErik Pilkington return *this; 8025e3ea4ddSEric Fiselier } 8035e3ea4ddSEric Fiselier 8045e3ea4ddSEric Fiselierprivate: 805d7d70601SArthur O'Dwyer __value_type() = delete; 806d7d70601SArthur O'Dwyer ~__value_type() = delete; 807d7d70601SArthur O'Dwyer __value_type(const __value_type&) = delete; 808d7d70601SArthur O'Dwyer __value_type(__value_type&&) = delete; 8099fd9f84fSHoward Hinnant}; 8109fd9f84fSHoward Hinnant 8119fd9f84fSHoward Hinnant#else 8129fd9f84fSHoward Hinnant 8139fd9f84fSHoward Hinnanttemplate <class _Key, class _Tp> 8149fd9f84fSHoward Hinnantstruct __value_type 8159fd9f84fSHoward Hinnant{ 8169fd9f84fSHoward Hinnant typedef _Key key_type; 8179fd9f84fSHoward Hinnant typedef _Tp mapped_type; 8189fd9f84fSHoward Hinnant typedef pair<const key_type, mapped_type> value_type; 8199fd9f84fSHoward Hinnant 820f52318b4SErik Pilkingtonprivate: 8219fd9f84fSHoward Hinnant value_type __cc; 8229fd9f84fSHoward Hinnant 823f52318b4SErik Pilkingtonpublic: 824f52318b4SErik Pilkington _LIBCPP_INLINE_VISIBILITY 825f52318b4SErik Pilkington value_type& __get_value() { return __cc; } 826f52318b4SErik Pilkington _LIBCPP_INLINE_VISIBILITY 827f52318b4SErik Pilkington const value_type& __get_value() const { return __cc; } 828f52318b4SErik Pilkington 8295e3ea4ddSEric Fiselierprivate: 8305e3ea4ddSEric Fiselier __value_type(); 8315e3ea4ddSEric Fiselier __value_type(__value_type const&); 8325e3ea4ddSEric Fiselier __value_type& operator=(__value_type const&); 8335e3ea4ddSEric Fiselier ~__value_type(); 8349fd9f84fSHoward Hinnant}; 8359fd9f84fSHoward Hinnant 83618293116SEric Fiselier#endif // _LIBCPP_CXX03_LANG 8379fd9f84fSHoward Hinnant 838b3be398cSEric Fiseliertemplate <class _Tp> 839b3be398cSEric Fiselierstruct __extract_key_value_types; 840b3be398cSEric Fiselier 841b3be398cSEric Fiseliertemplate <class _Key, class _Tp> 842b3be398cSEric Fiselierstruct __extract_key_value_types<__value_type<_Key, _Tp> > 843b3be398cSEric Fiselier{ 844b3be398cSEric Fiselier typedef _Key const __key_type; 845b3be398cSEric Fiselier typedef _Tp __mapped_type; 846b3be398cSEric Fiselier}; 847b3be398cSEric Fiselier 8483e519524SHoward Hinnanttemplate <class _TreeIterator> 849e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS __map_iterator 8503e519524SHoward Hinnant{ 851089a7cc5SEric Fiselier typedef typename _TreeIterator::_NodeTypes _NodeTypes; 852089a7cc5SEric Fiselier typedef typename _TreeIterator::__pointer_traits __pointer_traits; 853089a7cc5SEric Fiselier 8543e519524SHoward Hinnant _TreeIterator __i_; 8553e519524SHoward Hinnant 8563e519524SHoward Hinnantpublic: 8573e519524SHoward Hinnant typedef bidirectional_iterator_tag iterator_category; 858089a7cc5SEric Fiselier typedef typename _NodeTypes::__map_value_type value_type; 8593e519524SHoward Hinnant typedef typename _TreeIterator::difference_type difference_type; 8603e519524SHoward Hinnant typedef value_type& reference; 861089a7cc5SEric Fiselier typedef typename _NodeTypes::__map_value_type_pointer pointer; 8623e519524SHoward Hinnant 863848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 8641052ee39SHoward Hinnant __map_iterator() _NOEXCEPT {} 8653e519524SHoward Hinnant 866848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 8671052ee39SHoward Hinnant __map_iterator(_TreeIterator __i) _NOEXCEPT : __i_(__i) {} 8683e519524SHoward Hinnant 869848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 870f52318b4SErik Pilkington reference operator*() const {return __i_->__get_value();} 871848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 872f52318b4SErik Pilkington pointer operator->() const {return pointer_traits<pointer>::pointer_to(__i_->__get_value());} 8733e519524SHoward Hinnant 874848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 8753e519524SHoward Hinnant __map_iterator& operator++() {++__i_; return *this;} 876848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 8773e519524SHoward Hinnant __map_iterator operator++(int) 8783e519524SHoward Hinnant { 8793e519524SHoward Hinnant __map_iterator __t(*this); 8803e519524SHoward Hinnant ++(*this); 8813e519524SHoward Hinnant return __t; 8823e519524SHoward Hinnant } 8833e519524SHoward Hinnant 884848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 8853e519524SHoward Hinnant __map_iterator& operator--() {--__i_; return *this;} 886848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 8873e519524SHoward Hinnant __map_iterator operator--(int) 8883e519524SHoward Hinnant { 8893e519524SHoward Hinnant __map_iterator __t(*this); 8903e519524SHoward Hinnant --(*this); 8913e519524SHoward Hinnant return __t; 8923e519524SHoward Hinnant } 8933e519524SHoward Hinnant 894848a5374SHoward Hinnant friend _LIBCPP_INLINE_VISIBILITY 895848a5374SHoward Hinnant bool operator==(const __map_iterator& __x, const __map_iterator& __y) 8963e519524SHoward Hinnant {return __x.__i_ == __y.__i_;} 897848a5374SHoward Hinnant friend 898848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 899848a5374SHoward Hinnant bool operator!=(const __map_iterator& __x, const __map_iterator& __y) 9003e519524SHoward Hinnant {return __x.__i_ != __y.__i_;} 9013e519524SHoward Hinnant 902e2f2d1edSEric Fiselier template <class, class, class, class> friend class _LIBCPP_TEMPLATE_VIS map; 903e2f2d1edSEric Fiselier template <class, class, class, class> friend class _LIBCPP_TEMPLATE_VIS multimap; 904e2f2d1edSEric Fiselier template <class> friend class _LIBCPP_TEMPLATE_VIS __map_const_iterator; 9053e519524SHoward Hinnant}; 9063e519524SHoward Hinnant 9073e519524SHoward Hinnanttemplate <class _TreeIterator> 908e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS __map_const_iterator 9093e519524SHoward Hinnant{ 910089a7cc5SEric Fiselier typedef typename _TreeIterator::_NodeTypes _NodeTypes; 911089a7cc5SEric Fiselier typedef typename _TreeIterator::__pointer_traits __pointer_traits; 912089a7cc5SEric Fiselier 9133e519524SHoward Hinnant _TreeIterator __i_; 9143e519524SHoward Hinnant 9153e519524SHoward Hinnantpublic: 9163e519524SHoward Hinnant typedef bidirectional_iterator_tag iterator_category; 917089a7cc5SEric Fiselier typedef typename _NodeTypes::__map_value_type value_type; 9183e519524SHoward Hinnant typedef typename _TreeIterator::difference_type difference_type; 9193e519524SHoward Hinnant typedef const value_type& reference; 920089a7cc5SEric Fiselier typedef typename _NodeTypes::__const_map_value_type_pointer pointer; 9213e519524SHoward Hinnant 922848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 9231052ee39SHoward Hinnant __map_const_iterator() _NOEXCEPT {} 9243e519524SHoward Hinnant 925848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 9261052ee39SHoward Hinnant __map_const_iterator(_TreeIterator __i) _NOEXCEPT : __i_(__i) {} 927848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 928b3be398cSEric Fiselier __map_const_iterator(__map_iterator< 929b3be398cSEric Fiselier typename _TreeIterator::__non_const_iterator> __i) _NOEXCEPT 9303e519524SHoward Hinnant : __i_(__i.__i_) {} 9313e519524SHoward Hinnant 932848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 933f52318b4SErik Pilkington reference operator*() const {return __i_->__get_value();} 934848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 935f52318b4SErik Pilkington pointer operator->() const {return pointer_traits<pointer>::pointer_to(__i_->__get_value());} 9363e519524SHoward Hinnant 937848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 9383e519524SHoward Hinnant __map_const_iterator& operator++() {++__i_; return *this;} 939848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 9403e519524SHoward Hinnant __map_const_iterator operator++(int) 9413e519524SHoward Hinnant { 9423e519524SHoward Hinnant __map_const_iterator __t(*this); 9433e519524SHoward Hinnant ++(*this); 9443e519524SHoward Hinnant return __t; 9453e519524SHoward Hinnant } 9463e519524SHoward Hinnant 947848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 9483e519524SHoward Hinnant __map_const_iterator& operator--() {--__i_; return *this;} 949848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 9503e519524SHoward Hinnant __map_const_iterator operator--(int) 9513e519524SHoward Hinnant { 9523e519524SHoward Hinnant __map_const_iterator __t(*this); 9533e519524SHoward Hinnant --(*this); 9543e519524SHoward Hinnant return __t; 9553e519524SHoward Hinnant } 9563e519524SHoward Hinnant 957848a5374SHoward Hinnant friend _LIBCPP_INLINE_VISIBILITY 958848a5374SHoward Hinnant bool operator==(const __map_const_iterator& __x, const __map_const_iterator& __y) 9593e519524SHoward Hinnant {return __x.__i_ == __y.__i_;} 960848a5374SHoward Hinnant friend _LIBCPP_INLINE_VISIBILITY 961848a5374SHoward Hinnant bool operator!=(const __map_const_iterator& __x, const __map_const_iterator& __y) 9623e519524SHoward Hinnant {return __x.__i_ != __y.__i_;} 9633e519524SHoward Hinnant 964e2f2d1edSEric Fiselier template <class, class, class, class> friend class _LIBCPP_TEMPLATE_VIS map; 965e2f2d1edSEric Fiselier template <class, class, class, class> friend class _LIBCPP_TEMPLATE_VIS multimap; 966e2f2d1edSEric Fiselier template <class, class, class> friend class _LIBCPP_TEMPLATE_VIS __tree_const_iterator; 9673e519524SHoward Hinnant}; 9683e519524SHoward Hinnant 9693e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare = less<_Key>, 9703e519524SHoward Hinnant class _Allocator = allocator<pair<const _Key, _Tp> > > 971e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS map 9723e519524SHoward Hinnant{ 9733e519524SHoward Hinnantpublic: 9743e519524SHoward Hinnant // types: 9753e519524SHoward Hinnant typedef _Key key_type; 9763e519524SHoward Hinnant typedef _Tp mapped_type; 9773e519524SHoward Hinnant typedef pair<const key_type, mapped_type> value_type; 9783c6bd176SNikolas Klauser typedef __type_identity_t<_Compare> key_compare; 9793c6bd176SNikolas Klauser typedef __type_identity_t<_Allocator> allocator_type; 9803e519524SHoward Hinnant typedef value_type& reference; 9813e519524SHoward Hinnant typedef const value_type& const_reference; 9823e519524SHoward Hinnant 98394f89aeeSMarshall Clow static_assert((is_same<typename allocator_type::value_type, value_type>::value), 98494f89aeeSMarshall Clow "Allocator::value_type must be same type as value_type"); 98594f89aeeSMarshall Clow 986e2f2d1edSEric Fiselier class _LIBCPP_TEMPLATE_VIS value_compare 987681cde7dSNikolas Klauser : public __binary_function<value_type, value_type, bool> 9883e519524SHoward Hinnant { 9893e519524SHoward Hinnant friend class map; 9903e519524SHoward Hinnant protected: 9913e519524SHoward Hinnant key_compare comp; 9923e519524SHoward Hinnant 993*b48c5010SNikolas Klauser _LIBCPP_INLINE_VISIBILITY value_compare(key_compare __c) : comp(__c) {} 9943e519524SHoward Hinnant public: 995848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 9963e519524SHoward Hinnant bool operator()(const value_type& __x, const value_type& __y) const 9973e519524SHoward Hinnant {return comp(__x.first, __y.first);} 9983e519524SHoward Hinnant }; 9993e519524SHoward Hinnant 10003e519524SHoward Hinnantprivate: 100107d3eccdSHoward Hinnant 10029fd9f84fSHoward Hinnant typedef _VSTD::__value_type<key_type, mapped_type> __value_type; 1003abb160e6SHoward Hinnant typedef __map_value_compare<key_type, __value_type, key_compare> __vc; 10041f508014SMarshall Clow typedef typename __rebind_alloc_helper<allocator_traits<allocator_type>, 10051f508014SMarshall Clow __value_type>::type __allocator_type; 10063e519524SHoward Hinnant typedef __tree<__value_type, __vc, __allocator_type> __base; 10073e519524SHoward Hinnant typedef typename __base::__node_traits __node_traits; 10083e519524SHoward Hinnant typedef allocator_traits<allocator_type> __alloc_traits; 10093e519524SHoward Hinnant 10103e519524SHoward Hinnant __base __tree_; 10113e519524SHoward Hinnant 10123e519524SHoward Hinnantpublic: 10133e519524SHoward Hinnant typedef typename __alloc_traits::pointer pointer; 10143e519524SHoward Hinnant typedef typename __alloc_traits::const_pointer const_pointer; 10153e519524SHoward Hinnant typedef typename __alloc_traits::size_type size_type; 10163e519524SHoward Hinnant typedef typename __alloc_traits::difference_type difference_type; 10173e519524SHoward Hinnant typedef __map_iterator<typename __base::iterator> iterator; 10183e519524SHoward Hinnant typedef __map_const_iterator<typename __base::const_iterator> const_iterator; 1019ce48a113SHoward Hinnant typedef _VSTD::reverse_iterator<iterator> reverse_iterator; 1020ce48a113SHoward Hinnant typedef _VSTD::reverse_iterator<const_iterator> const_reverse_iterator; 10213e519524SHoward Hinnant 1022b0386a51SErik Pilkington#if _LIBCPP_STD_VER > 14 1023b0386a51SErik Pilkington typedef __map_node_handle<typename __base::__node, allocator_type> node_type; 1024b0386a51SErik Pilkington typedef __insert_return_type<iterator, node_type> insert_return_type; 1025b0386a51SErik Pilkington#endif 1026b0386a51SErik Pilkington 10275c4e07aeSErik Pilkington template <class _Key2, class _Value2, class _Comp2, class _Alloc2> 10285c4e07aeSErik Pilkington friend class _LIBCPP_TEMPLATE_VIS map; 10295c4e07aeSErik Pilkington template <class _Key2, class _Value2, class _Comp2, class _Alloc2> 10305c4e07aeSErik Pilkington friend class _LIBCPP_TEMPLATE_VIS multimap; 10315c4e07aeSErik Pilkington 1032848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 1033415a24e4SMarshall Clow map() 1034415a24e4SMarshall Clow _NOEXCEPT_( 1035415a24e4SMarshall Clow is_nothrow_default_constructible<allocator_type>::value && 1036415a24e4SMarshall Clow is_nothrow_default_constructible<key_compare>::value && 1037415a24e4SMarshall Clow is_nothrow_copy_constructible<key_compare>::value) 1038415a24e4SMarshall Clow : __tree_(__vc(key_compare())) {} 1039415a24e4SMarshall Clow 1040415a24e4SMarshall Clow _LIBCPP_INLINE_VISIBILITY 1041415a24e4SMarshall Clow explicit map(const key_compare& __comp) 10421052ee39SHoward Hinnant _NOEXCEPT_( 10431052ee39SHoward Hinnant is_nothrow_default_constructible<allocator_type>::value && 10441052ee39SHoward Hinnant is_nothrow_copy_constructible<key_compare>::value) 10453e519524SHoward Hinnant : __tree_(__vc(__comp)) {} 10463e519524SHoward Hinnant 1047848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 10483e519524SHoward Hinnant explicit map(const key_compare& __comp, const allocator_type& __a) 10492a10c960SMarshall Clow : __tree_(__vc(__comp), typename __base::allocator_type(__a)) {} 10503e519524SHoward Hinnant 10513e519524SHoward Hinnant template <class _InputIterator> 1052848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 10533e519524SHoward Hinnant map(_InputIterator __f, _InputIterator __l, 10543e519524SHoward Hinnant const key_compare& __comp = key_compare()) 10553e519524SHoward Hinnant : __tree_(__vc(__comp)) 10563e519524SHoward Hinnant { 10573e519524SHoward Hinnant insert(__f, __l); 10583e519524SHoward Hinnant } 10593e519524SHoward Hinnant 10603e519524SHoward Hinnant template <class _InputIterator> 1061848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 10623e519524SHoward Hinnant map(_InputIterator __f, _InputIterator __l, 10633e519524SHoward Hinnant const key_compare& __comp, const allocator_type& __a) 10642a10c960SMarshall Clow : __tree_(__vc(__comp), typename __base::allocator_type(__a)) 10653e519524SHoward Hinnant { 10663e519524SHoward Hinnant insert(__f, __l); 10673e519524SHoward Hinnant } 10683e519524SHoward Hinnant 1069fbc317d4SMarshall Clow#if _LIBCPP_STD_VER > 11 1070fbc317d4SMarshall Clow template <class _InputIterator> 1071fbc317d4SMarshall Clow _LIBCPP_INLINE_VISIBILITY 1072fbc317d4SMarshall Clow map(_InputIterator __f, _InputIterator __l, const allocator_type& __a) 1073fbc317d4SMarshall Clow : map(__f, __l, key_compare(), __a) {} 1074fbc317d4SMarshall Clow#endif 1075fbc317d4SMarshall Clow 1076848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 10773e519524SHoward Hinnant map(const map& __m) 10783e519524SHoward Hinnant : __tree_(__m.__tree_) 10793e519524SHoward Hinnant { 10803e519524SHoward Hinnant insert(__m.begin(), __m.end()); 10813e519524SHoward Hinnant } 10823e519524SHoward Hinnant 10835a33687dSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 10845a33687dSHoward Hinnant map& operator=(const map& __m) 10855a33687dSHoward Hinnant { 10862ee83725SMarshall Clow#ifndef _LIBCPP_CXX03_LANG 10875a33687dSHoward Hinnant __tree_ = __m.__tree_; 108807d3eccdSHoward Hinnant#else 1089b8608b87SMark de Wever if (this != _VSTD::addressof(__m)) { 109007d3eccdSHoward Hinnant __tree_.clear(); 109107d3eccdSHoward Hinnant __tree_.value_comp() = __m.__tree_.value_comp(); 109207d3eccdSHoward Hinnant __tree_.__copy_assign_alloc(__m.__tree_); 109307d3eccdSHoward Hinnant insert(__m.begin(), __m.end()); 109474cf6ff5SMarshall Clow } 109507d3eccdSHoward Hinnant#endif 10965a33687dSHoward Hinnant return *this; 10975a33687dSHoward Hinnant } 10985a33687dSHoward Hinnant 109918293116SEric Fiselier#ifndef _LIBCPP_CXX03_LANG 11003e519524SHoward Hinnant 1101848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 11023e519524SHoward Hinnant map(map&& __m) 11031052ee39SHoward Hinnant _NOEXCEPT_(is_nothrow_move_constructible<__base>::value) 1104ce48a113SHoward Hinnant : __tree_(_VSTD::move(__m.__tree_)) 11053e519524SHoward Hinnant { 11063e519524SHoward Hinnant } 11073e519524SHoward Hinnant 11083e519524SHoward Hinnant map(map&& __m, const allocator_type& __a); 11093e519524SHoward Hinnant 1110848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 111154976f26SHoward Hinnant map& operator=(map&& __m) 111254976f26SHoward Hinnant _NOEXCEPT_(is_nothrow_move_assignable<__base>::value) 111354976f26SHoward Hinnant { 111454976f26SHoward Hinnant __tree_ = _VSTD::move(__m.__tree_); 111554976f26SHoward Hinnant return *this; 111654976f26SHoward Hinnant } 111754976f26SHoward Hinnant 111854976f26SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 11193e519524SHoward Hinnant map(initializer_list<value_type> __il, const key_compare& __comp = key_compare()) 11203e519524SHoward Hinnant : __tree_(__vc(__comp)) 11213e519524SHoward Hinnant { 11223e519524SHoward Hinnant insert(__il.begin(), __il.end()); 11233e519524SHoward Hinnant } 11243e519524SHoward Hinnant 1125848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 11263e519524SHoward Hinnant map(initializer_list<value_type> __il, const key_compare& __comp, const allocator_type& __a) 11272a10c960SMarshall Clow : __tree_(__vc(__comp), typename __base::allocator_type(__a)) 11283e519524SHoward Hinnant { 11293e519524SHoward Hinnant insert(__il.begin(), __il.end()); 11303e519524SHoward Hinnant } 11313e519524SHoward Hinnant 1132fbc317d4SMarshall Clow#if _LIBCPP_STD_VER > 11 1133fbc317d4SMarshall Clow _LIBCPP_INLINE_VISIBILITY 1134fbc317d4SMarshall Clow map(initializer_list<value_type> __il, const allocator_type& __a) 1135fbc317d4SMarshall Clow : map(__il, key_compare(), __a) {} 1136fbc317d4SMarshall Clow#endif 1137fbc317d4SMarshall Clow 1138848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 11393e519524SHoward Hinnant map& operator=(initializer_list<value_type> __il) 11403e519524SHoward Hinnant { 11413e519524SHoward Hinnant __tree_.__assign_unique(__il.begin(), __il.end()); 11423e519524SHoward Hinnant return *this; 11433e519524SHoward Hinnant } 11443e519524SHoward Hinnant 114518293116SEric Fiselier#endif // _LIBCPP_CXX03_LANG 11463e519524SHoward Hinnant 1147848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 11483e519524SHoward Hinnant explicit map(const allocator_type& __a) 11492a10c960SMarshall Clow : __tree_(typename __base::allocator_type(__a)) 11503e519524SHoward Hinnant { 11513e519524SHoward Hinnant } 11523e519524SHoward Hinnant 1153848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 11543e519524SHoward Hinnant map(const map& __m, const allocator_type& __a) 11552a10c960SMarshall Clow : __tree_(__m.__tree_.value_comp(), typename __base::allocator_type(__a)) 11563e519524SHoward Hinnant { 11573e519524SHoward Hinnant insert(__m.begin(), __m.end()); 11583e519524SHoward Hinnant } 11593e519524SHoward Hinnant 1160848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 11617c142fccSLouis Dionne ~map() { 11627c142fccSLouis Dionne static_assert(sizeof(__diagnose_non_const_comparator<_Key, _Compare>()), ""); 11637c142fccSLouis Dionne } 11647c142fccSLouis Dionne 11657c142fccSLouis Dionne _LIBCPP_INLINE_VISIBILITY 11661052ee39SHoward Hinnant iterator begin() _NOEXCEPT {return __tree_.begin();} 1167848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 11681052ee39SHoward Hinnant const_iterator begin() const _NOEXCEPT {return __tree_.begin();} 1169848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 11701052ee39SHoward Hinnant iterator end() _NOEXCEPT {return __tree_.end();} 1171848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 11721052ee39SHoward Hinnant const_iterator end() const _NOEXCEPT {return __tree_.end();} 11733e519524SHoward Hinnant 1174848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 11751052ee39SHoward Hinnant reverse_iterator rbegin() _NOEXCEPT {return reverse_iterator(end());} 1176848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 11771052ee39SHoward Hinnant const_reverse_iterator rbegin() const _NOEXCEPT 11781052ee39SHoward Hinnant {return const_reverse_iterator(end());} 1179848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 11801052ee39SHoward Hinnant reverse_iterator rend() _NOEXCEPT 11811052ee39SHoward Hinnant {return reverse_iterator(begin());} 1182848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 11831052ee39SHoward Hinnant const_reverse_iterator rend() const _NOEXCEPT 11841052ee39SHoward Hinnant {return const_reverse_iterator(begin());} 11853e519524SHoward Hinnant 1186848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 11871052ee39SHoward Hinnant const_iterator cbegin() const _NOEXCEPT {return begin();} 1188848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 11891052ee39SHoward Hinnant const_iterator cend() const _NOEXCEPT {return end();} 1190848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 11911052ee39SHoward Hinnant const_reverse_iterator crbegin() const _NOEXCEPT {return rbegin();} 1192848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 11931052ee39SHoward Hinnant const_reverse_iterator crend() const _NOEXCEPT {return rend();} 11943e519524SHoward Hinnant 119572c8fad4SMarshall Clow _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY 11961052ee39SHoward Hinnant bool empty() const _NOEXCEPT {return __tree_.size() == 0;} 1197848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 11981052ee39SHoward Hinnant size_type size() const _NOEXCEPT {return __tree_.size();} 1199848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 12001052ee39SHoward Hinnant size_type max_size() const _NOEXCEPT {return __tree_.max_size();} 12013e519524SHoward Hinnant 12023e519524SHoward Hinnant mapped_type& operator[](const key_type& __k); 120354f0cda6SEric Fiselier#ifndef _LIBCPP_CXX03_LANG 12043e519524SHoward Hinnant mapped_type& operator[](key_type&& __k); 12053e519524SHoward Hinnant#endif 12063e519524SHoward Hinnant 12073e519524SHoward Hinnant mapped_type& at(const key_type& __k); 12083e519524SHoward Hinnant const mapped_type& at(const key_type& __k) const; 12093e519524SHoward Hinnant 1210848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 12112a10c960SMarshall Clow allocator_type get_allocator() const _NOEXCEPT {return allocator_type(__tree_.__alloc());} 1212848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 12133e519524SHoward Hinnant key_compare key_comp() const {return __tree_.value_comp().key_comp();} 1214848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 12153e519524SHoward Hinnant value_compare value_comp() const {return value_compare(__tree_.value_comp().key_comp());} 12163e519524SHoward Hinnant 12175e3ea4ddSEric Fiselier#ifndef _LIBCPP_CXX03_LANG 12185e3ea4ddSEric Fiselier template <class ..._Args> 12195e3ea4ddSEric Fiselier _LIBCPP_INLINE_VISIBILITY 12205e3ea4ddSEric Fiselier pair<iterator, bool> emplace(_Args&& ...__args) { 12215e3ea4ddSEric Fiselier return __tree_.__emplace_unique(_VSTD::forward<_Args>(__args)...); 12225e3ea4ddSEric Fiselier } 12237609c9b6SHoward Hinnant 12248b805c91SHoward Hinnant template <class ..._Args> 12255e3ea4ddSEric Fiselier _LIBCPP_INLINE_VISIBILITY 12265e3ea4ddSEric Fiselier iterator emplace_hint(const_iterator __p, _Args&& ...__args) { 12275e3ea4ddSEric Fiselier return __tree_.__emplace_hint_unique(__p.__i_, _VSTD::forward<_Args>(__args)...); 12285e3ea4ddSEric Fiselier } 12297609c9b6SHoward Hinnant 1230c003db1fSHoward Hinnant template <class _Pp, 12314887d047SNikolas Klauser class = __enable_if_t<is_constructible<value_type, _Pp>::value> > 1232848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 1233c003db1fSHoward Hinnant pair<iterator, bool> insert(_Pp&& __p) 1234c003db1fSHoward Hinnant {return __tree_.__insert_unique(_VSTD::forward<_Pp>(__p));} 12353e519524SHoward Hinnant 1236c003db1fSHoward Hinnant template <class _Pp, 12374887d047SNikolas Klauser class = __enable_if_t<is_constructible<value_type, _Pp>::value> > 1238848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 1239c003db1fSHoward Hinnant iterator insert(const_iterator __pos, _Pp&& __p) 1240c003db1fSHoward Hinnant {return __tree_.__insert_unique(__pos.__i_, _VSTD::forward<_Pp>(__p));} 12413e519524SHoward Hinnant 12425e3ea4ddSEric Fiselier#endif // _LIBCPP_CXX03_LANG 12433e519524SHoward Hinnant 1244848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 12453e519524SHoward Hinnant pair<iterator, bool> 12463e519524SHoward Hinnant insert(const value_type& __v) {return __tree_.__insert_unique(__v);} 12473e519524SHoward Hinnant 1248848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 12493e519524SHoward Hinnant iterator 12503e519524SHoward Hinnant insert(const_iterator __p, const value_type& __v) 12513e519524SHoward Hinnant {return __tree_.__insert_unique(__p.__i_, __v);} 12523e519524SHoward Hinnant 12537a9f500fSEric Fiselier#ifndef _LIBCPP_CXX03_LANG 1254afc9ff99SMarshall Clow _LIBCPP_INLINE_VISIBILITY 1255afc9ff99SMarshall Clow pair<iterator, bool> 12565e3ea4ddSEric Fiselier insert(value_type&& __v) {return __tree_.__insert_unique(_VSTD::move(__v));} 1257afc9ff99SMarshall Clow 1258afc9ff99SMarshall Clow _LIBCPP_INLINE_VISIBILITY 12595e3ea4ddSEric Fiselier iterator insert(const_iterator __p, value_type&& __v) 12605e3ea4ddSEric Fiselier {return __tree_.__insert_unique(__p.__i_, _VSTD::move(__v));} 126118293116SEric Fiselier 126218293116SEric Fiselier _LIBCPP_INLINE_VISIBILITY 126318293116SEric Fiselier void insert(initializer_list<value_type> __il) 126418293116SEric Fiselier {insert(__il.begin(), __il.end());} 1265afc9ff99SMarshall Clow#endif 1266afc9ff99SMarshall Clow 12673e519524SHoward Hinnant template <class _InputIterator> 1268848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 12693e519524SHoward Hinnant void insert(_InputIterator __f, _InputIterator __l) 12703e519524SHoward Hinnant { 12713e519524SHoward Hinnant for (const_iterator __e = cend(); __f != __l; ++__f) 12723e519524SHoward Hinnant insert(__e.__i_, *__f); 12733e519524SHoward Hinnant } 12743e519524SHoward Hinnant 12758aaf517dSMarshall Clow#if _LIBCPP_STD_VER > 14 127654f0cda6SEric Fiselier 12778aaf517dSMarshall Clow template <class... _Args> 12788aaf517dSMarshall Clow _LIBCPP_INLINE_VISIBILITY 12798aaf517dSMarshall Clow pair<iterator, bool> try_emplace(const key_type& __k, _Args&&... __args) 12808aaf517dSMarshall Clow { 128154f0cda6SEric Fiselier return __tree_.__emplace_unique_key_args(__k, 128254f0cda6SEric Fiselier _VSTD::piecewise_construct, 128354f0cda6SEric Fiselier _VSTD::forward_as_tuple(__k), 128454f0cda6SEric Fiselier _VSTD::forward_as_tuple(_VSTD::forward<_Args>(__args)...)); 12858aaf517dSMarshall Clow } 12868aaf517dSMarshall Clow 12878aaf517dSMarshall Clow template <class... _Args> 12888aaf517dSMarshall Clow _LIBCPP_INLINE_VISIBILITY 12898aaf517dSMarshall Clow pair<iterator, bool> try_emplace(key_type&& __k, _Args&&... __args) 12908aaf517dSMarshall Clow { 129154f0cda6SEric Fiselier return __tree_.__emplace_unique_key_args(__k, 129254f0cda6SEric Fiselier _VSTD::piecewise_construct, 129354f0cda6SEric Fiselier _VSTD::forward_as_tuple(_VSTD::move(__k)), 129454f0cda6SEric Fiselier _VSTD::forward_as_tuple(_VSTD::forward<_Args>(__args)...)); 12958aaf517dSMarshall Clow } 12968aaf517dSMarshall Clow 12978aaf517dSMarshall Clow template <class... _Args> 12988aaf517dSMarshall Clow _LIBCPP_INLINE_VISIBILITY 12998aaf517dSMarshall Clow iterator try_emplace(const_iterator __h, const key_type& __k, _Args&&... __args) 13008aaf517dSMarshall Clow { 130154f0cda6SEric Fiselier return __tree_.__emplace_hint_unique_key_args(__h.__i_, __k, 130254f0cda6SEric Fiselier _VSTD::piecewise_construct, 130354f0cda6SEric Fiselier _VSTD::forward_as_tuple(__k), 1304d4dd9613SMark de Wever _VSTD::forward_as_tuple(_VSTD::forward<_Args>(__args)...)).first; 13058aaf517dSMarshall Clow } 13068aaf517dSMarshall Clow 13078aaf517dSMarshall Clow template <class... _Args> 13088aaf517dSMarshall Clow _LIBCPP_INLINE_VISIBILITY 13098aaf517dSMarshall Clow iterator try_emplace(const_iterator __h, key_type&& __k, _Args&&... __args) 13108aaf517dSMarshall Clow { 131154f0cda6SEric Fiselier return __tree_.__emplace_hint_unique_key_args(__h.__i_, __k, 131254f0cda6SEric Fiselier _VSTD::piecewise_construct, 131354f0cda6SEric Fiselier _VSTD::forward_as_tuple(_VSTD::move(__k)), 1314d4dd9613SMark de Wever _VSTD::forward_as_tuple(_VSTD::forward<_Args>(__args)...)).first; 13158aaf517dSMarshall Clow } 13168aaf517dSMarshall Clow 13178aaf517dSMarshall Clow template <class _Vp> 13188aaf517dSMarshall Clow _LIBCPP_INLINE_VISIBILITY 13198aaf517dSMarshall Clow pair<iterator, bool> insert_or_assign(const key_type& __k, _Vp&& __v) 13208aaf517dSMarshall Clow { 13218aaf517dSMarshall Clow iterator __p = lower_bound(__k); 13228aaf517dSMarshall Clow if ( __p != end() && !key_comp()(__k, __p->first)) 13238aaf517dSMarshall Clow { 13248aaf517dSMarshall Clow __p->second = _VSTD::forward<_Vp>(__v); 13258aaf517dSMarshall Clow return _VSTD::make_pair(__p, false); 13268aaf517dSMarshall Clow } 13278aaf517dSMarshall Clow return _VSTD::make_pair(emplace_hint(__p, __k, _VSTD::forward<_Vp>(__v)), true); 13288aaf517dSMarshall Clow } 13298aaf517dSMarshall Clow 13308aaf517dSMarshall Clow template <class _Vp> 13318aaf517dSMarshall Clow _LIBCPP_INLINE_VISIBILITY 13328aaf517dSMarshall Clow pair<iterator, bool> insert_or_assign(key_type&& __k, _Vp&& __v) 13338aaf517dSMarshall Clow { 13348aaf517dSMarshall Clow iterator __p = lower_bound(__k); 13358aaf517dSMarshall Clow if ( __p != end() && !key_comp()(__k, __p->first)) 13368aaf517dSMarshall Clow { 13378aaf517dSMarshall Clow __p->second = _VSTD::forward<_Vp>(__v); 13388aaf517dSMarshall Clow return _VSTD::make_pair(__p, false); 13398aaf517dSMarshall Clow } 13408aaf517dSMarshall Clow return _VSTD::make_pair(emplace_hint(__p, _VSTD::move(__k), _VSTD::forward<_Vp>(__v)), true); 13418aaf517dSMarshall Clow } 13428aaf517dSMarshall Clow 13438aaf517dSMarshall Clow template <class _Vp> 1344d4dd9613SMark de Wever _LIBCPP_INLINE_VISIBILITY iterator insert_or_assign(const_iterator __h, 1345d4dd9613SMark de Wever const key_type& __k, 1346d4dd9613SMark de Wever _Vp&& __v) { 1347d4dd9613SMark de Wever auto [__r, __inserted] = __tree_.__emplace_hint_unique_key_args( 1348d4dd9613SMark de Wever __h.__i_, __k, __k, _VSTD::forward<_Vp>(__v)); 1349d4dd9613SMark de Wever 1350d4dd9613SMark de Wever if (!__inserted) 1351d4dd9613SMark de Wever __r->__get_value().second = _VSTD::forward<_Vp>(__v); 1352d4dd9613SMark de Wever 1353d4dd9613SMark de Wever return __r; 13548aaf517dSMarshall Clow } 13558aaf517dSMarshall Clow 13568aaf517dSMarshall Clow template <class _Vp> 1357d4dd9613SMark de Wever _LIBCPP_INLINE_VISIBILITY iterator insert_or_assign(const_iterator __h, 1358d4dd9613SMark de Wever key_type&& __k, 1359d4dd9613SMark de Wever _Vp&& __v) { 1360d4dd9613SMark de Wever auto [__r, __inserted] = __tree_.__emplace_hint_unique_key_args( 1361d4dd9613SMark de Wever __h.__i_, __k, _VSTD::move(__k), _VSTD::forward<_Vp>(__v)); 1362d4dd9613SMark de Wever 1363d4dd9613SMark de Wever if (!__inserted) 1364d4dd9613SMark de Wever __r->__get_value().second = _VSTD::forward<_Vp>(__v); 1365d4dd9613SMark de Wever 1366d4dd9613SMark de Wever return __r; 13678aaf517dSMarshall Clow } 136854f0cda6SEric Fiselier 136918293116SEric Fiselier#endif // _LIBCPP_STD_VER > 14 13708aaf517dSMarshall Clow 1371848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 13723e519524SHoward Hinnant iterator erase(const_iterator __p) {return __tree_.erase(__p.__i_);} 1373848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 1374ec392968SMarshall Clow iterator erase(iterator __p) {return __tree_.erase(__p.__i_);} 1375ec392968SMarshall Clow _LIBCPP_INLINE_VISIBILITY 13763e519524SHoward Hinnant size_type erase(const key_type& __k) 13773e519524SHoward Hinnant {return __tree_.__erase_unique(__k);} 1378848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 13793e519524SHoward Hinnant iterator erase(const_iterator __f, const_iterator __l) 13803e519524SHoward Hinnant {return __tree_.erase(__f.__i_, __l.__i_);} 1381848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 13821052ee39SHoward Hinnant void clear() _NOEXCEPT {__tree_.clear();} 13833e519524SHoward Hinnant 1384b0386a51SErik Pilkington#if _LIBCPP_STD_VER > 14 1385b0386a51SErik Pilkington _LIBCPP_INLINE_VISIBILITY 1386b0386a51SErik Pilkington insert_return_type insert(node_type&& __nh) 1387b0386a51SErik Pilkington { 1388b0386a51SErik Pilkington _LIBCPP_ASSERT(__nh.empty() || __nh.get_allocator() == get_allocator(), 1389b0386a51SErik Pilkington "node_type with incompatible allocator passed to map::insert()"); 1390b0386a51SErik Pilkington return __tree_.template __node_handle_insert_unique< 1391b0386a51SErik Pilkington node_type, insert_return_type>(_VSTD::move(__nh)); 1392b0386a51SErik Pilkington } 1393b0386a51SErik Pilkington _LIBCPP_INLINE_VISIBILITY 1394b0386a51SErik Pilkington iterator insert(const_iterator __hint, node_type&& __nh) 1395b0386a51SErik Pilkington { 1396b0386a51SErik Pilkington _LIBCPP_ASSERT(__nh.empty() || __nh.get_allocator() == get_allocator(), 1397b0386a51SErik Pilkington "node_type with incompatible allocator passed to map::insert()"); 1398b0386a51SErik Pilkington return __tree_.template __node_handle_insert_unique<node_type>( 1399b0386a51SErik Pilkington __hint.__i_, _VSTD::move(__nh)); 1400b0386a51SErik Pilkington } 1401b0386a51SErik Pilkington _LIBCPP_INLINE_VISIBILITY 1402b0386a51SErik Pilkington node_type extract(key_type const& __key) 1403b0386a51SErik Pilkington { 1404b0386a51SErik Pilkington return __tree_.template __node_handle_extract<node_type>(__key); 1405b0386a51SErik Pilkington } 1406b0386a51SErik Pilkington _LIBCPP_INLINE_VISIBILITY 1407b0386a51SErik Pilkington node_type extract(const_iterator __it) 1408b0386a51SErik Pilkington { 1409b0386a51SErik Pilkington return __tree_.template __node_handle_extract<node_type>(__it.__i_); 1410b0386a51SErik Pilkington } 14118df1d5a5SLouis Dionne template <class _Compare2> 14125c4e07aeSErik Pilkington _LIBCPP_INLINE_VISIBILITY 14138df1d5a5SLouis Dionne void merge(map<key_type, mapped_type, _Compare2, allocator_type>& __source) 14145c4e07aeSErik Pilkington { 14155c4e07aeSErik Pilkington _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(), 14165c4e07aeSErik Pilkington "merging container with incompatible allocator"); 14175c4e07aeSErik Pilkington __tree_.__node_handle_merge_unique(__source.__tree_); 14185c4e07aeSErik Pilkington } 14198df1d5a5SLouis Dionne template <class _Compare2> 14205c4e07aeSErik Pilkington _LIBCPP_INLINE_VISIBILITY 14218df1d5a5SLouis Dionne void merge(map<key_type, mapped_type, _Compare2, allocator_type>&& __source) 14225c4e07aeSErik Pilkington { 14235c4e07aeSErik Pilkington _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(), 14245c4e07aeSErik Pilkington "merging container with incompatible allocator"); 14255c4e07aeSErik Pilkington __tree_.__node_handle_merge_unique(__source.__tree_); 14265c4e07aeSErik Pilkington } 14278df1d5a5SLouis Dionne template <class _Compare2> 14285c4e07aeSErik Pilkington _LIBCPP_INLINE_VISIBILITY 14298df1d5a5SLouis Dionne void merge(multimap<key_type, mapped_type, _Compare2, allocator_type>& __source) 14305c4e07aeSErik Pilkington { 14315c4e07aeSErik Pilkington _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(), 14325c4e07aeSErik Pilkington "merging container with incompatible allocator"); 14335c4e07aeSErik Pilkington __tree_.__node_handle_merge_unique(__source.__tree_); 14345c4e07aeSErik Pilkington } 14358df1d5a5SLouis Dionne template <class _Compare2> 14365c4e07aeSErik Pilkington _LIBCPP_INLINE_VISIBILITY 14378df1d5a5SLouis Dionne void merge(multimap<key_type, mapped_type, _Compare2, allocator_type>&& __source) 14385c4e07aeSErik Pilkington { 14395c4e07aeSErik Pilkington _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(), 14405c4e07aeSErik Pilkington "merging container with incompatible allocator"); 14415c4e07aeSErik Pilkington __tree_.__node_handle_merge_unique(__source.__tree_); 14425c4e07aeSErik Pilkington } 1443b0386a51SErik Pilkington#endif 1444b0386a51SErik Pilkington 1445848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 14461052ee39SHoward Hinnant void swap(map& __m) 14471052ee39SHoward Hinnant _NOEXCEPT_(__is_nothrow_swappable<__base>::value) 14481052ee39SHoward Hinnant {__tree_.swap(__m.__tree_);} 14493e519524SHoward Hinnant 1450848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 14513e519524SHoward Hinnant iterator find(const key_type& __k) {return __tree_.find(__k);} 1452848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 14533e519524SHoward Hinnant const_iterator find(const key_type& __k) const {return __tree_.find(__k);} 14542585835cSMarshall Clow#if _LIBCPP_STD_VER > 11 14552585835cSMarshall Clow template <typename _K2> 14562585835cSMarshall Clow _LIBCPP_INLINE_VISIBILITY 14574887d047SNikolas Klauser __enable_if_t<__is_transparent<_Compare, _K2>::value, iterator> 14582585835cSMarshall Clow find(const _K2& __k) {return __tree_.find(__k);} 14592585835cSMarshall Clow template <typename _K2> 14602585835cSMarshall Clow _LIBCPP_INLINE_VISIBILITY 14614887d047SNikolas Klauser __enable_if_t<__is_transparent<_Compare, _K2>::value, const_iterator> 14622585835cSMarshall Clow find(const _K2& __k) const {return __tree_.find(__k);} 14632585835cSMarshall Clow#endif 14642585835cSMarshall Clow 1465848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 14663e519524SHoward Hinnant size_type count(const key_type& __k) const 14673e519524SHoward Hinnant {return __tree_.__count_unique(__k);} 14680aacbc92SMarshall Clow#if _LIBCPP_STD_VER > 11 14690aacbc92SMarshall Clow template <typename _K2> 14700aacbc92SMarshall Clow _LIBCPP_INLINE_VISIBILITY 14714887d047SNikolas Klauser __enable_if_t<__is_transparent<_Compare, _K2>::value, size_type> 14729bfdb770SEric Fiselier count(const _K2& __k) const {return __tree_.__count_multi(__k);} 14730aacbc92SMarshall Clow#endif 1474a17b1aedSZoe Carver 1475a17b1aedSZoe Carver#if _LIBCPP_STD_VER > 17 1476a17b1aedSZoe Carver _LIBCPP_INLINE_VISIBILITY 1477a17b1aedSZoe Carver bool contains(const key_type& __k) const {return find(__k) != end();} 14783fca07d7SMarek Kurdej template <typename _K2> 14793fca07d7SMarek Kurdej _LIBCPP_INLINE_VISIBILITY 14804887d047SNikolas Klauser __enable_if_t<__is_transparent<_Compare, _K2>::value, bool> 14813fca07d7SMarek Kurdej contains(const _K2& __k) const { return find(__k) != end(); } 1482a17b1aedSZoe Carver#endif // _LIBCPP_STD_VER > 17 1483a17b1aedSZoe Carver 1484848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 14853e519524SHoward Hinnant iterator lower_bound(const key_type& __k) 14863e519524SHoward Hinnant {return __tree_.lower_bound(__k);} 1487848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 14883e519524SHoward Hinnant const_iterator lower_bound(const key_type& __k) const 14893e519524SHoward Hinnant {return __tree_.lower_bound(__k);} 14902585835cSMarshall Clow#if _LIBCPP_STD_VER > 11 14912585835cSMarshall Clow template <typename _K2> 14922585835cSMarshall Clow _LIBCPP_INLINE_VISIBILITY 14934887d047SNikolas Klauser __enable_if_t<__is_transparent<_Compare, _K2>::value, iterator> 14942585835cSMarshall Clow lower_bound(const _K2& __k) {return __tree_.lower_bound(__k);} 14952585835cSMarshall Clow 14962585835cSMarshall Clow template <typename _K2> 14972585835cSMarshall Clow _LIBCPP_INLINE_VISIBILITY 14984887d047SNikolas Klauser __enable_if_t<__is_transparent<_Compare, _K2>::value, const_iterator> 14992585835cSMarshall Clow lower_bound(const _K2& __k) const {return __tree_.lower_bound(__k);} 15002585835cSMarshall Clow#endif 15012585835cSMarshall Clow 1502848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 15033e519524SHoward Hinnant iterator upper_bound(const key_type& __k) 15043e519524SHoward Hinnant {return __tree_.upper_bound(__k);} 1505848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 15063e519524SHoward Hinnant const_iterator upper_bound(const key_type& __k) const 15073e519524SHoward Hinnant {return __tree_.upper_bound(__k);} 15082585835cSMarshall Clow#if _LIBCPP_STD_VER > 11 15092585835cSMarshall Clow template <typename _K2> 15102585835cSMarshall Clow _LIBCPP_INLINE_VISIBILITY 15114887d047SNikolas Klauser __enable_if_t<__is_transparent<_Compare, _K2>::value, iterator> 15122585835cSMarshall Clow upper_bound(const _K2& __k) {return __tree_.upper_bound(__k);} 15132585835cSMarshall Clow template <typename _K2> 15142585835cSMarshall Clow _LIBCPP_INLINE_VISIBILITY 15154887d047SNikolas Klauser __enable_if_t<__is_transparent<_Compare, _K2>::value, const_iterator> 15162585835cSMarshall Clow upper_bound(const _K2& __k) const {return __tree_.upper_bound(__k);} 15172585835cSMarshall Clow#endif 15182585835cSMarshall Clow 1519848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 15203e519524SHoward Hinnant pair<iterator,iterator> equal_range(const key_type& __k) 15213e519524SHoward Hinnant {return __tree_.__equal_range_unique(__k);} 1522848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 15233e519524SHoward Hinnant pair<const_iterator,const_iterator> equal_range(const key_type& __k) const 15243e519524SHoward Hinnant {return __tree_.__equal_range_unique(__k);} 15252585835cSMarshall Clow#if _LIBCPP_STD_VER > 11 15262585835cSMarshall Clow template <typename _K2> 15272585835cSMarshall Clow _LIBCPP_INLINE_VISIBILITY 15284887d047SNikolas Klauser __enable_if_t<__is_transparent<_Compare, _K2>::value, pair<iterator,iterator>> 15299bfdb770SEric Fiselier equal_range(const _K2& __k) {return __tree_.__equal_range_multi(__k);} 15302585835cSMarshall Clow template <typename _K2> 15312585835cSMarshall Clow _LIBCPP_INLINE_VISIBILITY 15324887d047SNikolas Klauser __enable_if_t<__is_transparent<_Compare, _K2>::value, pair<const_iterator,const_iterator>> 15339bfdb770SEric Fiselier equal_range(const _K2& __k) const {return __tree_.__equal_range_multi(__k);} 15342585835cSMarshall Clow#endif 15353e519524SHoward Hinnant 15363e519524SHoward Hinnantprivate: 15373e519524SHoward Hinnant typedef typename __base::__node __node; 15383e519524SHoward Hinnant typedef typename __base::__node_allocator __node_allocator; 15393e519524SHoward Hinnant typedef typename __base::__node_pointer __node_pointer; 15403e519524SHoward Hinnant typedef typename __base::__node_base_pointer __node_base_pointer; 1541cb5cbc8bSEric Fiselier typedef typename __base::__parent_pointer __parent_pointer; 15420594ad71SEric Fiselier 1543c003db1fSHoward Hinnant typedef __map_node_destructor<__node_allocator> _Dp; 1544c003db1fSHoward Hinnant typedef unique_ptr<__node, _Dp> __node_holder; 15453e519524SHoward Hinnant 154654f0cda6SEric Fiselier#ifdef _LIBCPP_CXX03_LANG 15474a95f9ebSHoward Hinnant __node_holder __construct_node_with_key(const key_type& __k); 154854f0cda6SEric Fiselier#endif 15493e519524SHoward Hinnant}; 15503e519524SHoward Hinnant 155101666904SLouis Dionne#if _LIBCPP_STD_VER >= 17 1552f2f7d72fSLouis Dionnetemplate<class _InputIterator, class _Compare = less<__iter_key_type<_InputIterator>>, 1553f2f7d72fSLouis Dionne class _Allocator = allocator<__iter_to_alloc_type<_InputIterator>>, 155468072a71SKonstantin Varlamov class = enable_if_t<__is_cpp17_input_iterator<_InputIterator>::value, void>, 15554e0ea2cfSLouis Dionne class = enable_if_t<!__is_allocator<_Compare>::value, void>, 15564e0ea2cfSLouis Dionne class = enable_if_t<__is_allocator<_Allocator>::value, void>> 1557f2f7d72fSLouis Dionnemap(_InputIterator, _InputIterator, _Compare = _Compare(), _Allocator = _Allocator()) 1558f2f7d72fSLouis Dionne -> map<__iter_key_type<_InputIterator>, __iter_mapped_type<_InputIterator>, _Compare, _Allocator>; 1559f2f7d72fSLouis Dionne 1560f2f7d72fSLouis Dionnetemplate<class _Key, class _Tp, class _Compare = less<remove_const_t<_Key>>, 1561f2f7d72fSLouis Dionne class _Allocator = allocator<pair<const _Key, _Tp>>, 15624e0ea2cfSLouis Dionne class = enable_if_t<!__is_allocator<_Compare>::value, void>, 15634e0ea2cfSLouis Dionne class = enable_if_t<__is_allocator<_Allocator>::value, void>> 1564f2f7d72fSLouis Dionnemap(initializer_list<pair<_Key, _Tp>>, _Compare = _Compare(), _Allocator = _Allocator()) 1565f2f7d72fSLouis Dionne -> map<remove_const_t<_Key>, _Tp, _Compare, _Allocator>; 1566f2f7d72fSLouis Dionne 1567f2f7d72fSLouis Dionnetemplate<class _InputIterator, class _Allocator, 156868072a71SKonstantin Varlamov class = enable_if_t<__is_cpp17_input_iterator<_InputIterator>::value, void>, 15694e0ea2cfSLouis Dionne class = enable_if_t<__is_allocator<_Allocator>::value, void>> 1570f2f7d72fSLouis Dionnemap(_InputIterator, _InputIterator, _Allocator) 1571f2f7d72fSLouis Dionne -> map<__iter_key_type<_InputIterator>, __iter_mapped_type<_InputIterator>, 1572f2f7d72fSLouis Dionne less<__iter_key_type<_InputIterator>>, _Allocator>; 1573f2f7d72fSLouis Dionne 1574f2f7d72fSLouis Dionnetemplate<class _Key, class _Tp, class _Allocator, 15754e0ea2cfSLouis Dionne class = enable_if_t<__is_allocator<_Allocator>::value, void>> 1576f2f7d72fSLouis Dionnemap(initializer_list<pair<_Key, _Tp>>, _Allocator) 1577f2f7d72fSLouis Dionne -> map<remove_const_t<_Key>, _Tp, less<remove_const_t<_Key>>, _Allocator>; 1578f2f7d72fSLouis Dionne#endif 15790594ad71SEric Fiselier 15805e3ea4ddSEric Fiselier#ifndef _LIBCPP_CXX03_LANG 15813e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 15823e519524SHoward Hinnantmap<_Key, _Tp, _Compare, _Allocator>::map(map&& __m, const allocator_type& __a) 15832a10c960SMarshall Clow : __tree_(_VSTD::move(__m.__tree_), typename __base::allocator_type(__a)) 15843e519524SHoward Hinnant{ 15853e519524SHoward Hinnant if (__a != __m.get_allocator()) 15863e519524SHoward Hinnant { 15873e519524SHoward Hinnant const_iterator __e = cend(); 15883e519524SHoward Hinnant while (!__m.empty()) 15893e519524SHoward Hinnant __tree_.__insert_unique(__e.__i_, 1590f52318b4SErik Pilkington __m.__tree_.remove(__m.begin().__i_)->__value_.__move()); 15913e519524SHoward Hinnant } 15923e519524SHoward Hinnant} 15933e519524SHoward Hinnant 159418293116SEric Fiseliertemplate <class _Key, class _Tp, class _Compare, class _Allocator> 159518293116SEric Fiselier_Tp& 159618293116SEric Fiseliermap<_Key, _Tp, _Compare, _Allocator>::operator[](const key_type& __k) 159718293116SEric Fiselier{ 159818293116SEric Fiselier return __tree_.__emplace_unique_key_args(__k, 159918293116SEric Fiselier _VSTD::piecewise_construct, 160018293116SEric Fiselier _VSTD::forward_as_tuple(__k), 1601f52318b4SErik Pilkington _VSTD::forward_as_tuple()).first->__get_value().second; 160218293116SEric Fiselier} 16033e519524SHoward Hinnant 160418293116SEric Fiseliertemplate <class _Key, class _Tp, class _Compare, class _Allocator> 160518293116SEric Fiselier_Tp& 160618293116SEric Fiseliermap<_Key, _Tp, _Compare, _Allocator>::operator[](key_type&& __k) 160718293116SEric Fiselier{ 160818293116SEric Fiselier return __tree_.__emplace_unique_key_args(__k, 160918293116SEric Fiselier _VSTD::piecewise_construct, 161018293116SEric Fiselier _VSTD::forward_as_tuple(_VSTD::move(__k)), 1611f52318b4SErik Pilkington _VSTD::forward_as_tuple()).first->__get_value().second; 161218293116SEric Fiselier} 161354f0cda6SEric Fiselier 161418293116SEric Fiselier#else // _LIBCPP_CXX03_LANG 161554f0cda6SEric Fiselier 16163e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 16173e519524SHoward Hinnanttypename map<_Key, _Tp, _Compare, _Allocator>::__node_holder 16184a95f9ebSHoward Hinnantmap<_Key, _Tp, _Compare, _Allocator>::__construct_node_with_key(const key_type& __k) 16193e519524SHoward Hinnant{ 16203e519524SHoward Hinnant __node_allocator& __na = __tree_.__node_alloc(); 1621c003db1fSHoward Hinnant __node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na)); 1622f52318b4SErik Pilkington __node_traits::construct(__na, _VSTD::addressof(__h->__value_.__get_value().first), __k); 16233e519524SHoward Hinnant __h.get_deleter().__first_constructed = true; 1624f52318b4SErik Pilkington __node_traits::construct(__na, _VSTD::addressof(__h->__value_.__get_value().second)); 16253e519524SHoward Hinnant __h.get_deleter().__second_constructed = true; 16268d4860aaSLouis Dionne return __h; 16273e519524SHoward Hinnant} 16283e519524SHoward Hinnant 16293e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 16303e519524SHoward Hinnant_Tp& 16313e519524SHoward Hinnantmap<_Key, _Tp, _Compare, _Allocator>::operator[](const key_type& __k) 16323e519524SHoward Hinnant{ 1633cb5cbc8bSEric Fiselier __parent_pointer __parent; 1634cb5cbc8bSEric Fiselier __node_base_pointer& __child = __tree_.__find_equal(__parent, __k); 16353e519524SHoward Hinnant __node_pointer __r = static_cast<__node_pointer>(__child); 16363e519524SHoward Hinnant if (__child == nullptr) 16373e519524SHoward Hinnant { 16384a95f9ebSHoward Hinnant __node_holder __h = __construct_node_with_key(__k); 163907d3eccdSHoward Hinnant __tree_.__insert_node_at(__parent, __child, static_cast<__node_base_pointer>(__h.get())); 16403e519524SHoward Hinnant __r = __h.release(); 16413e519524SHoward Hinnant } 1642f52318b4SErik Pilkington return __r->__value_.__get_value().second; 16433e519524SHoward Hinnant} 16443e519524SHoward Hinnant 164518293116SEric Fiselier#endif // _LIBCPP_CXX03_LANG 16463e519524SHoward Hinnant 16473e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 16483e519524SHoward Hinnant_Tp& 16493e519524SHoward Hinnantmap<_Key, _Tp, _Compare, _Allocator>::at(const key_type& __k) 16503e519524SHoward Hinnant{ 1651cb5cbc8bSEric Fiselier __parent_pointer __parent; 1652cb5cbc8bSEric Fiselier __node_base_pointer& __child = __tree_.__find_equal(__parent, __k); 16533e519524SHoward Hinnant if (__child == nullptr) 16547232a84eSLouis Dionne __throw_out_of_range("map::at: key not found"); 1655f52318b4SErik Pilkington return static_cast<__node_pointer>(__child)->__value_.__get_value().second; 16563e519524SHoward Hinnant} 16573e519524SHoward Hinnant 16583e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 16593e519524SHoward Hinnantconst _Tp& 16603e519524SHoward Hinnantmap<_Key, _Tp, _Compare, _Allocator>::at(const key_type& __k) const 16613e519524SHoward Hinnant{ 1662cb5cbc8bSEric Fiselier __parent_pointer __parent; 1663cb5cbc8bSEric Fiselier __node_base_pointer __child = __tree_.__find_equal(__parent, __k); 16643e519524SHoward Hinnant if (__child == nullptr) 16657232a84eSLouis Dionne __throw_out_of_range("map::at: key not found"); 1666f52318b4SErik Pilkington return static_cast<__node_pointer>(__child)->__value_.__get_value().second; 16673e519524SHoward Hinnant} 16683e519524SHoward Hinnant 16693e519524SHoward Hinnant 16703e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 1671848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 16723e519524SHoward Hinnantbool 16733e519524SHoward Hinnantoperator==(const map<_Key, _Tp, _Compare, _Allocator>& __x, 16743e519524SHoward Hinnant const map<_Key, _Tp, _Compare, _Allocator>& __y) 16753e519524SHoward Hinnant{ 1676ce48a113SHoward Hinnant return __x.size() == __y.size() && _VSTD::equal(__x.begin(), __x.end(), __y.begin()); 16773e519524SHoward Hinnant} 16783e519524SHoward Hinnant 16793e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 1680848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 16813e519524SHoward Hinnantbool 16823e519524SHoward Hinnantoperator< (const map<_Key, _Tp, _Compare, _Allocator>& __x, 16833e519524SHoward Hinnant const map<_Key, _Tp, _Compare, _Allocator>& __y) 16843e519524SHoward Hinnant{ 1685ce48a113SHoward Hinnant return _VSTD::lexicographical_compare(__x.begin(), __x.end(), __y.begin(), __y.end()); 16863e519524SHoward Hinnant} 16873e519524SHoward Hinnant 16883e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 1689848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 16903e519524SHoward Hinnantbool 16913e519524SHoward Hinnantoperator!=(const map<_Key, _Tp, _Compare, _Allocator>& __x, 16923e519524SHoward Hinnant const map<_Key, _Tp, _Compare, _Allocator>& __y) 16933e519524SHoward Hinnant{ 16943e519524SHoward Hinnant return !(__x == __y); 16953e519524SHoward Hinnant} 16963e519524SHoward Hinnant 16973e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 1698848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 16993e519524SHoward Hinnantbool 17003e519524SHoward Hinnantoperator> (const map<_Key, _Tp, _Compare, _Allocator>& __x, 17013e519524SHoward Hinnant const map<_Key, _Tp, _Compare, _Allocator>& __y) 17023e519524SHoward Hinnant{ 17033e519524SHoward Hinnant return __y < __x; 17043e519524SHoward Hinnant} 17053e519524SHoward Hinnant 17063e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 1707848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 17083e519524SHoward Hinnantbool 17093e519524SHoward Hinnantoperator>=(const map<_Key, _Tp, _Compare, _Allocator>& __x, 17103e519524SHoward Hinnant const map<_Key, _Tp, _Compare, _Allocator>& __y) 17113e519524SHoward Hinnant{ 17123e519524SHoward Hinnant return !(__x < __y); 17133e519524SHoward Hinnant} 17143e519524SHoward Hinnant 17153e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 1716848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 17173e519524SHoward Hinnantbool 17183e519524SHoward Hinnantoperator<=(const map<_Key, _Tp, _Compare, _Allocator>& __x, 17193e519524SHoward Hinnant const map<_Key, _Tp, _Compare, _Allocator>& __y) 17203e519524SHoward Hinnant{ 17213e519524SHoward Hinnant return !(__y < __x); 17223e519524SHoward Hinnant} 17233e519524SHoward Hinnant 17243e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 1725848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 17263e519524SHoward Hinnantvoid 17273e519524SHoward Hinnantswap(map<_Key, _Tp, _Compare, _Allocator>& __x, 17283e519524SHoward Hinnant map<_Key, _Tp, _Compare, _Allocator>& __y) 17291052ee39SHoward Hinnant _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y))) 17303e519524SHoward Hinnant{ 17313e519524SHoward Hinnant __x.swap(__y); 17323e519524SHoward Hinnant} 17333e519524SHoward Hinnant 1734f60c63c0SMarshall Clow#if _LIBCPP_STD_VER > 17 17353e895085SMarek Kurdejtemplate <class _Key, class _Tp, class _Compare, class _Allocator, 17363e895085SMarek Kurdej class _Predicate> 1737f60c63c0SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY 17383e895085SMarek Kurdej typename map<_Key, _Tp, _Compare, _Allocator>::size_type 17393e895085SMarek Kurdej erase_if(map<_Key, _Tp, _Compare, _Allocator>& __c, _Predicate __pred) { 17402ac6babcSArthur O'Dwyer return _VSTD::__libcpp_erase_if_container(__c, __pred); 17413e895085SMarek Kurdej} 1742f60c63c0SMarshall Clow#endif 1743f60c63c0SMarshall Clow 1744f60c63c0SMarshall Clow 17453e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare = less<_Key>, 17463e519524SHoward Hinnant class _Allocator = allocator<pair<const _Key, _Tp> > > 1747e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS multimap 17483e519524SHoward Hinnant{ 17493e519524SHoward Hinnantpublic: 17503e519524SHoward Hinnant // types: 17513e519524SHoward Hinnant typedef _Key key_type; 17523e519524SHoward Hinnant typedef _Tp mapped_type; 17533e519524SHoward Hinnant typedef pair<const key_type, mapped_type> value_type; 17543c6bd176SNikolas Klauser typedef __type_identity_t<_Compare> key_compare; 17553c6bd176SNikolas Klauser typedef __type_identity_t<_Allocator> allocator_type; 17563e519524SHoward Hinnant typedef value_type& reference; 17573e519524SHoward Hinnant typedef const value_type& const_reference; 17583e519524SHoward Hinnant 175994f89aeeSMarshall Clow static_assert((is_same<typename allocator_type::value_type, value_type>::value), 176094f89aeeSMarshall Clow "Allocator::value_type must be same type as value_type"); 176194f89aeeSMarshall Clow 1762e2f2d1edSEric Fiselier class _LIBCPP_TEMPLATE_VIS value_compare 1763681cde7dSNikolas Klauser : public __binary_function<value_type, value_type, bool> 17643e519524SHoward Hinnant { 17653e519524SHoward Hinnant friend class multimap; 17663e519524SHoward Hinnant protected: 17673e519524SHoward Hinnant key_compare comp; 17683e519524SHoward Hinnant 1769848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 1770*b48c5010SNikolas Klauser value_compare(key_compare __c) : comp(__c) {} 17713e519524SHoward Hinnant public: 1772848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 17733e519524SHoward Hinnant bool operator()(const value_type& __x, const value_type& __y) const 17743e519524SHoward Hinnant {return comp(__x.first, __y.first);} 17753e519524SHoward Hinnant }; 17763e519524SHoward Hinnant 17773e519524SHoward Hinnantprivate: 177807d3eccdSHoward Hinnant 17799fd9f84fSHoward Hinnant typedef _VSTD::__value_type<key_type, mapped_type> __value_type; 1780abb160e6SHoward Hinnant typedef __map_value_compare<key_type, __value_type, key_compare> __vc; 17811f508014SMarshall Clow typedef typename __rebind_alloc_helper<allocator_traits<allocator_type>, 17821f508014SMarshall Clow __value_type>::type __allocator_type; 17833e519524SHoward Hinnant typedef __tree<__value_type, __vc, __allocator_type> __base; 17843e519524SHoward Hinnant typedef typename __base::__node_traits __node_traits; 17853e519524SHoward Hinnant typedef allocator_traits<allocator_type> __alloc_traits; 17863e519524SHoward Hinnant 17873e519524SHoward Hinnant __base __tree_; 17883e519524SHoward Hinnant 17893e519524SHoward Hinnantpublic: 17903e519524SHoward Hinnant typedef typename __alloc_traits::pointer pointer; 17913e519524SHoward Hinnant typedef typename __alloc_traits::const_pointer const_pointer; 17923e519524SHoward Hinnant typedef typename __alloc_traits::size_type size_type; 17933e519524SHoward Hinnant typedef typename __alloc_traits::difference_type difference_type; 17943e519524SHoward Hinnant typedef __map_iterator<typename __base::iterator> iterator; 17953e519524SHoward Hinnant typedef __map_const_iterator<typename __base::const_iterator> const_iterator; 1796ce48a113SHoward Hinnant typedef _VSTD::reverse_iterator<iterator> reverse_iterator; 1797ce48a113SHoward Hinnant typedef _VSTD::reverse_iterator<const_iterator> const_reverse_iterator; 17983e519524SHoward Hinnant 1799b0386a51SErik Pilkington#if _LIBCPP_STD_VER > 14 1800b0386a51SErik Pilkington typedef __map_node_handle<typename __base::__node, allocator_type> node_type; 1801b0386a51SErik Pilkington#endif 1802b0386a51SErik Pilkington 18035c4e07aeSErik Pilkington template <class _Key2, class _Value2, class _Comp2, class _Alloc2> 18045c4e07aeSErik Pilkington friend class _LIBCPP_TEMPLATE_VIS map; 18055c4e07aeSErik Pilkington template <class _Key2, class _Value2, class _Comp2, class _Alloc2> 18065c4e07aeSErik Pilkington friend class _LIBCPP_TEMPLATE_VIS multimap; 18075c4e07aeSErik Pilkington 1808848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 1809415a24e4SMarshall Clow multimap() 1810415a24e4SMarshall Clow _NOEXCEPT_( 1811415a24e4SMarshall Clow is_nothrow_default_constructible<allocator_type>::value && 1812415a24e4SMarshall Clow is_nothrow_default_constructible<key_compare>::value && 1813415a24e4SMarshall Clow is_nothrow_copy_constructible<key_compare>::value) 1814415a24e4SMarshall Clow : __tree_(__vc(key_compare())) {} 1815415a24e4SMarshall Clow 1816415a24e4SMarshall Clow _LIBCPP_INLINE_VISIBILITY 1817415a24e4SMarshall Clow explicit multimap(const key_compare& __comp) 18181052ee39SHoward Hinnant _NOEXCEPT_( 18191052ee39SHoward Hinnant is_nothrow_default_constructible<allocator_type>::value && 18201052ee39SHoward Hinnant is_nothrow_copy_constructible<key_compare>::value) 18213e519524SHoward Hinnant : __tree_(__vc(__comp)) {} 18223e519524SHoward Hinnant 1823848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 18243e519524SHoward Hinnant explicit multimap(const key_compare& __comp, const allocator_type& __a) 18252a10c960SMarshall Clow : __tree_(__vc(__comp), typename __base::allocator_type(__a)) {} 18263e519524SHoward Hinnant 18273e519524SHoward Hinnant template <class _InputIterator> 1828848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 18293e519524SHoward Hinnant multimap(_InputIterator __f, _InputIterator __l, 18303e519524SHoward Hinnant const key_compare& __comp = key_compare()) 18313e519524SHoward Hinnant : __tree_(__vc(__comp)) 18323e519524SHoward Hinnant { 18333e519524SHoward Hinnant insert(__f, __l); 18343e519524SHoward Hinnant } 18353e519524SHoward Hinnant 18363e519524SHoward Hinnant template <class _InputIterator> 1837848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 18383e519524SHoward Hinnant multimap(_InputIterator __f, _InputIterator __l, 18393e519524SHoward Hinnant const key_compare& __comp, const allocator_type& __a) 18402a10c960SMarshall Clow : __tree_(__vc(__comp), typename __base::allocator_type(__a)) 18413e519524SHoward Hinnant { 18423e519524SHoward Hinnant insert(__f, __l); 18433e519524SHoward Hinnant } 18443e519524SHoward Hinnant 1845fbc317d4SMarshall Clow#if _LIBCPP_STD_VER > 11 1846fbc317d4SMarshall Clow template <class _InputIterator> 1847fbc317d4SMarshall Clow _LIBCPP_INLINE_VISIBILITY 1848fbc317d4SMarshall Clow multimap(_InputIterator __f, _InputIterator __l, const allocator_type& __a) 1849fbc317d4SMarshall Clow : multimap(__f, __l, key_compare(), __a) {} 1850fbc317d4SMarshall Clow#endif 1851fbc317d4SMarshall Clow 1852848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 18533e519524SHoward Hinnant multimap(const multimap& __m) 18543e519524SHoward Hinnant : __tree_(__m.__tree_.value_comp(), 18553e519524SHoward Hinnant __alloc_traits::select_on_container_copy_construction(__m.__tree_.__alloc())) 18563e519524SHoward Hinnant { 18573e519524SHoward Hinnant insert(__m.begin(), __m.end()); 18583e519524SHoward Hinnant } 18593e519524SHoward Hinnant 18605a33687dSHoward Hinnant _LIBCPP_INLINE_VISIBILITY 18615a33687dSHoward Hinnant multimap& operator=(const multimap& __m) 18625a33687dSHoward Hinnant { 18632ee83725SMarshall Clow#ifndef _LIBCPP_CXX03_LANG 18645a33687dSHoward Hinnant __tree_ = __m.__tree_; 186507d3eccdSHoward Hinnant#else 1866b8608b87SMark de Wever if (this != _VSTD::addressof(__m)) { 186707d3eccdSHoward Hinnant __tree_.clear(); 186807d3eccdSHoward Hinnant __tree_.value_comp() = __m.__tree_.value_comp(); 186907d3eccdSHoward Hinnant __tree_.__copy_assign_alloc(__m.__tree_); 187007d3eccdSHoward Hinnant insert(__m.begin(), __m.end()); 187174cf6ff5SMarshall Clow } 187207d3eccdSHoward Hinnant#endif 18735a33687dSHoward Hinnant return *this; 18745a33687dSHoward Hinnant } 18755a33687dSHoward Hinnant 187618293116SEric Fiselier#ifndef _LIBCPP_CXX03_LANG 18773e519524SHoward Hinnant 1878848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 18793e519524SHoward Hinnant multimap(multimap&& __m) 18801052ee39SHoward Hinnant _NOEXCEPT_(is_nothrow_move_constructible<__base>::value) 1881ce48a113SHoward Hinnant : __tree_(_VSTD::move(__m.__tree_)) 18823e519524SHoward Hinnant { 18833e519524SHoward Hinnant } 18843e519524SHoward Hinnant 18853e519524SHoward Hinnant multimap(multimap&& __m, const allocator_type& __a); 18863e519524SHoward Hinnant 1887848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 188854976f26SHoward Hinnant multimap& operator=(multimap&& __m) 188954976f26SHoward Hinnant _NOEXCEPT_(is_nothrow_move_assignable<__base>::value) 189054976f26SHoward Hinnant { 189154976f26SHoward Hinnant __tree_ = _VSTD::move(__m.__tree_); 189254976f26SHoward Hinnant return *this; 189354976f26SHoward Hinnant } 189454976f26SHoward Hinnant 189554976f26SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 18963e519524SHoward Hinnant multimap(initializer_list<value_type> __il, const key_compare& __comp = key_compare()) 18973e519524SHoward Hinnant : __tree_(__vc(__comp)) 18983e519524SHoward Hinnant { 18993e519524SHoward Hinnant insert(__il.begin(), __il.end()); 19003e519524SHoward Hinnant } 19013e519524SHoward Hinnant 1902848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 19033e519524SHoward Hinnant multimap(initializer_list<value_type> __il, const key_compare& __comp, const allocator_type& __a) 19042a10c960SMarshall Clow : __tree_(__vc(__comp), typename __base::allocator_type(__a)) 19053e519524SHoward Hinnant { 19063e519524SHoward Hinnant insert(__il.begin(), __il.end()); 19073e519524SHoward Hinnant } 19083e519524SHoward Hinnant 1909fbc317d4SMarshall Clow#if _LIBCPP_STD_VER > 11 1910fbc317d4SMarshall Clow _LIBCPP_INLINE_VISIBILITY 1911fbc317d4SMarshall Clow multimap(initializer_list<value_type> __il, const allocator_type& __a) 1912fbc317d4SMarshall Clow : multimap(__il, key_compare(), __a) {} 1913fbc317d4SMarshall Clow#endif 1914fbc317d4SMarshall Clow 1915848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 19163e519524SHoward Hinnant multimap& operator=(initializer_list<value_type> __il) 19173e519524SHoward Hinnant { 19183e519524SHoward Hinnant __tree_.__assign_multi(__il.begin(), __il.end()); 19193e519524SHoward Hinnant return *this; 19203e519524SHoward Hinnant } 192154976f26SHoward Hinnant 192218293116SEric Fiselier#endif // _LIBCPP_CXX03_LANG 19233e519524SHoward Hinnant 1924848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 19253e519524SHoward Hinnant explicit multimap(const allocator_type& __a) 19262a10c960SMarshall Clow : __tree_(typename __base::allocator_type(__a)) 19273e519524SHoward Hinnant { 19283e519524SHoward Hinnant } 19293e519524SHoward Hinnant 1930848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 19313e519524SHoward Hinnant multimap(const multimap& __m, const allocator_type& __a) 19322a10c960SMarshall Clow : __tree_(__m.__tree_.value_comp(), typename __base::allocator_type(__a)) 19333e519524SHoward Hinnant { 19343e519524SHoward Hinnant insert(__m.begin(), __m.end()); 19353e519524SHoward Hinnant } 19363e519524SHoward Hinnant 1937848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 19387c142fccSLouis Dionne ~multimap() { 19397c142fccSLouis Dionne static_assert(sizeof(__diagnose_non_const_comparator<_Key, _Compare>()), ""); 19407c142fccSLouis Dionne } 19417c142fccSLouis Dionne 19427c142fccSLouis Dionne _LIBCPP_INLINE_VISIBILITY 19431052ee39SHoward Hinnant iterator begin() _NOEXCEPT {return __tree_.begin();} 1944848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 19451052ee39SHoward Hinnant const_iterator begin() const _NOEXCEPT {return __tree_.begin();} 1946848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 19471052ee39SHoward Hinnant iterator end() _NOEXCEPT {return __tree_.end();} 1948848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 19491052ee39SHoward Hinnant const_iterator end() const _NOEXCEPT {return __tree_.end();} 19503e519524SHoward Hinnant 1951848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 19521052ee39SHoward Hinnant reverse_iterator rbegin() _NOEXCEPT {return reverse_iterator(end());} 1953848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 19541052ee39SHoward Hinnant const_reverse_iterator rbegin() const _NOEXCEPT 19551052ee39SHoward Hinnant {return const_reverse_iterator(end());} 1956848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 19571052ee39SHoward Hinnant reverse_iterator rend() _NOEXCEPT {return reverse_iterator(begin());} 1958848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 19591052ee39SHoward Hinnant const_reverse_iterator rend() const _NOEXCEPT 19601052ee39SHoward Hinnant {return const_reverse_iterator(begin());} 19613e519524SHoward Hinnant 1962848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 19631052ee39SHoward Hinnant const_iterator cbegin() const _NOEXCEPT {return begin();} 1964848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 19651052ee39SHoward Hinnant const_iterator cend() const _NOEXCEPT {return end();} 1966848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 19671052ee39SHoward Hinnant const_reverse_iterator crbegin() const _NOEXCEPT {return rbegin();} 1968848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 19691052ee39SHoward Hinnant const_reverse_iterator crend() const _NOEXCEPT {return rend();} 19703e519524SHoward Hinnant 197172c8fad4SMarshall Clow _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY 19721052ee39SHoward Hinnant bool empty() const _NOEXCEPT {return __tree_.size() == 0;} 1973848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 19741052ee39SHoward Hinnant size_type size() const _NOEXCEPT {return __tree_.size();} 1975848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 19761052ee39SHoward Hinnant size_type max_size() const _NOEXCEPT {return __tree_.max_size();} 19773e519524SHoward Hinnant 1978848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 19792a10c960SMarshall Clow allocator_type get_allocator() const _NOEXCEPT {return allocator_type(__tree_.__alloc());} 1980848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 19813e519524SHoward Hinnant key_compare key_comp() const {return __tree_.value_comp().key_comp();} 1982848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 19831052ee39SHoward Hinnant value_compare value_comp() const 19841052ee39SHoward Hinnant {return value_compare(__tree_.value_comp().key_comp());} 19853e519524SHoward Hinnant 19865e3ea4ddSEric Fiselier#ifndef _LIBCPP_CXX03_LANG 19877609c9b6SHoward Hinnant 19888b805c91SHoward Hinnant template <class ..._Args> 19895e3ea4ddSEric Fiselier _LIBCPP_INLINE_VISIBILITY 19905e3ea4ddSEric Fiselier iterator emplace(_Args&& ...__args) { 19915e3ea4ddSEric Fiselier return __tree_.__emplace_multi(_VSTD::forward<_Args>(__args)...); 19925e3ea4ddSEric Fiselier } 19933e519524SHoward Hinnant 19948b805c91SHoward Hinnant template <class ..._Args> 19955e3ea4ddSEric Fiselier _LIBCPP_INLINE_VISIBILITY 19965e3ea4ddSEric Fiselier iterator emplace_hint(const_iterator __p, _Args&& ...__args) { 19975e3ea4ddSEric Fiselier return __tree_.__emplace_hint_multi(__p.__i_, _VSTD::forward<_Args>(__args)...); 19985e3ea4ddSEric Fiselier } 19997609c9b6SHoward Hinnant 2000c003db1fSHoward Hinnant template <class _Pp, 20014887d047SNikolas Klauser class = __enable_if_t<is_constructible<value_type, _Pp>::value>> 2002848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 2003c003db1fSHoward Hinnant iterator insert(_Pp&& __p) 2004c003db1fSHoward Hinnant {return __tree_.__insert_multi(_VSTD::forward<_Pp>(__p));} 20053e519524SHoward Hinnant 2006c003db1fSHoward Hinnant template <class _Pp, 20074887d047SNikolas Klauser class = __enable_if_t<is_constructible<value_type, _Pp>::value>> 2008848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 2009c003db1fSHoward Hinnant iterator insert(const_iterator __pos, _Pp&& __p) 2010c003db1fSHoward Hinnant {return __tree_.__insert_multi(__pos.__i_, _VSTD::forward<_Pp>(__p));} 20113e519524SHoward Hinnant 20127a9f500fSEric Fiselier _LIBCPP_INLINE_VISIBILITY 20137a9f500fSEric Fiselier iterator insert(value_type&& __v) 20147a9f500fSEric Fiselier {return __tree_.__insert_multi(_VSTD::move(__v));} 20157a9f500fSEric Fiselier 20167a9f500fSEric Fiselier _LIBCPP_INLINE_VISIBILITY 20177a9f500fSEric Fiselier iterator insert(const_iterator __p, value_type&& __v) 20187a9f500fSEric Fiselier {return __tree_.__insert_multi(__p.__i_, _VSTD::move(__v));} 20197a9f500fSEric Fiselier 202018293116SEric Fiselier 202118293116SEric Fiselier _LIBCPP_INLINE_VISIBILITY 202218293116SEric Fiselier void insert(initializer_list<value_type> __il) 202318293116SEric Fiselier {insert(__il.begin(), __il.end());} 202418293116SEric Fiselier 20255e3ea4ddSEric Fiselier#endif // _LIBCPP_CXX03_LANG 20263e519524SHoward Hinnant 2027848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 20283e519524SHoward Hinnant iterator insert(const value_type& __v) {return __tree_.__insert_multi(__v);} 20293e519524SHoward Hinnant 2030848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 20313e519524SHoward Hinnant iterator insert(const_iterator __p, const value_type& __v) 20323e519524SHoward Hinnant {return __tree_.__insert_multi(__p.__i_, __v);} 20333e519524SHoward Hinnant 20343e519524SHoward Hinnant template <class _InputIterator> 2035848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 20363e519524SHoward Hinnant void insert(_InputIterator __f, _InputIterator __l) 20373e519524SHoward Hinnant { 20383e519524SHoward Hinnant for (const_iterator __e = cend(); __f != __l; ++__f) 20393e519524SHoward Hinnant __tree_.__insert_multi(__e.__i_, *__f); 20403e519524SHoward Hinnant } 20413e519524SHoward Hinnant 2042848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 20433e519524SHoward Hinnant iterator erase(const_iterator __p) {return __tree_.erase(__p.__i_);} 2044848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 2045ec392968SMarshall Clow iterator erase(iterator __p) {return __tree_.erase(__p.__i_);} 2046ec392968SMarshall Clow _LIBCPP_INLINE_VISIBILITY 20473e519524SHoward Hinnant size_type erase(const key_type& __k) {return __tree_.__erase_multi(__k);} 2048848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 20493e519524SHoward Hinnant iterator erase(const_iterator __f, const_iterator __l) 20503e519524SHoward Hinnant {return __tree_.erase(__f.__i_, __l.__i_);} 2051b0386a51SErik Pilkington 2052b0386a51SErik Pilkington#if _LIBCPP_STD_VER > 14 2053b0386a51SErik Pilkington _LIBCPP_INLINE_VISIBILITY 2054b0386a51SErik Pilkington iterator insert(node_type&& __nh) 2055b0386a51SErik Pilkington { 2056b0386a51SErik Pilkington _LIBCPP_ASSERT(__nh.empty() || __nh.get_allocator() == get_allocator(), 2057b0386a51SErik Pilkington "node_type with incompatible allocator passed to multimap::insert()"); 2058b0386a51SErik Pilkington return __tree_.template __node_handle_insert_multi<node_type>( 2059b0386a51SErik Pilkington _VSTD::move(__nh)); 2060b0386a51SErik Pilkington } 2061b0386a51SErik Pilkington _LIBCPP_INLINE_VISIBILITY 2062b0386a51SErik Pilkington iterator insert(const_iterator __hint, node_type&& __nh) 2063b0386a51SErik Pilkington { 2064b0386a51SErik Pilkington _LIBCPP_ASSERT(__nh.empty() || __nh.get_allocator() == get_allocator(), 2065b0386a51SErik Pilkington "node_type with incompatible allocator passed to multimap::insert()"); 2066b0386a51SErik Pilkington return __tree_.template __node_handle_insert_multi<node_type>( 2067b0386a51SErik Pilkington __hint.__i_, _VSTD::move(__nh)); 2068b0386a51SErik Pilkington } 2069b0386a51SErik Pilkington _LIBCPP_INLINE_VISIBILITY 2070b0386a51SErik Pilkington node_type extract(key_type const& __key) 2071b0386a51SErik Pilkington { 2072b0386a51SErik Pilkington return __tree_.template __node_handle_extract<node_type>(__key); 2073b0386a51SErik Pilkington } 2074b0386a51SErik Pilkington _LIBCPP_INLINE_VISIBILITY 2075b0386a51SErik Pilkington node_type extract(const_iterator __it) 2076b0386a51SErik Pilkington { 2077b0386a51SErik Pilkington return __tree_.template __node_handle_extract<node_type>( 2078b0386a51SErik Pilkington __it.__i_); 2079b0386a51SErik Pilkington } 20808df1d5a5SLouis Dionne template <class _Compare2> 20815c4e07aeSErik Pilkington _LIBCPP_INLINE_VISIBILITY 20828df1d5a5SLouis Dionne void merge(multimap<key_type, mapped_type, _Compare2, allocator_type>& __source) 20835c4e07aeSErik Pilkington { 20845c4e07aeSErik Pilkington _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(), 20855c4e07aeSErik Pilkington "merging container with incompatible allocator"); 20865c4e07aeSErik Pilkington return __tree_.__node_handle_merge_multi(__source.__tree_); 20875c4e07aeSErik Pilkington } 20888df1d5a5SLouis Dionne template <class _Compare2> 20895c4e07aeSErik Pilkington _LIBCPP_INLINE_VISIBILITY 20908df1d5a5SLouis Dionne void merge(multimap<key_type, mapped_type, _Compare2, allocator_type>&& __source) 20915c4e07aeSErik Pilkington { 20925c4e07aeSErik Pilkington _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(), 20935c4e07aeSErik Pilkington "merging container with incompatible allocator"); 20945c4e07aeSErik Pilkington return __tree_.__node_handle_merge_multi(__source.__tree_); 20955c4e07aeSErik Pilkington } 20968df1d5a5SLouis Dionne template <class _Compare2> 20975c4e07aeSErik Pilkington _LIBCPP_INLINE_VISIBILITY 20988df1d5a5SLouis Dionne void merge(map<key_type, mapped_type, _Compare2, allocator_type>& __source) 20995c4e07aeSErik Pilkington { 21005c4e07aeSErik Pilkington _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(), 21015c4e07aeSErik Pilkington "merging container with incompatible allocator"); 21025c4e07aeSErik Pilkington return __tree_.__node_handle_merge_multi(__source.__tree_); 21035c4e07aeSErik Pilkington } 21048df1d5a5SLouis Dionne template <class _Compare2> 21055c4e07aeSErik Pilkington _LIBCPP_INLINE_VISIBILITY 21068df1d5a5SLouis Dionne void merge(map<key_type, mapped_type, _Compare2, allocator_type>&& __source) 21075c4e07aeSErik Pilkington { 21085c4e07aeSErik Pilkington _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(), 21095c4e07aeSErik Pilkington "merging container with incompatible allocator"); 21105c4e07aeSErik Pilkington return __tree_.__node_handle_merge_multi(__source.__tree_); 21115c4e07aeSErik Pilkington } 2112b0386a51SErik Pilkington#endif 2113b0386a51SErik Pilkington 2114848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 2115934e9a39SMarshall Clow void clear() _NOEXCEPT {__tree_.clear();} 21163e519524SHoward Hinnant 2117848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 21181052ee39SHoward Hinnant void swap(multimap& __m) 21191052ee39SHoward Hinnant _NOEXCEPT_(__is_nothrow_swappable<__base>::value) 21201052ee39SHoward Hinnant {__tree_.swap(__m.__tree_);} 21213e519524SHoward Hinnant 2122848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 21233e519524SHoward Hinnant iterator find(const key_type& __k) {return __tree_.find(__k);} 2124848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 21253e519524SHoward Hinnant const_iterator find(const key_type& __k) const {return __tree_.find(__k);} 21262585835cSMarshall Clow#if _LIBCPP_STD_VER > 11 21272585835cSMarshall Clow template <typename _K2> 21282585835cSMarshall Clow _LIBCPP_INLINE_VISIBILITY 21294887d047SNikolas Klauser __enable_if_t<__is_transparent<_Compare, _K2>::value, iterator> 21302585835cSMarshall Clow find(const _K2& __k) {return __tree_.find(__k);} 21312585835cSMarshall Clow template <typename _K2> 21322585835cSMarshall Clow _LIBCPP_INLINE_VISIBILITY 21334887d047SNikolas Klauser __enable_if_t<__is_transparent<_Compare, _K2>::value, const_iterator> 21342585835cSMarshall Clow find(const _K2& __k) const {return __tree_.find(__k);} 21352585835cSMarshall Clow#endif 21362585835cSMarshall Clow 2137848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 21383e519524SHoward Hinnant size_type count(const key_type& __k) const 21393e519524SHoward Hinnant {return __tree_.__count_multi(__k);} 21400aacbc92SMarshall Clow#if _LIBCPP_STD_VER > 11 21410aacbc92SMarshall Clow template <typename _K2> 21420aacbc92SMarshall Clow _LIBCPP_INLINE_VISIBILITY 21434887d047SNikolas Klauser __enable_if_t<__is_transparent<_Compare, _K2>::value, size_type> 2144f8457a07SMarshall Clow count(const _K2& __k) const {return __tree_.__count_multi(__k);} 21450aacbc92SMarshall Clow#endif 2146a17b1aedSZoe Carver 2147a17b1aedSZoe Carver#if _LIBCPP_STD_VER > 17 2148a17b1aedSZoe Carver _LIBCPP_INLINE_VISIBILITY 2149a17b1aedSZoe Carver bool contains(const key_type& __k) const {return find(__k) != end();} 21503fca07d7SMarek Kurdej template <typename _K2> 21513fca07d7SMarek Kurdej _LIBCPP_INLINE_VISIBILITY 21524887d047SNikolas Klauser __enable_if_t<__is_transparent<_Compare, _K2>::value, bool> 21533fca07d7SMarek Kurdej contains(const _K2& __k) const { return find(__k) != end(); } 2154a17b1aedSZoe Carver#endif // _LIBCPP_STD_VER > 17 2155a17b1aedSZoe Carver 2156848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 21573e519524SHoward Hinnant iterator lower_bound(const key_type& __k) 21583e519524SHoward Hinnant {return __tree_.lower_bound(__k);} 2159848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 21603e519524SHoward Hinnant const_iterator lower_bound(const key_type& __k) const 21613e519524SHoward Hinnant {return __tree_.lower_bound(__k);} 21622585835cSMarshall Clow#if _LIBCPP_STD_VER > 11 21632585835cSMarshall Clow template <typename _K2> 21642585835cSMarshall Clow _LIBCPP_INLINE_VISIBILITY 21654887d047SNikolas Klauser __enable_if_t<__is_transparent<_Compare, _K2>::value, iterator> 21662585835cSMarshall Clow lower_bound(const _K2& __k) {return __tree_.lower_bound(__k);} 21672585835cSMarshall Clow 21682585835cSMarshall Clow template <typename _K2> 21692585835cSMarshall Clow _LIBCPP_INLINE_VISIBILITY 21704887d047SNikolas Klauser __enable_if_t<__is_transparent<_Compare, _K2>::value, const_iterator> 21712585835cSMarshall Clow lower_bound(const _K2& __k) const {return __tree_.lower_bound(__k);} 21722585835cSMarshall Clow#endif 21732585835cSMarshall Clow 2174848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 21753e519524SHoward Hinnant iterator upper_bound(const key_type& __k) 21763e519524SHoward Hinnant {return __tree_.upper_bound(__k);} 2177848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 21783e519524SHoward Hinnant const_iterator upper_bound(const key_type& __k) const 21793e519524SHoward Hinnant {return __tree_.upper_bound(__k);} 21802585835cSMarshall Clow#if _LIBCPP_STD_VER > 11 21812585835cSMarshall Clow template <typename _K2> 21822585835cSMarshall Clow _LIBCPP_INLINE_VISIBILITY 21834887d047SNikolas Klauser __enable_if_t<__is_transparent<_Compare, _K2>::value, iterator> 21842585835cSMarshall Clow upper_bound(const _K2& __k) {return __tree_.upper_bound(__k);} 21852585835cSMarshall Clow template <typename _K2> 21862585835cSMarshall Clow _LIBCPP_INLINE_VISIBILITY 21874887d047SNikolas Klauser __enable_if_t<__is_transparent<_Compare, _K2>::value, const_iterator> 21882585835cSMarshall Clow upper_bound(const _K2& __k) const {return __tree_.upper_bound(__k);} 21892585835cSMarshall Clow#endif 21902585835cSMarshall Clow 2191848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 21923e519524SHoward Hinnant pair<iterator,iterator> equal_range(const key_type& __k) 21933e519524SHoward Hinnant {return __tree_.__equal_range_multi(__k);} 2194848a5374SHoward Hinnant _LIBCPP_INLINE_VISIBILITY 21953e519524SHoward Hinnant pair<const_iterator,const_iterator> equal_range(const key_type& __k) const 21963e519524SHoward Hinnant {return __tree_.__equal_range_multi(__k);} 21972585835cSMarshall Clow#if _LIBCPP_STD_VER > 11 21982585835cSMarshall Clow template <typename _K2> 21992585835cSMarshall Clow _LIBCPP_INLINE_VISIBILITY 22004887d047SNikolas Klauser __enable_if_t<__is_transparent<_Compare, _K2>::value, pair<iterator,iterator>> 22012585835cSMarshall Clow equal_range(const _K2& __k) {return __tree_.__equal_range_multi(__k);} 22022585835cSMarshall Clow template <typename _K2> 22032585835cSMarshall Clow _LIBCPP_INLINE_VISIBILITY 22044887d047SNikolas Klauser __enable_if_t<__is_transparent<_Compare, _K2>::value, pair<const_iterator,const_iterator>> 22052585835cSMarshall Clow equal_range(const _K2& __k) const {return __tree_.__equal_range_multi(__k);} 22062585835cSMarshall Clow#endif 22073e519524SHoward Hinnant 22083e519524SHoward Hinnantprivate: 22093e519524SHoward Hinnant typedef typename __base::__node __node; 22103e519524SHoward Hinnant typedef typename __base::__node_allocator __node_allocator; 22113e519524SHoward Hinnant typedef typename __base::__node_pointer __node_pointer; 22120594ad71SEric Fiselier 2213c003db1fSHoward Hinnant typedef __map_node_destructor<__node_allocator> _Dp; 2214c003db1fSHoward Hinnant typedef unique_ptr<__node, _Dp> __node_holder; 22153e519524SHoward Hinnant}; 22163e519524SHoward Hinnant 221701666904SLouis Dionne#if _LIBCPP_STD_VER >= 17 2218f2f7d72fSLouis Dionnetemplate<class _InputIterator, class _Compare = less<__iter_key_type<_InputIterator>>, 2219f2f7d72fSLouis Dionne class _Allocator = allocator<__iter_to_alloc_type<_InputIterator>>, 222068072a71SKonstantin Varlamov class = enable_if_t<__is_cpp17_input_iterator<_InputIterator>::value, void>, 22214e0ea2cfSLouis Dionne class = enable_if_t<!__is_allocator<_Compare>::value, void>, 22224e0ea2cfSLouis Dionne class = enable_if_t<__is_allocator<_Allocator>::value, void>> 2223f2f7d72fSLouis Dionnemultimap(_InputIterator, _InputIterator, _Compare = _Compare(), _Allocator = _Allocator()) 2224f2f7d72fSLouis Dionne -> multimap<__iter_key_type<_InputIterator>, __iter_mapped_type<_InputIterator>, _Compare, _Allocator>; 2225f2f7d72fSLouis Dionne 2226f2f7d72fSLouis Dionnetemplate<class _Key, class _Tp, class _Compare = less<remove_const_t<_Key>>, 2227f2f7d72fSLouis Dionne class _Allocator = allocator<pair<const _Key, _Tp>>, 22284e0ea2cfSLouis Dionne class = enable_if_t<!__is_allocator<_Compare>::value, void>, 22294e0ea2cfSLouis Dionne class = enable_if_t<__is_allocator<_Allocator>::value, void>> 2230f2f7d72fSLouis Dionnemultimap(initializer_list<pair<_Key, _Tp>>, _Compare = _Compare(), _Allocator = _Allocator()) 2231f2f7d72fSLouis Dionne -> multimap<remove_const_t<_Key>, _Tp, _Compare, _Allocator>; 2232f2f7d72fSLouis Dionne 2233f2f7d72fSLouis Dionnetemplate<class _InputIterator, class _Allocator, 223468072a71SKonstantin Varlamov class = enable_if_t<__is_cpp17_input_iterator<_InputIterator>::value, void>, 22354e0ea2cfSLouis Dionne class = enable_if_t<__is_allocator<_Allocator>::value, void>> 2236f2f7d72fSLouis Dionnemultimap(_InputIterator, _InputIterator, _Allocator) 2237f2f7d72fSLouis Dionne -> multimap<__iter_key_type<_InputIterator>, __iter_mapped_type<_InputIterator>, 2238f2f7d72fSLouis Dionne less<__iter_key_type<_InputIterator>>, _Allocator>; 2239f2f7d72fSLouis Dionne 2240f2f7d72fSLouis Dionnetemplate<class _Key, class _Tp, class _Allocator, 22414e0ea2cfSLouis Dionne class = enable_if_t<__is_allocator<_Allocator>::value, void>> 2242f2f7d72fSLouis Dionnemultimap(initializer_list<pair<_Key, _Tp>>, _Allocator) 2243f2f7d72fSLouis Dionne -> multimap<remove_const_t<_Key>, _Tp, less<remove_const_t<_Key>>, _Allocator>; 2244f2f7d72fSLouis Dionne#endif 2245f2f7d72fSLouis Dionne 22465e3ea4ddSEric Fiselier#ifndef _LIBCPP_CXX03_LANG 22473e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 22483e519524SHoward Hinnantmultimap<_Key, _Tp, _Compare, _Allocator>::multimap(multimap&& __m, const allocator_type& __a) 22492a10c960SMarshall Clow : __tree_(_VSTD::move(__m.__tree_), typename __base::allocator_type(__a)) 22503e519524SHoward Hinnant{ 22513e519524SHoward Hinnant if (__a != __m.get_allocator()) 22523e519524SHoward Hinnant { 22533e519524SHoward Hinnant const_iterator __e = cend(); 22543e519524SHoward Hinnant while (!__m.empty()) 22553e519524SHoward Hinnant __tree_.__insert_multi(__e.__i_, 2256f52318b4SErik Pilkington _VSTD::move(__m.__tree_.remove(__m.begin().__i_)->__value_.__move())); 22573e519524SHoward Hinnant } 22583e519524SHoward Hinnant} 22595e3ea4ddSEric Fiselier#endif 22603e519524SHoward Hinnant 22613e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 2262848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 22633e519524SHoward Hinnantbool 22643e519524SHoward Hinnantoperator==(const multimap<_Key, _Tp, _Compare, _Allocator>& __x, 22653e519524SHoward Hinnant const multimap<_Key, _Tp, _Compare, _Allocator>& __y) 22663e519524SHoward Hinnant{ 2267ce48a113SHoward Hinnant return __x.size() == __y.size() && _VSTD::equal(__x.begin(), __x.end(), __y.begin()); 22683e519524SHoward Hinnant} 22693e519524SHoward Hinnant 22703e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 2271848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 22723e519524SHoward Hinnantbool 22733e519524SHoward Hinnantoperator< (const multimap<_Key, _Tp, _Compare, _Allocator>& __x, 22743e519524SHoward Hinnant const multimap<_Key, _Tp, _Compare, _Allocator>& __y) 22753e519524SHoward Hinnant{ 2276ce48a113SHoward Hinnant return _VSTD::lexicographical_compare(__x.begin(), __x.end(), __y.begin(), __y.end()); 22773e519524SHoward Hinnant} 22783e519524SHoward Hinnant 22793e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 2280848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 22813e519524SHoward Hinnantbool 22823e519524SHoward Hinnantoperator!=(const multimap<_Key, _Tp, _Compare, _Allocator>& __x, 22833e519524SHoward Hinnant const multimap<_Key, _Tp, _Compare, _Allocator>& __y) 22843e519524SHoward Hinnant{ 22853e519524SHoward Hinnant return !(__x == __y); 22863e519524SHoward Hinnant} 22873e519524SHoward Hinnant 22883e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 2289848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 22903e519524SHoward Hinnantbool 22913e519524SHoward Hinnantoperator> (const multimap<_Key, _Tp, _Compare, _Allocator>& __x, 22923e519524SHoward Hinnant const multimap<_Key, _Tp, _Compare, _Allocator>& __y) 22933e519524SHoward Hinnant{ 22943e519524SHoward Hinnant return __y < __x; 22953e519524SHoward Hinnant} 22963e519524SHoward Hinnant 22973e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 2298848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 22993e519524SHoward Hinnantbool 23003e519524SHoward Hinnantoperator>=(const multimap<_Key, _Tp, _Compare, _Allocator>& __x, 23013e519524SHoward Hinnant const multimap<_Key, _Tp, _Compare, _Allocator>& __y) 23023e519524SHoward Hinnant{ 23033e519524SHoward Hinnant return !(__x < __y); 23043e519524SHoward Hinnant} 23053e519524SHoward Hinnant 23063e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 2307848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 23083e519524SHoward Hinnantbool 23093e519524SHoward Hinnantoperator<=(const multimap<_Key, _Tp, _Compare, _Allocator>& __x, 23103e519524SHoward Hinnant const multimap<_Key, _Tp, _Compare, _Allocator>& __y) 23113e519524SHoward Hinnant{ 23123e519524SHoward Hinnant return !(__y < __x); 23133e519524SHoward Hinnant} 23143e519524SHoward Hinnant 23153e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator> 2316848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY 23173e519524SHoward Hinnantvoid 23183e519524SHoward Hinnantswap(multimap<_Key, _Tp, _Compare, _Allocator>& __x, 23193e519524SHoward Hinnant multimap<_Key, _Tp, _Compare, _Allocator>& __y) 23201052ee39SHoward Hinnant _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y))) 23213e519524SHoward Hinnant{ 23223e519524SHoward Hinnant __x.swap(__y); 23233e519524SHoward Hinnant} 23243e519524SHoward Hinnant 2325f60c63c0SMarshall Clow#if _LIBCPP_STD_VER > 17 23263e895085SMarek Kurdejtemplate <class _Key, class _Tp, class _Compare, class _Allocator, 23273e895085SMarek Kurdej class _Predicate> 2328f60c63c0SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY 23293e895085SMarek Kurdej typename multimap<_Key, _Tp, _Compare, _Allocator>::size_type 23303e895085SMarek Kurdej erase_if(multimap<_Key, _Tp, _Compare, _Allocator>& __c, 23313e895085SMarek Kurdej _Predicate __pred) { 23322ac6babcSArthur O'Dwyer return _VSTD::__libcpp_erase_if_container(__c, __pred); 23333e895085SMarek Kurdej} 2334f60c63c0SMarshall Clow#endif 2335f60c63c0SMarshall Clow 23363e519524SHoward Hinnant_LIBCPP_END_NAMESPACE_STD 23373e519524SHoward Hinnant 23383e519524SHoward Hinnant#endif // _LIBCPP_MAP 2339