xref: /llvm-project-15.0.7/libcxx/include/map (revision 4e0ea2cf)
13e519524SHoward Hinnant// -*- C++ -*-
23e519524SHoward Hinnant//===----------------------------- map ------------------------------------===//
33e519524SHoward Hinnant//
457b08b09SChandler Carruth// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
557b08b09SChandler Carruth// See https://llvm.org/LICENSE.txt for license information.
657b08b09SChandler Carruth// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
73e519524SHoward Hinnant//
83e519524SHoward Hinnant//===----------------------------------------------------------------------===//
93e519524SHoward Hinnant
103e519524SHoward Hinnant#ifndef _LIBCPP_MAP
113e519524SHoward Hinnant#define _LIBCPP_MAP
123e519524SHoward Hinnant
133e519524SHoward Hinnant/*
143e519524SHoward Hinnant
153e519524SHoward Hinnant    map synopsis
163e519524SHoward Hinnant
173e519524SHoward Hinnantnamespace std
183e519524SHoward Hinnant{
193e519524SHoward Hinnant
203e519524SHoward Hinnanttemplate <class Key, class T, class Compare = less<Key>,
213e519524SHoward Hinnant          class Allocator = allocator<pair<const Key, T>>>
223e519524SHoward Hinnantclass map
233e519524SHoward Hinnant{
243e519524SHoward Hinnantpublic:
253e519524SHoward Hinnant    // types:
263e519524SHoward Hinnant    typedef Key                                      key_type;
273e519524SHoward Hinnant    typedef T                                        mapped_type;
283e519524SHoward Hinnant    typedef pair<const key_type, mapped_type>        value_type;
293e519524SHoward Hinnant    typedef Compare                                  key_compare;
303e519524SHoward Hinnant    typedef Allocator                                allocator_type;
313e519524SHoward Hinnant    typedef typename allocator_type::reference       reference;
323e519524SHoward Hinnant    typedef typename allocator_type::const_reference const_reference;
333e519524SHoward Hinnant    typedef typename allocator_type::pointer         pointer;
343e519524SHoward Hinnant    typedef typename allocator_type::const_pointer   const_pointer;
353e519524SHoward Hinnant    typedef typename allocator_type::size_type       size_type;
363e519524SHoward Hinnant    typedef typename allocator_type::difference_type difference_type;
373e519524SHoward Hinnant
383e519524SHoward Hinnant    typedef implementation-defined                   iterator;
393e519524SHoward Hinnant    typedef implementation-defined                   const_iterator;
403e519524SHoward Hinnant    typedef std::reverse_iterator<iterator>          reverse_iterator;
413e519524SHoward Hinnant    typedef std::reverse_iterator<const_iterator>    const_reverse_iterator;
42b0386a51SErik Pilkington    typedef unspecified                              node_type;              // C++17
43b0386a51SErik Pilkington    typedef INSERT_RETURN_TYPE<iterator, node_type>  insert_return_type;     // C++17
443e519524SHoward Hinnant
453e519524SHoward Hinnant    class value_compare
463e519524SHoward Hinnant    {
473e519524SHoward Hinnant        friend class map;
483e519524SHoward Hinnant    protected:
493e519524SHoward Hinnant        key_compare comp;
503e519524SHoward Hinnant
513e519524SHoward Hinnant        value_compare(key_compare c);
523e519524SHoward Hinnant    public:
53dc066888SArthur O'Dwyer        typedef bool result_type;  // deprecated in C++17, removed in C++20
54dc066888SArthur O'Dwyer        typedef value_type first_argument_type;  // deprecated in C++17, removed in C++20
55dc066888SArthur O'Dwyer        typedef value_type second_argument_type;  // deprecated in C++17, removed in C++20
563e519524SHoward Hinnant        bool operator()(const value_type& x, const value_type& y) const;
573e519524SHoward Hinnant    };
583e519524SHoward Hinnant
593e519524SHoward Hinnant    // construct/copy/destroy:
601052ee39SHoward Hinnant    map()
611052ee39SHoward Hinnant        noexcept(
621052ee39SHoward Hinnant            is_nothrow_default_constructible<allocator_type>::value &&
631052ee39SHoward Hinnant            is_nothrow_default_constructible<key_compare>::value &&
641052ee39SHoward Hinnant            is_nothrow_copy_constructible<key_compare>::value);
653e519524SHoward Hinnant    explicit map(const key_compare& comp);
663e519524SHoward Hinnant    map(const key_compare& comp, const allocator_type& a);
673e519524SHoward Hinnant    template <class InputIterator>
683e519524SHoward Hinnant        map(InputIterator first, InputIterator last,
693e519524SHoward Hinnant            const key_compare& comp = key_compare());
703e519524SHoward Hinnant    template <class InputIterator>
713e519524SHoward Hinnant        map(InputIterator first, InputIterator last,
723e519524SHoward Hinnant            const key_compare& comp, const allocator_type& a);
733e519524SHoward Hinnant    map(const map& m);
741052ee39SHoward Hinnant    map(map&& m)
751052ee39SHoward Hinnant        noexcept(
761052ee39SHoward Hinnant            is_nothrow_move_constructible<allocator_type>::value &&
771052ee39SHoward Hinnant            is_nothrow_move_constructible<key_compare>::value);
783e519524SHoward Hinnant    explicit map(const allocator_type& a);
793e519524SHoward Hinnant    map(const map& m, const allocator_type& a);
803e519524SHoward Hinnant    map(map&& m, const allocator_type& a);
813e519524SHoward Hinnant    map(initializer_list<value_type> il, const key_compare& comp = key_compare());
823e519524SHoward Hinnant    map(initializer_list<value_type> il, const key_compare& comp, const allocator_type& a);
83fbc317d4SMarshall Clow    template <class InputIterator>
84fbc317d4SMarshall Clow        map(InputIterator first, InputIterator last, const allocator_type& a)
85fbc317d4SMarshall Clow            : map(first, last, Compare(), a) {}  // C++14
86fbc317d4SMarshall Clow    map(initializer_list<value_type> il, const allocator_type& a)
87fbc317d4SMarshall Clow        : map(il, Compare(), a) {}  // C++14
883e519524SHoward Hinnant   ~map();
893e519524SHoward Hinnant
903e519524SHoward Hinnant    map& operator=(const map& m);
911052ee39SHoward Hinnant    map& operator=(map&& m)
921052ee39SHoward Hinnant        noexcept(
931052ee39SHoward Hinnant            allocator_type::propagate_on_container_move_assignment::value &&
941052ee39SHoward Hinnant            is_nothrow_move_assignable<allocator_type>::value &&
950e9f71c1SHoward Hinnant            is_nothrow_move_assignable<key_compare>::value);
963e519524SHoward Hinnant    map& operator=(initializer_list<value_type> il);
973e519524SHoward Hinnant
983e519524SHoward Hinnant    // iterators:
990e9f71c1SHoward Hinnant          iterator begin() noexcept;
1000e9f71c1SHoward Hinnant    const_iterator begin() const noexcept;
1010e9f71c1SHoward Hinnant          iterator end() noexcept;
1020e9f71c1SHoward Hinnant    const_iterator end()   const noexcept;
1033e519524SHoward Hinnant
1040e9f71c1SHoward Hinnant          reverse_iterator rbegin() noexcept;
1050e9f71c1SHoward Hinnant    const_reverse_iterator rbegin() const noexcept;
1060e9f71c1SHoward Hinnant          reverse_iterator rend() noexcept;
1070e9f71c1SHoward Hinnant    const_reverse_iterator rend()   const noexcept;
1083e519524SHoward Hinnant
1090e9f71c1SHoward Hinnant    const_iterator         cbegin()  const noexcept;
1100e9f71c1SHoward Hinnant    const_iterator         cend()    const noexcept;
1110e9f71c1SHoward Hinnant    const_reverse_iterator crbegin() const noexcept;
1120e9f71c1SHoward Hinnant    const_reverse_iterator crend()   const noexcept;
1133e519524SHoward Hinnant
1143e519524SHoward Hinnant    // capacity:
1150e9f71c1SHoward Hinnant    bool      empty()    const noexcept;
1160e9f71c1SHoward Hinnant    size_type size()     const noexcept;
1170e9f71c1SHoward Hinnant    size_type max_size() const noexcept;
1183e519524SHoward Hinnant
1193e519524SHoward Hinnant    // element access:
1203e519524SHoward Hinnant    mapped_type& operator[](const key_type& k);
1213e519524SHoward Hinnant    mapped_type& operator[](key_type&& k);
1223e519524SHoward Hinnant
1233e519524SHoward Hinnant          mapped_type& at(const key_type& k);
1243e519524SHoward Hinnant    const mapped_type& at(const key_type& k) const;
1253e519524SHoward Hinnant
1263e519524SHoward Hinnant    // modifiers:
1273e519524SHoward Hinnant    template <class... Args>
1283e519524SHoward Hinnant        pair<iterator, bool> emplace(Args&&... args);
1293e519524SHoward Hinnant    template <class... Args>
1303e519524SHoward Hinnant        iterator emplace_hint(const_iterator position, Args&&... args);
1313e519524SHoward Hinnant    pair<iterator, bool> insert(const value_type& v);
132afc9ff99SMarshall Clow    pair<iterator, bool> insert(      value_type&& v);                                // C++17
1333e519524SHoward Hinnant    template <class P>
1343e519524SHoward Hinnant        pair<iterator, bool> insert(P&& p);
1353e519524SHoward Hinnant    iterator insert(const_iterator position, const value_type& v);
136afc9ff99SMarshall Clow    iterator insert(const_iterator position,       value_type&& v);                   // C++17
1373e519524SHoward Hinnant    template <class P>
1383e519524SHoward Hinnant        iterator insert(const_iterator position, P&& p);
1393e519524SHoward Hinnant    template <class InputIterator>
1403e519524SHoward Hinnant        void insert(InputIterator first, InputIterator last);
1413e519524SHoward Hinnant    void insert(initializer_list<value_type> il);
1423e519524SHoward Hinnant
143b0386a51SErik Pilkington    node_type extract(const_iterator position);                                       // C++17
144b0386a51SErik Pilkington    node_type extract(const key_type& x);                                             // C++17
145b0386a51SErik Pilkington    insert_return_type insert(node_type&& nh);                                        // C++17
146b0386a51SErik Pilkington    iterator insert(const_iterator hint, node_type&& nh);                             // C++17
147b0386a51SErik Pilkington
1488aaf517dSMarshall Clow    template <class... Args>
1498aaf517dSMarshall Clow        pair<iterator, bool> try_emplace(const key_type& k, Args&&... args);          // C++17
1508aaf517dSMarshall Clow    template <class... Args>
1518aaf517dSMarshall Clow        pair<iterator, bool> try_emplace(key_type&& k, Args&&... args);               // C++17
1528aaf517dSMarshall Clow    template <class... Args>
1538aaf517dSMarshall Clow        iterator try_emplace(const_iterator hint, const key_type& k, Args&&... args); // C++17
1548aaf517dSMarshall Clow    template <class... Args>
1558aaf517dSMarshall Clow        iterator try_emplace(const_iterator hint, key_type&& k, Args&&... args);      // C++17
1568aaf517dSMarshall Clow    template <class M>
1578aaf517dSMarshall Clow        pair<iterator, bool> insert_or_assign(const key_type& k, M&& obj);            // C++17
1588aaf517dSMarshall Clow    template <class M>
1598aaf517dSMarshall Clow        pair<iterator, bool> insert_or_assign(key_type&& k, M&& obj);                 // C++17
1608aaf517dSMarshall Clow    template <class M>
1618aaf517dSMarshall Clow        iterator insert_or_assign(const_iterator hint, const key_type& k, M&& obj);   // C++17
1628aaf517dSMarshall Clow    template <class M>
1638aaf517dSMarshall Clow        iterator insert_or_assign(const_iterator hint, key_type&& k, M&& obj);        // C++17
1648aaf517dSMarshall Clow
1653e519524SHoward Hinnant    iterator  erase(const_iterator position);
166ec392968SMarshall Clow    iterator  erase(iterator position); // C++14
1673e519524SHoward Hinnant    size_type erase(const key_type& k);
1683e519524SHoward Hinnant    iterator  erase(const_iterator first, const_iterator last);
1690e9f71c1SHoward Hinnant    void clear() noexcept;
1703e519524SHoward Hinnant
1715c4e07aeSErik Pilkington    template<class C2>
1725c4e07aeSErik Pilkington      void merge(map<Key, T, C2, Allocator>& source);         // C++17
1735c4e07aeSErik Pilkington    template<class C2>
1745c4e07aeSErik Pilkington      void merge(map<Key, T, C2, Allocator>&& source);        // C++17
1755c4e07aeSErik Pilkington    template<class C2>
1765c4e07aeSErik Pilkington      void merge(multimap<Key, T, C2, Allocator>& source);    // C++17
1775c4e07aeSErik Pilkington    template<class C2>
1785c4e07aeSErik Pilkington      void merge(multimap<Key, T, C2, Allocator>&& source);   // C++17
1795c4e07aeSErik Pilkington
1801052ee39SHoward Hinnant    void swap(map& m)
181e3fbe143SMarshall Clow        noexcept(allocator_traits<allocator_type>::is_always_equal::value &&
182f07dd8d0SEric Fiselier            is_nothrow_swappable<key_compare>::value); // C++17
1833e519524SHoward Hinnant
1843e519524SHoward Hinnant    // observers:
1850e9f71c1SHoward Hinnant    allocator_type get_allocator() const noexcept;
1863e519524SHoward Hinnant    key_compare    key_comp()      const;
1873e519524SHoward Hinnant    value_compare  value_comp()    const;
1883e519524SHoward Hinnant
1893e519524SHoward Hinnant    // map operations:
1903e519524SHoward Hinnant          iterator find(const key_type& k);
1913e519524SHoward Hinnant    const_iterator find(const key_type& k) const;
1922585835cSMarshall Clow    template<typename K>
1932585835cSMarshall Clow        iterator find(const K& x);              // C++14
1942585835cSMarshall Clow    template<typename K>
1952585835cSMarshall Clow        const_iterator find(const K& x) const;  // C++14
1963fca07d7SMarek Kurdej
1972585835cSMarshall Clow    template<typename K>
1980aacbc92SMarshall Clow      size_type count(const K& x) const;        // C++14
1993e519524SHoward Hinnant    size_type      count(const key_type& k) const;
2003fca07d7SMarek Kurdej
201a17b1aedSZoe Carver    bool           contains(const key_type& x) const;  // C++20
2023fca07d7SMarek Kurdej    template<class K> bool contains(const K& x) const; // C++20
2033fca07d7SMarek Kurdej
2043e519524SHoward Hinnant          iterator lower_bound(const key_type& k);
2053e519524SHoward Hinnant    const_iterator lower_bound(const key_type& k) const;
2062585835cSMarshall Clow    template<typename K>
2072585835cSMarshall Clow        iterator lower_bound(const K& x);              // C++14
2082585835cSMarshall Clow    template<typename K>
2092585835cSMarshall Clow        const_iterator lower_bound(const K& x) const;  // C++14
2102585835cSMarshall Clow
2113e519524SHoward Hinnant          iterator upper_bound(const key_type& k);
2123e519524SHoward Hinnant    const_iterator upper_bound(const key_type& k) const;
2132585835cSMarshall Clow    template<typename K>
2142585835cSMarshall Clow        iterator upper_bound(const K& x);              // C++14
2152585835cSMarshall Clow    template<typename K>
2162585835cSMarshall Clow        const_iterator upper_bound(const K& x) const;  // C++14
2172585835cSMarshall Clow
2183e519524SHoward Hinnant    pair<iterator,iterator>             equal_range(const key_type& k);
2193e519524SHoward Hinnant    pair<const_iterator,const_iterator> equal_range(const key_type& k) const;
2202585835cSMarshall Clow    template<typename K>
2212585835cSMarshall Clow        pair<iterator,iterator>             equal_range(const K& x);        // C++14
2222585835cSMarshall Clow    template<typename K>
2232585835cSMarshall Clow        pair<const_iterator,const_iterator> equal_range(const K& x) const;  // C++14
2243e519524SHoward Hinnant};
2253e519524SHoward Hinnant
2263e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator>
2273e519524SHoward Hinnantbool
2283e519524SHoward Hinnantoperator==(const map<Key, T, Compare, Allocator>& x,
2293e519524SHoward Hinnant           const map<Key, T, Compare, Allocator>& y);
2303e519524SHoward Hinnant
2313e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator>
2323e519524SHoward Hinnantbool
2333e519524SHoward Hinnantoperator< (const map<Key, T, Compare, Allocator>& x,
2343e519524SHoward Hinnant           const map<Key, T, Compare, Allocator>& y);
2353e519524SHoward Hinnant
2363e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator>
2373e519524SHoward Hinnantbool
2383e519524SHoward Hinnantoperator!=(const map<Key, T, Compare, Allocator>& x,
2393e519524SHoward Hinnant           const map<Key, T, Compare, Allocator>& y);
2403e519524SHoward Hinnant
2413e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator>
2423e519524SHoward Hinnantbool
2433e519524SHoward Hinnantoperator> (const map<Key, T, Compare, Allocator>& x,
2443e519524SHoward Hinnant           const map<Key, T, Compare, Allocator>& y);
2453e519524SHoward Hinnant
2463e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator>
2473e519524SHoward Hinnantbool
2483e519524SHoward Hinnantoperator>=(const map<Key, T, Compare, Allocator>& x,
2493e519524SHoward Hinnant           const map<Key, T, Compare, Allocator>& y);
2503e519524SHoward Hinnant
2513e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator>
2523e519524SHoward Hinnantbool
2533e519524SHoward Hinnantoperator<=(const map<Key, T, Compare, Allocator>& x,
2543e519524SHoward Hinnant           const map<Key, T, Compare, Allocator>& y);
2553e519524SHoward Hinnant
2563e519524SHoward Hinnant// specialized algorithms:
2573e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator>
2583e519524SHoward Hinnantvoid
2591052ee39SHoward Hinnantswap(map<Key, T, Compare, Allocator>& x, map<Key, T, Compare, Allocator>& y)
2601052ee39SHoward Hinnant    noexcept(noexcept(x.swap(y)));
2613e519524SHoward Hinnant
262f60c63c0SMarshall Clowtemplate <class Key, class T, class Compare, class Allocator, class Predicate>
2633e895085SMarek Kurdejtypename map<Key, T, Compare, Allocator>::size_type
2643e895085SMarek Kurdejerase_if(map<Key, T, Compare, Allocator>& c, Predicate pred);  // C++20
265f60c63c0SMarshall Clow
266f60c63c0SMarshall Clow
2673e519524SHoward Hinnanttemplate <class Key, class T, class Compare = less<Key>,
2683e519524SHoward Hinnant          class Allocator = allocator<pair<const Key, T>>>
2693e519524SHoward Hinnantclass multimap
2703e519524SHoward Hinnant{
2713e519524SHoward Hinnantpublic:
2723e519524SHoward Hinnant    // types:
2733e519524SHoward Hinnant    typedef Key                                      key_type;
2743e519524SHoward Hinnant    typedef T                                        mapped_type;
2753e519524SHoward Hinnant    typedef pair<const key_type,mapped_type>         value_type;
2763e519524SHoward Hinnant    typedef Compare                                  key_compare;
2773e519524SHoward Hinnant    typedef Allocator                                allocator_type;
2783e519524SHoward Hinnant    typedef typename allocator_type::reference       reference;
2793e519524SHoward Hinnant    typedef typename allocator_type::const_reference const_reference;
2803e519524SHoward Hinnant    typedef typename allocator_type::size_type       size_type;
2813e519524SHoward Hinnant    typedef typename allocator_type::difference_type difference_type;
2823e519524SHoward Hinnant    typedef typename allocator_type::pointer         pointer;
2833e519524SHoward Hinnant    typedef typename allocator_type::const_pointer   const_pointer;
2843e519524SHoward Hinnant
2853e519524SHoward Hinnant    typedef implementation-defined                   iterator;
2863e519524SHoward Hinnant    typedef implementation-defined                   const_iterator;
2873e519524SHoward Hinnant    typedef std::reverse_iterator<iterator>          reverse_iterator;
2883e519524SHoward Hinnant    typedef std::reverse_iterator<const_iterator>    const_reverse_iterator;
289b0386a51SErik Pilkington    typedef unspecified                              node_type;              // C++17
2903e519524SHoward Hinnant
2913e519524SHoward Hinnant    class value_compare
2923e519524SHoward Hinnant    {
2933e519524SHoward Hinnant        friend class multimap;
2943e519524SHoward Hinnant    protected:
2953e519524SHoward Hinnant        key_compare comp;
2963e519524SHoward Hinnant        value_compare(key_compare c);
2973e519524SHoward Hinnant    public:
298dc066888SArthur O'Dwyer        typedef bool result_type;  // deprecated in C++17, removed in C++20
299dc066888SArthur O'Dwyer        typedef value_type first_argument_type;  // deprecated in C++17, removed in C++20
300dc066888SArthur O'Dwyer        typedef value_type second_argument_type;  // deprecated in C++17, removed in C++20
3013e519524SHoward Hinnant        bool operator()(const value_type& x, const value_type& y) const;
3023e519524SHoward Hinnant    };
3033e519524SHoward Hinnant
3043e519524SHoward Hinnant    // construct/copy/destroy:
3051052ee39SHoward Hinnant    multimap()
3061052ee39SHoward Hinnant        noexcept(
3071052ee39SHoward Hinnant            is_nothrow_default_constructible<allocator_type>::value &&
3081052ee39SHoward Hinnant            is_nothrow_default_constructible<key_compare>::value &&
3091052ee39SHoward Hinnant            is_nothrow_copy_constructible<key_compare>::value);
3101052ee39SHoward Hinnant    explicit multimap(const key_compare& comp);
3113e519524SHoward Hinnant    multimap(const key_compare& comp, const allocator_type& a);
3123e519524SHoward Hinnant    template <class InputIterator>
3133e519524SHoward Hinnant        multimap(InputIterator first, InputIterator last, const key_compare& comp);
3143e519524SHoward Hinnant    template <class InputIterator>
3153e519524SHoward Hinnant        multimap(InputIterator first, InputIterator last, const key_compare& comp,
3163e519524SHoward Hinnant                 const allocator_type& a);
3173e519524SHoward Hinnant    multimap(const multimap& m);
3181052ee39SHoward Hinnant    multimap(multimap&& m)
3191052ee39SHoward Hinnant        noexcept(
3201052ee39SHoward Hinnant            is_nothrow_move_constructible<allocator_type>::value &&
3211052ee39SHoward Hinnant            is_nothrow_move_constructible<key_compare>::value);
3223e519524SHoward Hinnant    explicit multimap(const allocator_type& a);
3233e519524SHoward Hinnant    multimap(const multimap& m, const allocator_type& a);
3243e519524SHoward Hinnant    multimap(multimap&& m, const allocator_type& a);
3253e519524SHoward Hinnant    multimap(initializer_list<value_type> il, const key_compare& comp = key_compare());
3263e519524SHoward Hinnant    multimap(initializer_list<value_type> il, const key_compare& comp,
3273e519524SHoward Hinnant             const allocator_type& a);
328fbc317d4SMarshall Clow    template <class InputIterator>
329fbc317d4SMarshall Clow        multimap(InputIterator first, InputIterator last, const allocator_type& a)
330fbc317d4SMarshall Clow            : multimap(first, last, Compare(), a) {} // C++14
331fbc317d4SMarshall Clow    multimap(initializer_list<value_type> il, const allocator_type& a)
332fbc317d4SMarshall Clow        : multimap(il, Compare(), a) {} // C++14
3333e519524SHoward Hinnant    ~multimap();
3343e519524SHoward Hinnant
3353e519524SHoward Hinnant    multimap& operator=(const multimap& m);
3361052ee39SHoward Hinnant    multimap& operator=(multimap&& m)
3371052ee39SHoward Hinnant        noexcept(
3381052ee39SHoward Hinnant            allocator_type::propagate_on_container_move_assignment::value &&
3391052ee39SHoward Hinnant            is_nothrow_move_assignable<allocator_type>::value &&
3400e9f71c1SHoward Hinnant            is_nothrow_move_assignable<key_compare>::value);
3413e519524SHoward Hinnant    multimap& operator=(initializer_list<value_type> il);
3423e519524SHoward Hinnant
3433e519524SHoward Hinnant    // iterators:
3440e9f71c1SHoward Hinnant          iterator begin() noexcept;
3450e9f71c1SHoward Hinnant    const_iterator begin() const noexcept;
3460e9f71c1SHoward Hinnant          iterator end() noexcept;
3470e9f71c1SHoward Hinnant    const_iterator end()   const noexcept;
3483e519524SHoward Hinnant
3490e9f71c1SHoward Hinnant          reverse_iterator rbegin() noexcept;
3500e9f71c1SHoward Hinnant    const_reverse_iterator rbegin() const noexcept;
3510e9f71c1SHoward Hinnant          reverse_iterator rend() noexcept;
3520e9f71c1SHoward Hinnant    const_reverse_iterator rend()   const noexcept;
3533e519524SHoward Hinnant
3540e9f71c1SHoward Hinnant    const_iterator         cbegin()  const noexcept;
3550e9f71c1SHoward Hinnant    const_iterator         cend()    const noexcept;
3560e9f71c1SHoward Hinnant    const_reverse_iterator crbegin() const noexcept;
3570e9f71c1SHoward Hinnant    const_reverse_iterator crend()   const noexcept;
3583e519524SHoward Hinnant
3593e519524SHoward Hinnant    // capacity:
3600e9f71c1SHoward Hinnant    bool      empty()    const noexcept;
3610e9f71c1SHoward Hinnant    size_type size()     const noexcept;
3620e9f71c1SHoward Hinnant    size_type max_size() const noexcept;
3633e519524SHoward Hinnant
3643e519524SHoward Hinnant    // modifiers:
3653e519524SHoward Hinnant    template <class... Args>
3663e519524SHoward Hinnant        iterator emplace(Args&&... args);
3673e519524SHoward Hinnant    template <class... Args>
3683e519524SHoward Hinnant        iterator emplace_hint(const_iterator position, Args&&... args);
3693e519524SHoward Hinnant    iterator insert(const value_type& v);
370afc9ff99SMarshall Clow    iterator insert(      value_type&& v);                                            // C++17
3713e519524SHoward Hinnant    template <class P>
3723e519524SHoward Hinnant        iterator insert(P&& p);
3733e519524SHoward Hinnant    iterator insert(const_iterator position, const value_type& v);
374afc9ff99SMarshall Clow    iterator insert(const_iterator position,       value_type&& v);                   // C++17
3753e519524SHoward Hinnant    template <class P>
3763e519524SHoward Hinnant        iterator insert(const_iterator position, P&& p);
3773e519524SHoward Hinnant    template <class InputIterator>
3783e519524SHoward Hinnant        void insert(InputIterator first, InputIterator last);
3793e519524SHoward Hinnant    void insert(initializer_list<value_type> il);
3803e519524SHoward Hinnant
381b0386a51SErik Pilkington    node_type extract(const_iterator position);                                       // C++17
382b0386a51SErik Pilkington    node_type extract(const key_type& x);                                             // C++17
383b0386a51SErik Pilkington    iterator insert(node_type&& nh);                                                  // C++17
384b0386a51SErik Pilkington    iterator insert(const_iterator hint, node_type&& nh);                             // C++17
385b0386a51SErik Pilkington
3863e519524SHoward Hinnant    iterator  erase(const_iterator position);
387ec392968SMarshall Clow    iterator  erase(iterator position); // C++14
3883e519524SHoward Hinnant    size_type erase(const key_type& k);
3893e519524SHoward Hinnant    iterator  erase(const_iterator first, const_iterator last);
3900e9f71c1SHoward Hinnant    void clear() noexcept;
3913e519524SHoward Hinnant
3925c4e07aeSErik Pilkington    template<class C2>
3935c4e07aeSErik Pilkington      void merge(multimap<Key, T, C2, Allocator>& source);    // C++17
3945c4e07aeSErik Pilkington    template<class C2>
3955c4e07aeSErik Pilkington      void merge(multimap<Key, T, C2, Allocator>&& source);   // C++17
3965c4e07aeSErik Pilkington    template<class C2>
3975c4e07aeSErik Pilkington      void merge(map<Key, T, C2, Allocator>& source);         // C++17
3985c4e07aeSErik Pilkington    template<class C2>
3995c4e07aeSErik Pilkington      void merge(map<Key, T, C2, Allocator>&& source);        // C++17
4005c4e07aeSErik Pilkington
4011052ee39SHoward Hinnant    void swap(multimap& m)
402e3fbe143SMarshall Clow        noexcept(allocator_traits<allocator_type>::is_always_equal::value &&
403f07dd8d0SEric Fiselier            is_nothrow_swappable<key_compare>::value); // C++17
4043e519524SHoward Hinnant
4053e519524SHoward Hinnant    // observers:
4060e9f71c1SHoward Hinnant    allocator_type get_allocator() const noexcept;
4073e519524SHoward Hinnant    key_compare    key_comp()      const;
4083e519524SHoward Hinnant    value_compare  value_comp()    const;
4093e519524SHoward Hinnant
4103e519524SHoward Hinnant    // map operations:
4113e519524SHoward Hinnant          iterator find(const key_type& k);
4123e519524SHoward Hinnant    const_iterator find(const key_type& k) const;
4132585835cSMarshall Clow    template<typename K>
4142585835cSMarshall Clow        iterator find(const K& x);              // C++14
4152585835cSMarshall Clow    template<typename K>
4162585835cSMarshall Clow        const_iterator find(const K& x) const;  // C++14
4173fca07d7SMarek Kurdej
4182585835cSMarshall Clow    template<typename K>
4190aacbc92SMarshall Clow      size_type count(const K& x) const;        // C++14
4203e519524SHoward Hinnant    size_type      count(const key_type& k) const;
4213fca07d7SMarek Kurdej
422a17b1aedSZoe Carver    bool           contains(const key_type& x) const;  // C++20
4233fca07d7SMarek Kurdej    template<class K> bool contains(const K& x) const; // C++20
4243fca07d7SMarek Kurdej
4253e519524SHoward Hinnant          iterator lower_bound(const key_type& k);
4263e519524SHoward Hinnant    const_iterator lower_bound(const key_type& k) const;
4272585835cSMarshall Clow    template<typename K>
4282585835cSMarshall Clow        iterator lower_bound(const K& x);              // C++14
4292585835cSMarshall Clow    template<typename K>
4302585835cSMarshall Clow        const_iterator lower_bound(const K& x) const;  // C++14
4312585835cSMarshall Clow
4323e519524SHoward Hinnant          iterator upper_bound(const key_type& k);
4333e519524SHoward Hinnant    const_iterator upper_bound(const key_type& k) const;
4342585835cSMarshall Clow    template<typename K>
4352585835cSMarshall Clow        iterator upper_bound(const K& x);              // C++14
4362585835cSMarshall Clow    template<typename K>
4372585835cSMarshall Clow        const_iterator upper_bound(const K& x) const;  // C++14
4382585835cSMarshall Clow
4393e519524SHoward Hinnant    pair<iterator,iterator>             equal_range(const key_type& k);
4403e519524SHoward Hinnant    pair<const_iterator,const_iterator> equal_range(const key_type& k) const;
4412585835cSMarshall Clow    template<typename K>
4422585835cSMarshall Clow        pair<iterator,iterator>             equal_range(const K& x);        // C++14
4432585835cSMarshall Clow    template<typename K>
4442585835cSMarshall Clow        pair<const_iterator,const_iterator> equal_range(const K& x) const;  // C++14
4453e519524SHoward Hinnant};
4463e519524SHoward Hinnant
4473e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator>
4483e519524SHoward Hinnantbool
4493e519524SHoward Hinnantoperator==(const multimap<Key, T, Compare, Allocator>& x,
4503e519524SHoward Hinnant           const multimap<Key, T, Compare, Allocator>& y);
4513e519524SHoward Hinnant
4523e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator>
4533e519524SHoward Hinnantbool
4543e519524SHoward Hinnantoperator< (const multimap<Key, T, Compare, Allocator>& x,
4553e519524SHoward Hinnant           const multimap<Key, T, Compare, Allocator>& y);
4563e519524SHoward Hinnant
4573e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator>
4583e519524SHoward Hinnantbool
4593e519524SHoward Hinnantoperator!=(const multimap<Key, T, Compare, Allocator>& x,
4603e519524SHoward Hinnant           const multimap<Key, T, Compare, Allocator>& y);
4613e519524SHoward Hinnant
4623e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator>
4633e519524SHoward Hinnantbool
4643e519524SHoward Hinnantoperator> (const multimap<Key, T, Compare, Allocator>& x,
4653e519524SHoward Hinnant           const multimap<Key, T, Compare, Allocator>& y);
4663e519524SHoward Hinnant
4673e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator>
4683e519524SHoward Hinnantbool
4693e519524SHoward Hinnantoperator>=(const multimap<Key, T, Compare, Allocator>& x,
4703e519524SHoward Hinnant           const multimap<Key, T, Compare, Allocator>& y);
4713e519524SHoward Hinnant
4723e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator>
4733e519524SHoward Hinnantbool
4743e519524SHoward Hinnantoperator<=(const multimap<Key, T, Compare, Allocator>& x,
4753e519524SHoward Hinnant           const multimap<Key, T, Compare, Allocator>& y);
4763e519524SHoward Hinnant
4773e519524SHoward Hinnant// specialized algorithms:
4783e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator>
4793e519524SHoward Hinnantvoid
4803e519524SHoward Hinnantswap(multimap<Key, T, Compare, Allocator>& x,
4811052ee39SHoward Hinnant     multimap<Key, T, Compare, Allocator>& y)
4821052ee39SHoward Hinnant    noexcept(noexcept(x.swap(y)));
4833e519524SHoward Hinnant
484f60c63c0SMarshall Clowtemplate <class Key, class T, class Compare, class Allocator, class Predicate>
4853e895085SMarek Kurdejtypename multimap<Key, T, Compare, Allocator>::size_type
4863e895085SMarek Kurdejerase_if(multimap<Key, T, Compare, Allocator>& c, Predicate pred);  // C++20
487f60c63c0SMarshall Clow
4883e519524SHoward Hinnant}  // std
4893e519524SHoward Hinnant
4903e519524SHoward Hinnant*/
4913e519524SHoward Hinnant
4923e519524SHoward Hinnant#include <__config>
49306b40e80SArthur O'Dwyer#include <__debug>
494050b064fSChristopher Di Bella#include <__functional/is_transparent.h>
495b0386a51SErik Pilkington#include <__node_handle>
49606b40e80SArthur O'Dwyer#include <__tree>
4976adbc83eSChristopher Di Bella#include <__utility/forward.h>
4982d0f1fa4SArthur O'Dwyer#include <compare>
499bfbd73f8SArthur O'Dwyer#include <functional>
5002d0f1fa4SArthur O'Dwyer#include <initializer_list>
5012ac6babcSArthur O'Dwyer#include <iterator> // __libcpp_erase_if_container
5023e519524SHoward Hinnant#include <memory>
503ee187e24SEric Fiselier#include <type_traits>
504bfbd73f8SArthur O'Dwyer#include <utility>
505f56972e2SMarshall Clow#include <version>
5063e519524SHoward Hinnant
507073458b1SHoward Hinnant#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
5083e519524SHoward Hinnant#pragma GCC system_header
509073458b1SHoward Hinnant#endif
5103e519524SHoward Hinnant
5113e519524SHoward Hinnant_LIBCPP_BEGIN_NAMESPACE_STD
5123e519524SHoward Hinnant
5133560fbf3SLouis Dionnetemplate <class _Key, class _CP, class _Compare,
5143560fbf3SLouis Dionne          bool = is_empty<_Compare>::value && !__libcpp_is_final<_Compare>::value>
5153e519524SHoward Hinnantclass __map_value_compare
5163e519524SHoward Hinnant    : private _Compare
5173e519524SHoward Hinnant{
5183e519524SHoward Hinnantpublic:
519848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
5201052ee39SHoward Hinnant    __map_value_compare()
5211052ee39SHoward Hinnant        _NOEXCEPT_(is_nothrow_default_constructible<_Compare>::value)
5221052ee39SHoward Hinnant        : _Compare() {}
523848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
5241052ee39SHoward Hinnant    __map_value_compare(_Compare c)
5251052ee39SHoward Hinnant        _NOEXCEPT_(is_nothrow_copy_constructible<_Compare>::value)
5261052ee39SHoward Hinnant        : _Compare(c) {}
527848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
5281052ee39SHoward Hinnant    const _Compare& key_comp() const _NOEXCEPT {return *this;}
529848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
5303e519524SHoward Hinnant    bool operator()(const _CP& __x, const _CP& __y) const
531f52318b4SErik Pilkington        {return static_cast<const _Compare&>(*this)(__x.__get_value().first, __y.__get_value().first);}
532848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
5333e519524SHoward Hinnant    bool operator()(const _CP& __x, const _Key& __y) const
534f52318b4SErik Pilkington        {return static_cast<const _Compare&>(*this)(__x.__get_value().first, __y);}
535848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
5363e519524SHoward Hinnant    bool operator()(const _Key& __x, const _CP& __y) const
537f52318b4SErik Pilkington        {return static_cast<const _Compare&>(*this)(__x, __y.__get_value().first);}
538e3fbe143SMarshall Clow    void swap(__map_value_compare& __y)
539e3fbe143SMarshall Clow        _NOEXCEPT_(__is_nothrow_swappable<_Compare>::value)
540e3fbe143SMarshall Clow    {
541e3fbe143SMarshall Clow      using _VSTD::swap;
542e1ec2986SEric Fiselier      swap(static_cast<_Compare&>(*this), static_cast<_Compare&>(__y));
543e3fbe143SMarshall Clow    }
5442585835cSMarshall Clow
5452585835cSMarshall Clow#if _LIBCPP_STD_VER > 11
5462585835cSMarshall Clow    template <typename _K2>
5472585835cSMarshall Clow    _LIBCPP_INLINE_VISIBILITY
5482585835cSMarshall Clow    typename enable_if<__is_transparent<_Compare, _K2>::value, bool>::type
5492585835cSMarshall Clow    operator () ( const _K2& __x, const _CP& __y ) const
550f52318b4SErik Pilkington        {return static_cast<const _Compare&>(*this) (__x, __y.__get_value().first);}
5512585835cSMarshall Clow
5522585835cSMarshall Clow    template <typename _K2>
5532585835cSMarshall Clow    _LIBCPP_INLINE_VISIBILITY
5542585835cSMarshall Clow    typename enable_if<__is_transparent<_Compare, _K2>::value, bool>::type
5552585835cSMarshall Clow    operator () (const _CP& __x, const _K2& __y) const
556f52318b4SErik Pilkington        {return static_cast<const _Compare&>(*this) (__x.__get_value().first, __y);}
5572585835cSMarshall Clow#endif
5583e519524SHoward Hinnant};
5593e519524SHoward Hinnant
560abb160e6SHoward Hinnanttemplate <class _Key, class _CP, class _Compare>
561abb160e6SHoward Hinnantclass __map_value_compare<_Key, _CP, _Compare, false>
5623e519524SHoward Hinnant{
5633e519524SHoward Hinnant    _Compare comp;
5643e519524SHoward Hinnant
5653e519524SHoward Hinnantpublic:
566848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
5671052ee39SHoward Hinnant    __map_value_compare()
5681052ee39SHoward Hinnant        _NOEXCEPT_(is_nothrow_default_constructible<_Compare>::value)
5691052ee39SHoward Hinnant        : comp() {}
570848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
5711052ee39SHoward Hinnant    __map_value_compare(_Compare c)
5721052ee39SHoward Hinnant        _NOEXCEPT_(is_nothrow_copy_constructible<_Compare>::value)
5731052ee39SHoward Hinnant        : comp(c) {}
574848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
5751052ee39SHoward Hinnant    const _Compare& key_comp() const _NOEXCEPT {return comp;}
5763e519524SHoward Hinnant
577848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
5783e519524SHoward Hinnant    bool operator()(const _CP& __x, const _CP& __y) const
579f52318b4SErik Pilkington        {return comp(__x.__get_value().first, __y.__get_value().first);}
580848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
5813e519524SHoward Hinnant    bool operator()(const _CP& __x, const _Key& __y) const
582f52318b4SErik Pilkington        {return comp(__x.__get_value().first, __y);}
583848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
5843e519524SHoward Hinnant    bool operator()(const _Key& __x, const _CP& __y) const
585f52318b4SErik Pilkington        {return comp(__x, __y.__get_value().first);}
586e3fbe143SMarshall Clow    void swap(__map_value_compare& __y)
587e3fbe143SMarshall Clow        _NOEXCEPT_(__is_nothrow_swappable<_Compare>::value)
588e3fbe143SMarshall Clow    {
589e3fbe143SMarshall Clow        using _VSTD::swap;
590e3fbe143SMarshall Clow        swap(comp, __y.comp);
591e3fbe143SMarshall Clow    }
5922585835cSMarshall Clow
5932585835cSMarshall Clow#if _LIBCPP_STD_VER > 11
5942585835cSMarshall Clow    template <typename _K2>
5952585835cSMarshall Clow    _LIBCPP_INLINE_VISIBILITY
5962585835cSMarshall Clow    typename enable_if<__is_transparent<_Compare, _K2>::value, bool>::type
5972585835cSMarshall Clow    operator () ( const _K2& __x, const _CP& __y ) const
598f52318b4SErik Pilkington        {return comp (__x, __y.__get_value().first);}
5992585835cSMarshall Clow
6002585835cSMarshall Clow    template <typename _K2>
6012585835cSMarshall Clow    _LIBCPP_INLINE_VISIBILITY
6022585835cSMarshall Clow    typename enable_if<__is_transparent<_Compare, _K2>::value, bool>::type
6032585835cSMarshall Clow    operator () (const _CP& __x, const _K2& __y) const
604f52318b4SErik Pilkington        {return comp (__x.__get_value().first, __y);}
6052585835cSMarshall Clow#endif
6063e519524SHoward Hinnant};
6073e519524SHoward Hinnant
608e3fbe143SMarshall Clowtemplate <class _Key, class _CP, class _Compare, bool __b>
609e3fbe143SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY
610e3fbe143SMarshall Clowvoid
611e3fbe143SMarshall Clowswap(__map_value_compare<_Key, _CP, _Compare, __b>& __x,
612e3fbe143SMarshall Clow     __map_value_compare<_Key, _CP, _Compare, __b>& __y)
613e3fbe143SMarshall Clow    _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
614e3fbe143SMarshall Clow{
615e3fbe143SMarshall Clow    __x.swap(__y);
616e3fbe143SMarshall Clow}
617e3fbe143SMarshall Clow
6183e519524SHoward Hinnanttemplate <class _Allocator>
6193e519524SHoward Hinnantclass __map_node_destructor
6203e519524SHoward Hinnant{
6213e519524SHoward Hinnant    typedef _Allocator                          allocator_type;
6223e519524SHoward Hinnant    typedef allocator_traits<allocator_type>    __alloc_traits;
623089a7cc5SEric Fiselier
6243e519524SHoward Hinnantpublic:
6253e519524SHoward Hinnant    typedef typename __alloc_traits::pointer    pointer;
6263e519524SHoward Hinnant
627089a7cc5SEric Fiselierprivate:
6283e519524SHoward Hinnant    allocator_type& __na_;
6293e519524SHoward Hinnant
6303e519524SHoward Hinnant    __map_node_destructor& operator=(const __map_node_destructor&);
6313e519524SHoward Hinnant
6323e519524SHoward Hinnantpublic:
6333e519524SHoward Hinnant    bool __first_constructed;
6343e519524SHoward Hinnant    bool __second_constructed;
6353e519524SHoward Hinnant
636848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
6371052ee39SHoward Hinnant    explicit __map_node_destructor(allocator_type& __na) _NOEXCEPT
6383e519524SHoward Hinnant        : __na_(__na),
6393e519524SHoward Hinnant          __first_constructed(false),
6403e519524SHoward Hinnant          __second_constructed(false)
6413e519524SHoward Hinnant        {}
6423e519524SHoward Hinnant
64318293116SEric Fiselier#ifndef _LIBCPP_CXX03_LANG
644848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
6451052ee39SHoward Hinnant    __map_node_destructor(__tree_node_destructor<allocator_type>&& __x) _NOEXCEPT
6463e519524SHoward Hinnant        : __na_(__x.__na_),
6473e519524SHoward Hinnant          __first_constructed(__x.__value_constructed),
6483e519524SHoward Hinnant          __second_constructed(__x.__value_constructed)
6493e519524SHoward Hinnant        {
6503e519524SHoward Hinnant            __x.__value_constructed = false;
6513e519524SHoward Hinnant        }
65218293116SEric Fiselier#endif // _LIBCPP_CXX03_LANG
6533e519524SHoward Hinnant
654848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
6551052ee39SHoward Hinnant    void operator()(pointer __p) _NOEXCEPT
6563e519524SHoward Hinnant    {
6573e519524SHoward Hinnant        if (__second_constructed)
658f52318b4SErik Pilkington            __alloc_traits::destroy(__na_, _VSTD::addressof(__p->__value_.__get_value().second));
6593e519524SHoward Hinnant        if (__first_constructed)
660f52318b4SErik Pilkington            __alloc_traits::destroy(__na_, _VSTD::addressof(__p->__value_.__get_value().first));
6613e519524SHoward Hinnant        if (__p)
6623e519524SHoward Hinnant            __alloc_traits::deallocate(__na_, __p, 1);
6633e519524SHoward Hinnant    }
6643e519524SHoward Hinnant};
6653e519524SHoward Hinnant
666ce53420eSHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator>
667ce53420eSHoward Hinnant    class map;
668ce53420eSHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator>
669ce53420eSHoward Hinnant    class multimap;
670ce53420eSHoward Hinnanttemplate <class _TreeIterator> class __map_const_iterator;
6713e519524SHoward Hinnant
672089a7cc5SEric Fiselier#ifndef _LIBCPP_CXX03_LANG
6739fd9f84fSHoward Hinnant
6749fd9f84fSHoward Hinnanttemplate <class _Key, class _Tp>
6757c2f5827SAmy Huangstruct _LIBCPP_STANDALONE_DEBUG __value_type
6769fd9f84fSHoward Hinnant{
6779fd9f84fSHoward Hinnant    typedef _Key                                     key_type;
6789fd9f84fSHoward Hinnant    typedef _Tp                                      mapped_type;
6799fd9f84fSHoward Hinnant    typedef pair<const key_type, mapped_type>        value_type;
680f52318b4SErik Pilkington    typedef pair<key_type&, mapped_type&>            __nc_ref_pair_type;
681f52318b4SErik Pilkington    typedef pair<key_type&&, mapped_type&&>          __nc_rref_pair_type;
6829fd9f84fSHoward Hinnant
683f52318b4SErik Pilkingtonprivate:
6849fd9f84fSHoward Hinnant    value_type __cc;
685f52318b4SErik Pilkington
686f52318b4SErik Pilkingtonpublic:
687f52318b4SErik Pilkington    _LIBCPP_INLINE_VISIBILITY
688f52318b4SErik Pilkington    value_type& __get_value()
689f52318b4SErik Pilkington    {
690f52318b4SErik Pilkington#if _LIBCPP_STD_VER > 14
691f52318b4SErik Pilkington        return *_VSTD::launder(_VSTD::addressof(__cc));
692f52318b4SErik Pilkington#else
693f52318b4SErik Pilkington        return __cc;
694f52318b4SErik Pilkington#endif
695f52318b4SErik Pilkington    }
696f52318b4SErik Pilkington
697f52318b4SErik Pilkington    _LIBCPP_INLINE_VISIBILITY
698f52318b4SErik Pilkington    const value_type& __get_value() const
699f52318b4SErik Pilkington    {
700f52318b4SErik Pilkington#if _LIBCPP_STD_VER > 14
701f52318b4SErik Pilkington        return *_VSTD::launder(_VSTD::addressof(__cc));
702f52318b4SErik Pilkington#else
703f52318b4SErik Pilkington        return __cc;
704f52318b4SErik Pilkington#endif
705f52318b4SErik Pilkington    }
706f52318b4SErik Pilkington
707f52318b4SErik Pilkington    _LIBCPP_INLINE_VISIBILITY
708f52318b4SErik Pilkington    __nc_ref_pair_type __ref()
709f52318b4SErik Pilkington    {
710f52318b4SErik Pilkington        value_type& __v = __get_value();
711f52318b4SErik Pilkington        return __nc_ref_pair_type(const_cast<key_type&>(__v.first), __v.second);
712f52318b4SErik Pilkington    }
713f52318b4SErik Pilkington
714f52318b4SErik Pilkington    _LIBCPP_INLINE_VISIBILITY
715f52318b4SErik Pilkington    __nc_rref_pair_type __move()
716f52318b4SErik Pilkington    {
717f52318b4SErik Pilkington        value_type& __v = __get_value();
718f52318b4SErik Pilkington        return __nc_rref_pair_type(
719f52318b4SErik Pilkington            _VSTD::move(const_cast<key_type&>(__v.first)),
720f52318b4SErik Pilkington            _VSTD::move(__v.second));
721f52318b4SErik Pilkington    }
7229fd9f84fSHoward Hinnant
7239fd9f84fSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
7249fd9f84fSHoward Hinnant    __value_type& operator=(const __value_type& __v)
725f52318b4SErik Pilkington    {
726f52318b4SErik Pilkington        __ref() = __v.__get_value();
727f52318b4SErik Pilkington        return *this;
728f52318b4SErik Pilkington    }
7299fd9f84fSHoward Hinnant
7309fd9f84fSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
7319fd9f84fSHoward Hinnant    __value_type& operator=(__value_type&& __v)
732f52318b4SErik Pilkington    {
733f52318b4SErik Pilkington        __ref() = __v.__move();
734f52318b4SErik Pilkington        return *this;
735f52318b4SErik Pilkington    }
7369fd9f84fSHoward Hinnant
7375e3ea4ddSEric Fiselier    template <class _ValueTp,
7385e3ea4ddSEric Fiselier              class = typename enable_if<
7395e3ea4ddSEric Fiselier                    __is_same_uncvref<_ValueTp, value_type>::value
7405e3ea4ddSEric Fiselier                 >::type
7415e3ea4ddSEric Fiselier             >
7429fd9f84fSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
743f52318b4SErik Pilkington    __value_type& operator=(_ValueTp&& __v)
744f52318b4SErik Pilkington    {
745f52318b4SErik Pilkington        __ref() = _VSTD::forward<_ValueTp>(__v);
746f52318b4SErik Pilkington        return *this;
7475e3ea4ddSEric Fiselier    }
7485e3ea4ddSEric Fiselier
7495e3ea4ddSEric Fiselierprivate:
7505e3ea4ddSEric Fiselier    __value_type() _LIBCPP_EQUAL_DELETE;
7515e3ea4ddSEric Fiselier    ~__value_type() _LIBCPP_EQUAL_DELETE;
7525e3ea4ddSEric Fiselier    __value_type(const __value_type& __v) _LIBCPP_EQUAL_DELETE;
7535e3ea4ddSEric Fiselier    __value_type(__value_type&& __v) _LIBCPP_EQUAL_DELETE;
7549fd9f84fSHoward Hinnant};
7559fd9f84fSHoward Hinnant
7569fd9f84fSHoward Hinnant#else
7579fd9f84fSHoward Hinnant
7589fd9f84fSHoward Hinnanttemplate <class _Key, class _Tp>
7599fd9f84fSHoward Hinnantstruct __value_type
7609fd9f84fSHoward Hinnant{
7619fd9f84fSHoward Hinnant    typedef _Key                                     key_type;
7629fd9f84fSHoward Hinnant    typedef _Tp                                      mapped_type;
7639fd9f84fSHoward Hinnant    typedef pair<const key_type, mapped_type>        value_type;
7649fd9f84fSHoward Hinnant
765f52318b4SErik Pilkingtonprivate:
7669fd9f84fSHoward Hinnant    value_type __cc;
7679fd9f84fSHoward Hinnant
768f52318b4SErik Pilkingtonpublic:
769f52318b4SErik Pilkington    _LIBCPP_INLINE_VISIBILITY
770f52318b4SErik Pilkington    value_type& __get_value() { return __cc; }
771f52318b4SErik Pilkington    _LIBCPP_INLINE_VISIBILITY
772f52318b4SErik Pilkington    const value_type& __get_value() const { return __cc; }
773f52318b4SErik Pilkington
7745e3ea4ddSEric Fiselierprivate:
7755e3ea4ddSEric Fiselier   __value_type();
7765e3ea4ddSEric Fiselier   __value_type(__value_type const&);
7775e3ea4ddSEric Fiselier   __value_type& operator=(__value_type const&);
7785e3ea4ddSEric Fiselier   ~__value_type();
7799fd9f84fSHoward Hinnant};
7809fd9f84fSHoward Hinnant
78118293116SEric Fiselier#endif // _LIBCPP_CXX03_LANG
7829fd9f84fSHoward Hinnant
783b3be398cSEric Fiseliertemplate <class _Tp>
784b3be398cSEric Fiselierstruct __extract_key_value_types;
785b3be398cSEric Fiselier
786b3be398cSEric Fiseliertemplate <class _Key, class _Tp>
787b3be398cSEric Fiselierstruct __extract_key_value_types<__value_type<_Key, _Tp> >
788b3be398cSEric Fiselier{
789b3be398cSEric Fiselier  typedef _Key const __key_type;
790b3be398cSEric Fiselier  typedef _Tp        __mapped_type;
791b3be398cSEric Fiselier};
792b3be398cSEric Fiselier
7933e519524SHoward Hinnanttemplate <class _TreeIterator>
794e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS __map_iterator
7953e519524SHoward Hinnant{
796089a7cc5SEric Fiselier    typedef typename _TreeIterator::_NodeTypes                   _NodeTypes;
797089a7cc5SEric Fiselier    typedef typename _TreeIterator::__pointer_traits             __pointer_traits;
798089a7cc5SEric Fiselier
7993e519524SHoward Hinnant    _TreeIterator __i_;
8003e519524SHoward Hinnant
8013e519524SHoward Hinnantpublic:
8023e519524SHoward Hinnant    typedef bidirectional_iterator_tag                           iterator_category;
803089a7cc5SEric Fiselier    typedef typename _NodeTypes::__map_value_type                value_type;
8043e519524SHoward Hinnant    typedef typename _TreeIterator::difference_type              difference_type;
8053e519524SHoward Hinnant    typedef value_type&                                          reference;
806089a7cc5SEric Fiselier    typedef typename _NodeTypes::__map_value_type_pointer        pointer;
8073e519524SHoward Hinnant
808848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
8091052ee39SHoward Hinnant    __map_iterator() _NOEXCEPT {}
8103e519524SHoward Hinnant
811848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
8121052ee39SHoward Hinnant    __map_iterator(_TreeIterator __i) _NOEXCEPT : __i_(__i) {}
8133e519524SHoward Hinnant
814848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
815f52318b4SErik Pilkington    reference operator*() const {return __i_->__get_value();}
816848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
817f52318b4SErik Pilkington    pointer operator->() const {return pointer_traits<pointer>::pointer_to(__i_->__get_value());}
8183e519524SHoward Hinnant
819848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
8203e519524SHoward Hinnant    __map_iterator& operator++() {++__i_; return *this;}
821848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
8223e519524SHoward Hinnant    __map_iterator operator++(int)
8233e519524SHoward Hinnant    {
8243e519524SHoward Hinnant        __map_iterator __t(*this);
8253e519524SHoward Hinnant        ++(*this);
8263e519524SHoward Hinnant        return __t;
8273e519524SHoward Hinnant    }
8283e519524SHoward Hinnant
829848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
8303e519524SHoward Hinnant    __map_iterator& operator--() {--__i_; return *this;}
831848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
8323e519524SHoward Hinnant    __map_iterator operator--(int)
8333e519524SHoward Hinnant    {
8343e519524SHoward Hinnant        __map_iterator __t(*this);
8353e519524SHoward Hinnant        --(*this);
8363e519524SHoward Hinnant        return __t;
8373e519524SHoward Hinnant    }
8383e519524SHoward Hinnant
839848a5374SHoward Hinnant    friend _LIBCPP_INLINE_VISIBILITY
840848a5374SHoward Hinnant    bool operator==(const __map_iterator& __x, const __map_iterator& __y)
8413e519524SHoward Hinnant        {return __x.__i_ == __y.__i_;}
842848a5374SHoward Hinnant    friend
843848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
844848a5374SHoward Hinnant    bool operator!=(const __map_iterator& __x, const __map_iterator& __y)
8453e519524SHoward Hinnant        {return __x.__i_ != __y.__i_;}
8463e519524SHoward Hinnant
847e2f2d1edSEric Fiselier    template <class, class, class, class> friend class _LIBCPP_TEMPLATE_VIS map;
848e2f2d1edSEric Fiselier    template <class, class, class, class> friend class _LIBCPP_TEMPLATE_VIS multimap;
849e2f2d1edSEric Fiselier    template <class> friend class _LIBCPP_TEMPLATE_VIS __map_const_iterator;
8503e519524SHoward Hinnant};
8513e519524SHoward Hinnant
8523e519524SHoward Hinnanttemplate <class _TreeIterator>
853e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS __map_const_iterator
8543e519524SHoward Hinnant{
855089a7cc5SEric Fiselier    typedef typename _TreeIterator::_NodeTypes                   _NodeTypes;
856089a7cc5SEric Fiselier    typedef typename _TreeIterator::__pointer_traits             __pointer_traits;
857089a7cc5SEric Fiselier
8583e519524SHoward Hinnant    _TreeIterator __i_;
8593e519524SHoward Hinnant
8603e519524SHoward Hinnantpublic:
8613e519524SHoward Hinnant    typedef bidirectional_iterator_tag                           iterator_category;
862089a7cc5SEric Fiselier    typedef typename _NodeTypes::__map_value_type                value_type;
8633e519524SHoward Hinnant    typedef typename _TreeIterator::difference_type              difference_type;
8643e519524SHoward Hinnant    typedef const value_type&                                    reference;
865089a7cc5SEric Fiselier    typedef typename _NodeTypes::__const_map_value_type_pointer  pointer;
8663e519524SHoward Hinnant
867848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
8681052ee39SHoward Hinnant    __map_const_iterator() _NOEXCEPT {}
8693e519524SHoward Hinnant
870848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
8711052ee39SHoward Hinnant    __map_const_iterator(_TreeIterator __i) _NOEXCEPT : __i_(__i) {}
872848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
873b3be398cSEric Fiselier    __map_const_iterator(__map_iterator<
874b3be398cSEric Fiselier        typename _TreeIterator::__non_const_iterator> __i) _NOEXCEPT
8753e519524SHoward Hinnant        : __i_(__i.__i_) {}
8763e519524SHoward Hinnant
877848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
878f52318b4SErik Pilkington    reference operator*() const {return __i_->__get_value();}
879848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
880f52318b4SErik Pilkington    pointer operator->() const {return pointer_traits<pointer>::pointer_to(__i_->__get_value());}
8813e519524SHoward Hinnant
882848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
8833e519524SHoward Hinnant    __map_const_iterator& operator++() {++__i_; return *this;}
884848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
8853e519524SHoward Hinnant    __map_const_iterator operator++(int)
8863e519524SHoward Hinnant    {
8873e519524SHoward Hinnant        __map_const_iterator __t(*this);
8883e519524SHoward Hinnant        ++(*this);
8893e519524SHoward Hinnant        return __t;
8903e519524SHoward Hinnant    }
8913e519524SHoward Hinnant
892848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
8933e519524SHoward Hinnant    __map_const_iterator& operator--() {--__i_; return *this;}
894848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
8953e519524SHoward Hinnant    __map_const_iterator operator--(int)
8963e519524SHoward Hinnant    {
8973e519524SHoward Hinnant        __map_const_iterator __t(*this);
8983e519524SHoward Hinnant        --(*this);
8993e519524SHoward Hinnant        return __t;
9003e519524SHoward Hinnant    }
9013e519524SHoward Hinnant
902848a5374SHoward Hinnant    friend _LIBCPP_INLINE_VISIBILITY
903848a5374SHoward Hinnant    bool operator==(const __map_const_iterator& __x, const __map_const_iterator& __y)
9043e519524SHoward Hinnant        {return __x.__i_ == __y.__i_;}
905848a5374SHoward Hinnant    friend _LIBCPP_INLINE_VISIBILITY
906848a5374SHoward Hinnant    bool operator!=(const __map_const_iterator& __x, const __map_const_iterator& __y)
9073e519524SHoward Hinnant        {return __x.__i_ != __y.__i_;}
9083e519524SHoward Hinnant
909e2f2d1edSEric Fiselier    template <class, class, class, class> friend class _LIBCPP_TEMPLATE_VIS map;
910e2f2d1edSEric Fiselier    template <class, class, class, class> friend class _LIBCPP_TEMPLATE_VIS multimap;
911e2f2d1edSEric Fiselier    template <class, class, class> friend class _LIBCPP_TEMPLATE_VIS __tree_const_iterator;
9123e519524SHoward Hinnant};
9133e519524SHoward Hinnant
9143e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare = less<_Key>,
9153e519524SHoward Hinnant          class _Allocator = allocator<pair<const _Key, _Tp> > >
916e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS map
9173e519524SHoward Hinnant{
9183e519524SHoward Hinnantpublic:
9193e519524SHoward Hinnant    // types:
9203e519524SHoward Hinnant    typedef _Key                                     key_type;
9213e519524SHoward Hinnant    typedef _Tp                                      mapped_type;
9223e519524SHoward Hinnant    typedef pair<const key_type, mapped_type>        value_type;
92309fa1d0eSArthur O'Dwyer    typedef __identity_t<_Compare>                   key_compare;
92409fa1d0eSArthur O'Dwyer    typedef __identity_t<_Allocator>                 allocator_type;
9253e519524SHoward Hinnant    typedef value_type&                              reference;
9263e519524SHoward Hinnant    typedef const value_type&                        const_reference;
9273e519524SHoward Hinnant
92894f89aeeSMarshall Clow    static_assert((is_same<typename allocator_type::value_type, value_type>::value),
92994f89aeeSMarshall Clow                  "Allocator::value_type must be same type as value_type");
93094f89aeeSMarshall Clow
931dc066888SArthur O'Dwyer_LIBCPP_SUPPRESS_DEPRECATED_PUSH
932e2f2d1edSEric Fiselier    class _LIBCPP_TEMPLATE_VIS value_compare
933dc066888SArthur O'Dwyer#if defined(_LIBCPP_ENABLE_CXX20_REMOVED_BINDER_TYPEDEFS)
9343e519524SHoward Hinnant        : public binary_function<value_type, value_type, bool>
935dc066888SArthur O'Dwyer#endif
9363e519524SHoward Hinnant    {
937dc066888SArthur O'Dwyer_LIBCPP_SUPPRESS_DEPRECATED_POP
9383e519524SHoward Hinnant        friend class map;
9393e519524SHoward Hinnant    protected:
9403e519524SHoward Hinnant        key_compare comp;
9413e519524SHoward Hinnant
942848a5374SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY value_compare(key_compare c) : comp(c) {}
9433e519524SHoward Hinnant    public:
944dc066888SArthur O'Dwyer#if _LIBCPP_STD_VER <= 17 || defined(_LIBCPP_ENABLE_CXX20_REMOVED_BINDER_TYPEDEFS)
945dc066888SArthur O'Dwyer        _LIBCPP_DEPRECATED_IN_CXX17 typedef bool result_type;
946dc066888SArthur O'Dwyer        _LIBCPP_DEPRECATED_IN_CXX17 typedef value_type first_argument_type;
947dc066888SArthur O'Dwyer        _LIBCPP_DEPRECATED_IN_CXX17 typedef value_type second_argument_type;
948dc066888SArthur O'Dwyer#endif
949848a5374SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
9503e519524SHoward Hinnant        bool operator()(const value_type& __x, const value_type& __y) const
9513e519524SHoward Hinnant            {return comp(__x.first, __y.first);}
9523e519524SHoward Hinnant    };
9533e519524SHoward Hinnant
9543e519524SHoward Hinnantprivate:
95507d3eccdSHoward Hinnant
9569fd9f84fSHoward Hinnant    typedef _VSTD::__value_type<key_type, mapped_type>             __value_type;
957abb160e6SHoward Hinnant    typedef __map_value_compare<key_type, __value_type, key_compare> __vc;
9581f508014SMarshall Clow    typedef typename __rebind_alloc_helper<allocator_traits<allocator_type>,
9591f508014SMarshall Clow                                                 __value_type>::type __allocator_type;
9603e519524SHoward Hinnant    typedef __tree<__value_type, __vc, __allocator_type>   __base;
9613e519524SHoward Hinnant    typedef typename __base::__node_traits                 __node_traits;
9623e519524SHoward Hinnant    typedef allocator_traits<allocator_type>               __alloc_traits;
9633e519524SHoward Hinnant
9643e519524SHoward Hinnant    __base __tree_;
9653e519524SHoward Hinnant
9663e519524SHoward Hinnantpublic:
9673e519524SHoward Hinnant    typedef typename __alloc_traits::pointer               pointer;
9683e519524SHoward Hinnant    typedef typename __alloc_traits::const_pointer         const_pointer;
9693e519524SHoward Hinnant    typedef typename __alloc_traits::size_type             size_type;
9703e519524SHoward Hinnant    typedef typename __alloc_traits::difference_type       difference_type;
9713e519524SHoward Hinnant    typedef __map_iterator<typename __base::iterator>             iterator;
9723e519524SHoward Hinnant    typedef __map_const_iterator<typename __base::const_iterator> const_iterator;
973ce48a113SHoward Hinnant    typedef _VSTD::reverse_iterator<iterator>               reverse_iterator;
974ce48a113SHoward Hinnant    typedef _VSTD::reverse_iterator<const_iterator>         const_reverse_iterator;
9753e519524SHoward Hinnant
976b0386a51SErik Pilkington#if _LIBCPP_STD_VER > 14
977b0386a51SErik Pilkington    typedef __map_node_handle<typename __base::__node, allocator_type> node_type;
978b0386a51SErik Pilkington    typedef __insert_return_type<iterator, node_type> insert_return_type;
979b0386a51SErik Pilkington#endif
980b0386a51SErik Pilkington
9815c4e07aeSErik Pilkington    template <class _Key2, class _Value2, class _Comp2, class _Alloc2>
9825c4e07aeSErik Pilkington        friend class _LIBCPP_TEMPLATE_VIS map;
9835c4e07aeSErik Pilkington    template <class _Key2, class _Value2, class _Comp2, class _Alloc2>
9845c4e07aeSErik Pilkington        friend class _LIBCPP_TEMPLATE_VIS multimap;
9855c4e07aeSErik Pilkington
986848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
987415a24e4SMarshall Clow    map()
988415a24e4SMarshall Clow        _NOEXCEPT_(
989415a24e4SMarshall Clow            is_nothrow_default_constructible<allocator_type>::value &&
990415a24e4SMarshall Clow            is_nothrow_default_constructible<key_compare>::value &&
991415a24e4SMarshall Clow            is_nothrow_copy_constructible<key_compare>::value)
992415a24e4SMarshall Clow        : __tree_(__vc(key_compare())) {}
993415a24e4SMarshall Clow
994415a24e4SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
995415a24e4SMarshall Clow    explicit map(const key_compare& __comp)
9961052ee39SHoward Hinnant        _NOEXCEPT_(
9971052ee39SHoward Hinnant            is_nothrow_default_constructible<allocator_type>::value &&
9981052ee39SHoward Hinnant            is_nothrow_copy_constructible<key_compare>::value)
9993e519524SHoward Hinnant        : __tree_(__vc(__comp)) {}
10003e519524SHoward Hinnant
1001848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
10023e519524SHoward Hinnant    explicit map(const key_compare& __comp, const allocator_type& __a)
10032a10c960SMarshall Clow        : __tree_(__vc(__comp), typename __base::allocator_type(__a)) {}
10043e519524SHoward Hinnant
10053e519524SHoward Hinnant    template <class _InputIterator>
1006848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
10073e519524SHoward Hinnant        map(_InputIterator __f, _InputIterator __l,
10083e519524SHoward Hinnant            const key_compare& __comp = key_compare())
10093e519524SHoward Hinnant        : __tree_(__vc(__comp))
10103e519524SHoward Hinnant        {
10113e519524SHoward Hinnant            insert(__f, __l);
10123e519524SHoward Hinnant        }
10133e519524SHoward Hinnant
10143e519524SHoward Hinnant    template <class _InputIterator>
1015848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
10163e519524SHoward Hinnant        map(_InputIterator __f, _InputIterator __l,
10173e519524SHoward Hinnant            const key_compare& __comp, const allocator_type& __a)
10182a10c960SMarshall Clow        : __tree_(__vc(__comp), typename __base::allocator_type(__a))
10193e519524SHoward Hinnant        {
10203e519524SHoward Hinnant            insert(__f, __l);
10213e519524SHoward Hinnant        }
10223e519524SHoward Hinnant
1023fbc317d4SMarshall Clow#if _LIBCPP_STD_VER > 11
1024fbc317d4SMarshall Clow    template <class _InputIterator>
1025fbc317d4SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
1026fbc317d4SMarshall Clow    map(_InputIterator __f, _InputIterator __l, const allocator_type& __a)
1027fbc317d4SMarshall Clow        : map(__f, __l, key_compare(), __a) {}
1028fbc317d4SMarshall Clow#endif
1029fbc317d4SMarshall Clow
1030848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
10313e519524SHoward Hinnant    map(const map& __m)
10323e519524SHoward Hinnant        : __tree_(__m.__tree_)
10333e519524SHoward Hinnant        {
10343e519524SHoward Hinnant            insert(__m.begin(), __m.end());
10353e519524SHoward Hinnant        }
10363e519524SHoward Hinnant
10375a33687dSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
10385a33687dSHoward Hinnant    map& operator=(const map& __m)
10395a33687dSHoward Hinnant        {
10402ee83725SMarshall Clow#ifndef _LIBCPP_CXX03_LANG
10415a33687dSHoward Hinnant            __tree_ = __m.__tree_;
104207d3eccdSHoward Hinnant#else
104374cf6ff5SMarshall Clow            if (this != &__m) {
104407d3eccdSHoward Hinnant                __tree_.clear();
104507d3eccdSHoward Hinnant                __tree_.value_comp() = __m.__tree_.value_comp();
104607d3eccdSHoward Hinnant                __tree_.__copy_assign_alloc(__m.__tree_);
104707d3eccdSHoward Hinnant                insert(__m.begin(), __m.end());
104874cf6ff5SMarshall Clow            }
104907d3eccdSHoward Hinnant#endif
10505a33687dSHoward Hinnant            return *this;
10515a33687dSHoward Hinnant        }
10525a33687dSHoward Hinnant
105318293116SEric Fiselier#ifndef _LIBCPP_CXX03_LANG
10543e519524SHoward Hinnant
1055848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
10563e519524SHoward Hinnant    map(map&& __m)
10571052ee39SHoward Hinnant        _NOEXCEPT_(is_nothrow_move_constructible<__base>::value)
1058ce48a113SHoward Hinnant        : __tree_(_VSTD::move(__m.__tree_))
10593e519524SHoward Hinnant        {
10603e519524SHoward Hinnant        }
10613e519524SHoward Hinnant
10623e519524SHoward Hinnant    map(map&& __m, const allocator_type& __a);
10633e519524SHoward Hinnant
1064848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
106554976f26SHoward Hinnant    map& operator=(map&& __m)
106654976f26SHoward Hinnant        _NOEXCEPT_(is_nothrow_move_assignable<__base>::value)
106754976f26SHoward Hinnant        {
106854976f26SHoward Hinnant            __tree_ = _VSTD::move(__m.__tree_);
106954976f26SHoward Hinnant            return *this;
107054976f26SHoward Hinnant        }
107154976f26SHoward Hinnant
107254976f26SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
10733e519524SHoward Hinnant    map(initializer_list<value_type> __il, const key_compare& __comp = key_compare())
10743e519524SHoward Hinnant        : __tree_(__vc(__comp))
10753e519524SHoward Hinnant        {
10763e519524SHoward Hinnant            insert(__il.begin(), __il.end());
10773e519524SHoward Hinnant        }
10783e519524SHoward Hinnant
1079848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
10803e519524SHoward Hinnant    map(initializer_list<value_type> __il, const key_compare& __comp, const allocator_type& __a)
10812a10c960SMarshall Clow        : __tree_(__vc(__comp), typename __base::allocator_type(__a))
10823e519524SHoward Hinnant        {
10833e519524SHoward Hinnant            insert(__il.begin(), __il.end());
10843e519524SHoward Hinnant        }
10853e519524SHoward Hinnant
1086fbc317d4SMarshall Clow#if _LIBCPP_STD_VER > 11
1087fbc317d4SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
1088fbc317d4SMarshall Clow    map(initializer_list<value_type> __il, const allocator_type& __a)
1089fbc317d4SMarshall Clow        : map(__il, key_compare(), __a) {}
1090fbc317d4SMarshall Clow#endif
1091fbc317d4SMarshall Clow
1092848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
10933e519524SHoward Hinnant    map& operator=(initializer_list<value_type> __il)
10943e519524SHoward Hinnant        {
10953e519524SHoward Hinnant            __tree_.__assign_unique(__il.begin(), __il.end());
10963e519524SHoward Hinnant            return *this;
10973e519524SHoward Hinnant        }
10983e519524SHoward Hinnant
109918293116SEric Fiselier#endif // _LIBCPP_CXX03_LANG
11003e519524SHoward Hinnant
1101848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11023e519524SHoward Hinnant    explicit map(const allocator_type& __a)
11032a10c960SMarshall Clow        : __tree_(typename __base::allocator_type(__a))
11043e519524SHoward Hinnant        {
11053e519524SHoward Hinnant        }
11063e519524SHoward Hinnant
1107848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11083e519524SHoward Hinnant    map(const map& __m, const allocator_type& __a)
11092a10c960SMarshall Clow        : __tree_(__m.__tree_.value_comp(), typename __base::allocator_type(__a))
11103e519524SHoward Hinnant        {
11113e519524SHoward Hinnant            insert(__m.begin(), __m.end());
11123e519524SHoward Hinnant        }
11133e519524SHoward Hinnant
1114848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11157c142fccSLouis Dionne    ~map() {
11167c142fccSLouis Dionne        static_assert(sizeof(__diagnose_non_const_comparator<_Key, _Compare>()), "");
11177c142fccSLouis Dionne    }
11187c142fccSLouis Dionne
11197c142fccSLouis Dionne    _LIBCPP_INLINE_VISIBILITY
11201052ee39SHoward Hinnant          iterator begin() _NOEXCEPT {return __tree_.begin();}
1121848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11221052ee39SHoward Hinnant    const_iterator begin() const _NOEXCEPT {return __tree_.begin();}
1123848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11241052ee39SHoward Hinnant          iterator end() _NOEXCEPT {return __tree_.end();}
1125848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11261052ee39SHoward Hinnant    const_iterator end() const _NOEXCEPT {return __tree_.end();}
11273e519524SHoward Hinnant
1128848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11291052ee39SHoward Hinnant          reverse_iterator rbegin() _NOEXCEPT {return reverse_iterator(end());}
1130848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11311052ee39SHoward Hinnant    const_reverse_iterator rbegin() const _NOEXCEPT
11321052ee39SHoward Hinnant        {return const_reverse_iterator(end());}
1133848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11341052ee39SHoward Hinnant          reverse_iterator rend() _NOEXCEPT
11351052ee39SHoward Hinnant            {return       reverse_iterator(begin());}
1136848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11371052ee39SHoward Hinnant    const_reverse_iterator rend() const _NOEXCEPT
11381052ee39SHoward Hinnant        {return const_reverse_iterator(begin());}
11393e519524SHoward Hinnant
1140848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11411052ee39SHoward Hinnant    const_iterator cbegin() const _NOEXCEPT {return begin();}
1142848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11431052ee39SHoward Hinnant    const_iterator cend() const _NOEXCEPT {return end();}
1144848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11451052ee39SHoward Hinnant    const_reverse_iterator crbegin() const _NOEXCEPT {return rbegin();}
1146848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11471052ee39SHoward Hinnant    const_reverse_iterator crend() const _NOEXCEPT {return rend();}
11483e519524SHoward Hinnant
114972c8fad4SMarshall Clow    _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY
11501052ee39SHoward Hinnant    bool      empty() const _NOEXCEPT {return __tree_.size() == 0;}
1151848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11521052ee39SHoward Hinnant    size_type size() const _NOEXCEPT {return __tree_.size();}
1153848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11541052ee39SHoward Hinnant    size_type max_size() const _NOEXCEPT {return __tree_.max_size();}
11553e519524SHoward Hinnant
11563e519524SHoward Hinnant    mapped_type& operator[](const key_type& __k);
115754f0cda6SEric Fiselier#ifndef _LIBCPP_CXX03_LANG
11583e519524SHoward Hinnant    mapped_type& operator[](key_type&& __k);
11593e519524SHoward Hinnant#endif
11603e519524SHoward Hinnant
11613e519524SHoward Hinnant          mapped_type& at(const key_type& __k);
11623e519524SHoward Hinnant    const mapped_type& at(const key_type& __k) const;
11633e519524SHoward Hinnant
1164848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11652a10c960SMarshall Clow    allocator_type get_allocator() const _NOEXCEPT {return allocator_type(__tree_.__alloc());}
1166848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11673e519524SHoward Hinnant    key_compare    key_comp()      const {return __tree_.value_comp().key_comp();}
1168848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11693e519524SHoward Hinnant    value_compare  value_comp()    const {return value_compare(__tree_.value_comp().key_comp());}
11703e519524SHoward Hinnant
11715e3ea4ddSEric Fiselier#ifndef _LIBCPP_CXX03_LANG
11725e3ea4ddSEric Fiselier    template <class ..._Args>
11735e3ea4ddSEric Fiselier    _LIBCPP_INLINE_VISIBILITY
11745e3ea4ddSEric Fiselier    pair<iterator, bool> emplace(_Args&& ...__args) {
11755e3ea4ddSEric Fiselier        return __tree_.__emplace_unique(_VSTD::forward<_Args>(__args)...);
11765e3ea4ddSEric Fiselier    }
11777609c9b6SHoward Hinnant
11788b805c91SHoward Hinnant    template <class ..._Args>
11795e3ea4ddSEric Fiselier    _LIBCPP_INLINE_VISIBILITY
11805e3ea4ddSEric Fiselier    iterator emplace_hint(const_iterator __p, _Args&& ...__args) {
11815e3ea4ddSEric Fiselier        return __tree_.__emplace_hint_unique(__p.__i_, _VSTD::forward<_Args>(__args)...);
11825e3ea4ddSEric Fiselier    }
11837609c9b6SHoward Hinnant
1184c003db1fSHoward Hinnant    template <class _Pp,
1185c003db1fSHoward Hinnant              class = typename enable_if<is_constructible<value_type, _Pp>::value>::type>
1186848a5374SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
1187c003db1fSHoward Hinnant        pair<iterator, bool> insert(_Pp&& __p)
1188c003db1fSHoward Hinnant            {return __tree_.__insert_unique(_VSTD::forward<_Pp>(__p));}
11893e519524SHoward Hinnant
1190c003db1fSHoward Hinnant    template <class _Pp,
1191c003db1fSHoward Hinnant              class = typename enable_if<is_constructible<value_type, _Pp>::value>::type>
1192848a5374SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
1193c003db1fSHoward Hinnant        iterator insert(const_iterator __pos, _Pp&& __p)
1194c003db1fSHoward Hinnant            {return __tree_.__insert_unique(__pos.__i_, _VSTD::forward<_Pp>(__p));}
11953e519524SHoward Hinnant
11965e3ea4ddSEric Fiselier#endif // _LIBCPP_CXX03_LANG
11973e519524SHoward Hinnant
1198848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11993e519524SHoward Hinnant    pair<iterator, bool>
12003e519524SHoward Hinnant        insert(const value_type& __v) {return __tree_.__insert_unique(__v);}
12013e519524SHoward Hinnant
1202848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
12033e519524SHoward Hinnant    iterator
12043e519524SHoward Hinnant        insert(const_iterator __p, const value_type& __v)
12053e519524SHoward Hinnant            {return __tree_.__insert_unique(__p.__i_, __v);}
12063e519524SHoward Hinnant
12077a9f500fSEric Fiselier#ifndef _LIBCPP_CXX03_LANG
1208afc9ff99SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
1209afc9ff99SMarshall Clow    pair<iterator, bool>
12105e3ea4ddSEric Fiselier    insert(value_type&& __v) {return __tree_.__insert_unique(_VSTD::move(__v));}
1211afc9ff99SMarshall Clow
1212afc9ff99SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
12135e3ea4ddSEric Fiselier    iterator insert(const_iterator __p,  value_type&& __v)
12145e3ea4ddSEric Fiselier    {return __tree_.__insert_unique(__p.__i_, _VSTD::move(__v));}
121518293116SEric Fiselier
121618293116SEric Fiselier    _LIBCPP_INLINE_VISIBILITY
121718293116SEric Fiselier    void insert(initializer_list<value_type> __il)
121818293116SEric Fiselier        {insert(__il.begin(), __il.end());}
1219afc9ff99SMarshall Clow#endif
1220afc9ff99SMarshall Clow
12213e519524SHoward Hinnant    template <class _InputIterator>
1222848a5374SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
12233e519524SHoward Hinnant        void insert(_InputIterator __f, _InputIterator __l)
12243e519524SHoward Hinnant        {
12253e519524SHoward Hinnant            for (const_iterator __e = cend(); __f != __l; ++__f)
12263e519524SHoward Hinnant                insert(__e.__i_, *__f);
12273e519524SHoward Hinnant        }
12283e519524SHoward Hinnant
12298aaf517dSMarshall Clow#if _LIBCPP_STD_VER > 14
123054f0cda6SEric Fiselier
12318aaf517dSMarshall Clow    template <class... _Args>
12328aaf517dSMarshall Clow        _LIBCPP_INLINE_VISIBILITY
12338aaf517dSMarshall Clow        pair<iterator, bool> try_emplace(const key_type& __k, _Args&&... __args)
12348aaf517dSMarshall Clow    {
123554f0cda6SEric Fiselier        return __tree_.__emplace_unique_key_args(__k,
123654f0cda6SEric Fiselier            _VSTD::piecewise_construct,
123754f0cda6SEric Fiselier            _VSTD::forward_as_tuple(__k),
123854f0cda6SEric Fiselier            _VSTD::forward_as_tuple(_VSTD::forward<_Args>(__args)...));
12398aaf517dSMarshall Clow    }
12408aaf517dSMarshall Clow
12418aaf517dSMarshall Clow    template <class... _Args>
12428aaf517dSMarshall Clow        _LIBCPP_INLINE_VISIBILITY
12438aaf517dSMarshall Clow        pair<iterator, bool> try_emplace(key_type&& __k, _Args&&... __args)
12448aaf517dSMarshall Clow    {
124554f0cda6SEric Fiselier        return __tree_.__emplace_unique_key_args(__k,
124654f0cda6SEric Fiselier            _VSTD::piecewise_construct,
124754f0cda6SEric Fiselier            _VSTD::forward_as_tuple(_VSTD::move(__k)),
124854f0cda6SEric Fiselier            _VSTD::forward_as_tuple(_VSTD::forward<_Args>(__args)...));
12498aaf517dSMarshall Clow    }
12508aaf517dSMarshall Clow
12518aaf517dSMarshall Clow    template <class... _Args>
12528aaf517dSMarshall Clow        _LIBCPP_INLINE_VISIBILITY
12538aaf517dSMarshall Clow        iterator try_emplace(const_iterator __h, const key_type& __k, _Args&&... __args)
12548aaf517dSMarshall Clow    {
125554f0cda6SEric Fiselier        return __tree_.__emplace_hint_unique_key_args(__h.__i_, __k,
125654f0cda6SEric Fiselier            _VSTD::piecewise_construct,
125754f0cda6SEric Fiselier            _VSTD::forward_as_tuple(__k),
1258d4dd9613SMark de Wever            _VSTD::forward_as_tuple(_VSTD::forward<_Args>(__args)...)).first;
12598aaf517dSMarshall Clow    }
12608aaf517dSMarshall Clow
12618aaf517dSMarshall Clow    template <class... _Args>
12628aaf517dSMarshall Clow        _LIBCPP_INLINE_VISIBILITY
12638aaf517dSMarshall Clow        iterator try_emplace(const_iterator __h, key_type&& __k, _Args&&... __args)
12648aaf517dSMarshall Clow    {
126554f0cda6SEric Fiselier        return __tree_.__emplace_hint_unique_key_args(__h.__i_, __k,
126654f0cda6SEric Fiselier            _VSTD::piecewise_construct,
126754f0cda6SEric Fiselier            _VSTD::forward_as_tuple(_VSTD::move(__k)),
1268d4dd9613SMark de Wever            _VSTD::forward_as_tuple(_VSTD::forward<_Args>(__args)...)).first;
12698aaf517dSMarshall Clow    }
12708aaf517dSMarshall Clow
12718aaf517dSMarshall Clow    template <class _Vp>
12728aaf517dSMarshall Clow        _LIBCPP_INLINE_VISIBILITY
12738aaf517dSMarshall Clow        pair<iterator, bool> insert_or_assign(const key_type& __k, _Vp&& __v)
12748aaf517dSMarshall Clow    {
12758aaf517dSMarshall Clow        iterator __p = lower_bound(__k);
12768aaf517dSMarshall Clow        if ( __p != end() && !key_comp()(__k, __p->first))
12778aaf517dSMarshall Clow        {
12788aaf517dSMarshall Clow            __p->second = _VSTD::forward<_Vp>(__v);
12798aaf517dSMarshall Clow            return _VSTD::make_pair(__p, false);
12808aaf517dSMarshall Clow        }
12818aaf517dSMarshall Clow        return _VSTD::make_pair(emplace_hint(__p, __k, _VSTD::forward<_Vp>(__v)), true);
12828aaf517dSMarshall Clow    }
12838aaf517dSMarshall Clow
12848aaf517dSMarshall Clow    template <class _Vp>
12858aaf517dSMarshall Clow        _LIBCPP_INLINE_VISIBILITY
12868aaf517dSMarshall Clow        pair<iterator, bool> insert_or_assign(key_type&& __k, _Vp&& __v)
12878aaf517dSMarshall Clow    {
12888aaf517dSMarshall Clow        iterator __p = lower_bound(__k);
12898aaf517dSMarshall Clow        if ( __p != end() && !key_comp()(__k, __p->first))
12908aaf517dSMarshall Clow        {
12918aaf517dSMarshall Clow            __p->second = _VSTD::forward<_Vp>(__v);
12928aaf517dSMarshall Clow            return _VSTD::make_pair(__p, false);
12938aaf517dSMarshall Clow        }
12948aaf517dSMarshall Clow        return _VSTD::make_pair(emplace_hint(__p, _VSTD::move(__k), _VSTD::forward<_Vp>(__v)), true);
12958aaf517dSMarshall Clow    }
12968aaf517dSMarshall Clow
12978aaf517dSMarshall Clow    template <class _Vp>
1298d4dd9613SMark de Wever    _LIBCPP_INLINE_VISIBILITY iterator insert_or_assign(const_iterator __h,
1299d4dd9613SMark de Wever                                                        const key_type& __k,
1300d4dd9613SMark de Wever                                                        _Vp&& __v) {
1301d4dd9613SMark de Wever      auto [__r, __inserted] = __tree_.__emplace_hint_unique_key_args(
1302d4dd9613SMark de Wever          __h.__i_, __k, __k, _VSTD::forward<_Vp>(__v));
1303d4dd9613SMark de Wever
1304d4dd9613SMark de Wever      if (!__inserted)
1305d4dd9613SMark de Wever        __r->__get_value().second = _VSTD::forward<_Vp>(__v);
1306d4dd9613SMark de Wever
1307d4dd9613SMark de Wever      return __r;
13088aaf517dSMarshall Clow    }
13098aaf517dSMarshall Clow
13108aaf517dSMarshall Clow    template <class _Vp>
1311d4dd9613SMark de Wever    _LIBCPP_INLINE_VISIBILITY iterator insert_or_assign(const_iterator __h,
1312d4dd9613SMark de Wever                                                        key_type&& __k,
1313d4dd9613SMark de Wever                                                        _Vp&& __v) {
1314d4dd9613SMark de Wever      auto [__r, __inserted] = __tree_.__emplace_hint_unique_key_args(
1315d4dd9613SMark de Wever          __h.__i_, __k, _VSTD::move(__k), _VSTD::forward<_Vp>(__v));
1316d4dd9613SMark de Wever
1317d4dd9613SMark de Wever      if (!__inserted)
1318d4dd9613SMark de Wever        __r->__get_value().second = _VSTD::forward<_Vp>(__v);
1319d4dd9613SMark de Wever
1320d4dd9613SMark de Wever      return __r;
13218aaf517dSMarshall Clow    }
132254f0cda6SEric Fiselier
132318293116SEric Fiselier#endif // _LIBCPP_STD_VER > 14
13248aaf517dSMarshall Clow
1325848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
13263e519524SHoward Hinnant    iterator erase(const_iterator __p) {return __tree_.erase(__p.__i_);}
1327848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
1328ec392968SMarshall Clow    iterator erase(iterator __p)       {return __tree_.erase(__p.__i_);}
1329ec392968SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
13303e519524SHoward Hinnant    size_type erase(const key_type& __k)
13313e519524SHoward Hinnant        {return __tree_.__erase_unique(__k);}
1332848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
13333e519524SHoward Hinnant    iterator  erase(const_iterator __f, const_iterator __l)
13343e519524SHoward Hinnant        {return __tree_.erase(__f.__i_, __l.__i_);}
1335848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
13361052ee39SHoward Hinnant    void clear() _NOEXCEPT {__tree_.clear();}
13373e519524SHoward Hinnant
1338b0386a51SErik Pilkington#if _LIBCPP_STD_VER > 14
1339b0386a51SErik Pilkington    _LIBCPP_INLINE_VISIBILITY
1340b0386a51SErik Pilkington    insert_return_type insert(node_type&& __nh)
1341b0386a51SErik Pilkington    {
1342b0386a51SErik Pilkington        _LIBCPP_ASSERT(__nh.empty() || __nh.get_allocator() == get_allocator(),
1343b0386a51SErik Pilkington            "node_type with incompatible allocator passed to map::insert()");
1344b0386a51SErik Pilkington        return __tree_.template __node_handle_insert_unique<
1345b0386a51SErik Pilkington            node_type, insert_return_type>(_VSTD::move(__nh));
1346b0386a51SErik Pilkington    }
1347b0386a51SErik Pilkington    _LIBCPP_INLINE_VISIBILITY
1348b0386a51SErik Pilkington    iterator insert(const_iterator __hint, node_type&& __nh)
1349b0386a51SErik Pilkington    {
1350b0386a51SErik Pilkington        _LIBCPP_ASSERT(__nh.empty() || __nh.get_allocator() == get_allocator(),
1351b0386a51SErik Pilkington            "node_type with incompatible allocator passed to map::insert()");
1352b0386a51SErik Pilkington        return __tree_.template __node_handle_insert_unique<node_type>(
1353b0386a51SErik Pilkington            __hint.__i_, _VSTD::move(__nh));
1354b0386a51SErik Pilkington    }
1355b0386a51SErik Pilkington    _LIBCPP_INLINE_VISIBILITY
1356b0386a51SErik Pilkington    node_type extract(key_type const& __key)
1357b0386a51SErik Pilkington    {
1358b0386a51SErik Pilkington        return __tree_.template __node_handle_extract<node_type>(__key);
1359b0386a51SErik Pilkington    }
1360b0386a51SErik Pilkington    _LIBCPP_INLINE_VISIBILITY
1361b0386a51SErik Pilkington    node_type extract(const_iterator __it)
1362b0386a51SErik Pilkington    {
1363b0386a51SErik Pilkington        return __tree_.template __node_handle_extract<node_type>(__it.__i_);
1364b0386a51SErik Pilkington    }
13658df1d5a5SLouis Dionne    template <class _Compare2>
13665c4e07aeSErik Pilkington    _LIBCPP_INLINE_VISIBILITY
13678df1d5a5SLouis Dionne    void merge(map<key_type, mapped_type, _Compare2, allocator_type>& __source)
13685c4e07aeSErik Pilkington    {
13695c4e07aeSErik Pilkington        _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
13705c4e07aeSErik Pilkington                       "merging container with incompatible allocator");
13715c4e07aeSErik Pilkington        __tree_.__node_handle_merge_unique(__source.__tree_);
13725c4e07aeSErik Pilkington    }
13738df1d5a5SLouis Dionne    template <class _Compare2>
13745c4e07aeSErik Pilkington    _LIBCPP_INLINE_VISIBILITY
13758df1d5a5SLouis Dionne    void merge(map<key_type, mapped_type, _Compare2, allocator_type>&& __source)
13765c4e07aeSErik Pilkington    {
13775c4e07aeSErik Pilkington        _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
13785c4e07aeSErik Pilkington                       "merging container with incompatible allocator");
13795c4e07aeSErik Pilkington        __tree_.__node_handle_merge_unique(__source.__tree_);
13805c4e07aeSErik Pilkington    }
13818df1d5a5SLouis Dionne    template <class _Compare2>
13825c4e07aeSErik Pilkington    _LIBCPP_INLINE_VISIBILITY
13838df1d5a5SLouis Dionne    void merge(multimap<key_type, mapped_type, _Compare2, allocator_type>& __source)
13845c4e07aeSErik Pilkington    {
13855c4e07aeSErik Pilkington        _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
13865c4e07aeSErik Pilkington                       "merging container with incompatible allocator");
13875c4e07aeSErik Pilkington        __tree_.__node_handle_merge_unique(__source.__tree_);
13885c4e07aeSErik Pilkington    }
13898df1d5a5SLouis Dionne    template <class _Compare2>
13905c4e07aeSErik Pilkington    _LIBCPP_INLINE_VISIBILITY
13918df1d5a5SLouis Dionne    void merge(multimap<key_type, mapped_type, _Compare2, allocator_type>&& __source)
13925c4e07aeSErik Pilkington    {
13935c4e07aeSErik Pilkington        _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
13945c4e07aeSErik Pilkington                       "merging container with incompatible allocator");
13955c4e07aeSErik Pilkington        __tree_.__node_handle_merge_unique(__source.__tree_);
13965c4e07aeSErik Pilkington    }
1397b0386a51SErik Pilkington#endif
1398b0386a51SErik Pilkington
1399848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
14001052ee39SHoward Hinnant    void swap(map& __m)
14011052ee39SHoward Hinnant        _NOEXCEPT_(__is_nothrow_swappable<__base>::value)
14021052ee39SHoward Hinnant        {__tree_.swap(__m.__tree_);}
14033e519524SHoward Hinnant
1404848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
14053e519524SHoward Hinnant    iterator find(const key_type& __k)             {return __tree_.find(__k);}
1406848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
14073e519524SHoward Hinnant    const_iterator find(const key_type& __k) const {return __tree_.find(__k);}
14082585835cSMarshall Clow#if _LIBCPP_STD_VER > 11
14092585835cSMarshall Clow    template <typename _K2>
14102585835cSMarshall Clow    _LIBCPP_INLINE_VISIBILITY
14112585835cSMarshall Clow    typename enable_if<__is_transparent<_Compare, _K2>::value,iterator>::type
14122585835cSMarshall Clow    find(const _K2& __k)                           {return __tree_.find(__k);}
14132585835cSMarshall Clow    template <typename _K2>
14142585835cSMarshall Clow    _LIBCPP_INLINE_VISIBILITY
14152585835cSMarshall Clow    typename enable_if<__is_transparent<_Compare, _K2>::value,const_iterator>::type
14162585835cSMarshall Clow    find(const _K2& __k) const                     {return __tree_.find(__k);}
14172585835cSMarshall Clow#endif
14182585835cSMarshall Clow
1419848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
14203e519524SHoward Hinnant    size_type      count(const key_type& __k) const
14213e519524SHoward Hinnant        {return __tree_.__count_unique(__k);}
14220aacbc92SMarshall Clow#if _LIBCPP_STD_VER > 11
14230aacbc92SMarshall Clow    template <typename _K2>
14240aacbc92SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
14250aacbc92SMarshall Clow    typename enable_if<__is_transparent<_Compare, _K2>::value,size_type>::type
14269bfdb770SEric Fiselier    count(const _K2& __k) const {return __tree_.__count_multi(__k);}
14270aacbc92SMarshall Clow#endif
1428a17b1aedSZoe Carver
1429a17b1aedSZoe Carver#if _LIBCPP_STD_VER > 17
1430a17b1aedSZoe Carver    _LIBCPP_INLINE_VISIBILITY
1431a17b1aedSZoe Carver    bool contains(const key_type& __k) const {return find(__k) != end();}
14323fca07d7SMarek Kurdej    template <typename _K2>
14333fca07d7SMarek Kurdej    _LIBCPP_INLINE_VISIBILITY
14343fca07d7SMarek Kurdej    typename enable_if<__is_transparent<_Compare, _K2>::value, bool>::type
14353fca07d7SMarek Kurdej    contains(const _K2& __k) const { return find(__k) != end(); }
1436a17b1aedSZoe Carver#endif // _LIBCPP_STD_VER > 17
1437a17b1aedSZoe Carver
1438848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
14393e519524SHoward Hinnant    iterator lower_bound(const key_type& __k)
14403e519524SHoward Hinnant        {return __tree_.lower_bound(__k);}
1441848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
14423e519524SHoward Hinnant    const_iterator lower_bound(const key_type& __k) const
14433e519524SHoward Hinnant        {return __tree_.lower_bound(__k);}
14442585835cSMarshall Clow#if _LIBCPP_STD_VER > 11
14452585835cSMarshall Clow    template <typename _K2>
14462585835cSMarshall Clow    _LIBCPP_INLINE_VISIBILITY
14472585835cSMarshall Clow    typename enable_if<__is_transparent<_Compare, _K2>::value,iterator>::type
14482585835cSMarshall Clow    lower_bound(const _K2& __k)       {return __tree_.lower_bound(__k);}
14492585835cSMarshall Clow
14502585835cSMarshall Clow    template <typename _K2>
14512585835cSMarshall Clow    _LIBCPP_INLINE_VISIBILITY
14522585835cSMarshall Clow    typename enable_if<__is_transparent<_Compare, _K2>::value,const_iterator>::type
14532585835cSMarshall Clow    lower_bound(const _K2& __k) const {return __tree_.lower_bound(__k);}
14542585835cSMarshall Clow#endif
14552585835cSMarshall Clow
1456848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
14573e519524SHoward Hinnant    iterator upper_bound(const key_type& __k)
14583e519524SHoward Hinnant        {return __tree_.upper_bound(__k);}
1459848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
14603e519524SHoward Hinnant    const_iterator upper_bound(const key_type& __k) const
14613e519524SHoward Hinnant        {return __tree_.upper_bound(__k);}
14622585835cSMarshall Clow#if _LIBCPP_STD_VER > 11
14632585835cSMarshall Clow    template <typename _K2>
14642585835cSMarshall Clow    _LIBCPP_INLINE_VISIBILITY
14652585835cSMarshall Clow    typename enable_if<__is_transparent<_Compare, _K2>::value,iterator>::type
14662585835cSMarshall Clow    upper_bound(const _K2& __k)       {return __tree_.upper_bound(__k);}
14672585835cSMarshall Clow    template <typename _K2>
14682585835cSMarshall Clow    _LIBCPP_INLINE_VISIBILITY
14692585835cSMarshall Clow    typename enable_if<__is_transparent<_Compare, _K2>::value,const_iterator>::type
14702585835cSMarshall Clow    upper_bound(const _K2& __k) const {return __tree_.upper_bound(__k);}
14712585835cSMarshall Clow#endif
14722585835cSMarshall Clow
1473848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
14743e519524SHoward Hinnant    pair<iterator,iterator> equal_range(const key_type& __k)
14753e519524SHoward Hinnant        {return __tree_.__equal_range_unique(__k);}
1476848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
14773e519524SHoward Hinnant    pair<const_iterator,const_iterator> equal_range(const key_type& __k) const
14783e519524SHoward Hinnant        {return __tree_.__equal_range_unique(__k);}
14792585835cSMarshall Clow#if _LIBCPP_STD_VER > 11
14802585835cSMarshall Clow    template <typename _K2>
14812585835cSMarshall Clow    _LIBCPP_INLINE_VISIBILITY
14822585835cSMarshall Clow    typename enable_if<__is_transparent<_Compare, _K2>::value,pair<iterator,iterator>>::type
14839bfdb770SEric Fiselier    equal_range(const _K2& __k)       {return __tree_.__equal_range_multi(__k);}
14842585835cSMarshall Clow    template <typename _K2>
14852585835cSMarshall Clow    _LIBCPP_INLINE_VISIBILITY
14862585835cSMarshall Clow    typename enable_if<__is_transparent<_Compare, _K2>::value,pair<const_iterator,const_iterator>>::type
14879bfdb770SEric Fiselier    equal_range(const _K2& __k) const {return __tree_.__equal_range_multi(__k);}
14882585835cSMarshall Clow#endif
14893e519524SHoward Hinnant
14903e519524SHoward Hinnantprivate:
14913e519524SHoward Hinnant    typedef typename __base::__node                    __node;
14923e519524SHoward Hinnant    typedef typename __base::__node_allocator          __node_allocator;
14933e519524SHoward Hinnant    typedef typename __base::__node_pointer            __node_pointer;
14943e519524SHoward Hinnant    typedef typename __base::__node_base_pointer       __node_base_pointer;
1495cb5cbc8bSEric Fiselier    typedef typename __base::__parent_pointer          __parent_pointer;
14960594ad71SEric Fiselier
1497c003db1fSHoward Hinnant    typedef __map_node_destructor<__node_allocator> _Dp;
1498c003db1fSHoward Hinnant    typedef unique_ptr<__node, _Dp> __node_holder;
14993e519524SHoward Hinnant
150054f0cda6SEric Fiselier#ifdef _LIBCPP_CXX03_LANG
15014a95f9ebSHoward Hinnant    __node_holder __construct_node_with_key(const key_type& __k);
150254f0cda6SEric Fiselier#endif
15033e519524SHoward Hinnant};
15043e519524SHoward Hinnant
150501666904SLouis Dionne#if _LIBCPP_STD_VER >= 17
1506f2f7d72fSLouis Dionnetemplate<class _InputIterator, class _Compare = less<__iter_key_type<_InputIterator>>,
1507f2f7d72fSLouis Dionne         class _Allocator = allocator<__iter_to_alloc_type<_InputIterator>>,
1508*4e0ea2cfSLouis Dionne         class = enable_if_t<!__is_allocator<_Compare>::value, void>,
1509*4e0ea2cfSLouis Dionne         class = enable_if_t<__is_allocator<_Allocator>::value, void>>
1510f2f7d72fSLouis Dionnemap(_InputIterator, _InputIterator, _Compare = _Compare(), _Allocator = _Allocator())
1511f2f7d72fSLouis Dionne  -> map<__iter_key_type<_InputIterator>, __iter_mapped_type<_InputIterator>, _Compare, _Allocator>;
1512f2f7d72fSLouis Dionne
1513f2f7d72fSLouis Dionnetemplate<class _Key, class _Tp, class _Compare = less<remove_const_t<_Key>>,
1514f2f7d72fSLouis Dionne         class _Allocator = allocator<pair<const _Key, _Tp>>,
1515*4e0ea2cfSLouis Dionne         class = enable_if_t<!__is_allocator<_Compare>::value, void>,
1516*4e0ea2cfSLouis Dionne         class = enable_if_t<__is_allocator<_Allocator>::value, void>>
1517f2f7d72fSLouis Dionnemap(initializer_list<pair<_Key, _Tp>>, _Compare = _Compare(), _Allocator = _Allocator())
1518f2f7d72fSLouis Dionne  -> map<remove_const_t<_Key>, _Tp, _Compare, _Allocator>;
1519f2f7d72fSLouis Dionne
1520f2f7d72fSLouis Dionnetemplate<class _InputIterator, class _Allocator,
1521*4e0ea2cfSLouis Dionne         class = enable_if_t<__is_allocator<_Allocator>::value, void>>
1522f2f7d72fSLouis Dionnemap(_InputIterator, _InputIterator, _Allocator)
1523f2f7d72fSLouis Dionne  -> map<__iter_key_type<_InputIterator>, __iter_mapped_type<_InputIterator>,
1524f2f7d72fSLouis Dionne         less<__iter_key_type<_InputIterator>>, _Allocator>;
1525f2f7d72fSLouis Dionne
1526f2f7d72fSLouis Dionnetemplate<class _Key, class _Tp, class _Allocator,
1527*4e0ea2cfSLouis Dionne         class = enable_if_t<__is_allocator<_Allocator>::value, void>>
1528f2f7d72fSLouis Dionnemap(initializer_list<pair<_Key, _Tp>>, _Allocator)
1529f2f7d72fSLouis Dionne  -> map<remove_const_t<_Key>, _Tp, less<remove_const_t<_Key>>, _Allocator>;
1530f2f7d72fSLouis Dionne#endif
15310594ad71SEric Fiselier
15325e3ea4ddSEric Fiselier#ifndef _LIBCPP_CXX03_LANG
15333e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator>
15343e519524SHoward Hinnantmap<_Key, _Tp, _Compare, _Allocator>::map(map&& __m, const allocator_type& __a)
15352a10c960SMarshall Clow    : __tree_(_VSTD::move(__m.__tree_), typename __base::allocator_type(__a))
15363e519524SHoward Hinnant{
15373e519524SHoward Hinnant    if (__a != __m.get_allocator())
15383e519524SHoward Hinnant    {
15393e519524SHoward Hinnant        const_iterator __e = cend();
15403e519524SHoward Hinnant        while (!__m.empty())
15413e519524SHoward Hinnant            __tree_.__insert_unique(__e.__i_,
1542f52318b4SErik Pilkington                    __m.__tree_.remove(__m.begin().__i_)->__value_.__move());
15433e519524SHoward Hinnant    }
15443e519524SHoward Hinnant}
15453e519524SHoward Hinnant
154618293116SEric Fiseliertemplate <class _Key, class _Tp, class _Compare, class _Allocator>
154718293116SEric Fiselier_Tp&
154818293116SEric Fiseliermap<_Key, _Tp, _Compare, _Allocator>::operator[](const key_type& __k)
154918293116SEric Fiselier{
155018293116SEric Fiselier    return __tree_.__emplace_unique_key_args(__k,
155118293116SEric Fiselier        _VSTD::piecewise_construct,
155218293116SEric Fiselier        _VSTD::forward_as_tuple(__k),
1553f52318b4SErik Pilkington        _VSTD::forward_as_tuple()).first->__get_value().second;
155418293116SEric Fiselier}
15553e519524SHoward Hinnant
155618293116SEric Fiseliertemplate <class _Key, class _Tp, class _Compare, class _Allocator>
155718293116SEric Fiselier_Tp&
155818293116SEric Fiseliermap<_Key, _Tp, _Compare, _Allocator>::operator[](key_type&& __k)
155918293116SEric Fiselier{
156018293116SEric Fiselier    return __tree_.__emplace_unique_key_args(__k,
156118293116SEric Fiselier        _VSTD::piecewise_construct,
156218293116SEric Fiselier        _VSTD::forward_as_tuple(_VSTD::move(__k)),
1563f52318b4SErik Pilkington        _VSTD::forward_as_tuple()).first->__get_value().second;
156418293116SEric Fiselier}
156554f0cda6SEric Fiselier
156618293116SEric Fiselier#else // _LIBCPP_CXX03_LANG
156754f0cda6SEric Fiselier
15683e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator>
15693e519524SHoward Hinnanttypename map<_Key, _Tp, _Compare, _Allocator>::__node_holder
15704a95f9ebSHoward Hinnantmap<_Key, _Tp, _Compare, _Allocator>::__construct_node_with_key(const key_type& __k)
15713e519524SHoward Hinnant{
15723e519524SHoward Hinnant    __node_allocator& __na = __tree_.__node_alloc();
1573c003db1fSHoward Hinnant    __node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na));
1574f52318b4SErik Pilkington    __node_traits::construct(__na, _VSTD::addressof(__h->__value_.__get_value().first), __k);
15753e519524SHoward Hinnant    __h.get_deleter().__first_constructed = true;
1576f52318b4SErik Pilkington    __node_traits::construct(__na, _VSTD::addressof(__h->__value_.__get_value().second));
15773e519524SHoward Hinnant    __h.get_deleter().__second_constructed = true;
15788d4860aaSLouis Dionne    return __h;
15793e519524SHoward Hinnant}
15803e519524SHoward Hinnant
15813e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator>
15823e519524SHoward Hinnant_Tp&
15833e519524SHoward Hinnantmap<_Key, _Tp, _Compare, _Allocator>::operator[](const key_type& __k)
15843e519524SHoward Hinnant{
1585cb5cbc8bSEric Fiselier    __parent_pointer __parent;
1586cb5cbc8bSEric Fiselier    __node_base_pointer& __child = __tree_.__find_equal(__parent, __k);
15873e519524SHoward Hinnant    __node_pointer __r = static_cast<__node_pointer>(__child);
15883e519524SHoward Hinnant    if (__child == nullptr)
15893e519524SHoward Hinnant    {
15904a95f9ebSHoward Hinnant        __node_holder __h = __construct_node_with_key(__k);
159107d3eccdSHoward Hinnant        __tree_.__insert_node_at(__parent, __child, static_cast<__node_base_pointer>(__h.get()));
15923e519524SHoward Hinnant        __r = __h.release();
15933e519524SHoward Hinnant    }
1594f52318b4SErik Pilkington    return __r->__value_.__get_value().second;
15953e519524SHoward Hinnant}
15963e519524SHoward Hinnant
159718293116SEric Fiselier#endif // _LIBCPP_CXX03_LANG
15983e519524SHoward Hinnant
15993e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator>
16003e519524SHoward Hinnant_Tp&
16013e519524SHoward Hinnantmap<_Key, _Tp, _Compare, _Allocator>::at(const key_type& __k)
16023e519524SHoward Hinnant{
1603cb5cbc8bSEric Fiselier    __parent_pointer __parent;
1604cb5cbc8bSEric Fiselier    __node_base_pointer& __child = __tree_.__find_equal(__parent, __k);
16053e519524SHoward Hinnant    if (__child == nullptr)
16067232a84eSLouis Dionne        __throw_out_of_range("map::at:  key not found");
1607f52318b4SErik Pilkington    return static_cast<__node_pointer>(__child)->__value_.__get_value().second;
16083e519524SHoward Hinnant}
16093e519524SHoward Hinnant
16103e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator>
16113e519524SHoward Hinnantconst _Tp&
16123e519524SHoward Hinnantmap<_Key, _Tp, _Compare, _Allocator>::at(const key_type& __k) const
16133e519524SHoward Hinnant{
1614cb5cbc8bSEric Fiselier    __parent_pointer __parent;
1615cb5cbc8bSEric Fiselier    __node_base_pointer __child = __tree_.__find_equal(__parent, __k);
16163e519524SHoward Hinnant    if (__child == nullptr)
16177232a84eSLouis Dionne        __throw_out_of_range("map::at:  key not found");
1618f52318b4SErik Pilkington    return static_cast<__node_pointer>(__child)->__value_.__get_value().second;
16193e519524SHoward Hinnant}
16203e519524SHoward Hinnant
16213e519524SHoward Hinnant
16223e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator>
1623848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
16243e519524SHoward Hinnantbool
16253e519524SHoward Hinnantoperator==(const map<_Key, _Tp, _Compare, _Allocator>& __x,
16263e519524SHoward Hinnant           const map<_Key, _Tp, _Compare, _Allocator>& __y)
16273e519524SHoward Hinnant{
1628ce48a113SHoward Hinnant    return __x.size() == __y.size() && _VSTD::equal(__x.begin(), __x.end(), __y.begin());
16293e519524SHoward Hinnant}
16303e519524SHoward Hinnant
16313e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator>
1632848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
16333e519524SHoward Hinnantbool
16343e519524SHoward Hinnantoperator< (const map<_Key, _Tp, _Compare, _Allocator>& __x,
16353e519524SHoward Hinnant           const map<_Key, _Tp, _Compare, _Allocator>& __y)
16363e519524SHoward Hinnant{
1637ce48a113SHoward Hinnant    return _VSTD::lexicographical_compare(__x.begin(), __x.end(), __y.begin(), __y.end());
16383e519524SHoward Hinnant}
16393e519524SHoward Hinnant
16403e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator>
1641848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
16423e519524SHoward Hinnantbool
16433e519524SHoward Hinnantoperator!=(const map<_Key, _Tp, _Compare, _Allocator>& __x,
16443e519524SHoward Hinnant           const map<_Key, _Tp, _Compare, _Allocator>& __y)
16453e519524SHoward Hinnant{
16463e519524SHoward Hinnant    return !(__x == __y);
16473e519524SHoward Hinnant}
16483e519524SHoward Hinnant
16493e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator>
1650848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
16513e519524SHoward Hinnantbool
16523e519524SHoward Hinnantoperator> (const map<_Key, _Tp, _Compare, _Allocator>& __x,
16533e519524SHoward Hinnant           const map<_Key, _Tp, _Compare, _Allocator>& __y)
16543e519524SHoward Hinnant{
16553e519524SHoward Hinnant    return __y < __x;
16563e519524SHoward Hinnant}
16573e519524SHoward Hinnant
16583e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator>
1659848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
16603e519524SHoward Hinnantbool
16613e519524SHoward Hinnantoperator>=(const map<_Key, _Tp, _Compare, _Allocator>& __x,
16623e519524SHoward Hinnant           const map<_Key, _Tp, _Compare, _Allocator>& __y)
16633e519524SHoward Hinnant{
16643e519524SHoward Hinnant    return !(__x < __y);
16653e519524SHoward Hinnant}
16663e519524SHoward Hinnant
16673e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator>
1668848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
16693e519524SHoward Hinnantbool
16703e519524SHoward Hinnantoperator<=(const map<_Key, _Tp, _Compare, _Allocator>& __x,
16713e519524SHoward Hinnant           const map<_Key, _Tp, _Compare, _Allocator>& __y)
16723e519524SHoward Hinnant{
16733e519524SHoward Hinnant    return !(__y < __x);
16743e519524SHoward Hinnant}
16753e519524SHoward Hinnant
16763e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator>
1677848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
16783e519524SHoward Hinnantvoid
16793e519524SHoward Hinnantswap(map<_Key, _Tp, _Compare, _Allocator>& __x,
16803e519524SHoward Hinnant     map<_Key, _Tp, _Compare, _Allocator>& __y)
16811052ee39SHoward Hinnant    _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
16823e519524SHoward Hinnant{
16833e519524SHoward Hinnant    __x.swap(__y);
16843e519524SHoward Hinnant}
16853e519524SHoward Hinnant
1686f60c63c0SMarshall Clow#if _LIBCPP_STD_VER > 17
16873e895085SMarek Kurdejtemplate <class _Key, class _Tp, class _Compare, class _Allocator,
16883e895085SMarek Kurdej          class _Predicate>
1689f60c63c0SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY
16903e895085SMarek Kurdej    typename map<_Key, _Tp, _Compare, _Allocator>::size_type
16913e895085SMarek Kurdej    erase_if(map<_Key, _Tp, _Compare, _Allocator>& __c, _Predicate __pred) {
16922ac6babcSArthur O'Dwyer  return _VSTD::__libcpp_erase_if_container(__c, __pred);
16933e895085SMarek Kurdej}
1694f60c63c0SMarshall Clow#endif
1695f60c63c0SMarshall Clow
1696f60c63c0SMarshall Clow
16973e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare = less<_Key>,
16983e519524SHoward Hinnant          class _Allocator = allocator<pair<const _Key, _Tp> > >
1699e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS multimap
17003e519524SHoward Hinnant{
17013e519524SHoward Hinnantpublic:
17023e519524SHoward Hinnant    // types:
17033e519524SHoward Hinnant    typedef _Key                                     key_type;
17043e519524SHoward Hinnant    typedef _Tp                                      mapped_type;
17053e519524SHoward Hinnant    typedef pair<const key_type, mapped_type>        value_type;
170609fa1d0eSArthur O'Dwyer    typedef __identity_t<_Compare>                   key_compare;
170709fa1d0eSArthur O'Dwyer    typedef __identity_t<_Allocator>                 allocator_type;
17083e519524SHoward Hinnant    typedef value_type&                              reference;
17093e519524SHoward Hinnant    typedef const value_type&                        const_reference;
17103e519524SHoward Hinnant
171194f89aeeSMarshall Clow    static_assert((is_same<typename allocator_type::value_type, value_type>::value),
171294f89aeeSMarshall Clow                  "Allocator::value_type must be same type as value_type");
171394f89aeeSMarshall Clow
1714dc066888SArthur O'Dwyer_LIBCPP_SUPPRESS_DEPRECATED_PUSH
1715e2f2d1edSEric Fiselier    class _LIBCPP_TEMPLATE_VIS value_compare
1716dc066888SArthur O'Dwyer#if defined(_LIBCPP_ENABLE_CXX20_REMOVED_BINDER_TYPEDEFS)
17173e519524SHoward Hinnant        : public binary_function<value_type, value_type, bool>
1718dc066888SArthur O'Dwyer#endif
17193e519524SHoward Hinnant    {
1720dc066888SArthur O'Dwyer_LIBCPP_SUPPRESS_DEPRECATED_POP
17213e519524SHoward Hinnant        friend class multimap;
17223e519524SHoward Hinnant    protected:
17233e519524SHoward Hinnant        key_compare comp;
17243e519524SHoward Hinnant
1725848a5374SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
17263e519524SHoward Hinnant        value_compare(key_compare c) : comp(c) {}
17273e519524SHoward Hinnant    public:
1728dc066888SArthur O'Dwyer#if _LIBCPP_STD_VER <= 17 || defined(_LIBCPP_ENABLE_CXX20_REMOVED_BINDER_TYPEDEFS)
1729dc066888SArthur O'Dwyer        _LIBCPP_DEPRECATED_IN_CXX17 typedef bool result_type;
1730dc066888SArthur O'Dwyer        _LIBCPP_DEPRECATED_IN_CXX17 typedef value_type first_argument_type;
1731dc066888SArthur O'Dwyer        _LIBCPP_DEPRECATED_IN_CXX17 typedef value_type second_argument_type;
1732dc066888SArthur O'Dwyer#endif
1733848a5374SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
17343e519524SHoward Hinnant        bool operator()(const value_type& __x, const value_type& __y) const
17353e519524SHoward Hinnant            {return comp(__x.first, __y.first);}
17363e519524SHoward Hinnant    };
17373e519524SHoward Hinnant
17383e519524SHoward Hinnantprivate:
173907d3eccdSHoward Hinnant
17409fd9f84fSHoward Hinnant    typedef _VSTD::__value_type<key_type, mapped_type>             __value_type;
1741abb160e6SHoward Hinnant    typedef __map_value_compare<key_type, __value_type, key_compare> __vc;
17421f508014SMarshall Clow    typedef typename __rebind_alloc_helper<allocator_traits<allocator_type>,
17431f508014SMarshall Clow                                                 __value_type>::type __allocator_type;
17443e519524SHoward Hinnant    typedef __tree<__value_type, __vc, __allocator_type>            __base;
17453e519524SHoward Hinnant    typedef typename __base::__node_traits                          __node_traits;
17463e519524SHoward Hinnant    typedef allocator_traits<allocator_type>                        __alloc_traits;
17473e519524SHoward Hinnant
17483e519524SHoward Hinnant    __base __tree_;
17493e519524SHoward Hinnant
17503e519524SHoward Hinnantpublic:
17513e519524SHoward Hinnant    typedef typename __alloc_traits::pointer               pointer;
17523e519524SHoward Hinnant    typedef typename __alloc_traits::const_pointer         const_pointer;
17533e519524SHoward Hinnant    typedef typename __alloc_traits::size_type             size_type;
17543e519524SHoward Hinnant    typedef typename __alloc_traits::difference_type       difference_type;
17553e519524SHoward Hinnant    typedef __map_iterator<typename __base::iterator>      iterator;
17563e519524SHoward Hinnant    typedef __map_const_iterator<typename __base::const_iterator> const_iterator;
1757ce48a113SHoward Hinnant    typedef _VSTD::reverse_iterator<iterator>               reverse_iterator;
1758ce48a113SHoward Hinnant    typedef _VSTD::reverse_iterator<const_iterator>         const_reverse_iterator;
17593e519524SHoward Hinnant
1760b0386a51SErik Pilkington#if _LIBCPP_STD_VER > 14
1761b0386a51SErik Pilkington    typedef __map_node_handle<typename __base::__node, allocator_type> node_type;
1762b0386a51SErik Pilkington#endif
1763b0386a51SErik Pilkington
17645c4e07aeSErik Pilkington    template <class _Key2, class _Value2, class _Comp2, class _Alloc2>
17655c4e07aeSErik Pilkington        friend class _LIBCPP_TEMPLATE_VIS map;
17665c4e07aeSErik Pilkington    template <class _Key2, class _Value2, class _Comp2, class _Alloc2>
17675c4e07aeSErik Pilkington        friend class _LIBCPP_TEMPLATE_VIS multimap;
17685c4e07aeSErik Pilkington
1769848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
1770415a24e4SMarshall Clow    multimap()
1771415a24e4SMarshall Clow        _NOEXCEPT_(
1772415a24e4SMarshall Clow            is_nothrow_default_constructible<allocator_type>::value &&
1773415a24e4SMarshall Clow            is_nothrow_default_constructible<key_compare>::value &&
1774415a24e4SMarshall Clow            is_nothrow_copy_constructible<key_compare>::value)
1775415a24e4SMarshall Clow        : __tree_(__vc(key_compare())) {}
1776415a24e4SMarshall Clow
1777415a24e4SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
1778415a24e4SMarshall Clow    explicit multimap(const key_compare& __comp)
17791052ee39SHoward Hinnant        _NOEXCEPT_(
17801052ee39SHoward Hinnant            is_nothrow_default_constructible<allocator_type>::value &&
17811052ee39SHoward Hinnant            is_nothrow_copy_constructible<key_compare>::value)
17823e519524SHoward Hinnant        : __tree_(__vc(__comp)) {}
17833e519524SHoward Hinnant
1784848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
17853e519524SHoward Hinnant    explicit multimap(const key_compare& __comp, const allocator_type& __a)
17862a10c960SMarshall Clow        : __tree_(__vc(__comp), typename __base::allocator_type(__a)) {}
17873e519524SHoward Hinnant
17883e519524SHoward Hinnant    template <class _InputIterator>
1789848a5374SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
17903e519524SHoward Hinnant        multimap(_InputIterator __f, _InputIterator __l,
17913e519524SHoward Hinnant            const key_compare& __comp = key_compare())
17923e519524SHoward Hinnant        : __tree_(__vc(__comp))
17933e519524SHoward Hinnant        {
17943e519524SHoward Hinnant            insert(__f, __l);
17953e519524SHoward Hinnant        }
17963e519524SHoward Hinnant
17973e519524SHoward Hinnant    template <class _InputIterator>
1798848a5374SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
17993e519524SHoward Hinnant        multimap(_InputIterator __f, _InputIterator __l,
18003e519524SHoward Hinnant            const key_compare& __comp, const allocator_type& __a)
18012a10c960SMarshall Clow        : __tree_(__vc(__comp), typename __base::allocator_type(__a))
18023e519524SHoward Hinnant        {
18033e519524SHoward Hinnant            insert(__f, __l);
18043e519524SHoward Hinnant        }
18053e519524SHoward Hinnant
1806fbc317d4SMarshall Clow#if _LIBCPP_STD_VER > 11
1807fbc317d4SMarshall Clow    template <class _InputIterator>
1808fbc317d4SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
1809fbc317d4SMarshall Clow    multimap(_InputIterator __f, _InputIterator __l, const allocator_type& __a)
1810fbc317d4SMarshall Clow        : multimap(__f, __l, key_compare(), __a) {}
1811fbc317d4SMarshall Clow#endif
1812fbc317d4SMarshall Clow
1813848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
18143e519524SHoward Hinnant    multimap(const multimap& __m)
18153e519524SHoward Hinnant        : __tree_(__m.__tree_.value_comp(),
18163e519524SHoward Hinnant          __alloc_traits::select_on_container_copy_construction(__m.__tree_.__alloc()))
18173e519524SHoward Hinnant        {
18183e519524SHoward Hinnant            insert(__m.begin(), __m.end());
18193e519524SHoward Hinnant        }
18203e519524SHoward Hinnant
18215a33687dSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
18225a33687dSHoward Hinnant    multimap& operator=(const multimap& __m)
18235a33687dSHoward Hinnant        {
18242ee83725SMarshall Clow#ifndef _LIBCPP_CXX03_LANG
18255a33687dSHoward Hinnant            __tree_ = __m.__tree_;
182607d3eccdSHoward Hinnant#else
182774cf6ff5SMarshall Clow            if (this != &__m) {
182807d3eccdSHoward Hinnant                __tree_.clear();
182907d3eccdSHoward Hinnant                __tree_.value_comp() = __m.__tree_.value_comp();
183007d3eccdSHoward Hinnant                __tree_.__copy_assign_alloc(__m.__tree_);
183107d3eccdSHoward Hinnant                insert(__m.begin(), __m.end());
183274cf6ff5SMarshall Clow            }
183307d3eccdSHoward Hinnant#endif
18345a33687dSHoward Hinnant            return *this;
18355a33687dSHoward Hinnant        }
18365a33687dSHoward Hinnant
183718293116SEric Fiselier#ifndef _LIBCPP_CXX03_LANG
18383e519524SHoward Hinnant
1839848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
18403e519524SHoward Hinnant    multimap(multimap&& __m)
18411052ee39SHoward Hinnant        _NOEXCEPT_(is_nothrow_move_constructible<__base>::value)
1842ce48a113SHoward Hinnant        : __tree_(_VSTD::move(__m.__tree_))
18433e519524SHoward Hinnant        {
18443e519524SHoward Hinnant        }
18453e519524SHoward Hinnant
18463e519524SHoward Hinnant    multimap(multimap&& __m, const allocator_type& __a);
18473e519524SHoward Hinnant
1848848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
184954976f26SHoward Hinnant    multimap& operator=(multimap&& __m)
185054976f26SHoward Hinnant        _NOEXCEPT_(is_nothrow_move_assignable<__base>::value)
185154976f26SHoward Hinnant        {
185254976f26SHoward Hinnant            __tree_ = _VSTD::move(__m.__tree_);
185354976f26SHoward Hinnant            return *this;
185454976f26SHoward Hinnant        }
185554976f26SHoward Hinnant
185654976f26SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
18573e519524SHoward Hinnant    multimap(initializer_list<value_type> __il, const key_compare& __comp = key_compare())
18583e519524SHoward Hinnant        : __tree_(__vc(__comp))
18593e519524SHoward Hinnant        {
18603e519524SHoward Hinnant            insert(__il.begin(), __il.end());
18613e519524SHoward Hinnant        }
18623e519524SHoward Hinnant
1863848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
18643e519524SHoward Hinnant    multimap(initializer_list<value_type> __il, const key_compare& __comp, const allocator_type& __a)
18652a10c960SMarshall Clow        : __tree_(__vc(__comp), typename __base::allocator_type(__a))
18663e519524SHoward Hinnant        {
18673e519524SHoward Hinnant            insert(__il.begin(), __il.end());
18683e519524SHoward Hinnant        }
18693e519524SHoward Hinnant
1870fbc317d4SMarshall Clow#if _LIBCPP_STD_VER > 11
1871fbc317d4SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
1872fbc317d4SMarshall Clow    multimap(initializer_list<value_type> __il, const allocator_type& __a)
1873fbc317d4SMarshall Clow        : multimap(__il, key_compare(), __a) {}
1874fbc317d4SMarshall Clow#endif
1875fbc317d4SMarshall Clow
1876848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
18773e519524SHoward Hinnant    multimap& operator=(initializer_list<value_type> __il)
18783e519524SHoward Hinnant        {
18793e519524SHoward Hinnant            __tree_.__assign_multi(__il.begin(), __il.end());
18803e519524SHoward Hinnant            return *this;
18813e519524SHoward Hinnant        }
188254976f26SHoward Hinnant
188318293116SEric Fiselier#endif // _LIBCPP_CXX03_LANG
18843e519524SHoward Hinnant
1885848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
18863e519524SHoward Hinnant    explicit multimap(const allocator_type& __a)
18872a10c960SMarshall Clow        : __tree_(typename __base::allocator_type(__a))
18883e519524SHoward Hinnant        {
18893e519524SHoward Hinnant        }
18903e519524SHoward Hinnant
1891848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
18923e519524SHoward Hinnant    multimap(const multimap& __m, const allocator_type& __a)
18932a10c960SMarshall Clow        : __tree_(__m.__tree_.value_comp(), typename __base::allocator_type(__a))
18943e519524SHoward Hinnant        {
18953e519524SHoward Hinnant            insert(__m.begin(), __m.end());
18963e519524SHoward Hinnant        }
18973e519524SHoward Hinnant
1898848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
18997c142fccSLouis Dionne    ~multimap() {
19007c142fccSLouis Dionne        static_assert(sizeof(__diagnose_non_const_comparator<_Key, _Compare>()), "");
19017c142fccSLouis Dionne    }
19027c142fccSLouis Dionne
19037c142fccSLouis Dionne    _LIBCPP_INLINE_VISIBILITY
19041052ee39SHoward Hinnant          iterator begin() _NOEXCEPT {return __tree_.begin();}
1905848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
19061052ee39SHoward Hinnant    const_iterator begin() const _NOEXCEPT {return __tree_.begin();}
1907848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
19081052ee39SHoward Hinnant          iterator end() _NOEXCEPT {return __tree_.end();}
1909848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
19101052ee39SHoward Hinnant    const_iterator end() const _NOEXCEPT {return __tree_.end();}
19113e519524SHoward Hinnant
1912848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
19131052ee39SHoward Hinnant          reverse_iterator rbegin() _NOEXCEPT {return reverse_iterator(end());}
1914848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
19151052ee39SHoward Hinnant    const_reverse_iterator rbegin() const _NOEXCEPT
19161052ee39SHoward Hinnant        {return const_reverse_iterator(end());}
1917848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
19181052ee39SHoward Hinnant          reverse_iterator rend() _NOEXCEPT {return reverse_iterator(begin());}
1919848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
19201052ee39SHoward Hinnant    const_reverse_iterator rend() const _NOEXCEPT
19211052ee39SHoward Hinnant        {return const_reverse_iterator(begin());}
19223e519524SHoward Hinnant
1923848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
19241052ee39SHoward Hinnant    const_iterator cbegin()  const _NOEXCEPT {return begin();}
1925848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
19261052ee39SHoward Hinnant    const_iterator cend() const _NOEXCEPT {return end();}
1927848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
19281052ee39SHoward Hinnant    const_reverse_iterator crbegin() const _NOEXCEPT {return rbegin();}
1929848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
19301052ee39SHoward Hinnant    const_reverse_iterator crend() const _NOEXCEPT {return rend();}
19313e519524SHoward Hinnant
193272c8fad4SMarshall Clow    _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY
19331052ee39SHoward Hinnant    bool empty() const _NOEXCEPT {return __tree_.size() == 0;}
1934848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
19351052ee39SHoward Hinnant    size_type size() const _NOEXCEPT {return __tree_.size();}
1936848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
19371052ee39SHoward Hinnant    size_type max_size() const _NOEXCEPT {return __tree_.max_size();}
19383e519524SHoward Hinnant
1939848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
19402a10c960SMarshall Clow    allocator_type get_allocator() const _NOEXCEPT {return allocator_type(__tree_.__alloc());}
1941848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
19423e519524SHoward Hinnant    key_compare    key_comp() const {return __tree_.value_comp().key_comp();}
1943848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
19441052ee39SHoward Hinnant    value_compare  value_comp() const
19451052ee39SHoward Hinnant        {return value_compare(__tree_.value_comp().key_comp());}
19463e519524SHoward Hinnant
19475e3ea4ddSEric Fiselier#ifndef _LIBCPP_CXX03_LANG
19487609c9b6SHoward Hinnant
19498b805c91SHoward Hinnant    template <class ..._Args>
19505e3ea4ddSEric Fiselier    _LIBCPP_INLINE_VISIBILITY
19515e3ea4ddSEric Fiselier    iterator emplace(_Args&& ...__args) {
19525e3ea4ddSEric Fiselier        return __tree_.__emplace_multi(_VSTD::forward<_Args>(__args)...);
19535e3ea4ddSEric Fiselier    }
19543e519524SHoward Hinnant
19558b805c91SHoward Hinnant    template <class ..._Args>
19565e3ea4ddSEric Fiselier    _LIBCPP_INLINE_VISIBILITY
19575e3ea4ddSEric Fiselier    iterator emplace_hint(const_iterator __p, _Args&& ...__args) {
19585e3ea4ddSEric Fiselier        return __tree_.__emplace_hint_multi(__p.__i_, _VSTD::forward<_Args>(__args)...);
19595e3ea4ddSEric Fiselier    }
19607609c9b6SHoward Hinnant
1961c003db1fSHoward Hinnant    template <class _Pp,
1962c003db1fSHoward Hinnant              class = typename enable_if<is_constructible<value_type, _Pp>::value>::type>
1963848a5374SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
1964c003db1fSHoward Hinnant        iterator insert(_Pp&& __p)
1965c003db1fSHoward Hinnant            {return __tree_.__insert_multi(_VSTD::forward<_Pp>(__p));}
19663e519524SHoward Hinnant
1967c003db1fSHoward Hinnant    template <class _Pp,
1968c003db1fSHoward Hinnant              class = typename enable_if<is_constructible<value_type, _Pp>::value>::type>
1969848a5374SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
1970c003db1fSHoward Hinnant        iterator insert(const_iterator __pos, _Pp&& __p)
1971c003db1fSHoward Hinnant            {return __tree_.__insert_multi(__pos.__i_, _VSTD::forward<_Pp>(__p));}
19723e519524SHoward Hinnant
19737a9f500fSEric Fiselier    _LIBCPP_INLINE_VISIBILITY
19747a9f500fSEric Fiselier    iterator insert(value_type&& __v)
19757a9f500fSEric Fiselier        {return __tree_.__insert_multi(_VSTD::move(__v));}
19767a9f500fSEric Fiselier
19777a9f500fSEric Fiselier    _LIBCPP_INLINE_VISIBILITY
19787a9f500fSEric Fiselier    iterator insert(const_iterator __p, value_type&& __v)
19797a9f500fSEric Fiselier        {return __tree_.__insert_multi(__p.__i_, _VSTD::move(__v));}
19807a9f500fSEric Fiselier
198118293116SEric Fiselier
198218293116SEric Fiselier    _LIBCPP_INLINE_VISIBILITY
198318293116SEric Fiselier    void insert(initializer_list<value_type> __il)
198418293116SEric Fiselier        {insert(__il.begin(), __il.end());}
198518293116SEric Fiselier
19865e3ea4ddSEric Fiselier#endif // _LIBCPP_CXX03_LANG
19873e519524SHoward Hinnant
1988848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
19893e519524SHoward Hinnant    iterator insert(const value_type& __v) {return __tree_.__insert_multi(__v);}
19903e519524SHoward Hinnant
1991848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
19923e519524SHoward Hinnant    iterator insert(const_iterator __p, const value_type& __v)
19933e519524SHoward Hinnant            {return __tree_.__insert_multi(__p.__i_, __v);}
19943e519524SHoward Hinnant
19953e519524SHoward Hinnant    template <class _InputIterator>
1996848a5374SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
19973e519524SHoward Hinnant        void insert(_InputIterator __f, _InputIterator __l)
19983e519524SHoward Hinnant        {
19993e519524SHoward Hinnant            for (const_iterator __e = cend(); __f != __l; ++__f)
20003e519524SHoward Hinnant                __tree_.__insert_multi(__e.__i_, *__f);
20013e519524SHoward Hinnant        }
20023e519524SHoward Hinnant
2003848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
20043e519524SHoward Hinnant    iterator erase(const_iterator __p) {return __tree_.erase(__p.__i_);}
2005848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
2006ec392968SMarshall Clow    iterator erase(iterator __p)       {return __tree_.erase(__p.__i_);}
2007ec392968SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
20083e519524SHoward Hinnant    size_type erase(const key_type& __k) {return __tree_.__erase_multi(__k);}
2009848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
20103e519524SHoward Hinnant    iterator  erase(const_iterator __f, const_iterator __l)
20113e519524SHoward Hinnant        {return __tree_.erase(__f.__i_, __l.__i_);}
2012b0386a51SErik Pilkington
2013b0386a51SErik Pilkington#if _LIBCPP_STD_VER > 14
2014b0386a51SErik Pilkington    _LIBCPP_INLINE_VISIBILITY
2015b0386a51SErik Pilkington    iterator insert(node_type&& __nh)
2016b0386a51SErik Pilkington    {
2017b0386a51SErik Pilkington        _LIBCPP_ASSERT(__nh.empty() || __nh.get_allocator() == get_allocator(),
2018b0386a51SErik Pilkington            "node_type with incompatible allocator passed to multimap::insert()");
2019b0386a51SErik Pilkington        return __tree_.template __node_handle_insert_multi<node_type>(
2020b0386a51SErik Pilkington            _VSTD::move(__nh));
2021b0386a51SErik Pilkington    }
2022b0386a51SErik Pilkington    _LIBCPP_INLINE_VISIBILITY
2023b0386a51SErik Pilkington    iterator insert(const_iterator __hint, node_type&& __nh)
2024b0386a51SErik Pilkington    {
2025b0386a51SErik Pilkington        _LIBCPP_ASSERT(__nh.empty() || __nh.get_allocator() == get_allocator(),
2026b0386a51SErik Pilkington            "node_type with incompatible allocator passed to multimap::insert()");
2027b0386a51SErik Pilkington        return __tree_.template __node_handle_insert_multi<node_type>(
2028b0386a51SErik Pilkington            __hint.__i_, _VSTD::move(__nh));
2029b0386a51SErik Pilkington    }
2030b0386a51SErik Pilkington    _LIBCPP_INLINE_VISIBILITY
2031b0386a51SErik Pilkington    node_type extract(key_type const& __key)
2032b0386a51SErik Pilkington    {
2033b0386a51SErik Pilkington        return __tree_.template __node_handle_extract<node_type>(__key);
2034b0386a51SErik Pilkington    }
2035b0386a51SErik Pilkington    _LIBCPP_INLINE_VISIBILITY
2036b0386a51SErik Pilkington    node_type extract(const_iterator __it)
2037b0386a51SErik Pilkington    {
2038b0386a51SErik Pilkington        return __tree_.template __node_handle_extract<node_type>(
2039b0386a51SErik Pilkington            __it.__i_);
2040b0386a51SErik Pilkington    }
20418df1d5a5SLouis Dionne    template <class _Compare2>
20425c4e07aeSErik Pilkington    _LIBCPP_INLINE_VISIBILITY
20438df1d5a5SLouis Dionne    void merge(multimap<key_type, mapped_type, _Compare2, allocator_type>& __source)
20445c4e07aeSErik Pilkington    {
20455c4e07aeSErik Pilkington        _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
20465c4e07aeSErik Pilkington                       "merging container with incompatible allocator");
20475c4e07aeSErik Pilkington        return __tree_.__node_handle_merge_multi(__source.__tree_);
20485c4e07aeSErik Pilkington    }
20498df1d5a5SLouis Dionne    template <class _Compare2>
20505c4e07aeSErik Pilkington    _LIBCPP_INLINE_VISIBILITY
20518df1d5a5SLouis Dionne    void merge(multimap<key_type, mapped_type, _Compare2, allocator_type>&& __source)
20525c4e07aeSErik Pilkington    {
20535c4e07aeSErik Pilkington        _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
20545c4e07aeSErik Pilkington                       "merging container with incompatible allocator");
20555c4e07aeSErik Pilkington        return __tree_.__node_handle_merge_multi(__source.__tree_);
20565c4e07aeSErik Pilkington    }
20578df1d5a5SLouis Dionne    template <class _Compare2>
20585c4e07aeSErik Pilkington    _LIBCPP_INLINE_VISIBILITY
20598df1d5a5SLouis Dionne    void merge(map<key_type, mapped_type, _Compare2, allocator_type>& __source)
20605c4e07aeSErik Pilkington    {
20615c4e07aeSErik Pilkington        _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
20625c4e07aeSErik Pilkington                       "merging container with incompatible allocator");
20635c4e07aeSErik Pilkington        return __tree_.__node_handle_merge_multi(__source.__tree_);
20645c4e07aeSErik Pilkington    }
20658df1d5a5SLouis Dionne    template <class _Compare2>
20665c4e07aeSErik Pilkington    _LIBCPP_INLINE_VISIBILITY
20678df1d5a5SLouis Dionne    void merge(map<key_type, mapped_type, _Compare2, allocator_type>&& __source)
20685c4e07aeSErik Pilkington    {
20695c4e07aeSErik Pilkington        _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
20705c4e07aeSErik Pilkington                       "merging container with incompatible allocator");
20715c4e07aeSErik Pilkington        return __tree_.__node_handle_merge_multi(__source.__tree_);
20725c4e07aeSErik Pilkington    }
2073b0386a51SErik Pilkington#endif
2074b0386a51SErik Pilkington
2075848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
2076934e9a39SMarshall Clow    void clear() _NOEXCEPT {__tree_.clear();}
20773e519524SHoward Hinnant
2078848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
20791052ee39SHoward Hinnant    void swap(multimap& __m)
20801052ee39SHoward Hinnant        _NOEXCEPT_(__is_nothrow_swappable<__base>::value)
20811052ee39SHoward Hinnant        {__tree_.swap(__m.__tree_);}
20823e519524SHoward Hinnant
2083848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
20843e519524SHoward Hinnant    iterator find(const key_type& __k)             {return __tree_.find(__k);}
2085848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
20863e519524SHoward Hinnant    const_iterator find(const key_type& __k) const {return __tree_.find(__k);}
20872585835cSMarshall Clow#if _LIBCPP_STD_VER > 11
20882585835cSMarshall Clow    template <typename _K2>
20892585835cSMarshall Clow    _LIBCPP_INLINE_VISIBILITY
20902585835cSMarshall Clow    typename enable_if<__is_transparent<_Compare, _K2>::value,iterator>::type
20912585835cSMarshall Clow    find(const _K2& __k)                           {return __tree_.find(__k);}
20922585835cSMarshall Clow    template <typename _K2>
20932585835cSMarshall Clow    _LIBCPP_INLINE_VISIBILITY
20942585835cSMarshall Clow    typename enable_if<__is_transparent<_Compare, _K2>::value,const_iterator>::type
20952585835cSMarshall Clow    find(const _K2& __k) const                     {return __tree_.find(__k);}
20962585835cSMarshall Clow#endif
20972585835cSMarshall Clow
2098848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
20993e519524SHoward Hinnant    size_type      count(const key_type& __k) const
21003e519524SHoward Hinnant        {return __tree_.__count_multi(__k);}
21010aacbc92SMarshall Clow#if _LIBCPP_STD_VER > 11
21020aacbc92SMarshall Clow    template <typename _K2>
21030aacbc92SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
21040aacbc92SMarshall Clow    typename enable_if<__is_transparent<_Compare, _K2>::value,size_type>::type
2105f8457a07SMarshall Clow    count(const _K2& __k) const {return __tree_.__count_multi(__k);}
21060aacbc92SMarshall Clow#endif
2107a17b1aedSZoe Carver
2108a17b1aedSZoe Carver#if _LIBCPP_STD_VER > 17
2109a17b1aedSZoe Carver    _LIBCPP_INLINE_VISIBILITY
2110a17b1aedSZoe Carver    bool contains(const key_type& __k) const {return find(__k) != end();}
21113fca07d7SMarek Kurdej    template <typename _K2>
21123fca07d7SMarek Kurdej    _LIBCPP_INLINE_VISIBILITY
21133fca07d7SMarek Kurdej    typename enable_if<__is_transparent<_Compare, _K2>::value, bool>::type
21143fca07d7SMarek Kurdej    contains(const _K2& __k) const { return find(__k) != end(); }
2115a17b1aedSZoe Carver#endif // _LIBCPP_STD_VER > 17
2116a17b1aedSZoe Carver
2117848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
21183e519524SHoward Hinnant    iterator lower_bound(const key_type& __k)
21193e519524SHoward Hinnant        {return __tree_.lower_bound(__k);}
2120848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
21213e519524SHoward Hinnant    const_iterator lower_bound(const key_type& __k) const
21223e519524SHoward Hinnant            {return __tree_.lower_bound(__k);}
21232585835cSMarshall Clow#if _LIBCPP_STD_VER > 11
21242585835cSMarshall Clow    template <typename _K2>
21252585835cSMarshall Clow    _LIBCPP_INLINE_VISIBILITY
21262585835cSMarshall Clow    typename enable_if<__is_transparent<_Compare, _K2>::value,iterator>::type
21272585835cSMarshall Clow    lower_bound(const _K2& __k)       {return __tree_.lower_bound(__k);}
21282585835cSMarshall Clow
21292585835cSMarshall Clow    template <typename _K2>
21302585835cSMarshall Clow    _LIBCPP_INLINE_VISIBILITY
21312585835cSMarshall Clow    typename enable_if<__is_transparent<_Compare, _K2>::value,const_iterator>::type
21322585835cSMarshall Clow    lower_bound(const _K2& __k) const {return __tree_.lower_bound(__k);}
21332585835cSMarshall Clow#endif
21342585835cSMarshall Clow
2135848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
21363e519524SHoward Hinnant    iterator upper_bound(const key_type& __k)
21373e519524SHoward Hinnant            {return __tree_.upper_bound(__k);}
2138848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
21393e519524SHoward Hinnant    const_iterator upper_bound(const key_type& __k) const
21403e519524SHoward Hinnant            {return __tree_.upper_bound(__k);}
21412585835cSMarshall Clow#if _LIBCPP_STD_VER > 11
21422585835cSMarshall Clow    template <typename _K2>
21432585835cSMarshall Clow    _LIBCPP_INLINE_VISIBILITY
21442585835cSMarshall Clow    typename enable_if<__is_transparent<_Compare, _K2>::value,iterator>::type
21452585835cSMarshall Clow    upper_bound(const _K2& __k)       {return __tree_.upper_bound(__k);}
21462585835cSMarshall Clow    template <typename _K2>
21472585835cSMarshall Clow    _LIBCPP_INLINE_VISIBILITY
21482585835cSMarshall Clow    typename enable_if<__is_transparent<_Compare, _K2>::value,const_iterator>::type
21492585835cSMarshall Clow    upper_bound(const _K2& __k) const {return __tree_.upper_bound(__k);}
21502585835cSMarshall Clow#endif
21512585835cSMarshall Clow
2152848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
21533e519524SHoward Hinnant    pair<iterator,iterator>             equal_range(const key_type& __k)
21543e519524SHoward Hinnant            {return __tree_.__equal_range_multi(__k);}
2155848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
21563e519524SHoward Hinnant    pair<const_iterator,const_iterator> equal_range(const key_type& __k) const
21573e519524SHoward Hinnant            {return __tree_.__equal_range_multi(__k);}
21582585835cSMarshall Clow#if _LIBCPP_STD_VER > 11
21592585835cSMarshall Clow    template <typename _K2>
21602585835cSMarshall Clow    _LIBCPP_INLINE_VISIBILITY
21612585835cSMarshall Clow    typename enable_if<__is_transparent<_Compare, _K2>::value,pair<iterator,iterator>>::type
21622585835cSMarshall Clow    equal_range(const _K2& __k)       {return __tree_.__equal_range_multi(__k);}
21632585835cSMarshall Clow    template <typename _K2>
21642585835cSMarshall Clow    _LIBCPP_INLINE_VISIBILITY
21652585835cSMarshall Clow    typename enable_if<__is_transparent<_Compare, _K2>::value,pair<const_iterator,const_iterator>>::type
21662585835cSMarshall Clow    equal_range(const _K2& __k) const {return __tree_.__equal_range_multi(__k);}
21672585835cSMarshall Clow#endif
21683e519524SHoward Hinnant
21693e519524SHoward Hinnantprivate:
21703e519524SHoward Hinnant    typedef typename __base::__node                    __node;
21713e519524SHoward Hinnant    typedef typename __base::__node_allocator          __node_allocator;
21723e519524SHoward Hinnant    typedef typename __base::__node_pointer            __node_pointer;
21730594ad71SEric Fiselier
2174c003db1fSHoward Hinnant    typedef __map_node_destructor<__node_allocator> _Dp;
2175c003db1fSHoward Hinnant    typedef unique_ptr<__node, _Dp> __node_holder;
21763e519524SHoward Hinnant};
21773e519524SHoward Hinnant
217801666904SLouis Dionne#if _LIBCPP_STD_VER >= 17
2179f2f7d72fSLouis Dionnetemplate<class _InputIterator, class _Compare = less<__iter_key_type<_InputIterator>>,
2180f2f7d72fSLouis Dionne         class _Allocator = allocator<__iter_to_alloc_type<_InputIterator>>,
2181*4e0ea2cfSLouis Dionne         class = enable_if_t<!__is_allocator<_Compare>::value, void>,
2182*4e0ea2cfSLouis Dionne         class = enable_if_t<__is_allocator<_Allocator>::value, void>>
2183f2f7d72fSLouis Dionnemultimap(_InputIterator, _InputIterator, _Compare = _Compare(), _Allocator = _Allocator())
2184f2f7d72fSLouis Dionne  -> multimap<__iter_key_type<_InputIterator>, __iter_mapped_type<_InputIterator>, _Compare, _Allocator>;
2185f2f7d72fSLouis Dionne
2186f2f7d72fSLouis Dionnetemplate<class _Key, class _Tp, class _Compare = less<remove_const_t<_Key>>,
2187f2f7d72fSLouis Dionne         class _Allocator = allocator<pair<const _Key, _Tp>>,
2188*4e0ea2cfSLouis Dionne         class = enable_if_t<!__is_allocator<_Compare>::value, void>,
2189*4e0ea2cfSLouis Dionne         class = enable_if_t<__is_allocator<_Allocator>::value, void>>
2190f2f7d72fSLouis Dionnemultimap(initializer_list<pair<_Key, _Tp>>, _Compare = _Compare(), _Allocator = _Allocator())
2191f2f7d72fSLouis Dionne  -> multimap<remove_const_t<_Key>, _Tp, _Compare, _Allocator>;
2192f2f7d72fSLouis Dionne
2193f2f7d72fSLouis Dionnetemplate<class _InputIterator, class _Allocator,
2194*4e0ea2cfSLouis Dionne         class = enable_if_t<__is_allocator<_Allocator>::value, void>>
2195f2f7d72fSLouis Dionnemultimap(_InputIterator, _InputIterator, _Allocator)
2196f2f7d72fSLouis Dionne  -> multimap<__iter_key_type<_InputIterator>, __iter_mapped_type<_InputIterator>,
2197f2f7d72fSLouis Dionne         less<__iter_key_type<_InputIterator>>, _Allocator>;
2198f2f7d72fSLouis Dionne
2199f2f7d72fSLouis Dionnetemplate<class _Key, class _Tp, class _Allocator,
2200*4e0ea2cfSLouis Dionne         class = enable_if_t<__is_allocator<_Allocator>::value, void>>
2201f2f7d72fSLouis Dionnemultimap(initializer_list<pair<_Key, _Tp>>, _Allocator)
2202f2f7d72fSLouis Dionne  -> multimap<remove_const_t<_Key>, _Tp, less<remove_const_t<_Key>>, _Allocator>;
2203f2f7d72fSLouis Dionne#endif
2204f2f7d72fSLouis Dionne
22055e3ea4ddSEric Fiselier#ifndef _LIBCPP_CXX03_LANG
22063e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator>
22073e519524SHoward Hinnantmultimap<_Key, _Tp, _Compare, _Allocator>::multimap(multimap&& __m, const allocator_type& __a)
22082a10c960SMarshall Clow    : __tree_(_VSTD::move(__m.__tree_), typename __base::allocator_type(__a))
22093e519524SHoward Hinnant{
22103e519524SHoward Hinnant    if (__a != __m.get_allocator())
22113e519524SHoward Hinnant    {
22123e519524SHoward Hinnant        const_iterator __e = cend();
22133e519524SHoward Hinnant        while (!__m.empty())
22143e519524SHoward Hinnant            __tree_.__insert_multi(__e.__i_,
2215f52318b4SErik Pilkington                    _VSTD::move(__m.__tree_.remove(__m.begin().__i_)->__value_.__move()));
22163e519524SHoward Hinnant    }
22173e519524SHoward Hinnant}
22185e3ea4ddSEric Fiselier#endif
22193e519524SHoward Hinnant
22203e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator>
2221848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
22223e519524SHoward Hinnantbool
22233e519524SHoward Hinnantoperator==(const multimap<_Key, _Tp, _Compare, _Allocator>& __x,
22243e519524SHoward Hinnant           const multimap<_Key, _Tp, _Compare, _Allocator>& __y)
22253e519524SHoward Hinnant{
2226ce48a113SHoward Hinnant    return __x.size() == __y.size() && _VSTD::equal(__x.begin(), __x.end(), __y.begin());
22273e519524SHoward Hinnant}
22283e519524SHoward Hinnant
22293e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator>
2230848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
22313e519524SHoward Hinnantbool
22323e519524SHoward Hinnantoperator< (const multimap<_Key, _Tp, _Compare, _Allocator>& __x,
22333e519524SHoward Hinnant           const multimap<_Key, _Tp, _Compare, _Allocator>& __y)
22343e519524SHoward Hinnant{
2235ce48a113SHoward Hinnant    return _VSTD::lexicographical_compare(__x.begin(), __x.end(), __y.begin(), __y.end());
22363e519524SHoward Hinnant}
22373e519524SHoward Hinnant
22383e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator>
2239848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
22403e519524SHoward Hinnantbool
22413e519524SHoward Hinnantoperator!=(const multimap<_Key, _Tp, _Compare, _Allocator>& __x,
22423e519524SHoward Hinnant           const multimap<_Key, _Tp, _Compare, _Allocator>& __y)
22433e519524SHoward Hinnant{
22443e519524SHoward Hinnant    return !(__x == __y);
22453e519524SHoward Hinnant}
22463e519524SHoward Hinnant
22473e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator>
2248848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
22493e519524SHoward Hinnantbool
22503e519524SHoward Hinnantoperator> (const multimap<_Key, _Tp, _Compare, _Allocator>& __x,
22513e519524SHoward Hinnant           const multimap<_Key, _Tp, _Compare, _Allocator>& __y)
22523e519524SHoward Hinnant{
22533e519524SHoward Hinnant    return __y < __x;
22543e519524SHoward Hinnant}
22553e519524SHoward Hinnant
22563e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator>
2257848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
22583e519524SHoward Hinnantbool
22593e519524SHoward Hinnantoperator>=(const multimap<_Key, _Tp, _Compare, _Allocator>& __x,
22603e519524SHoward Hinnant           const multimap<_Key, _Tp, _Compare, _Allocator>& __y)
22613e519524SHoward Hinnant{
22623e519524SHoward Hinnant    return !(__x < __y);
22633e519524SHoward Hinnant}
22643e519524SHoward Hinnant
22653e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator>
2266848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
22673e519524SHoward Hinnantbool
22683e519524SHoward Hinnantoperator<=(const multimap<_Key, _Tp, _Compare, _Allocator>& __x,
22693e519524SHoward Hinnant           const multimap<_Key, _Tp, _Compare, _Allocator>& __y)
22703e519524SHoward Hinnant{
22713e519524SHoward Hinnant    return !(__y < __x);
22723e519524SHoward Hinnant}
22733e519524SHoward Hinnant
22743e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator>
2275848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
22763e519524SHoward Hinnantvoid
22773e519524SHoward Hinnantswap(multimap<_Key, _Tp, _Compare, _Allocator>& __x,
22783e519524SHoward Hinnant     multimap<_Key, _Tp, _Compare, _Allocator>& __y)
22791052ee39SHoward Hinnant    _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
22803e519524SHoward Hinnant{
22813e519524SHoward Hinnant    __x.swap(__y);
22823e519524SHoward Hinnant}
22833e519524SHoward Hinnant
2284f60c63c0SMarshall Clow#if _LIBCPP_STD_VER > 17
22853e895085SMarek Kurdejtemplate <class _Key, class _Tp, class _Compare, class _Allocator,
22863e895085SMarek Kurdej          class _Predicate>
2287f60c63c0SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY
22883e895085SMarek Kurdej    typename multimap<_Key, _Tp, _Compare, _Allocator>::size_type
22893e895085SMarek Kurdej    erase_if(multimap<_Key, _Tp, _Compare, _Allocator>& __c,
22903e895085SMarek Kurdej             _Predicate __pred) {
22912ac6babcSArthur O'Dwyer  return _VSTD::__libcpp_erase_if_container(__c, __pred);
22923e895085SMarek Kurdej}
2293f60c63c0SMarshall Clow#endif
2294f60c63c0SMarshall Clow
22953e519524SHoward Hinnant_LIBCPP_END_NAMESPACE_STD
22963e519524SHoward Hinnant
22973e519524SHoward Hinnant#endif // _LIBCPP_MAP
2298