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