xref: /llvm-project-15.0.7/libcxx/include/map (revision 5c4e07ae)
13e519524SHoward Hinnant// -*- C++ -*-
23e519524SHoward Hinnant//===----------------------------- map ------------------------------------===//
33e519524SHoward Hinnant//
45b08a8a4SHoward Hinnant//                     The LLVM Compiler Infrastructure
53e519524SHoward Hinnant//
6412dbebeSHoward Hinnant// This file is dual licensed under the MIT and the University of Illinois Open
7412dbebeSHoward Hinnant// Source Licenses. See LICENSE.TXT for details.
83e519524SHoward Hinnant//
93e519524SHoward Hinnant//===----------------------------------------------------------------------===//
103e519524SHoward Hinnant
113e519524SHoward Hinnant#ifndef _LIBCPP_MAP
123e519524SHoward Hinnant#define _LIBCPP_MAP
133e519524SHoward Hinnant
143e519524SHoward Hinnant/*
153e519524SHoward Hinnant
163e519524SHoward Hinnant    map synopsis
173e519524SHoward Hinnant
183e519524SHoward Hinnantnamespace std
193e519524SHoward Hinnant{
203e519524SHoward Hinnant
213e519524SHoward Hinnanttemplate <class Key, class T, class Compare = less<Key>,
223e519524SHoward Hinnant          class Allocator = allocator<pair<const Key, T>>>
233e519524SHoward Hinnantclass map
243e519524SHoward Hinnant{
253e519524SHoward Hinnantpublic:
263e519524SHoward Hinnant    // types:
273e519524SHoward Hinnant    typedef Key                                      key_type;
283e519524SHoward Hinnant    typedef T                                        mapped_type;
293e519524SHoward Hinnant    typedef pair<const key_type, mapped_type>        value_type;
303e519524SHoward Hinnant    typedef Compare                                  key_compare;
313e519524SHoward Hinnant    typedef Allocator                                allocator_type;
323e519524SHoward Hinnant    typedef typename allocator_type::reference       reference;
333e519524SHoward Hinnant    typedef typename allocator_type::const_reference const_reference;
343e519524SHoward Hinnant    typedef typename allocator_type::pointer         pointer;
353e519524SHoward Hinnant    typedef typename allocator_type::const_pointer   const_pointer;
363e519524SHoward Hinnant    typedef typename allocator_type::size_type       size_type;
373e519524SHoward Hinnant    typedef typename allocator_type::difference_type difference_type;
383e519524SHoward Hinnant
393e519524SHoward Hinnant    typedef implementation-defined                   iterator;
403e519524SHoward Hinnant    typedef implementation-defined                   const_iterator;
413e519524SHoward Hinnant    typedef std::reverse_iterator<iterator>          reverse_iterator;
423e519524SHoward Hinnant    typedef std::reverse_iterator<const_iterator>    const_reverse_iterator;
43b0386a51SErik Pilkington    typedef unspecified                              node_type;              // C++17
44b0386a51SErik Pilkington    typedef INSERT_RETURN_TYPE<iterator, node_type>  insert_return_type;     // C++17
453e519524SHoward Hinnant
463e519524SHoward Hinnant    class value_compare
473e519524SHoward Hinnant        : public binary_function<value_type, value_type, bool>
483e519524SHoward Hinnant    {
493e519524SHoward Hinnant        friend class map;
503e519524SHoward Hinnant    protected:
513e519524SHoward Hinnant        key_compare comp;
523e519524SHoward Hinnant
533e519524SHoward Hinnant        value_compare(key_compare c);
543e519524SHoward Hinnant    public:
553e519524SHoward Hinnant        bool operator()(const value_type& x, const value_type& y) const;
563e519524SHoward Hinnant    };
573e519524SHoward Hinnant
583e519524SHoward Hinnant    // construct/copy/destroy:
591052ee39SHoward Hinnant    map()
601052ee39SHoward Hinnant        noexcept(
611052ee39SHoward Hinnant            is_nothrow_default_constructible<allocator_type>::value &&
621052ee39SHoward Hinnant            is_nothrow_default_constructible<key_compare>::value &&
631052ee39SHoward Hinnant            is_nothrow_copy_constructible<key_compare>::value);
643e519524SHoward Hinnant    explicit map(const key_compare& comp);
653e519524SHoward Hinnant    map(const key_compare& comp, const allocator_type& a);
663e519524SHoward Hinnant    template <class InputIterator>
673e519524SHoward Hinnant        map(InputIterator first, InputIterator last,
683e519524SHoward Hinnant            const key_compare& comp = key_compare());
693e519524SHoward Hinnant    template <class InputIterator>
703e519524SHoward Hinnant        map(InputIterator first, InputIterator last,
713e519524SHoward Hinnant            const key_compare& comp, const allocator_type& a);
723e519524SHoward Hinnant    map(const map& m);
731052ee39SHoward Hinnant    map(map&& m)
741052ee39SHoward Hinnant        noexcept(
751052ee39SHoward Hinnant            is_nothrow_move_constructible<allocator_type>::value &&
761052ee39SHoward Hinnant            is_nothrow_move_constructible<key_compare>::value);
773e519524SHoward Hinnant    explicit map(const allocator_type& a);
783e519524SHoward Hinnant    map(const map& m, const allocator_type& a);
793e519524SHoward Hinnant    map(map&& m, const allocator_type& a);
803e519524SHoward Hinnant    map(initializer_list<value_type> il, const key_compare& comp = key_compare());
813e519524SHoward Hinnant    map(initializer_list<value_type> il, const key_compare& comp, const allocator_type& a);
82fbc317d4SMarshall Clow    template <class InputIterator>
83fbc317d4SMarshall Clow        map(InputIterator first, InputIterator last, const allocator_type& a)
84fbc317d4SMarshall Clow            : map(first, last, Compare(), a) {}  // C++14
85fbc317d4SMarshall Clow    map(initializer_list<value_type> il, const allocator_type& a)
86fbc317d4SMarshall Clow        : map(il, Compare(), a) {}  // C++14
873e519524SHoward Hinnant   ~map();
883e519524SHoward Hinnant
893e519524SHoward Hinnant    map& operator=(const map& m);
901052ee39SHoward Hinnant    map& operator=(map&& m)
911052ee39SHoward Hinnant        noexcept(
921052ee39SHoward Hinnant            allocator_type::propagate_on_container_move_assignment::value &&
931052ee39SHoward Hinnant            is_nothrow_move_assignable<allocator_type>::value &&
940e9f71c1SHoward Hinnant            is_nothrow_move_assignable<key_compare>::value);
953e519524SHoward Hinnant    map& operator=(initializer_list<value_type> il);
963e519524SHoward Hinnant
973e519524SHoward Hinnant    // iterators:
980e9f71c1SHoward Hinnant          iterator begin() noexcept;
990e9f71c1SHoward Hinnant    const_iterator begin() const noexcept;
1000e9f71c1SHoward Hinnant          iterator end() noexcept;
1010e9f71c1SHoward Hinnant    const_iterator end()   const noexcept;
1023e519524SHoward Hinnant
1030e9f71c1SHoward Hinnant          reverse_iterator rbegin() noexcept;
1040e9f71c1SHoward Hinnant    const_reverse_iterator rbegin() const noexcept;
1050e9f71c1SHoward Hinnant          reverse_iterator rend() noexcept;
1060e9f71c1SHoward Hinnant    const_reverse_iterator rend()   const noexcept;
1073e519524SHoward Hinnant
1080e9f71c1SHoward Hinnant    const_iterator         cbegin()  const noexcept;
1090e9f71c1SHoward Hinnant    const_iterator         cend()    const noexcept;
1100e9f71c1SHoward Hinnant    const_reverse_iterator crbegin() const noexcept;
1110e9f71c1SHoward Hinnant    const_reverse_iterator crend()   const noexcept;
1123e519524SHoward Hinnant
1133e519524SHoward Hinnant    // capacity:
1140e9f71c1SHoward Hinnant    bool      empty()    const noexcept;
1150e9f71c1SHoward Hinnant    size_type size()     const noexcept;
1160e9f71c1SHoward Hinnant    size_type max_size() const noexcept;
1173e519524SHoward Hinnant
1183e519524SHoward Hinnant    // element access:
1193e519524SHoward Hinnant    mapped_type& operator[](const key_type& k);
1203e519524SHoward Hinnant    mapped_type& operator[](key_type&& k);
1213e519524SHoward Hinnant
1223e519524SHoward Hinnant          mapped_type& at(const key_type& k);
1233e519524SHoward Hinnant    const mapped_type& at(const key_type& k) const;
1243e519524SHoward Hinnant
1253e519524SHoward Hinnant    // modifiers:
1263e519524SHoward Hinnant    template <class... Args>
1273e519524SHoward Hinnant        pair<iterator, bool> emplace(Args&&... args);
1283e519524SHoward Hinnant    template <class... Args>
1293e519524SHoward Hinnant        iterator emplace_hint(const_iterator position, Args&&... args);
1303e519524SHoward Hinnant    pair<iterator, bool> insert(const value_type& v);
131afc9ff99SMarshall Clow    pair<iterator, bool> insert(      value_type&& v);                                // C++17
1323e519524SHoward Hinnant    template <class P>
1333e519524SHoward Hinnant        pair<iterator, bool> insert(P&& p);
1343e519524SHoward Hinnant    iterator insert(const_iterator position, const value_type& v);
135afc9ff99SMarshall Clow    iterator insert(const_iterator position,       value_type&& v);                   // C++17
1363e519524SHoward Hinnant    template <class P>
1373e519524SHoward Hinnant        iterator insert(const_iterator position, P&& p);
1383e519524SHoward Hinnant    template <class InputIterator>
1393e519524SHoward Hinnant        void insert(InputIterator first, InputIterator last);
1403e519524SHoward Hinnant    void insert(initializer_list<value_type> il);
1413e519524SHoward Hinnant
142b0386a51SErik Pilkington    node_type extract(const_iterator position);                                       // C++17
143b0386a51SErik Pilkington    node_type extract(const key_type& x);                                             // C++17
144b0386a51SErik Pilkington    insert_return_type insert(node_type&& nh);                                        // C++17
145b0386a51SErik Pilkington    iterator insert(const_iterator hint, node_type&& nh);                             // C++17
146b0386a51SErik Pilkington
1478aaf517dSMarshall Clow    template <class... Args>
1488aaf517dSMarshall Clow        pair<iterator, bool> try_emplace(const key_type& k, Args&&... args);          // C++17
1498aaf517dSMarshall Clow    template <class... Args>
1508aaf517dSMarshall Clow        pair<iterator, bool> try_emplace(key_type&& k, Args&&... args);               // C++17
1518aaf517dSMarshall Clow    template <class... Args>
1528aaf517dSMarshall Clow        iterator try_emplace(const_iterator hint, const key_type& k, Args&&... args); // C++17
1538aaf517dSMarshall Clow    template <class... Args>
1548aaf517dSMarshall Clow        iterator try_emplace(const_iterator hint, key_type&& k, Args&&... args);      // C++17
1558aaf517dSMarshall Clow    template <class M>
1568aaf517dSMarshall Clow        pair<iterator, bool> insert_or_assign(const key_type& k, M&& obj);            // C++17
1578aaf517dSMarshall Clow    template <class M>
1588aaf517dSMarshall Clow        pair<iterator, bool> insert_or_assign(key_type&& k, M&& obj);                 // C++17
1598aaf517dSMarshall Clow    template <class M>
1608aaf517dSMarshall Clow        iterator insert_or_assign(const_iterator hint, const key_type& k, M&& obj);   // C++17
1618aaf517dSMarshall Clow    template <class M>
1628aaf517dSMarshall Clow        iterator insert_or_assign(const_iterator hint, key_type&& k, M&& obj);        // C++17
1638aaf517dSMarshall Clow
1643e519524SHoward Hinnant    iterator  erase(const_iterator position);
165ec392968SMarshall Clow    iterator  erase(iterator position); // C++14
1663e519524SHoward Hinnant    size_type erase(const key_type& k);
1673e519524SHoward Hinnant    iterator  erase(const_iterator first, const_iterator last);
1680e9f71c1SHoward Hinnant    void clear() noexcept;
1693e519524SHoward Hinnant
170*5c4e07aeSErik Pilkington    template<class C2>
171*5c4e07aeSErik Pilkington      void merge(map<Key, T, C2, Allocator>& source);         // C++17
172*5c4e07aeSErik Pilkington    template<class C2>
173*5c4e07aeSErik Pilkington      void merge(map<Key, T, C2, Allocator>&& source);        // C++17
174*5c4e07aeSErik Pilkington    template<class C2>
175*5c4e07aeSErik Pilkington      void merge(multimap<Key, T, C2, Allocator>& source);    // C++17
176*5c4e07aeSErik Pilkington    template<class C2>
177*5c4e07aeSErik Pilkington      void merge(multimap<Key, T, C2, Allocator>&& source);   // C++17
178*5c4e07aeSErik Pilkington
1791052ee39SHoward Hinnant    void swap(map& m)
180e3fbe143SMarshall Clow        noexcept(allocator_traits<allocator_type>::is_always_equal::value &&
181f07dd8d0SEric Fiselier            is_nothrow_swappable<key_compare>::value); // C++17
1823e519524SHoward Hinnant
1833e519524SHoward Hinnant    // observers:
1840e9f71c1SHoward Hinnant    allocator_type get_allocator() const noexcept;
1853e519524SHoward Hinnant    key_compare    key_comp()      const;
1863e519524SHoward Hinnant    value_compare  value_comp()    const;
1873e519524SHoward Hinnant
1883e519524SHoward Hinnant    // map operations:
1893e519524SHoward Hinnant          iterator find(const key_type& k);
1903e519524SHoward Hinnant    const_iterator find(const key_type& k) const;
1912585835cSMarshall Clow    template<typename K>
1922585835cSMarshall Clow        iterator find(const K& x);              // C++14
1932585835cSMarshall Clow    template<typename K>
1942585835cSMarshall Clow        const_iterator find(const K& x) const;  // C++14
1952585835cSMarshall Clow    template<typename K>
1960aacbc92SMarshall Clow      size_type count(const K& x) const;        // C++14
1972585835cSMarshall Clow
1983e519524SHoward Hinnant    size_type      count(const key_type& k) const;
1993e519524SHoward Hinnant          iterator lower_bound(const key_type& k);
2003e519524SHoward Hinnant    const_iterator lower_bound(const key_type& k) const;
2012585835cSMarshall Clow    template<typename K>
2022585835cSMarshall Clow        iterator lower_bound(const K& x);              // C++14
2032585835cSMarshall Clow    template<typename K>
2042585835cSMarshall Clow        const_iterator lower_bound(const K& x) const;  // C++14
2052585835cSMarshall Clow
2063e519524SHoward Hinnant          iterator upper_bound(const key_type& k);
2073e519524SHoward Hinnant    const_iterator upper_bound(const key_type& k) const;
2082585835cSMarshall Clow    template<typename K>
2092585835cSMarshall Clow        iterator upper_bound(const K& x);              // C++14
2102585835cSMarshall Clow    template<typename K>
2112585835cSMarshall Clow        const_iterator upper_bound(const K& x) const;  // C++14
2122585835cSMarshall Clow
2133e519524SHoward Hinnant    pair<iterator,iterator>             equal_range(const key_type& k);
2143e519524SHoward Hinnant    pair<const_iterator,const_iterator> equal_range(const key_type& k) const;
2152585835cSMarshall Clow    template<typename K>
2162585835cSMarshall Clow        pair<iterator,iterator>             equal_range(const K& x);        // C++14
2172585835cSMarshall Clow    template<typename K>
2182585835cSMarshall Clow        pair<const_iterator,const_iterator> equal_range(const K& x) const;  // C++14
2193e519524SHoward Hinnant};
2203e519524SHoward Hinnant
2213e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator>
2223e519524SHoward Hinnantbool
2233e519524SHoward Hinnantoperator==(const map<Key, T, Compare, Allocator>& x,
2243e519524SHoward Hinnant           const map<Key, T, Compare, Allocator>& y);
2253e519524SHoward Hinnant
2263e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator>
2273e519524SHoward Hinnantbool
2283e519524SHoward Hinnantoperator< (const map<Key, T, Compare, Allocator>& x,
2293e519524SHoward Hinnant           const map<Key, T, Compare, Allocator>& y);
2303e519524SHoward Hinnant
2313e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator>
2323e519524SHoward Hinnantbool
2333e519524SHoward Hinnantoperator!=(const map<Key, T, Compare, Allocator>& x,
2343e519524SHoward Hinnant           const map<Key, T, Compare, Allocator>& y);
2353e519524SHoward Hinnant
2363e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator>
2373e519524SHoward Hinnantbool
2383e519524SHoward Hinnantoperator> (const map<Key, T, Compare, Allocator>& x,
2393e519524SHoward Hinnant           const map<Key, T, Compare, Allocator>& y);
2403e519524SHoward Hinnant
2413e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator>
2423e519524SHoward Hinnantbool
2433e519524SHoward Hinnantoperator>=(const map<Key, T, Compare, Allocator>& x,
2443e519524SHoward Hinnant           const map<Key, T, Compare, Allocator>& y);
2453e519524SHoward Hinnant
2463e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator>
2473e519524SHoward Hinnantbool
2483e519524SHoward Hinnantoperator<=(const map<Key, T, Compare, Allocator>& x,
2493e519524SHoward Hinnant           const map<Key, T, Compare, Allocator>& y);
2503e519524SHoward Hinnant
2513e519524SHoward Hinnant// specialized algorithms:
2523e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator>
2533e519524SHoward Hinnantvoid
2541052ee39SHoward Hinnantswap(map<Key, T, Compare, Allocator>& x, map<Key, T, Compare, Allocator>& y)
2551052ee39SHoward Hinnant    noexcept(noexcept(x.swap(y)));
2563e519524SHoward Hinnant
2573e519524SHoward Hinnanttemplate <class Key, class T, class Compare = less<Key>,
2583e519524SHoward Hinnant          class Allocator = allocator<pair<const Key, T>>>
2593e519524SHoward Hinnantclass multimap
2603e519524SHoward Hinnant{
2613e519524SHoward Hinnantpublic:
2623e519524SHoward Hinnant    // types:
2633e519524SHoward Hinnant    typedef Key                                      key_type;
2643e519524SHoward Hinnant    typedef T                                        mapped_type;
2653e519524SHoward Hinnant    typedef pair<const key_type,mapped_type>         value_type;
2663e519524SHoward Hinnant    typedef Compare                                  key_compare;
2673e519524SHoward Hinnant    typedef Allocator                                allocator_type;
2683e519524SHoward Hinnant    typedef typename allocator_type::reference       reference;
2693e519524SHoward Hinnant    typedef typename allocator_type::const_reference const_reference;
2703e519524SHoward Hinnant    typedef typename allocator_type::size_type       size_type;
2713e519524SHoward Hinnant    typedef typename allocator_type::difference_type difference_type;
2723e519524SHoward Hinnant    typedef typename allocator_type::pointer         pointer;
2733e519524SHoward Hinnant    typedef typename allocator_type::const_pointer   const_pointer;
2743e519524SHoward Hinnant
2753e519524SHoward Hinnant    typedef implementation-defined                   iterator;
2763e519524SHoward Hinnant    typedef implementation-defined                   const_iterator;
2773e519524SHoward Hinnant    typedef std::reverse_iterator<iterator>          reverse_iterator;
2783e519524SHoward Hinnant    typedef std::reverse_iterator<const_iterator>    const_reverse_iterator;
279b0386a51SErik Pilkington    typedef unspecified                              node_type;              // C++17
2803e519524SHoward Hinnant
2813e519524SHoward Hinnant    class value_compare
2823e519524SHoward Hinnant        : public binary_function<value_type,value_type,bool>
2833e519524SHoward Hinnant    {
2843e519524SHoward Hinnant        friend class multimap;
2853e519524SHoward Hinnant    protected:
2863e519524SHoward Hinnant        key_compare comp;
2873e519524SHoward Hinnant        value_compare(key_compare c);
2883e519524SHoward Hinnant    public:
2893e519524SHoward Hinnant        bool operator()(const value_type& x, const value_type& y) const;
2903e519524SHoward Hinnant    };
2913e519524SHoward Hinnant
2923e519524SHoward Hinnant    // construct/copy/destroy:
2931052ee39SHoward Hinnant    multimap()
2941052ee39SHoward Hinnant        noexcept(
2951052ee39SHoward Hinnant            is_nothrow_default_constructible<allocator_type>::value &&
2961052ee39SHoward Hinnant            is_nothrow_default_constructible<key_compare>::value &&
2971052ee39SHoward Hinnant            is_nothrow_copy_constructible<key_compare>::value);
2981052ee39SHoward Hinnant    explicit multimap(const key_compare& comp);
2993e519524SHoward Hinnant    multimap(const key_compare& comp, const allocator_type& a);
3003e519524SHoward Hinnant    template <class InputIterator>
3013e519524SHoward Hinnant        multimap(InputIterator first, InputIterator last, const key_compare& comp);
3023e519524SHoward Hinnant    template <class InputIterator>
3033e519524SHoward Hinnant        multimap(InputIterator first, InputIterator last, const key_compare& comp,
3043e519524SHoward Hinnant                 const allocator_type& a);
3053e519524SHoward Hinnant    multimap(const multimap& m);
3061052ee39SHoward Hinnant    multimap(multimap&& m)
3071052ee39SHoward Hinnant        noexcept(
3081052ee39SHoward Hinnant            is_nothrow_move_constructible<allocator_type>::value &&
3091052ee39SHoward Hinnant            is_nothrow_move_constructible<key_compare>::value);
3103e519524SHoward Hinnant    explicit multimap(const allocator_type& a);
3113e519524SHoward Hinnant    multimap(const multimap& m, const allocator_type& a);
3123e519524SHoward Hinnant    multimap(multimap&& m, const allocator_type& a);
3133e519524SHoward Hinnant    multimap(initializer_list<value_type> il, const key_compare& comp = key_compare());
3143e519524SHoward Hinnant    multimap(initializer_list<value_type> il, const key_compare& comp,
3153e519524SHoward Hinnant             const allocator_type& a);
316fbc317d4SMarshall Clow    template <class InputIterator>
317fbc317d4SMarshall Clow        multimap(InputIterator first, InputIterator last, const allocator_type& a)
318fbc317d4SMarshall Clow            : multimap(first, last, Compare(), a) {} // C++14
319fbc317d4SMarshall Clow    multimap(initializer_list<value_type> il, const allocator_type& a)
320fbc317d4SMarshall Clow        : multimap(il, Compare(), a) {} // C++14
3213e519524SHoward Hinnant    ~multimap();
3223e519524SHoward Hinnant
3233e519524SHoward Hinnant    multimap& operator=(const multimap& m);
3241052ee39SHoward Hinnant    multimap& operator=(multimap&& m)
3251052ee39SHoward Hinnant        noexcept(
3261052ee39SHoward Hinnant            allocator_type::propagate_on_container_move_assignment::value &&
3271052ee39SHoward Hinnant            is_nothrow_move_assignable<allocator_type>::value &&
3280e9f71c1SHoward Hinnant            is_nothrow_move_assignable<key_compare>::value);
3293e519524SHoward Hinnant    multimap& operator=(initializer_list<value_type> il);
3303e519524SHoward Hinnant
3313e519524SHoward Hinnant    // iterators:
3320e9f71c1SHoward Hinnant          iterator begin() noexcept;
3330e9f71c1SHoward Hinnant    const_iterator begin() const noexcept;
3340e9f71c1SHoward Hinnant          iterator end() noexcept;
3350e9f71c1SHoward Hinnant    const_iterator end()   const noexcept;
3363e519524SHoward Hinnant
3370e9f71c1SHoward Hinnant          reverse_iterator rbegin() noexcept;
3380e9f71c1SHoward Hinnant    const_reverse_iterator rbegin() const noexcept;
3390e9f71c1SHoward Hinnant          reverse_iterator rend() noexcept;
3400e9f71c1SHoward Hinnant    const_reverse_iterator rend()   const noexcept;
3413e519524SHoward Hinnant
3420e9f71c1SHoward Hinnant    const_iterator         cbegin()  const noexcept;
3430e9f71c1SHoward Hinnant    const_iterator         cend()    const noexcept;
3440e9f71c1SHoward Hinnant    const_reverse_iterator crbegin() const noexcept;
3450e9f71c1SHoward Hinnant    const_reverse_iterator crend()   const noexcept;
3463e519524SHoward Hinnant
3473e519524SHoward Hinnant    // capacity:
3480e9f71c1SHoward Hinnant    bool      empty()    const noexcept;
3490e9f71c1SHoward Hinnant    size_type size()     const noexcept;
3500e9f71c1SHoward Hinnant    size_type max_size() const noexcept;
3513e519524SHoward Hinnant
3523e519524SHoward Hinnant    // modifiers:
3533e519524SHoward Hinnant    template <class... Args>
3543e519524SHoward Hinnant        iterator emplace(Args&&... args);
3553e519524SHoward Hinnant    template <class... Args>
3563e519524SHoward Hinnant        iterator emplace_hint(const_iterator position, Args&&... args);
3573e519524SHoward Hinnant    iterator insert(const value_type& v);
358afc9ff99SMarshall Clow    iterator insert(      value_type&& v);                                            // C++17
3593e519524SHoward Hinnant    template <class P>
3603e519524SHoward Hinnant        iterator insert(P&& p);
3613e519524SHoward Hinnant    iterator insert(const_iterator position, const value_type& v);
362afc9ff99SMarshall Clow    iterator insert(const_iterator position,       value_type&& v);                   // C++17
3633e519524SHoward Hinnant    template <class P>
3643e519524SHoward Hinnant        iterator insert(const_iterator position, P&& p);
3653e519524SHoward Hinnant    template <class InputIterator>
3663e519524SHoward Hinnant        void insert(InputIterator first, InputIterator last);
3673e519524SHoward Hinnant    void insert(initializer_list<value_type> il);
3683e519524SHoward Hinnant
369b0386a51SErik Pilkington    node_type extract(const_iterator position);                                       // C++17
370b0386a51SErik Pilkington    node_type extract(const key_type& x);                                             // C++17
371b0386a51SErik Pilkington    iterator insert(node_type&& nh);                                                  // C++17
372b0386a51SErik Pilkington    iterator insert(const_iterator hint, node_type&& nh);                             // C++17
373b0386a51SErik Pilkington
3743e519524SHoward Hinnant    iterator  erase(const_iterator position);
375ec392968SMarshall Clow    iterator  erase(iterator position); // C++14
3763e519524SHoward Hinnant    size_type erase(const key_type& k);
3773e519524SHoward Hinnant    iterator  erase(const_iterator first, const_iterator last);
3780e9f71c1SHoward Hinnant    void clear() noexcept;
3793e519524SHoward Hinnant
380*5c4e07aeSErik Pilkington    template<class C2>
381*5c4e07aeSErik Pilkington      void merge(multimap<Key, T, C2, Allocator>& source);    // C++17
382*5c4e07aeSErik Pilkington    template<class C2>
383*5c4e07aeSErik Pilkington      void merge(multimap<Key, T, C2, Allocator>&& source);   // C++17
384*5c4e07aeSErik Pilkington    template<class C2>
385*5c4e07aeSErik Pilkington      void merge(map<Key, T, C2, Allocator>& source);         // C++17
386*5c4e07aeSErik Pilkington    template<class C2>
387*5c4e07aeSErik Pilkington      void merge(map<Key, T, C2, Allocator>&& source);        // C++17
388*5c4e07aeSErik Pilkington
3891052ee39SHoward Hinnant    void swap(multimap& m)
390e3fbe143SMarshall Clow        noexcept(allocator_traits<allocator_type>::is_always_equal::value &&
391f07dd8d0SEric Fiselier            is_nothrow_swappable<key_compare>::value); // C++17
3923e519524SHoward Hinnant
3933e519524SHoward Hinnant    // observers:
3940e9f71c1SHoward Hinnant    allocator_type get_allocator() const noexcept;
3953e519524SHoward Hinnant    key_compare    key_comp()      const;
3963e519524SHoward Hinnant    value_compare  value_comp()    const;
3973e519524SHoward Hinnant
3983e519524SHoward Hinnant    // map operations:
3993e519524SHoward Hinnant          iterator find(const key_type& k);
4003e519524SHoward Hinnant    const_iterator find(const key_type& k) const;
4012585835cSMarshall Clow    template<typename K>
4022585835cSMarshall Clow        iterator find(const K& x);              // C++14
4032585835cSMarshall Clow    template<typename K>
4042585835cSMarshall Clow        const_iterator find(const K& x) const;  // C++14
4052585835cSMarshall Clow    template<typename K>
4060aacbc92SMarshall Clow      size_type count(const K& x) const;        // C++14
4072585835cSMarshall Clow
4083e519524SHoward Hinnant    size_type      count(const key_type& k) const;
4093e519524SHoward Hinnant          iterator lower_bound(const key_type& k);
4103e519524SHoward Hinnant    const_iterator lower_bound(const key_type& k) const;
4112585835cSMarshall Clow    template<typename K>
4122585835cSMarshall Clow        iterator lower_bound(const K& x);              // C++14
4132585835cSMarshall Clow    template<typename K>
4142585835cSMarshall Clow        const_iterator lower_bound(const K& x) const;  // C++14
4152585835cSMarshall Clow
4163e519524SHoward Hinnant          iterator upper_bound(const key_type& k);
4173e519524SHoward Hinnant    const_iterator upper_bound(const key_type& k) const;
4182585835cSMarshall Clow    template<typename K>
4192585835cSMarshall Clow        iterator upper_bound(const K& x);              // C++14
4202585835cSMarshall Clow    template<typename K>
4212585835cSMarshall Clow        const_iterator upper_bound(const K& x) const;  // C++14
4222585835cSMarshall Clow
4233e519524SHoward Hinnant    pair<iterator,iterator>             equal_range(const key_type& k);
4243e519524SHoward Hinnant    pair<const_iterator,const_iterator> equal_range(const key_type& k) const;
4252585835cSMarshall Clow    template<typename K>
4262585835cSMarshall Clow        pair<iterator,iterator>             equal_range(const K& x);        // C++14
4272585835cSMarshall Clow    template<typename K>
4282585835cSMarshall Clow        pair<const_iterator,const_iterator> equal_range(const K& x) const;  // C++14
4293e519524SHoward Hinnant};
4303e519524SHoward Hinnant
4313e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator>
4323e519524SHoward Hinnantbool
4333e519524SHoward Hinnantoperator==(const multimap<Key, T, Compare, Allocator>& x,
4343e519524SHoward Hinnant           const multimap<Key, T, Compare, Allocator>& y);
4353e519524SHoward Hinnant
4363e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator>
4373e519524SHoward Hinnantbool
4383e519524SHoward Hinnantoperator< (const multimap<Key, T, Compare, Allocator>& x,
4393e519524SHoward Hinnant           const multimap<Key, T, Compare, Allocator>& y);
4403e519524SHoward Hinnant
4413e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator>
4423e519524SHoward Hinnantbool
4433e519524SHoward Hinnantoperator!=(const multimap<Key, T, Compare, Allocator>& x,
4443e519524SHoward Hinnant           const multimap<Key, T, Compare, Allocator>& y);
4453e519524SHoward Hinnant
4463e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator>
4473e519524SHoward Hinnantbool
4483e519524SHoward Hinnantoperator> (const multimap<Key, T, Compare, Allocator>& x,
4493e519524SHoward Hinnant           const multimap<Key, T, Compare, Allocator>& y);
4503e519524SHoward Hinnant
4513e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator>
4523e519524SHoward Hinnantbool
4533e519524SHoward Hinnantoperator>=(const multimap<Key, T, Compare, Allocator>& x,
4543e519524SHoward Hinnant           const multimap<Key, T, Compare, Allocator>& y);
4553e519524SHoward Hinnant
4563e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator>
4573e519524SHoward Hinnantbool
4583e519524SHoward Hinnantoperator<=(const multimap<Key, T, Compare, Allocator>& x,
4593e519524SHoward Hinnant           const multimap<Key, T, Compare, Allocator>& y);
4603e519524SHoward Hinnant
4613e519524SHoward Hinnant// specialized algorithms:
4623e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator>
4633e519524SHoward Hinnantvoid
4643e519524SHoward Hinnantswap(multimap<Key, T, Compare, Allocator>& x,
4651052ee39SHoward Hinnant     multimap<Key, T, Compare, Allocator>& y)
4661052ee39SHoward Hinnant    noexcept(noexcept(x.swap(y)));
4673e519524SHoward Hinnant
4683e519524SHoward Hinnant}  // std
4693e519524SHoward Hinnant
4703e519524SHoward Hinnant*/
4713e519524SHoward Hinnant
4723e519524SHoward Hinnant#include <__config>
4733e519524SHoward Hinnant#include <__tree>
474b0386a51SErik Pilkington#include <__node_handle>
4753e519524SHoward Hinnant#include <iterator>
4763e519524SHoward Hinnant#include <memory>
4773e519524SHoward Hinnant#include <utility>
4783e519524SHoward Hinnant#include <functional>
4793e519524SHoward Hinnant#include <initializer_list>
480ee187e24SEric Fiselier#include <type_traits>
481f56972e2SMarshall Clow#include <version>
4823e519524SHoward Hinnant
483073458b1SHoward Hinnant#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
4843e519524SHoward Hinnant#pragma GCC system_header
485073458b1SHoward Hinnant#endif
4863e519524SHoward Hinnant
4873e519524SHoward Hinnant_LIBCPP_BEGIN_NAMESPACE_STD
4883e519524SHoward Hinnant
489b1e7a12eSEric Fiseliertemplate <class _Key, class _CP, class _Compare, bool _IsSmall>
4903e519524SHoward Hinnantclass __map_value_compare
4913e519524SHoward Hinnant    : private _Compare
4923e519524SHoward Hinnant{
4933e519524SHoward Hinnantpublic:
494848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
4951052ee39SHoward Hinnant    __map_value_compare()
4961052ee39SHoward Hinnant        _NOEXCEPT_(is_nothrow_default_constructible<_Compare>::value)
4971052ee39SHoward Hinnant        : _Compare() {}
498848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
4991052ee39SHoward Hinnant    __map_value_compare(_Compare c)
5001052ee39SHoward Hinnant        _NOEXCEPT_(is_nothrow_copy_constructible<_Compare>::value)
5011052ee39SHoward Hinnant        : _Compare(c) {}
502848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
5031052ee39SHoward Hinnant    const _Compare& key_comp() const _NOEXCEPT {return *this;}
504848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
5053e519524SHoward Hinnant    bool operator()(const _CP& __x, const _CP& __y) const
506f52318b4SErik Pilkington        {return static_cast<const _Compare&>(*this)(__x.__get_value().first, __y.__get_value().first);}
507848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
5083e519524SHoward Hinnant    bool operator()(const _CP& __x, const _Key& __y) const
509f52318b4SErik Pilkington        {return static_cast<const _Compare&>(*this)(__x.__get_value().first, __y);}
510848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
5113e519524SHoward Hinnant    bool operator()(const _Key& __x, const _CP& __y) const
512f52318b4SErik Pilkington        {return static_cast<const _Compare&>(*this)(__x, __y.__get_value().first);}
513e3fbe143SMarshall Clow    void swap(__map_value_compare&__y)
514e3fbe143SMarshall Clow        _NOEXCEPT_(__is_nothrow_swappable<_Compare>::value)
515e3fbe143SMarshall Clow    {
516e3fbe143SMarshall Clow      using _VSTD::swap;
517e1ec2986SEric Fiselier      swap(static_cast<_Compare&>(*this), static_cast<_Compare&>(__y));
518e3fbe143SMarshall Clow    }
5192585835cSMarshall Clow
5202585835cSMarshall Clow#if _LIBCPP_STD_VER > 11
5212585835cSMarshall Clow    template <typename _K2>
5222585835cSMarshall Clow    _LIBCPP_INLINE_VISIBILITY
5232585835cSMarshall Clow    typename enable_if<__is_transparent<_Compare, _K2>::value, bool>::type
5242585835cSMarshall Clow    operator () ( const _K2& __x, const _CP& __y ) const
525f52318b4SErik Pilkington        {return static_cast<const _Compare&>(*this) (__x, __y.__get_value().first);}
5262585835cSMarshall Clow
5272585835cSMarshall Clow    template <typename _K2>
5282585835cSMarshall Clow    _LIBCPP_INLINE_VISIBILITY
5292585835cSMarshall Clow    typename enable_if<__is_transparent<_Compare, _K2>::value, bool>::type
5302585835cSMarshall Clow    operator () (const _CP& __x, const _K2& __y) const
531f52318b4SErik Pilkington        {return static_cast<const _Compare&>(*this) (__x.__get_value().first, __y);}
5322585835cSMarshall Clow#endif
5333e519524SHoward Hinnant};
5343e519524SHoward Hinnant
535abb160e6SHoward Hinnanttemplate <class _Key, class _CP, class _Compare>
536abb160e6SHoward Hinnantclass __map_value_compare<_Key, _CP, _Compare, false>
5373e519524SHoward Hinnant{
5383e519524SHoward Hinnant    _Compare comp;
5393e519524SHoward Hinnant
5403e519524SHoward Hinnantpublic:
541848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
5421052ee39SHoward Hinnant    __map_value_compare()
5431052ee39SHoward Hinnant        _NOEXCEPT_(is_nothrow_default_constructible<_Compare>::value)
5441052ee39SHoward Hinnant        : comp() {}
545848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
5461052ee39SHoward Hinnant    __map_value_compare(_Compare c)
5471052ee39SHoward Hinnant        _NOEXCEPT_(is_nothrow_copy_constructible<_Compare>::value)
5481052ee39SHoward Hinnant        : comp(c) {}
549848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
5501052ee39SHoward Hinnant    const _Compare& key_comp() const _NOEXCEPT {return comp;}
5513e519524SHoward Hinnant
552848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
5533e519524SHoward Hinnant    bool operator()(const _CP& __x, const _CP& __y) const
554f52318b4SErik Pilkington        {return comp(__x.__get_value().first, __y.__get_value().first);}
555848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
5563e519524SHoward Hinnant    bool operator()(const _CP& __x, const _Key& __y) const
557f52318b4SErik Pilkington        {return comp(__x.__get_value().first, __y);}
558848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
5593e519524SHoward Hinnant    bool operator()(const _Key& __x, const _CP& __y) const
560f52318b4SErik Pilkington        {return comp(__x, __y.__get_value().first);}
561e3fbe143SMarshall Clow    void swap(__map_value_compare&__y)
562e3fbe143SMarshall Clow        _NOEXCEPT_(__is_nothrow_swappable<_Compare>::value)
563e3fbe143SMarshall Clow    {
564e3fbe143SMarshall Clow        using _VSTD::swap;
565e3fbe143SMarshall Clow        swap(comp, __y.comp);
566e3fbe143SMarshall Clow    }
5672585835cSMarshall Clow
5682585835cSMarshall Clow#if _LIBCPP_STD_VER > 11
5692585835cSMarshall Clow    template <typename _K2>
5702585835cSMarshall Clow    _LIBCPP_INLINE_VISIBILITY
5712585835cSMarshall Clow    typename enable_if<__is_transparent<_Compare, _K2>::value, bool>::type
5722585835cSMarshall Clow    operator () ( const _K2& __x, const _CP& __y ) const
573f52318b4SErik Pilkington        {return comp (__x, __y.__get_value().first);}
5742585835cSMarshall Clow
5752585835cSMarshall Clow    template <typename _K2>
5762585835cSMarshall Clow    _LIBCPP_INLINE_VISIBILITY
5772585835cSMarshall Clow    typename enable_if<__is_transparent<_Compare, _K2>::value, bool>::type
5782585835cSMarshall Clow    operator () (const _CP& __x, const _K2& __y) const
579f52318b4SErik Pilkington        {return comp (__x.__get_value().first, __y);}
5802585835cSMarshall Clow#endif
5813e519524SHoward Hinnant};
5823e519524SHoward Hinnant
583e3fbe143SMarshall Clowtemplate <class _Key, class _CP, class _Compare, bool __b>
584e3fbe143SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY
585e3fbe143SMarshall Clowvoid
586e3fbe143SMarshall Clowswap(__map_value_compare<_Key, _CP, _Compare, __b>& __x,
587e3fbe143SMarshall Clow     __map_value_compare<_Key, _CP, _Compare, __b>& __y)
588e3fbe143SMarshall Clow    _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
589e3fbe143SMarshall Clow{
590e3fbe143SMarshall Clow    __x.swap(__y);
591e3fbe143SMarshall Clow}
592e3fbe143SMarshall Clow
5933e519524SHoward Hinnanttemplate <class _Allocator>
5943e519524SHoward Hinnantclass __map_node_destructor
5953e519524SHoward Hinnant{
5963e519524SHoward Hinnant    typedef _Allocator                          allocator_type;
5973e519524SHoward Hinnant    typedef allocator_traits<allocator_type>    __alloc_traits;
598089a7cc5SEric Fiselier
5993e519524SHoward Hinnantpublic:
6003e519524SHoward Hinnant    typedef typename __alloc_traits::pointer    pointer;
6013e519524SHoward Hinnant
602089a7cc5SEric Fiselierprivate:
6033e519524SHoward Hinnant    allocator_type& __na_;
6043e519524SHoward Hinnant
6053e519524SHoward Hinnant    __map_node_destructor& operator=(const __map_node_destructor&);
6063e519524SHoward Hinnant
6073e519524SHoward Hinnantpublic:
6083e519524SHoward Hinnant    bool __first_constructed;
6093e519524SHoward Hinnant    bool __second_constructed;
6103e519524SHoward Hinnant
611848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
6121052ee39SHoward Hinnant    explicit __map_node_destructor(allocator_type& __na) _NOEXCEPT
6133e519524SHoward Hinnant        : __na_(__na),
6143e519524SHoward Hinnant          __first_constructed(false),
6153e519524SHoward Hinnant          __second_constructed(false)
6163e519524SHoward Hinnant        {}
6173e519524SHoward Hinnant
61818293116SEric Fiselier#ifndef _LIBCPP_CXX03_LANG
619848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
6201052ee39SHoward Hinnant    __map_node_destructor(__tree_node_destructor<allocator_type>&& __x) _NOEXCEPT
6213e519524SHoward Hinnant        : __na_(__x.__na_),
6223e519524SHoward Hinnant          __first_constructed(__x.__value_constructed),
6233e519524SHoward Hinnant          __second_constructed(__x.__value_constructed)
6243e519524SHoward Hinnant        {
6253e519524SHoward Hinnant            __x.__value_constructed = false;
6263e519524SHoward Hinnant        }
62718293116SEric Fiselier#endif  // _LIBCPP_CXX03_LANG
6283e519524SHoward Hinnant
629848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
6301052ee39SHoward Hinnant    void operator()(pointer __p) _NOEXCEPT
6313e519524SHoward Hinnant    {
6323e519524SHoward Hinnant        if (__second_constructed)
633f52318b4SErik Pilkington            __alloc_traits::destroy(__na_, _VSTD::addressof(__p->__value_.__get_value().second));
6343e519524SHoward Hinnant        if (__first_constructed)
635f52318b4SErik Pilkington            __alloc_traits::destroy(__na_, _VSTD::addressof(__p->__value_.__get_value().first));
6363e519524SHoward Hinnant        if (__p)
6373e519524SHoward Hinnant            __alloc_traits::deallocate(__na_, __p, 1);
6383e519524SHoward Hinnant    }
6393e519524SHoward Hinnant};
6403e519524SHoward Hinnant
641ce53420eSHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator>
642ce53420eSHoward Hinnant    class map;
643ce53420eSHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator>
644ce53420eSHoward Hinnant    class multimap;
645ce53420eSHoward Hinnanttemplate <class _TreeIterator> class __map_const_iterator;
6463e519524SHoward Hinnant
647089a7cc5SEric Fiselier#ifndef _LIBCPP_CXX03_LANG
6489fd9f84fSHoward Hinnant
6499fd9f84fSHoward Hinnanttemplate <class _Key, class _Tp>
650f52318b4SErik Pilkingtonstruct __value_type
6519fd9f84fSHoward Hinnant{
6529fd9f84fSHoward Hinnant    typedef _Key                                     key_type;
6539fd9f84fSHoward Hinnant    typedef _Tp                                      mapped_type;
6549fd9f84fSHoward Hinnant    typedef pair<const key_type, mapped_type>        value_type;
655f52318b4SErik Pilkington    typedef pair<key_type&, mapped_type&>            __nc_ref_pair_type;
656f52318b4SErik Pilkington    typedef pair<key_type&&, mapped_type&&>          __nc_rref_pair_type;
6579fd9f84fSHoward Hinnant
658f52318b4SErik Pilkingtonprivate:
6599fd9f84fSHoward Hinnant    value_type __cc;
660f52318b4SErik Pilkington
661f52318b4SErik Pilkingtonpublic:
662f52318b4SErik Pilkington    _LIBCPP_INLINE_VISIBILITY
663f52318b4SErik Pilkington    value_type& __get_value()
664f52318b4SErik Pilkington    {
665f52318b4SErik Pilkington#if _LIBCPP_STD_VER > 14
666f52318b4SErik Pilkington        return *_VSTD::launder(_VSTD::addressof(__cc));
667f52318b4SErik Pilkington#else
668f52318b4SErik Pilkington        return __cc;
669f52318b4SErik Pilkington#endif
670f52318b4SErik Pilkington    }
671f52318b4SErik Pilkington
672f52318b4SErik Pilkington    _LIBCPP_INLINE_VISIBILITY
673f52318b4SErik Pilkington    const value_type& __get_value() const
674f52318b4SErik Pilkington    {
675f52318b4SErik Pilkington#if _LIBCPP_STD_VER > 14
676f52318b4SErik Pilkington        return *_VSTD::launder(_VSTD::addressof(__cc));
677f52318b4SErik Pilkington#else
678f52318b4SErik Pilkington        return __cc;
679f52318b4SErik Pilkington#endif
680f52318b4SErik Pilkington    }
681f52318b4SErik Pilkington
682f52318b4SErik Pilkington    _LIBCPP_INLINE_VISIBILITY
683f52318b4SErik Pilkington    __nc_ref_pair_type __ref()
684f52318b4SErik Pilkington    {
685f52318b4SErik Pilkington        value_type& __v = __get_value();
686f52318b4SErik Pilkington        return __nc_ref_pair_type(const_cast<key_type&>(__v.first), __v.second);
687f52318b4SErik Pilkington    }
688f52318b4SErik Pilkington
689f52318b4SErik Pilkington    _LIBCPP_INLINE_VISIBILITY
690f52318b4SErik Pilkington    __nc_rref_pair_type __move()
691f52318b4SErik Pilkington    {
692f52318b4SErik Pilkington        value_type& __v = __get_value();
693f52318b4SErik Pilkington        return __nc_rref_pair_type(
694f52318b4SErik Pilkington            _VSTD::move(const_cast<key_type&>(__v.first)),
695f52318b4SErik Pilkington            _VSTD::move(__v.second));
696f52318b4SErik Pilkington    }
6979fd9f84fSHoward Hinnant
6989fd9f84fSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
6999fd9f84fSHoward Hinnant    __value_type& operator=(const __value_type& __v)
700f52318b4SErik Pilkington    {
701f52318b4SErik Pilkington        __ref() = __v.__get_value();
702f52318b4SErik Pilkington        return *this;
703f52318b4SErik Pilkington    }
7049fd9f84fSHoward Hinnant
7059fd9f84fSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
7069fd9f84fSHoward Hinnant    __value_type& operator=(__value_type&& __v)
707f52318b4SErik Pilkington    {
708f52318b4SErik Pilkington        __ref() = __v.__move();
709f52318b4SErik Pilkington        return *this;
710f52318b4SErik Pilkington    }
7119fd9f84fSHoward Hinnant
7125e3ea4ddSEric Fiselier    template <class _ValueTp,
7135e3ea4ddSEric Fiselier              class = typename enable_if<
7145e3ea4ddSEric Fiselier                    __is_same_uncvref<_ValueTp, value_type>::value
7155e3ea4ddSEric Fiselier                 >::type
7165e3ea4ddSEric Fiselier             >
7179fd9f84fSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
718f52318b4SErik Pilkington    __value_type& operator=(_ValueTp&& __v)
719f52318b4SErik Pilkington    {
720f52318b4SErik Pilkington        __ref() = _VSTD::forward<_ValueTp>(__v);
721f52318b4SErik Pilkington        return *this;
7225e3ea4ddSEric Fiselier    }
7235e3ea4ddSEric Fiselier
7245e3ea4ddSEric Fiselierprivate:
7255e3ea4ddSEric Fiselier    __value_type() _LIBCPP_EQUAL_DELETE;
7265e3ea4ddSEric Fiselier    ~__value_type() _LIBCPP_EQUAL_DELETE;
7275e3ea4ddSEric Fiselier    __value_type(const __value_type& __v) _LIBCPP_EQUAL_DELETE;
7285e3ea4ddSEric Fiselier    __value_type(__value_type&& __v) _LIBCPP_EQUAL_DELETE;
7299fd9f84fSHoward Hinnant};
7309fd9f84fSHoward Hinnant
7319fd9f84fSHoward Hinnant#else
7329fd9f84fSHoward Hinnant
7339fd9f84fSHoward Hinnanttemplate <class _Key, class _Tp>
7349fd9f84fSHoward Hinnantstruct __value_type
7359fd9f84fSHoward Hinnant{
7369fd9f84fSHoward Hinnant    typedef _Key                                     key_type;
7379fd9f84fSHoward Hinnant    typedef _Tp                                      mapped_type;
7389fd9f84fSHoward Hinnant    typedef pair<const key_type, mapped_type>        value_type;
7399fd9f84fSHoward Hinnant
740f52318b4SErik Pilkingtonprivate:
7419fd9f84fSHoward Hinnant    value_type __cc;
7429fd9f84fSHoward Hinnant
743f52318b4SErik Pilkingtonpublic:
744f52318b4SErik Pilkington    _LIBCPP_INLINE_VISIBILITY
745f52318b4SErik Pilkington    value_type& __get_value() { return __cc; }
746f52318b4SErik Pilkington    _LIBCPP_INLINE_VISIBILITY
747f52318b4SErik Pilkington    const value_type& __get_value() const { return __cc; }
748f52318b4SErik Pilkington
7495e3ea4ddSEric Fiselierprivate:
7505e3ea4ddSEric Fiselier   __value_type();
7515e3ea4ddSEric Fiselier   __value_type(__value_type const&);
7525e3ea4ddSEric Fiselier   __value_type& operator=(__value_type const&);
7535e3ea4ddSEric Fiselier   ~__value_type();
7549fd9f84fSHoward Hinnant};
7559fd9f84fSHoward Hinnant
75618293116SEric Fiselier#endif // _LIBCPP_CXX03_LANG
7579fd9f84fSHoward Hinnant
758b3be398cSEric Fiseliertemplate <class _Tp>
759b3be398cSEric Fiselierstruct __extract_key_value_types;
760b3be398cSEric Fiselier
761b3be398cSEric Fiseliertemplate <class _Key, class _Tp>
762b3be398cSEric Fiselierstruct __extract_key_value_types<__value_type<_Key, _Tp> >
763b3be398cSEric Fiselier{
764b3be398cSEric Fiselier  typedef _Key const __key_type;
765b3be398cSEric Fiselier  typedef _Tp        __mapped_type;
766b3be398cSEric Fiselier};
767b3be398cSEric Fiselier
7683e519524SHoward Hinnanttemplate <class _TreeIterator>
769e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS __map_iterator
7703e519524SHoward Hinnant{
771089a7cc5SEric Fiselier    typedef typename _TreeIterator::_NodeTypes                   _NodeTypes;
772089a7cc5SEric Fiselier    typedef typename _TreeIterator::__pointer_traits             __pointer_traits;
773089a7cc5SEric Fiselier
7743e519524SHoward Hinnant    _TreeIterator __i_;
7753e519524SHoward Hinnant
7763e519524SHoward Hinnantpublic:
7773e519524SHoward Hinnant    typedef bidirectional_iterator_tag                           iterator_category;
778089a7cc5SEric Fiselier    typedef typename _NodeTypes::__map_value_type                value_type;
7793e519524SHoward Hinnant    typedef typename _TreeIterator::difference_type              difference_type;
7803e519524SHoward Hinnant    typedef value_type&                                          reference;
781089a7cc5SEric Fiselier    typedef typename _NodeTypes::__map_value_type_pointer        pointer;
7823e519524SHoward Hinnant
783848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
7841052ee39SHoward Hinnant    __map_iterator() _NOEXCEPT {}
7853e519524SHoward Hinnant
786848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
7871052ee39SHoward Hinnant    __map_iterator(_TreeIterator __i) _NOEXCEPT : __i_(__i) {}
7883e519524SHoward Hinnant
789848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
790f52318b4SErik Pilkington    reference operator*() const {return __i_->__get_value();}
791848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
792f52318b4SErik Pilkington    pointer operator->() const {return pointer_traits<pointer>::pointer_to(__i_->__get_value());}
7933e519524SHoward Hinnant
794848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
7953e519524SHoward Hinnant    __map_iterator& operator++() {++__i_; return *this;}
796848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
7973e519524SHoward Hinnant    __map_iterator operator++(int)
7983e519524SHoward Hinnant    {
7993e519524SHoward Hinnant        __map_iterator __t(*this);
8003e519524SHoward Hinnant        ++(*this);
8013e519524SHoward Hinnant        return __t;
8023e519524SHoward Hinnant    }
8033e519524SHoward Hinnant
804848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
8053e519524SHoward Hinnant    __map_iterator& operator--() {--__i_; return *this;}
806848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
8073e519524SHoward Hinnant    __map_iterator operator--(int)
8083e519524SHoward Hinnant    {
8093e519524SHoward Hinnant        __map_iterator __t(*this);
8103e519524SHoward Hinnant        --(*this);
8113e519524SHoward Hinnant        return __t;
8123e519524SHoward Hinnant    }
8133e519524SHoward Hinnant
814848a5374SHoward Hinnant    friend _LIBCPP_INLINE_VISIBILITY
815848a5374SHoward Hinnant    bool operator==(const __map_iterator& __x, const __map_iterator& __y)
8163e519524SHoward Hinnant        {return __x.__i_ == __y.__i_;}
817848a5374SHoward Hinnant    friend
818848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
819848a5374SHoward Hinnant    bool operator!=(const __map_iterator& __x, const __map_iterator& __y)
8203e519524SHoward Hinnant        {return __x.__i_ != __y.__i_;}
8213e519524SHoward Hinnant
822e2f2d1edSEric Fiselier    template <class, class, class, class> friend class _LIBCPP_TEMPLATE_VIS map;
823e2f2d1edSEric Fiselier    template <class, class, class, class> friend class _LIBCPP_TEMPLATE_VIS multimap;
824e2f2d1edSEric Fiselier    template <class> friend class _LIBCPP_TEMPLATE_VIS __map_const_iterator;
8253e519524SHoward Hinnant};
8263e519524SHoward Hinnant
8273e519524SHoward Hinnanttemplate <class _TreeIterator>
828e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS __map_const_iterator
8293e519524SHoward Hinnant{
830089a7cc5SEric Fiselier    typedef typename _TreeIterator::_NodeTypes                   _NodeTypes;
831089a7cc5SEric Fiselier    typedef typename _TreeIterator::__pointer_traits             __pointer_traits;
832089a7cc5SEric Fiselier
8333e519524SHoward Hinnant    _TreeIterator __i_;
8343e519524SHoward Hinnant
8353e519524SHoward Hinnantpublic:
8363e519524SHoward Hinnant    typedef bidirectional_iterator_tag                           iterator_category;
837089a7cc5SEric Fiselier    typedef typename _NodeTypes::__map_value_type                value_type;
8383e519524SHoward Hinnant    typedef typename _TreeIterator::difference_type              difference_type;
8393e519524SHoward Hinnant    typedef const value_type&                                    reference;
840089a7cc5SEric Fiselier    typedef typename _NodeTypes::__const_map_value_type_pointer  pointer;
8413e519524SHoward Hinnant
842848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
8431052ee39SHoward Hinnant    __map_const_iterator() _NOEXCEPT {}
8443e519524SHoward Hinnant
845848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
8461052ee39SHoward Hinnant    __map_const_iterator(_TreeIterator __i) _NOEXCEPT : __i_(__i) {}
847848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
848b3be398cSEric Fiselier    __map_const_iterator(__map_iterator<
849b3be398cSEric Fiselier        typename _TreeIterator::__non_const_iterator> __i) _NOEXCEPT
8503e519524SHoward Hinnant        : __i_(__i.__i_) {}
8513e519524SHoward Hinnant
852848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
853f52318b4SErik Pilkington    reference operator*() const {return __i_->__get_value();}
854848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
855f52318b4SErik Pilkington    pointer operator->() const {return pointer_traits<pointer>::pointer_to(__i_->__get_value());}
8563e519524SHoward Hinnant
857848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
8583e519524SHoward Hinnant    __map_const_iterator& operator++() {++__i_; return *this;}
859848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
8603e519524SHoward Hinnant    __map_const_iterator operator++(int)
8613e519524SHoward Hinnant    {
8623e519524SHoward Hinnant        __map_const_iterator __t(*this);
8633e519524SHoward Hinnant        ++(*this);
8643e519524SHoward Hinnant        return __t;
8653e519524SHoward Hinnant    }
8663e519524SHoward Hinnant
867848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
8683e519524SHoward Hinnant    __map_const_iterator& operator--() {--__i_; return *this;}
869848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
8703e519524SHoward Hinnant    __map_const_iterator operator--(int)
8713e519524SHoward Hinnant    {
8723e519524SHoward Hinnant        __map_const_iterator __t(*this);
8733e519524SHoward Hinnant        --(*this);
8743e519524SHoward Hinnant        return __t;
8753e519524SHoward Hinnant    }
8763e519524SHoward Hinnant
877848a5374SHoward Hinnant    friend _LIBCPP_INLINE_VISIBILITY
878848a5374SHoward Hinnant    bool operator==(const __map_const_iterator& __x, const __map_const_iterator& __y)
8793e519524SHoward Hinnant        {return __x.__i_ == __y.__i_;}
880848a5374SHoward Hinnant    friend _LIBCPP_INLINE_VISIBILITY
881848a5374SHoward Hinnant    bool operator!=(const __map_const_iterator& __x, const __map_const_iterator& __y)
8823e519524SHoward Hinnant        {return __x.__i_ != __y.__i_;}
8833e519524SHoward Hinnant
884e2f2d1edSEric Fiselier    template <class, class, class, class> friend class _LIBCPP_TEMPLATE_VIS map;
885e2f2d1edSEric Fiselier    template <class, class, class, class> friend class _LIBCPP_TEMPLATE_VIS multimap;
886e2f2d1edSEric Fiselier    template <class, class, class> friend class _LIBCPP_TEMPLATE_VIS __tree_const_iterator;
8873e519524SHoward Hinnant};
8883e519524SHoward Hinnant
8893e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare = less<_Key>,
8903e519524SHoward Hinnant          class _Allocator = allocator<pair<const _Key, _Tp> > >
891e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS map
8923e519524SHoward Hinnant{
8933e519524SHoward Hinnantpublic:
8943e519524SHoward Hinnant    // types:
8953e519524SHoward Hinnant    typedef _Key                                     key_type;
8963e519524SHoward Hinnant    typedef _Tp                                      mapped_type;
8973e519524SHoward Hinnant    typedef pair<const key_type, mapped_type>        value_type;
8983e519524SHoward Hinnant    typedef _Compare                                 key_compare;
8993e519524SHoward Hinnant    typedef _Allocator                               allocator_type;
9003e519524SHoward Hinnant    typedef value_type&                              reference;
9013e519524SHoward Hinnant    typedef const value_type&                        const_reference;
9023e519524SHoward Hinnant
90394f89aeeSMarshall Clow    static_assert((is_same<typename allocator_type::value_type, value_type>::value),
90494f89aeeSMarshall Clow                  "Allocator::value_type must be same type as value_type");
90594f89aeeSMarshall Clow
906e2f2d1edSEric Fiselier    class _LIBCPP_TEMPLATE_VIS value_compare
9073e519524SHoward Hinnant        : public binary_function<value_type, value_type, bool>
9083e519524SHoward Hinnant    {
9093e519524SHoward Hinnant        friend class map;
9103e519524SHoward Hinnant    protected:
9113e519524SHoward Hinnant        key_compare comp;
9123e519524SHoward Hinnant
913848a5374SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY value_compare(key_compare c) : comp(c) {}
9143e519524SHoward Hinnant    public:
915848a5374SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
9163e519524SHoward Hinnant        bool operator()(const value_type& __x, const value_type& __y) const
9173e519524SHoward Hinnant            {return comp(__x.first, __y.first);}
9183e519524SHoward Hinnant    };
9193e519524SHoward Hinnant
9203e519524SHoward Hinnantprivate:
92107d3eccdSHoward Hinnant
9229fd9f84fSHoward Hinnant    typedef _VSTD::__value_type<key_type, mapped_type>             __value_type;
923abb160e6SHoward Hinnant    typedef __map_value_compare<key_type, __value_type, key_compare> __vc;
9241f508014SMarshall Clow    typedef typename __rebind_alloc_helper<allocator_traits<allocator_type>,
9251f508014SMarshall Clow                                                 __value_type>::type __allocator_type;
9263e519524SHoward Hinnant    typedef __tree<__value_type, __vc, __allocator_type>   __base;
9273e519524SHoward Hinnant    typedef typename __base::__node_traits                 __node_traits;
9283e519524SHoward Hinnant    typedef allocator_traits<allocator_type>               __alloc_traits;
9293e519524SHoward Hinnant
9303e519524SHoward Hinnant    __base __tree_;
9313e519524SHoward Hinnant
9323e519524SHoward Hinnantpublic:
9333e519524SHoward Hinnant    typedef typename __alloc_traits::pointer               pointer;
9343e519524SHoward Hinnant    typedef typename __alloc_traits::const_pointer         const_pointer;
9353e519524SHoward Hinnant    typedef typename __alloc_traits::size_type             size_type;
9363e519524SHoward Hinnant    typedef typename __alloc_traits::difference_type       difference_type;
9373e519524SHoward Hinnant    typedef __map_iterator<typename __base::iterator>             iterator;
9383e519524SHoward Hinnant    typedef __map_const_iterator<typename __base::const_iterator> const_iterator;
939ce48a113SHoward Hinnant    typedef _VSTD::reverse_iterator<iterator>               reverse_iterator;
940ce48a113SHoward Hinnant    typedef _VSTD::reverse_iterator<const_iterator>         const_reverse_iterator;
9413e519524SHoward Hinnant
942b0386a51SErik Pilkington#if _LIBCPP_STD_VER > 14
943b0386a51SErik Pilkington    typedef __map_node_handle<typename __base::__node, allocator_type> node_type;
944b0386a51SErik Pilkington    typedef __insert_return_type<iterator, node_type> insert_return_type;
945b0386a51SErik Pilkington#endif
946b0386a51SErik Pilkington
947*5c4e07aeSErik Pilkington    template <class _Key2, class _Value2, class _Comp2, class _Alloc2>
948*5c4e07aeSErik Pilkington        friend class _LIBCPP_TEMPLATE_VIS map;
949*5c4e07aeSErik Pilkington    template <class _Key2, class _Value2, class _Comp2, class _Alloc2>
950*5c4e07aeSErik Pilkington        friend class _LIBCPP_TEMPLATE_VIS multimap;
951*5c4e07aeSErik Pilkington
952848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
953415a24e4SMarshall Clow    map()
954415a24e4SMarshall Clow        _NOEXCEPT_(
955415a24e4SMarshall Clow            is_nothrow_default_constructible<allocator_type>::value &&
956415a24e4SMarshall Clow            is_nothrow_default_constructible<key_compare>::value &&
957415a24e4SMarshall Clow            is_nothrow_copy_constructible<key_compare>::value)
958415a24e4SMarshall Clow        : __tree_(__vc(key_compare())) {}
959415a24e4SMarshall Clow
960415a24e4SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
961415a24e4SMarshall Clow    explicit map(const key_compare& __comp)
9621052ee39SHoward Hinnant        _NOEXCEPT_(
9631052ee39SHoward Hinnant            is_nothrow_default_constructible<allocator_type>::value &&
9641052ee39SHoward Hinnant            is_nothrow_copy_constructible<key_compare>::value)
9653e519524SHoward Hinnant        : __tree_(__vc(__comp)) {}
9663e519524SHoward Hinnant
967848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
9683e519524SHoward Hinnant    explicit map(const key_compare& __comp, const allocator_type& __a)
9692a10c960SMarshall Clow        : __tree_(__vc(__comp), typename __base::allocator_type(__a)) {}
9703e519524SHoward Hinnant
9713e519524SHoward Hinnant    template <class _InputIterator>
972848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
9733e519524SHoward Hinnant        map(_InputIterator __f, _InputIterator __l,
9743e519524SHoward Hinnant            const key_compare& __comp = key_compare())
9753e519524SHoward Hinnant        : __tree_(__vc(__comp))
9763e519524SHoward Hinnant        {
9773e519524SHoward Hinnant            insert(__f, __l);
9783e519524SHoward Hinnant        }
9793e519524SHoward Hinnant
9803e519524SHoward Hinnant    template <class _InputIterator>
981848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
9823e519524SHoward Hinnant        map(_InputIterator __f, _InputIterator __l,
9833e519524SHoward Hinnant            const key_compare& __comp, const allocator_type& __a)
9842a10c960SMarshall Clow        : __tree_(__vc(__comp), typename __base::allocator_type(__a))
9853e519524SHoward Hinnant        {
9863e519524SHoward Hinnant            insert(__f, __l);
9873e519524SHoward Hinnant        }
9883e519524SHoward Hinnant
989fbc317d4SMarshall Clow#if _LIBCPP_STD_VER > 11
990fbc317d4SMarshall Clow    template <class _InputIterator>
991fbc317d4SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
992fbc317d4SMarshall Clow    map(_InputIterator __f, _InputIterator __l, const allocator_type& __a)
993fbc317d4SMarshall Clow        : map(__f, __l, key_compare(), __a) {}
994fbc317d4SMarshall Clow#endif
995fbc317d4SMarshall Clow
996848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
9973e519524SHoward Hinnant    map(const map& __m)
9983e519524SHoward Hinnant        : __tree_(__m.__tree_)
9993e519524SHoward Hinnant        {
10003e519524SHoward Hinnant            insert(__m.begin(), __m.end());
10013e519524SHoward Hinnant        }
10023e519524SHoward Hinnant
10035a33687dSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
10045a33687dSHoward Hinnant    map& operator=(const map& __m)
10055a33687dSHoward Hinnant        {
10062ee83725SMarshall Clow#ifndef _LIBCPP_CXX03_LANG
10075a33687dSHoward Hinnant            __tree_ = __m.__tree_;
100807d3eccdSHoward Hinnant#else
100974cf6ff5SMarshall Clow            if (this != &__m) {
101007d3eccdSHoward Hinnant                __tree_.clear();
101107d3eccdSHoward Hinnant                __tree_.value_comp() = __m.__tree_.value_comp();
101207d3eccdSHoward Hinnant                __tree_.__copy_assign_alloc(__m.__tree_);
101307d3eccdSHoward Hinnant                insert(__m.begin(), __m.end());
101474cf6ff5SMarshall Clow            }
101507d3eccdSHoward Hinnant#endif
10165a33687dSHoward Hinnant            return *this;
10175a33687dSHoward Hinnant        }
10185a33687dSHoward Hinnant
101918293116SEric Fiselier#ifndef _LIBCPP_CXX03_LANG
10203e519524SHoward Hinnant
1021848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
10223e519524SHoward Hinnant    map(map&& __m)
10231052ee39SHoward Hinnant        _NOEXCEPT_(is_nothrow_move_constructible<__base>::value)
1024ce48a113SHoward Hinnant        : __tree_(_VSTD::move(__m.__tree_))
10253e519524SHoward Hinnant        {
10263e519524SHoward Hinnant        }
10273e519524SHoward Hinnant
10283e519524SHoward Hinnant    map(map&& __m, const allocator_type& __a);
10293e519524SHoward Hinnant
1030848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
103154976f26SHoward Hinnant    map& operator=(map&& __m)
103254976f26SHoward Hinnant        _NOEXCEPT_(is_nothrow_move_assignable<__base>::value)
103354976f26SHoward Hinnant        {
103454976f26SHoward Hinnant            __tree_ = _VSTD::move(__m.__tree_);
103554976f26SHoward Hinnant            return *this;
103654976f26SHoward Hinnant        }
103754976f26SHoward Hinnant
103854976f26SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
10393e519524SHoward Hinnant    map(initializer_list<value_type> __il, const key_compare& __comp = key_compare())
10403e519524SHoward Hinnant        : __tree_(__vc(__comp))
10413e519524SHoward Hinnant        {
10423e519524SHoward Hinnant            insert(__il.begin(), __il.end());
10433e519524SHoward Hinnant        }
10443e519524SHoward Hinnant
1045848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
10463e519524SHoward Hinnant    map(initializer_list<value_type> __il, const key_compare& __comp, const allocator_type& __a)
10472a10c960SMarshall Clow        : __tree_(__vc(__comp), typename __base::allocator_type(__a))
10483e519524SHoward Hinnant        {
10493e519524SHoward Hinnant            insert(__il.begin(), __il.end());
10503e519524SHoward Hinnant        }
10513e519524SHoward Hinnant
1052fbc317d4SMarshall Clow#if _LIBCPP_STD_VER > 11
1053fbc317d4SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
1054fbc317d4SMarshall Clow    map(initializer_list<value_type> __il, const allocator_type& __a)
1055fbc317d4SMarshall Clow        : map(__il, key_compare(), __a) {}
1056fbc317d4SMarshall Clow#endif
1057fbc317d4SMarshall Clow
1058848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
10593e519524SHoward Hinnant    map& operator=(initializer_list<value_type> __il)
10603e519524SHoward Hinnant        {
10613e519524SHoward Hinnant            __tree_.__assign_unique(__il.begin(), __il.end());
10623e519524SHoward Hinnant            return *this;
10633e519524SHoward Hinnant        }
10643e519524SHoward Hinnant
106518293116SEric Fiselier#endif  // _LIBCPP_CXX03_LANG
10663e519524SHoward Hinnant
1067848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
10683e519524SHoward Hinnant    explicit map(const allocator_type& __a)
10692a10c960SMarshall Clow        : __tree_(typename __base::allocator_type(__a))
10703e519524SHoward Hinnant        {
10713e519524SHoward Hinnant        }
10723e519524SHoward Hinnant
1073848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
10743e519524SHoward Hinnant    map(const map& __m, const allocator_type& __a)
10752a10c960SMarshall Clow        : __tree_(__m.__tree_.value_comp(), typename __base::allocator_type(__a))
10763e519524SHoward Hinnant        {
10773e519524SHoward Hinnant            insert(__m.begin(), __m.end());
10783e519524SHoward Hinnant        }
10793e519524SHoward Hinnant
1080848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
10811052ee39SHoward Hinnant          iterator begin() _NOEXCEPT {return __tree_.begin();}
1082848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
10831052ee39SHoward Hinnant    const_iterator begin() const _NOEXCEPT {return __tree_.begin();}
1084848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
10851052ee39SHoward Hinnant          iterator end() _NOEXCEPT {return __tree_.end();}
1086848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
10871052ee39SHoward Hinnant    const_iterator end() const _NOEXCEPT {return __tree_.end();}
10883e519524SHoward Hinnant
1089848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
10901052ee39SHoward Hinnant          reverse_iterator rbegin() _NOEXCEPT {return reverse_iterator(end());}
1091848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
10921052ee39SHoward Hinnant    const_reverse_iterator rbegin() const _NOEXCEPT
10931052ee39SHoward Hinnant        {return const_reverse_iterator(end());}
1094848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
10951052ee39SHoward Hinnant          reverse_iterator rend() _NOEXCEPT
10961052ee39SHoward Hinnant            {return       reverse_iterator(begin());}
1097848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
10981052ee39SHoward Hinnant    const_reverse_iterator rend() const _NOEXCEPT
10991052ee39SHoward Hinnant        {return const_reverse_iterator(begin());}
11003e519524SHoward Hinnant
1101848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11021052ee39SHoward Hinnant    const_iterator cbegin() const _NOEXCEPT {return begin();}
1103848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11041052ee39SHoward Hinnant    const_iterator cend() const _NOEXCEPT {return end();}
1105848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11061052ee39SHoward Hinnant    const_reverse_iterator crbegin() const _NOEXCEPT {return rbegin();}
1107848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11081052ee39SHoward Hinnant    const_reverse_iterator crend() const _NOEXCEPT {return rend();}
11093e519524SHoward Hinnant
111072c8fad4SMarshall Clow    _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY
11111052ee39SHoward Hinnant    bool      empty() const _NOEXCEPT {return __tree_.size() == 0;}
1112848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11131052ee39SHoward Hinnant    size_type size() const _NOEXCEPT {return __tree_.size();}
1114848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11151052ee39SHoward Hinnant    size_type max_size() const _NOEXCEPT {return __tree_.max_size();}
11163e519524SHoward Hinnant
11173e519524SHoward Hinnant    mapped_type& operator[](const key_type& __k);
111854f0cda6SEric Fiselier#ifndef _LIBCPP_CXX03_LANG
11193e519524SHoward Hinnant    mapped_type& operator[](key_type&& __k);
11203e519524SHoward Hinnant#endif
11213e519524SHoward Hinnant
11223e519524SHoward Hinnant          mapped_type& at(const key_type& __k);
11233e519524SHoward Hinnant    const mapped_type& at(const key_type& __k) const;
11243e519524SHoward Hinnant
1125848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11262a10c960SMarshall Clow    allocator_type get_allocator() const _NOEXCEPT {return allocator_type(__tree_.__alloc());}
1127848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11283e519524SHoward Hinnant    key_compare    key_comp()      const {return __tree_.value_comp().key_comp();}
1129848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11303e519524SHoward Hinnant    value_compare  value_comp()    const {return value_compare(__tree_.value_comp().key_comp());}
11313e519524SHoward Hinnant
11325e3ea4ddSEric Fiselier#ifndef _LIBCPP_CXX03_LANG
11335e3ea4ddSEric Fiselier    template <class ..._Args>
11345e3ea4ddSEric Fiselier    _LIBCPP_INLINE_VISIBILITY
11355e3ea4ddSEric Fiselier    pair<iterator, bool> emplace(_Args&& ...__args) {
11365e3ea4ddSEric Fiselier        return __tree_.__emplace_unique(_VSTD::forward<_Args>(__args)...);
11375e3ea4ddSEric Fiselier    }
11387609c9b6SHoward Hinnant
11398b805c91SHoward Hinnant    template <class ..._Args>
11405e3ea4ddSEric Fiselier    _LIBCPP_INLINE_VISIBILITY
11415e3ea4ddSEric Fiselier    iterator emplace_hint(const_iterator __p, _Args&& ...__args) {
11425e3ea4ddSEric Fiselier        return __tree_.__emplace_hint_unique(__p.__i_, _VSTD::forward<_Args>(__args)...);
11435e3ea4ddSEric Fiselier    }
11447609c9b6SHoward Hinnant
1145c003db1fSHoward Hinnant    template <class _Pp,
1146c003db1fSHoward Hinnant              class = typename enable_if<is_constructible<value_type, _Pp>::value>::type>
1147848a5374SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
1148c003db1fSHoward Hinnant        pair<iterator, bool> insert(_Pp&& __p)
1149c003db1fSHoward Hinnant            {return __tree_.__insert_unique(_VSTD::forward<_Pp>(__p));}
11503e519524SHoward Hinnant
1151c003db1fSHoward Hinnant    template <class _Pp,
1152c003db1fSHoward Hinnant              class = typename enable_if<is_constructible<value_type, _Pp>::value>::type>
1153848a5374SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
1154c003db1fSHoward Hinnant        iterator insert(const_iterator __pos, _Pp&& __p)
1155c003db1fSHoward Hinnant            {return __tree_.__insert_unique(__pos.__i_, _VSTD::forward<_Pp>(__p));}
11563e519524SHoward Hinnant
11575e3ea4ddSEric Fiselier#endif  // _LIBCPP_CXX03_LANG
11583e519524SHoward Hinnant
1159848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11603e519524SHoward Hinnant    pair<iterator, bool>
11613e519524SHoward Hinnant        insert(const value_type& __v) {return __tree_.__insert_unique(__v);}
11623e519524SHoward Hinnant
1163848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11643e519524SHoward Hinnant    iterator
11653e519524SHoward Hinnant        insert(const_iterator __p, const value_type& __v)
11663e519524SHoward Hinnant            {return __tree_.__insert_unique(__p.__i_, __v);}
11673e519524SHoward Hinnant
11687a9f500fSEric Fiselier#ifndef _LIBCPP_CXX03_LANG
1169afc9ff99SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
1170afc9ff99SMarshall Clow    pair<iterator, bool>
11715e3ea4ddSEric Fiselier    insert(value_type&& __v) {return __tree_.__insert_unique(_VSTD::move(__v));}
1172afc9ff99SMarshall Clow
1173afc9ff99SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
11745e3ea4ddSEric Fiselier    iterator insert(const_iterator __p,  value_type&& __v)
11755e3ea4ddSEric Fiselier    {return __tree_.__insert_unique(__p.__i_, _VSTD::move(__v));}
117618293116SEric Fiselier
117718293116SEric Fiselier    _LIBCPP_INLINE_VISIBILITY
117818293116SEric Fiselier    void insert(initializer_list<value_type> __il)
117918293116SEric Fiselier        {insert(__il.begin(), __il.end());}
1180afc9ff99SMarshall Clow#endif
1181afc9ff99SMarshall Clow
11823e519524SHoward Hinnant    template <class _InputIterator>
1183848a5374SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
11843e519524SHoward Hinnant        void insert(_InputIterator __f, _InputIterator __l)
11853e519524SHoward Hinnant        {
11863e519524SHoward Hinnant            for (const_iterator __e = cend(); __f != __l; ++__f)
11873e519524SHoward Hinnant                insert(__e.__i_, *__f);
11883e519524SHoward Hinnant        }
11893e519524SHoward Hinnant
11908aaf517dSMarshall Clow#if _LIBCPP_STD_VER > 14
119154f0cda6SEric Fiselier
11928aaf517dSMarshall Clow    template <class... _Args>
11938aaf517dSMarshall Clow        _LIBCPP_INLINE_VISIBILITY
11948aaf517dSMarshall Clow        pair<iterator, bool> try_emplace(const key_type& __k, _Args&&... __args)
11958aaf517dSMarshall Clow    {
119654f0cda6SEric Fiselier        return __tree_.__emplace_unique_key_args(__k,
119754f0cda6SEric Fiselier            _VSTD::piecewise_construct,
119854f0cda6SEric Fiselier            _VSTD::forward_as_tuple(__k),
119954f0cda6SEric Fiselier            _VSTD::forward_as_tuple(_VSTD::forward<_Args>(__args)...));
12008aaf517dSMarshall Clow    }
12018aaf517dSMarshall Clow
12028aaf517dSMarshall Clow    template <class... _Args>
12038aaf517dSMarshall Clow        _LIBCPP_INLINE_VISIBILITY
12048aaf517dSMarshall Clow        pair<iterator, bool> try_emplace(key_type&& __k, _Args&&... __args)
12058aaf517dSMarshall Clow    {
120654f0cda6SEric Fiselier        return __tree_.__emplace_unique_key_args(__k,
120754f0cda6SEric Fiselier            _VSTD::piecewise_construct,
120854f0cda6SEric Fiselier            _VSTD::forward_as_tuple(_VSTD::move(__k)),
120954f0cda6SEric Fiselier            _VSTD::forward_as_tuple(_VSTD::forward<_Args>(__args)...));
12108aaf517dSMarshall Clow    }
12118aaf517dSMarshall Clow
12128aaf517dSMarshall Clow    template <class... _Args>
12138aaf517dSMarshall Clow        _LIBCPP_INLINE_VISIBILITY
12148aaf517dSMarshall Clow        iterator try_emplace(const_iterator __h, const key_type& __k, _Args&&... __args)
12158aaf517dSMarshall Clow    {
121654f0cda6SEric Fiselier        return __tree_.__emplace_hint_unique_key_args(__h.__i_, __k,
121754f0cda6SEric Fiselier            _VSTD::piecewise_construct,
121854f0cda6SEric Fiselier            _VSTD::forward_as_tuple(__k),
12198aaf517dSMarshall Clow            _VSTD::forward_as_tuple(_VSTD::forward<_Args>(__args)...));
12208aaf517dSMarshall Clow    }
12218aaf517dSMarshall Clow
12228aaf517dSMarshall Clow    template <class... _Args>
12238aaf517dSMarshall Clow        _LIBCPP_INLINE_VISIBILITY
12248aaf517dSMarshall Clow        iterator try_emplace(const_iterator __h, key_type&& __k, _Args&&... __args)
12258aaf517dSMarshall Clow    {
122654f0cda6SEric Fiselier        return __tree_.__emplace_hint_unique_key_args(__h.__i_, __k,
122754f0cda6SEric Fiselier            _VSTD::piecewise_construct,
122854f0cda6SEric Fiselier            _VSTD::forward_as_tuple(_VSTD::move(__k)),
12298aaf517dSMarshall Clow            _VSTD::forward_as_tuple(_VSTD::forward<_Args>(__args)...));
12308aaf517dSMarshall Clow    }
12318aaf517dSMarshall Clow
12328aaf517dSMarshall Clow    template <class _Vp>
12338aaf517dSMarshall Clow        _LIBCPP_INLINE_VISIBILITY
12348aaf517dSMarshall Clow        pair<iterator, bool> insert_or_assign(const key_type& __k, _Vp&& __v)
12358aaf517dSMarshall Clow    {
12368aaf517dSMarshall Clow        iterator __p = lower_bound(__k);
12378aaf517dSMarshall Clow        if ( __p != end() && !key_comp()(__k, __p->first))
12388aaf517dSMarshall Clow        {
12398aaf517dSMarshall Clow            __p->second = _VSTD::forward<_Vp>(__v);
12408aaf517dSMarshall Clow            return _VSTD::make_pair(__p, false);
12418aaf517dSMarshall Clow        }
12428aaf517dSMarshall Clow        return _VSTD::make_pair(emplace_hint(__p, __k, _VSTD::forward<_Vp>(__v)), true);
12438aaf517dSMarshall Clow    }
12448aaf517dSMarshall Clow
12458aaf517dSMarshall Clow    template <class _Vp>
12468aaf517dSMarshall Clow        _LIBCPP_INLINE_VISIBILITY
12478aaf517dSMarshall Clow        pair<iterator, bool> insert_or_assign(key_type&& __k, _Vp&& __v)
12488aaf517dSMarshall Clow    {
12498aaf517dSMarshall Clow        iterator __p = lower_bound(__k);
12508aaf517dSMarshall Clow        if ( __p != end() && !key_comp()(__k, __p->first))
12518aaf517dSMarshall Clow        {
12528aaf517dSMarshall Clow            __p->second = _VSTD::forward<_Vp>(__v);
12538aaf517dSMarshall Clow            return _VSTD::make_pair(__p, false);
12548aaf517dSMarshall Clow        }
12558aaf517dSMarshall Clow        return _VSTD::make_pair(emplace_hint(__p, _VSTD::move(__k), _VSTD::forward<_Vp>(__v)), true);
12568aaf517dSMarshall Clow    }
12578aaf517dSMarshall Clow
12588aaf517dSMarshall Clow    template <class _Vp>
12598aaf517dSMarshall Clow        _LIBCPP_INLINE_VISIBILITY
12608aaf517dSMarshall Clow        iterator insert_or_assign(const_iterator __h, const key_type& __k, _Vp&& __v)
12618aaf517dSMarshall Clow     {
12628aaf517dSMarshall Clow        iterator __p = lower_bound(__k);
12638aaf517dSMarshall Clow        if ( __p != end() && !key_comp()(__k, __p->first))
12648aaf517dSMarshall Clow        {
12658aaf517dSMarshall Clow            __p->second = _VSTD::forward<_Vp>(__v);
12668aaf517dSMarshall Clow            return __p;
12678aaf517dSMarshall Clow        }
12688aaf517dSMarshall Clow        return emplace_hint(__h, __k, _VSTD::forward<_Vp>(__v));
12698aaf517dSMarshall Clow     }
12708aaf517dSMarshall Clow
12718aaf517dSMarshall Clow    template <class _Vp>
12728aaf517dSMarshall Clow        _LIBCPP_INLINE_VISIBILITY
12738aaf517dSMarshall Clow        iterator insert_or_assign(const_iterator __h, key_type&& __k, _Vp&& __v)
12748aaf517dSMarshall Clow     {
12758aaf517dSMarshall Clow        iterator __p = lower_bound(__k);
12768aaf517dSMarshall Clow        if ( __p != end() && !key_comp()(__k, __p->first))
12778aaf517dSMarshall Clow        {
12788aaf517dSMarshall Clow            __p->second = _VSTD::forward<_Vp>(__v);
12798aaf517dSMarshall Clow            return __p;
12808aaf517dSMarshall Clow        }
12818aaf517dSMarshall Clow        return emplace_hint(__h, _VSTD::move(__k), _VSTD::forward<_Vp>(__v));
12828aaf517dSMarshall Clow     }
128354f0cda6SEric Fiselier
128418293116SEric Fiselier#endif // _LIBCPP_STD_VER > 14
12858aaf517dSMarshall Clow
1286848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
12873e519524SHoward Hinnant    iterator erase(const_iterator __p) {return __tree_.erase(__p.__i_);}
1288848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
1289ec392968SMarshall Clow    iterator erase(iterator __p)       {return __tree_.erase(__p.__i_);}
1290ec392968SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
12913e519524SHoward Hinnant    size_type erase(const key_type& __k)
12923e519524SHoward Hinnant        {return __tree_.__erase_unique(__k);}
1293848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
12943e519524SHoward Hinnant    iterator  erase(const_iterator __f, const_iterator __l)
12953e519524SHoward Hinnant        {return __tree_.erase(__f.__i_, __l.__i_);}
1296848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
12971052ee39SHoward Hinnant    void clear() _NOEXCEPT {__tree_.clear();}
12983e519524SHoward Hinnant
1299b0386a51SErik Pilkington#if _LIBCPP_STD_VER > 14
1300b0386a51SErik Pilkington    _LIBCPP_INLINE_VISIBILITY
1301b0386a51SErik Pilkington    insert_return_type insert(node_type&& __nh)
1302b0386a51SErik Pilkington    {
1303b0386a51SErik Pilkington        _LIBCPP_ASSERT(__nh.empty() || __nh.get_allocator() == get_allocator(),
1304b0386a51SErik Pilkington            "node_type with incompatible allocator passed to map::insert()");
1305b0386a51SErik Pilkington        return __tree_.template __node_handle_insert_unique<
1306b0386a51SErik Pilkington            node_type, insert_return_type>(_VSTD::move(__nh));
1307b0386a51SErik Pilkington    }
1308b0386a51SErik Pilkington    _LIBCPP_INLINE_VISIBILITY
1309b0386a51SErik Pilkington    iterator insert(const_iterator __hint, node_type&& __nh)
1310b0386a51SErik Pilkington    {
1311b0386a51SErik Pilkington        _LIBCPP_ASSERT(__nh.empty() || __nh.get_allocator() == get_allocator(),
1312b0386a51SErik Pilkington            "node_type with incompatible allocator passed to map::insert()");
1313b0386a51SErik Pilkington        return __tree_.template __node_handle_insert_unique<node_type>(
1314b0386a51SErik Pilkington            __hint.__i_, _VSTD::move(__nh));
1315b0386a51SErik Pilkington    }
1316b0386a51SErik Pilkington    _LIBCPP_INLINE_VISIBILITY
1317b0386a51SErik Pilkington    node_type extract(key_type const& __key)
1318b0386a51SErik Pilkington    {
1319b0386a51SErik Pilkington        return __tree_.template __node_handle_extract<node_type>(__key);
1320b0386a51SErik Pilkington    }
1321b0386a51SErik Pilkington    _LIBCPP_INLINE_VISIBILITY
1322b0386a51SErik Pilkington    node_type extract(const_iterator __it)
1323b0386a51SErik Pilkington    {
1324b0386a51SErik Pilkington        return __tree_.template __node_handle_extract<node_type>(__it.__i_);
1325b0386a51SErik Pilkington    }
1326*5c4e07aeSErik Pilkington    template <class _C2>
1327*5c4e07aeSErik Pilkington    _LIBCPP_INLINE_VISIBILITY
1328*5c4e07aeSErik Pilkington    void merge(map<key_type, mapped_type, _C2, allocator_type>& __source)
1329*5c4e07aeSErik Pilkington    {
1330*5c4e07aeSErik Pilkington        _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
1331*5c4e07aeSErik Pilkington                       "merging container with incompatible allocator");
1332*5c4e07aeSErik Pilkington        __tree_.__node_handle_merge_unique(__source.__tree_);
1333*5c4e07aeSErik Pilkington    }
1334*5c4e07aeSErik Pilkington    template <class _C2>
1335*5c4e07aeSErik Pilkington    _LIBCPP_INLINE_VISIBILITY
1336*5c4e07aeSErik Pilkington    void merge(map<key_type, mapped_type, _C2, allocator_type>&& __source)
1337*5c4e07aeSErik Pilkington    {
1338*5c4e07aeSErik Pilkington        _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
1339*5c4e07aeSErik Pilkington                       "merging container with incompatible allocator");
1340*5c4e07aeSErik Pilkington        __tree_.__node_handle_merge_unique(__source.__tree_);
1341*5c4e07aeSErik Pilkington    }
1342*5c4e07aeSErik Pilkington    template <class _C2>
1343*5c4e07aeSErik Pilkington    _LIBCPP_INLINE_VISIBILITY
1344*5c4e07aeSErik Pilkington    void merge(multimap<key_type, mapped_type, _C2, allocator_type>& __source)
1345*5c4e07aeSErik Pilkington    {
1346*5c4e07aeSErik Pilkington        _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
1347*5c4e07aeSErik Pilkington                       "merging container with incompatible allocator");
1348*5c4e07aeSErik Pilkington        __tree_.__node_handle_merge_unique(__source.__tree_);
1349*5c4e07aeSErik Pilkington    }
1350*5c4e07aeSErik Pilkington    template <class _C2>
1351*5c4e07aeSErik Pilkington    _LIBCPP_INLINE_VISIBILITY
1352*5c4e07aeSErik Pilkington    void merge(multimap<key_type, mapped_type, _C2, allocator_type>&& __source)
1353*5c4e07aeSErik Pilkington    {
1354*5c4e07aeSErik Pilkington        _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
1355*5c4e07aeSErik Pilkington                       "merging container with incompatible allocator");
1356*5c4e07aeSErik Pilkington        __tree_.__node_handle_merge_unique(__source.__tree_);
1357*5c4e07aeSErik Pilkington    }
1358b0386a51SErik Pilkington#endif
1359b0386a51SErik Pilkington
1360848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
13611052ee39SHoward Hinnant    void swap(map& __m)
13621052ee39SHoward Hinnant        _NOEXCEPT_(__is_nothrow_swappable<__base>::value)
13631052ee39SHoward Hinnant        {__tree_.swap(__m.__tree_);}
13643e519524SHoward Hinnant
1365848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
13663e519524SHoward Hinnant    iterator find(const key_type& __k)             {return __tree_.find(__k);}
1367848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
13683e519524SHoward Hinnant    const_iterator find(const key_type& __k) const {return __tree_.find(__k);}
13692585835cSMarshall Clow#if _LIBCPP_STD_VER > 11
13702585835cSMarshall Clow    template <typename _K2>
13712585835cSMarshall Clow    _LIBCPP_INLINE_VISIBILITY
13722585835cSMarshall Clow    typename enable_if<__is_transparent<_Compare, _K2>::value,iterator>::type
13732585835cSMarshall Clow    find(const _K2& __k)                           {return __tree_.find(__k);}
13742585835cSMarshall Clow    template <typename _K2>
13752585835cSMarshall Clow    _LIBCPP_INLINE_VISIBILITY
13762585835cSMarshall Clow    typename enable_if<__is_transparent<_Compare, _K2>::value,const_iterator>::type
13772585835cSMarshall Clow    find(const _K2& __k) const                     {return __tree_.find(__k);}
13782585835cSMarshall Clow#endif
13792585835cSMarshall Clow
1380848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
13813e519524SHoward Hinnant    size_type      count(const key_type& __k) const
13823e519524SHoward Hinnant        {return __tree_.__count_unique(__k);}
13830aacbc92SMarshall Clow#if _LIBCPP_STD_VER > 11
13840aacbc92SMarshall Clow    template <typename _K2>
13850aacbc92SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
13860aacbc92SMarshall Clow    typename enable_if<__is_transparent<_Compare, _K2>::value,size_type>::type
13879bfdb770SEric Fiselier    count(const _K2& __k) const {return __tree_.__count_multi(__k);}
13880aacbc92SMarshall Clow#endif
1389848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
13903e519524SHoward Hinnant    iterator lower_bound(const key_type& __k)
13913e519524SHoward Hinnant        {return __tree_.lower_bound(__k);}
1392848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
13933e519524SHoward Hinnant    const_iterator lower_bound(const key_type& __k) const
13943e519524SHoward Hinnant        {return __tree_.lower_bound(__k);}
13952585835cSMarshall Clow#if _LIBCPP_STD_VER > 11
13962585835cSMarshall Clow    template <typename _K2>
13972585835cSMarshall Clow    _LIBCPP_INLINE_VISIBILITY
13982585835cSMarshall Clow    typename enable_if<__is_transparent<_Compare, _K2>::value,iterator>::type
13992585835cSMarshall Clow    lower_bound(const _K2& __k)       {return __tree_.lower_bound(__k);}
14002585835cSMarshall Clow
14012585835cSMarshall Clow    template <typename _K2>
14022585835cSMarshall Clow    _LIBCPP_INLINE_VISIBILITY
14032585835cSMarshall Clow    typename enable_if<__is_transparent<_Compare, _K2>::value,const_iterator>::type
14042585835cSMarshall Clow    lower_bound(const _K2& __k) const {return __tree_.lower_bound(__k);}
14052585835cSMarshall Clow#endif
14062585835cSMarshall Clow
1407848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
14083e519524SHoward Hinnant    iterator upper_bound(const key_type& __k)
14093e519524SHoward Hinnant        {return __tree_.upper_bound(__k);}
1410848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
14113e519524SHoward Hinnant    const_iterator upper_bound(const key_type& __k) const
14123e519524SHoward Hinnant        {return __tree_.upper_bound(__k);}
14132585835cSMarshall Clow#if _LIBCPP_STD_VER > 11
14142585835cSMarshall Clow    template <typename _K2>
14152585835cSMarshall Clow    _LIBCPP_INLINE_VISIBILITY
14162585835cSMarshall Clow    typename enable_if<__is_transparent<_Compare, _K2>::value,iterator>::type
14172585835cSMarshall Clow    upper_bound(const _K2& __k)       {return __tree_.upper_bound(__k);}
14182585835cSMarshall Clow    template <typename _K2>
14192585835cSMarshall Clow    _LIBCPP_INLINE_VISIBILITY
14202585835cSMarshall Clow    typename enable_if<__is_transparent<_Compare, _K2>::value,const_iterator>::type
14212585835cSMarshall Clow    upper_bound(const _K2& __k) const {return __tree_.upper_bound(__k);}
14222585835cSMarshall Clow#endif
14232585835cSMarshall Clow
1424848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
14253e519524SHoward Hinnant    pair<iterator,iterator> equal_range(const key_type& __k)
14263e519524SHoward Hinnant        {return __tree_.__equal_range_unique(__k);}
1427848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
14283e519524SHoward Hinnant    pair<const_iterator,const_iterator> equal_range(const key_type& __k) const
14293e519524SHoward Hinnant        {return __tree_.__equal_range_unique(__k);}
14302585835cSMarshall Clow#if _LIBCPP_STD_VER > 11
14312585835cSMarshall Clow    template <typename _K2>
14322585835cSMarshall Clow    _LIBCPP_INLINE_VISIBILITY
14332585835cSMarshall Clow    typename enable_if<__is_transparent<_Compare, _K2>::value,pair<iterator,iterator>>::type
14349bfdb770SEric Fiselier    equal_range(const _K2& __k)       {return __tree_.__equal_range_multi(__k);}
14352585835cSMarshall Clow    template <typename _K2>
14362585835cSMarshall Clow    _LIBCPP_INLINE_VISIBILITY
14372585835cSMarshall Clow    typename enable_if<__is_transparent<_Compare, _K2>::value,pair<const_iterator,const_iterator>>::type
14389bfdb770SEric Fiselier    equal_range(const _K2& __k) const {return __tree_.__equal_range_multi(__k);}
14392585835cSMarshall Clow#endif
14403e519524SHoward Hinnant
14413e519524SHoward Hinnantprivate:
14423e519524SHoward Hinnant    typedef typename __base::__node                    __node;
14433e519524SHoward Hinnant    typedef typename __base::__node_allocator          __node_allocator;
14443e519524SHoward Hinnant    typedef typename __base::__node_pointer            __node_pointer;
14453e519524SHoward Hinnant    typedef typename __base::__node_base_pointer       __node_base_pointer;
1446cb5cbc8bSEric Fiselier    typedef typename __base::__parent_pointer          __parent_pointer;
14470594ad71SEric Fiselier
1448c003db1fSHoward Hinnant    typedef __map_node_destructor<__node_allocator> _Dp;
1449c003db1fSHoward Hinnant    typedef unique_ptr<__node, _Dp> __node_holder;
14503e519524SHoward Hinnant
145154f0cda6SEric Fiselier#ifdef _LIBCPP_CXX03_LANG
14524a95f9ebSHoward Hinnant    __node_holder __construct_node_with_key(const key_type& __k);
145354f0cda6SEric Fiselier#endif
14543e519524SHoward Hinnant};
14553e519524SHoward Hinnant
14560594ad71SEric Fiselier
14575e3ea4ddSEric Fiselier#ifndef _LIBCPP_CXX03_LANG
14583e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator>
14593e519524SHoward Hinnantmap<_Key, _Tp, _Compare, _Allocator>::map(map&& __m, const allocator_type& __a)
14602a10c960SMarshall Clow    : __tree_(_VSTD::move(__m.__tree_), typename __base::allocator_type(__a))
14613e519524SHoward Hinnant{
14623e519524SHoward Hinnant    if (__a != __m.get_allocator())
14633e519524SHoward Hinnant    {
14643e519524SHoward Hinnant        const_iterator __e = cend();
14653e519524SHoward Hinnant        while (!__m.empty())
14663e519524SHoward Hinnant            __tree_.__insert_unique(__e.__i_,
1467f52318b4SErik Pilkington                    __m.__tree_.remove(__m.begin().__i_)->__value_.__move());
14683e519524SHoward Hinnant    }
14693e519524SHoward Hinnant}
14703e519524SHoward Hinnant
147118293116SEric Fiseliertemplate <class _Key, class _Tp, class _Compare, class _Allocator>
147218293116SEric Fiselier_Tp&
147318293116SEric Fiseliermap<_Key, _Tp, _Compare, _Allocator>::operator[](const key_type& __k)
147418293116SEric Fiselier{
147518293116SEric Fiselier    return __tree_.__emplace_unique_key_args(__k,
147618293116SEric Fiselier        _VSTD::piecewise_construct,
147718293116SEric Fiselier        _VSTD::forward_as_tuple(__k),
1478f52318b4SErik Pilkington        _VSTD::forward_as_tuple()).first->__get_value().second;
147918293116SEric Fiselier}
14803e519524SHoward Hinnant
148118293116SEric Fiseliertemplate <class _Key, class _Tp, class _Compare, class _Allocator>
148218293116SEric Fiselier_Tp&
148318293116SEric Fiseliermap<_Key, _Tp, _Compare, _Allocator>::operator[](key_type&& __k)
148418293116SEric Fiselier{
148518293116SEric Fiselier    return __tree_.__emplace_unique_key_args(__k,
148618293116SEric Fiselier        _VSTD::piecewise_construct,
148718293116SEric Fiselier        _VSTD::forward_as_tuple(_VSTD::move(__k)),
1488f52318b4SErik Pilkington        _VSTD::forward_as_tuple()).first->__get_value().second;
148918293116SEric Fiselier}
149054f0cda6SEric Fiselier
149118293116SEric Fiselier#else // _LIBCPP_CXX03_LANG
149254f0cda6SEric Fiselier
14933e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator>
14943e519524SHoward Hinnanttypename map<_Key, _Tp, _Compare, _Allocator>::__node_holder
14954a95f9ebSHoward Hinnantmap<_Key, _Tp, _Compare, _Allocator>::__construct_node_with_key(const key_type& __k)
14963e519524SHoward Hinnant{
14973e519524SHoward Hinnant    __node_allocator& __na = __tree_.__node_alloc();
1498c003db1fSHoward Hinnant    __node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na));
1499f52318b4SErik Pilkington    __node_traits::construct(__na, _VSTD::addressof(__h->__value_.__get_value().first), __k);
15003e519524SHoward Hinnant    __h.get_deleter().__first_constructed = true;
1501f52318b4SErik Pilkington    __node_traits::construct(__na, _VSTD::addressof(__h->__value_.__get_value().second));
15023e519524SHoward Hinnant    __h.get_deleter().__second_constructed = true;
1503251c6291SDimitry Andric    return _LIBCPP_EXPLICIT_MOVE(__h);  // explicitly moved for C++03
15043e519524SHoward Hinnant}
15053e519524SHoward Hinnant
15063e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator>
15073e519524SHoward Hinnant_Tp&
15083e519524SHoward Hinnantmap<_Key, _Tp, _Compare, _Allocator>::operator[](const key_type& __k)
15093e519524SHoward Hinnant{
1510cb5cbc8bSEric Fiselier    __parent_pointer __parent;
1511cb5cbc8bSEric Fiselier    __node_base_pointer& __child = __tree_.__find_equal(__parent, __k);
15123e519524SHoward Hinnant    __node_pointer __r = static_cast<__node_pointer>(__child);
15133e519524SHoward Hinnant    if (__child == nullptr)
15143e519524SHoward Hinnant    {
15154a95f9ebSHoward Hinnant        __node_holder __h = __construct_node_with_key(__k);
151607d3eccdSHoward Hinnant        __tree_.__insert_node_at(__parent, __child, static_cast<__node_base_pointer>(__h.get()));
15173e519524SHoward Hinnant        __r = __h.release();
15183e519524SHoward Hinnant    }
1519f52318b4SErik Pilkington    return __r->__value_.__get_value().second;
15203e519524SHoward Hinnant}
15213e519524SHoward Hinnant
152218293116SEric Fiselier#endif  // _LIBCPP_CXX03_LANG
15233e519524SHoward Hinnant
15243e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator>
15253e519524SHoward Hinnant_Tp&
15263e519524SHoward Hinnantmap<_Key, _Tp, _Compare, _Allocator>::at(const key_type& __k)
15273e519524SHoward Hinnant{
1528cb5cbc8bSEric Fiselier    __parent_pointer __parent;
1529cb5cbc8bSEric Fiselier    __node_base_pointer& __child = __tree_.__find_equal(__parent, __k);
153054b409fdSHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
15313e519524SHoward Hinnant    if (__child == nullptr)
15323e519524SHoward Hinnant        throw out_of_range("map::at:  key not found");
1533b3371f6fSHoward Hinnant#endif  // _LIBCPP_NO_EXCEPTIONS
1534f52318b4SErik Pilkington    return static_cast<__node_pointer>(__child)->__value_.__get_value().second;
15353e519524SHoward Hinnant}
15363e519524SHoward Hinnant
15373e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator>
15383e519524SHoward Hinnantconst _Tp&
15393e519524SHoward Hinnantmap<_Key, _Tp, _Compare, _Allocator>::at(const key_type& __k) const
15403e519524SHoward Hinnant{
1541cb5cbc8bSEric Fiselier    __parent_pointer __parent;
1542cb5cbc8bSEric Fiselier    __node_base_pointer __child = __tree_.__find_equal(__parent, __k);
154354b409fdSHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
15443e519524SHoward Hinnant    if (__child == nullptr)
15453e519524SHoward Hinnant        throw out_of_range("map::at:  key not found");
1546b3371f6fSHoward Hinnant#endif  // _LIBCPP_NO_EXCEPTIONS
1547f52318b4SErik Pilkington    return static_cast<__node_pointer>(__child)->__value_.__get_value().second;
15483e519524SHoward Hinnant}
15493e519524SHoward Hinnant
15503e519524SHoward Hinnant
15513e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator>
1552848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
15533e519524SHoward Hinnantbool
15543e519524SHoward Hinnantoperator==(const map<_Key, _Tp, _Compare, _Allocator>& __x,
15553e519524SHoward Hinnant           const map<_Key, _Tp, _Compare, _Allocator>& __y)
15563e519524SHoward Hinnant{
1557ce48a113SHoward Hinnant    return __x.size() == __y.size() && _VSTD::equal(__x.begin(), __x.end(), __y.begin());
15583e519524SHoward Hinnant}
15593e519524SHoward Hinnant
15603e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator>
1561848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
15623e519524SHoward Hinnantbool
15633e519524SHoward Hinnantoperator< (const map<_Key, _Tp, _Compare, _Allocator>& __x,
15643e519524SHoward Hinnant           const map<_Key, _Tp, _Compare, _Allocator>& __y)
15653e519524SHoward Hinnant{
1566ce48a113SHoward Hinnant    return _VSTD::lexicographical_compare(__x.begin(), __x.end(), __y.begin(), __y.end());
15673e519524SHoward Hinnant}
15683e519524SHoward Hinnant
15693e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator>
1570848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
15713e519524SHoward Hinnantbool
15723e519524SHoward Hinnantoperator!=(const map<_Key, _Tp, _Compare, _Allocator>& __x,
15733e519524SHoward Hinnant           const map<_Key, _Tp, _Compare, _Allocator>& __y)
15743e519524SHoward Hinnant{
15753e519524SHoward Hinnant    return !(__x == __y);
15763e519524SHoward Hinnant}
15773e519524SHoward Hinnant
15783e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator>
1579848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
15803e519524SHoward Hinnantbool
15813e519524SHoward Hinnantoperator> (const map<_Key, _Tp, _Compare, _Allocator>& __x,
15823e519524SHoward Hinnant           const map<_Key, _Tp, _Compare, _Allocator>& __y)
15833e519524SHoward Hinnant{
15843e519524SHoward Hinnant    return __y < __x;
15853e519524SHoward Hinnant}
15863e519524SHoward Hinnant
15873e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator>
1588848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
15893e519524SHoward Hinnantbool
15903e519524SHoward Hinnantoperator>=(const map<_Key, _Tp, _Compare, _Allocator>& __x,
15913e519524SHoward Hinnant           const map<_Key, _Tp, _Compare, _Allocator>& __y)
15923e519524SHoward Hinnant{
15933e519524SHoward Hinnant    return !(__x < __y);
15943e519524SHoward Hinnant}
15953e519524SHoward Hinnant
15963e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator>
1597848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
15983e519524SHoward Hinnantbool
15993e519524SHoward Hinnantoperator<=(const map<_Key, _Tp, _Compare, _Allocator>& __x,
16003e519524SHoward Hinnant           const map<_Key, _Tp, _Compare, _Allocator>& __y)
16013e519524SHoward Hinnant{
16023e519524SHoward Hinnant    return !(__y < __x);
16033e519524SHoward Hinnant}
16043e519524SHoward Hinnant
16053e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator>
1606848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
16073e519524SHoward Hinnantvoid
16083e519524SHoward Hinnantswap(map<_Key, _Tp, _Compare, _Allocator>& __x,
16093e519524SHoward Hinnant     map<_Key, _Tp, _Compare, _Allocator>& __y)
16101052ee39SHoward Hinnant    _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
16113e519524SHoward Hinnant{
16123e519524SHoward Hinnant    __x.swap(__y);
16133e519524SHoward Hinnant}
16143e519524SHoward Hinnant
16153e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare = less<_Key>,
16163e519524SHoward Hinnant          class _Allocator = allocator<pair<const _Key, _Tp> > >
1617e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS multimap
16183e519524SHoward Hinnant{
16193e519524SHoward Hinnantpublic:
16203e519524SHoward Hinnant    // types:
16213e519524SHoward Hinnant    typedef _Key                                     key_type;
16223e519524SHoward Hinnant    typedef _Tp                                      mapped_type;
16233e519524SHoward Hinnant    typedef pair<const key_type, mapped_type>        value_type;
16243e519524SHoward Hinnant    typedef _Compare                                 key_compare;
16253e519524SHoward Hinnant    typedef _Allocator                               allocator_type;
16263e519524SHoward Hinnant    typedef value_type&                              reference;
16273e519524SHoward Hinnant    typedef const value_type&                        const_reference;
16283e519524SHoward Hinnant
162994f89aeeSMarshall Clow    static_assert((is_same<typename allocator_type::value_type, value_type>::value),
163094f89aeeSMarshall Clow                  "Allocator::value_type must be same type as value_type");
163194f89aeeSMarshall Clow
1632e2f2d1edSEric Fiselier    class _LIBCPP_TEMPLATE_VIS value_compare
16333e519524SHoward Hinnant        : public binary_function<value_type, value_type, bool>
16343e519524SHoward Hinnant    {
16353e519524SHoward Hinnant        friend class multimap;
16363e519524SHoward Hinnant    protected:
16373e519524SHoward Hinnant        key_compare comp;
16383e519524SHoward Hinnant
1639848a5374SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
16403e519524SHoward Hinnant        value_compare(key_compare c) : comp(c) {}
16413e519524SHoward Hinnant    public:
1642848a5374SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
16433e519524SHoward Hinnant        bool operator()(const value_type& __x, const value_type& __y) const
16443e519524SHoward Hinnant            {return comp(__x.first, __y.first);}
16453e519524SHoward Hinnant    };
16463e519524SHoward Hinnant
16473e519524SHoward Hinnantprivate:
164807d3eccdSHoward Hinnant
16499fd9f84fSHoward Hinnant    typedef _VSTD::__value_type<key_type, mapped_type>             __value_type;
1650abb160e6SHoward Hinnant    typedef __map_value_compare<key_type, __value_type, key_compare> __vc;
16511f508014SMarshall Clow    typedef typename __rebind_alloc_helper<allocator_traits<allocator_type>,
16521f508014SMarshall Clow                                                 __value_type>::type __allocator_type;
16533e519524SHoward Hinnant    typedef __tree<__value_type, __vc, __allocator_type>            __base;
16543e519524SHoward Hinnant    typedef typename __base::__node_traits                          __node_traits;
16553e519524SHoward Hinnant    typedef allocator_traits<allocator_type>                        __alloc_traits;
16563e519524SHoward Hinnant
16573e519524SHoward Hinnant    __base __tree_;
16583e519524SHoward Hinnant
16593e519524SHoward Hinnantpublic:
16603e519524SHoward Hinnant    typedef typename __alloc_traits::pointer               pointer;
16613e519524SHoward Hinnant    typedef typename __alloc_traits::const_pointer         const_pointer;
16623e519524SHoward Hinnant    typedef typename __alloc_traits::size_type             size_type;
16633e519524SHoward Hinnant    typedef typename __alloc_traits::difference_type       difference_type;
16643e519524SHoward Hinnant    typedef __map_iterator<typename __base::iterator>      iterator;
16653e519524SHoward Hinnant    typedef __map_const_iterator<typename __base::const_iterator> const_iterator;
1666ce48a113SHoward Hinnant    typedef _VSTD::reverse_iterator<iterator>               reverse_iterator;
1667ce48a113SHoward Hinnant    typedef _VSTD::reverse_iterator<const_iterator>         const_reverse_iterator;
16683e519524SHoward Hinnant
1669b0386a51SErik Pilkington#if _LIBCPP_STD_VER > 14
1670b0386a51SErik Pilkington    typedef __map_node_handle<typename __base::__node, allocator_type> node_type;
1671b0386a51SErik Pilkington#endif
1672b0386a51SErik Pilkington
1673*5c4e07aeSErik Pilkington    template <class _Key2, class _Value2, class _Comp2, class _Alloc2>
1674*5c4e07aeSErik Pilkington        friend class _LIBCPP_TEMPLATE_VIS map;
1675*5c4e07aeSErik Pilkington    template <class _Key2, class _Value2, class _Comp2, class _Alloc2>
1676*5c4e07aeSErik Pilkington        friend class _LIBCPP_TEMPLATE_VIS multimap;
1677*5c4e07aeSErik Pilkington
1678848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
1679415a24e4SMarshall Clow    multimap()
1680415a24e4SMarshall Clow        _NOEXCEPT_(
1681415a24e4SMarshall Clow            is_nothrow_default_constructible<allocator_type>::value &&
1682415a24e4SMarshall Clow            is_nothrow_default_constructible<key_compare>::value &&
1683415a24e4SMarshall Clow            is_nothrow_copy_constructible<key_compare>::value)
1684415a24e4SMarshall Clow        : __tree_(__vc(key_compare())) {}
1685415a24e4SMarshall Clow
1686415a24e4SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
1687415a24e4SMarshall Clow    explicit multimap(const key_compare& __comp)
16881052ee39SHoward Hinnant        _NOEXCEPT_(
16891052ee39SHoward Hinnant            is_nothrow_default_constructible<allocator_type>::value &&
16901052ee39SHoward Hinnant            is_nothrow_copy_constructible<key_compare>::value)
16913e519524SHoward Hinnant        : __tree_(__vc(__comp)) {}
16923e519524SHoward Hinnant
1693848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
16943e519524SHoward Hinnant    explicit multimap(const key_compare& __comp, const allocator_type& __a)
16952a10c960SMarshall Clow        : __tree_(__vc(__comp), typename __base::allocator_type(__a)) {}
16963e519524SHoward Hinnant
16973e519524SHoward Hinnant    template <class _InputIterator>
1698848a5374SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
16993e519524SHoward Hinnant        multimap(_InputIterator __f, _InputIterator __l,
17003e519524SHoward Hinnant            const key_compare& __comp = key_compare())
17013e519524SHoward Hinnant        : __tree_(__vc(__comp))
17023e519524SHoward Hinnant        {
17033e519524SHoward Hinnant            insert(__f, __l);
17043e519524SHoward Hinnant        }
17053e519524SHoward Hinnant
17063e519524SHoward Hinnant    template <class _InputIterator>
1707848a5374SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
17083e519524SHoward Hinnant        multimap(_InputIterator __f, _InputIterator __l,
17093e519524SHoward Hinnant            const key_compare& __comp, const allocator_type& __a)
17102a10c960SMarshall Clow        : __tree_(__vc(__comp), typename __base::allocator_type(__a))
17113e519524SHoward Hinnant        {
17123e519524SHoward Hinnant            insert(__f, __l);
17133e519524SHoward Hinnant        }
17143e519524SHoward Hinnant
1715fbc317d4SMarshall Clow#if _LIBCPP_STD_VER > 11
1716fbc317d4SMarshall Clow    template <class _InputIterator>
1717fbc317d4SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
1718fbc317d4SMarshall Clow    multimap(_InputIterator __f, _InputIterator __l, const allocator_type& __a)
1719fbc317d4SMarshall Clow        : multimap(__f, __l, key_compare(), __a) {}
1720fbc317d4SMarshall Clow#endif
1721fbc317d4SMarshall Clow
1722848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
17233e519524SHoward Hinnant    multimap(const multimap& __m)
17243e519524SHoward Hinnant        : __tree_(__m.__tree_.value_comp(),
17253e519524SHoward Hinnant          __alloc_traits::select_on_container_copy_construction(__m.__tree_.__alloc()))
17263e519524SHoward Hinnant        {
17273e519524SHoward Hinnant            insert(__m.begin(), __m.end());
17283e519524SHoward Hinnant        }
17293e519524SHoward Hinnant
17305a33687dSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
17315a33687dSHoward Hinnant    multimap& operator=(const multimap& __m)
17325a33687dSHoward Hinnant        {
17332ee83725SMarshall Clow#ifndef _LIBCPP_CXX03_LANG
17345a33687dSHoward Hinnant            __tree_ = __m.__tree_;
173507d3eccdSHoward Hinnant#else
173674cf6ff5SMarshall Clow            if (this != &__m) {
173707d3eccdSHoward Hinnant                __tree_.clear();
173807d3eccdSHoward Hinnant                __tree_.value_comp() = __m.__tree_.value_comp();
173907d3eccdSHoward Hinnant                __tree_.__copy_assign_alloc(__m.__tree_);
174007d3eccdSHoward Hinnant                insert(__m.begin(), __m.end());
174174cf6ff5SMarshall Clow            }
174207d3eccdSHoward Hinnant#endif
17435a33687dSHoward Hinnant            return *this;
17445a33687dSHoward Hinnant        }
17455a33687dSHoward Hinnant
174618293116SEric Fiselier#ifndef _LIBCPP_CXX03_LANG
17473e519524SHoward Hinnant
1748848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
17493e519524SHoward Hinnant    multimap(multimap&& __m)
17501052ee39SHoward Hinnant        _NOEXCEPT_(is_nothrow_move_constructible<__base>::value)
1751ce48a113SHoward Hinnant        : __tree_(_VSTD::move(__m.__tree_))
17523e519524SHoward Hinnant        {
17533e519524SHoward Hinnant        }
17543e519524SHoward Hinnant
17553e519524SHoward Hinnant    multimap(multimap&& __m, const allocator_type& __a);
17563e519524SHoward Hinnant
1757848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
175854976f26SHoward Hinnant    multimap& operator=(multimap&& __m)
175954976f26SHoward Hinnant        _NOEXCEPT_(is_nothrow_move_assignable<__base>::value)
176054976f26SHoward Hinnant        {
176154976f26SHoward Hinnant            __tree_ = _VSTD::move(__m.__tree_);
176254976f26SHoward Hinnant            return *this;
176354976f26SHoward Hinnant        }
176454976f26SHoward Hinnant
176554976f26SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
17663e519524SHoward Hinnant    multimap(initializer_list<value_type> __il, const key_compare& __comp = key_compare())
17673e519524SHoward Hinnant        : __tree_(__vc(__comp))
17683e519524SHoward Hinnant        {
17693e519524SHoward Hinnant            insert(__il.begin(), __il.end());
17703e519524SHoward Hinnant        }
17713e519524SHoward Hinnant
1772848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
17733e519524SHoward Hinnant    multimap(initializer_list<value_type> __il, const key_compare& __comp, const allocator_type& __a)
17742a10c960SMarshall Clow        : __tree_(__vc(__comp), typename __base::allocator_type(__a))
17753e519524SHoward Hinnant        {
17763e519524SHoward Hinnant            insert(__il.begin(), __il.end());
17773e519524SHoward Hinnant        }
17783e519524SHoward Hinnant
1779fbc317d4SMarshall Clow#if _LIBCPP_STD_VER > 11
1780fbc317d4SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
1781fbc317d4SMarshall Clow    multimap(initializer_list<value_type> __il, const allocator_type& __a)
1782fbc317d4SMarshall Clow        : multimap(__il, key_compare(), __a) {}
1783fbc317d4SMarshall Clow#endif
1784fbc317d4SMarshall Clow
1785848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
17863e519524SHoward Hinnant    multimap& operator=(initializer_list<value_type> __il)
17873e519524SHoward Hinnant        {
17883e519524SHoward Hinnant            __tree_.__assign_multi(__il.begin(), __il.end());
17893e519524SHoward Hinnant            return *this;
17903e519524SHoward Hinnant        }
179154976f26SHoward Hinnant
179218293116SEric Fiselier#endif  // _LIBCPP_CXX03_LANG
17933e519524SHoward Hinnant
1794848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
17953e519524SHoward Hinnant    explicit multimap(const allocator_type& __a)
17962a10c960SMarshall Clow        : __tree_(typename __base::allocator_type(__a))
17973e519524SHoward Hinnant        {
17983e519524SHoward Hinnant        }
17993e519524SHoward Hinnant
1800848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
18013e519524SHoward Hinnant    multimap(const multimap& __m, const allocator_type& __a)
18022a10c960SMarshall Clow        : __tree_(__m.__tree_.value_comp(), typename __base::allocator_type(__a))
18033e519524SHoward Hinnant        {
18043e519524SHoward Hinnant            insert(__m.begin(), __m.end());
18053e519524SHoward Hinnant        }
18063e519524SHoward Hinnant
1807848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
18081052ee39SHoward Hinnant          iterator begin() _NOEXCEPT {return __tree_.begin();}
1809848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
18101052ee39SHoward Hinnant    const_iterator begin() const _NOEXCEPT {return __tree_.begin();}
1811848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
18121052ee39SHoward Hinnant          iterator end() _NOEXCEPT {return __tree_.end();}
1813848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
18141052ee39SHoward Hinnant    const_iterator end() const _NOEXCEPT {return __tree_.end();}
18153e519524SHoward Hinnant
1816848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
18171052ee39SHoward Hinnant          reverse_iterator rbegin() _NOEXCEPT {return reverse_iterator(end());}
1818848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
18191052ee39SHoward Hinnant    const_reverse_iterator rbegin() const _NOEXCEPT
18201052ee39SHoward Hinnant        {return const_reverse_iterator(end());}
1821848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
18221052ee39SHoward Hinnant          reverse_iterator rend() _NOEXCEPT {return reverse_iterator(begin());}
1823848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
18241052ee39SHoward Hinnant    const_reverse_iterator rend() const _NOEXCEPT
18251052ee39SHoward Hinnant        {return const_reverse_iterator(begin());}
18263e519524SHoward Hinnant
1827848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
18281052ee39SHoward Hinnant    const_iterator cbegin()  const _NOEXCEPT {return begin();}
1829848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
18301052ee39SHoward Hinnant    const_iterator cend() const _NOEXCEPT {return end();}
1831848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
18321052ee39SHoward Hinnant    const_reverse_iterator crbegin() const _NOEXCEPT {return rbegin();}
1833848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
18341052ee39SHoward Hinnant    const_reverse_iterator crend() const _NOEXCEPT {return rend();}
18353e519524SHoward Hinnant
183672c8fad4SMarshall Clow    _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY
18371052ee39SHoward Hinnant    bool empty() const _NOEXCEPT {return __tree_.size() == 0;}
1838848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
18391052ee39SHoward Hinnant    size_type size() const _NOEXCEPT {return __tree_.size();}
1840848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
18411052ee39SHoward Hinnant    size_type max_size() const _NOEXCEPT {return __tree_.max_size();}
18423e519524SHoward Hinnant
1843848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
18442a10c960SMarshall Clow    allocator_type get_allocator() const _NOEXCEPT {return allocator_type(__tree_.__alloc());}
1845848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
18463e519524SHoward Hinnant    key_compare    key_comp() const {return __tree_.value_comp().key_comp();}
1847848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
18481052ee39SHoward Hinnant    value_compare  value_comp() const
18491052ee39SHoward Hinnant        {return value_compare(__tree_.value_comp().key_comp());}
18503e519524SHoward Hinnant
18515e3ea4ddSEric Fiselier#ifndef _LIBCPP_CXX03_LANG
18527609c9b6SHoward Hinnant
18538b805c91SHoward Hinnant    template <class ..._Args>
18545e3ea4ddSEric Fiselier    _LIBCPP_INLINE_VISIBILITY
18555e3ea4ddSEric Fiselier    iterator emplace(_Args&& ...__args) {
18565e3ea4ddSEric Fiselier        return __tree_.__emplace_multi(_VSTD::forward<_Args>(__args)...);
18575e3ea4ddSEric Fiselier    }
18583e519524SHoward Hinnant
18598b805c91SHoward Hinnant    template <class ..._Args>
18605e3ea4ddSEric Fiselier    _LIBCPP_INLINE_VISIBILITY
18615e3ea4ddSEric Fiselier    iterator emplace_hint(const_iterator __p, _Args&& ...__args) {
18625e3ea4ddSEric Fiselier        return __tree_.__emplace_hint_multi(__p.__i_, _VSTD::forward<_Args>(__args)...);
18635e3ea4ddSEric Fiselier    }
18647609c9b6SHoward Hinnant
1865c003db1fSHoward Hinnant    template <class _Pp,
1866c003db1fSHoward Hinnant              class = typename enable_if<is_constructible<value_type, _Pp>::value>::type>
1867848a5374SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
1868c003db1fSHoward Hinnant        iterator insert(_Pp&& __p)
1869c003db1fSHoward Hinnant            {return __tree_.__insert_multi(_VSTD::forward<_Pp>(__p));}
18703e519524SHoward Hinnant
1871c003db1fSHoward Hinnant    template <class _Pp,
1872c003db1fSHoward Hinnant              class = typename enable_if<is_constructible<value_type, _Pp>::value>::type>
1873848a5374SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
1874c003db1fSHoward Hinnant        iterator insert(const_iterator __pos, _Pp&& __p)
1875c003db1fSHoward Hinnant            {return __tree_.__insert_multi(__pos.__i_, _VSTD::forward<_Pp>(__p));}
18763e519524SHoward Hinnant
18777a9f500fSEric Fiselier    _LIBCPP_INLINE_VISIBILITY
18787a9f500fSEric Fiselier    iterator insert(value_type&& __v)
18797a9f500fSEric Fiselier        {return __tree_.__insert_multi(_VSTD::move(__v));}
18807a9f500fSEric Fiselier
18817a9f500fSEric Fiselier    _LIBCPP_INLINE_VISIBILITY
18827a9f500fSEric Fiselier    iterator insert(const_iterator __p, value_type&& __v)
18837a9f500fSEric Fiselier        {return __tree_.__insert_multi(__p.__i_, _VSTD::move(__v));}
18847a9f500fSEric Fiselier
188518293116SEric Fiselier
188618293116SEric Fiselier    _LIBCPP_INLINE_VISIBILITY
188718293116SEric Fiselier    void insert(initializer_list<value_type> __il)
188818293116SEric Fiselier        {insert(__il.begin(), __il.end());}
188918293116SEric Fiselier
18905e3ea4ddSEric Fiselier#endif  // _LIBCPP_CXX03_LANG
18913e519524SHoward Hinnant
1892848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
18933e519524SHoward Hinnant    iterator insert(const value_type& __v) {return __tree_.__insert_multi(__v);}
18943e519524SHoward Hinnant
1895848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
18963e519524SHoward Hinnant    iterator insert(const_iterator __p, const value_type& __v)
18973e519524SHoward Hinnant            {return __tree_.__insert_multi(__p.__i_, __v);}
18983e519524SHoward Hinnant
18993e519524SHoward Hinnant    template <class _InputIterator>
1900848a5374SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
19013e519524SHoward Hinnant        void insert(_InputIterator __f, _InputIterator __l)
19023e519524SHoward Hinnant        {
19033e519524SHoward Hinnant            for (const_iterator __e = cend(); __f != __l; ++__f)
19043e519524SHoward Hinnant                __tree_.__insert_multi(__e.__i_, *__f);
19053e519524SHoward Hinnant        }
19063e519524SHoward Hinnant
1907848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
19083e519524SHoward Hinnant    iterator erase(const_iterator __p) {return __tree_.erase(__p.__i_);}
1909848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
1910ec392968SMarshall Clow    iterator erase(iterator __p)       {return __tree_.erase(__p.__i_);}
1911ec392968SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
19123e519524SHoward Hinnant    size_type erase(const key_type& __k) {return __tree_.__erase_multi(__k);}
1913848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
19143e519524SHoward Hinnant    iterator  erase(const_iterator __f, const_iterator __l)
19153e519524SHoward Hinnant        {return __tree_.erase(__f.__i_, __l.__i_);}
1916b0386a51SErik Pilkington
1917b0386a51SErik Pilkington#if _LIBCPP_STD_VER > 14
1918b0386a51SErik Pilkington    _LIBCPP_INLINE_VISIBILITY
1919b0386a51SErik Pilkington    iterator insert(node_type&& __nh)
1920b0386a51SErik Pilkington    {
1921b0386a51SErik Pilkington        _LIBCPP_ASSERT(__nh.empty() || __nh.get_allocator() == get_allocator(),
1922b0386a51SErik Pilkington            "node_type with incompatible allocator passed to multimap::insert()");
1923b0386a51SErik Pilkington        return __tree_.template __node_handle_insert_multi<node_type>(
1924b0386a51SErik Pilkington            _VSTD::move(__nh));
1925b0386a51SErik Pilkington    }
1926b0386a51SErik Pilkington    _LIBCPP_INLINE_VISIBILITY
1927b0386a51SErik Pilkington    iterator insert(const_iterator __hint, node_type&& __nh)
1928b0386a51SErik Pilkington    {
1929b0386a51SErik Pilkington        _LIBCPP_ASSERT(__nh.empty() || __nh.get_allocator() == get_allocator(),
1930b0386a51SErik Pilkington            "node_type with incompatible allocator passed to multimap::insert()");
1931b0386a51SErik Pilkington        return __tree_.template __node_handle_insert_multi<node_type>(
1932b0386a51SErik Pilkington            __hint.__i_, _VSTD::move(__nh));
1933b0386a51SErik Pilkington    }
1934b0386a51SErik Pilkington    _LIBCPP_INLINE_VISIBILITY
1935b0386a51SErik Pilkington    node_type extract(key_type const& __key)
1936b0386a51SErik Pilkington    {
1937b0386a51SErik Pilkington        return __tree_.template __node_handle_extract<node_type>(__key);
1938b0386a51SErik Pilkington    }
1939b0386a51SErik Pilkington    _LIBCPP_INLINE_VISIBILITY
1940b0386a51SErik Pilkington    node_type extract(const_iterator __it)
1941b0386a51SErik Pilkington    {
1942b0386a51SErik Pilkington        return __tree_.template __node_handle_extract<node_type>(
1943b0386a51SErik Pilkington            __it.__i_);
1944b0386a51SErik Pilkington    }
1945*5c4e07aeSErik Pilkington    template <class _C2>
1946*5c4e07aeSErik Pilkington    _LIBCPP_INLINE_VISIBILITY
1947*5c4e07aeSErik Pilkington    void merge(multimap<key_type, mapped_type, _C2, allocator_type>& __source)
1948*5c4e07aeSErik Pilkington    {
1949*5c4e07aeSErik Pilkington        _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
1950*5c4e07aeSErik Pilkington                       "merging container with incompatible allocator");
1951*5c4e07aeSErik Pilkington        return __tree_.__node_handle_merge_multi(__source.__tree_);
1952*5c4e07aeSErik Pilkington    }
1953*5c4e07aeSErik Pilkington    template <class _C2>
1954*5c4e07aeSErik Pilkington    _LIBCPP_INLINE_VISIBILITY
1955*5c4e07aeSErik Pilkington    void merge(multimap<key_type, mapped_type, _C2, allocator_type>&& __source)
1956*5c4e07aeSErik Pilkington    {
1957*5c4e07aeSErik Pilkington        _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
1958*5c4e07aeSErik Pilkington                       "merging container with incompatible allocator");
1959*5c4e07aeSErik Pilkington        return __tree_.__node_handle_merge_multi(__source.__tree_);
1960*5c4e07aeSErik Pilkington    }
1961*5c4e07aeSErik Pilkington    template <class _C2>
1962*5c4e07aeSErik Pilkington    _LIBCPP_INLINE_VISIBILITY
1963*5c4e07aeSErik Pilkington    void merge(map<key_type, mapped_type, _C2, allocator_type>& __source)
1964*5c4e07aeSErik Pilkington    {
1965*5c4e07aeSErik Pilkington        _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
1966*5c4e07aeSErik Pilkington                       "merging container with incompatible allocator");
1967*5c4e07aeSErik Pilkington        return __tree_.__node_handle_merge_multi(__source.__tree_);
1968*5c4e07aeSErik Pilkington    }
1969*5c4e07aeSErik Pilkington    template <class _C2>
1970*5c4e07aeSErik Pilkington    _LIBCPP_INLINE_VISIBILITY
1971*5c4e07aeSErik Pilkington    void merge(map<key_type, mapped_type, _C2, allocator_type>&& __source)
1972*5c4e07aeSErik Pilkington    {
1973*5c4e07aeSErik Pilkington        _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
1974*5c4e07aeSErik Pilkington                       "merging container with incompatible allocator");
1975*5c4e07aeSErik Pilkington        return __tree_.__node_handle_merge_multi(__source.__tree_);
1976*5c4e07aeSErik Pilkington    }
1977b0386a51SErik Pilkington#endif
1978b0386a51SErik Pilkington
1979848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
1980934e9a39SMarshall Clow    void clear() _NOEXCEPT {__tree_.clear();}
19813e519524SHoward Hinnant
1982848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
19831052ee39SHoward Hinnant    void swap(multimap& __m)
19841052ee39SHoward Hinnant        _NOEXCEPT_(__is_nothrow_swappable<__base>::value)
19851052ee39SHoward Hinnant        {__tree_.swap(__m.__tree_);}
19863e519524SHoward Hinnant
1987848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
19883e519524SHoward Hinnant    iterator find(const key_type& __k)             {return __tree_.find(__k);}
1989848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
19903e519524SHoward Hinnant    const_iterator find(const key_type& __k) const {return __tree_.find(__k);}
19912585835cSMarshall Clow#if _LIBCPP_STD_VER > 11
19922585835cSMarshall Clow    template <typename _K2>
19932585835cSMarshall Clow    _LIBCPP_INLINE_VISIBILITY
19942585835cSMarshall Clow    typename enable_if<__is_transparent<_Compare, _K2>::value,iterator>::type
19952585835cSMarshall Clow    find(const _K2& __k)                           {return __tree_.find(__k);}
19962585835cSMarshall Clow    template <typename _K2>
19972585835cSMarshall Clow    _LIBCPP_INLINE_VISIBILITY
19982585835cSMarshall Clow    typename enable_if<__is_transparent<_Compare, _K2>::value,const_iterator>::type
19992585835cSMarshall Clow    find(const _K2& __k) const                     {return __tree_.find(__k);}
20002585835cSMarshall Clow#endif
20012585835cSMarshall Clow
2002848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
20033e519524SHoward Hinnant    size_type      count(const key_type& __k) const
20043e519524SHoward Hinnant        {return __tree_.__count_multi(__k);}
20050aacbc92SMarshall Clow#if _LIBCPP_STD_VER > 11
20060aacbc92SMarshall Clow    template <typename _K2>
20070aacbc92SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
20080aacbc92SMarshall Clow    typename enable_if<__is_transparent<_Compare, _K2>::value,size_type>::type
2009f8457a07SMarshall Clow    count(const _K2& __k) const {return __tree_.__count_multi(__k);}
20100aacbc92SMarshall Clow#endif
2011848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
20123e519524SHoward Hinnant    iterator lower_bound(const key_type& __k)
20133e519524SHoward Hinnant        {return __tree_.lower_bound(__k);}
2014848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
20153e519524SHoward Hinnant    const_iterator lower_bound(const key_type& __k) const
20163e519524SHoward Hinnant            {return __tree_.lower_bound(__k);}
20172585835cSMarshall Clow#if _LIBCPP_STD_VER > 11
20182585835cSMarshall Clow    template <typename _K2>
20192585835cSMarshall Clow    _LIBCPP_INLINE_VISIBILITY
20202585835cSMarshall Clow    typename enable_if<__is_transparent<_Compare, _K2>::value,iterator>::type
20212585835cSMarshall Clow    lower_bound(const _K2& __k)       {return __tree_.lower_bound(__k);}
20222585835cSMarshall Clow
20232585835cSMarshall Clow    template <typename _K2>
20242585835cSMarshall Clow    _LIBCPP_INLINE_VISIBILITY
20252585835cSMarshall Clow    typename enable_if<__is_transparent<_Compare, _K2>::value,const_iterator>::type
20262585835cSMarshall Clow    lower_bound(const _K2& __k) const {return __tree_.lower_bound(__k);}
20272585835cSMarshall Clow#endif
20282585835cSMarshall Clow
2029848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
20303e519524SHoward Hinnant    iterator upper_bound(const key_type& __k)
20313e519524SHoward Hinnant            {return __tree_.upper_bound(__k);}
2032848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
20333e519524SHoward Hinnant    const_iterator upper_bound(const key_type& __k) const
20343e519524SHoward Hinnant            {return __tree_.upper_bound(__k);}
20352585835cSMarshall Clow#if _LIBCPP_STD_VER > 11
20362585835cSMarshall Clow    template <typename _K2>
20372585835cSMarshall Clow    _LIBCPP_INLINE_VISIBILITY
20382585835cSMarshall Clow    typename enable_if<__is_transparent<_Compare, _K2>::value,iterator>::type
20392585835cSMarshall Clow    upper_bound(const _K2& __k)       {return __tree_.upper_bound(__k);}
20402585835cSMarshall Clow    template <typename _K2>
20412585835cSMarshall Clow    _LIBCPP_INLINE_VISIBILITY
20422585835cSMarshall Clow    typename enable_if<__is_transparent<_Compare, _K2>::value,const_iterator>::type
20432585835cSMarshall Clow    upper_bound(const _K2& __k) const {return __tree_.upper_bound(__k);}
20442585835cSMarshall Clow#endif
20452585835cSMarshall Clow
2046848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
20473e519524SHoward Hinnant    pair<iterator,iterator>             equal_range(const key_type& __k)
20483e519524SHoward Hinnant            {return __tree_.__equal_range_multi(__k);}
2049848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
20503e519524SHoward Hinnant    pair<const_iterator,const_iterator> equal_range(const key_type& __k) const
20513e519524SHoward Hinnant            {return __tree_.__equal_range_multi(__k);}
20522585835cSMarshall Clow#if _LIBCPP_STD_VER > 11
20532585835cSMarshall Clow    template <typename _K2>
20542585835cSMarshall Clow    _LIBCPP_INLINE_VISIBILITY
20552585835cSMarshall Clow    typename enable_if<__is_transparent<_Compare, _K2>::value,pair<iterator,iterator>>::type
20562585835cSMarshall Clow    equal_range(const _K2& __k)       {return __tree_.__equal_range_multi(__k);}
20572585835cSMarshall Clow    template <typename _K2>
20582585835cSMarshall Clow    _LIBCPP_INLINE_VISIBILITY
20592585835cSMarshall Clow    typename enable_if<__is_transparent<_Compare, _K2>::value,pair<const_iterator,const_iterator>>::type
20602585835cSMarshall Clow    equal_range(const _K2& __k) const {return __tree_.__equal_range_multi(__k);}
20612585835cSMarshall Clow#endif
20623e519524SHoward Hinnant
20633e519524SHoward Hinnantprivate:
20643e519524SHoward Hinnant    typedef typename __base::__node                    __node;
20653e519524SHoward Hinnant    typedef typename __base::__node_allocator          __node_allocator;
20663e519524SHoward Hinnant    typedef typename __base::__node_pointer            __node_pointer;
20670594ad71SEric Fiselier
2068c003db1fSHoward Hinnant    typedef __map_node_destructor<__node_allocator> _Dp;
2069c003db1fSHoward Hinnant    typedef unique_ptr<__node, _Dp> __node_holder;
20703e519524SHoward Hinnant};
20713e519524SHoward Hinnant
20725e3ea4ddSEric Fiselier#ifndef _LIBCPP_CXX03_LANG
20733e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator>
20743e519524SHoward Hinnantmultimap<_Key, _Tp, _Compare, _Allocator>::multimap(multimap&& __m, const allocator_type& __a)
20752a10c960SMarshall Clow    : __tree_(_VSTD::move(__m.__tree_), typename __base::allocator_type(__a))
20763e519524SHoward Hinnant{
20773e519524SHoward Hinnant    if (__a != __m.get_allocator())
20783e519524SHoward Hinnant    {
20793e519524SHoward Hinnant        const_iterator __e = cend();
20803e519524SHoward Hinnant        while (!__m.empty())
20813e519524SHoward Hinnant            __tree_.__insert_multi(__e.__i_,
2082f52318b4SErik Pilkington                    _VSTD::move(__m.__tree_.remove(__m.begin().__i_)->__value_.__move()));
20833e519524SHoward Hinnant    }
20843e519524SHoward Hinnant}
20855e3ea4ddSEric Fiselier#endif
20863e519524SHoward Hinnant
20873e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator>
2088848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
20893e519524SHoward Hinnantbool
20903e519524SHoward Hinnantoperator==(const multimap<_Key, _Tp, _Compare, _Allocator>& __x,
20913e519524SHoward Hinnant           const multimap<_Key, _Tp, _Compare, _Allocator>& __y)
20923e519524SHoward Hinnant{
2093ce48a113SHoward Hinnant    return __x.size() == __y.size() && _VSTD::equal(__x.begin(), __x.end(), __y.begin());
20943e519524SHoward Hinnant}
20953e519524SHoward Hinnant
20963e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator>
2097848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
20983e519524SHoward Hinnantbool
20993e519524SHoward Hinnantoperator< (const multimap<_Key, _Tp, _Compare, _Allocator>& __x,
21003e519524SHoward Hinnant           const multimap<_Key, _Tp, _Compare, _Allocator>& __y)
21013e519524SHoward Hinnant{
2102ce48a113SHoward Hinnant    return _VSTD::lexicographical_compare(__x.begin(), __x.end(), __y.begin(), __y.end());
21033e519524SHoward Hinnant}
21043e519524SHoward Hinnant
21053e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator>
2106848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
21073e519524SHoward Hinnantbool
21083e519524SHoward Hinnantoperator!=(const multimap<_Key, _Tp, _Compare, _Allocator>& __x,
21093e519524SHoward Hinnant           const multimap<_Key, _Tp, _Compare, _Allocator>& __y)
21103e519524SHoward Hinnant{
21113e519524SHoward Hinnant    return !(__x == __y);
21123e519524SHoward Hinnant}
21133e519524SHoward Hinnant
21143e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator>
2115848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
21163e519524SHoward Hinnantbool
21173e519524SHoward Hinnantoperator> (const multimap<_Key, _Tp, _Compare, _Allocator>& __x,
21183e519524SHoward Hinnant           const multimap<_Key, _Tp, _Compare, _Allocator>& __y)
21193e519524SHoward Hinnant{
21203e519524SHoward Hinnant    return __y < __x;
21213e519524SHoward Hinnant}
21223e519524SHoward Hinnant
21233e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator>
2124848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
21253e519524SHoward Hinnantbool
21263e519524SHoward Hinnantoperator>=(const multimap<_Key, _Tp, _Compare, _Allocator>& __x,
21273e519524SHoward Hinnant           const multimap<_Key, _Tp, _Compare, _Allocator>& __y)
21283e519524SHoward Hinnant{
21293e519524SHoward Hinnant    return !(__x < __y);
21303e519524SHoward Hinnant}
21313e519524SHoward Hinnant
21323e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator>
2133848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
21343e519524SHoward Hinnantbool
21353e519524SHoward Hinnantoperator<=(const multimap<_Key, _Tp, _Compare, _Allocator>& __x,
21363e519524SHoward Hinnant           const multimap<_Key, _Tp, _Compare, _Allocator>& __y)
21373e519524SHoward Hinnant{
21383e519524SHoward Hinnant    return !(__y < __x);
21393e519524SHoward Hinnant}
21403e519524SHoward Hinnant
21413e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator>
2142848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
21433e519524SHoward Hinnantvoid
21443e519524SHoward Hinnantswap(multimap<_Key, _Tp, _Compare, _Allocator>& __x,
21453e519524SHoward Hinnant     multimap<_Key, _Tp, _Compare, _Allocator>& __y)
21461052ee39SHoward Hinnant    _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
21473e519524SHoward Hinnant{
21483e519524SHoward Hinnant    __x.swap(__y);
21493e519524SHoward Hinnant}
21503e519524SHoward Hinnant
21513e519524SHoward Hinnant_LIBCPP_END_NAMESPACE_STD
21523e519524SHoward Hinnant
21533e519524SHoward Hinnant#endif  // _LIBCPP_MAP
2154