xref: /llvm-project-15.0.7/libcxx/include/map (revision f56972e2)
13e519524SHoward Hinnant// -*- C++ -*-
23e519524SHoward Hinnant//===----------------------------- map ------------------------------------===//
33e519524SHoward Hinnant//
45b08a8a4SHoward Hinnant//                     The LLVM Compiler Infrastructure
53e519524SHoward Hinnant//
6412dbebeSHoward Hinnant// This file is dual licensed under the MIT and the University of Illinois Open
7412dbebeSHoward Hinnant// Source Licenses. See LICENSE.TXT for details.
83e519524SHoward Hinnant//
93e519524SHoward Hinnant//===----------------------------------------------------------------------===//
103e519524SHoward Hinnant
113e519524SHoward Hinnant#ifndef _LIBCPP_MAP
123e519524SHoward Hinnant#define _LIBCPP_MAP
133e519524SHoward Hinnant
143e519524SHoward Hinnant/*
153e519524SHoward Hinnant
163e519524SHoward Hinnant    map synopsis
173e519524SHoward Hinnant
183e519524SHoward Hinnantnamespace std
193e519524SHoward Hinnant{
203e519524SHoward Hinnant
213e519524SHoward Hinnanttemplate <class Key, class T, class Compare = less<Key>,
223e519524SHoward Hinnant          class Allocator = allocator<pair<const Key, T>>>
233e519524SHoward Hinnantclass map
243e519524SHoward Hinnant{
253e519524SHoward Hinnantpublic:
263e519524SHoward Hinnant    // types:
273e519524SHoward Hinnant    typedef Key                                      key_type;
283e519524SHoward Hinnant    typedef T                                        mapped_type;
293e519524SHoward Hinnant    typedef pair<const key_type, mapped_type>        value_type;
303e519524SHoward Hinnant    typedef Compare                                  key_compare;
313e519524SHoward Hinnant    typedef Allocator                                allocator_type;
323e519524SHoward Hinnant    typedef typename allocator_type::reference       reference;
333e519524SHoward Hinnant    typedef typename allocator_type::const_reference const_reference;
343e519524SHoward Hinnant    typedef typename allocator_type::pointer         pointer;
353e519524SHoward Hinnant    typedef typename allocator_type::const_pointer   const_pointer;
363e519524SHoward Hinnant    typedef typename allocator_type::size_type       size_type;
373e519524SHoward Hinnant    typedef typename allocator_type::difference_type difference_type;
383e519524SHoward Hinnant
393e519524SHoward Hinnant    typedef implementation-defined                   iterator;
403e519524SHoward Hinnant    typedef implementation-defined                   const_iterator;
413e519524SHoward Hinnant    typedef std::reverse_iterator<iterator>          reverse_iterator;
423e519524SHoward Hinnant    typedef std::reverse_iterator<const_iterator>    const_reverse_iterator;
43b0386a51SErik Pilkington    typedef unspecified                              node_type;              // C++17
44b0386a51SErik Pilkington    typedef INSERT_RETURN_TYPE<iterator, node_type>  insert_return_type;     // C++17
453e519524SHoward Hinnant
463e519524SHoward Hinnant    class value_compare
473e519524SHoward Hinnant        : public binary_function<value_type, value_type, bool>
483e519524SHoward Hinnant    {
493e519524SHoward Hinnant        friend class map;
503e519524SHoward Hinnant    protected:
513e519524SHoward Hinnant        key_compare comp;
523e519524SHoward Hinnant
533e519524SHoward Hinnant        value_compare(key_compare c);
543e519524SHoward Hinnant    public:
553e519524SHoward Hinnant        bool operator()(const value_type& x, const value_type& y) const;
563e519524SHoward Hinnant    };
573e519524SHoward Hinnant
583e519524SHoward Hinnant    // construct/copy/destroy:
591052ee39SHoward Hinnant    map()
601052ee39SHoward Hinnant        noexcept(
611052ee39SHoward Hinnant            is_nothrow_default_constructible<allocator_type>::value &&
621052ee39SHoward Hinnant            is_nothrow_default_constructible<key_compare>::value &&
631052ee39SHoward Hinnant            is_nothrow_copy_constructible<key_compare>::value);
643e519524SHoward Hinnant    explicit map(const key_compare& comp);
653e519524SHoward Hinnant    map(const key_compare& comp, const allocator_type& a);
663e519524SHoward Hinnant    template <class InputIterator>
673e519524SHoward Hinnant        map(InputIterator first, InputIterator last,
683e519524SHoward Hinnant            const key_compare& comp = key_compare());
693e519524SHoward Hinnant    template <class InputIterator>
703e519524SHoward Hinnant        map(InputIterator first, InputIterator last,
713e519524SHoward Hinnant            const key_compare& comp, const allocator_type& a);
723e519524SHoward Hinnant    map(const map& m);
731052ee39SHoward Hinnant    map(map&& m)
741052ee39SHoward Hinnant        noexcept(
751052ee39SHoward Hinnant            is_nothrow_move_constructible<allocator_type>::value &&
761052ee39SHoward Hinnant            is_nothrow_move_constructible<key_compare>::value);
773e519524SHoward Hinnant    explicit map(const allocator_type& a);
783e519524SHoward Hinnant    map(const map& m, const allocator_type& a);
793e519524SHoward Hinnant    map(map&& m, const allocator_type& a);
803e519524SHoward Hinnant    map(initializer_list<value_type> il, const key_compare& comp = key_compare());
813e519524SHoward Hinnant    map(initializer_list<value_type> il, const key_compare& comp, const allocator_type& a);
82fbc317d4SMarshall Clow    template <class InputIterator>
83fbc317d4SMarshall Clow        map(InputIterator first, InputIterator last, const allocator_type& a)
84fbc317d4SMarshall Clow            : map(first, last, Compare(), a) {}  // C++14
85fbc317d4SMarshall Clow    map(initializer_list<value_type> il, const allocator_type& a)
86fbc317d4SMarshall Clow        : map(il, Compare(), a) {}  // C++14
873e519524SHoward Hinnant   ~map();
883e519524SHoward Hinnant
893e519524SHoward Hinnant    map& operator=(const map& m);
901052ee39SHoward Hinnant    map& operator=(map&& m)
911052ee39SHoward Hinnant        noexcept(
921052ee39SHoward Hinnant            allocator_type::propagate_on_container_move_assignment::value &&
931052ee39SHoward Hinnant            is_nothrow_move_assignable<allocator_type>::value &&
940e9f71c1SHoward Hinnant            is_nothrow_move_assignable<key_compare>::value);
953e519524SHoward Hinnant    map& operator=(initializer_list<value_type> il);
963e519524SHoward Hinnant
973e519524SHoward Hinnant    // iterators:
980e9f71c1SHoward Hinnant          iterator begin() noexcept;
990e9f71c1SHoward Hinnant    const_iterator begin() const noexcept;
1000e9f71c1SHoward Hinnant          iterator end() noexcept;
1010e9f71c1SHoward Hinnant    const_iterator end()   const noexcept;
1023e519524SHoward Hinnant
1030e9f71c1SHoward Hinnant          reverse_iterator rbegin() noexcept;
1040e9f71c1SHoward Hinnant    const_reverse_iterator rbegin() const noexcept;
1050e9f71c1SHoward Hinnant          reverse_iterator rend() noexcept;
1060e9f71c1SHoward Hinnant    const_reverse_iterator rend()   const noexcept;
1073e519524SHoward Hinnant
1080e9f71c1SHoward Hinnant    const_iterator         cbegin()  const noexcept;
1090e9f71c1SHoward Hinnant    const_iterator         cend()    const noexcept;
1100e9f71c1SHoward Hinnant    const_reverse_iterator crbegin() const noexcept;
1110e9f71c1SHoward Hinnant    const_reverse_iterator crend()   const noexcept;
1123e519524SHoward Hinnant
1133e519524SHoward Hinnant    // capacity:
1140e9f71c1SHoward Hinnant    bool      empty()    const noexcept;
1150e9f71c1SHoward Hinnant    size_type size()     const noexcept;
1160e9f71c1SHoward Hinnant    size_type max_size() const noexcept;
1173e519524SHoward Hinnant
1183e519524SHoward Hinnant    // element access:
1193e519524SHoward Hinnant    mapped_type& operator[](const key_type& k);
1203e519524SHoward Hinnant    mapped_type& operator[](key_type&& k);
1213e519524SHoward Hinnant
1223e519524SHoward Hinnant          mapped_type& at(const key_type& k);
1233e519524SHoward Hinnant    const mapped_type& at(const key_type& k) const;
1243e519524SHoward Hinnant
1253e519524SHoward Hinnant    // modifiers:
1263e519524SHoward Hinnant    template <class... Args>
1273e519524SHoward Hinnant        pair<iterator, bool> emplace(Args&&... args);
1283e519524SHoward Hinnant    template <class... Args>
1293e519524SHoward Hinnant        iterator emplace_hint(const_iterator position, Args&&... args);
1303e519524SHoward Hinnant    pair<iterator, bool> insert(const value_type& v);
131afc9ff99SMarshall Clow    pair<iterator, bool> insert(      value_type&& v);                                // C++17
1323e519524SHoward Hinnant    template <class P>
1333e519524SHoward Hinnant        pair<iterator, bool> insert(P&& p);
1343e519524SHoward Hinnant    iterator insert(const_iterator position, const value_type& v);
135afc9ff99SMarshall Clow    iterator insert(const_iterator position,       value_type&& v);                   // C++17
1363e519524SHoward Hinnant    template <class P>
1373e519524SHoward Hinnant        iterator insert(const_iterator position, P&& p);
1383e519524SHoward Hinnant    template <class InputIterator>
1393e519524SHoward Hinnant        void insert(InputIterator first, InputIterator last);
1403e519524SHoward Hinnant    void insert(initializer_list<value_type> il);
1413e519524SHoward Hinnant
142b0386a51SErik Pilkington    node_type extract(const_iterator position);                                       // C++17
143b0386a51SErik Pilkington    node_type extract(const key_type& x);                                             // C++17
144b0386a51SErik Pilkington    insert_return_type insert(node_type&& nh);                                        // C++17
145b0386a51SErik Pilkington    iterator insert(const_iterator hint, node_type&& nh);                             // C++17
146b0386a51SErik Pilkington
1478aaf517dSMarshall Clow    template <class... Args>
1488aaf517dSMarshall Clow        pair<iterator, bool> try_emplace(const key_type& k, Args&&... args);          // C++17
1498aaf517dSMarshall Clow    template <class... Args>
1508aaf517dSMarshall Clow        pair<iterator, bool> try_emplace(key_type&& k, Args&&... args);               // C++17
1518aaf517dSMarshall Clow    template <class... Args>
1528aaf517dSMarshall Clow        iterator try_emplace(const_iterator hint, const key_type& k, Args&&... args); // C++17
1538aaf517dSMarshall Clow    template <class... Args>
1548aaf517dSMarshall Clow        iterator try_emplace(const_iterator hint, key_type&& k, Args&&... args);      // C++17
1558aaf517dSMarshall Clow    template <class M>
1568aaf517dSMarshall Clow        pair<iterator, bool> insert_or_assign(const key_type& k, M&& obj);            // C++17
1578aaf517dSMarshall Clow    template <class M>
1588aaf517dSMarshall Clow        pair<iterator, bool> insert_or_assign(key_type&& k, M&& obj);                 // C++17
1598aaf517dSMarshall Clow    template <class M>
1608aaf517dSMarshall Clow        iterator insert_or_assign(const_iterator hint, const key_type& k, M&& obj);   // C++17
1618aaf517dSMarshall Clow    template <class M>
1628aaf517dSMarshall Clow        iterator insert_or_assign(const_iterator hint, key_type&& k, M&& obj);        // C++17
1638aaf517dSMarshall Clow
1643e519524SHoward Hinnant    iterator  erase(const_iterator position);
165ec392968SMarshall Clow    iterator  erase(iterator position); // C++14
1663e519524SHoward Hinnant    size_type erase(const key_type& k);
1673e519524SHoward Hinnant    iterator  erase(const_iterator first, const_iterator last);
1680e9f71c1SHoward Hinnant    void clear() noexcept;
1693e519524SHoward Hinnant
1701052ee39SHoward Hinnant    void swap(map& m)
171e3fbe143SMarshall Clow        noexcept(allocator_traits<allocator_type>::is_always_equal::value &&
172f07dd8d0SEric Fiselier            is_nothrow_swappable<key_compare>::value); // C++17
1733e519524SHoward Hinnant
1743e519524SHoward Hinnant    // observers:
1750e9f71c1SHoward Hinnant    allocator_type get_allocator() const noexcept;
1763e519524SHoward Hinnant    key_compare    key_comp()      const;
1773e519524SHoward Hinnant    value_compare  value_comp()    const;
1783e519524SHoward Hinnant
1793e519524SHoward Hinnant    // map operations:
1803e519524SHoward Hinnant          iterator find(const key_type& k);
1813e519524SHoward Hinnant    const_iterator find(const key_type& k) const;
1822585835cSMarshall Clow    template<typename K>
1832585835cSMarshall Clow        iterator find(const K& x);              // C++14
1842585835cSMarshall Clow    template<typename K>
1852585835cSMarshall Clow        const_iterator find(const K& x) const;  // C++14
1862585835cSMarshall Clow    template<typename K>
1870aacbc92SMarshall Clow      size_type count(const K& x) const;        // C++14
1882585835cSMarshall Clow
1893e519524SHoward Hinnant    size_type      count(const key_type& k) const;
1903e519524SHoward Hinnant          iterator lower_bound(const key_type& k);
1913e519524SHoward Hinnant    const_iterator lower_bound(const key_type& k) const;
1922585835cSMarshall Clow    template<typename K>
1932585835cSMarshall Clow        iterator lower_bound(const K& x);              // C++14
1942585835cSMarshall Clow    template<typename K>
1952585835cSMarshall Clow        const_iterator lower_bound(const K& x) const;  // C++14
1962585835cSMarshall Clow
1973e519524SHoward Hinnant          iterator upper_bound(const key_type& k);
1983e519524SHoward Hinnant    const_iterator upper_bound(const key_type& k) const;
1992585835cSMarshall Clow    template<typename K>
2002585835cSMarshall Clow        iterator upper_bound(const K& x);              // C++14
2012585835cSMarshall Clow    template<typename K>
2022585835cSMarshall Clow        const_iterator upper_bound(const K& x) const;  // C++14
2032585835cSMarshall Clow
2043e519524SHoward Hinnant    pair<iterator,iterator>             equal_range(const key_type& k);
2053e519524SHoward Hinnant    pair<const_iterator,const_iterator> equal_range(const key_type& k) const;
2062585835cSMarshall Clow    template<typename K>
2072585835cSMarshall Clow        pair<iterator,iterator>             equal_range(const K& x);        // C++14
2082585835cSMarshall Clow    template<typename K>
2092585835cSMarshall Clow        pair<const_iterator,const_iterator> equal_range(const K& x) const;  // C++14
2103e519524SHoward Hinnant};
2113e519524SHoward Hinnant
2123e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator>
2133e519524SHoward Hinnantbool
2143e519524SHoward Hinnantoperator==(const map<Key, T, Compare, Allocator>& x,
2153e519524SHoward Hinnant           const map<Key, T, Compare, Allocator>& y);
2163e519524SHoward Hinnant
2173e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator>
2183e519524SHoward Hinnantbool
2193e519524SHoward Hinnantoperator< (const map<Key, T, Compare, Allocator>& x,
2203e519524SHoward Hinnant           const map<Key, T, Compare, Allocator>& y);
2213e519524SHoward Hinnant
2223e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator>
2233e519524SHoward Hinnantbool
2243e519524SHoward Hinnantoperator!=(const map<Key, T, Compare, Allocator>& x,
2253e519524SHoward Hinnant           const map<Key, T, Compare, Allocator>& y);
2263e519524SHoward Hinnant
2273e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator>
2283e519524SHoward Hinnantbool
2293e519524SHoward Hinnantoperator> (const map<Key, T, Compare, Allocator>& x,
2303e519524SHoward Hinnant           const map<Key, T, Compare, Allocator>& y);
2313e519524SHoward Hinnant
2323e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator>
2333e519524SHoward Hinnantbool
2343e519524SHoward Hinnantoperator>=(const map<Key, T, Compare, Allocator>& x,
2353e519524SHoward Hinnant           const map<Key, T, Compare, Allocator>& y);
2363e519524SHoward Hinnant
2373e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator>
2383e519524SHoward Hinnantbool
2393e519524SHoward Hinnantoperator<=(const map<Key, T, Compare, Allocator>& x,
2403e519524SHoward Hinnant           const map<Key, T, Compare, Allocator>& y);
2413e519524SHoward Hinnant
2423e519524SHoward Hinnant// specialized algorithms:
2433e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator>
2443e519524SHoward Hinnantvoid
2451052ee39SHoward Hinnantswap(map<Key, T, Compare, Allocator>& x, map<Key, T, Compare, Allocator>& y)
2461052ee39SHoward Hinnant    noexcept(noexcept(x.swap(y)));
2473e519524SHoward Hinnant
2483e519524SHoward Hinnanttemplate <class Key, class T, class Compare = less<Key>,
2493e519524SHoward Hinnant          class Allocator = allocator<pair<const Key, T>>>
2503e519524SHoward Hinnantclass multimap
2513e519524SHoward Hinnant{
2523e519524SHoward Hinnantpublic:
2533e519524SHoward Hinnant    // types:
2543e519524SHoward Hinnant    typedef Key                                      key_type;
2553e519524SHoward Hinnant    typedef T                                        mapped_type;
2563e519524SHoward Hinnant    typedef pair<const key_type,mapped_type>         value_type;
2573e519524SHoward Hinnant    typedef Compare                                  key_compare;
2583e519524SHoward Hinnant    typedef Allocator                                allocator_type;
2593e519524SHoward Hinnant    typedef typename allocator_type::reference       reference;
2603e519524SHoward Hinnant    typedef typename allocator_type::const_reference const_reference;
2613e519524SHoward Hinnant    typedef typename allocator_type::size_type       size_type;
2623e519524SHoward Hinnant    typedef typename allocator_type::difference_type difference_type;
2633e519524SHoward Hinnant    typedef typename allocator_type::pointer         pointer;
2643e519524SHoward Hinnant    typedef typename allocator_type::const_pointer   const_pointer;
2653e519524SHoward Hinnant
2663e519524SHoward Hinnant    typedef implementation-defined                   iterator;
2673e519524SHoward Hinnant    typedef implementation-defined                   const_iterator;
2683e519524SHoward Hinnant    typedef std::reverse_iterator<iterator>          reverse_iterator;
2693e519524SHoward Hinnant    typedef std::reverse_iterator<const_iterator>    const_reverse_iterator;
270b0386a51SErik Pilkington    typedef unspecified                              node_type;              // C++17
2713e519524SHoward Hinnant
2723e519524SHoward Hinnant    class value_compare
2733e519524SHoward Hinnant        : public binary_function<value_type,value_type,bool>
2743e519524SHoward Hinnant    {
2753e519524SHoward Hinnant        friend class multimap;
2763e519524SHoward Hinnant    protected:
2773e519524SHoward Hinnant        key_compare comp;
2783e519524SHoward Hinnant        value_compare(key_compare c);
2793e519524SHoward Hinnant    public:
2803e519524SHoward Hinnant        bool operator()(const value_type& x, const value_type& y) const;
2813e519524SHoward Hinnant    };
2823e519524SHoward Hinnant
2833e519524SHoward Hinnant    // construct/copy/destroy:
2841052ee39SHoward Hinnant    multimap()
2851052ee39SHoward Hinnant        noexcept(
2861052ee39SHoward Hinnant            is_nothrow_default_constructible<allocator_type>::value &&
2871052ee39SHoward Hinnant            is_nothrow_default_constructible<key_compare>::value &&
2881052ee39SHoward Hinnant            is_nothrow_copy_constructible<key_compare>::value);
2891052ee39SHoward Hinnant    explicit multimap(const key_compare& comp);
2903e519524SHoward Hinnant    multimap(const key_compare& comp, const allocator_type& a);
2913e519524SHoward Hinnant    template <class InputIterator>
2923e519524SHoward Hinnant        multimap(InputIterator first, InputIterator last, const key_compare& comp);
2933e519524SHoward Hinnant    template <class InputIterator>
2943e519524SHoward Hinnant        multimap(InputIterator first, InputIterator last, const key_compare& comp,
2953e519524SHoward Hinnant                 const allocator_type& a);
2963e519524SHoward Hinnant    multimap(const multimap& m);
2971052ee39SHoward Hinnant    multimap(multimap&& m)
2981052ee39SHoward Hinnant        noexcept(
2991052ee39SHoward Hinnant            is_nothrow_move_constructible<allocator_type>::value &&
3001052ee39SHoward Hinnant            is_nothrow_move_constructible<key_compare>::value);
3013e519524SHoward Hinnant    explicit multimap(const allocator_type& a);
3023e519524SHoward Hinnant    multimap(const multimap& m, const allocator_type& a);
3033e519524SHoward Hinnant    multimap(multimap&& m, const allocator_type& a);
3043e519524SHoward Hinnant    multimap(initializer_list<value_type> il, const key_compare& comp = key_compare());
3053e519524SHoward Hinnant    multimap(initializer_list<value_type> il, const key_compare& comp,
3063e519524SHoward Hinnant             const allocator_type& a);
307fbc317d4SMarshall Clow    template <class InputIterator>
308fbc317d4SMarshall Clow        multimap(InputIterator first, InputIterator last, const allocator_type& a)
309fbc317d4SMarshall Clow            : multimap(first, last, Compare(), a) {} // C++14
310fbc317d4SMarshall Clow    multimap(initializer_list<value_type> il, const allocator_type& a)
311fbc317d4SMarshall Clow        : multimap(il, Compare(), a) {} // C++14
3123e519524SHoward Hinnant    ~multimap();
3133e519524SHoward Hinnant
3143e519524SHoward Hinnant    multimap& operator=(const multimap& m);
3151052ee39SHoward Hinnant    multimap& operator=(multimap&& m)
3161052ee39SHoward Hinnant        noexcept(
3171052ee39SHoward Hinnant            allocator_type::propagate_on_container_move_assignment::value &&
3181052ee39SHoward Hinnant            is_nothrow_move_assignable<allocator_type>::value &&
3190e9f71c1SHoward Hinnant            is_nothrow_move_assignable<key_compare>::value);
3203e519524SHoward Hinnant    multimap& operator=(initializer_list<value_type> il);
3213e519524SHoward Hinnant
3223e519524SHoward Hinnant    // iterators:
3230e9f71c1SHoward Hinnant          iterator begin() noexcept;
3240e9f71c1SHoward Hinnant    const_iterator begin() const noexcept;
3250e9f71c1SHoward Hinnant          iterator end() noexcept;
3260e9f71c1SHoward Hinnant    const_iterator end()   const noexcept;
3273e519524SHoward Hinnant
3280e9f71c1SHoward Hinnant          reverse_iterator rbegin() noexcept;
3290e9f71c1SHoward Hinnant    const_reverse_iterator rbegin() const noexcept;
3300e9f71c1SHoward Hinnant          reverse_iterator rend() noexcept;
3310e9f71c1SHoward Hinnant    const_reverse_iterator rend()   const noexcept;
3323e519524SHoward Hinnant
3330e9f71c1SHoward Hinnant    const_iterator         cbegin()  const noexcept;
3340e9f71c1SHoward Hinnant    const_iterator         cend()    const noexcept;
3350e9f71c1SHoward Hinnant    const_reverse_iterator crbegin() const noexcept;
3360e9f71c1SHoward Hinnant    const_reverse_iterator crend()   const noexcept;
3373e519524SHoward Hinnant
3383e519524SHoward Hinnant    // capacity:
3390e9f71c1SHoward Hinnant    bool      empty()    const noexcept;
3400e9f71c1SHoward Hinnant    size_type size()     const noexcept;
3410e9f71c1SHoward Hinnant    size_type max_size() const noexcept;
3423e519524SHoward Hinnant
3433e519524SHoward Hinnant    // modifiers:
3443e519524SHoward Hinnant    template <class... Args>
3453e519524SHoward Hinnant        iterator emplace(Args&&... args);
3463e519524SHoward Hinnant    template <class... Args>
3473e519524SHoward Hinnant        iterator emplace_hint(const_iterator position, Args&&... args);
3483e519524SHoward Hinnant    iterator insert(const value_type& v);
349afc9ff99SMarshall Clow    iterator insert(      value_type&& v);                                            // C++17
3503e519524SHoward Hinnant    template <class P>
3513e519524SHoward Hinnant        iterator insert(P&& p);
3523e519524SHoward Hinnant    iterator insert(const_iterator position, const value_type& v);
353afc9ff99SMarshall Clow    iterator insert(const_iterator position,       value_type&& v);                   // C++17
3543e519524SHoward Hinnant    template <class P>
3553e519524SHoward Hinnant        iterator insert(const_iterator position, P&& p);
3563e519524SHoward Hinnant    template <class InputIterator>
3573e519524SHoward Hinnant        void insert(InputIterator first, InputIterator last);
3583e519524SHoward Hinnant    void insert(initializer_list<value_type> il);
3593e519524SHoward Hinnant
360b0386a51SErik Pilkington    node_type extract(const_iterator position);                                       // C++17
361b0386a51SErik Pilkington    node_type extract(const key_type& x);                                             // C++17
362b0386a51SErik Pilkington    iterator insert(node_type&& nh);                                                  // C++17
363b0386a51SErik Pilkington    iterator insert(const_iterator hint, node_type&& nh);                             // C++17
364b0386a51SErik Pilkington
3653e519524SHoward Hinnant    iterator  erase(const_iterator position);
366ec392968SMarshall Clow    iterator  erase(iterator position); // C++14
3673e519524SHoward Hinnant    size_type erase(const key_type& k);
3683e519524SHoward Hinnant    iterator  erase(const_iterator first, const_iterator last);
3690e9f71c1SHoward Hinnant    void clear() noexcept;
3703e519524SHoward Hinnant
3711052ee39SHoward Hinnant    void swap(multimap& m)
372e3fbe143SMarshall Clow        noexcept(allocator_traits<allocator_type>::is_always_equal::value &&
373f07dd8d0SEric Fiselier            is_nothrow_swappable<key_compare>::value); // C++17
3743e519524SHoward Hinnant
3753e519524SHoward Hinnant    // observers:
3760e9f71c1SHoward Hinnant    allocator_type get_allocator() const noexcept;
3773e519524SHoward Hinnant    key_compare    key_comp()      const;
3783e519524SHoward Hinnant    value_compare  value_comp()    const;
3793e519524SHoward Hinnant
3803e519524SHoward Hinnant    // map operations:
3813e519524SHoward Hinnant          iterator find(const key_type& k);
3823e519524SHoward Hinnant    const_iterator find(const key_type& k) const;
3832585835cSMarshall Clow    template<typename K>
3842585835cSMarshall Clow        iterator find(const K& x);              // C++14
3852585835cSMarshall Clow    template<typename K>
3862585835cSMarshall Clow        const_iterator find(const K& x) const;  // C++14
3872585835cSMarshall Clow    template<typename K>
3880aacbc92SMarshall Clow      size_type count(const K& x) const;        // C++14
3892585835cSMarshall Clow
3903e519524SHoward Hinnant    size_type      count(const key_type& k) const;
3913e519524SHoward Hinnant          iterator lower_bound(const key_type& k);
3923e519524SHoward Hinnant    const_iterator lower_bound(const key_type& k) const;
3932585835cSMarshall Clow    template<typename K>
3942585835cSMarshall Clow        iterator lower_bound(const K& x);              // C++14
3952585835cSMarshall Clow    template<typename K>
3962585835cSMarshall Clow        const_iterator lower_bound(const K& x) const;  // C++14
3972585835cSMarshall Clow
3983e519524SHoward Hinnant          iterator upper_bound(const key_type& k);
3993e519524SHoward Hinnant    const_iterator upper_bound(const key_type& k) const;
4002585835cSMarshall Clow    template<typename K>
4012585835cSMarshall Clow        iterator upper_bound(const K& x);              // C++14
4022585835cSMarshall Clow    template<typename K>
4032585835cSMarshall Clow        const_iterator upper_bound(const K& x) const;  // C++14
4042585835cSMarshall Clow
4053e519524SHoward Hinnant    pair<iterator,iterator>             equal_range(const key_type& k);
4063e519524SHoward Hinnant    pair<const_iterator,const_iterator> equal_range(const key_type& k) const;
4072585835cSMarshall Clow    template<typename K>
4082585835cSMarshall Clow        pair<iterator,iterator>             equal_range(const K& x);        // C++14
4092585835cSMarshall Clow    template<typename K>
4102585835cSMarshall Clow        pair<const_iterator,const_iterator> equal_range(const K& x) const;  // C++14
4113e519524SHoward Hinnant};
4123e519524SHoward Hinnant
4133e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator>
4143e519524SHoward Hinnantbool
4153e519524SHoward Hinnantoperator==(const multimap<Key, T, Compare, Allocator>& x,
4163e519524SHoward Hinnant           const multimap<Key, T, Compare, Allocator>& y);
4173e519524SHoward Hinnant
4183e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator>
4193e519524SHoward Hinnantbool
4203e519524SHoward Hinnantoperator< (const multimap<Key, T, Compare, Allocator>& x,
4213e519524SHoward Hinnant           const multimap<Key, T, Compare, Allocator>& y);
4223e519524SHoward Hinnant
4233e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator>
4243e519524SHoward Hinnantbool
4253e519524SHoward Hinnantoperator!=(const multimap<Key, T, Compare, Allocator>& x,
4263e519524SHoward Hinnant           const multimap<Key, T, Compare, Allocator>& y);
4273e519524SHoward Hinnant
4283e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator>
4293e519524SHoward Hinnantbool
4303e519524SHoward Hinnantoperator> (const multimap<Key, T, Compare, Allocator>& x,
4313e519524SHoward Hinnant           const multimap<Key, T, Compare, Allocator>& y);
4323e519524SHoward Hinnant
4333e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator>
4343e519524SHoward Hinnantbool
4353e519524SHoward Hinnantoperator>=(const multimap<Key, T, Compare, Allocator>& x,
4363e519524SHoward Hinnant           const multimap<Key, T, Compare, Allocator>& y);
4373e519524SHoward Hinnant
4383e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator>
4393e519524SHoward Hinnantbool
4403e519524SHoward Hinnantoperator<=(const multimap<Key, T, Compare, Allocator>& x,
4413e519524SHoward Hinnant           const multimap<Key, T, Compare, Allocator>& y);
4423e519524SHoward Hinnant
4433e519524SHoward Hinnant// specialized algorithms:
4443e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator>
4453e519524SHoward Hinnantvoid
4463e519524SHoward Hinnantswap(multimap<Key, T, Compare, Allocator>& x,
4471052ee39SHoward Hinnant     multimap<Key, T, Compare, Allocator>& y)
4481052ee39SHoward Hinnant    noexcept(noexcept(x.swap(y)));
4493e519524SHoward Hinnant
4503e519524SHoward Hinnant}  // std
4513e519524SHoward Hinnant
4523e519524SHoward Hinnant*/
4533e519524SHoward Hinnant
4543e519524SHoward Hinnant#include <__config>
4553e519524SHoward Hinnant#include <__tree>
456b0386a51SErik Pilkington#include <__node_handle>
4573e519524SHoward Hinnant#include <iterator>
4583e519524SHoward Hinnant#include <memory>
4593e519524SHoward Hinnant#include <utility>
4603e519524SHoward Hinnant#include <functional>
4613e519524SHoward Hinnant#include <initializer_list>
462ee187e24SEric Fiselier#include <type_traits>
463*f56972e2SMarshall Clow#include <version>
4643e519524SHoward Hinnant
465073458b1SHoward Hinnant#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
4663e519524SHoward Hinnant#pragma GCC system_header
467073458b1SHoward Hinnant#endif
4683e519524SHoward Hinnant
4693e519524SHoward Hinnant_LIBCPP_BEGIN_NAMESPACE_STD
4703e519524SHoward Hinnant
471b1e7a12eSEric Fiseliertemplate <class _Key, class _CP, class _Compare, bool _IsSmall>
4723e519524SHoward Hinnantclass __map_value_compare
4733e519524SHoward Hinnant    : private _Compare
4743e519524SHoward Hinnant{
4753e519524SHoward Hinnantpublic:
476848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
4771052ee39SHoward Hinnant    __map_value_compare()
4781052ee39SHoward Hinnant        _NOEXCEPT_(is_nothrow_default_constructible<_Compare>::value)
4791052ee39SHoward Hinnant        : _Compare() {}
480848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
4811052ee39SHoward Hinnant    __map_value_compare(_Compare c)
4821052ee39SHoward Hinnant        _NOEXCEPT_(is_nothrow_copy_constructible<_Compare>::value)
4831052ee39SHoward Hinnant        : _Compare(c) {}
484848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
4851052ee39SHoward Hinnant    const _Compare& key_comp() const _NOEXCEPT {return *this;}
486848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
4873e519524SHoward Hinnant    bool operator()(const _CP& __x, const _CP& __y) const
488f52318b4SErik Pilkington        {return static_cast<const _Compare&>(*this)(__x.__get_value().first, __y.__get_value().first);}
489848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
4903e519524SHoward Hinnant    bool operator()(const _CP& __x, const _Key& __y) const
491f52318b4SErik Pilkington        {return static_cast<const _Compare&>(*this)(__x.__get_value().first, __y);}
492848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
4933e519524SHoward Hinnant    bool operator()(const _Key& __x, const _CP& __y) const
494f52318b4SErik Pilkington        {return static_cast<const _Compare&>(*this)(__x, __y.__get_value().first);}
495e3fbe143SMarshall Clow    void swap(__map_value_compare&__y)
496e3fbe143SMarshall Clow        _NOEXCEPT_(__is_nothrow_swappable<_Compare>::value)
497e3fbe143SMarshall Clow    {
498e3fbe143SMarshall Clow      using _VSTD::swap;
499e1ec2986SEric Fiselier      swap(static_cast<_Compare&>(*this), static_cast<_Compare&>(__y));
500e3fbe143SMarshall Clow    }
5012585835cSMarshall Clow
5022585835cSMarshall Clow#if _LIBCPP_STD_VER > 11
5032585835cSMarshall Clow    template <typename _K2>
5042585835cSMarshall Clow    _LIBCPP_INLINE_VISIBILITY
5052585835cSMarshall Clow    typename enable_if<__is_transparent<_Compare, _K2>::value, bool>::type
5062585835cSMarshall Clow    operator () ( const _K2& __x, const _CP& __y ) const
507f52318b4SErik Pilkington        {return static_cast<const _Compare&>(*this) (__x, __y.__get_value().first);}
5082585835cSMarshall Clow
5092585835cSMarshall Clow    template <typename _K2>
5102585835cSMarshall Clow    _LIBCPP_INLINE_VISIBILITY
5112585835cSMarshall Clow    typename enable_if<__is_transparent<_Compare, _K2>::value, bool>::type
5122585835cSMarshall Clow    operator () (const _CP& __x, const _K2& __y) const
513f52318b4SErik Pilkington        {return static_cast<const _Compare&>(*this) (__x.__get_value().first, __y);}
5142585835cSMarshall Clow#endif
5153e519524SHoward Hinnant};
5163e519524SHoward Hinnant
517abb160e6SHoward Hinnanttemplate <class _Key, class _CP, class _Compare>
518abb160e6SHoward Hinnantclass __map_value_compare<_Key, _CP, _Compare, false>
5193e519524SHoward Hinnant{
5203e519524SHoward Hinnant    _Compare comp;
5213e519524SHoward Hinnant
5223e519524SHoward Hinnantpublic:
523848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
5241052ee39SHoward Hinnant    __map_value_compare()
5251052ee39SHoward Hinnant        _NOEXCEPT_(is_nothrow_default_constructible<_Compare>::value)
5261052ee39SHoward Hinnant        : comp() {}
527848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
5281052ee39SHoward Hinnant    __map_value_compare(_Compare c)
5291052ee39SHoward Hinnant        _NOEXCEPT_(is_nothrow_copy_constructible<_Compare>::value)
5301052ee39SHoward Hinnant        : comp(c) {}
531848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
5321052ee39SHoward Hinnant    const _Compare& key_comp() const _NOEXCEPT {return comp;}
5333e519524SHoward Hinnant
534848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
5353e519524SHoward Hinnant    bool operator()(const _CP& __x, const _CP& __y) const
536f52318b4SErik Pilkington        {return comp(__x.__get_value().first, __y.__get_value().first);}
537848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
5383e519524SHoward Hinnant    bool operator()(const _CP& __x, const _Key& __y) const
539f52318b4SErik Pilkington        {return comp(__x.__get_value().first, __y);}
540848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
5413e519524SHoward Hinnant    bool operator()(const _Key& __x, const _CP& __y) const
542f52318b4SErik Pilkington        {return comp(__x, __y.__get_value().first);}
543e3fbe143SMarshall Clow    void swap(__map_value_compare&__y)
544e3fbe143SMarshall Clow        _NOEXCEPT_(__is_nothrow_swappable<_Compare>::value)
545e3fbe143SMarshall Clow    {
546e3fbe143SMarshall Clow        using _VSTD::swap;
547e3fbe143SMarshall Clow        swap(comp, __y.comp);
548e3fbe143SMarshall Clow    }
5492585835cSMarshall Clow
5502585835cSMarshall Clow#if _LIBCPP_STD_VER > 11
5512585835cSMarshall Clow    template <typename _K2>
5522585835cSMarshall Clow    _LIBCPP_INLINE_VISIBILITY
5532585835cSMarshall Clow    typename enable_if<__is_transparent<_Compare, _K2>::value, bool>::type
5542585835cSMarshall Clow    operator () ( const _K2& __x, const _CP& __y ) const
555f52318b4SErik Pilkington        {return comp (__x, __y.__get_value().first);}
5562585835cSMarshall Clow
5572585835cSMarshall Clow    template <typename _K2>
5582585835cSMarshall Clow    _LIBCPP_INLINE_VISIBILITY
5592585835cSMarshall Clow    typename enable_if<__is_transparent<_Compare, _K2>::value, bool>::type
5602585835cSMarshall Clow    operator () (const _CP& __x, const _K2& __y) const
561f52318b4SErik Pilkington        {return comp (__x.__get_value().first, __y);}
5622585835cSMarshall Clow#endif
5633e519524SHoward Hinnant};
5643e519524SHoward Hinnant
565e3fbe143SMarshall Clowtemplate <class _Key, class _CP, class _Compare, bool __b>
566e3fbe143SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY
567e3fbe143SMarshall Clowvoid
568e3fbe143SMarshall Clowswap(__map_value_compare<_Key, _CP, _Compare, __b>& __x,
569e3fbe143SMarshall Clow     __map_value_compare<_Key, _CP, _Compare, __b>& __y)
570e3fbe143SMarshall Clow    _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
571e3fbe143SMarshall Clow{
572e3fbe143SMarshall Clow    __x.swap(__y);
573e3fbe143SMarshall Clow}
574e3fbe143SMarshall Clow
5753e519524SHoward Hinnanttemplate <class _Allocator>
5763e519524SHoward Hinnantclass __map_node_destructor
5773e519524SHoward Hinnant{
5783e519524SHoward Hinnant    typedef _Allocator                          allocator_type;
5793e519524SHoward Hinnant    typedef allocator_traits<allocator_type>    __alloc_traits;
580089a7cc5SEric Fiselier
5813e519524SHoward Hinnantpublic:
5823e519524SHoward Hinnant    typedef typename __alloc_traits::pointer    pointer;
5833e519524SHoward Hinnant
584089a7cc5SEric Fiselierprivate:
5853e519524SHoward Hinnant    allocator_type& __na_;
5863e519524SHoward Hinnant
5873e519524SHoward Hinnant    __map_node_destructor& operator=(const __map_node_destructor&);
5883e519524SHoward Hinnant
5893e519524SHoward Hinnantpublic:
5903e519524SHoward Hinnant    bool __first_constructed;
5913e519524SHoward Hinnant    bool __second_constructed;
5923e519524SHoward Hinnant
593848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
5941052ee39SHoward Hinnant    explicit __map_node_destructor(allocator_type& __na) _NOEXCEPT
5953e519524SHoward Hinnant        : __na_(__na),
5963e519524SHoward Hinnant          __first_constructed(false),
5973e519524SHoward Hinnant          __second_constructed(false)
5983e519524SHoward Hinnant        {}
5993e519524SHoward Hinnant
60018293116SEric Fiselier#ifndef _LIBCPP_CXX03_LANG
601848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
6021052ee39SHoward Hinnant    __map_node_destructor(__tree_node_destructor<allocator_type>&& __x) _NOEXCEPT
6033e519524SHoward Hinnant        : __na_(__x.__na_),
6043e519524SHoward Hinnant          __first_constructed(__x.__value_constructed),
6053e519524SHoward Hinnant          __second_constructed(__x.__value_constructed)
6063e519524SHoward Hinnant        {
6073e519524SHoward Hinnant            __x.__value_constructed = false;
6083e519524SHoward Hinnant        }
60918293116SEric Fiselier#endif  // _LIBCPP_CXX03_LANG
6103e519524SHoward Hinnant
611848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
6121052ee39SHoward Hinnant    void operator()(pointer __p) _NOEXCEPT
6133e519524SHoward Hinnant    {
6143e519524SHoward Hinnant        if (__second_constructed)
615f52318b4SErik Pilkington            __alloc_traits::destroy(__na_, _VSTD::addressof(__p->__value_.__get_value().second));
6163e519524SHoward Hinnant        if (__first_constructed)
617f52318b4SErik Pilkington            __alloc_traits::destroy(__na_, _VSTD::addressof(__p->__value_.__get_value().first));
6183e519524SHoward Hinnant        if (__p)
6193e519524SHoward Hinnant            __alloc_traits::deallocate(__na_, __p, 1);
6203e519524SHoward Hinnant    }
6213e519524SHoward Hinnant};
6223e519524SHoward Hinnant
623ce53420eSHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator>
624ce53420eSHoward Hinnant    class map;
625ce53420eSHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator>
626ce53420eSHoward Hinnant    class multimap;
627ce53420eSHoward Hinnanttemplate <class _TreeIterator> class __map_const_iterator;
6283e519524SHoward Hinnant
629089a7cc5SEric Fiselier#ifndef _LIBCPP_CXX03_LANG
6309fd9f84fSHoward Hinnant
6319fd9f84fSHoward Hinnanttemplate <class _Key, class _Tp>
632f52318b4SErik Pilkingtonstruct __value_type
6339fd9f84fSHoward Hinnant{
6349fd9f84fSHoward Hinnant    typedef _Key                                     key_type;
6359fd9f84fSHoward Hinnant    typedef _Tp                                      mapped_type;
6369fd9f84fSHoward Hinnant    typedef pair<const key_type, mapped_type>        value_type;
637f52318b4SErik Pilkington    typedef pair<key_type&, mapped_type&>            __nc_ref_pair_type;
638f52318b4SErik Pilkington    typedef pair<key_type&&, mapped_type&&>          __nc_rref_pair_type;
6399fd9f84fSHoward Hinnant
640f52318b4SErik Pilkingtonprivate:
6419fd9f84fSHoward Hinnant    value_type __cc;
642f52318b4SErik Pilkington
643f52318b4SErik Pilkingtonpublic:
644f52318b4SErik Pilkington    _LIBCPP_INLINE_VISIBILITY
645f52318b4SErik Pilkington    value_type& __get_value()
646f52318b4SErik Pilkington    {
647f52318b4SErik Pilkington#if _LIBCPP_STD_VER > 14
648f52318b4SErik Pilkington        return *_VSTD::launder(_VSTD::addressof(__cc));
649f52318b4SErik Pilkington#else
650f52318b4SErik Pilkington        return __cc;
651f52318b4SErik Pilkington#endif
652f52318b4SErik Pilkington    }
653f52318b4SErik Pilkington
654f52318b4SErik Pilkington    _LIBCPP_INLINE_VISIBILITY
655f52318b4SErik Pilkington    const value_type& __get_value() const
656f52318b4SErik Pilkington    {
657f52318b4SErik Pilkington#if _LIBCPP_STD_VER > 14
658f52318b4SErik Pilkington        return *_VSTD::launder(_VSTD::addressof(__cc));
659f52318b4SErik Pilkington#else
660f52318b4SErik Pilkington        return __cc;
661f52318b4SErik Pilkington#endif
662f52318b4SErik Pilkington    }
663f52318b4SErik Pilkington
664f52318b4SErik Pilkington    _LIBCPP_INLINE_VISIBILITY
665f52318b4SErik Pilkington    __nc_ref_pair_type __ref()
666f52318b4SErik Pilkington    {
667f52318b4SErik Pilkington        value_type& __v = __get_value();
668f52318b4SErik Pilkington        return __nc_ref_pair_type(const_cast<key_type&>(__v.first), __v.second);
669f52318b4SErik Pilkington    }
670f52318b4SErik Pilkington
671f52318b4SErik Pilkington    _LIBCPP_INLINE_VISIBILITY
672f52318b4SErik Pilkington    __nc_rref_pair_type __move()
673f52318b4SErik Pilkington    {
674f52318b4SErik Pilkington        value_type& __v = __get_value();
675f52318b4SErik Pilkington        return __nc_rref_pair_type(
676f52318b4SErik Pilkington            _VSTD::move(const_cast<key_type&>(__v.first)),
677f52318b4SErik Pilkington            _VSTD::move(__v.second));
678f52318b4SErik Pilkington    }
6799fd9f84fSHoward Hinnant
6809fd9f84fSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
6819fd9f84fSHoward Hinnant    __value_type& operator=(const __value_type& __v)
682f52318b4SErik Pilkington    {
683f52318b4SErik Pilkington        __ref() = __v.__get_value();
684f52318b4SErik Pilkington        return *this;
685f52318b4SErik Pilkington    }
6869fd9f84fSHoward Hinnant
6879fd9f84fSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
6889fd9f84fSHoward Hinnant    __value_type& operator=(__value_type&& __v)
689f52318b4SErik Pilkington    {
690f52318b4SErik Pilkington        __ref() = __v.__move();
691f52318b4SErik Pilkington        return *this;
692f52318b4SErik Pilkington    }
6939fd9f84fSHoward Hinnant
6945e3ea4ddSEric Fiselier    template <class _ValueTp,
6955e3ea4ddSEric Fiselier              class = typename enable_if<
6965e3ea4ddSEric Fiselier                    __is_same_uncvref<_ValueTp, value_type>::value
6975e3ea4ddSEric Fiselier                 >::type
6985e3ea4ddSEric Fiselier             >
6999fd9f84fSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
700f52318b4SErik Pilkington    __value_type& operator=(_ValueTp&& __v)
701f52318b4SErik Pilkington    {
702f52318b4SErik Pilkington        __ref() = _VSTD::forward<_ValueTp>(__v);
703f52318b4SErik Pilkington        return *this;
7045e3ea4ddSEric Fiselier    }
7055e3ea4ddSEric Fiselier
7065e3ea4ddSEric Fiselierprivate:
7075e3ea4ddSEric Fiselier    __value_type() _LIBCPP_EQUAL_DELETE;
7085e3ea4ddSEric Fiselier    ~__value_type() _LIBCPP_EQUAL_DELETE;
7095e3ea4ddSEric Fiselier    __value_type(const __value_type& __v) _LIBCPP_EQUAL_DELETE;
7105e3ea4ddSEric Fiselier    __value_type(__value_type&& __v) _LIBCPP_EQUAL_DELETE;
7119fd9f84fSHoward Hinnant};
7129fd9f84fSHoward Hinnant
7139fd9f84fSHoward Hinnant#else
7149fd9f84fSHoward Hinnant
7159fd9f84fSHoward Hinnanttemplate <class _Key, class _Tp>
7169fd9f84fSHoward Hinnantstruct __value_type
7179fd9f84fSHoward Hinnant{
7189fd9f84fSHoward Hinnant    typedef _Key                                     key_type;
7199fd9f84fSHoward Hinnant    typedef _Tp                                      mapped_type;
7209fd9f84fSHoward Hinnant    typedef pair<const key_type, mapped_type>        value_type;
7219fd9f84fSHoward Hinnant
722f52318b4SErik Pilkingtonprivate:
7239fd9f84fSHoward Hinnant    value_type __cc;
7249fd9f84fSHoward Hinnant
725f52318b4SErik Pilkingtonpublic:
726f52318b4SErik Pilkington    _LIBCPP_INLINE_VISIBILITY
727f52318b4SErik Pilkington    value_type& __get_value() { return __cc; }
728f52318b4SErik Pilkington    _LIBCPP_INLINE_VISIBILITY
729f52318b4SErik Pilkington    const value_type& __get_value() const { return __cc; }
730f52318b4SErik Pilkington
7315e3ea4ddSEric Fiselierprivate:
7325e3ea4ddSEric Fiselier   __value_type();
7335e3ea4ddSEric Fiselier   __value_type(__value_type const&);
7345e3ea4ddSEric Fiselier   __value_type& operator=(__value_type const&);
7355e3ea4ddSEric Fiselier   ~__value_type();
7369fd9f84fSHoward Hinnant};
7379fd9f84fSHoward Hinnant
73818293116SEric Fiselier#endif // _LIBCPP_CXX03_LANG
7399fd9f84fSHoward Hinnant
740b3be398cSEric Fiseliertemplate <class _Tp>
741b3be398cSEric Fiselierstruct __extract_key_value_types;
742b3be398cSEric Fiselier
743b3be398cSEric Fiseliertemplate <class _Key, class _Tp>
744b3be398cSEric Fiselierstruct __extract_key_value_types<__value_type<_Key, _Tp> >
745b3be398cSEric Fiselier{
746b3be398cSEric Fiselier  typedef _Key const __key_type;
747b3be398cSEric Fiselier  typedef _Tp        __mapped_type;
748b3be398cSEric Fiselier};
749b3be398cSEric Fiselier
7503e519524SHoward Hinnanttemplate <class _TreeIterator>
751e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS __map_iterator
7523e519524SHoward Hinnant{
753089a7cc5SEric Fiselier    typedef typename _TreeIterator::_NodeTypes                   _NodeTypes;
754089a7cc5SEric Fiselier    typedef typename _TreeIterator::__pointer_traits             __pointer_traits;
755089a7cc5SEric Fiselier
7563e519524SHoward Hinnant    _TreeIterator __i_;
7573e519524SHoward Hinnant
7583e519524SHoward Hinnantpublic:
7593e519524SHoward Hinnant    typedef bidirectional_iterator_tag                           iterator_category;
760089a7cc5SEric Fiselier    typedef typename _NodeTypes::__map_value_type                value_type;
7613e519524SHoward Hinnant    typedef typename _TreeIterator::difference_type              difference_type;
7623e519524SHoward Hinnant    typedef value_type&                                          reference;
763089a7cc5SEric Fiselier    typedef typename _NodeTypes::__map_value_type_pointer        pointer;
7643e519524SHoward Hinnant
765848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
7661052ee39SHoward Hinnant    __map_iterator() _NOEXCEPT {}
7673e519524SHoward Hinnant
768848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
7691052ee39SHoward Hinnant    __map_iterator(_TreeIterator __i) _NOEXCEPT : __i_(__i) {}
7703e519524SHoward Hinnant
771848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
772f52318b4SErik Pilkington    reference operator*() const {return __i_->__get_value();}
773848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
774f52318b4SErik Pilkington    pointer operator->() const {return pointer_traits<pointer>::pointer_to(__i_->__get_value());}
7753e519524SHoward Hinnant
776848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
7773e519524SHoward Hinnant    __map_iterator& operator++() {++__i_; return *this;}
778848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
7793e519524SHoward Hinnant    __map_iterator operator++(int)
7803e519524SHoward Hinnant    {
7813e519524SHoward Hinnant        __map_iterator __t(*this);
7823e519524SHoward Hinnant        ++(*this);
7833e519524SHoward Hinnant        return __t;
7843e519524SHoward Hinnant    }
7853e519524SHoward Hinnant
786848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
7873e519524SHoward Hinnant    __map_iterator& operator--() {--__i_; return *this;}
788848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
7893e519524SHoward Hinnant    __map_iterator operator--(int)
7903e519524SHoward Hinnant    {
7913e519524SHoward Hinnant        __map_iterator __t(*this);
7923e519524SHoward Hinnant        --(*this);
7933e519524SHoward Hinnant        return __t;
7943e519524SHoward Hinnant    }
7953e519524SHoward Hinnant
796848a5374SHoward Hinnant    friend _LIBCPP_INLINE_VISIBILITY
797848a5374SHoward Hinnant    bool operator==(const __map_iterator& __x, const __map_iterator& __y)
7983e519524SHoward Hinnant        {return __x.__i_ == __y.__i_;}
799848a5374SHoward Hinnant    friend
800848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
801848a5374SHoward Hinnant    bool operator!=(const __map_iterator& __x, const __map_iterator& __y)
8023e519524SHoward Hinnant        {return __x.__i_ != __y.__i_;}
8033e519524SHoward Hinnant
804e2f2d1edSEric Fiselier    template <class, class, class, class> friend class _LIBCPP_TEMPLATE_VIS map;
805e2f2d1edSEric Fiselier    template <class, class, class, class> friend class _LIBCPP_TEMPLATE_VIS multimap;
806e2f2d1edSEric Fiselier    template <class> friend class _LIBCPP_TEMPLATE_VIS __map_const_iterator;
8073e519524SHoward Hinnant};
8083e519524SHoward Hinnant
8093e519524SHoward Hinnanttemplate <class _TreeIterator>
810e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS __map_const_iterator
8113e519524SHoward Hinnant{
812089a7cc5SEric Fiselier    typedef typename _TreeIterator::_NodeTypes                   _NodeTypes;
813089a7cc5SEric Fiselier    typedef typename _TreeIterator::__pointer_traits             __pointer_traits;
814089a7cc5SEric Fiselier
8153e519524SHoward Hinnant    _TreeIterator __i_;
8163e519524SHoward Hinnant
8173e519524SHoward Hinnantpublic:
8183e519524SHoward Hinnant    typedef bidirectional_iterator_tag                           iterator_category;
819089a7cc5SEric Fiselier    typedef typename _NodeTypes::__map_value_type                value_type;
8203e519524SHoward Hinnant    typedef typename _TreeIterator::difference_type              difference_type;
8213e519524SHoward Hinnant    typedef const value_type&                                    reference;
822089a7cc5SEric Fiselier    typedef typename _NodeTypes::__const_map_value_type_pointer  pointer;
8233e519524SHoward Hinnant
824848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
8251052ee39SHoward Hinnant    __map_const_iterator() _NOEXCEPT {}
8263e519524SHoward Hinnant
827848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
8281052ee39SHoward Hinnant    __map_const_iterator(_TreeIterator __i) _NOEXCEPT : __i_(__i) {}
829848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
830b3be398cSEric Fiselier    __map_const_iterator(__map_iterator<
831b3be398cSEric Fiselier        typename _TreeIterator::__non_const_iterator> __i) _NOEXCEPT
8323e519524SHoward Hinnant        : __i_(__i.__i_) {}
8333e519524SHoward Hinnant
834848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
835f52318b4SErik Pilkington    reference operator*() const {return __i_->__get_value();}
836848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
837f52318b4SErik Pilkington    pointer operator->() const {return pointer_traits<pointer>::pointer_to(__i_->__get_value());}
8383e519524SHoward Hinnant
839848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
8403e519524SHoward Hinnant    __map_const_iterator& operator++() {++__i_; return *this;}
841848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
8423e519524SHoward Hinnant    __map_const_iterator operator++(int)
8433e519524SHoward Hinnant    {
8443e519524SHoward Hinnant        __map_const_iterator __t(*this);
8453e519524SHoward Hinnant        ++(*this);
8463e519524SHoward Hinnant        return __t;
8473e519524SHoward Hinnant    }
8483e519524SHoward Hinnant
849848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
8503e519524SHoward Hinnant    __map_const_iterator& operator--() {--__i_; return *this;}
851848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
8523e519524SHoward Hinnant    __map_const_iterator operator--(int)
8533e519524SHoward Hinnant    {
8543e519524SHoward Hinnant        __map_const_iterator __t(*this);
8553e519524SHoward Hinnant        --(*this);
8563e519524SHoward Hinnant        return __t;
8573e519524SHoward Hinnant    }
8583e519524SHoward Hinnant
859848a5374SHoward Hinnant    friend _LIBCPP_INLINE_VISIBILITY
860848a5374SHoward Hinnant    bool operator==(const __map_const_iterator& __x, const __map_const_iterator& __y)
8613e519524SHoward Hinnant        {return __x.__i_ == __y.__i_;}
862848a5374SHoward Hinnant    friend _LIBCPP_INLINE_VISIBILITY
863848a5374SHoward Hinnant    bool operator!=(const __map_const_iterator& __x, const __map_const_iterator& __y)
8643e519524SHoward Hinnant        {return __x.__i_ != __y.__i_;}
8653e519524SHoward Hinnant
866e2f2d1edSEric Fiselier    template <class, class, class, class> friend class _LIBCPP_TEMPLATE_VIS map;
867e2f2d1edSEric Fiselier    template <class, class, class, class> friend class _LIBCPP_TEMPLATE_VIS multimap;
868e2f2d1edSEric Fiselier    template <class, class, class> friend class _LIBCPP_TEMPLATE_VIS __tree_const_iterator;
8693e519524SHoward Hinnant};
8703e519524SHoward Hinnant
8713e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare = less<_Key>,
8723e519524SHoward Hinnant          class _Allocator = allocator<pair<const _Key, _Tp> > >
873e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS map
8743e519524SHoward Hinnant{
8753e519524SHoward Hinnantpublic:
8763e519524SHoward Hinnant    // types:
8773e519524SHoward Hinnant    typedef _Key                                     key_type;
8783e519524SHoward Hinnant    typedef _Tp                                      mapped_type;
8793e519524SHoward Hinnant    typedef pair<const key_type, mapped_type>        value_type;
8803e519524SHoward Hinnant    typedef _Compare                                 key_compare;
8813e519524SHoward Hinnant    typedef _Allocator                               allocator_type;
8823e519524SHoward Hinnant    typedef value_type&                              reference;
8833e519524SHoward Hinnant    typedef const value_type&                        const_reference;
8843e519524SHoward Hinnant
88594f89aeeSMarshall Clow    static_assert((is_same<typename allocator_type::value_type, value_type>::value),
88694f89aeeSMarshall Clow                  "Allocator::value_type must be same type as value_type");
88794f89aeeSMarshall Clow
888e2f2d1edSEric Fiselier    class _LIBCPP_TEMPLATE_VIS value_compare
8893e519524SHoward Hinnant        : public binary_function<value_type, value_type, bool>
8903e519524SHoward Hinnant    {
8913e519524SHoward Hinnant        friend class map;
8923e519524SHoward Hinnant    protected:
8933e519524SHoward Hinnant        key_compare comp;
8943e519524SHoward Hinnant
895848a5374SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY value_compare(key_compare c) : comp(c) {}
8963e519524SHoward Hinnant    public:
897848a5374SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
8983e519524SHoward Hinnant        bool operator()(const value_type& __x, const value_type& __y) const
8993e519524SHoward Hinnant            {return comp(__x.first, __y.first);}
9003e519524SHoward Hinnant    };
9013e519524SHoward Hinnant
9023e519524SHoward Hinnantprivate:
90307d3eccdSHoward Hinnant
9049fd9f84fSHoward Hinnant    typedef _VSTD::__value_type<key_type, mapped_type>             __value_type;
905abb160e6SHoward Hinnant    typedef __map_value_compare<key_type, __value_type, key_compare> __vc;
9061f508014SMarshall Clow    typedef typename __rebind_alloc_helper<allocator_traits<allocator_type>,
9071f508014SMarshall Clow                                                 __value_type>::type __allocator_type;
9083e519524SHoward Hinnant    typedef __tree<__value_type, __vc, __allocator_type>   __base;
9093e519524SHoward Hinnant    typedef typename __base::__node_traits                 __node_traits;
9103e519524SHoward Hinnant    typedef allocator_traits<allocator_type>               __alloc_traits;
9113e519524SHoward Hinnant
9123e519524SHoward Hinnant    __base __tree_;
9133e519524SHoward Hinnant
9143e519524SHoward Hinnantpublic:
9153e519524SHoward Hinnant    typedef typename __alloc_traits::pointer               pointer;
9163e519524SHoward Hinnant    typedef typename __alloc_traits::const_pointer         const_pointer;
9173e519524SHoward Hinnant    typedef typename __alloc_traits::size_type             size_type;
9183e519524SHoward Hinnant    typedef typename __alloc_traits::difference_type       difference_type;
9193e519524SHoward Hinnant    typedef __map_iterator<typename __base::iterator>             iterator;
9203e519524SHoward Hinnant    typedef __map_const_iterator<typename __base::const_iterator> const_iterator;
921ce48a113SHoward Hinnant    typedef _VSTD::reverse_iterator<iterator>               reverse_iterator;
922ce48a113SHoward Hinnant    typedef _VSTD::reverse_iterator<const_iterator>         const_reverse_iterator;
9233e519524SHoward Hinnant
924b0386a51SErik Pilkington#if _LIBCPP_STD_VER > 14
925b0386a51SErik Pilkington    typedef __map_node_handle<typename __base::__node, allocator_type> node_type;
926b0386a51SErik Pilkington    typedef __insert_return_type<iterator, node_type> insert_return_type;
927b0386a51SErik Pilkington#endif
928b0386a51SErik Pilkington
929848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
930415a24e4SMarshall Clow    map()
931415a24e4SMarshall Clow        _NOEXCEPT_(
932415a24e4SMarshall Clow            is_nothrow_default_constructible<allocator_type>::value &&
933415a24e4SMarshall Clow            is_nothrow_default_constructible<key_compare>::value &&
934415a24e4SMarshall Clow            is_nothrow_copy_constructible<key_compare>::value)
935415a24e4SMarshall Clow        : __tree_(__vc(key_compare())) {}
936415a24e4SMarshall Clow
937415a24e4SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
938415a24e4SMarshall Clow    explicit map(const key_compare& __comp)
9391052ee39SHoward Hinnant        _NOEXCEPT_(
9401052ee39SHoward Hinnant            is_nothrow_default_constructible<allocator_type>::value &&
9411052ee39SHoward Hinnant            is_nothrow_copy_constructible<key_compare>::value)
9423e519524SHoward Hinnant        : __tree_(__vc(__comp)) {}
9433e519524SHoward Hinnant
944848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
9453e519524SHoward Hinnant    explicit map(const key_compare& __comp, const allocator_type& __a)
9462a10c960SMarshall Clow        : __tree_(__vc(__comp), typename __base::allocator_type(__a)) {}
9473e519524SHoward Hinnant
9483e519524SHoward Hinnant    template <class _InputIterator>
949848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
9503e519524SHoward Hinnant        map(_InputIterator __f, _InputIterator __l,
9513e519524SHoward Hinnant            const key_compare& __comp = key_compare())
9523e519524SHoward Hinnant        : __tree_(__vc(__comp))
9533e519524SHoward Hinnant        {
9543e519524SHoward Hinnant            insert(__f, __l);
9553e519524SHoward Hinnant        }
9563e519524SHoward Hinnant
9573e519524SHoward Hinnant    template <class _InputIterator>
958848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
9593e519524SHoward Hinnant        map(_InputIterator __f, _InputIterator __l,
9603e519524SHoward Hinnant            const key_compare& __comp, const allocator_type& __a)
9612a10c960SMarshall Clow        : __tree_(__vc(__comp), typename __base::allocator_type(__a))
9623e519524SHoward Hinnant        {
9633e519524SHoward Hinnant            insert(__f, __l);
9643e519524SHoward Hinnant        }
9653e519524SHoward Hinnant
966fbc317d4SMarshall Clow#if _LIBCPP_STD_VER > 11
967fbc317d4SMarshall Clow    template <class _InputIterator>
968fbc317d4SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
969fbc317d4SMarshall Clow    map(_InputIterator __f, _InputIterator __l, const allocator_type& __a)
970fbc317d4SMarshall Clow        : map(__f, __l, key_compare(), __a) {}
971fbc317d4SMarshall Clow#endif
972fbc317d4SMarshall Clow
973848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
9743e519524SHoward Hinnant    map(const map& __m)
9753e519524SHoward Hinnant        : __tree_(__m.__tree_)
9763e519524SHoward Hinnant        {
9773e519524SHoward Hinnant            insert(__m.begin(), __m.end());
9783e519524SHoward Hinnant        }
9793e519524SHoward Hinnant
9805a33687dSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
9815a33687dSHoward Hinnant    map& operator=(const map& __m)
9825a33687dSHoward Hinnant        {
9832ee83725SMarshall Clow#ifndef _LIBCPP_CXX03_LANG
9845a33687dSHoward Hinnant            __tree_ = __m.__tree_;
98507d3eccdSHoward Hinnant#else
98674cf6ff5SMarshall Clow            if (this != &__m) {
98707d3eccdSHoward Hinnant                __tree_.clear();
98807d3eccdSHoward Hinnant                __tree_.value_comp() = __m.__tree_.value_comp();
98907d3eccdSHoward Hinnant                __tree_.__copy_assign_alloc(__m.__tree_);
99007d3eccdSHoward Hinnant                insert(__m.begin(), __m.end());
99174cf6ff5SMarshall Clow            }
99207d3eccdSHoward Hinnant#endif
9935a33687dSHoward Hinnant            return *this;
9945a33687dSHoward Hinnant        }
9955a33687dSHoward Hinnant
99618293116SEric Fiselier#ifndef _LIBCPP_CXX03_LANG
9973e519524SHoward Hinnant
998848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
9993e519524SHoward Hinnant    map(map&& __m)
10001052ee39SHoward Hinnant        _NOEXCEPT_(is_nothrow_move_constructible<__base>::value)
1001ce48a113SHoward Hinnant        : __tree_(_VSTD::move(__m.__tree_))
10023e519524SHoward Hinnant        {
10033e519524SHoward Hinnant        }
10043e519524SHoward Hinnant
10053e519524SHoward Hinnant    map(map&& __m, const allocator_type& __a);
10063e519524SHoward Hinnant
1007848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
100854976f26SHoward Hinnant    map& operator=(map&& __m)
100954976f26SHoward Hinnant        _NOEXCEPT_(is_nothrow_move_assignable<__base>::value)
101054976f26SHoward Hinnant        {
101154976f26SHoward Hinnant            __tree_ = _VSTD::move(__m.__tree_);
101254976f26SHoward Hinnant            return *this;
101354976f26SHoward Hinnant        }
101454976f26SHoward Hinnant
101554976f26SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
10163e519524SHoward Hinnant    map(initializer_list<value_type> __il, const key_compare& __comp = key_compare())
10173e519524SHoward Hinnant        : __tree_(__vc(__comp))
10183e519524SHoward Hinnant        {
10193e519524SHoward Hinnant            insert(__il.begin(), __il.end());
10203e519524SHoward Hinnant        }
10213e519524SHoward Hinnant
1022848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
10233e519524SHoward Hinnant    map(initializer_list<value_type> __il, const key_compare& __comp, const allocator_type& __a)
10242a10c960SMarshall Clow        : __tree_(__vc(__comp), typename __base::allocator_type(__a))
10253e519524SHoward Hinnant        {
10263e519524SHoward Hinnant            insert(__il.begin(), __il.end());
10273e519524SHoward Hinnant        }
10283e519524SHoward Hinnant
1029fbc317d4SMarshall Clow#if _LIBCPP_STD_VER > 11
1030fbc317d4SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
1031fbc317d4SMarshall Clow    map(initializer_list<value_type> __il, const allocator_type& __a)
1032fbc317d4SMarshall Clow        : map(__il, key_compare(), __a) {}
1033fbc317d4SMarshall Clow#endif
1034fbc317d4SMarshall Clow
1035848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
10363e519524SHoward Hinnant    map& operator=(initializer_list<value_type> __il)
10373e519524SHoward Hinnant        {
10383e519524SHoward Hinnant            __tree_.__assign_unique(__il.begin(), __il.end());
10393e519524SHoward Hinnant            return *this;
10403e519524SHoward Hinnant        }
10413e519524SHoward Hinnant
104218293116SEric Fiselier#endif  // _LIBCPP_CXX03_LANG
10433e519524SHoward Hinnant
1044848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
10453e519524SHoward Hinnant    explicit map(const allocator_type& __a)
10462a10c960SMarshall Clow        : __tree_(typename __base::allocator_type(__a))
10473e519524SHoward Hinnant        {
10483e519524SHoward Hinnant        }
10493e519524SHoward Hinnant
1050848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
10513e519524SHoward Hinnant    map(const map& __m, const allocator_type& __a)
10522a10c960SMarshall Clow        : __tree_(__m.__tree_.value_comp(), typename __base::allocator_type(__a))
10533e519524SHoward Hinnant        {
10543e519524SHoward Hinnant            insert(__m.begin(), __m.end());
10553e519524SHoward Hinnant        }
10563e519524SHoward Hinnant
1057848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
10581052ee39SHoward Hinnant          iterator begin() _NOEXCEPT {return __tree_.begin();}
1059848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
10601052ee39SHoward Hinnant    const_iterator begin() const _NOEXCEPT {return __tree_.begin();}
1061848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
10621052ee39SHoward Hinnant          iterator end() _NOEXCEPT {return __tree_.end();}
1063848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
10641052ee39SHoward Hinnant    const_iterator end() const _NOEXCEPT {return __tree_.end();}
10653e519524SHoward Hinnant
1066848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
10671052ee39SHoward Hinnant          reverse_iterator rbegin() _NOEXCEPT {return reverse_iterator(end());}
1068848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
10691052ee39SHoward Hinnant    const_reverse_iterator rbegin() const _NOEXCEPT
10701052ee39SHoward Hinnant        {return const_reverse_iterator(end());}
1071848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
10721052ee39SHoward Hinnant          reverse_iterator rend() _NOEXCEPT
10731052ee39SHoward Hinnant            {return       reverse_iterator(begin());}
1074848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
10751052ee39SHoward Hinnant    const_reverse_iterator rend() const _NOEXCEPT
10761052ee39SHoward Hinnant        {return const_reverse_iterator(begin());}
10773e519524SHoward Hinnant
1078848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
10791052ee39SHoward Hinnant    const_iterator cbegin() const _NOEXCEPT {return begin();}
1080848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
10811052ee39SHoward Hinnant    const_iterator cend() const _NOEXCEPT {return end();}
1082848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
10831052ee39SHoward Hinnant    const_reverse_iterator crbegin() const _NOEXCEPT {return rbegin();}
1084848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
10851052ee39SHoward Hinnant    const_reverse_iterator crend() const _NOEXCEPT {return rend();}
10863e519524SHoward Hinnant
108772c8fad4SMarshall Clow    _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY
10881052ee39SHoward Hinnant    bool      empty() const _NOEXCEPT {return __tree_.size() == 0;}
1089848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
10901052ee39SHoward Hinnant    size_type size() const _NOEXCEPT {return __tree_.size();}
1091848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
10921052ee39SHoward Hinnant    size_type max_size() const _NOEXCEPT {return __tree_.max_size();}
10933e519524SHoward Hinnant
10943e519524SHoward Hinnant    mapped_type& operator[](const key_type& __k);
109554f0cda6SEric Fiselier#ifndef _LIBCPP_CXX03_LANG
10963e519524SHoward Hinnant    mapped_type& operator[](key_type&& __k);
10973e519524SHoward Hinnant#endif
10983e519524SHoward Hinnant
10993e519524SHoward Hinnant          mapped_type& at(const key_type& __k);
11003e519524SHoward Hinnant    const mapped_type& at(const key_type& __k) const;
11013e519524SHoward Hinnant
1102848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11032a10c960SMarshall Clow    allocator_type get_allocator() const _NOEXCEPT {return allocator_type(__tree_.__alloc());}
1104848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11053e519524SHoward Hinnant    key_compare    key_comp()      const {return __tree_.value_comp().key_comp();}
1106848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11073e519524SHoward Hinnant    value_compare  value_comp()    const {return value_compare(__tree_.value_comp().key_comp());}
11083e519524SHoward Hinnant
11095e3ea4ddSEric Fiselier#ifndef _LIBCPP_CXX03_LANG
11105e3ea4ddSEric Fiselier    template <class ..._Args>
11115e3ea4ddSEric Fiselier    _LIBCPP_INLINE_VISIBILITY
11125e3ea4ddSEric Fiselier    pair<iterator, bool> emplace(_Args&& ...__args) {
11135e3ea4ddSEric Fiselier        return __tree_.__emplace_unique(_VSTD::forward<_Args>(__args)...);
11145e3ea4ddSEric Fiselier    }
11157609c9b6SHoward Hinnant
11168b805c91SHoward Hinnant    template <class ..._Args>
11175e3ea4ddSEric Fiselier    _LIBCPP_INLINE_VISIBILITY
11185e3ea4ddSEric Fiselier    iterator emplace_hint(const_iterator __p, _Args&& ...__args) {
11195e3ea4ddSEric Fiselier        return __tree_.__emplace_hint_unique(__p.__i_, _VSTD::forward<_Args>(__args)...);
11205e3ea4ddSEric Fiselier    }
11217609c9b6SHoward Hinnant
1122c003db1fSHoward Hinnant    template <class _Pp,
1123c003db1fSHoward Hinnant              class = typename enable_if<is_constructible<value_type, _Pp>::value>::type>
1124848a5374SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
1125c003db1fSHoward Hinnant        pair<iterator, bool> insert(_Pp&& __p)
1126c003db1fSHoward Hinnant            {return __tree_.__insert_unique(_VSTD::forward<_Pp>(__p));}
11273e519524SHoward Hinnant
1128c003db1fSHoward Hinnant    template <class _Pp,
1129c003db1fSHoward Hinnant              class = typename enable_if<is_constructible<value_type, _Pp>::value>::type>
1130848a5374SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
1131c003db1fSHoward Hinnant        iterator insert(const_iterator __pos, _Pp&& __p)
1132c003db1fSHoward Hinnant            {return __tree_.__insert_unique(__pos.__i_, _VSTD::forward<_Pp>(__p));}
11333e519524SHoward Hinnant
11345e3ea4ddSEric Fiselier#endif  // _LIBCPP_CXX03_LANG
11353e519524SHoward Hinnant
1136848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11373e519524SHoward Hinnant    pair<iterator, bool>
11383e519524SHoward Hinnant        insert(const value_type& __v) {return __tree_.__insert_unique(__v);}
11393e519524SHoward Hinnant
1140848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11413e519524SHoward Hinnant    iterator
11423e519524SHoward Hinnant        insert(const_iterator __p, const value_type& __v)
11433e519524SHoward Hinnant            {return __tree_.__insert_unique(__p.__i_, __v);}
11443e519524SHoward Hinnant
11457a9f500fSEric Fiselier#ifndef _LIBCPP_CXX03_LANG
1146afc9ff99SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
1147afc9ff99SMarshall Clow    pair<iterator, bool>
11485e3ea4ddSEric Fiselier    insert(value_type&& __v) {return __tree_.__insert_unique(_VSTD::move(__v));}
1149afc9ff99SMarshall Clow
1150afc9ff99SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
11515e3ea4ddSEric Fiselier    iterator insert(const_iterator __p,  value_type&& __v)
11525e3ea4ddSEric Fiselier    {return __tree_.__insert_unique(__p.__i_, _VSTD::move(__v));}
115318293116SEric Fiselier
115418293116SEric Fiselier    _LIBCPP_INLINE_VISIBILITY
115518293116SEric Fiselier    void insert(initializer_list<value_type> __il)
115618293116SEric Fiselier        {insert(__il.begin(), __il.end());}
1157afc9ff99SMarshall Clow#endif
1158afc9ff99SMarshall Clow
11593e519524SHoward Hinnant    template <class _InputIterator>
1160848a5374SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
11613e519524SHoward Hinnant        void insert(_InputIterator __f, _InputIterator __l)
11623e519524SHoward Hinnant        {
11633e519524SHoward Hinnant            for (const_iterator __e = cend(); __f != __l; ++__f)
11643e519524SHoward Hinnant                insert(__e.__i_, *__f);
11653e519524SHoward Hinnant        }
11663e519524SHoward Hinnant
11678aaf517dSMarshall Clow#if _LIBCPP_STD_VER > 14
116854f0cda6SEric Fiselier
11698aaf517dSMarshall Clow    template <class... _Args>
11708aaf517dSMarshall Clow        _LIBCPP_INLINE_VISIBILITY
11718aaf517dSMarshall Clow        pair<iterator, bool> try_emplace(const key_type& __k, _Args&&... __args)
11728aaf517dSMarshall Clow    {
117354f0cda6SEric Fiselier        return __tree_.__emplace_unique_key_args(__k,
117454f0cda6SEric Fiselier            _VSTD::piecewise_construct,
117554f0cda6SEric Fiselier            _VSTD::forward_as_tuple(__k),
117654f0cda6SEric Fiselier            _VSTD::forward_as_tuple(_VSTD::forward<_Args>(__args)...));
11778aaf517dSMarshall Clow    }
11788aaf517dSMarshall Clow
11798aaf517dSMarshall Clow    template <class... _Args>
11808aaf517dSMarshall Clow        _LIBCPP_INLINE_VISIBILITY
11818aaf517dSMarshall Clow        pair<iterator, bool> try_emplace(key_type&& __k, _Args&&... __args)
11828aaf517dSMarshall Clow    {
118354f0cda6SEric Fiselier        return __tree_.__emplace_unique_key_args(__k,
118454f0cda6SEric Fiselier            _VSTD::piecewise_construct,
118554f0cda6SEric Fiselier            _VSTD::forward_as_tuple(_VSTD::move(__k)),
118654f0cda6SEric Fiselier            _VSTD::forward_as_tuple(_VSTD::forward<_Args>(__args)...));
11878aaf517dSMarshall Clow    }
11888aaf517dSMarshall Clow
11898aaf517dSMarshall Clow    template <class... _Args>
11908aaf517dSMarshall Clow        _LIBCPP_INLINE_VISIBILITY
11918aaf517dSMarshall Clow        iterator try_emplace(const_iterator __h, const key_type& __k, _Args&&... __args)
11928aaf517dSMarshall Clow    {
119354f0cda6SEric Fiselier        return __tree_.__emplace_hint_unique_key_args(__h.__i_, __k,
119454f0cda6SEric Fiselier            _VSTD::piecewise_construct,
119554f0cda6SEric Fiselier            _VSTD::forward_as_tuple(__k),
11968aaf517dSMarshall Clow            _VSTD::forward_as_tuple(_VSTD::forward<_Args>(__args)...));
11978aaf517dSMarshall Clow    }
11988aaf517dSMarshall Clow
11998aaf517dSMarshall Clow    template <class... _Args>
12008aaf517dSMarshall Clow        _LIBCPP_INLINE_VISIBILITY
12018aaf517dSMarshall Clow        iterator try_emplace(const_iterator __h, key_type&& __k, _Args&&... __args)
12028aaf517dSMarshall Clow    {
120354f0cda6SEric Fiselier        return __tree_.__emplace_hint_unique_key_args(__h.__i_, __k,
120454f0cda6SEric Fiselier            _VSTD::piecewise_construct,
120554f0cda6SEric Fiselier            _VSTD::forward_as_tuple(_VSTD::move(__k)),
12068aaf517dSMarshall Clow            _VSTD::forward_as_tuple(_VSTD::forward<_Args>(__args)...));
12078aaf517dSMarshall Clow    }
12088aaf517dSMarshall Clow
12098aaf517dSMarshall Clow    template <class _Vp>
12108aaf517dSMarshall Clow        _LIBCPP_INLINE_VISIBILITY
12118aaf517dSMarshall Clow        pair<iterator, bool> insert_or_assign(const key_type& __k, _Vp&& __v)
12128aaf517dSMarshall Clow    {
12138aaf517dSMarshall Clow        iterator __p = lower_bound(__k);
12148aaf517dSMarshall Clow        if ( __p != end() && !key_comp()(__k, __p->first))
12158aaf517dSMarshall Clow        {
12168aaf517dSMarshall Clow            __p->second = _VSTD::forward<_Vp>(__v);
12178aaf517dSMarshall Clow            return _VSTD::make_pair(__p, false);
12188aaf517dSMarshall Clow        }
12198aaf517dSMarshall Clow        return _VSTD::make_pair(emplace_hint(__p, __k, _VSTD::forward<_Vp>(__v)), true);
12208aaf517dSMarshall Clow    }
12218aaf517dSMarshall Clow
12228aaf517dSMarshall Clow    template <class _Vp>
12238aaf517dSMarshall Clow        _LIBCPP_INLINE_VISIBILITY
12248aaf517dSMarshall Clow        pair<iterator, bool> insert_or_assign(key_type&& __k, _Vp&& __v)
12258aaf517dSMarshall Clow    {
12268aaf517dSMarshall Clow        iterator __p = lower_bound(__k);
12278aaf517dSMarshall Clow        if ( __p != end() && !key_comp()(__k, __p->first))
12288aaf517dSMarshall Clow        {
12298aaf517dSMarshall Clow            __p->second = _VSTD::forward<_Vp>(__v);
12308aaf517dSMarshall Clow            return _VSTD::make_pair(__p, false);
12318aaf517dSMarshall Clow        }
12328aaf517dSMarshall Clow        return _VSTD::make_pair(emplace_hint(__p, _VSTD::move(__k), _VSTD::forward<_Vp>(__v)), true);
12338aaf517dSMarshall Clow    }
12348aaf517dSMarshall Clow
12358aaf517dSMarshall Clow    template <class _Vp>
12368aaf517dSMarshall Clow        _LIBCPP_INLINE_VISIBILITY
12378aaf517dSMarshall Clow        iterator insert_or_assign(const_iterator __h, const key_type& __k, _Vp&& __v)
12388aaf517dSMarshall Clow     {
12398aaf517dSMarshall Clow        iterator __p = lower_bound(__k);
12408aaf517dSMarshall Clow        if ( __p != end() && !key_comp()(__k, __p->first))
12418aaf517dSMarshall Clow        {
12428aaf517dSMarshall Clow            __p->second = _VSTD::forward<_Vp>(__v);
12438aaf517dSMarshall Clow            return __p;
12448aaf517dSMarshall Clow        }
12458aaf517dSMarshall Clow        return emplace_hint(__h, __k, _VSTD::forward<_Vp>(__v));
12468aaf517dSMarshall Clow     }
12478aaf517dSMarshall Clow
12488aaf517dSMarshall Clow    template <class _Vp>
12498aaf517dSMarshall Clow        _LIBCPP_INLINE_VISIBILITY
12508aaf517dSMarshall Clow        iterator insert_or_assign(const_iterator __h, key_type&& __k, _Vp&& __v)
12518aaf517dSMarshall Clow     {
12528aaf517dSMarshall Clow        iterator __p = lower_bound(__k);
12538aaf517dSMarshall Clow        if ( __p != end() && !key_comp()(__k, __p->first))
12548aaf517dSMarshall Clow        {
12558aaf517dSMarshall Clow            __p->second = _VSTD::forward<_Vp>(__v);
12568aaf517dSMarshall Clow            return __p;
12578aaf517dSMarshall Clow        }
12588aaf517dSMarshall Clow        return emplace_hint(__h, _VSTD::move(__k), _VSTD::forward<_Vp>(__v));
12598aaf517dSMarshall Clow     }
126054f0cda6SEric Fiselier
126118293116SEric Fiselier#endif // _LIBCPP_STD_VER > 14
12628aaf517dSMarshall Clow
1263848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
12643e519524SHoward Hinnant    iterator erase(const_iterator __p) {return __tree_.erase(__p.__i_);}
1265848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
1266ec392968SMarshall Clow    iterator erase(iterator __p)       {return __tree_.erase(__p.__i_);}
1267ec392968SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
12683e519524SHoward Hinnant    size_type erase(const key_type& __k)
12693e519524SHoward Hinnant        {return __tree_.__erase_unique(__k);}
1270848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
12713e519524SHoward Hinnant    iterator  erase(const_iterator __f, const_iterator __l)
12723e519524SHoward Hinnant        {return __tree_.erase(__f.__i_, __l.__i_);}
1273848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
12741052ee39SHoward Hinnant    void clear() _NOEXCEPT {__tree_.clear();}
12753e519524SHoward Hinnant
1276b0386a51SErik Pilkington#if _LIBCPP_STD_VER > 14
1277b0386a51SErik Pilkington    _LIBCPP_INLINE_VISIBILITY
1278b0386a51SErik Pilkington    insert_return_type insert(node_type&& __nh)
1279b0386a51SErik Pilkington    {
1280b0386a51SErik Pilkington        _LIBCPP_ASSERT(__nh.empty() || __nh.get_allocator() == get_allocator(),
1281b0386a51SErik Pilkington            "node_type with incompatible allocator passed to map::insert()");
1282b0386a51SErik Pilkington        return __tree_.template __node_handle_insert_unique<
1283b0386a51SErik Pilkington            node_type, insert_return_type>(_VSTD::move(__nh));
1284b0386a51SErik Pilkington    }
1285b0386a51SErik Pilkington    _LIBCPP_INLINE_VISIBILITY
1286b0386a51SErik Pilkington    iterator insert(const_iterator __hint, node_type&& __nh)
1287b0386a51SErik Pilkington    {
1288b0386a51SErik Pilkington        _LIBCPP_ASSERT(__nh.empty() || __nh.get_allocator() == get_allocator(),
1289b0386a51SErik Pilkington            "node_type with incompatible allocator passed to map::insert()");
1290b0386a51SErik Pilkington        return __tree_.template __node_handle_insert_unique<node_type>(
1291b0386a51SErik Pilkington            __hint.__i_, _VSTD::move(__nh));
1292b0386a51SErik Pilkington    }
1293b0386a51SErik Pilkington    _LIBCPP_INLINE_VISIBILITY
1294b0386a51SErik Pilkington    node_type extract(key_type const& __key)
1295b0386a51SErik Pilkington    {
1296b0386a51SErik Pilkington        return __tree_.template __node_handle_extract<node_type>(__key);
1297b0386a51SErik Pilkington    }
1298b0386a51SErik Pilkington    _LIBCPP_INLINE_VISIBILITY
1299b0386a51SErik Pilkington    node_type extract(const_iterator __it)
1300b0386a51SErik Pilkington    {
1301b0386a51SErik Pilkington        return __tree_.template __node_handle_extract<node_type>(__it.__i_);
1302b0386a51SErik Pilkington    }
1303b0386a51SErik Pilkington#endif
1304b0386a51SErik Pilkington
1305848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
13061052ee39SHoward Hinnant    void swap(map& __m)
13071052ee39SHoward Hinnant        _NOEXCEPT_(__is_nothrow_swappable<__base>::value)
13081052ee39SHoward Hinnant        {__tree_.swap(__m.__tree_);}
13093e519524SHoward Hinnant
1310848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
13113e519524SHoward Hinnant    iterator find(const key_type& __k)             {return __tree_.find(__k);}
1312848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
13133e519524SHoward Hinnant    const_iterator find(const key_type& __k) const {return __tree_.find(__k);}
13142585835cSMarshall Clow#if _LIBCPP_STD_VER > 11
13152585835cSMarshall Clow    template <typename _K2>
13162585835cSMarshall Clow    _LIBCPP_INLINE_VISIBILITY
13172585835cSMarshall Clow    typename enable_if<__is_transparent<_Compare, _K2>::value,iterator>::type
13182585835cSMarshall Clow    find(const _K2& __k)                           {return __tree_.find(__k);}
13192585835cSMarshall Clow    template <typename _K2>
13202585835cSMarshall Clow    _LIBCPP_INLINE_VISIBILITY
13212585835cSMarshall Clow    typename enable_if<__is_transparent<_Compare, _K2>::value,const_iterator>::type
13222585835cSMarshall Clow    find(const _K2& __k) const                     {return __tree_.find(__k);}
13232585835cSMarshall Clow#endif
13242585835cSMarshall Clow
1325848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
13263e519524SHoward Hinnant    size_type      count(const key_type& __k) const
13273e519524SHoward Hinnant        {return __tree_.__count_unique(__k);}
13280aacbc92SMarshall Clow#if _LIBCPP_STD_VER > 11
13290aacbc92SMarshall Clow    template <typename _K2>
13300aacbc92SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
13310aacbc92SMarshall Clow    typename enable_if<__is_transparent<_Compare, _K2>::value,size_type>::type
13329bfdb770SEric Fiselier    count(const _K2& __k) const {return __tree_.__count_multi(__k);}
13330aacbc92SMarshall Clow#endif
1334848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
13353e519524SHoward Hinnant    iterator lower_bound(const key_type& __k)
13363e519524SHoward Hinnant        {return __tree_.lower_bound(__k);}
1337848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
13383e519524SHoward Hinnant    const_iterator lower_bound(const key_type& __k) const
13393e519524SHoward Hinnant        {return __tree_.lower_bound(__k);}
13402585835cSMarshall Clow#if _LIBCPP_STD_VER > 11
13412585835cSMarshall Clow    template <typename _K2>
13422585835cSMarshall Clow    _LIBCPP_INLINE_VISIBILITY
13432585835cSMarshall Clow    typename enable_if<__is_transparent<_Compare, _K2>::value,iterator>::type
13442585835cSMarshall Clow    lower_bound(const _K2& __k)       {return __tree_.lower_bound(__k);}
13452585835cSMarshall Clow
13462585835cSMarshall Clow    template <typename _K2>
13472585835cSMarshall Clow    _LIBCPP_INLINE_VISIBILITY
13482585835cSMarshall Clow    typename enable_if<__is_transparent<_Compare, _K2>::value,const_iterator>::type
13492585835cSMarshall Clow    lower_bound(const _K2& __k) const {return __tree_.lower_bound(__k);}
13502585835cSMarshall Clow#endif
13512585835cSMarshall Clow
1352848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
13533e519524SHoward Hinnant    iterator upper_bound(const key_type& __k)
13543e519524SHoward Hinnant        {return __tree_.upper_bound(__k);}
1355848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
13563e519524SHoward Hinnant    const_iterator upper_bound(const key_type& __k) const
13573e519524SHoward Hinnant        {return __tree_.upper_bound(__k);}
13582585835cSMarshall Clow#if _LIBCPP_STD_VER > 11
13592585835cSMarshall Clow    template <typename _K2>
13602585835cSMarshall Clow    _LIBCPP_INLINE_VISIBILITY
13612585835cSMarshall Clow    typename enable_if<__is_transparent<_Compare, _K2>::value,iterator>::type
13622585835cSMarshall Clow    upper_bound(const _K2& __k)       {return __tree_.upper_bound(__k);}
13632585835cSMarshall Clow    template <typename _K2>
13642585835cSMarshall Clow    _LIBCPP_INLINE_VISIBILITY
13652585835cSMarshall Clow    typename enable_if<__is_transparent<_Compare, _K2>::value,const_iterator>::type
13662585835cSMarshall Clow    upper_bound(const _K2& __k) const {return __tree_.upper_bound(__k);}
13672585835cSMarshall Clow#endif
13682585835cSMarshall Clow
1369848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
13703e519524SHoward Hinnant    pair<iterator,iterator> equal_range(const key_type& __k)
13713e519524SHoward Hinnant        {return __tree_.__equal_range_unique(__k);}
1372848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
13733e519524SHoward Hinnant    pair<const_iterator,const_iterator> equal_range(const key_type& __k) const
13743e519524SHoward Hinnant        {return __tree_.__equal_range_unique(__k);}
13752585835cSMarshall Clow#if _LIBCPP_STD_VER > 11
13762585835cSMarshall Clow    template <typename _K2>
13772585835cSMarshall Clow    _LIBCPP_INLINE_VISIBILITY
13782585835cSMarshall Clow    typename enable_if<__is_transparent<_Compare, _K2>::value,pair<iterator,iterator>>::type
13799bfdb770SEric Fiselier    equal_range(const _K2& __k)       {return __tree_.__equal_range_multi(__k);}
13802585835cSMarshall Clow    template <typename _K2>
13812585835cSMarshall Clow    _LIBCPP_INLINE_VISIBILITY
13822585835cSMarshall Clow    typename enable_if<__is_transparent<_Compare, _K2>::value,pair<const_iterator,const_iterator>>::type
13839bfdb770SEric Fiselier    equal_range(const _K2& __k) const {return __tree_.__equal_range_multi(__k);}
13842585835cSMarshall Clow#endif
13853e519524SHoward Hinnant
13863e519524SHoward Hinnantprivate:
13873e519524SHoward Hinnant    typedef typename __base::__node                    __node;
13883e519524SHoward Hinnant    typedef typename __base::__node_allocator          __node_allocator;
13893e519524SHoward Hinnant    typedef typename __base::__node_pointer            __node_pointer;
13903e519524SHoward Hinnant    typedef typename __base::__node_base_pointer       __node_base_pointer;
1391cb5cbc8bSEric Fiselier    typedef typename __base::__parent_pointer          __parent_pointer;
13920594ad71SEric Fiselier
1393c003db1fSHoward Hinnant    typedef __map_node_destructor<__node_allocator> _Dp;
1394c003db1fSHoward Hinnant    typedef unique_ptr<__node, _Dp> __node_holder;
13953e519524SHoward Hinnant
139654f0cda6SEric Fiselier#ifdef _LIBCPP_CXX03_LANG
13974a95f9ebSHoward Hinnant    __node_holder __construct_node_with_key(const key_type& __k);
139854f0cda6SEric Fiselier#endif
13993e519524SHoward Hinnant};
14003e519524SHoward Hinnant
14010594ad71SEric Fiselier
14025e3ea4ddSEric Fiselier#ifndef _LIBCPP_CXX03_LANG
14033e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator>
14043e519524SHoward Hinnantmap<_Key, _Tp, _Compare, _Allocator>::map(map&& __m, const allocator_type& __a)
14052a10c960SMarshall Clow    : __tree_(_VSTD::move(__m.__tree_), typename __base::allocator_type(__a))
14063e519524SHoward Hinnant{
14073e519524SHoward Hinnant    if (__a != __m.get_allocator())
14083e519524SHoward Hinnant    {
14093e519524SHoward Hinnant        const_iterator __e = cend();
14103e519524SHoward Hinnant        while (!__m.empty())
14113e519524SHoward Hinnant            __tree_.__insert_unique(__e.__i_,
1412f52318b4SErik Pilkington                    __m.__tree_.remove(__m.begin().__i_)->__value_.__move());
14133e519524SHoward Hinnant    }
14143e519524SHoward Hinnant}
14153e519524SHoward Hinnant
141618293116SEric Fiseliertemplate <class _Key, class _Tp, class _Compare, class _Allocator>
141718293116SEric Fiselier_Tp&
141818293116SEric Fiseliermap<_Key, _Tp, _Compare, _Allocator>::operator[](const key_type& __k)
141918293116SEric Fiselier{
142018293116SEric Fiselier    return __tree_.__emplace_unique_key_args(__k,
142118293116SEric Fiselier        _VSTD::piecewise_construct,
142218293116SEric Fiselier        _VSTD::forward_as_tuple(__k),
1423f52318b4SErik Pilkington        _VSTD::forward_as_tuple()).first->__get_value().second;
142418293116SEric Fiselier}
14253e519524SHoward Hinnant
142618293116SEric Fiseliertemplate <class _Key, class _Tp, class _Compare, class _Allocator>
142718293116SEric Fiselier_Tp&
142818293116SEric Fiseliermap<_Key, _Tp, _Compare, _Allocator>::operator[](key_type&& __k)
142918293116SEric Fiselier{
143018293116SEric Fiselier    return __tree_.__emplace_unique_key_args(__k,
143118293116SEric Fiselier        _VSTD::piecewise_construct,
143218293116SEric Fiselier        _VSTD::forward_as_tuple(_VSTD::move(__k)),
1433f52318b4SErik Pilkington        _VSTD::forward_as_tuple()).first->__get_value().second;
143418293116SEric Fiselier}
143554f0cda6SEric Fiselier
143618293116SEric Fiselier#else // _LIBCPP_CXX03_LANG
143754f0cda6SEric Fiselier
14383e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator>
14393e519524SHoward Hinnanttypename map<_Key, _Tp, _Compare, _Allocator>::__node_holder
14404a95f9ebSHoward Hinnantmap<_Key, _Tp, _Compare, _Allocator>::__construct_node_with_key(const key_type& __k)
14413e519524SHoward Hinnant{
14423e519524SHoward Hinnant    __node_allocator& __na = __tree_.__node_alloc();
1443c003db1fSHoward Hinnant    __node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na));
1444f52318b4SErik Pilkington    __node_traits::construct(__na, _VSTD::addressof(__h->__value_.__get_value().first), __k);
14453e519524SHoward Hinnant    __h.get_deleter().__first_constructed = true;
1446f52318b4SErik Pilkington    __node_traits::construct(__na, _VSTD::addressof(__h->__value_.__get_value().second));
14473e519524SHoward Hinnant    __h.get_deleter().__second_constructed = true;
1448251c6291SDimitry Andric    return _LIBCPP_EXPLICIT_MOVE(__h);  // explicitly moved for C++03
14493e519524SHoward Hinnant}
14503e519524SHoward Hinnant
14513e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator>
14523e519524SHoward Hinnant_Tp&
14533e519524SHoward Hinnantmap<_Key, _Tp, _Compare, _Allocator>::operator[](const key_type& __k)
14543e519524SHoward Hinnant{
1455cb5cbc8bSEric Fiselier    __parent_pointer __parent;
1456cb5cbc8bSEric Fiselier    __node_base_pointer& __child = __tree_.__find_equal(__parent, __k);
14573e519524SHoward Hinnant    __node_pointer __r = static_cast<__node_pointer>(__child);
14583e519524SHoward Hinnant    if (__child == nullptr)
14593e519524SHoward Hinnant    {
14604a95f9ebSHoward Hinnant        __node_holder __h = __construct_node_with_key(__k);
146107d3eccdSHoward Hinnant        __tree_.__insert_node_at(__parent, __child, static_cast<__node_base_pointer>(__h.get()));
14623e519524SHoward Hinnant        __r = __h.release();
14633e519524SHoward Hinnant    }
1464f52318b4SErik Pilkington    return __r->__value_.__get_value().second;
14653e519524SHoward Hinnant}
14663e519524SHoward Hinnant
146718293116SEric Fiselier#endif  // _LIBCPP_CXX03_LANG
14683e519524SHoward Hinnant
14693e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator>
14703e519524SHoward Hinnant_Tp&
14713e519524SHoward Hinnantmap<_Key, _Tp, _Compare, _Allocator>::at(const key_type& __k)
14723e519524SHoward Hinnant{
1473cb5cbc8bSEric Fiselier    __parent_pointer __parent;
1474cb5cbc8bSEric Fiselier    __node_base_pointer& __child = __tree_.__find_equal(__parent, __k);
147554b409fdSHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
14763e519524SHoward Hinnant    if (__child == nullptr)
14773e519524SHoward Hinnant        throw out_of_range("map::at:  key not found");
1478b3371f6fSHoward Hinnant#endif  // _LIBCPP_NO_EXCEPTIONS
1479f52318b4SErik Pilkington    return static_cast<__node_pointer>(__child)->__value_.__get_value().second;
14803e519524SHoward Hinnant}
14813e519524SHoward Hinnant
14823e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator>
14833e519524SHoward Hinnantconst _Tp&
14843e519524SHoward Hinnantmap<_Key, _Tp, _Compare, _Allocator>::at(const key_type& __k) const
14853e519524SHoward Hinnant{
1486cb5cbc8bSEric Fiselier    __parent_pointer __parent;
1487cb5cbc8bSEric Fiselier    __node_base_pointer __child = __tree_.__find_equal(__parent, __k);
148854b409fdSHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
14893e519524SHoward Hinnant    if (__child == nullptr)
14903e519524SHoward Hinnant        throw out_of_range("map::at:  key not found");
1491b3371f6fSHoward Hinnant#endif  // _LIBCPP_NO_EXCEPTIONS
1492f52318b4SErik Pilkington    return static_cast<__node_pointer>(__child)->__value_.__get_value().second;
14933e519524SHoward Hinnant}
14943e519524SHoward Hinnant
14953e519524SHoward Hinnant
14963e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator>
1497848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
14983e519524SHoward Hinnantbool
14993e519524SHoward Hinnantoperator==(const map<_Key, _Tp, _Compare, _Allocator>& __x,
15003e519524SHoward Hinnant           const map<_Key, _Tp, _Compare, _Allocator>& __y)
15013e519524SHoward Hinnant{
1502ce48a113SHoward Hinnant    return __x.size() == __y.size() && _VSTD::equal(__x.begin(), __x.end(), __y.begin());
15033e519524SHoward Hinnant}
15043e519524SHoward Hinnant
15053e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator>
1506848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
15073e519524SHoward Hinnantbool
15083e519524SHoward Hinnantoperator< (const map<_Key, _Tp, _Compare, _Allocator>& __x,
15093e519524SHoward Hinnant           const map<_Key, _Tp, _Compare, _Allocator>& __y)
15103e519524SHoward Hinnant{
1511ce48a113SHoward Hinnant    return _VSTD::lexicographical_compare(__x.begin(), __x.end(), __y.begin(), __y.end());
15123e519524SHoward Hinnant}
15133e519524SHoward Hinnant
15143e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator>
1515848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
15163e519524SHoward Hinnantbool
15173e519524SHoward Hinnantoperator!=(const map<_Key, _Tp, _Compare, _Allocator>& __x,
15183e519524SHoward Hinnant           const map<_Key, _Tp, _Compare, _Allocator>& __y)
15193e519524SHoward Hinnant{
15203e519524SHoward Hinnant    return !(__x == __y);
15213e519524SHoward Hinnant}
15223e519524SHoward Hinnant
15233e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator>
1524848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
15253e519524SHoward Hinnantbool
15263e519524SHoward Hinnantoperator> (const map<_Key, _Tp, _Compare, _Allocator>& __x,
15273e519524SHoward Hinnant           const map<_Key, _Tp, _Compare, _Allocator>& __y)
15283e519524SHoward Hinnant{
15293e519524SHoward Hinnant    return __y < __x;
15303e519524SHoward Hinnant}
15313e519524SHoward Hinnant
15323e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator>
1533848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
15343e519524SHoward Hinnantbool
15353e519524SHoward Hinnantoperator>=(const map<_Key, _Tp, _Compare, _Allocator>& __x,
15363e519524SHoward Hinnant           const map<_Key, _Tp, _Compare, _Allocator>& __y)
15373e519524SHoward Hinnant{
15383e519524SHoward Hinnant    return !(__x < __y);
15393e519524SHoward Hinnant}
15403e519524SHoward Hinnant
15413e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator>
1542848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
15433e519524SHoward Hinnantbool
15443e519524SHoward Hinnantoperator<=(const map<_Key, _Tp, _Compare, _Allocator>& __x,
15453e519524SHoward Hinnant           const map<_Key, _Tp, _Compare, _Allocator>& __y)
15463e519524SHoward Hinnant{
15473e519524SHoward Hinnant    return !(__y < __x);
15483e519524SHoward Hinnant}
15493e519524SHoward Hinnant
15503e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator>
1551848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
15523e519524SHoward Hinnantvoid
15533e519524SHoward Hinnantswap(map<_Key, _Tp, _Compare, _Allocator>& __x,
15543e519524SHoward Hinnant     map<_Key, _Tp, _Compare, _Allocator>& __y)
15551052ee39SHoward Hinnant    _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
15563e519524SHoward Hinnant{
15573e519524SHoward Hinnant    __x.swap(__y);
15583e519524SHoward Hinnant}
15593e519524SHoward Hinnant
15603e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare = less<_Key>,
15613e519524SHoward Hinnant          class _Allocator = allocator<pair<const _Key, _Tp> > >
1562e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS multimap
15633e519524SHoward Hinnant{
15643e519524SHoward Hinnantpublic:
15653e519524SHoward Hinnant    // types:
15663e519524SHoward Hinnant    typedef _Key                                     key_type;
15673e519524SHoward Hinnant    typedef _Tp                                      mapped_type;
15683e519524SHoward Hinnant    typedef pair<const key_type, mapped_type>        value_type;
15693e519524SHoward Hinnant    typedef _Compare                                 key_compare;
15703e519524SHoward Hinnant    typedef _Allocator                               allocator_type;
15713e519524SHoward Hinnant    typedef value_type&                              reference;
15723e519524SHoward Hinnant    typedef const value_type&                        const_reference;
15733e519524SHoward Hinnant
157494f89aeeSMarshall Clow    static_assert((is_same<typename allocator_type::value_type, value_type>::value),
157594f89aeeSMarshall Clow                  "Allocator::value_type must be same type as value_type");
157694f89aeeSMarshall Clow
1577e2f2d1edSEric Fiselier    class _LIBCPP_TEMPLATE_VIS value_compare
15783e519524SHoward Hinnant        : public binary_function<value_type, value_type, bool>
15793e519524SHoward Hinnant    {
15803e519524SHoward Hinnant        friend class multimap;
15813e519524SHoward Hinnant    protected:
15823e519524SHoward Hinnant        key_compare comp;
15833e519524SHoward Hinnant
1584848a5374SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
15853e519524SHoward Hinnant        value_compare(key_compare c) : comp(c) {}
15863e519524SHoward Hinnant    public:
1587848a5374SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
15883e519524SHoward Hinnant        bool operator()(const value_type& __x, const value_type& __y) const
15893e519524SHoward Hinnant            {return comp(__x.first, __y.first);}
15903e519524SHoward Hinnant    };
15913e519524SHoward Hinnant
15923e519524SHoward Hinnantprivate:
159307d3eccdSHoward Hinnant
15949fd9f84fSHoward Hinnant    typedef _VSTD::__value_type<key_type, mapped_type>             __value_type;
1595abb160e6SHoward Hinnant    typedef __map_value_compare<key_type, __value_type, key_compare> __vc;
15961f508014SMarshall Clow    typedef typename __rebind_alloc_helper<allocator_traits<allocator_type>,
15971f508014SMarshall Clow                                                 __value_type>::type __allocator_type;
15983e519524SHoward Hinnant    typedef __tree<__value_type, __vc, __allocator_type>            __base;
15993e519524SHoward Hinnant    typedef typename __base::__node_traits                          __node_traits;
16003e519524SHoward Hinnant    typedef allocator_traits<allocator_type>                        __alloc_traits;
16013e519524SHoward Hinnant
16023e519524SHoward Hinnant    __base __tree_;
16033e519524SHoward Hinnant
16043e519524SHoward Hinnantpublic:
16053e519524SHoward Hinnant    typedef typename __alloc_traits::pointer               pointer;
16063e519524SHoward Hinnant    typedef typename __alloc_traits::const_pointer         const_pointer;
16073e519524SHoward Hinnant    typedef typename __alloc_traits::size_type             size_type;
16083e519524SHoward Hinnant    typedef typename __alloc_traits::difference_type       difference_type;
16093e519524SHoward Hinnant    typedef __map_iterator<typename __base::iterator>      iterator;
16103e519524SHoward Hinnant    typedef __map_const_iterator<typename __base::const_iterator> const_iterator;
1611ce48a113SHoward Hinnant    typedef _VSTD::reverse_iterator<iterator>               reverse_iterator;
1612ce48a113SHoward Hinnant    typedef _VSTD::reverse_iterator<const_iterator>         const_reverse_iterator;
16133e519524SHoward Hinnant
1614b0386a51SErik Pilkington#if _LIBCPP_STD_VER > 14
1615b0386a51SErik Pilkington    typedef __map_node_handle<typename __base::__node, allocator_type> node_type;
1616b0386a51SErik Pilkington#endif
1617b0386a51SErik Pilkington
1618848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
1619415a24e4SMarshall Clow    multimap()
1620415a24e4SMarshall Clow        _NOEXCEPT_(
1621415a24e4SMarshall Clow            is_nothrow_default_constructible<allocator_type>::value &&
1622415a24e4SMarshall Clow            is_nothrow_default_constructible<key_compare>::value &&
1623415a24e4SMarshall Clow            is_nothrow_copy_constructible<key_compare>::value)
1624415a24e4SMarshall Clow        : __tree_(__vc(key_compare())) {}
1625415a24e4SMarshall Clow
1626415a24e4SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
1627415a24e4SMarshall Clow    explicit multimap(const key_compare& __comp)
16281052ee39SHoward Hinnant        _NOEXCEPT_(
16291052ee39SHoward Hinnant            is_nothrow_default_constructible<allocator_type>::value &&
16301052ee39SHoward Hinnant            is_nothrow_copy_constructible<key_compare>::value)
16313e519524SHoward Hinnant        : __tree_(__vc(__comp)) {}
16323e519524SHoward Hinnant
1633848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
16343e519524SHoward Hinnant    explicit multimap(const key_compare& __comp, const allocator_type& __a)
16352a10c960SMarshall Clow        : __tree_(__vc(__comp), typename __base::allocator_type(__a)) {}
16363e519524SHoward Hinnant
16373e519524SHoward Hinnant    template <class _InputIterator>
1638848a5374SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
16393e519524SHoward Hinnant        multimap(_InputIterator __f, _InputIterator __l,
16403e519524SHoward Hinnant            const key_compare& __comp = key_compare())
16413e519524SHoward Hinnant        : __tree_(__vc(__comp))
16423e519524SHoward Hinnant        {
16433e519524SHoward Hinnant            insert(__f, __l);
16443e519524SHoward Hinnant        }
16453e519524SHoward Hinnant
16463e519524SHoward Hinnant    template <class _InputIterator>
1647848a5374SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
16483e519524SHoward Hinnant        multimap(_InputIterator __f, _InputIterator __l,
16493e519524SHoward Hinnant            const key_compare& __comp, const allocator_type& __a)
16502a10c960SMarshall Clow        : __tree_(__vc(__comp), typename __base::allocator_type(__a))
16513e519524SHoward Hinnant        {
16523e519524SHoward Hinnant            insert(__f, __l);
16533e519524SHoward Hinnant        }
16543e519524SHoward Hinnant
1655fbc317d4SMarshall Clow#if _LIBCPP_STD_VER > 11
1656fbc317d4SMarshall Clow    template <class _InputIterator>
1657fbc317d4SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
1658fbc317d4SMarshall Clow    multimap(_InputIterator __f, _InputIterator __l, const allocator_type& __a)
1659fbc317d4SMarshall Clow        : multimap(__f, __l, key_compare(), __a) {}
1660fbc317d4SMarshall Clow#endif
1661fbc317d4SMarshall Clow
1662848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
16633e519524SHoward Hinnant    multimap(const multimap& __m)
16643e519524SHoward Hinnant        : __tree_(__m.__tree_.value_comp(),
16653e519524SHoward Hinnant          __alloc_traits::select_on_container_copy_construction(__m.__tree_.__alloc()))
16663e519524SHoward Hinnant        {
16673e519524SHoward Hinnant            insert(__m.begin(), __m.end());
16683e519524SHoward Hinnant        }
16693e519524SHoward Hinnant
16705a33687dSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
16715a33687dSHoward Hinnant    multimap& operator=(const multimap& __m)
16725a33687dSHoward Hinnant        {
16732ee83725SMarshall Clow#ifndef _LIBCPP_CXX03_LANG
16745a33687dSHoward Hinnant            __tree_ = __m.__tree_;
167507d3eccdSHoward Hinnant#else
167674cf6ff5SMarshall Clow            if (this != &__m) {
167707d3eccdSHoward Hinnant                __tree_.clear();
167807d3eccdSHoward Hinnant                __tree_.value_comp() = __m.__tree_.value_comp();
167907d3eccdSHoward Hinnant                __tree_.__copy_assign_alloc(__m.__tree_);
168007d3eccdSHoward Hinnant                insert(__m.begin(), __m.end());
168174cf6ff5SMarshall Clow            }
168207d3eccdSHoward Hinnant#endif
16835a33687dSHoward Hinnant            return *this;
16845a33687dSHoward Hinnant        }
16855a33687dSHoward Hinnant
168618293116SEric Fiselier#ifndef _LIBCPP_CXX03_LANG
16873e519524SHoward Hinnant
1688848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
16893e519524SHoward Hinnant    multimap(multimap&& __m)
16901052ee39SHoward Hinnant        _NOEXCEPT_(is_nothrow_move_constructible<__base>::value)
1691ce48a113SHoward Hinnant        : __tree_(_VSTD::move(__m.__tree_))
16923e519524SHoward Hinnant        {
16933e519524SHoward Hinnant        }
16943e519524SHoward Hinnant
16953e519524SHoward Hinnant    multimap(multimap&& __m, const allocator_type& __a);
16963e519524SHoward Hinnant
1697848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
169854976f26SHoward Hinnant    multimap& operator=(multimap&& __m)
169954976f26SHoward Hinnant        _NOEXCEPT_(is_nothrow_move_assignable<__base>::value)
170054976f26SHoward Hinnant        {
170154976f26SHoward Hinnant            __tree_ = _VSTD::move(__m.__tree_);
170254976f26SHoward Hinnant            return *this;
170354976f26SHoward Hinnant        }
170454976f26SHoward Hinnant
170554976f26SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
17063e519524SHoward Hinnant    multimap(initializer_list<value_type> __il, const key_compare& __comp = key_compare())
17073e519524SHoward Hinnant        : __tree_(__vc(__comp))
17083e519524SHoward Hinnant        {
17093e519524SHoward Hinnant            insert(__il.begin(), __il.end());
17103e519524SHoward Hinnant        }
17113e519524SHoward Hinnant
1712848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
17133e519524SHoward Hinnant    multimap(initializer_list<value_type> __il, const key_compare& __comp, const allocator_type& __a)
17142a10c960SMarshall Clow        : __tree_(__vc(__comp), typename __base::allocator_type(__a))
17153e519524SHoward Hinnant        {
17163e519524SHoward Hinnant            insert(__il.begin(), __il.end());
17173e519524SHoward Hinnant        }
17183e519524SHoward Hinnant
1719fbc317d4SMarshall Clow#if _LIBCPP_STD_VER > 11
1720fbc317d4SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
1721fbc317d4SMarshall Clow    multimap(initializer_list<value_type> __il, const allocator_type& __a)
1722fbc317d4SMarshall Clow        : multimap(__il, key_compare(), __a) {}
1723fbc317d4SMarshall Clow#endif
1724fbc317d4SMarshall Clow
1725848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
17263e519524SHoward Hinnant    multimap& operator=(initializer_list<value_type> __il)
17273e519524SHoward Hinnant        {
17283e519524SHoward Hinnant            __tree_.__assign_multi(__il.begin(), __il.end());
17293e519524SHoward Hinnant            return *this;
17303e519524SHoward Hinnant        }
173154976f26SHoward Hinnant
173218293116SEric Fiselier#endif  // _LIBCPP_CXX03_LANG
17333e519524SHoward Hinnant
1734848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
17353e519524SHoward Hinnant    explicit multimap(const allocator_type& __a)
17362a10c960SMarshall Clow        : __tree_(typename __base::allocator_type(__a))
17373e519524SHoward Hinnant        {
17383e519524SHoward Hinnant        }
17393e519524SHoward Hinnant
1740848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
17413e519524SHoward Hinnant    multimap(const multimap& __m, const allocator_type& __a)
17422a10c960SMarshall Clow        : __tree_(__m.__tree_.value_comp(), typename __base::allocator_type(__a))
17433e519524SHoward Hinnant        {
17443e519524SHoward Hinnant            insert(__m.begin(), __m.end());
17453e519524SHoward Hinnant        }
17463e519524SHoward Hinnant
1747848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
17481052ee39SHoward Hinnant          iterator begin() _NOEXCEPT {return __tree_.begin();}
1749848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
17501052ee39SHoward Hinnant    const_iterator begin() const _NOEXCEPT {return __tree_.begin();}
1751848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
17521052ee39SHoward Hinnant          iterator end() _NOEXCEPT {return __tree_.end();}
1753848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
17541052ee39SHoward Hinnant    const_iterator end() const _NOEXCEPT {return __tree_.end();}
17553e519524SHoward Hinnant
1756848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
17571052ee39SHoward Hinnant          reverse_iterator rbegin() _NOEXCEPT {return reverse_iterator(end());}
1758848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
17591052ee39SHoward Hinnant    const_reverse_iterator rbegin() const _NOEXCEPT
17601052ee39SHoward Hinnant        {return const_reverse_iterator(end());}
1761848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
17621052ee39SHoward Hinnant          reverse_iterator rend() _NOEXCEPT {return reverse_iterator(begin());}
1763848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
17641052ee39SHoward Hinnant    const_reverse_iterator rend() const _NOEXCEPT
17651052ee39SHoward Hinnant        {return const_reverse_iterator(begin());}
17663e519524SHoward Hinnant
1767848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
17681052ee39SHoward Hinnant    const_iterator cbegin()  const _NOEXCEPT {return begin();}
1769848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
17701052ee39SHoward Hinnant    const_iterator cend() const _NOEXCEPT {return end();}
1771848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
17721052ee39SHoward Hinnant    const_reverse_iterator crbegin() const _NOEXCEPT {return rbegin();}
1773848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
17741052ee39SHoward Hinnant    const_reverse_iterator crend() const _NOEXCEPT {return rend();}
17753e519524SHoward Hinnant
177672c8fad4SMarshall Clow    _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY
17771052ee39SHoward Hinnant    bool empty() const _NOEXCEPT {return __tree_.size() == 0;}
1778848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
17791052ee39SHoward Hinnant    size_type size() const _NOEXCEPT {return __tree_.size();}
1780848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
17811052ee39SHoward Hinnant    size_type max_size() const _NOEXCEPT {return __tree_.max_size();}
17823e519524SHoward Hinnant
1783848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
17842a10c960SMarshall Clow    allocator_type get_allocator() const _NOEXCEPT {return allocator_type(__tree_.__alloc());}
1785848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
17863e519524SHoward Hinnant    key_compare    key_comp() const {return __tree_.value_comp().key_comp();}
1787848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
17881052ee39SHoward Hinnant    value_compare  value_comp() const
17891052ee39SHoward Hinnant        {return value_compare(__tree_.value_comp().key_comp());}
17903e519524SHoward Hinnant
17915e3ea4ddSEric Fiselier#ifndef _LIBCPP_CXX03_LANG
17927609c9b6SHoward Hinnant
17938b805c91SHoward Hinnant    template <class ..._Args>
17945e3ea4ddSEric Fiselier    _LIBCPP_INLINE_VISIBILITY
17955e3ea4ddSEric Fiselier    iterator emplace(_Args&& ...__args) {
17965e3ea4ddSEric Fiselier        return __tree_.__emplace_multi(_VSTD::forward<_Args>(__args)...);
17975e3ea4ddSEric Fiselier    }
17983e519524SHoward Hinnant
17998b805c91SHoward Hinnant    template <class ..._Args>
18005e3ea4ddSEric Fiselier    _LIBCPP_INLINE_VISIBILITY
18015e3ea4ddSEric Fiselier    iterator emplace_hint(const_iterator __p, _Args&& ...__args) {
18025e3ea4ddSEric Fiselier        return __tree_.__emplace_hint_multi(__p.__i_, _VSTD::forward<_Args>(__args)...);
18035e3ea4ddSEric Fiselier    }
18047609c9b6SHoward Hinnant
1805c003db1fSHoward Hinnant    template <class _Pp,
1806c003db1fSHoward Hinnant              class = typename enable_if<is_constructible<value_type, _Pp>::value>::type>
1807848a5374SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
1808c003db1fSHoward Hinnant        iterator insert(_Pp&& __p)
1809c003db1fSHoward Hinnant            {return __tree_.__insert_multi(_VSTD::forward<_Pp>(__p));}
18103e519524SHoward Hinnant
1811c003db1fSHoward Hinnant    template <class _Pp,
1812c003db1fSHoward Hinnant              class = typename enable_if<is_constructible<value_type, _Pp>::value>::type>
1813848a5374SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
1814c003db1fSHoward Hinnant        iterator insert(const_iterator __pos, _Pp&& __p)
1815c003db1fSHoward Hinnant            {return __tree_.__insert_multi(__pos.__i_, _VSTD::forward<_Pp>(__p));}
18163e519524SHoward Hinnant
18177a9f500fSEric Fiselier    _LIBCPP_INLINE_VISIBILITY
18187a9f500fSEric Fiselier    iterator insert(value_type&& __v)
18197a9f500fSEric Fiselier        {return __tree_.__insert_multi(_VSTD::move(__v));}
18207a9f500fSEric Fiselier
18217a9f500fSEric Fiselier    _LIBCPP_INLINE_VISIBILITY
18227a9f500fSEric Fiselier    iterator insert(const_iterator __p, value_type&& __v)
18237a9f500fSEric Fiselier        {return __tree_.__insert_multi(__p.__i_, _VSTD::move(__v));}
18247a9f500fSEric Fiselier
182518293116SEric Fiselier
182618293116SEric Fiselier    _LIBCPP_INLINE_VISIBILITY
182718293116SEric Fiselier    void insert(initializer_list<value_type> __il)
182818293116SEric Fiselier        {insert(__il.begin(), __il.end());}
182918293116SEric Fiselier
18305e3ea4ddSEric Fiselier#endif  // _LIBCPP_CXX03_LANG
18313e519524SHoward Hinnant
1832848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
18333e519524SHoward Hinnant    iterator insert(const value_type& __v) {return __tree_.__insert_multi(__v);}
18343e519524SHoward Hinnant
1835848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
18363e519524SHoward Hinnant    iterator insert(const_iterator __p, const value_type& __v)
18373e519524SHoward Hinnant            {return __tree_.__insert_multi(__p.__i_, __v);}
18383e519524SHoward Hinnant
18393e519524SHoward Hinnant    template <class _InputIterator>
1840848a5374SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
18413e519524SHoward Hinnant        void insert(_InputIterator __f, _InputIterator __l)
18423e519524SHoward Hinnant        {
18433e519524SHoward Hinnant            for (const_iterator __e = cend(); __f != __l; ++__f)
18443e519524SHoward Hinnant                __tree_.__insert_multi(__e.__i_, *__f);
18453e519524SHoward Hinnant        }
18463e519524SHoward Hinnant
1847848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
18483e519524SHoward Hinnant    iterator erase(const_iterator __p) {return __tree_.erase(__p.__i_);}
1849848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
1850ec392968SMarshall Clow    iterator erase(iterator __p)       {return __tree_.erase(__p.__i_);}
1851ec392968SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
18523e519524SHoward Hinnant    size_type erase(const key_type& __k) {return __tree_.__erase_multi(__k);}
1853848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
18543e519524SHoward Hinnant    iterator  erase(const_iterator __f, const_iterator __l)
18553e519524SHoward Hinnant        {return __tree_.erase(__f.__i_, __l.__i_);}
1856b0386a51SErik Pilkington
1857b0386a51SErik Pilkington#if _LIBCPP_STD_VER > 14
1858b0386a51SErik Pilkington    _LIBCPP_INLINE_VISIBILITY
1859b0386a51SErik Pilkington    iterator insert(node_type&& __nh)
1860b0386a51SErik Pilkington    {
1861b0386a51SErik Pilkington        _LIBCPP_ASSERT(__nh.empty() || __nh.get_allocator() == get_allocator(),
1862b0386a51SErik Pilkington            "node_type with incompatible allocator passed to multimap::insert()");
1863b0386a51SErik Pilkington        return __tree_.template __node_handle_insert_multi<node_type>(
1864b0386a51SErik Pilkington            _VSTD::move(__nh));
1865b0386a51SErik Pilkington    }
1866b0386a51SErik Pilkington    _LIBCPP_INLINE_VISIBILITY
1867b0386a51SErik Pilkington    iterator insert(const_iterator __hint, node_type&& __nh)
1868b0386a51SErik Pilkington    {
1869b0386a51SErik Pilkington        _LIBCPP_ASSERT(__nh.empty() || __nh.get_allocator() == get_allocator(),
1870b0386a51SErik Pilkington            "node_type with incompatible allocator passed to multimap::insert()");
1871b0386a51SErik Pilkington        return __tree_.template __node_handle_insert_multi<node_type>(
1872b0386a51SErik Pilkington            __hint.__i_, _VSTD::move(__nh));
1873b0386a51SErik Pilkington    }
1874b0386a51SErik Pilkington    _LIBCPP_INLINE_VISIBILITY
1875b0386a51SErik Pilkington    node_type extract(key_type const& __key)
1876b0386a51SErik Pilkington    {
1877b0386a51SErik Pilkington        return __tree_.template __node_handle_extract<node_type>(__key);
1878b0386a51SErik Pilkington    }
1879b0386a51SErik Pilkington    _LIBCPP_INLINE_VISIBILITY
1880b0386a51SErik Pilkington    node_type extract(const_iterator __it)
1881b0386a51SErik Pilkington    {
1882b0386a51SErik Pilkington        return __tree_.template __node_handle_extract<node_type>(
1883b0386a51SErik Pilkington            __it.__i_);
1884b0386a51SErik Pilkington    }
1885b0386a51SErik Pilkington#endif
1886b0386a51SErik Pilkington
1887848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
1888934e9a39SMarshall Clow    void clear() _NOEXCEPT {__tree_.clear();}
18893e519524SHoward Hinnant
1890848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
18911052ee39SHoward Hinnant    void swap(multimap& __m)
18921052ee39SHoward Hinnant        _NOEXCEPT_(__is_nothrow_swappable<__base>::value)
18931052ee39SHoward Hinnant        {__tree_.swap(__m.__tree_);}
18943e519524SHoward Hinnant
1895848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
18963e519524SHoward Hinnant    iterator find(const key_type& __k)             {return __tree_.find(__k);}
1897848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
18983e519524SHoward Hinnant    const_iterator find(const key_type& __k) const {return __tree_.find(__k);}
18992585835cSMarshall Clow#if _LIBCPP_STD_VER > 11
19002585835cSMarshall Clow    template <typename _K2>
19012585835cSMarshall Clow    _LIBCPP_INLINE_VISIBILITY
19022585835cSMarshall Clow    typename enable_if<__is_transparent<_Compare, _K2>::value,iterator>::type
19032585835cSMarshall Clow    find(const _K2& __k)                           {return __tree_.find(__k);}
19042585835cSMarshall Clow    template <typename _K2>
19052585835cSMarshall Clow    _LIBCPP_INLINE_VISIBILITY
19062585835cSMarshall Clow    typename enable_if<__is_transparent<_Compare, _K2>::value,const_iterator>::type
19072585835cSMarshall Clow    find(const _K2& __k) const                     {return __tree_.find(__k);}
19082585835cSMarshall Clow#endif
19092585835cSMarshall Clow
1910848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
19113e519524SHoward Hinnant    size_type      count(const key_type& __k) const
19123e519524SHoward Hinnant        {return __tree_.__count_multi(__k);}
19130aacbc92SMarshall Clow#if _LIBCPP_STD_VER > 11
19140aacbc92SMarshall Clow    template <typename _K2>
19150aacbc92SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
19160aacbc92SMarshall Clow    typename enable_if<__is_transparent<_Compare, _K2>::value,size_type>::type
1917f8457a07SMarshall Clow    count(const _K2& __k) const {return __tree_.__count_multi(__k);}
19180aacbc92SMarshall Clow#endif
1919848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
19203e519524SHoward Hinnant    iterator lower_bound(const key_type& __k)
19213e519524SHoward Hinnant        {return __tree_.lower_bound(__k);}
1922848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
19233e519524SHoward Hinnant    const_iterator lower_bound(const key_type& __k) const
19243e519524SHoward Hinnant            {return __tree_.lower_bound(__k);}
19252585835cSMarshall Clow#if _LIBCPP_STD_VER > 11
19262585835cSMarshall Clow    template <typename _K2>
19272585835cSMarshall Clow    _LIBCPP_INLINE_VISIBILITY
19282585835cSMarshall Clow    typename enable_if<__is_transparent<_Compare, _K2>::value,iterator>::type
19292585835cSMarshall Clow    lower_bound(const _K2& __k)       {return __tree_.lower_bound(__k);}
19302585835cSMarshall Clow
19312585835cSMarshall Clow    template <typename _K2>
19322585835cSMarshall Clow    _LIBCPP_INLINE_VISIBILITY
19332585835cSMarshall Clow    typename enable_if<__is_transparent<_Compare, _K2>::value,const_iterator>::type
19342585835cSMarshall Clow    lower_bound(const _K2& __k) const {return __tree_.lower_bound(__k);}
19352585835cSMarshall Clow#endif
19362585835cSMarshall Clow
1937848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
19383e519524SHoward Hinnant    iterator upper_bound(const key_type& __k)
19393e519524SHoward Hinnant            {return __tree_.upper_bound(__k);}
1940848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
19413e519524SHoward Hinnant    const_iterator upper_bound(const key_type& __k) const
19423e519524SHoward Hinnant            {return __tree_.upper_bound(__k);}
19432585835cSMarshall Clow#if _LIBCPP_STD_VER > 11
19442585835cSMarshall Clow    template <typename _K2>
19452585835cSMarshall Clow    _LIBCPP_INLINE_VISIBILITY
19462585835cSMarshall Clow    typename enable_if<__is_transparent<_Compare, _K2>::value,iterator>::type
19472585835cSMarshall Clow    upper_bound(const _K2& __k)       {return __tree_.upper_bound(__k);}
19482585835cSMarshall Clow    template <typename _K2>
19492585835cSMarshall Clow    _LIBCPP_INLINE_VISIBILITY
19502585835cSMarshall Clow    typename enable_if<__is_transparent<_Compare, _K2>::value,const_iterator>::type
19512585835cSMarshall Clow    upper_bound(const _K2& __k) const {return __tree_.upper_bound(__k);}
19522585835cSMarshall Clow#endif
19532585835cSMarshall Clow
1954848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
19553e519524SHoward Hinnant    pair<iterator,iterator>             equal_range(const key_type& __k)
19563e519524SHoward Hinnant            {return __tree_.__equal_range_multi(__k);}
1957848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
19583e519524SHoward Hinnant    pair<const_iterator,const_iterator> equal_range(const key_type& __k) const
19593e519524SHoward Hinnant            {return __tree_.__equal_range_multi(__k);}
19602585835cSMarshall Clow#if _LIBCPP_STD_VER > 11
19612585835cSMarshall Clow    template <typename _K2>
19622585835cSMarshall Clow    _LIBCPP_INLINE_VISIBILITY
19632585835cSMarshall Clow    typename enable_if<__is_transparent<_Compare, _K2>::value,pair<iterator,iterator>>::type
19642585835cSMarshall Clow    equal_range(const _K2& __k)       {return __tree_.__equal_range_multi(__k);}
19652585835cSMarshall Clow    template <typename _K2>
19662585835cSMarshall Clow    _LIBCPP_INLINE_VISIBILITY
19672585835cSMarshall Clow    typename enable_if<__is_transparent<_Compare, _K2>::value,pair<const_iterator,const_iterator>>::type
19682585835cSMarshall Clow    equal_range(const _K2& __k) const {return __tree_.__equal_range_multi(__k);}
19692585835cSMarshall Clow#endif
19703e519524SHoward Hinnant
19713e519524SHoward Hinnantprivate:
19723e519524SHoward Hinnant    typedef typename __base::__node                    __node;
19733e519524SHoward Hinnant    typedef typename __base::__node_allocator          __node_allocator;
19743e519524SHoward Hinnant    typedef typename __base::__node_pointer            __node_pointer;
19750594ad71SEric Fiselier
1976c003db1fSHoward Hinnant    typedef __map_node_destructor<__node_allocator> _Dp;
1977c003db1fSHoward Hinnant    typedef unique_ptr<__node, _Dp> __node_holder;
19783e519524SHoward Hinnant};
19793e519524SHoward Hinnant
19805e3ea4ddSEric Fiselier#ifndef _LIBCPP_CXX03_LANG
19813e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator>
19823e519524SHoward Hinnantmultimap<_Key, _Tp, _Compare, _Allocator>::multimap(multimap&& __m, const allocator_type& __a)
19832a10c960SMarshall Clow    : __tree_(_VSTD::move(__m.__tree_), typename __base::allocator_type(__a))
19843e519524SHoward Hinnant{
19853e519524SHoward Hinnant    if (__a != __m.get_allocator())
19863e519524SHoward Hinnant    {
19873e519524SHoward Hinnant        const_iterator __e = cend();
19883e519524SHoward Hinnant        while (!__m.empty())
19893e519524SHoward Hinnant            __tree_.__insert_multi(__e.__i_,
1990f52318b4SErik Pilkington                    _VSTD::move(__m.__tree_.remove(__m.begin().__i_)->__value_.__move()));
19913e519524SHoward Hinnant    }
19923e519524SHoward Hinnant}
19935e3ea4ddSEric Fiselier#endif
19943e519524SHoward Hinnant
19953e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator>
1996848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
19973e519524SHoward Hinnantbool
19983e519524SHoward Hinnantoperator==(const multimap<_Key, _Tp, _Compare, _Allocator>& __x,
19993e519524SHoward Hinnant           const multimap<_Key, _Tp, _Compare, _Allocator>& __y)
20003e519524SHoward Hinnant{
2001ce48a113SHoward Hinnant    return __x.size() == __y.size() && _VSTD::equal(__x.begin(), __x.end(), __y.begin());
20023e519524SHoward Hinnant}
20033e519524SHoward Hinnant
20043e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator>
2005848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
20063e519524SHoward Hinnantbool
20073e519524SHoward Hinnantoperator< (const multimap<_Key, _Tp, _Compare, _Allocator>& __x,
20083e519524SHoward Hinnant           const multimap<_Key, _Tp, _Compare, _Allocator>& __y)
20093e519524SHoward Hinnant{
2010ce48a113SHoward Hinnant    return _VSTD::lexicographical_compare(__x.begin(), __x.end(), __y.begin(), __y.end());
20113e519524SHoward Hinnant}
20123e519524SHoward Hinnant
20133e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator>
2014848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
20153e519524SHoward Hinnantbool
20163e519524SHoward Hinnantoperator!=(const multimap<_Key, _Tp, _Compare, _Allocator>& __x,
20173e519524SHoward Hinnant           const multimap<_Key, _Tp, _Compare, _Allocator>& __y)
20183e519524SHoward Hinnant{
20193e519524SHoward Hinnant    return !(__x == __y);
20203e519524SHoward Hinnant}
20213e519524SHoward Hinnant
20223e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator>
2023848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
20243e519524SHoward Hinnantbool
20253e519524SHoward Hinnantoperator> (const multimap<_Key, _Tp, _Compare, _Allocator>& __x,
20263e519524SHoward Hinnant           const multimap<_Key, _Tp, _Compare, _Allocator>& __y)
20273e519524SHoward Hinnant{
20283e519524SHoward Hinnant    return __y < __x;
20293e519524SHoward Hinnant}
20303e519524SHoward Hinnant
20313e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator>
2032848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
20333e519524SHoward Hinnantbool
20343e519524SHoward Hinnantoperator>=(const multimap<_Key, _Tp, _Compare, _Allocator>& __x,
20353e519524SHoward Hinnant           const multimap<_Key, _Tp, _Compare, _Allocator>& __y)
20363e519524SHoward Hinnant{
20373e519524SHoward Hinnant    return !(__x < __y);
20383e519524SHoward Hinnant}
20393e519524SHoward Hinnant
20403e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator>
2041848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
20423e519524SHoward Hinnantbool
20433e519524SHoward Hinnantoperator<=(const multimap<_Key, _Tp, _Compare, _Allocator>& __x,
20443e519524SHoward Hinnant           const multimap<_Key, _Tp, _Compare, _Allocator>& __y)
20453e519524SHoward Hinnant{
20463e519524SHoward Hinnant    return !(__y < __x);
20473e519524SHoward Hinnant}
20483e519524SHoward Hinnant
20493e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator>
2050848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
20513e519524SHoward Hinnantvoid
20523e519524SHoward Hinnantswap(multimap<_Key, _Tp, _Compare, _Allocator>& __x,
20533e519524SHoward Hinnant     multimap<_Key, _Tp, _Compare, _Allocator>& __y)
20541052ee39SHoward Hinnant    _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
20553e519524SHoward Hinnant{
20563e519524SHoward Hinnant    __x.swap(__y);
20573e519524SHoward Hinnant}
20583e519524SHoward Hinnant
20593e519524SHoward Hinnant_LIBCPP_END_NAMESPACE_STD
20603e519524SHoward Hinnant
20613e519524SHoward Hinnant#endif  // _LIBCPP_MAP
2062