xref: /llvm-project-15.0.7/libcxx/include/map (revision e2f2d1ed)
13e519524SHoward Hinnant// -*- C++ -*-
23e519524SHoward Hinnant//===----------------------------- map ------------------------------------===//
33e519524SHoward Hinnant//
45b08a8a4SHoward Hinnant//                     The LLVM Compiler Infrastructure
53e519524SHoward Hinnant//
6412dbebeSHoward Hinnant// This file is dual licensed under the MIT and the University of Illinois Open
7412dbebeSHoward Hinnant// Source Licenses. See LICENSE.TXT for details.
83e519524SHoward Hinnant//
93e519524SHoward Hinnant//===----------------------------------------------------------------------===//
103e519524SHoward Hinnant
113e519524SHoward Hinnant#ifndef _LIBCPP_MAP
123e519524SHoward Hinnant#define _LIBCPP_MAP
133e519524SHoward Hinnant
143e519524SHoward Hinnant/*
153e519524SHoward Hinnant
163e519524SHoward Hinnant    map synopsis
173e519524SHoward Hinnant
183e519524SHoward Hinnantnamespace std
193e519524SHoward Hinnant{
203e519524SHoward Hinnant
213e519524SHoward Hinnanttemplate <class Key, class T, class Compare = less<Key>,
223e519524SHoward Hinnant          class Allocator = allocator<pair<const Key, T>>>
233e519524SHoward Hinnantclass map
243e519524SHoward Hinnant{
253e519524SHoward Hinnantpublic:
263e519524SHoward Hinnant    // types:
273e519524SHoward Hinnant    typedef Key                                      key_type;
283e519524SHoward Hinnant    typedef T                                        mapped_type;
293e519524SHoward Hinnant    typedef pair<const key_type, mapped_type>        value_type;
303e519524SHoward Hinnant    typedef Compare                                  key_compare;
313e519524SHoward Hinnant    typedef Allocator                                allocator_type;
323e519524SHoward Hinnant    typedef typename allocator_type::reference       reference;
333e519524SHoward Hinnant    typedef typename allocator_type::const_reference const_reference;
343e519524SHoward Hinnant    typedef typename allocator_type::pointer         pointer;
353e519524SHoward Hinnant    typedef typename allocator_type::const_pointer   const_pointer;
363e519524SHoward Hinnant    typedef typename allocator_type::size_type       size_type;
373e519524SHoward Hinnant    typedef typename allocator_type::difference_type difference_type;
383e519524SHoward Hinnant
393e519524SHoward Hinnant    typedef implementation-defined                   iterator;
403e519524SHoward Hinnant    typedef implementation-defined                   const_iterator;
413e519524SHoward Hinnant    typedef std::reverse_iterator<iterator>          reverse_iterator;
423e519524SHoward Hinnant    typedef std::reverse_iterator<const_iterator>    const_reverse_iterator;
433e519524SHoward Hinnant
443e519524SHoward Hinnant    class value_compare
453e519524SHoward Hinnant        : public binary_function<value_type, value_type, bool>
463e519524SHoward Hinnant    {
473e519524SHoward Hinnant        friend class map;
483e519524SHoward Hinnant    protected:
493e519524SHoward Hinnant        key_compare comp;
503e519524SHoward Hinnant
513e519524SHoward Hinnant        value_compare(key_compare c);
523e519524SHoward Hinnant    public:
533e519524SHoward Hinnant        bool operator()(const value_type& x, const value_type& y) const;
543e519524SHoward Hinnant    };
553e519524SHoward Hinnant
563e519524SHoward Hinnant    // construct/copy/destroy:
571052ee39SHoward Hinnant    map()
581052ee39SHoward Hinnant        noexcept(
591052ee39SHoward Hinnant            is_nothrow_default_constructible<allocator_type>::value &&
601052ee39SHoward Hinnant            is_nothrow_default_constructible<key_compare>::value &&
611052ee39SHoward Hinnant            is_nothrow_copy_constructible<key_compare>::value);
623e519524SHoward Hinnant    explicit map(const key_compare& comp);
633e519524SHoward Hinnant    map(const key_compare& comp, const allocator_type& a);
643e519524SHoward Hinnant    template <class InputIterator>
653e519524SHoward Hinnant        map(InputIterator first, InputIterator last,
663e519524SHoward Hinnant            const key_compare& comp = key_compare());
673e519524SHoward Hinnant    template <class InputIterator>
683e519524SHoward Hinnant        map(InputIterator first, InputIterator last,
693e519524SHoward Hinnant            const key_compare& comp, const allocator_type& a);
703e519524SHoward Hinnant    map(const map& m);
711052ee39SHoward Hinnant    map(map&& m)
721052ee39SHoward Hinnant        noexcept(
731052ee39SHoward Hinnant            is_nothrow_move_constructible<allocator_type>::value &&
741052ee39SHoward Hinnant            is_nothrow_move_constructible<key_compare>::value);
753e519524SHoward Hinnant    explicit map(const allocator_type& a);
763e519524SHoward Hinnant    map(const map& m, const allocator_type& a);
773e519524SHoward Hinnant    map(map&& m, const allocator_type& a);
783e519524SHoward Hinnant    map(initializer_list<value_type> il, const key_compare& comp = key_compare());
793e519524SHoward Hinnant    map(initializer_list<value_type> il, const key_compare& comp, const allocator_type& a);
80fbc317d4SMarshall Clow    template <class InputIterator>
81fbc317d4SMarshall Clow        map(InputIterator first, InputIterator last, const allocator_type& a)
82fbc317d4SMarshall Clow            : map(first, last, Compare(), a) {}  // C++14
83fbc317d4SMarshall Clow    map(initializer_list<value_type> il, const allocator_type& a)
84fbc317d4SMarshall Clow        : map(il, Compare(), a) {}  // C++14
853e519524SHoward Hinnant   ~map();
863e519524SHoward Hinnant
873e519524SHoward Hinnant    map& operator=(const map& m);
881052ee39SHoward Hinnant    map& operator=(map&& m)
891052ee39SHoward Hinnant        noexcept(
901052ee39SHoward Hinnant            allocator_type::propagate_on_container_move_assignment::value &&
911052ee39SHoward Hinnant            is_nothrow_move_assignable<allocator_type>::value &&
920e9f71c1SHoward Hinnant            is_nothrow_move_assignable<key_compare>::value);
933e519524SHoward Hinnant    map& operator=(initializer_list<value_type> il);
943e519524SHoward Hinnant
953e519524SHoward Hinnant    // iterators:
960e9f71c1SHoward Hinnant          iterator begin() noexcept;
970e9f71c1SHoward Hinnant    const_iterator begin() const noexcept;
980e9f71c1SHoward Hinnant          iterator end() noexcept;
990e9f71c1SHoward Hinnant    const_iterator end()   const noexcept;
1003e519524SHoward Hinnant
1010e9f71c1SHoward Hinnant          reverse_iterator rbegin() noexcept;
1020e9f71c1SHoward Hinnant    const_reverse_iterator rbegin() const noexcept;
1030e9f71c1SHoward Hinnant          reverse_iterator rend() noexcept;
1040e9f71c1SHoward Hinnant    const_reverse_iterator rend()   const noexcept;
1053e519524SHoward Hinnant
1060e9f71c1SHoward Hinnant    const_iterator         cbegin()  const noexcept;
1070e9f71c1SHoward Hinnant    const_iterator         cend()    const noexcept;
1080e9f71c1SHoward Hinnant    const_reverse_iterator crbegin() const noexcept;
1090e9f71c1SHoward Hinnant    const_reverse_iterator crend()   const noexcept;
1103e519524SHoward Hinnant
1113e519524SHoward Hinnant    // capacity:
1120e9f71c1SHoward Hinnant    bool      empty()    const noexcept;
1130e9f71c1SHoward Hinnant    size_type size()     const noexcept;
1140e9f71c1SHoward Hinnant    size_type max_size() const noexcept;
1153e519524SHoward Hinnant
1163e519524SHoward Hinnant    // element access:
1173e519524SHoward Hinnant    mapped_type& operator[](const key_type& k);
1183e519524SHoward Hinnant    mapped_type& operator[](key_type&& k);
1193e519524SHoward Hinnant
1203e519524SHoward Hinnant          mapped_type& at(const key_type& k);
1213e519524SHoward Hinnant    const mapped_type& at(const key_type& k) const;
1223e519524SHoward Hinnant
1233e519524SHoward Hinnant    // modifiers:
1243e519524SHoward Hinnant    template <class... Args>
1253e519524SHoward Hinnant        pair<iterator, bool> emplace(Args&&... args);
1263e519524SHoward Hinnant    template <class... Args>
1273e519524SHoward Hinnant        iterator emplace_hint(const_iterator position, Args&&... args);
1283e519524SHoward Hinnant    pair<iterator, bool> insert(const value_type& v);
129afc9ff99SMarshall Clow    pair<iterator, bool> insert(      value_type&& v);                                // C++17
1303e519524SHoward Hinnant    template <class P>
1313e519524SHoward Hinnant        pair<iterator, bool> insert(P&& p);
1323e519524SHoward Hinnant    iterator insert(const_iterator position, const value_type& v);
133afc9ff99SMarshall Clow    iterator insert(const_iterator position,       value_type&& v);                   // C++17
1343e519524SHoward Hinnant    template <class P>
1353e519524SHoward Hinnant        iterator insert(const_iterator position, P&& p);
1363e519524SHoward Hinnant    template <class InputIterator>
1373e519524SHoward Hinnant        void insert(InputIterator first, InputIterator last);
1383e519524SHoward Hinnant    void insert(initializer_list<value_type> il);
1393e519524SHoward Hinnant
1408aaf517dSMarshall Clow    template <class... Args>
1418aaf517dSMarshall Clow        pair<iterator, bool> try_emplace(const key_type& k, Args&&... args);          // C++17
1428aaf517dSMarshall Clow    template <class... Args>
1438aaf517dSMarshall Clow        pair<iterator, bool> try_emplace(key_type&& k, Args&&... args);               // C++17
1448aaf517dSMarshall Clow    template <class... Args>
1458aaf517dSMarshall Clow        iterator try_emplace(const_iterator hint, const key_type& k, Args&&... args); // C++17
1468aaf517dSMarshall Clow    template <class... Args>
1478aaf517dSMarshall Clow        iterator try_emplace(const_iterator hint, key_type&& k, Args&&... args);      // C++17
1488aaf517dSMarshall Clow    template <class M>
1498aaf517dSMarshall Clow        pair<iterator, bool> insert_or_assign(const key_type& k, M&& obj);            // C++17
1508aaf517dSMarshall Clow    template <class M>
1518aaf517dSMarshall Clow        pair<iterator, bool> insert_or_assign(key_type&& k, M&& obj);                 // C++17
1528aaf517dSMarshall Clow    template <class M>
1538aaf517dSMarshall Clow        iterator insert_or_assign(const_iterator hint, const key_type& k, M&& obj);   // C++17
1548aaf517dSMarshall Clow    template <class M>
1558aaf517dSMarshall Clow        iterator insert_or_assign(const_iterator hint, key_type&& k, M&& obj);        // C++17
1568aaf517dSMarshall Clow
1573e519524SHoward Hinnant    iterator  erase(const_iterator position);
158ec392968SMarshall Clow    iterator  erase(iterator position); // C++14
1593e519524SHoward Hinnant    size_type erase(const key_type& k);
1603e519524SHoward Hinnant    iterator  erase(const_iterator first, const_iterator last);
1610e9f71c1SHoward Hinnant    void clear() noexcept;
1623e519524SHoward Hinnant
1631052ee39SHoward Hinnant    void swap(map& m)
164e3fbe143SMarshall Clow        noexcept(allocator_traits<allocator_type>::is_always_equal::value &&
165f07dd8d0SEric Fiselier            is_nothrow_swappable<key_compare>::value); // C++17
1663e519524SHoward Hinnant
1673e519524SHoward Hinnant    // observers:
1680e9f71c1SHoward Hinnant    allocator_type get_allocator() const noexcept;
1693e519524SHoward Hinnant    key_compare    key_comp()      const;
1703e519524SHoward Hinnant    value_compare  value_comp()    const;
1713e519524SHoward Hinnant
1723e519524SHoward Hinnant    // map operations:
1733e519524SHoward Hinnant          iterator find(const key_type& k);
1743e519524SHoward Hinnant    const_iterator find(const key_type& k) const;
1752585835cSMarshall Clow    template<typename K>
1762585835cSMarshall Clow        iterator find(const K& x);              // C++14
1772585835cSMarshall Clow    template<typename K>
1782585835cSMarshall Clow        const_iterator find(const K& x) const;  // C++14
1792585835cSMarshall Clow    template<typename K>
1800aacbc92SMarshall Clow      size_type count(const K& x) const;        // C++14
1812585835cSMarshall Clow
1823e519524SHoward Hinnant    size_type      count(const key_type& k) const;
1833e519524SHoward Hinnant          iterator lower_bound(const key_type& k);
1843e519524SHoward Hinnant    const_iterator lower_bound(const key_type& k) const;
1852585835cSMarshall Clow    template<typename K>
1862585835cSMarshall Clow        iterator lower_bound(const K& x);              // C++14
1872585835cSMarshall Clow    template<typename K>
1882585835cSMarshall Clow        const_iterator lower_bound(const K& x) const;  // C++14
1892585835cSMarshall Clow
1903e519524SHoward Hinnant          iterator upper_bound(const key_type& k);
1913e519524SHoward Hinnant    const_iterator upper_bound(const key_type& k) const;
1922585835cSMarshall Clow    template<typename K>
1932585835cSMarshall Clow        iterator upper_bound(const K& x);              // C++14
1942585835cSMarshall Clow    template<typename K>
1952585835cSMarshall Clow        const_iterator upper_bound(const K& x) const;  // C++14
1962585835cSMarshall Clow
1973e519524SHoward Hinnant    pair<iterator,iterator>             equal_range(const key_type& k);
1983e519524SHoward Hinnant    pair<const_iterator,const_iterator> equal_range(const key_type& k) const;
1992585835cSMarshall Clow    template<typename K>
2002585835cSMarshall Clow        pair<iterator,iterator>             equal_range(const K& x);        // C++14
2012585835cSMarshall Clow    template<typename K>
2022585835cSMarshall Clow        pair<const_iterator,const_iterator> equal_range(const K& x) const;  // C++14
2033e519524SHoward Hinnant};
2043e519524SHoward Hinnant
2053e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator>
2063e519524SHoward Hinnantbool
2073e519524SHoward Hinnantoperator==(const map<Key, T, Compare, Allocator>& x,
2083e519524SHoward Hinnant           const map<Key, T, Compare, Allocator>& y);
2093e519524SHoward Hinnant
2103e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator>
2113e519524SHoward Hinnantbool
2123e519524SHoward Hinnantoperator< (const map<Key, T, Compare, Allocator>& x,
2133e519524SHoward Hinnant           const map<Key, T, Compare, Allocator>& y);
2143e519524SHoward Hinnant
2153e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator>
2163e519524SHoward Hinnantbool
2173e519524SHoward Hinnantoperator!=(const map<Key, T, Compare, Allocator>& x,
2183e519524SHoward Hinnant           const map<Key, T, Compare, Allocator>& y);
2193e519524SHoward Hinnant
2203e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator>
2213e519524SHoward Hinnantbool
2223e519524SHoward Hinnantoperator> (const map<Key, T, Compare, Allocator>& x,
2233e519524SHoward Hinnant           const map<Key, T, Compare, Allocator>& y);
2243e519524SHoward Hinnant
2253e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator>
2263e519524SHoward Hinnantbool
2273e519524SHoward Hinnantoperator>=(const map<Key, T, Compare, Allocator>& x,
2283e519524SHoward Hinnant           const map<Key, T, Compare, Allocator>& y);
2293e519524SHoward Hinnant
2303e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator>
2313e519524SHoward Hinnantbool
2323e519524SHoward Hinnantoperator<=(const map<Key, T, Compare, Allocator>& x,
2333e519524SHoward Hinnant           const map<Key, T, Compare, Allocator>& y);
2343e519524SHoward Hinnant
2353e519524SHoward Hinnant// specialized algorithms:
2363e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator>
2373e519524SHoward Hinnantvoid
2381052ee39SHoward Hinnantswap(map<Key, T, Compare, Allocator>& x, map<Key, T, Compare, Allocator>& y)
2391052ee39SHoward Hinnant    noexcept(noexcept(x.swap(y)));
2403e519524SHoward Hinnant
2413e519524SHoward Hinnanttemplate <class Key, class T, class Compare = less<Key>,
2423e519524SHoward Hinnant          class Allocator = allocator<pair<const Key, T>>>
2433e519524SHoward Hinnantclass multimap
2443e519524SHoward Hinnant{
2453e519524SHoward Hinnantpublic:
2463e519524SHoward Hinnant    // types:
2473e519524SHoward Hinnant    typedef Key                                      key_type;
2483e519524SHoward Hinnant    typedef T                                        mapped_type;
2493e519524SHoward Hinnant    typedef pair<const key_type,mapped_type>         value_type;
2503e519524SHoward Hinnant    typedef Compare                                  key_compare;
2513e519524SHoward Hinnant    typedef Allocator                                allocator_type;
2523e519524SHoward Hinnant    typedef typename allocator_type::reference       reference;
2533e519524SHoward Hinnant    typedef typename allocator_type::const_reference const_reference;
2543e519524SHoward Hinnant    typedef typename allocator_type::size_type       size_type;
2553e519524SHoward Hinnant    typedef typename allocator_type::difference_type difference_type;
2563e519524SHoward Hinnant    typedef typename allocator_type::pointer         pointer;
2573e519524SHoward Hinnant    typedef typename allocator_type::const_pointer   const_pointer;
2583e519524SHoward Hinnant
2593e519524SHoward Hinnant    typedef implementation-defined                   iterator;
2603e519524SHoward Hinnant    typedef implementation-defined                   const_iterator;
2613e519524SHoward Hinnant    typedef std::reverse_iterator<iterator>          reverse_iterator;
2623e519524SHoward Hinnant    typedef std::reverse_iterator<const_iterator>    const_reverse_iterator;
2633e519524SHoward Hinnant
2643e519524SHoward Hinnant    class value_compare
2653e519524SHoward Hinnant        : public binary_function<value_type,value_type,bool>
2663e519524SHoward Hinnant    {
2673e519524SHoward Hinnant        friend class multimap;
2683e519524SHoward Hinnant    protected:
2693e519524SHoward Hinnant        key_compare comp;
2703e519524SHoward Hinnant        value_compare(key_compare c);
2713e519524SHoward Hinnant    public:
2723e519524SHoward Hinnant        bool operator()(const value_type& x, const value_type& y) const;
2733e519524SHoward Hinnant    };
2743e519524SHoward Hinnant
2753e519524SHoward Hinnant    // construct/copy/destroy:
2761052ee39SHoward Hinnant    multimap()
2771052ee39SHoward Hinnant        noexcept(
2781052ee39SHoward Hinnant            is_nothrow_default_constructible<allocator_type>::value &&
2791052ee39SHoward Hinnant            is_nothrow_default_constructible<key_compare>::value &&
2801052ee39SHoward Hinnant            is_nothrow_copy_constructible<key_compare>::value);
2811052ee39SHoward Hinnant    explicit multimap(const key_compare& comp);
2823e519524SHoward Hinnant    multimap(const key_compare& comp, const allocator_type& a);
2833e519524SHoward Hinnant    template <class InputIterator>
2843e519524SHoward Hinnant        multimap(InputIterator first, InputIterator last, const key_compare& comp);
2853e519524SHoward Hinnant    template <class InputIterator>
2863e519524SHoward Hinnant        multimap(InputIterator first, InputIterator last, const key_compare& comp,
2873e519524SHoward Hinnant                 const allocator_type& a);
2883e519524SHoward Hinnant    multimap(const multimap& m);
2891052ee39SHoward Hinnant    multimap(multimap&& m)
2901052ee39SHoward Hinnant        noexcept(
2911052ee39SHoward Hinnant            is_nothrow_move_constructible<allocator_type>::value &&
2921052ee39SHoward Hinnant            is_nothrow_move_constructible<key_compare>::value);
2933e519524SHoward Hinnant    explicit multimap(const allocator_type& a);
2943e519524SHoward Hinnant    multimap(const multimap& m, const allocator_type& a);
2953e519524SHoward Hinnant    multimap(multimap&& m, const allocator_type& a);
2963e519524SHoward Hinnant    multimap(initializer_list<value_type> il, const key_compare& comp = key_compare());
2973e519524SHoward Hinnant    multimap(initializer_list<value_type> il, const key_compare& comp,
2983e519524SHoward Hinnant             const allocator_type& a);
299fbc317d4SMarshall Clow    template <class InputIterator>
300fbc317d4SMarshall Clow        multimap(InputIterator first, InputIterator last, const allocator_type& a)
301fbc317d4SMarshall Clow            : multimap(first, last, Compare(), a) {} // C++14
302fbc317d4SMarshall Clow    multimap(initializer_list<value_type> il, const allocator_type& a)
303fbc317d4SMarshall Clow        : multimap(il, Compare(), a) {} // C++14
3043e519524SHoward Hinnant    ~multimap();
3053e519524SHoward Hinnant
3063e519524SHoward Hinnant    multimap& operator=(const multimap& m);
3071052ee39SHoward Hinnant    multimap& operator=(multimap&& m)
3081052ee39SHoward Hinnant        noexcept(
3091052ee39SHoward Hinnant            allocator_type::propagate_on_container_move_assignment::value &&
3101052ee39SHoward Hinnant            is_nothrow_move_assignable<allocator_type>::value &&
3110e9f71c1SHoward Hinnant            is_nothrow_move_assignable<key_compare>::value);
3123e519524SHoward Hinnant    multimap& operator=(initializer_list<value_type> il);
3133e519524SHoward Hinnant
3143e519524SHoward Hinnant    // iterators:
3150e9f71c1SHoward Hinnant          iterator begin() noexcept;
3160e9f71c1SHoward Hinnant    const_iterator begin() const noexcept;
3170e9f71c1SHoward Hinnant          iterator end() noexcept;
3180e9f71c1SHoward Hinnant    const_iterator end()   const noexcept;
3193e519524SHoward Hinnant
3200e9f71c1SHoward Hinnant          reverse_iterator rbegin() noexcept;
3210e9f71c1SHoward Hinnant    const_reverse_iterator rbegin() const noexcept;
3220e9f71c1SHoward Hinnant          reverse_iterator rend() noexcept;
3230e9f71c1SHoward Hinnant    const_reverse_iterator rend()   const noexcept;
3243e519524SHoward Hinnant
3250e9f71c1SHoward Hinnant    const_iterator         cbegin()  const noexcept;
3260e9f71c1SHoward Hinnant    const_iterator         cend()    const noexcept;
3270e9f71c1SHoward Hinnant    const_reverse_iterator crbegin() const noexcept;
3280e9f71c1SHoward Hinnant    const_reverse_iterator crend()   const noexcept;
3293e519524SHoward Hinnant
3303e519524SHoward Hinnant    // capacity:
3310e9f71c1SHoward Hinnant    bool      empty()    const noexcept;
3320e9f71c1SHoward Hinnant    size_type size()     const noexcept;
3330e9f71c1SHoward Hinnant    size_type max_size() const noexcept;
3343e519524SHoward Hinnant
3353e519524SHoward Hinnant    // modifiers:
3363e519524SHoward Hinnant    template <class... Args>
3373e519524SHoward Hinnant        iterator emplace(Args&&... args);
3383e519524SHoward Hinnant    template <class... Args>
3393e519524SHoward Hinnant        iterator emplace_hint(const_iterator position, Args&&... args);
3403e519524SHoward Hinnant    iterator insert(const value_type& v);
341afc9ff99SMarshall Clow    iterator insert(      value_type&& v);                                            // C++17
3423e519524SHoward Hinnant    template <class P>
3433e519524SHoward Hinnant        iterator insert(P&& p);
3443e519524SHoward Hinnant    iterator insert(const_iterator position, const value_type& v);
345afc9ff99SMarshall Clow    iterator insert(const_iterator position,       value_type&& v);                   // C++17
3463e519524SHoward Hinnant    template <class P>
3473e519524SHoward Hinnant        iterator insert(const_iterator position, P&& p);
3483e519524SHoward Hinnant    template <class InputIterator>
3493e519524SHoward Hinnant        void insert(InputIterator first, InputIterator last);
3503e519524SHoward Hinnant    void insert(initializer_list<value_type> il);
3513e519524SHoward Hinnant
3523e519524SHoward Hinnant    iterator  erase(const_iterator position);
353ec392968SMarshall Clow    iterator  erase(iterator position); // C++14
3543e519524SHoward Hinnant    size_type erase(const key_type& k);
3553e519524SHoward Hinnant    iterator  erase(const_iterator first, const_iterator last);
3560e9f71c1SHoward Hinnant    void clear() noexcept;
3573e519524SHoward Hinnant
3581052ee39SHoward Hinnant    void swap(multimap& m)
359e3fbe143SMarshall Clow        noexcept(allocator_traits<allocator_type>::is_always_equal::value &&
360f07dd8d0SEric Fiselier            is_nothrow_swappable<key_compare>::value); // C++17
3613e519524SHoward Hinnant
3623e519524SHoward Hinnant    // observers:
3630e9f71c1SHoward Hinnant    allocator_type get_allocator() const noexcept;
3643e519524SHoward Hinnant    key_compare    key_comp()      const;
3653e519524SHoward Hinnant    value_compare  value_comp()    const;
3663e519524SHoward Hinnant
3673e519524SHoward Hinnant    // map operations:
3683e519524SHoward Hinnant          iterator find(const key_type& k);
3693e519524SHoward Hinnant    const_iterator find(const key_type& k) const;
3702585835cSMarshall Clow    template<typename K>
3712585835cSMarshall Clow        iterator find(const K& x);              // C++14
3722585835cSMarshall Clow    template<typename K>
3732585835cSMarshall Clow        const_iterator find(const K& x) const;  // C++14
3742585835cSMarshall Clow    template<typename K>
3750aacbc92SMarshall Clow      size_type count(const K& x) const;        // C++14
3762585835cSMarshall Clow
3773e519524SHoward Hinnant    size_type      count(const key_type& k) const;
3783e519524SHoward Hinnant          iterator lower_bound(const key_type& k);
3793e519524SHoward Hinnant    const_iterator lower_bound(const key_type& k) const;
3802585835cSMarshall Clow    template<typename K>
3812585835cSMarshall Clow        iterator lower_bound(const K& x);              // C++14
3822585835cSMarshall Clow    template<typename K>
3832585835cSMarshall Clow        const_iterator lower_bound(const K& x) const;  // C++14
3842585835cSMarshall Clow
3853e519524SHoward Hinnant          iterator upper_bound(const key_type& k);
3863e519524SHoward Hinnant    const_iterator upper_bound(const key_type& k) const;
3872585835cSMarshall Clow    template<typename K>
3882585835cSMarshall Clow        iterator upper_bound(const K& x);              // C++14
3892585835cSMarshall Clow    template<typename K>
3902585835cSMarshall Clow        const_iterator upper_bound(const K& x) const;  // C++14
3912585835cSMarshall Clow
3923e519524SHoward Hinnant    pair<iterator,iterator>             equal_range(const key_type& k);
3933e519524SHoward Hinnant    pair<const_iterator,const_iterator> equal_range(const key_type& k) const;
3942585835cSMarshall Clow    template<typename K>
3952585835cSMarshall Clow        pair<iterator,iterator>             equal_range(const K& x);        // C++14
3962585835cSMarshall Clow    template<typename K>
3972585835cSMarshall Clow        pair<const_iterator,const_iterator> equal_range(const K& x) const;  // C++14
3983e519524SHoward Hinnant};
3993e519524SHoward Hinnant
4003e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator>
4013e519524SHoward Hinnantbool
4023e519524SHoward Hinnantoperator==(const multimap<Key, T, Compare, Allocator>& x,
4033e519524SHoward Hinnant           const multimap<Key, T, Compare, Allocator>& y);
4043e519524SHoward Hinnant
4053e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator>
4063e519524SHoward Hinnantbool
4073e519524SHoward Hinnantoperator< (const multimap<Key, T, Compare, Allocator>& x,
4083e519524SHoward Hinnant           const multimap<Key, T, Compare, Allocator>& y);
4093e519524SHoward Hinnant
4103e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator>
4113e519524SHoward Hinnantbool
4123e519524SHoward Hinnantoperator!=(const multimap<Key, T, Compare, Allocator>& x,
4133e519524SHoward Hinnant           const multimap<Key, T, Compare, Allocator>& y);
4143e519524SHoward Hinnant
4153e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator>
4163e519524SHoward Hinnantbool
4173e519524SHoward Hinnantoperator> (const multimap<Key, T, Compare, Allocator>& x,
4183e519524SHoward Hinnant           const multimap<Key, T, Compare, Allocator>& y);
4193e519524SHoward Hinnant
4203e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator>
4213e519524SHoward Hinnantbool
4223e519524SHoward Hinnantoperator>=(const multimap<Key, T, Compare, Allocator>& x,
4233e519524SHoward Hinnant           const multimap<Key, T, Compare, Allocator>& y);
4243e519524SHoward Hinnant
4253e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator>
4263e519524SHoward Hinnantbool
4273e519524SHoward Hinnantoperator<=(const multimap<Key, T, Compare, Allocator>& x,
4283e519524SHoward Hinnant           const multimap<Key, T, Compare, Allocator>& y);
4293e519524SHoward Hinnant
4303e519524SHoward Hinnant// specialized algorithms:
4313e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator>
4323e519524SHoward Hinnantvoid
4333e519524SHoward Hinnantswap(multimap<Key, T, Compare, Allocator>& x,
4341052ee39SHoward Hinnant     multimap<Key, T, Compare, Allocator>& y)
4351052ee39SHoward Hinnant    noexcept(noexcept(x.swap(y)));
4363e519524SHoward Hinnant
4373e519524SHoward Hinnant}  // std
4383e519524SHoward Hinnant
4393e519524SHoward Hinnant*/
4403e519524SHoward Hinnant
4413e519524SHoward Hinnant#include <__config>
4423e519524SHoward Hinnant#include <__tree>
4433e519524SHoward Hinnant#include <iterator>
4443e519524SHoward Hinnant#include <memory>
4453e519524SHoward Hinnant#include <utility>
4463e519524SHoward Hinnant#include <functional>
4473e519524SHoward Hinnant#include <initializer_list>
448ee187e24SEric Fiselier#include <type_traits>
4493e519524SHoward Hinnant
450073458b1SHoward Hinnant#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
4513e519524SHoward Hinnant#pragma GCC system_header
452073458b1SHoward Hinnant#endif
4533e519524SHoward Hinnant
4543e519524SHoward Hinnant_LIBCPP_BEGIN_NAMESPACE_STD
4553e519524SHoward Hinnant
456ee187e24SEric Fiseliertemplate <class _Key, class _CP, class _Compare,
457ee187e24SEric Fiselier          bool = is_empty<_Compare>::value && !__libcpp_is_final<_Compare>::value
45842b8bb50SHoward Hinnant         >
4593e519524SHoward Hinnantclass __map_value_compare
4603e519524SHoward Hinnant    : private _Compare
4613e519524SHoward Hinnant{
4623e519524SHoward Hinnantpublic:
463848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
4641052ee39SHoward Hinnant    __map_value_compare()
4651052ee39SHoward Hinnant        _NOEXCEPT_(is_nothrow_default_constructible<_Compare>::value)
4661052ee39SHoward Hinnant        : _Compare() {}
467848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
4681052ee39SHoward Hinnant    __map_value_compare(_Compare c)
4691052ee39SHoward Hinnant        _NOEXCEPT_(is_nothrow_copy_constructible<_Compare>::value)
4701052ee39SHoward Hinnant        : _Compare(c) {}
471848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
4721052ee39SHoward Hinnant    const _Compare& key_comp() const _NOEXCEPT {return *this;}
473848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
4743e519524SHoward Hinnant    bool operator()(const _CP& __x, const _CP& __y) const
475abb160e6SHoward Hinnant        {return static_cast<const _Compare&>(*this)(__x.__cc.first, __y.__cc.first);}
476848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
4773e519524SHoward Hinnant    bool operator()(const _CP& __x, const _Key& __y) const
478abb160e6SHoward Hinnant        {return static_cast<const _Compare&>(*this)(__x.__cc.first, __y);}
479848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
4803e519524SHoward Hinnant    bool operator()(const _Key& __x, const _CP& __y) const
481abb160e6SHoward Hinnant        {return static_cast<const _Compare&>(*this)(__x, __y.__cc.first);}
482e3fbe143SMarshall Clow    void swap(__map_value_compare&__y)
483e3fbe143SMarshall Clow        _NOEXCEPT_(__is_nothrow_swappable<_Compare>::value)
484e3fbe143SMarshall Clow    {
485e3fbe143SMarshall Clow        using _VSTD::swap;
486e3fbe143SMarshall Clow        swap(static_cast<const _Compare&>(*this), static_cast<const _Compare&>(__y));
487e3fbe143SMarshall Clow    }
4882585835cSMarshall Clow
4892585835cSMarshall Clow#if _LIBCPP_STD_VER > 11
4902585835cSMarshall Clow    template <typename _K2>
4912585835cSMarshall Clow    _LIBCPP_INLINE_VISIBILITY
4922585835cSMarshall Clow    typename enable_if<__is_transparent<_Compare, _K2>::value, bool>::type
4932585835cSMarshall Clow    operator () ( const _K2& __x, const _CP& __y ) const
4942585835cSMarshall Clow        {return static_cast<const _Compare&>(*this) (__x, __y.__cc.first);}
4952585835cSMarshall Clow
4962585835cSMarshall Clow    template <typename _K2>
4972585835cSMarshall Clow    _LIBCPP_INLINE_VISIBILITY
4982585835cSMarshall Clow    typename enable_if<__is_transparent<_Compare, _K2>::value, bool>::type
4992585835cSMarshall Clow    operator () (const _CP& __x, const _K2& __y) const
5002585835cSMarshall Clow        {return static_cast<const _Compare&>(*this) (__x.__cc.first, __y);}
5012585835cSMarshall Clow#endif
5023e519524SHoward Hinnant};
5033e519524SHoward Hinnant
504abb160e6SHoward Hinnanttemplate <class _Key, class _CP, class _Compare>
505abb160e6SHoward Hinnantclass __map_value_compare<_Key, _CP, _Compare, false>
5063e519524SHoward Hinnant{
5073e519524SHoward Hinnant    _Compare comp;
5083e519524SHoward Hinnant
5093e519524SHoward Hinnantpublic:
510848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
5111052ee39SHoward Hinnant    __map_value_compare()
5121052ee39SHoward Hinnant        _NOEXCEPT_(is_nothrow_default_constructible<_Compare>::value)
5131052ee39SHoward Hinnant        : comp() {}
514848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
5151052ee39SHoward Hinnant    __map_value_compare(_Compare c)
5161052ee39SHoward Hinnant        _NOEXCEPT_(is_nothrow_copy_constructible<_Compare>::value)
5171052ee39SHoward Hinnant        : comp(c) {}
518848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
5191052ee39SHoward Hinnant    const _Compare& key_comp() const _NOEXCEPT {return comp;}
5203e519524SHoward Hinnant
521848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
5223e519524SHoward Hinnant    bool operator()(const _CP& __x, const _CP& __y) const
523abb160e6SHoward Hinnant        {return comp(__x.__cc.first, __y.__cc.first);}
524848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
5253e519524SHoward Hinnant    bool operator()(const _CP& __x, const _Key& __y) const
526abb160e6SHoward Hinnant        {return comp(__x.__cc.first, __y);}
527848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
5283e519524SHoward Hinnant    bool operator()(const _Key& __x, const _CP& __y) const
529abb160e6SHoward Hinnant        {return comp(__x, __y.__cc.first);}
530e3fbe143SMarshall Clow    void swap(__map_value_compare&__y)
531e3fbe143SMarshall Clow        _NOEXCEPT_(__is_nothrow_swappable<_Compare>::value)
532e3fbe143SMarshall Clow    {
533e3fbe143SMarshall Clow        using _VSTD::swap;
534e3fbe143SMarshall Clow        swap(comp, __y.comp);
535e3fbe143SMarshall Clow    }
5362585835cSMarshall Clow
5372585835cSMarshall Clow#if _LIBCPP_STD_VER > 11
5382585835cSMarshall Clow    template <typename _K2>
5392585835cSMarshall Clow    _LIBCPP_INLINE_VISIBILITY
5402585835cSMarshall Clow    typename enable_if<__is_transparent<_Compare, _K2>::value, bool>::type
5412585835cSMarshall Clow    operator () ( const _K2& __x, const _CP& __y ) const
5422585835cSMarshall Clow        {return comp (__x, __y.__cc.first);}
5432585835cSMarshall Clow
5442585835cSMarshall Clow    template <typename _K2>
5452585835cSMarshall Clow    _LIBCPP_INLINE_VISIBILITY
5462585835cSMarshall Clow    typename enable_if<__is_transparent<_Compare, _K2>::value, bool>::type
5472585835cSMarshall Clow    operator () (const _CP& __x, const _K2& __y) const
5482585835cSMarshall Clow        {return comp (__x.__cc.first, __y);}
5492585835cSMarshall Clow#endif
5503e519524SHoward Hinnant};
5513e519524SHoward Hinnant
552e3fbe143SMarshall Clowtemplate <class _Key, class _CP, class _Compare, bool __b>
553e3fbe143SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY
554e3fbe143SMarshall Clowvoid
555e3fbe143SMarshall Clowswap(__map_value_compare<_Key, _CP, _Compare, __b>& __x,
556e3fbe143SMarshall Clow     __map_value_compare<_Key, _CP, _Compare, __b>& __y)
557e3fbe143SMarshall Clow    _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
558e3fbe143SMarshall Clow{
559e3fbe143SMarshall Clow    __x.swap(__y);
560e3fbe143SMarshall Clow}
561e3fbe143SMarshall Clow
5623e519524SHoward Hinnanttemplate <class _Allocator>
5633e519524SHoward Hinnantclass __map_node_destructor
5643e519524SHoward Hinnant{
5653e519524SHoward Hinnant    typedef _Allocator                          allocator_type;
5663e519524SHoward Hinnant    typedef allocator_traits<allocator_type>    __alloc_traits;
567089a7cc5SEric Fiselier
5683e519524SHoward Hinnantpublic:
5693e519524SHoward Hinnant    typedef typename __alloc_traits::pointer    pointer;
5703e519524SHoward Hinnant
571089a7cc5SEric Fiselierprivate:
5723e519524SHoward Hinnant    allocator_type& __na_;
5733e519524SHoward Hinnant
5743e519524SHoward Hinnant    __map_node_destructor& operator=(const __map_node_destructor&);
5753e519524SHoward Hinnant
5763e519524SHoward Hinnantpublic:
5773e519524SHoward Hinnant    bool __first_constructed;
5783e519524SHoward Hinnant    bool __second_constructed;
5793e519524SHoward Hinnant
580848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
5811052ee39SHoward Hinnant    explicit __map_node_destructor(allocator_type& __na) _NOEXCEPT
5823e519524SHoward Hinnant        : __na_(__na),
5833e519524SHoward Hinnant          __first_constructed(false),
5843e519524SHoward Hinnant          __second_constructed(false)
5853e519524SHoward Hinnant        {}
5863e519524SHoward Hinnant
5877609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
588848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
5891052ee39SHoward Hinnant    __map_node_destructor(__tree_node_destructor<allocator_type>&& __x) _NOEXCEPT
5903e519524SHoward Hinnant        : __na_(__x.__na_),
5913e519524SHoward Hinnant          __first_constructed(__x.__value_constructed),
5923e519524SHoward Hinnant          __second_constructed(__x.__value_constructed)
5933e519524SHoward Hinnant        {
5943e519524SHoward Hinnant            __x.__value_constructed = false;
5953e519524SHoward Hinnant        }
596959cf8aeSHoward Hinnant#endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
5973e519524SHoward Hinnant
598848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
5991052ee39SHoward Hinnant    void operator()(pointer __p) _NOEXCEPT
6003e519524SHoward Hinnant    {
6013e519524SHoward Hinnant        if (__second_constructed)
60207d3eccdSHoward Hinnant            __alloc_traits::destroy(__na_, _VSTD::addressof(__p->__value_.__cc.second));
6033e519524SHoward Hinnant        if (__first_constructed)
60407d3eccdSHoward Hinnant            __alloc_traits::destroy(__na_, _VSTD::addressof(__p->__value_.__cc.first));
6053e519524SHoward Hinnant        if (__p)
6063e519524SHoward Hinnant            __alloc_traits::deallocate(__na_, __p, 1);
6073e519524SHoward Hinnant    }
6083e519524SHoward Hinnant};
6093e519524SHoward Hinnant
610ce53420eSHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator>
611ce53420eSHoward Hinnant    class map;
612ce53420eSHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator>
613ce53420eSHoward Hinnant    class multimap;
614ce53420eSHoward Hinnanttemplate <class _TreeIterator> class __map_const_iterator;
6153e519524SHoward Hinnant
616089a7cc5SEric Fiselier#ifndef _LIBCPP_CXX03_LANG
6179fd9f84fSHoward Hinnant
6189fd9f84fSHoward Hinnanttemplate <class _Key, class _Tp>
6199fd9f84fSHoward Hinnantunion __value_type
6209fd9f84fSHoward Hinnant{
6219fd9f84fSHoward Hinnant    typedef _Key                                     key_type;
6229fd9f84fSHoward Hinnant    typedef _Tp                                      mapped_type;
6239fd9f84fSHoward Hinnant    typedef pair<const key_type, mapped_type>        value_type;
6249fd9f84fSHoward Hinnant    typedef pair<key_type, mapped_type>              __nc_value_type;
6259fd9f84fSHoward Hinnant
6269fd9f84fSHoward Hinnant    value_type __cc;
6279fd9f84fSHoward Hinnant    __nc_value_type __nc;
6289fd9f84fSHoward Hinnant
6299fd9f84fSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
6309fd9f84fSHoward Hinnant    __value_type& operator=(const __value_type& __v)
6319fd9f84fSHoward Hinnant        {__nc = __v.__cc; return *this;}
6329fd9f84fSHoward Hinnant
6339fd9f84fSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
6349fd9f84fSHoward Hinnant    __value_type& operator=(__value_type&& __v)
6355e3ea4ddSEric Fiselier        {__nc = _VSTD::move(__v.__nc); return *this;}
6369fd9f84fSHoward Hinnant
6375e3ea4ddSEric Fiselier    template <class _ValueTp,
6385e3ea4ddSEric Fiselier              class = typename enable_if<
6395e3ea4ddSEric Fiselier                    __is_same_uncvref<_ValueTp, value_type>::value
6405e3ea4ddSEric Fiselier                 >::type
6415e3ea4ddSEric Fiselier             >
6429fd9f84fSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
6435e3ea4ddSEric Fiselier    __value_type& operator=(_ValueTp&& __v) {
6445e3ea4ddSEric Fiselier        __nc = _VSTD::forward<_ValueTp>(__v); return *this;
6455e3ea4ddSEric Fiselier    }
6465e3ea4ddSEric Fiselier
6475e3ea4ddSEric Fiselierprivate:
6485e3ea4ddSEric Fiselier    __value_type() _LIBCPP_EQUAL_DELETE;
6495e3ea4ddSEric Fiselier    ~__value_type() _LIBCPP_EQUAL_DELETE;
6505e3ea4ddSEric Fiselier    __value_type(const __value_type& __v) _LIBCPP_EQUAL_DELETE;
6515e3ea4ddSEric Fiselier    __value_type(__value_type&& __v) _LIBCPP_EQUAL_DELETE;
6529fd9f84fSHoward Hinnant};
6539fd9f84fSHoward Hinnant
6549fd9f84fSHoward Hinnant#else
6559fd9f84fSHoward Hinnant
6569fd9f84fSHoward Hinnanttemplate <class _Key, class _Tp>
6579fd9f84fSHoward Hinnantstruct __value_type
6589fd9f84fSHoward Hinnant{
6599fd9f84fSHoward Hinnant    typedef _Key                                     key_type;
6609fd9f84fSHoward Hinnant    typedef _Tp                                      mapped_type;
6619fd9f84fSHoward Hinnant    typedef pair<const key_type, mapped_type>        value_type;
6629fd9f84fSHoward Hinnant
6639fd9f84fSHoward Hinnant    value_type __cc;
6649fd9f84fSHoward Hinnant
6655e3ea4ddSEric Fiselierprivate:
6665e3ea4ddSEric Fiselier   __value_type();
6675e3ea4ddSEric Fiselier   __value_type(__value_type const&);
6685e3ea4ddSEric Fiselier   __value_type& operator=(__value_type const&);
6695e3ea4ddSEric Fiselier   ~__value_type();
6709fd9f84fSHoward Hinnant};
6719fd9f84fSHoward Hinnant
6729fd9f84fSHoward Hinnant#endif
6739fd9f84fSHoward Hinnant
674b3be398cSEric Fiseliertemplate <class _Tp>
675b3be398cSEric Fiselierstruct __extract_key_value_types;
676b3be398cSEric Fiselier
677b3be398cSEric Fiseliertemplate <class _Key, class _Tp>
678b3be398cSEric Fiselierstruct __extract_key_value_types<__value_type<_Key, _Tp> >
679b3be398cSEric Fiselier{
680b3be398cSEric Fiselier  typedef _Key const __key_type;
681b3be398cSEric Fiselier  typedef _Tp        __mapped_type;
682b3be398cSEric Fiselier};
683b3be398cSEric Fiselier
6843e519524SHoward Hinnanttemplate <class _TreeIterator>
685*e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS __map_iterator
6863e519524SHoward Hinnant{
687089a7cc5SEric Fiselier    typedef typename _TreeIterator::_NodeTypes                   _NodeTypes;
688089a7cc5SEric Fiselier    typedef typename _TreeIterator::__pointer_traits             __pointer_traits;
689089a7cc5SEric Fiselier
6903e519524SHoward Hinnant    _TreeIterator __i_;
6913e519524SHoward Hinnant
6923e519524SHoward Hinnantpublic:
6933e519524SHoward Hinnant    typedef bidirectional_iterator_tag                           iterator_category;
694089a7cc5SEric Fiselier    typedef typename _NodeTypes::__map_value_type                value_type;
6953e519524SHoward Hinnant    typedef typename _TreeIterator::difference_type              difference_type;
6963e519524SHoward Hinnant    typedef value_type&                                          reference;
697089a7cc5SEric Fiselier    typedef typename _NodeTypes::__map_value_type_pointer        pointer;
6983e519524SHoward Hinnant
699848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
7001052ee39SHoward Hinnant    __map_iterator() _NOEXCEPT {}
7013e519524SHoward Hinnant
702848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
7031052ee39SHoward Hinnant    __map_iterator(_TreeIterator __i) _NOEXCEPT : __i_(__i) {}
7043e519524SHoward Hinnant
705848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
70607d3eccdSHoward Hinnant    reference operator*() const {return __i_->__cc;}
707848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
70807d3eccdSHoward Hinnant    pointer operator->() const {return pointer_traits<pointer>::pointer_to(__i_->__cc);}
7093e519524SHoward Hinnant
710848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
7113e519524SHoward Hinnant    __map_iterator& operator++() {++__i_; return *this;}
712848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
7133e519524SHoward Hinnant    __map_iterator operator++(int)
7143e519524SHoward Hinnant    {
7153e519524SHoward Hinnant        __map_iterator __t(*this);
7163e519524SHoward Hinnant        ++(*this);
7173e519524SHoward Hinnant        return __t;
7183e519524SHoward Hinnant    }
7193e519524SHoward Hinnant
720848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
7213e519524SHoward Hinnant    __map_iterator& operator--() {--__i_; return *this;}
722848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
7233e519524SHoward Hinnant    __map_iterator operator--(int)
7243e519524SHoward Hinnant    {
7253e519524SHoward Hinnant        __map_iterator __t(*this);
7263e519524SHoward Hinnant        --(*this);
7273e519524SHoward Hinnant        return __t;
7283e519524SHoward Hinnant    }
7293e519524SHoward Hinnant
730848a5374SHoward Hinnant    friend _LIBCPP_INLINE_VISIBILITY
731848a5374SHoward Hinnant    bool operator==(const __map_iterator& __x, const __map_iterator& __y)
7323e519524SHoward Hinnant        {return __x.__i_ == __y.__i_;}
733848a5374SHoward Hinnant    friend
734848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
735848a5374SHoward Hinnant    bool operator!=(const __map_iterator& __x, const __map_iterator& __y)
7363e519524SHoward Hinnant        {return __x.__i_ != __y.__i_;}
7373e519524SHoward Hinnant
738*e2f2d1edSEric Fiselier    template <class, class, class, class> friend class _LIBCPP_TEMPLATE_VIS map;
739*e2f2d1edSEric Fiselier    template <class, class, class, class> friend class _LIBCPP_TEMPLATE_VIS multimap;
740*e2f2d1edSEric Fiselier    template <class> friend class _LIBCPP_TEMPLATE_VIS __map_const_iterator;
7413e519524SHoward Hinnant};
7423e519524SHoward Hinnant
7433e519524SHoward Hinnanttemplate <class _TreeIterator>
744*e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS __map_const_iterator
7453e519524SHoward Hinnant{
746089a7cc5SEric Fiselier    typedef typename _TreeIterator::_NodeTypes                   _NodeTypes;
747089a7cc5SEric Fiselier    typedef typename _TreeIterator::__pointer_traits             __pointer_traits;
748089a7cc5SEric Fiselier
7493e519524SHoward Hinnant    _TreeIterator __i_;
7503e519524SHoward Hinnant
7513e519524SHoward Hinnantpublic:
7523e519524SHoward Hinnant    typedef bidirectional_iterator_tag                           iterator_category;
753089a7cc5SEric Fiselier    typedef typename _NodeTypes::__map_value_type                value_type;
7543e519524SHoward Hinnant    typedef typename _TreeIterator::difference_type              difference_type;
7553e519524SHoward Hinnant    typedef const value_type&                                    reference;
756089a7cc5SEric Fiselier    typedef typename _NodeTypes::__const_map_value_type_pointer  pointer;
7573e519524SHoward Hinnant
758848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
7591052ee39SHoward Hinnant    __map_const_iterator() _NOEXCEPT {}
7603e519524SHoward Hinnant
761848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
7621052ee39SHoward Hinnant    __map_const_iterator(_TreeIterator __i) _NOEXCEPT : __i_(__i) {}
763848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
764b3be398cSEric Fiselier    __map_const_iterator(__map_iterator<
765b3be398cSEric Fiselier        typename _TreeIterator::__non_const_iterator> __i) _NOEXCEPT
7663e519524SHoward Hinnant        : __i_(__i.__i_) {}
7673e519524SHoward Hinnant
768848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
76907d3eccdSHoward Hinnant    reference operator*() const {return __i_->__cc;}
770848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
77107d3eccdSHoward Hinnant    pointer operator->() const {return pointer_traits<pointer>::pointer_to(__i_->__cc);}
7723e519524SHoward Hinnant
773848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
7743e519524SHoward Hinnant    __map_const_iterator& operator++() {++__i_; return *this;}
775848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
7763e519524SHoward Hinnant    __map_const_iterator operator++(int)
7773e519524SHoward Hinnant    {
7783e519524SHoward Hinnant        __map_const_iterator __t(*this);
7793e519524SHoward Hinnant        ++(*this);
7803e519524SHoward Hinnant        return __t;
7813e519524SHoward Hinnant    }
7823e519524SHoward Hinnant
783848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
7843e519524SHoward Hinnant    __map_const_iterator& operator--() {--__i_; return *this;}
785848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
7863e519524SHoward Hinnant    __map_const_iterator operator--(int)
7873e519524SHoward Hinnant    {
7883e519524SHoward Hinnant        __map_const_iterator __t(*this);
7893e519524SHoward Hinnant        --(*this);
7903e519524SHoward Hinnant        return __t;
7913e519524SHoward Hinnant    }
7923e519524SHoward Hinnant
793848a5374SHoward Hinnant    friend _LIBCPP_INLINE_VISIBILITY
794848a5374SHoward Hinnant    bool operator==(const __map_const_iterator& __x, const __map_const_iterator& __y)
7953e519524SHoward Hinnant        {return __x.__i_ == __y.__i_;}
796848a5374SHoward Hinnant    friend _LIBCPP_INLINE_VISIBILITY
797848a5374SHoward Hinnant    bool operator!=(const __map_const_iterator& __x, const __map_const_iterator& __y)
7983e519524SHoward Hinnant        {return __x.__i_ != __y.__i_;}
7993e519524SHoward Hinnant
800*e2f2d1edSEric Fiselier    template <class, class, class, class> friend class _LIBCPP_TEMPLATE_VIS map;
801*e2f2d1edSEric Fiselier    template <class, class, class, class> friend class _LIBCPP_TEMPLATE_VIS multimap;
802*e2f2d1edSEric Fiselier    template <class, class, class> friend class _LIBCPP_TEMPLATE_VIS __tree_const_iterator;
8033e519524SHoward Hinnant};
8043e519524SHoward Hinnant
8053e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare = less<_Key>,
8063e519524SHoward Hinnant          class _Allocator = allocator<pair<const _Key, _Tp> > >
807*e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS map
8083e519524SHoward Hinnant{
8093e519524SHoward Hinnantpublic:
8103e519524SHoward Hinnant    // types:
8113e519524SHoward Hinnant    typedef _Key                                     key_type;
8123e519524SHoward Hinnant    typedef _Tp                                      mapped_type;
8133e519524SHoward Hinnant    typedef pair<const key_type, mapped_type>        value_type;
81407d3eccdSHoward Hinnant    typedef pair<key_type, mapped_type>              __nc_value_type;
8153e519524SHoward Hinnant    typedef _Compare                                 key_compare;
8163e519524SHoward Hinnant    typedef _Allocator                               allocator_type;
8173e519524SHoward Hinnant    typedef value_type&                              reference;
8183e519524SHoward Hinnant    typedef const value_type&                        const_reference;
8193e519524SHoward Hinnant
82094f89aeeSMarshall Clow    static_assert((is_same<typename allocator_type::value_type, value_type>::value),
82194f89aeeSMarshall Clow                  "Allocator::value_type must be same type as value_type");
82294f89aeeSMarshall Clow
823*e2f2d1edSEric Fiselier    class _LIBCPP_TEMPLATE_VIS value_compare
8243e519524SHoward Hinnant        : public binary_function<value_type, value_type, bool>
8253e519524SHoward Hinnant    {
8263e519524SHoward Hinnant        friend class map;
8273e519524SHoward Hinnant    protected:
8283e519524SHoward Hinnant        key_compare comp;
8293e519524SHoward Hinnant
830848a5374SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY value_compare(key_compare c) : comp(c) {}
8313e519524SHoward Hinnant    public:
832848a5374SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
8333e519524SHoward Hinnant        bool operator()(const value_type& __x, const value_type& __y) const
8343e519524SHoward Hinnant            {return comp(__x.first, __y.first);}
8353e519524SHoward Hinnant    };
8363e519524SHoward Hinnant
8373e519524SHoward Hinnantprivate:
83807d3eccdSHoward Hinnant
8399fd9f84fSHoward Hinnant    typedef _VSTD::__value_type<key_type, mapped_type>             __value_type;
840abb160e6SHoward Hinnant    typedef __map_value_compare<key_type, __value_type, key_compare> __vc;
8411f508014SMarshall Clow    typedef typename __rebind_alloc_helper<allocator_traits<allocator_type>,
8421f508014SMarshall Clow                                                 __value_type>::type __allocator_type;
8433e519524SHoward Hinnant    typedef __tree<__value_type, __vc, __allocator_type>   __base;
8443e519524SHoward Hinnant    typedef typename __base::__node_traits                 __node_traits;
8453e519524SHoward Hinnant    typedef allocator_traits<allocator_type>               __alloc_traits;
8463e519524SHoward Hinnant
8473e519524SHoward Hinnant    __base __tree_;
8483e519524SHoward Hinnant
8493e519524SHoward Hinnantpublic:
8503e519524SHoward Hinnant    typedef typename __alloc_traits::pointer               pointer;
8513e519524SHoward Hinnant    typedef typename __alloc_traits::const_pointer         const_pointer;
8523e519524SHoward Hinnant    typedef typename __alloc_traits::size_type             size_type;
8533e519524SHoward Hinnant    typedef typename __alloc_traits::difference_type       difference_type;
8543e519524SHoward Hinnant    typedef __map_iterator<typename __base::iterator>             iterator;
8553e519524SHoward Hinnant    typedef __map_const_iterator<typename __base::const_iterator> const_iterator;
856ce48a113SHoward Hinnant    typedef _VSTD::reverse_iterator<iterator>               reverse_iterator;
857ce48a113SHoward Hinnant    typedef _VSTD::reverse_iterator<const_iterator>         const_reverse_iterator;
8583e519524SHoward Hinnant
859848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
860415a24e4SMarshall Clow    map()
861415a24e4SMarshall Clow        _NOEXCEPT_(
862415a24e4SMarshall Clow            is_nothrow_default_constructible<allocator_type>::value &&
863415a24e4SMarshall Clow            is_nothrow_default_constructible<key_compare>::value &&
864415a24e4SMarshall Clow            is_nothrow_copy_constructible<key_compare>::value)
865415a24e4SMarshall Clow        : __tree_(__vc(key_compare())) {}
866415a24e4SMarshall Clow
867415a24e4SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
868415a24e4SMarshall Clow    explicit map(const key_compare& __comp)
8691052ee39SHoward Hinnant        _NOEXCEPT_(
8701052ee39SHoward Hinnant            is_nothrow_default_constructible<allocator_type>::value &&
8711052ee39SHoward Hinnant            is_nothrow_copy_constructible<key_compare>::value)
8723e519524SHoward Hinnant        : __tree_(__vc(__comp)) {}
8733e519524SHoward Hinnant
874848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
8753e519524SHoward Hinnant    explicit map(const key_compare& __comp, const allocator_type& __a)
8762a10c960SMarshall Clow        : __tree_(__vc(__comp), typename __base::allocator_type(__a)) {}
8773e519524SHoward Hinnant
8783e519524SHoward Hinnant    template <class _InputIterator>
879848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
8803e519524SHoward Hinnant        map(_InputIterator __f, _InputIterator __l,
8813e519524SHoward Hinnant            const key_compare& __comp = key_compare())
8823e519524SHoward Hinnant        : __tree_(__vc(__comp))
8833e519524SHoward Hinnant        {
8843e519524SHoward Hinnant            insert(__f, __l);
8853e519524SHoward Hinnant        }
8863e519524SHoward Hinnant
8873e519524SHoward Hinnant    template <class _InputIterator>
888848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
8893e519524SHoward Hinnant        map(_InputIterator __f, _InputIterator __l,
8903e519524SHoward Hinnant            const key_compare& __comp, const allocator_type& __a)
8912a10c960SMarshall Clow        : __tree_(__vc(__comp), typename __base::allocator_type(__a))
8923e519524SHoward Hinnant        {
8933e519524SHoward Hinnant            insert(__f, __l);
8943e519524SHoward Hinnant        }
8953e519524SHoward Hinnant
896fbc317d4SMarshall Clow#if _LIBCPP_STD_VER > 11
897fbc317d4SMarshall Clow    template <class _InputIterator>
898fbc317d4SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
899fbc317d4SMarshall Clow    map(_InputIterator __f, _InputIterator __l, const allocator_type& __a)
900fbc317d4SMarshall Clow        : map(__f, __l, key_compare(), __a) {}
901fbc317d4SMarshall Clow#endif
902fbc317d4SMarshall Clow
903848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
9043e519524SHoward Hinnant    map(const map& __m)
9053e519524SHoward Hinnant        : __tree_(__m.__tree_)
9063e519524SHoward Hinnant        {
9073e519524SHoward Hinnant            insert(__m.begin(), __m.end());
9083e519524SHoward Hinnant        }
9093e519524SHoward Hinnant
9105a33687dSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
9115a33687dSHoward Hinnant    map& operator=(const map& __m)
9125a33687dSHoward Hinnant        {
9132ee83725SMarshall Clow#ifndef _LIBCPP_CXX03_LANG
9145a33687dSHoward Hinnant            __tree_ = __m.__tree_;
91507d3eccdSHoward Hinnant#else
91674cf6ff5SMarshall Clow            if (this != &__m) {
91707d3eccdSHoward Hinnant                __tree_.clear();
91807d3eccdSHoward Hinnant                __tree_.value_comp() = __m.__tree_.value_comp();
91907d3eccdSHoward Hinnant                __tree_.__copy_assign_alloc(__m.__tree_);
92007d3eccdSHoward Hinnant                insert(__m.begin(), __m.end());
92174cf6ff5SMarshall Clow            }
92207d3eccdSHoward Hinnant#endif
9235a33687dSHoward Hinnant            return *this;
9245a33687dSHoward Hinnant        }
9255a33687dSHoward Hinnant
9267609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
9273e519524SHoward Hinnant
928848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
9293e519524SHoward Hinnant    map(map&& __m)
9301052ee39SHoward Hinnant        _NOEXCEPT_(is_nothrow_move_constructible<__base>::value)
931ce48a113SHoward Hinnant        : __tree_(_VSTD::move(__m.__tree_))
9323e519524SHoward Hinnant        {
9333e519524SHoward Hinnant        }
9343e519524SHoward Hinnant
9353e519524SHoward Hinnant    map(map&& __m, const allocator_type& __a);
9363e519524SHoward Hinnant
937848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
93854976f26SHoward Hinnant    map& operator=(map&& __m)
93954976f26SHoward Hinnant        _NOEXCEPT_(is_nothrow_move_assignable<__base>::value)
94054976f26SHoward Hinnant        {
94154976f26SHoward Hinnant            __tree_ = _VSTD::move(__m.__tree_);
94254976f26SHoward Hinnant            return *this;
94354976f26SHoward Hinnant        }
94454976f26SHoward Hinnant
94554976f26SHoward Hinnant#endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
94654976f26SHoward Hinnant
94754976f26SHoward Hinnant#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
94854976f26SHoward Hinnant
94954976f26SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
9503e519524SHoward Hinnant    map(initializer_list<value_type> __il, const key_compare& __comp = key_compare())
9513e519524SHoward Hinnant        : __tree_(__vc(__comp))
9523e519524SHoward Hinnant        {
9533e519524SHoward Hinnant            insert(__il.begin(), __il.end());
9543e519524SHoward Hinnant        }
9553e519524SHoward Hinnant
956848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
9573e519524SHoward Hinnant    map(initializer_list<value_type> __il, const key_compare& __comp, const allocator_type& __a)
9582a10c960SMarshall Clow        : __tree_(__vc(__comp), typename __base::allocator_type(__a))
9593e519524SHoward Hinnant        {
9603e519524SHoward Hinnant            insert(__il.begin(), __il.end());
9613e519524SHoward Hinnant        }
9623e519524SHoward Hinnant
963fbc317d4SMarshall Clow#if _LIBCPP_STD_VER > 11
964fbc317d4SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
965fbc317d4SMarshall Clow    map(initializer_list<value_type> __il, const allocator_type& __a)
966fbc317d4SMarshall Clow        : map(__il, key_compare(), __a) {}
967fbc317d4SMarshall Clow#endif
968fbc317d4SMarshall Clow
969848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
9703e519524SHoward Hinnant    map& operator=(initializer_list<value_type> __il)
9713e519524SHoward Hinnant        {
9723e519524SHoward Hinnant            __tree_.__assign_unique(__il.begin(), __il.end());
9733e519524SHoward Hinnant            return *this;
9743e519524SHoward Hinnant        }
9753e519524SHoward Hinnant
97654976f26SHoward Hinnant#endif  // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
9773e519524SHoward Hinnant
978848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
9793e519524SHoward Hinnant    explicit map(const allocator_type& __a)
9802a10c960SMarshall Clow        : __tree_(typename __base::allocator_type(__a))
9813e519524SHoward Hinnant        {
9823e519524SHoward Hinnant        }
9833e519524SHoward Hinnant
984848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
9853e519524SHoward Hinnant    map(const map& __m, const allocator_type& __a)
9862a10c960SMarshall Clow        : __tree_(__m.__tree_.value_comp(), typename __base::allocator_type(__a))
9873e519524SHoward Hinnant        {
9883e519524SHoward Hinnant            insert(__m.begin(), __m.end());
9893e519524SHoward Hinnant        }
9903e519524SHoward Hinnant
991848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
9921052ee39SHoward Hinnant          iterator begin() _NOEXCEPT {return __tree_.begin();}
993848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
9941052ee39SHoward Hinnant    const_iterator begin() const _NOEXCEPT {return __tree_.begin();}
995848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
9961052ee39SHoward Hinnant          iterator end() _NOEXCEPT {return __tree_.end();}
997848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
9981052ee39SHoward Hinnant    const_iterator end() const _NOEXCEPT {return __tree_.end();}
9993e519524SHoward Hinnant
1000848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
10011052ee39SHoward Hinnant          reverse_iterator rbegin() _NOEXCEPT {return reverse_iterator(end());}
1002848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
10031052ee39SHoward Hinnant    const_reverse_iterator rbegin() const _NOEXCEPT
10041052ee39SHoward Hinnant        {return const_reverse_iterator(end());}
1005848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
10061052ee39SHoward Hinnant          reverse_iterator rend() _NOEXCEPT
10071052ee39SHoward Hinnant            {return       reverse_iterator(begin());}
1008848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
10091052ee39SHoward Hinnant    const_reverse_iterator rend() const _NOEXCEPT
10101052ee39SHoward Hinnant        {return const_reverse_iterator(begin());}
10113e519524SHoward Hinnant
1012848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
10131052ee39SHoward Hinnant    const_iterator cbegin() const _NOEXCEPT {return begin();}
1014848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
10151052ee39SHoward Hinnant    const_iterator cend() const _NOEXCEPT {return end();}
1016848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
10171052ee39SHoward Hinnant    const_reverse_iterator crbegin() const _NOEXCEPT {return rbegin();}
1018848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
10191052ee39SHoward Hinnant    const_reverse_iterator crend() const _NOEXCEPT {return rend();}
10203e519524SHoward Hinnant
1021848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
10221052ee39SHoward Hinnant    bool      empty() const _NOEXCEPT {return __tree_.size() == 0;}
1023848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
10241052ee39SHoward Hinnant    size_type size() const _NOEXCEPT {return __tree_.size();}
1025848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
10261052ee39SHoward Hinnant    size_type max_size() const _NOEXCEPT {return __tree_.max_size();}
10273e519524SHoward Hinnant
10283e519524SHoward Hinnant    mapped_type& operator[](const key_type& __k);
102954f0cda6SEric Fiselier#ifndef _LIBCPP_CXX03_LANG
10303e519524SHoward Hinnant    mapped_type& operator[](key_type&& __k);
10313e519524SHoward Hinnant#endif
10323e519524SHoward Hinnant
10333e519524SHoward Hinnant          mapped_type& at(const key_type& __k);
10343e519524SHoward Hinnant    const mapped_type& at(const key_type& __k) const;
10353e519524SHoward Hinnant
1036848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
10372a10c960SMarshall Clow    allocator_type get_allocator() const _NOEXCEPT {return allocator_type(__tree_.__alloc());}
1038848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
10393e519524SHoward Hinnant    key_compare    key_comp()      const {return __tree_.value_comp().key_comp();}
1040848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
10413e519524SHoward Hinnant    value_compare  value_comp()    const {return value_compare(__tree_.value_comp().key_comp());}
10423e519524SHoward Hinnant
10435e3ea4ddSEric Fiselier#ifndef _LIBCPP_CXX03_LANG
10445e3ea4ddSEric Fiselier    template <class ..._Args>
10455e3ea4ddSEric Fiselier    _LIBCPP_INLINE_VISIBILITY
10465e3ea4ddSEric Fiselier    pair<iterator, bool> emplace(_Args&& ...__args) {
10475e3ea4ddSEric Fiselier        return __tree_.__emplace_unique(_VSTD::forward<_Args>(__args)...);
10485e3ea4ddSEric Fiselier    }
10497609c9b6SHoward Hinnant
10508b805c91SHoward Hinnant    template <class ..._Args>
10515e3ea4ddSEric Fiselier    _LIBCPP_INLINE_VISIBILITY
10525e3ea4ddSEric Fiselier    iterator emplace_hint(const_iterator __p, _Args&& ...__args) {
10535e3ea4ddSEric Fiselier        return __tree_.__emplace_hint_unique(__p.__i_, _VSTD::forward<_Args>(__args)...);
10545e3ea4ddSEric Fiselier    }
10557609c9b6SHoward Hinnant
1056c003db1fSHoward Hinnant    template <class _Pp,
1057c003db1fSHoward Hinnant              class = typename enable_if<is_constructible<value_type, _Pp>::value>::type>
1058848a5374SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
1059c003db1fSHoward Hinnant        pair<iterator, bool> insert(_Pp&& __p)
1060c003db1fSHoward Hinnant            {return __tree_.__insert_unique(_VSTD::forward<_Pp>(__p));}
10613e519524SHoward Hinnant
1062c003db1fSHoward Hinnant    template <class _Pp,
1063c003db1fSHoward Hinnant              class = typename enable_if<is_constructible<value_type, _Pp>::value>::type>
1064848a5374SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
1065c003db1fSHoward Hinnant        iterator insert(const_iterator __pos, _Pp&& __p)
1066c003db1fSHoward Hinnant            {return __tree_.__insert_unique(__pos.__i_, _VSTD::forward<_Pp>(__p));}
10673e519524SHoward Hinnant
10685e3ea4ddSEric Fiselier#endif  // _LIBCPP_CXX03_LANG
10693e519524SHoward Hinnant
1070848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
10713e519524SHoward Hinnant    pair<iterator, bool>
10723e519524SHoward Hinnant        insert(const value_type& __v) {return __tree_.__insert_unique(__v);}
10733e519524SHoward Hinnant
1074848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
10753e519524SHoward Hinnant    iterator
10763e519524SHoward Hinnant        insert(const_iterator __p, const value_type& __v)
10773e519524SHoward Hinnant            {return __tree_.__insert_unique(__p.__i_, __v);}
10783e519524SHoward Hinnant
10797a9f500fSEric Fiselier#ifndef _LIBCPP_CXX03_LANG
1080afc9ff99SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
1081afc9ff99SMarshall Clow    pair<iterator, bool>
10825e3ea4ddSEric Fiselier    insert(value_type&& __v) {return __tree_.__insert_unique(_VSTD::move(__v));}
1083afc9ff99SMarshall Clow
1084afc9ff99SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
10855e3ea4ddSEric Fiselier    iterator insert(const_iterator __p,  value_type&& __v)
10865e3ea4ddSEric Fiselier    {return __tree_.__insert_unique(__p.__i_, _VSTD::move(__v));}
1087afc9ff99SMarshall Clow#endif
1088afc9ff99SMarshall Clow
10893e519524SHoward Hinnant    template <class _InputIterator>
1090848a5374SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
10913e519524SHoward Hinnant        void insert(_InputIterator __f, _InputIterator __l)
10923e519524SHoward Hinnant        {
10933e519524SHoward Hinnant            for (const_iterator __e = cend(); __f != __l; ++__f)
10943e519524SHoward Hinnant                insert(__e.__i_, *__f);
10953e519524SHoward Hinnant        }
10963e519524SHoward Hinnant
109754976f26SHoward Hinnant#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
109854976f26SHoward Hinnant
1099848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11003e519524SHoward Hinnant    void insert(initializer_list<value_type> __il)
11013e519524SHoward Hinnant        {insert(__il.begin(), __il.end());}
11023e519524SHoward Hinnant
110354976f26SHoward Hinnant#endif  // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
110454976f26SHoward Hinnant
11058aaf517dSMarshall Clow#if _LIBCPP_STD_VER > 14
110654f0cda6SEric Fiselier
11078aaf517dSMarshall Clow    template <class... _Args>
11088aaf517dSMarshall Clow        _LIBCPP_INLINE_VISIBILITY
11098aaf517dSMarshall Clow        pair<iterator, bool> try_emplace(const key_type& __k, _Args&&... __args)
11108aaf517dSMarshall Clow    {
111154f0cda6SEric Fiselier        return __tree_.__emplace_unique_key_args(__k,
111254f0cda6SEric Fiselier            _VSTD::piecewise_construct,
111354f0cda6SEric Fiselier            _VSTD::forward_as_tuple(__k),
111454f0cda6SEric Fiselier            _VSTD::forward_as_tuple(_VSTD::forward<_Args>(__args)...));
11158aaf517dSMarshall Clow    }
11168aaf517dSMarshall Clow
11178aaf517dSMarshall Clow    template <class... _Args>
11188aaf517dSMarshall Clow        _LIBCPP_INLINE_VISIBILITY
11198aaf517dSMarshall Clow        pair<iterator, bool> try_emplace(key_type&& __k, _Args&&... __args)
11208aaf517dSMarshall Clow    {
112154f0cda6SEric Fiselier        return __tree_.__emplace_unique_key_args(__k,
112254f0cda6SEric Fiselier            _VSTD::piecewise_construct,
112354f0cda6SEric Fiselier            _VSTD::forward_as_tuple(_VSTD::move(__k)),
112454f0cda6SEric Fiselier            _VSTD::forward_as_tuple(_VSTD::forward<_Args>(__args)...));
11258aaf517dSMarshall Clow    }
11268aaf517dSMarshall Clow
11278aaf517dSMarshall Clow    template <class... _Args>
11288aaf517dSMarshall Clow        _LIBCPP_INLINE_VISIBILITY
11298aaf517dSMarshall Clow        iterator try_emplace(const_iterator __h, const key_type& __k, _Args&&... __args)
11308aaf517dSMarshall Clow    {
113154f0cda6SEric Fiselier        return __tree_.__emplace_hint_unique_key_args(__h.__i_, __k,
113254f0cda6SEric Fiselier            _VSTD::piecewise_construct,
113354f0cda6SEric Fiselier            _VSTD::forward_as_tuple(__k),
11348aaf517dSMarshall Clow            _VSTD::forward_as_tuple(_VSTD::forward<_Args>(__args)...));
11358aaf517dSMarshall Clow    }
11368aaf517dSMarshall Clow
11378aaf517dSMarshall Clow    template <class... _Args>
11388aaf517dSMarshall Clow        _LIBCPP_INLINE_VISIBILITY
11398aaf517dSMarshall Clow        iterator try_emplace(const_iterator __h, key_type&& __k, _Args&&... __args)
11408aaf517dSMarshall Clow    {
114154f0cda6SEric Fiselier        return __tree_.__emplace_hint_unique_key_args(__h.__i_, __k,
114254f0cda6SEric Fiselier            _VSTD::piecewise_construct,
114354f0cda6SEric Fiselier            _VSTD::forward_as_tuple(_VSTD::move(__k)),
11448aaf517dSMarshall Clow            _VSTD::forward_as_tuple(_VSTD::forward<_Args>(__args)...));
11458aaf517dSMarshall Clow    }
11468aaf517dSMarshall Clow
11478aaf517dSMarshall Clow    template <class _Vp>
11488aaf517dSMarshall Clow        _LIBCPP_INLINE_VISIBILITY
11498aaf517dSMarshall Clow        pair<iterator, bool> insert_or_assign(const key_type& __k, _Vp&& __v)
11508aaf517dSMarshall Clow    {
11518aaf517dSMarshall Clow        iterator __p = lower_bound(__k);
11528aaf517dSMarshall Clow        if ( __p != end() && !key_comp()(__k, __p->first))
11538aaf517dSMarshall Clow        {
11548aaf517dSMarshall Clow            __p->second = _VSTD::forward<_Vp>(__v);
11558aaf517dSMarshall Clow            return _VSTD::make_pair(__p, false);
11568aaf517dSMarshall Clow        }
11578aaf517dSMarshall Clow        return _VSTD::make_pair(emplace_hint(__p, __k, _VSTD::forward<_Vp>(__v)), true);
11588aaf517dSMarshall Clow    }
11598aaf517dSMarshall Clow
11608aaf517dSMarshall Clow    template <class _Vp>
11618aaf517dSMarshall Clow        _LIBCPP_INLINE_VISIBILITY
11628aaf517dSMarshall Clow        pair<iterator, bool> insert_or_assign(key_type&& __k, _Vp&& __v)
11638aaf517dSMarshall Clow    {
11648aaf517dSMarshall Clow        iterator __p = lower_bound(__k);
11658aaf517dSMarshall Clow        if ( __p != end() && !key_comp()(__k, __p->first))
11668aaf517dSMarshall Clow        {
11678aaf517dSMarshall Clow            __p->second = _VSTD::forward<_Vp>(__v);
11688aaf517dSMarshall Clow            return _VSTD::make_pair(__p, false);
11698aaf517dSMarshall Clow        }
11708aaf517dSMarshall Clow        return _VSTD::make_pair(emplace_hint(__p, _VSTD::move(__k), _VSTD::forward<_Vp>(__v)), true);
11718aaf517dSMarshall Clow    }
11728aaf517dSMarshall Clow
11738aaf517dSMarshall Clow    template <class _Vp>
11748aaf517dSMarshall Clow        _LIBCPP_INLINE_VISIBILITY
11758aaf517dSMarshall Clow        iterator insert_or_assign(const_iterator __h, const key_type& __k, _Vp&& __v)
11768aaf517dSMarshall Clow     {
11778aaf517dSMarshall Clow        iterator __p = lower_bound(__k);
11788aaf517dSMarshall Clow        if ( __p != end() && !key_comp()(__k, __p->first))
11798aaf517dSMarshall Clow        {
11808aaf517dSMarshall Clow            __p->second = _VSTD::forward<_Vp>(__v);
11818aaf517dSMarshall Clow            return __p;
11828aaf517dSMarshall Clow        }
11838aaf517dSMarshall Clow        return emplace_hint(__h, __k, _VSTD::forward<_Vp>(__v));
11848aaf517dSMarshall Clow     }
11858aaf517dSMarshall Clow
11868aaf517dSMarshall Clow    template <class _Vp>
11878aaf517dSMarshall Clow        _LIBCPP_INLINE_VISIBILITY
11888aaf517dSMarshall Clow        iterator insert_or_assign(const_iterator __h, key_type&& __k, _Vp&& __v)
11898aaf517dSMarshall Clow     {
11908aaf517dSMarshall Clow        iterator __p = lower_bound(__k);
11918aaf517dSMarshall Clow        if ( __p != end() && !key_comp()(__k, __p->first))
11928aaf517dSMarshall Clow        {
11938aaf517dSMarshall Clow            __p->second = _VSTD::forward<_Vp>(__v);
11948aaf517dSMarshall Clow            return __p;
11958aaf517dSMarshall Clow        }
11968aaf517dSMarshall Clow        return emplace_hint(__h, _VSTD::move(__k), _VSTD::forward<_Vp>(__v));
11978aaf517dSMarshall Clow     }
119854f0cda6SEric Fiselier
11998aaf517dSMarshall Clow#endif
12008aaf517dSMarshall Clow
1201848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
12023e519524SHoward Hinnant    iterator erase(const_iterator __p) {return __tree_.erase(__p.__i_);}
1203848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
1204ec392968SMarshall Clow    iterator erase(iterator __p)       {return __tree_.erase(__p.__i_);}
1205ec392968SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
12063e519524SHoward Hinnant    size_type erase(const key_type& __k)
12073e519524SHoward Hinnant        {return __tree_.__erase_unique(__k);}
1208848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
12093e519524SHoward Hinnant    iterator  erase(const_iterator __f, const_iterator __l)
12103e519524SHoward Hinnant        {return __tree_.erase(__f.__i_, __l.__i_);}
1211848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
12121052ee39SHoward Hinnant    void clear() _NOEXCEPT {__tree_.clear();}
12133e519524SHoward Hinnant
1214848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
12151052ee39SHoward Hinnant    void swap(map& __m)
12161052ee39SHoward Hinnant        _NOEXCEPT_(__is_nothrow_swappable<__base>::value)
12171052ee39SHoward Hinnant        {__tree_.swap(__m.__tree_);}
12183e519524SHoward Hinnant
1219848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
12203e519524SHoward Hinnant    iterator find(const key_type& __k)             {return __tree_.find(__k);}
1221848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
12223e519524SHoward Hinnant    const_iterator find(const key_type& __k) const {return __tree_.find(__k);}
12232585835cSMarshall Clow#if _LIBCPP_STD_VER > 11
12242585835cSMarshall Clow    template <typename _K2>
12252585835cSMarshall Clow    _LIBCPP_INLINE_VISIBILITY
12262585835cSMarshall Clow    typename enable_if<__is_transparent<_Compare, _K2>::value,iterator>::type
12272585835cSMarshall Clow    find(const _K2& __k)                           {return __tree_.find(__k);}
12282585835cSMarshall Clow    template <typename _K2>
12292585835cSMarshall Clow    _LIBCPP_INLINE_VISIBILITY
12302585835cSMarshall Clow    typename enable_if<__is_transparent<_Compare, _K2>::value,const_iterator>::type
12312585835cSMarshall Clow    find(const _K2& __k) const                     {return __tree_.find(__k);}
12322585835cSMarshall Clow#endif
12332585835cSMarshall Clow
1234848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
12353e519524SHoward Hinnant    size_type      count(const key_type& __k) const
12363e519524SHoward Hinnant        {return __tree_.__count_unique(__k);}
12370aacbc92SMarshall Clow#if _LIBCPP_STD_VER > 11
12380aacbc92SMarshall Clow    template <typename _K2>
12390aacbc92SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
12400aacbc92SMarshall Clow    typename enable_if<__is_transparent<_Compare, _K2>::value,size_type>::type
1241f8457a07SMarshall Clow    count(const _K2& __k) const {return __tree_.__count_unique(__k);}
12420aacbc92SMarshall Clow#endif
1243848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
12443e519524SHoward Hinnant    iterator lower_bound(const key_type& __k)
12453e519524SHoward Hinnant        {return __tree_.lower_bound(__k);}
1246848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
12473e519524SHoward Hinnant    const_iterator lower_bound(const key_type& __k) const
12483e519524SHoward Hinnant        {return __tree_.lower_bound(__k);}
12492585835cSMarshall Clow#if _LIBCPP_STD_VER > 11
12502585835cSMarshall Clow    template <typename _K2>
12512585835cSMarshall Clow    _LIBCPP_INLINE_VISIBILITY
12522585835cSMarshall Clow    typename enable_if<__is_transparent<_Compare, _K2>::value,iterator>::type
12532585835cSMarshall Clow    lower_bound(const _K2& __k)       {return __tree_.lower_bound(__k);}
12542585835cSMarshall Clow
12552585835cSMarshall Clow    template <typename _K2>
12562585835cSMarshall Clow    _LIBCPP_INLINE_VISIBILITY
12572585835cSMarshall Clow    typename enable_if<__is_transparent<_Compare, _K2>::value,const_iterator>::type
12582585835cSMarshall Clow    lower_bound(const _K2& __k) const {return __tree_.lower_bound(__k);}
12592585835cSMarshall Clow#endif
12602585835cSMarshall Clow
1261848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
12623e519524SHoward Hinnant    iterator upper_bound(const key_type& __k)
12633e519524SHoward Hinnant        {return __tree_.upper_bound(__k);}
1264848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
12653e519524SHoward Hinnant    const_iterator upper_bound(const key_type& __k) const
12663e519524SHoward Hinnant        {return __tree_.upper_bound(__k);}
12672585835cSMarshall Clow#if _LIBCPP_STD_VER > 11
12682585835cSMarshall Clow    template <typename _K2>
12692585835cSMarshall Clow    _LIBCPP_INLINE_VISIBILITY
12702585835cSMarshall Clow    typename enable_if<__is_transparent<_Compare, _K2>::value,iterator>::type
12712585835cSMarshall Clow    upper_bound(const _K2& __k)       {return __tree_.upper_bound(__k);}
12722585835cSMarshall Clow    template <typename _K2>
12732585835cSMarshall Clow    _LIBCPP_INLINE_VISIBILITY
12742585835cSMarshall Clow    typename enable_if<__is_transparent<_Compare, _K2>::value,const_iterator>::type
12752585835cSMarshall Clow    upper_bound(const _K2& __k) const {return __tree_.upper_bound(__k);}
12762585835cSMarshall Clow#endif
12772585835cSMarshall Clow
1278848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
12793e519524SHoward Hinnant    pair<iterator,iterator> equal_range(const key_type& __k)
12803e519524SHoward Hinnant        {return __tree_.__equal_range_unique(__k);}
1281848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
12823e519524SHoward Hinnant    pair<const_iterator,const_iterator> equal_range(const key_type& __k) const
12833e519524SHoward Hinnant        {return __tree_.__equal_range_unique(__k);}
12842585835cSMarshall Clow#if _LIBCPP_STD_VER > 11
12852585835cSMarshall Clow    template <typename _K2>
12862585835cSMarshall Clow    _LIBCPP_INLINE_VISIBILITY
12872585835cSMarshall Clow    typename enable_if<__is_transparent<_Compare, _K2>::value,pair<iterator,iterator>>::type
12882585835cSMarshall Clow    equal_range(const _K2& __k)       {return __tree_.__equal_range_unique(__k);}
12892585835cSMarshall Clow    template <typename _K2>
12902585835cSMarshall Clow    _LIBCPP_INLINE_VISIBILITY
12912585835cSMarshall Clow    typename enable_if<__is_transparent<_Compare, _K2>::value,pair<const_iterator,const_iterator>>::type
12922585835cSMarshall Clow    equal_range(const _K2& __k) const {return __tree_.__equal_range_unique(__k);}
12932585835cSMarshall Clow#endif
12943e519524SHoward Hinnant
12953e519524SHoward Hinnantprivate:
12963e519524SHoward Hinnant    typedef typename __base::__node                    __node;
12973e519524SHoward Hinnant    typedef typename __base::__node_allocator          __node_allocator;
12983e519524SHoward Hinnant    typedef typename __base::__node_pointer            __node_pointer;
12993e519524SHoward Hinnant    typedef typename __base::__node_base_pointer       __node_base_pointer;
13000594ad71SEric Fiselier
1301c003db1fSHoward Hinnant    typedef __map_node_destructor<__node_allocator> _Dp;
1302c003db1fSHoward Hinnant    typedef unique_ptr<__node, _Dp> __node_holder;
13033e519524SHoward Hinnant
130454f0cda6SEric Fiselier#ifdef _LIBCPP_CXX03_LANG
13054a95f9ebSHoward Hinnant    __node_holder __construct_node_with_key(const key_type& __k);
130654f0cda6SEric Fiselier#endif
13073e519524SHoward Hinnant
13080594ad71SEric Fiselier    __node_base_pointer const&
13090594ad71SEric Fiselier    __find_equal_key(__node_base_pointer& __parent, const key_type& __k) const;
13100594ad71SEric Fiselier
13110594ad71SEric Fiselier    _LIBCPP_INLINE_VISIBILITY
13123e519524SHoward Hinnant    __node_base_pointer&
13130594ad71SEric Fiselier    __find_equal_key(__node_base_pointer& __parent, const key_type& __k) {
13140594ad71SEric Fiselier        map const* __const_this = this;
13150594ad71SEric Fiselier        return const_cast<__node_base_pointer&>(
13160594ad71SEric Fiselier            __const_this->__find_equal_key(__parent, __k));
13170594ad71SEric Fiselier    }
13183e519524SHoward Hinnant};
13193e519524SHoward Hinnant
13200594ad71SEric Fiselier
13210594ad71SEric Fiselier// Find __k
13220594ad71SEric Fiselier// Set __parent to parent of null leaf and
13230594ad71SEric Fiselier//    return reference to null leaf iv __k does not exist.
13243e519524SHoward Hinnant// If __k exists, set parent to node of __k and return reference to node of __k
13253e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator>
13260594ad71SEric Fiseliertypename map<_Key, _Tp, _Compare, _Allocator>::__node_base_pointer const&
13273e519524SHoward Hinnantmap<_Key, _Tp, _Compare, _Allocator>::__find_equal_key(__node_base_pointer& __parent,
13280594ad71SEric Fiselier                                                       const key_type& __k) const
13293e519524SHoward Hinnant{
13303e519524SHoward Hinnant    __node_pointer __nd = __tree_.__root();
13313e519524SHoward Hinnant    if (__nd != nullptr)
13323e519524SHoward Hinnant    {
13333e519524SHoward Hinnant        while (true)
13343e519524SHoward Hinnant        {
133507d3eccdSHoward Hinnant            if (__tree_.value_comp().key_comp()(__k, __nd->__value_.__cc.first))
13363e519524SHoward Hinnant            {
13373e519524SHoward Hinnant                if (__nd->__left_ != nullptr)
13383e519524SHoward Hinnant                    __nd = static_cast<__node_pointer>(__nd->__left_);
13393e519524SHoward Hinnant                else
13403e519524SHoward Hinnant                {
134107d3eccdSHoward Hinnant                    __parent = static_cast<__node_base_pointer>(__nd);
13423e519524SHoward Hinnant                    return __parent->__left_;
13433e519524SHoward Hinnant                }
13443e519524SHoward Hinnant            }
134507d3eccdSHoward Hinnant            else if (__tree_.value_comp().key_comp()(__nd->__value_.__cc.first, __k))
13463e519524SHoward Hinnant            {
13473e519524SHoward Hinnant                if (__nd->__right_ != nullptr)
13483e519524SHoward Hinnant                    __nd = static_cast<__node_pointer>(__nd->__right_);
13493e519524SHoward Hinnant                else
13503e519524SHoward Hinnant                {
135107d3eccdSHoward Hinnant                    __parent = static_cast<__node_base_pointer>(__nd);
13523e519524SHoward Hinnant                    return __parent->__right_;
13533e519524SHoward Hinnant                }
13543e519524SHoward Hinnant            }
13553e519524SHoward Hinnant            else
13563e519524SHoward Hinnant            {
135707d3eccdSHoward Hinnant                __parent = static_cast<__node_base_pointer>(__nd);
13583e519524SHoward Hinnant                return __parent;
13593e519524SHoward Hinnant            }
13603e519524SHoward Hinnant        }
13613e519524SHoward Hinnant    }
136207d3eccdSHoward Hinnant    __parent = static_cast<__node_base_pointer>(__tree_.__end_node());
13633e519524SHoward Hinnant    return __parent->__left_;
13643e519524SHoward Hinnant}
13653e519524SHoward Hinnant
13665e3ea4ddSEric Fiselier#ifndef _LIBCPP_CXX03_LANG
13673e519524SHoward Hinnant
13683e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator>
13693e519524SHoward Hinnantmap<_Key, _Tp, _Compare, _Allocator>::map(map&& __m, const allocator_type& __a)
13702a10c960SMarshall Clow    : __tree_(_VSTD::move(__m.__tree_), typename __base::allocator_type(__a))
13713e519524SHoward Hinnant{
13723e519524SHoward Hinnant    if (__a != __m.get_allocator())
13733e519524SHoward Hinnant    {
13743e519524SHoward Hinnant        const_iterator __e = cend();
13753e519524SHoward Hinnant        while (!__m.empty())
13763e519524SHoward Hinnant            __tree_.__insert_unique(__e.__i_,
13775e3ea4ddSEric Fiselier                    _VSTD::move(__m.__tree_.remove(__m.begin().__i_)->__value_.__nc));
13783e519524SHoward Hinnant    }
13793e519524SHoward Hinnant}
13803e519524SHoward Hinnant
13815e3ea4ddSEric Fiselier#endif  // !_LIBCPP_CXX03_LANG
13823e519524SHoward Hinnant
138354f0cda6SEric Fiselier
138454f0cda6SEric Fiselier#ifdef _LIBCPP_CXX03_LANG
138554f0cda6SEric Fiselier
13863e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator>
13873e519524SHoward Hinnanttypename map<_Key, _Tp, _Compare, _Allocator>::__node_holder
13884a95f9ebSHoward Hinnantmap<_Key, _Tp, _Compare, _Allocator>::__construct_node_with_key(const key_type& __k)
13893e519524SHoward Hinnant{
13903e519524SHoward Hinnant    __node_allocator& __na = __tree_.__node_alloc();
1391c003db1fSHoward Hinnant    __node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na));
139207d3eccdSHoward Hinnant    __node_traits::construct(__na, _VSTD::addressof(__h->__value_.__cc.first), __k);
13933e519524SHoward Hinnant    __h.get_deleter().__first_constructed = true;
139407d3eccdSHoward Hinnant    __node_traits::construct(__na, _VSTD::addressof(__h->__value_.__cc.second));
13953e519524SHoward Hinnant    __h.get_deleter().__second_constructed = true;
1396251c6291SDimitry Andric    return _LIBCPP_EXPLICIT_MOVE(__h);  // explicitly moved for C++03
13973e519524SHoward Hinnant}
13983e519524SHoward Hinnant
13993e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator>
14003e519524SHoward Hinnant_Tp&
14013e519524SHoward Hinnantmap<_Key, _Tp, _Compare, _Allocator>::operator[](const key_type& __k)
14023e519524SHoward Hinnant{
14033e519524SHoward Hinnant    __node_base_pointer __parent;
14043e519524SHoward Hinnant    __node_base_pointer& __child = __find_equal_key(__parent, __k);
14053e519524SHoward Hinnant    __node_pointer __r = static_cast<__node_pointer>(__child);
14063e519524SHoward Hinnant    if (__child == nullptr)
14073e519524SHoward Hinnant    {
14084a95f9ebSHoward Hinnant        __node_holder __h = __construct_node_with_key(__k);
140907d3eccdSHoward Hinnant        __tree_.__insert_node_at(__parent, __child, static_cast<__node_base_pointer>(__h.get()));
14103e519524SHoward Hinnant        __r = __h.release();
14113e519524SHoward Hinnant    }
141207d3eccdSHoward Hinnant    return __r->__value_.__cc.second;
14133e519524SHoward Hinnant}
14143e519524SHoward Hinnant
141554f0cda6SEric Fiselier#else
141654f0cda6SEric Fiselier
141754f0cda6SEric Fiseliertemplate <class _Key, class _Tp, class _Compare, class _Allocator>
141854f0cda6SEric Fiselier_Tp&
141954f0cda6SEric Fiseliermap<_Key, _Tp, _Compare, _Allocator>::operator[](const key_type& __k)
142054f0cda6SEric Fiselier{
142154f0cda6SEric Fiselier    return __tree_.__emplace_unique_key_args(__k,
142254f0cda6SEric Fiselier        _VSTD::piecewise_construct,
142354f0cda6SEric Fiselier        _VSTD::forward_as_tuple(__k),
142454f0cda6SEric Fiselier        _VSTD::forward_as_tuple()).first->__cc.second;
142554f0cda6SEric Fiselier}
14263e519524SHoward Hinnant
14273e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator>
14283e519524SHoward Hinnant_Tp&
14293e519524SHoward Hinnantmap<_Key, _Tp, _Compare, _Allocator>::operator[](key_type&& __k)
14303e519524SHoward Hinnant{
143154f0cda6SEric Fiselier    return __tree_.__emplace_unique_key_args(__k,
143254f0cda6SEric Fiselier        _VSTD::piecewise_construct,
143354f0cda6SEric Fiselier        _VSTD::forward_as_tuple(_VSTD::move(__k)),
143454f0cda6SEric Fiselier        _VSTD::forward_as_tuple()).first->__cc.second;
14353e519524SHoward Hinnant}
14363e519524SHoward Hinnant
143754f0cda6SEric Fiselier#endif  // !_LIBCPP_CXX03_LANG
14383e519524SHoward Hinnant
14393e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator>
14403e519524SHoward Hinnant_Tp&
14413e519524SHoward Hinnantmap<_Key, _Tp, _Compare, _Allocator>::at(const key_type& __k)
14423e519524SHoward Hinnant{
14433e519524SHoward Hinnant    __node_base_pointer __parent;
14443e519524SHoward Hinnant    __node_base_pointer& __child = __find_equal_key(__parent, __k);
144554b409fdSHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
14463e519524SHoward Hinnant    if (__child == nullptr)
14473e519524SHoward Hinnant        throw out_of_range("map::at:  key not found");
1448b3371f6fSHoward Hinnant#endif  // _LIBCPP_NO_EXCEPTIONS
144907d3eccdSHoward Hinnant    return static_cast<__node_pointer>(__child)->__value_.__cc.second;
14503e519524SHoward Hinnant}
14513e519524SHoward Hinnant
14523e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator>
14533e519524SHoward Hinnantconst _Tp&
14543e519524SHoward Hinnantmap<_Key, _Tp, _Compare, _Allocator>::at(const key_type& __k) const
14553e519524SHoward Hinnant{
14560594ad71SEric Fiselier    __node_base_pointer __parent;
14570594ad71SEric Fiselier    __node_base_pointer __child = __find_equal_key(__parent, __k);
145854b409fdSHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
14593e519524SHoward Hinnant    if (__child == nullptr)
14603e519524SHoward Hinnant        throw out_of_range("map::at:  key not found");
1461b3371f6fSHoward Hinnant#endif  // _LIBCPP_NO_EXCEPTIONS
14620594ad71SEric Fiselier    return static_cast<__node_pointer>(__child)->__value_.__cc.second;
14633e519524SHoward Hinnant}
14643e519524SHoward Hinnant
14653e519524SHoward Hinnant
14663e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator>
1467848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
14683e519524SHoward Hinnantbool
14693e519524SHoward Hinnantoperator==(const map<_Key, _Tp, _Compare, _Allocator>& __x,
14703e519524SHoward Hinnant           const map<_Key, _Tp, _Compare, _Allocator>& __y)
14713e519524SHoward Hinnant{
1472ce48a113SHoward Hinnant    return __x.size() == __y.size() && _VSTD::equal(__x.begin(), __x.end(), __y.begin());
14733e519524SHoward Hinnant}
14743e519524SHoward Hinnant
14753e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator>
1476848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
14773e519524SHoward Hinnantbool
14783e519524SHoward Hinnantoperator< (const map<_Key, _Tp, _Compare, _Allocator>& __x,
14793e519524SHoward Hinnant           const map<_Key, _Tp, _Compare, _Allocator>& __y)
14803e519524SHoward Hinnant{
1481ce48a113SHoward Hinnant    return _VSTD::lexicographical_compare(__x.begin(), __x.end(), __y.begin(), __y.end());
14823e519524SHoward Hinnant}
14833e519524SHoward Hinnant
14843e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator>
1485848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
14863e519524SHoward Hinnantbool
14873e519524SHoward Hinnantoperator!=(const map<_Key, _Tp, _Compare, _Allocator>& __x,
14883e519524SHoward Hinnant           const map<_Key, _Tp, _Compare, _Allocator>& __y)
14893e519524SHoward Hinnant{
14903e519524SHoward Hinnant    return !(__x == __y);
14913e519524SHoward Hinnant}
14923e519524SHoward Hinnant
14933e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator>
1494848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
14953e519524SHoward Hinnantbool
14963e519524SHoward Hinnantoperator> (const map<_Key, _Tp, _Compare, _Allocator>& __x,
14973e519524SHoward Hinnant           const map<_Key, _Tp, _Compare, _Allocator>& __y)
14983e519524SHoward Hinnant{
14993e519524SHoward Hinnant    return __y < __x;
15003e519524SHoward Hinnant}
15013e519524SHoward Hinnant
15023e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator>
1503848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
15043e519524SHoward Hinnantbool
15053e519524SHoward Hinnantoperator>=(const map<_Key, _Tp, _Compare, _Allocator>& __x,
15063e519524SHoward Hinnant           const map<_Key, _Tp, _Compare, _Allocator>& __y)
15073e519524SHoward Hinnant{
15083e519524SHoward Hinnant    return !(__x < __y);
15093e519524SHoward Hinnant}
15103e519524SHoward Hinnant
15113e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator>
1512848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
15133e519524SHoward Hinnantbool
15143e519524SHoward Hinnantoperator<=(const map<_Key, _Tp, _Compare, _Allocator>& __x,
15153e519524SHoward Hinnant           const map<_Key, _Tp, _Compare, _Allocator>& __y)
15163e519524SHoward Hinnant{
15173e519524SHoward Hinnant    return !(__y < __x);
15183e519524SHoward Hinnant}
15193e519524SHoward Hinnant
15203e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator>
1521848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
15223e519524SHoward Hinnantvoid
15233e519524SHoward Hinnantswap(map<_Key, _Tp, _Compare, _Allocator>& __x,
15243e519524SHoward Hinnant     map<_Key, _Tp, _Compare, _Allocator>& __y)
15251052ee39SHoward Hinnant    _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
15263e519524SHoward Hinnant{
15273e519524SHoward Hinnant    __x.swap(__y);
15283e519524SHoward Hinnant}
15293e519524SHoward Hinnant
15303e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare = less<_Key>,
15313e519524SHoward Hinnant          class _Allocator = allocator<pair<const _Key, _Tp> > >
1532*e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS multimap
15333e519524SHoward Hinnant{
15343e519524SHoward Hinnantpublic:
15353e519524SHoward Hinnant    // types:
15363e519524SHoward Hinnant    typedef _Key                                     key_type;
15373e519524SHoward Hinnant    typedef _Tp                                      mapped_type;
15383e519524SHoward Hinnant    typedef pair<const key_type, mapped_type>        value_type;
153907d3eccdSHoward Hinnant    typedef pair<key_type, mapped_type>              __nc_value_type;
15403e519524SHoward Hinnant    typedef _Compare                                 key_compare;
15413e519524SHoward Hinnant    typedef _Allocator                               allocator_type;
15423e519524SHoward Hinnant    typedef value_type&                              reference;
15433e519524SHoward Hinnant    typedef const value_type&                        const_reference;
15443e519524SHoward Hinnant
154594f89aeeSMarshall Clow    static_assert((is_same<typename allocator_type::value_type, value_type>::value),
154694f89aeeSMarshall Clow                  "Allocator::value_type must be same type as value_type");
154794f89aeeSMarshall Clow
1548*e2f2d1edSEric Fiselier    class _LIBCPP_TEMPLATE_VIS value_compare
15493e519524SHoward Hinnant        : public binary_function<value_type, value_type, bool>
15503e519524SHoward Hinnant    {
15513e519524SHoward Hinnant        friend class multimap;
15523e519524SHoward Hinnant    protected:
15533e519524SHoward Hinnant        key_compare comp;
15543e519524SHoward Hinnant
1555848a5374SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
15563e519524SHoward Hinnant        value_compare(key_compare c) : comp(c) {}
15573e519524SHoward Hinnant    public:
1558848a5374SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
15593e519524SHoward Hinnant        bool operator()(const value_type& __x, const value_type& __y) const
15603e519524SHoward Hinnant            {return comp(__x.first, __y.first);}
15613e519524SHoward Hinnant    };
15623e519524SHoward Hinnant
15633e519524SHoward Hinnantprivate:
156407d3eccdSHoward Hinnant
15659fd9f84fSHoward Hinnant    typedef _VSTD::__value_type<key_type, mapped_type>             __value_type;
1566abb160e6SHoward Hinnant    typedef __map_value_compare<key_type, __value_type, key_compare> __vc;
15671f508014SMarshall Clow    typedef typename __rebind_alloc_helper<allocator_traits<allocator_type>,
15681f508014SMarshall Clow                                                 __value_type>::type __allocator_type;
15693e519524SHoward Hinnant    typedef __tree<__value_type, __vc, __allocator_type>            __base;
15703e519524SHoward Hinnant    typedef typename __base::__node_traits                          __node_traits;
15713e519524SHoward Hinnant    typedef allocator_traits<allocator_type>                        __alloc_traits;
15723e519524SHoward Hinnant
15733e519524SHoward Hinnant    __base __tree_;
15743e519524SHoward Hinnant
15753e519524SHoward Hinnantpublic:
15763e519524SHoward Hinnant    typedef typename __alloc_traits::pointer               pointer;
15773e519524SHoward Hinnant    typedef typename __alloc_traits::const_pointer         const_pointer;
15783e519524SHoward Hinnant    typedef typename __alloc_traits::size_type             size_type;
15793e519524SHoward Hinnant    typedef typename __alloc_traits::difference_type       difference_type;
15803e519524SHoward Hinnant    typedef __map_iterator<typename __base::iterator>      iterator;
15813e519524SHoward Hinnant    typedef __map_const_iterator<typename __base::const_iterator> const_iterator;
1582ce48a113SHoward Hinnant    typedef _VSTD::reverse_iterator<iterator>               reverse_iterator;
1583ce48a113SHoward Hinnant    typedef _VSTD::reverse_iterator<const_iterator>         const_reverse_iterator;
15843e519524SHoward Hinnant
1585848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
1586415a24e4SMarshall Clow    multimap()
1587415a24e4SMarshall Clow        _NOEXCEPT_(
1588415a24e4SMarshall Clow            is_nothrow_default_constructible<allocator_type>::value &&
1589415a24e4SMarshall Clow            is_nothrow_default_constructible<key_compare>::value &&
1590415a24e4SMarshall Clow            is_nothrow_copy_constructible<key_compare>::value)
1591415a24e4SMarshall Clow        : __tree_(__vc(key_compare())) {}
1592415a24e4SMarshall Clow
1593415a24e4SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
1594415a24e4SMarshall Clow    explicit multimap(const key_compare& __comp)
15951052ee39SHoward Hinnant        _NOEXCEPT_(
15961052ee39SHoward Hinnant            is_nothrow_default_constructible<allocator_type>::value &&
15971052ee39SHoward Hinnant            is_nothrow_copy_constructible<key_compare>::value)
15983e519524SHoward Hinnant        : __tree_(__vc(__comp)) {}
15993e519524SHoward Hinnant
1600848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
16013e519524SHoward Hinnant    explicit multimap(const key_compare& __comp, const allocator_type& __a)
16022a10c960SMarshall Clow        : __tree_(__vc(__comp), typename __base::allocator_type(__a)) {}
16033e519524SHoward Hinnant
16043e519524SHoward Hinnant    template <class _InputIterator>
1605848a5374SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
16063e519524SHoward Hinnant        multimap(_InputIterator __f, _InputIterator __l,
16073e519524SHoward Hinnant            const key_compare& __comp = key_compare())
16083e519524SHoward Hinnant        : __tree_(__vc(__comp))
16093e519524SHoward Hinnant        {
16103e519524SHoward Hinnant            insert(__f, __l);
16113e519524SHoward Hinnant        }
16123e519524SHoward Hinnant
16133e519524SHoward Hinnant    template <class _InputIterator>
1614848a5374SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
16153e519524SHoward Hinnant        multimap(_InputIterator __f, _InputIterator __l,
16163e519524SHoward Hinnant            const key_compare& __comp, const allocator_type& __a)
16172a10c960SMarshall Clow        : __tree_(__vc(__comp), typename __base::allocator_type(__a))
16183e519524SHoward Hinnant        {
16193e519524SHoward Hinnant            insert(__f, __l);
16203e519524SHoward Hinnant        }
16213e519524SHoward Hinnant
1622fbc317d4SMarshall Clow#if _LIBCPP_STD_VER > 11
1623fbc317d4SMarshall Clow    template <class _InputIterator>
1624fbc317d4SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
1625fbc317d4SMarshall Clow    multimap(_InputIterator __f, _InputIterator __l, const allocator_type& __a)
1626fbc317d4SMarshall Clow        : multimap(__f, __l, key_compare(), __a) {}
1627fbc317d4SMarshall Clow#endif
1628fbc317d4SMarshall Clow
1629848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
16303e519524SHoward Hinnant    multimap(const multimap& __m)
16313e519524SHoward Hinnant        : __tree_(__m.__tree_.value_comp(),
16323e519524SHoward Hinnant          __alloc_traits::select_on_container_copy_construction(__m.__tree_.__alloc()))
16333e519524SHoward Hinnant        {
16343e519524SHoward Hinnant            insert(__m.begin(), __m.end());
16353e519524SHoward Hinnant        }
16363e519524SHoward Hinnant
16375a33687dSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
16385a33687dSHoward Hinnant    multimap& operator=(const multimap& __m)
16395a33687dSHoward Hinnant        {
16402ee83725SMarshall Clow#ifndef _LIBCPP_CXX03_LANG
16415a33687dSHoward Hinnant            __tree_ = __m.__tree_;
164207d3eccdSHoward Hinnant#else
164374cf6ff5SMarshall Clow            if (this != &__m) {
164407d3eccdSHoward Hinnant                __tree_.clear();
164507d3eccdSHoward Hinnant                __tree_.value_comp() = __m.__tree_.value_comp();
164607d3eccdSHoward Hinnant                __tree_.__copy_assign_alloc(__m.__tree_);
164707d3eccdSHoward Hinnant                insert(__m.begin(), __m.end());
164874cf6ff5SMarshall Clow            }
164907d3eccdSHoward Hinnant#endif
16505a33687dSHoward Hinnant            return *this;
16515a33687dSHoward Hinnant        }
16525a33687dSHoward Hinnant
16537609c9b6SHoward Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
16543e519524SHoward Hinnant
1655848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
16563e519524SHoward Hinnant    multimap(multimap&& __m)
16571052ee39SHoward Hinnant        _NOEXCEPT_(is_nothrow_move_constructible<__base>::value)
1658ce48a113SHoward Hinnant        : __tree_(_VSTD::move(__m.__tree_))
16593e519524SHoward Hinnant        {
16603e519524SHoward Hinnant        }
16613e519524SHoward Hinnant
16623e519524SHoward Hinnant    multimap(multimap&& __m, const allocator_type& __a);
16633e519524SHoward Hinnant
1664848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
166554976f26SHoward Hinnant    multimap& operator=(multimap&& __m)
166654976f26SHoward Hinnant        _NOEXCEPT_(is_nothrow_move_assignable<__base>::value)
166754976f26SHoward Hinnant        {
166854976f26SHoward Hinnant            __tree_ = _VSTD::move(__m.__tree_);
166954976f26SHoward Hinnant            return *this;
167054976f26SHoward Hinnant        }
167154976f26SHoward Hinnant
167254976f26SHoward Hinnant#endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
167354976f26SHoward Hinnant
167454976f26SHoward Hinnant#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
167554976f26SHoward Hinnant
167654976f26SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
16773e519524SHoward Hinnant    multimap(initializer_list<value_type> __il, const key_compare& __comp = key_compare())
16783e519524SHoward Hinnant        : __tree_(__vc(__comp))
16793e519524SHoward Hinnant        {
16803e519524SHoward Hinnant            insert(__il.begin(), __il.end());
16813e519524SHoward Hinnant        }
16823e519524SHoward Hinnant
1683848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
16843e519524SHoward Hinnant    multimap(initializer_list<value_type> __il, const key_compare& __comp, const allocator_type& __a)
16852a10c960SMarshall Clow        : __tree_(__vc(__comp), typename __base::allocator_type(__a))
16863e519524SHoward Hinnant        {
16873e519524SHoward Hinnant            insert(__il.begin(), __il.end());
16883e519524SHoward Hinnant        }
16893e519524SHoward Hinnant
1690fbc317d4SMarshall Clow#if _LIBCPP_STD_VER > 11
1691fbc317d4SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
1692fbc317d4SMarshall Clow    multimap(initializer_list<value_type> __il, const allocator_type& __a)
1693fbc317d4SMarshall Clow        : multimap(__il, key_compare(), __a) {}
1694fbc317d4SMarshall Clow#endif
1695fbc317d4SMarshall Clow
1696848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
16973e519524SHoward Hinnant    multimap& operator=(initializer_list<value_type> __il)
16983e519524SHoward Hinnant        {
16993e519524SHoward Hinnant            __tree_.__assign_multi(__il.begin(), __il.end());
17003e519524SHoward Hinnant            return *this;
17013e519524SHoward Hinnant        }
170254976f26SHoward Hinnant
170354976f26SHoward Hinnant#endif  // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
17043e519524SHoward Hinnant
1705848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
17063e519524SHoward Hinnant    explicit multimap(const allocator_type& __a)
17072a10c960SMarshall Clow        : __tree_(typename __base::allocator_type(__a))
17083e519524SHoward Hinnant        {
17093e519524SHoward Hinnant        }
17103e519524SHoward Hinnant
1711848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
17123e519524SHoward Hinnant    multimap(const multimap& __m, const allocator_type& __a)
17132a10c960SMarshall Clow        : __tree_(__m.__tree_.value_comp(), typename __base::allocator_type(__a))
17143e519524SHoward Hinnant        {
17153e519524SHoward Hinnant            insert(__m.begin(), __m.end());
17163e519524SHoward Hinnant        }
17173e519524SHoward Hinnant
1718848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
17191052ee39SHoward Hinnant          iterator begin() _NOEXCEPT {return __tree_.begin();}
1720848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
17211052ee39SHoward Hinnant    const_iterator begin() const _NOEXCEPT {return __tree_.begin();}
1722848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
17231052ee39SHoward Hinnant          iterator end() _NOEXCEPT {return __tree_.end();}
1724848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
17251052ee39SHoward Hinnant    const_iterator end() const _NOEXCEPT {return __tree_.end();}
17263e519524SHoward Hinnant
1727848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
17281052ee39SHoward Hinnant          reverse_iterator rbegin() _NOEXCEPT {return reverse_iterator(end());}
1729848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
17301052ee39SHoward Hinnant    const_reverse_iterator rbegin() const _NOEXCEPT
17311052ee39SHoward Hinnant        {return const_reverse_iterator(end());}
1732848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
17331052ee39SHoward Hinnant          reverse_iterator rend() _NOEXCEPT {return reverse_iterator(begin());}
1734848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
17351052ee39SHoward Hinnant    const_reverse_iterator rend() const _NOEXCEPT
17361052ee39SHoward Hinnant        {return const_reverse_iterator(begin());}
17373e519524SHoward Hinnant
1738848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
17391052ee39SHoward Hinnant    const_iterator cbegin()  const _NOEXCEPT {return begin();}
1740848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
17411052ee39SHoward Hinnant    const_iterator cend() const _NOEXCEPT {return end();}
1742848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
17431052ee39SHoward Hinnant    const_reverse_iterator crbegin() const _NOEXCEPT {return rbegin();}
1744848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
17451052ee39SHoward Hinnant    const_reverse_iterator crend() const _NOEXCEPT {return rend();}
17463e519524SHoward Hinnant
1747848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
17481052ee39SHoward Hinnant    bool empty() const _NOEXCEPT {return __tree_.size() == 0;}
1749848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
17501052ee39SHoward Hinnant    size_type size() const _NOEXCEPT {return __tree_.size();}
1751848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
17521052ee39SHoward Hinnant    size_type max_size() const _NOEXCEPT {return __tree_.max_size();}
17533e519524SHoward Hinnant
1754848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
17552a10c960SMarshall Clow    allocator_type get_allocator() const _NOEXCEPT {return allocator_type(__tree_.__alloc());}
1756848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
17573e519524SHoward Hinnant    key_compare    key_comp() const {return __tree_.value_comp().key_comp();}
1758848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
17591052ee39SHoward Hinnant    value_compare  value_comp() const
17601052ee39SHoward Hinnant        {return value_compare(__tree_.value_comp().key_comp());}
17613e519524SHoward Hinnant
17625e3ea4ddSEric Fiselier#ifndef _LIBCPP_CXX03_LANG
17637609c9b6SHoward Hinnant
17648b805c91SHoward Hinnant    template <class ..._Args>
17655e3ea4ddSEric Fiselier    _LIBCPP_INLINE_VISIBILITY
17665e3ea4ddSEric Fiselier    iterator emplace(_Args&& ...__args) {
17675e3ea4ddSEric Fiselier        return __tree_.__emplace_multi(_VSTD::forward<_Args>(__args)...);
17685e3ea4ddSEric Fiselier    }
17693e519524SHoward Hinnant
17708b805c91SHoward Hinnant    template <class ..._Args>
17715e3ea4ddSEric Fiselier    _LIBCPP_INLINE_VISIBILITY
17725e3ea4ddSEric Fiselier    iterator emplace_hint(const_iterator __p, _Args&& ...__args) {
17735e3ea4ddSEric Fiselier        return __tree_.__emplace_hint_multi(__p.__i_, _VSTD::forward<_Args>(__args)...);
17745e3ea4ddSEric Fiselier    }
17757609c9b6SHoward Hinnant
1776c003db1fSHoward Hinnant    template <class _Pp,
1777c003db1fSHoward Hinnant              class = typename enable_if<is_constructible<value_type, _Pp>::value>::type>
1778848a5374SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
1779c003db1fSHoward Hinnant        iterator insert(_Pp&& __p)
1780c003db1fSHoward Hinnant            {return __tree_.__insert_multi(_VSTD::forward<_Pp>(__p));}
17813e519524SHoward Hinnant
1782c003db1fSHoward Hinnant    template <class _Pp,
1783c003db1fSHoward Hinnant              class = typename enable_if<is_constructible<value_type, _Pp>::value>::type>
1784848a5374SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
1785c003db1fSHoward Hinnant        iterator insert(const_iterator __pos, _Pp&& __p)
1786c003db1fSHoward Hinnant            {return __tree_.__insert_multi(__pos.__i_, _VSTD::forward<_Pp>(__p));}
17873e519524SHoward Hinnant
17887a9f500fSEric Fiselier    _LIBCPP_INLINE_VISIBILITY
17897a9f500fSEric Fiselier    iterator insert(value_type&& __v)
17907a9f500fSEric Fiselier        {return __tree_.__insert_multi(_VSTD::move(__v));}
17917a9f500fSEric Fiselier
17927a9f500fSEric Fiselier    _LIBCPP_INLINE_VISIBILITY
17937a9f500fSEric Fiselier    iterator insert(const_iterator __p, value_type&& __v)
17947a9f500fSEric Fiselier        {return __tree_.__insert_multi(__p.__i_, _VSTD::move(__v));}
17957a9f500fSEric Fiselier
17965e3ea4ddSEric Fiselier#endif  // _LIBCPP_CXX03_LANG
17973e519524SHoward Hinnant
1798848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
17993e519524SHoward Hinnant    iterator insert(const value_type& __v) {return __tree_.__insert_multi(__v);}
18003e519524SHoward Hinnant
1801848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
18023e519524SHoward Hinnant    iterator insert(const_iterator __p, const value_type& __v)
18033e519524SHoward Hinnant            {return __tree_.__insert_multi(__p.__i_, __v);}
18043e519524SHoward Hinnant
18053e519524SHoward Hinnant    template <class _InputIterator>
1806848a5374SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
18073e519524SHoward Hinnant        void insert(_InputIterator __f, _InputIterator __l)
18083e519524SHoward Hinnant        {
18093e519524SHoward Hinnant            for (const_iterator __e = cend(); __f != __l; ++__f)
18103e519524SHoward Hinnant                __tree_.__insert_multi(__e.__i_, *__f);
18113e519524SHoward Hinnant        }
18123e519524SHoward Hinnant
181354976f26SHoward Hinnant#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
181454976f26SHoward Hinnant
1815848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
18163e519524SHoward Hinnant    void insert(initializer_list<value_type> __il)
18173e519524SHoward Hinnant        {insert(__il.begin(), __il.end());}
18183e519524SHoward Hinnant
181954976f26SHoward Hinnant#endif  // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
182054976f26SHoward Hinnant
1821848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
18223e519524SHoward Hinnant    iterator erase(const_iterator __p) {return __tree_.erase(__p.__i_);}
1823848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
1824ec392968SMarshall Clow    iterator erase(iterator __p)       {return __tree_.erase(__p.__i_);}
1825ec392968SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
18263e519524SHoward Hinnant    size_type erase(const key_type& __k) {return __tree_.__erase_multi(__k);}
1827848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
18283e519524SHoward Hinnant    iterator  erase(const_iterator __f, const_iterator __l)
18293e519524SHoward Hinnant        {return __tree_.erase(__f.__i_, __l.__i_);}
1830848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
18313e519524SHoward Hinnant    void clear() {__tree_.clear();}
18323e519524SHoward Hinnant
1833848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
18341052ee39SHoward Hinnant    void swap(multimap& __m)
18351052ee39SHoward Hinnant        _NOEXCEPT_(__is_nothrow_swappable<__base>::value)
18361052ee39SHoward Hinnant        {__tree_.swap(__m.__tree_);}
18373e519524SHoward Hinnant
1838848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
18393e519524SHoward Hinnant    iterator find(const key_type& __k)             {return __tree_.find(__k);}
1840848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
18413e519524SHoward Hinnant    const_iterator find(const key_type& __k) const {return __tree_.find(__k);}
18422585835cSMarshall Clow#if _LIBCPP_STD_VER > 11
18432585835cSMarshall Clow    template <typename _K2>
18442585835cSMarshall Clow    _LIBCPP_INLINE_VISIBILITY
18452585835cSMarshall Clow    typename enable_if<__is_transparent<_Compare, _K2>::value,iterator>::type
18462585835cSMarshall Clow    find(const _K2& __k)                           {return __tree_.find(__k);}
18472585835cSMarshall Clow    template <typename _K2>
18482585835cSMarshall Clow    _LIBCPP_INLINE_VISIBILITY
18492585835cSMarshall Clow    typename enable_if<__is_transparent<_Compare, _K2>::value,const_iterator>::type
18502585835cSMarshall Clow    find(const _K2& __k) const                     {return __tree_.find(__k);}
18512585835cSMarshall Clow#endif
18522585835cSMarshall Clow
1853848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
18543e519524SHoward Hinnant    size_type      count(const key_type& __k) const
18553e519524SHoward Hinnant        {return __tree_.__count_multi(__k);}
18560aacbc92SMarshall Clow#if _LIBCPP_STD_VER > 11
18570aacbc92SMarshall Clow    template <typename _K2>
18580aacbc92SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
18590aacbc92SMarshall Clow    typename enable_if<__is_transparent<_Compare, _K2>::value,size_type>::type
1860f8457a07SMarshall Clow    count(const _K2& __k) const {return __tree_.__count_multi(__k);}
18610aacbc92SMarshall Clow#endif
1862848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
18633e519524SHoward Hinnant    iterator lower_bound(const key_type& __k)
18643e519524SHoward Hinnant        {return __tree_.lower_bound(__k);}
1865848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
18663e519524SHoward Hinnant    const_iterator lower_bound(const key_type& __k) const
18673e519524SHoward Hinnant            {return __tree_.lower_bound(__k);}
18682585835cSMarshall Clow#if _LIBCPP_STD_VER > 11
18692585835cSMarshall Clow    template <typename _K2>
18702585835cSMarshall Clow    _LIBCPP_INLINE_VISIBILITY
18712585835cSMarshall Clow    typename enable_if<__is_transparent<_Compare, _K2>::value,iterator>::type
18722585835cSMarshall Clow    lower_bound(const _K2& __k)       {return __tree_.lower_bound(__k);}
18732585835cSMarshall Clow
18742585835cSMarshall Clow    template <typename _K2>
18752585835cSMarshall Clow    _LIBCPP_INLINE_VISIBILITY
18762585835cSMarshall Clow    typename enable_if<__is_transparent<_Compare, _K2>::value,const_iterator>::type
18772585835cSMarshall Clow    lower_bound(const _K2& __k) const {return __tree_.lower_bound(__k);}
18782585835cSMarshall Clow#endif
18792585835cSMarshall Clow
1880848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
18813e519524SHoward Hinnant    iterator upper_bound(const key_type& __k)
18823e519524SHoward Hinnant            {return __tree_.upper_bound(__k);}
1883848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
18843e519524SHoward Hinnant    const_iterator upper_bound(const key_type& __k) const
18853e519524SHoward Hinnant            {return __tree_.upper_bound(__k);}
18862585835cSMarshall Clow#if _LIBCPP_STD_VER > 11
18872585835cSMarshall Clow    template <typename _K2>
18882585835cSMarshall Clow    _LIBCPP_INLINE_VISIBILITY
18892585835cSMarshall Clow    typename enable_if<__is_transparent<_Compare, _K2>::value,iterator>::type
18902585835cSMarshall Clow    upper_bound(const _K2& __k)       {return __tree_.upper_bound(__k);}
18912585835cSMarshall Clow    template <typename _K2>
18922585835cSMarshall Clow    _LIBCPP_INLINE_VISIBILITY
18932585835cSMarshall Clow    typename enable_if<__is_transparent<_Compare, _K2>::value,const_iterator>::type
18942585835cSMarshall Clow    upper_bound(const _K2& __k) const {return __tree_.upper_bound(__k);}
18952585835cSMarshall Clow#endif
18962585835cSMarshall Clow
1897848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
18983e519524SHoward Hinnant    pair<iterator,iterator>             equal_range(const key_type& __k)
18993e519524SHoward Hinnant            {return __tree_.__equal_range_multi(__k);}
1900848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
19013e519524SHoward Hinnant    pair<const_iterator,const_iterator> equal_range(const key_type& __k) const
19023e519524SHoward Hinnant            {return __tree_.__equal_range_multi(__k);}
19032585835cSMarshall Clow#if _LIBCPP_STD_VER > 11
19042585835cSMarshall Clow    template <typename _K2>
19052585835cSMarshall Clow    _LIBCPP_INLINE_VISIBILITY
19062585835cSMarshall Clow    typename enable_if<__is_transparent<_Compare, _K2>::value,pair<iterator,iterator>>::type
19072585835cSMarshall Clow    equal_range(const _K2& __k)       {return __tree_.__equal_range_multi(__k);}
19082585835cSMarshall Clow    template <typename _K2>
19092585835cSMarshall Clow    _LIBCPP_INLINE_VISIBILITY
19102585835cSMarshall Clow    typename enable_if<__is_transparent<_Compare, _K2>::value,pair<const_iterator,const_iterator>>::type
19112585835cSMarshall Clow    equal_range(const _K2& __k) const {return __tree_.__equal_range_multi(__k);}
19122585835cSMarshall Clow#endif
19133e519524SHoward Hinnant
19143e519524SHoward Hinnantprivate:
19153e519524SHoward Hinnant    typedef typename __base::__node                    __node;
19163e519524SHoward Hinnant    typedef typename __base::__node_allocator          __node_allocator;
19173e519524SHoward Hinnant    typedef typename __base::__node_pointer            __node_pointer;
19180594ad71SEric Fiselier
1919c003db1fSHoward Hinnant    typedef __map_node_destructor<__node_allocator> _Dp;
1920c003db1fSHoward Hinnant    typedef unique_ptr<__node, _Dp> __node_holder;
19213e519524SHoward Hinnant};
19223e519524SHoward Hinnant
19235e3ea4ddSEric Fiselier#ifndef _LIBCPP_CXX03_LANG
19243e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator>
19253e519524SHoward Hinnantmultimap<_Key, _Tp, _Compare, _Allocator>::multimap(multimap&& __m, const allocator_type& __a)
19262a10c960SMarshall Clow    : __tree_(_VSTD::move(__m.__tree_), typename __base::allocator_type(__a))
19273e519524SHoward Hinnant{
19283e519524SHoward Hinnant    if (__a != __m.get_allocator())
19293e519524SHoward Hinnant    {
19303e519524SHoward Hinnant        const_iterator __e = cend();
19313e519524SHoward Hinnant        while (!__m.empty())
19323e519524SHoward Hinnant            __tree_.__insert_multi(__e.__i_,
19335e3ea4ddSEric Fiselier                    _VSTD::move(__m.__tree_.remove(__m.begin().__i_)->__value_.__nc));
19343e519524SHoward Hinnant    }
19353e519524SHoward Hinnant}
19365e3ea4ddSEric Fiselier#endif
19373e519524SHoward Hinnant
19383e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator>
1939848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
19403e519524SHoward Hinnantbool
19413e519524SHoward Hinnantoperator==(const multimap<_Key, _Tp, _Compare, _Allocator>& __x,
19423e519524SHoward Hinnant           const multimap<_Key, _Tp, _Compare, _Allocator>& __y)
19433e519524SHoward Hinnant{
1944ce48a113SHoward Hinnant    return __x.size() == __y.size() && _VSTD::equal(__x.begin(), __x.end(), __y.begin());
19453e519524SHoward Hinnant}
19463e519524SHoward Hinnant
19473e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator>
1948848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
19493e519524SHoward Hinnantbool
19503e519524SHoward Hinnantoperator< (const multimap<_Key, _Tp, _Compare, _Allocator>& __x,
19513e519524SHoward Hinnant           const multimap<_Key, _Tp, _Compare, _Allocator>& __y)
19523e519524SHoward Hinnant{
1953ce48a113SHoward Hinnant    return _VSTD::lexicographical_compare(__x.begin(), __x.end(), __y.begin(), __y.end());
19543e519524SHoward Hinnant}
19553e519524SHoward Hinnant
19563e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator>
1957848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
19583e519524SHoward Hinnantbool
19593e519524SHoward Hinnantoperator!=(const multimap<_Key, _Tp, _Compare, _Allocator>& __x,
19603e519524SHoward Hinnant           const multimap<_Key, _Tp, _Compare, _Allocator>& __y)
19613e519524SHoward Hinnant{
19623e519524SHoward Hinnant    return !(__x == __y);
19633e519524SHoward Hinnant}
19643e519524SHoward Hinnant
19653e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator>
1966848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
19673e519524SHoward Hinnantbool
19683e519524SHoward Hinnantoperator> (const multimap<_Key, _Tp, _Compare, _Allocator>& __x,
19693e519524SHoward Hinnant           const multimap<_Key, _Tp, _Compare, _Allocator>& __y)
19703e519524SHoward Hinnant{
19713e519524SHoward Hinnant    return __y < __x;
19723e519524SHoward Hinnant}
19733e519524SHoward Hinnant
19743e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator>
1975848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
19763e519524SHoward Hinnantbool
19773e519524SHoward Hinnantoperator>=(const multimap<_Key, _Tp, _Compare, _Allocator>& __x,
19783e519524SHoward Hinnant           const multimap<_Key, _Tp, _Compare, _Allocator>& __y)
19793e519524SHoward Hinnant{
19803e519524SHoward Hinnant    return !(__x < __y);
19813e519524SHoward Hinnant}
19823e519524SHoward Hinnant
19833e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator>
1984848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
19853e519524SHoward Hinnantbool
19863e519524SHoward Hinnantoperator<=(const multimap<_Key, _Tp, _Compare, _Allocator>& __x,
19873e519524SHoward Hinnant           const multimap<_Key, _Tp, _Compare, _Allocator>& __y)
19883e519524SHoward Hinnant{
19893e519524SHoward Hinnant    return !(__y < __x);
19903e519524SHoward Hinnant}
19913e519524SHoward Hinnant
19923e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator>
1993848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
19943e519524SHoward Hinnantvoid
19953e519524SHoward Hinnantswap(multimap<_Key, _Tp, _Compare, _Allocator>& __x,
19963e519524SHoward Hinnant     multimap<_Key, _Tp, _Compare, _Allocator>& __y)
19971052ee39SHoward Hinnant    _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
19983e519524SHoward Hinnant{
19993e519524SHoward Hinnant    __x.swap(__y);
20003e519524SHoward Hinnant}
20013e519524SHoward Hinnant
20023e519524SHoward Hinnant_LIBCPP_END_NAMESPACE_STD
20033e519524SHoward Hinnant
20043e519524SHoward Hinnant#endif  // _LIBCPP_MAP
2005