xref: /llvm-project-15.0.7/libcxx/include/map (revision b48c5010)
13e519524SHoward Hinnant// -*- C++ -*-
2eb8650a7SLouis Dionne//===----------------------------------------------------------------------===//
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
22668072a71SKonstantin Varlamovtemplate <class InputIterator,
22768072a71SKonstantin Varlamov      class Compare = less<iter_key_t<InputIterator>>,
22868072a71SKonstantin Varlamov      class Allocator = allocator<iter_to_alloc_t<InputIterator>>>
22968072a71SKonstantin Varlamovmap(InputIterator, InputIterator, Compare = Compare(), Allocator = Allocator())
23068072a71SKonstantin Varlamov  -> map<iter_key_t<InputIterator>, iter_val_t<InputIterator>, Compare, Allocator>; // C++17
23168072a71SKonstantin Varlamov
23268072a71SKonstantin Varlamovtemplate<class Key, class T, class Compare = less<Key>,
23368072a71SKonstantin Varlamov    class Allocator = allocator<pair<const Key, T>>>
23468072a71SKonstantin Varlamovmap(initializer_list<pair<const Key, T>>, Compare = Compare(), Allocator = Allocator())
23568072a71SKonstantin Varlamov  -> map<Key, T, Compare, Allocator>; // C++17
23668072a71SKonstantin Varlamov
23768072a71SKonstantin Varlamovtemplate <class InputIterator, class Allocator>
23868072a71SKonstantin Varlamovmap(InputIterator, InputIterator, Allocator)
23968072a71SKonstantin Varlamov  -> map<iter_key_t<InputIterator>, iter_val_t<InputIterator>, less<iter_key_t<InputIterator>>,
24068072a71SKonstantin Varlamov    Allocator>; // C++17
24168072a71SKonstantin Varlamov
24268072a71SKonstantin Varlamovtemplate<class Key, class T, class Allocator>
24368072a71SKonstantin Varlamovmap(initializer_list<pair<const Key, T>>, Allocator) -> map<Key, T, less<Key>, Allocator>; // C++17
24468072a71SKonstantin Varlamov
2453e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator>
2463e519524SHoward Hinnantbool
2473e519524SHoward Hinnantoperator==(const map<Key, T, Compare, Allocator>& x,
2483e519524SHoward Hinnant           const map<Key, T, Compare, Allocator>& y);
2493e519524SHoward Hinnant
2503e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator>
2513e519524SHoward Hinnantbool
2523e519524SHoward Hinnantoperator< (const map<Key, T, Compare, Allocator>& x,
2533e519524SHoward Hinnant           const map<Key, T, Compare, Allocator>& y);
2543e519524SHoward Hinnant
2553e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator>
2563e519524SHoward Hinnantbool
2573e519524SHoward Hinnantoperator!=(const map<Key, T, Compare, Allocator>& x,
2583e519524SHoward Hinnant           const map<Key, T, Compare, Allocator>& y);
2593e519524SHoward Hinnant
2603e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator>
2613e519524SHoward Hinnantbool
2623e519524SHoward Hinnantoperator> (const map<Key, T, Compare, Allocator>& x,
2633e519524SHoward Hinnant           const map<Key, T, Compare, Allocator>& y);
2643e519524SHoward Hinnant
2653e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator>
2663e519524SHoward Hinnantbool
2673e519524SHoward Hinnantoperator>=(const map<Key, T, Compare, Allocator>& x,
2683e519524SHoward Hinnant           const map<Key, T, Compare, Allocator>& y);
2693e519524SHoward Hinnant
2703e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator>
2713e519524SHoward Hinnantbool
2723e519524SHoward Hinnantoperator<=(const map<Key, T, Compare, Allocator>& x,
2733e519524SHoward Hinnant           const map<Key, T, Compare, Allocator>& y);
2743e519524SHoward Hinnant
2753e519524SHoward Hinnant// specialized algorithms:
2763e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator>
2773e519524SHoward Hinnantvoid
2781052ee39SHoward Hinnantswap(map<Key, T, Compare, Allocator>& x, map<Key, T, Compare, Allocator>& y)
2791052ee39SHoward Hinnant    noexcept(noexcept(x.swap(y)));
2803e519524SHoward Hinnant
281f60c63c0SMarshall Clowtemplate <class Key, class T, class Compare, class Allocator, class Predicate>
2823e895085SMarek Kurdejtypename map<Key, T, Compare, Allocator>::size_type
2833e895085SMarek Kurdejerase_if(map<Key, T, Compare, Allocator>& c, Predicate pred);  // C++20
284f60c63c0SMarshall Clow
285f60c63c0SMarshall Clow
2863e519524SHoward Hinnanttemplate <class Key, class T, class Compare = less<Key>,
2873e519524SHoward Hinnant          class Allocator = allocator<pair<const Key, T>>>
2883e519524SHoward Hinnantclass multimap
2893e519524SHoward Hinnant{
2903e519524SHoward Hinnantpublic:
2913e519524SHoward Hinnant    // types:
2923e519524SHoward Hinnant    typedef Key                                      key_type;
2933e519524SHoward Hinnant    typedef T                                        mapped_type;
2943e519524SHoward Hinnant    typedef pair<const key_type,mapped_type>         value_type;
2953e519524SHoward Hinnant    typedef Compare                                  key_compare;
2963e519524SHoward Hinnant    typedef Allocator                                allocator_type;
2973e519524SHoward Hinnant    typedef typename allocator_type::reference       reference;
2983e519524SHoward Hinnant    typedef typename allocator_type::const_reference const_reference;
2993e519524SHoward Hinnant    typedef typename allocator_type::size_type       size_type;
3003e519524SHoward Hinnant    typedef typename allocator_type::difference_type difference_type;
3013e519524SHoward Hinnant    typedef typename allocator_type::pointer         pointer;
3023e519524SHoward Hinnant    typedef typename allocator_type::const_pointer   const_pointer;
3033e519524SHoward Hinnant
3043e519524SHoward Hinnant    typedef implementation-defined                   iterator;
3053e519524SHoward Hinnant    typedef implementation-defined                   const_iterator;
3063e519524SHoward Hinnant    typedef std::reverse_iterator<iterator>          reverse_iterator;
3073e519524SHoward Hinnant    typedef std::reverse_iterator<const_iterator>    const_reverse_iterator;
308b0386a51SErik Pilkington    typedef unspecified                              node_type;              // C++17
3093e519524SHoward Hinnant
3103e519524SHoward Hinnant    class value_compare
3113e519524SHoward Hinnant    {
3123e519524SHoward Hinnant        friend class multimap;
3133e519524SHoward Hinnant    protected:
3143e519524SHoward Hinnant        key_compare comp;
3153e519524SHoward Hinnant        value_compare(key_compare c);
3163e519524SHoward Hinnant    public:
317dc066888SArthur O'Dwyer        typedef bool result_type;  // deprecated in C++17, removed in C++20
318dc066888SArthur O'Dwyer        typedef value_type first_argument_type;  // deprecated in C++17, removed in C++20
319dc066888SArthur O'Dwyer        typedef value_type second_argument_type;  // deprecated in C++17, removed in C++20
3203e519524SHoward Hinnant        bool operator()(const value_type& x, const value_type& y) const;
3213e519524SHoward Hinnant    };
3223e519524SHoward Hinnant
3233e519524SHoward Hinnant    // construct/copy/destroy:
3241052ee39SHoward Hinnant    multimap()
3251052ee39SHoward Hinnant        noexcept(
3261052ee39SHoward Hinnant            is_nothrow_default_constructible<allocator_type>::value &&
3271052ee39SHoward Hinnant            is_nothrow_default_constructible<key_compare>::value &&
3281052ee39SHoward Hinnant            is_nothrow_copy_constructible<key_compare>::value);
3291052ee39SHoward Hinnant    explicit multimap(const key_compare& comp);
3303e519524SHoward Hinnant    multimap(const key_compare& comp, const allocator_type& a);
3313e519524SHoward Hinnant    template <class InputIterator>
3323e519524SHoward Hinnant        multimap(InputIterator first, InputIterator last, const key_compare& comp);
3333e519524SHoward Hinnant    template <class InputIterator>
3343e519524SHoward Hinnant        multimap(InputIterator first, InputIterator last, const key_compare& comp,
3353e519524SHoward Hinnant                 const allocator_type& a);
3363e519524SHoward Hinnant    multimap(const multimap& m);
3371052ee39SHoward Hinnant    multimap(multimap&& m)
3381052ee39SHoward Hinnant        noexcept(
3391052ee39SHoward Hinnant            is_nothrow_move_constructible<allocator_type>::value &&
3401052ee39SHoward Hinnant            is_nothrow_move_constructible<key_compare>::value);
3413e519524SHoward Hinnant    explicit multimap(const allocator_type& a);
3423e519524SHoward Hinnant    multimap(const multimap& m, const allocator_type& a);
3433e519524SHoward Hinnant    multimap(multimap&& m, const allocator_type& a);
3443e519524SHoward Hinnant    multimap(initializer_list<value_type> il, const key_compare& comp = key_compare());
3453e519524SHoward Hinnant    multimap(initializer_list<value_type> il, const key_compare& comp,
3463e519524SHoward Hinnant             const allocator_type& a);
347fbc317d4SMarshall Clow    template <class InputIterator>
348fbc317d4SMarshall Clow        multimap(InputIterator first, InputIterator last, const allocator_type& a)
349fbc317d4SMarshall Clow            : multimap(first, last, Compare(), a) {} // C++14
350fbc317d4SMarshall Clow    multimap(initializer_list<value_type> il, const allocator_type& a)
351fbc317d4SMarshall Clow        : multimap(il, Compare(), a) {} // C++14
3523e519524SHoward Hinnant    ~multimap();
3533e519524SHoward Hinnant
3543e519524SHoward Hinnant    multimap& operator=(const multimap& m);
3551052ee39SHoward Hinnant    multimap& operator=(multimap&& m)
3561052ee39SHoward Hinnant        noexcept(
3571052ee39SHoward Hinnant            allocator_type::propagate_on_container_move_assignment::value &&
3581052ee39SHoward Hinnant            is_nothrow_move_assignable<allocator_type>::value &&
3590e9f71c1SHoward Hinnant            is_nothrow_move_assignable<key_compare>::value);
3603e519524SHoward Hinnant    multimap& operator=(initializer_list<value_type> il);
3613e519524SHoward Hinnant
3623e519524SHoward Hinnant    // iterators:
3630e9f71c1SHoward Hinnant          iterator begin() noexcept;
3640e9f71c1SHoward Hinnant    const_iterator begin() const noexcept;
3650e9f71c1SHoward Hinnant          iterator end() noexcept;
3660e9f71c1SHoward Hinnant    const_iterator end()   const noexcept;
3673e519524SHoward Hinnant
3680e9f71c1SHoward Hinnant          reverse_iterator rbegin() noexcept;
3690e9f71c1SHoward Hinnant    const_reverse_iterator rbegin() const noexcept;
3700e9f71c1SHoward Hinnant          reverse_iterator rend() noexcept;
3710e9f71c1SHoward Hinnant    const_reverse_iterator rend()   const noexcept;
3723e519524SHoward Hinnant
3730e9f71c1SHoward Hinnant    const_iterator         cbegin()  const noexcept;
3740e9f71c1SHoward Hinnant    const_iterator         cend()    const noexcept;
3750e9f71c1SHoward Hinnant    const_reverse_iterator crbegin() const noexcept;
3760e9f71c1SHoward Hinnant    const_reverse_iterator crend()   const noexcept;
3773e519524SHoward Hinnant
3783e519524SHoward Hinnant    // capacity:
3790e9f71c1SHoward Hinnant    bool      empty()    const noexcept;
3800e9f71c1SHoward Hinnant    size_type size()     const noexcept;
3810e9f71c1SHoward Hinnant    size_type max_size() const noexcept;
3823e519524SHoward Hinnant
3833e519524SHoward Hinnant    // modifiers:
3843e519524SHoward Hinnant    template <class... Args>
3853e519524SHoward Hinnant        iterator emplace(Args&&... args);
3863e519524SHoward Hinnant    template <class... Args>
3873e519524SHoward Hinnant        iterator emplace_hint(const_iterator position, Args&&... args);
3883e519524SHoward Hinnant    iterator insert(const value_type& v);
389afc9ff99SMarshall Clow    iterator insert(      value_type&& v);                                            // C++17
3903e519524SHoward Hinnant    template <class P>
3913e519524SHoward Hinnant        iterator insert(P&& p);
3923e519524SHoward Hinnant    iterator insert(const_iterator position, const value_type& v);
393afc9ff99SMarshall Clow    iterator insert(const_iterator position,       value_type&& v);                   // C++17
3943e519524SHoward Hinnant    template <class P>
3953e519524SHoward Hinnant        iterator insert(const_iterator position, P&& p);
3963e519524SHoward Hinnant    template <class InputIterator>
3973e519524SHoward Hinnant        void insert(InputIterator first, InputIterator last);
3983e519524SHoward Hinnant    void insert(initializer_list<value_type> il);
3993e519524SHoward Hinnant
400b0386a51SErik Pilkington    node_type extract(const_iterator position);                                       // C++17
401b0386a51SErik Pilkington    node_type extract(const key_type& x);                                             // C++17
402b0386a51SErik Pilkington    iterator insert(node_type&& nh);                                                  // C++17
403b0386a51SErik Pilkington    iterator insert(const_iterator hint, node_type&& nh);                             // C++17
404b0386a51SErik Pilkington
4053e519524SHoward Hinnant    iterator  erase(const_iterator position);
406ec392968SMarshall Clow    iterator  erase(iterator position); // C++14
4073e519524SHoward Hinnant    size_type erase(const key_type& k);
4083e519524SHoward Hinnant    iterator  erase(const_iterator first, const_iterator last);
4090e9f71c1SHoward Hinnant    void clear() noexcept;
4103e519524SHoward Hinnant
4115c4e07aeSErik Pilkington    template<class C2>
4125c4e07aeSErik Pilkington      void merge(multimap<Key, T, C2, Allocator>& source);    // C++17
4135c4e07aeSErik Pilkington    template<class C2>
4145c4e07aeSErik Pilkington      void merge(multimap<Key, T, C2, Allocator>&& source);   // C++17
4155c4e07aeSErik Pilkington    template<class C2>
4165c4e07aeSErik Pilkington      void merge(map<Key, T, C2, Allocator>& source);         // C++17
4175c4e07aeSErik Pilkington    template<class C2>
4185c4e07aeSErik Pilkington      void merge(map<Key, T, C2, Allocator>&& source);        // C++17
4195c4e07aeSErik Pilkington
4201052ee39SHoward Hinnant    void swap(multimap& m)
421e3fbe143SMarshall Clow        noexcept(allocator_traits<allocator_type>::is_always_equal::value &&
422f07dd8d0SEric Fiselier            is_nothrow_swappable<key_compare>::value); // C++17
4233e519524SHoward Hinnant
4243e519524SHoward Hinnant    // observers:
4250e9f71c1SHoward Hinnant    allocator_type get_allocator() const noexcept;
4263e519524SHoward Hinnant    key_compare    key_comp()      const;
4273e519524SHoward Hinnant    value_compare  value_comp()    const;
4283e519524SHoward Hinnant
4293e519524SHoward Hinnant    // map operations:
4303e519524SHoward Hinnant          iterator find(const key_type& k);
4313e519524SHoward Hinnant    const_iterator find(const key_type& k) const;
4322585835cSMarshall Clow    template<typename K>
4332585835cSMarshall Clow        iterator find(const K& x);              // C++14
4342585835cSMarshall Clow    template<typename K>
4352585835cSMarshall Clow        const_iterator find(const K& x) const;  // C++14
4363fca07d7SMarek Kurdej
4372585835cSMarshall Clow    template<typename K>
4380aacbc92SMarshall Clow      size_type count(const K& x) const;        // C++14
4393e519524SHoward Hinnant    size_type      count(const key_type& k) const;
4403fca07d7SMarek Kurdej
441a17b1aedSZoe Carver    bool           contains(const key_type& x) const;  // C++20
4423fca07d7SMarek Kurdej    template<class K> bool contains(const K& x) const; // C++20
4433fca07d7SMarek Kurdej
4443e519524SHoward Hinnant          iterator lower_bound(const key_type& k);
4453e519524SHoward Hinnant    const_iterator lower_bound(const key_type& k) const;
4462585835cSMarshall Clow    template<typename K>
4472585835cSMarshall Clow        iterator lower_bound(const K& x);              // C++14
4482585835cSMarshall Clow    template<typename K>
4492585835cSMarshall Clow        const_iterator lower_bound(const K& x) const;  // C++14
4502585835cSMarshall Clow
4513e519524SHoward Hinnant          iterator upper_bound(const key_type& k);
4523e519524SHoward Hinnant    const_iterator upper_bound(const key_type& k) const;
4532585835cSMarshall Clow    template<typename K>
4542585835cSMarshall Clow        iterator upper_bound(const K& x);              // C++14
4552585835cSMarshall Clow    template<typename K>
4562585835cSMarshall Clow        const_iterator upper_bound(const K& x) const;  // C++14
4572585835cSMarshall Clow
4583e519524SHoward Hinnant    pair<iterator,iterator>             equal_range(const key_type& k);
4593e519524SHoward Hinnant    pair<const_iterator,const_iterator> equal_range(const key_type& k) const;
4602585835cSMarshall Clow    template<typename K>
4612585835cSMarshall Clow        pair<iterator,iterator>             equal_range(const K& x);        // C++14
4622585835cSMarshall Clow    template<typename K>
4632585835cSMarshall Clow        pair<const_iterator,const_iterator> equal_range(const K& x) const;  // C++14
4643e519524SHoward Hinnant};
4653e519524SHoward Hinnant
46668072a71SKonstantin Varlamovtemplate <class InputIterator,
46768072a71SKonstantin Varlamov      class Compare = less<iter_key_t<InputIterator>>,
46868072a71SKonstantin Varlamov      class Allocator = allocator<iter_to_alloc_t<InputIterator>>>
46968072a71SKonstantin Varlamovmultimap(InputIterator, InputIterator, Compare = Compare(), Allocator = Allocator())
47068072a71SKonstantin Varlamov  -> multimap<iter_key_t<InputIterator>, iter_val_t<InputIterator>, Compare, Allocator>; // C++17
47168072a71SKonstantin Varlamov
47268072a71SKonstantin Varlamovtemplate<class Key, class T, class Compare = less<Key>,
47368072a71SKonstantin Varlamov    class Allocator = allocator<pair<const Key, T>>>
47468072a71SKonstantin Varlamovmultimap(initializer_list<pair<const Key, T>>, Compare = Compare(), Allocator = Allocator())
47568072a71SKonstantin Varlamov  -> multimap<Key, T, Compare, Allocator>; // C++17
47668072a71SKonstantin Varlamov
47768072a71SKonstantin Varlamovtemplate <class InputIterator, class Allocator>
47868072a71SKonstantin Varlamovmultimap(InputIterator, InputIterator, Allocator)
47968072a71SKonstantin Varlamov  -> multimap<iter_key_t<InputIterator>, iter_val_t<InputIterator>,
48068072a71SKonstantin Varlamov    less<iter_key_t<InputIterator>>, Allocator>; // C++17
48168072a71SKonstantin Varlamov
48268072a71SKonstantin Varlamovtemplate<class Key, class T, class Allocator>
48368072a71SKonstantin Varlamovmultimap(initializer_list<pair<const Key, T>>, Allocator)
48468072a71SKonstantin Varlamov  -> multimap<Key, T, less<Key>, Allocator>; // C++17
48568072a71SKonstantin Varlamov
4863e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator>
4873e519524SHoward Hinnantbool
4883e519524SHoward Hinnantoperator==(const multimap<Key, T, Compare, Allocator>& x,
4893e519524SHoward Hinnant           const multimap<Key, T, Compare, Allocator>& y);
4903e519524SHoward Hinnant
4913e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator>
4923e519524SHoward Hinnantbool
4933e519524SHoward Hinnantoperator< (const multimap<Key, T, Compare, Allocator>& x,
4943e519524SHoward Hinnant           const multimap<Key, T, Compare, Allocator>& y);
4953e519524SHoward Hinnant
4963e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator>
4973e519524SHoward Hinnantbool
4983e519524SHoward Hinnantoperator!=(const multimap<Key, T, Compare, Allocator>& x,
4993e519524SHoward Hinnant           const multimap<Key, T, Compare, Allocator>& y);
5003e519524SHoward Hinnant
5013e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator>
5023e519524SHoward Hinnantbool
5033e519524SHoward Hinnantoperator> (const multimap<Key, T, Compare, Allocator>& x,
5043e519524SHoward Hinnant           const multimap<Key, T, Compare, Allocator>& y);
5053e519524SHoward Hinnant
5063e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator>
5073e519524SHoward Hinnantbool
5083e519524SHoward Hinnantoperator>=(const multimap<Key, T, Compare, Allocator>& x,
5093e519524SHoward Hinnant           const multimap<Key, T, Compare, Allocator>& y);
5103e519524SHoward Hinnant
5113e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator>
5123e519524SHoward Hinnantbool
5133e519524SHoward Hinnantoperator<=(const multimap<Key, T, Compare, Allocator>& x,
5143e519524SHoward Hinnant           const multimap<Key, T, Compare, Allocator>& y);
5153e519524SHoward Hinnant
5163e519524SHoward Hinnant// specialized algorithms:
5173e519524SHoward Hinnanttemplate <class Key, class T, class Compare, class Allocator>
5183e519524SHoward Hinnantvoid
5193e519524SHoward Hinnantswap(multimap<Key, T, Compare, Allocator>& x,
5201052ee39SHoward Hinnant     multimap<Key, T, Compare, Allocator>& y)
5211052ee39SHoward Hinnant    noexcept(noexcept(x.swap(y)));
5223e519524SHoward Hinnant
523f60c63c0SMarshall Clowtemplate <class Key, class T, class Compare, class Allocator, class Predicate>
5243e895085SMarek Kurdejtypename multimap<Key, T, Compare, Allocator>::size_type
5253e895085SMarek Kurdejerase_if(multimap<Key, T, Compare, Allocator>& c, Predicate pred);  // C++20
526f60c63c0SMarshall Clow
5273e519524SHoward Hinnant}  // std
5283e519524SHoward Hinnant
5293e519524SHoward Hinnant*/
5303e519524SHoward Hinnant
5312e2f3158SNikolas Klauser#include <__algorithm/equal.h>
5322e2f3158SNikolas Klauser#include <__algorithm/lexicographical_compare.h>
533385cc25aSLouis Dionne#include <__assert> // all public C++ headers provide the assertion handler
5343e519524SHoward Hinnant#include <__config>
53534f73804SNikolas Klauser#include <__functional/binary_function.h>
536050b064fSChristopher Di Bella#include <__functional/is_transparent.h>
53734f73804SNikolas Klauser#include <__functional/operations.h>
5383cd4531bSNikolas Klauser#include <__iterator/erase_if_container.h>
53968072a71SKonstantin Varlamov#include <__iterator/iterator_traits.h>
5403cd4531bSNikolas Klauser#include <__iterator/reverse_iterator.h>
541b0386a51SErik Pilkington#include <__node_handle>
54206b40e80SArthur O'Dwyer#include <__tree>
5436adbc83eSChristopher Di Bella#include <__utility/forward.h>
54452915d78SNikolas Klauser#include <__utility/swap.h>
5453e519524SHoward Hinnant#include <memory>
546ee187e24SEric Fiselier#include <type_traits>
547f56972e2SMarshall Clow#include <version>
5483e519524SHoward Hinnant
549de4a57cbSLouis Dionne#ifndef _LIBCPP_REMOVE_TRANSITIVE_INCLUDES
550de4a57cbSLouis Dionne#  include <functional>
551de4a57cbSLouis Dionne#  include <iterator>
552de4a57cbSLouis Dionne#  include <utility>
553de4a57cbSLouis Dionne#endif
554de4a57cbSLouis Dionne
555db1978b6SNikolas Klauser// standard-mandated includes
556db1978b6SNikolas Klauser
557db1978b6SNikolas Klauser// [iterator.range]
558db1978b6SNikolas Klauser#include <__iterator/access.h>
559db1978b6SNikolas Klauser#include <__iterator/data.h>
560db1978b6SNikolas Klauser#include <__iterator/empty.h>
561db1978b6SNikolas Klauser#include <__iterator/reverse_access.h>
562db1978b6SNikolas Klauser#include <__iterator/size.h>
563db1978b6SNikolas Klauser
564db1978b6SNikolas Klauser// [associative.map.syn]
565db1978b6SNikolas Klauser#include <compare>
566db1978b6SNikolas Klauser#include <initializer_list>
567db1978b6SNikolas Klauser
568073458b1SHoward Hinnant#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
5693e519524SHoward Hinnant#  pragma GCC system_header
570073458b1SHoward Hinnant#endif
5713e519524SHoward Hinnant
5723e519524SHoward Hinnant_LIBCPP_BEGIN_NAMESPACE_STD
5733e519524SHoward Hinnant
5743560fbf3SLouis Dionnetemplate <class _Key, class _CP, class _Compare,
5753560fbf3SLouis Dionne          bool = is_empty<_Compare>::value && !__libcpp_is_final<_Compare>::value>
5763e519524SHoward Hinnantclass __map_value_compare
5773e519524SHoward Hinnant    : private _Compare
5783e519524SHoward Hinnant{
5793e519524SHoward Hinnantpublic:
580848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
5811052ee39SHoward Hinnant    __map_value_compare()
5821052ee39SHoward Hinnant        _NOEXCEPT_(is_nothrow_default_constructible<_Compare>::value)
5831052ee39SHoward Hinnant        : _Compare() {}
584848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
585*b48c5010SNikolas Klauser    __map_value_compare(_Compare __c)
5861052ee39SHoward Hinnant        _NOEXCEPT_(is_nothrow_copy_constructible<_Compare>::value)
587*b48c5010SNikolas Klauser        : _Compare(__c) {}
588848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
5891052ee39SHoward Hinnant    const _Compare& key_comp() const _NOEXCEPT {return *this;}
590848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
5913e519524SHoward Hinnant    bool operator()(const _CP& __x, const _CP& __y) const
592f52318b4SErik Pilkington        {return static_cast<const _Compare&>(*this)(__x.__get_value().first, __y.__get_value().first);}
593848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
5943e519524SHoward Hinnant    bool operator()(const _CP& __x, const _Key& __y) const
595f52318b4SErik Pilkington        {return static_cast<const _Compare&>(*this)(__x.__get_value().first, __y);}
596848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
5973e519524SHoward Hinnant    bool operator()(const _Key& __x, const _CP& __y) const
598f52318b4SErik Pilkington        {return static_cast<const _Compare&>(*this)(__x, __y.__get_value().first);}
599e3fbe143SMarshall Clow    void swap(__map_value_compare& __y)
600e3fbe143SMarshall Clow        _NOEXCEPT_(__is_nothrow_swappable<_Compare>::value)
601e3fbe143SMarshall Clow    {
602e3fbe143SMarshall Clow      using _VSTD::swap;
603e1ec2986SEric Fiselier      swap(static_cast<_Compare&>(*this), static_cast<_Compare&>(__y));
604e3fbe143SMarshall Clow    }
6052585835cSMarshall Clow
6062585835cSMarshall Clow#if _LIBCPP_STD_VER > 11
6072585835cSMarshall Clow    template <typename _K2>
6082585835cSMarshall Clow    _LIBCPP_INLINE_VISIBILITY
609d5db71d1SArthur O'Dwyer    bool operator()(const _K2& __x, const _CP& __y) const
610f52318b4SErik Pilkington        {return static_cast<const _Compare&>(*this)(__x, __y.__get_value().first);}
6112585835cSMarshall Clow
6122585835cSMarshall Clow    template <typename _K2>
6132585835cSMarshall Clow    _LIBCPP_INLINE_VISIBILITY
614d5db71d1SArthur O'Dwyer    bool operator()(const _CP& __x, const _K2& __y) const
615f52318b4SErik Pilkington        {return static_cast<const _Compare&>(*this)(__x.__get_value().first, __y);}
6162585835cSMarshall Clow#endif
6173e519524SHoward Hinnant};
6183e519524SHoward Hinnant
619abb160e6SHoward Hinnanttemplate <class _Key, class _CP, class _Compare>
620abb160e6SHoward Hinnantclass __map_value_compare<_Key, _CP, _Compare, false>
6213e519524SHoward Hinnant{
6223e519524SHoward Hinnant    _Compare comp;
6233e519524SHoward Hinnant
6243e519524SHoward Hinnantpublic:
625848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
6261052ee39SHoward Hinnant    __map_value_compare()
6271052ee39SHoward Hinnant        _NOEXCEPT_(is_nothrow_default_constructible<_Compare>::value)
6281052ee39SHoward Hinnant        : comp() {}
629848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
630*b48c5010SNikolas Klauser    __map_value_compare(_Compare __c)
6311052ee39SHoward Hinnant        _NOEXCEPT_(is_nothrow_copy_constructible<_Compare>::value)
632*b48c5010SNikolas Klauser        : comp(__c) {}
633848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
6341052ee39SHoward Hinnant    const _Compare& key_comp() const _NOEXCEPT {return comp;}
6353e519524SHoward Hinnant
636848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
6373e519524SHoward Hinnant    bool operator()(const _CP& __x, const _CP& __y) const
638f52318b4SErik Pilkington        {return comp(__x.__get_value().first, __y.__get_value().first);}
639848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
6403e519524SHoward Hinnant    bool operator()(const _CP& __x, const _Key& __y) const
641f52318b4SErik Pilkington        {return comp(__x.__get_value().first, __y);}
642848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
6433e519524SHoward Hinnant    bool operator()(const _Key& __x, const _CP& __y) const
644f52318b4SErik Pilkington        {return comp(__x, __y.__get_value().first);}
645e3fbe143SMarshall Clow    void swap(__map_value_compare& __y)
646e3fbe143SMarshall Clow        _NOEXCEPT_(__is_nothrow_swappable<_Compare>::value)
647e3fbe143SMarshall Clow    {
648e3fbe143SMarshall Clow        using _VSTD::swap;
649e3fbe143SMarshall Clow        swap(comp, __y.comp);
650e3fbe143SMarshall Clow    }
6512585835cSMarshall Clow
6522585835cSMarshall Clow#if _LIBCPP_STD_VER > 11
6532585835cSMarshall Clow    template <typename _K2>
6542585835cSMarshall Clow    _LIBCPP_INLINE_VISIBILITY
655d5db71d1SArthur O'Dwyer    bool operator()(const _K2& __x, const _CP& __y) const
656f52318b4SErik Pilkington        {return comp(__x, __y.__get_value().first);}
6572585835cSMarshall Clow
6582585835cSMarshall Clow    template <typename _K2>
6592585835cSMarshall Clow    _LIBCPP_INLINE_VISIBILITY
660d5db71d1SArthur O'Dwyer    bool operator()(const _CP& __x, const _K2& __y) const
661f52318b4SErik Pilkington        {return comp(__x.__get_value().first, __y);}
6622585835cSMarshall Clow#endif
6633e519524SHoward Hinnant};
6643e519524SHoward Hinnant
665e3fbe143SMarshall Clowtemplate <class _Key, class _CP, class _Compare, bool __b>
666e3fbe143SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY
667e3fbe143SMarshall Clowvoid
668e3fbe143SMarshall Clowswap(__map_value_compare<_Key, _CP, _Compare, __b>& __x,
669e3fbe143SMarshall Clow     __map_value_compare<_Key, _CP, _Compare, __b>& __y)
670e3fbe143SMarshall Clow    _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
671e3fbe143SMarshall Clow{
672e3fbe143SMarshall Clow    __x.swap(__y);
673e3fbe143SMarshall Clow}
674e3fbe143SMarshall Clow
6753e519524SHoward Hinnanttemplate <class _Allocator>
6763e519524SHoward Hinnantclass __map_node_destructor
6773e519524SHoward Hinnant{
6783e519524SHoward Hinnant    typedef _Allocator                          allocator_type;
6793e519524SHoward Hinnant    typedef allocator_traits<allocator_type>    __alloc_traits;
680089a7cc5SEric Fiselier
6813e519524SHoward Hinnantpublic:
6823e519524SHoward Hinnant    typedef typename __alloc_traits::pointer    pointer;
6833e519524SHoward Hinnant
684089a7cc5SEric Fiselierprivate:
6853e519524SHoward Hinnant    allocator_type& __na_;
6863e519524SHoward Hinnant
6873e519524SHoward Hinnant    __map_node_destructor& operator=(const __map_node_destructor&);
6883e519524SHoward Hinnant
6893e519524SHoward Hinnantpublic:
6903e519524SHoward Hinnant    bool __first_constructed;
6913e519524SHoward Hinnant    bool __second_constructed;
6923e519524SHoward Hinnant
693848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
6941052ee39SHoward Hinnant    explicit __map_node_destructor(allocator_type& __na) _NOEXCEPT
6953e519524SHoward Hinnant        : __na_(__na),
6963e519524SHoward Hinnant          __first_constructed(false),
6973e519524SHoward Hinnant          __second_constructed(false)
6983e519524SHoward Hinnant        {}
6993e519524SHoward Hinnant
70018293116SEric Fiselier#ifndef _LIBCPP_CXX03_LANG
701848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
7021052ee39SHoward Hinnant    __map_node_destructor(__tree_node_destructor<allocator_type>&& __x) _NOEXCEPT
7033e519524SHoward Hinnant        : __na_(__x.__na_),
7043e519524SHoward Hinnant          __first_constructed(__x.__value_constructed),
7053e519524SHoward Hinnant          __second_constructed(__x.__value_constructed)
7063e519524SHoward Hinnant        {
7073e519524SHoward Hinnant            __x.__value_constructed = false;
7083e519524SHoward Hinnant        }
70918293116SEric Fiselier#endif // _LIBCPP_CXX03_LANG
7103e519524SHoward Hinnant
711848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
7121052ee39SHoward Hinnant    void operator()(pointer __p) _NOEXCEPT
7133e519524SHoward Hinnant    {
7143e519524SHoward Hinnant        if (__second_constructed)
715f52318b4SErik Pilkington            __alloc_traits::destroy(__na_, _VSTD::addressof(__p->__value_.__get_value().second));
7163e519524SHoward Hinnant        if (__first_constructed)
717f52318b4SErik Pilkington            __alloc_traits::destroy(__na_, _VSTD::addressof(__p->__value_.__get_value().first));
7183e519524SHoward Hinnant        if (__p)
7193e519524SHoward Hinnant            __alloc_traits::deallocate(__na_, __p, 1);
7203e519524SHoward Hinnant    }
7213e519524SHoward Hinnant};
7223e519524SHoward Hinnant
723ce53420eSHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator>
724ce53420eSHoward Hinnant    class map;
725ce53420eSHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator>
726ce53420eSHoward Hinnant    class multimap;
727ce53420eSHoward Hinnanttemplate <class _TreeIterator> class __map_const_iterator;
7283e519524SHoward Hinnant
729089a7cc5SEric Fiselier#ifndef _LIBCPP_CXX03_LANG
7309fd9f84fSHoward Hinnant
7319fd9f84fSHoward Hinnanttemplate <class _Key, class _Tp>
7327c2f5827SAmy Huangstruct _LIBCPP_STANDALONE_DEBUG __value_type
7339fd9f84fSHoward Hinnant{
7349fd9f84fSHoward Hinnant    typedef _Key                                     key_type;
7359fd9f84fSHoward Hinnant    typedef _Tp                                      mapped_type;
7369fd9f84fSHoward Hinnant    typedef pair<const key_type, mapped_type>        value_type;
737f52318b4SErik Pilkington    typedef pair<key_type&, mapped_type&>            __nc_ref_pair_type;
738f52318b4SErik Pilkington    typedef pair<key_type&&, mapped_type&&>          __nc_rref_pair_type;
7399fd9f84fSHoward Hinnant
740f52318b4SErik Pilkingtonprivate:
7419fd9f84fSHoward Hinnant    value_type __cc;
742f52318b4SErik Pilkington
743f52318b4SErik Pilkingtonpublic:
744f52318b4SErik Pilkington    _LIBCPP_INLINE_VISIBILITY
745f52318b4SErik Pilkington    value_type& __get_value()
746f52318b4SErik Pilkington    {
747f52318b4SErik Pilkington#if _LIBCPP_STD_VER > 14
748f52318b4SErik Pilkington        return *_VSTD::launder(_VSTD::addressof(__cc));
749f52318b4SErik Pilkington#else
750f52318b4SErik Pilkington        return __cc;
751f52318b4SErik Pilkington#endif
752f52318b4SErik Pilkington    }
753f52318b4SErik Pilkington
754f52318b4SErik Pilkington    _LIBCPP_INLINE_VISIBILITY
755f52318b4SErik Pilkington    const value_type& __get_value() const
756f52318b4SErik Pilkington    {
757f52318b4SErik Pilkington#if _LIBCPP_STD_VER > 14
758f52318b4SErik Pilkington        return *_VSTD::launder(_VSTD::addressof(__cc));
759f52318b4SErik Pilkington#else
760f52318b4SErik Pilkington        return __cc;
761f52318b4SErik Pilkington#endif
762f52318b4SErik Pilkington    }
763f52318b4SErik Pilkington
764f52318b4SErik Pilkington    _LIBCPP_INLINE_VISIBILITY
765f52318b4SErik Pilkington    __nc_ref_pair_type __ref()
766f52318b4SErik Pilkington    {
767f52318b4SErik Pilkington        value_type& __v = __get_value();
768f52318b4SErik Pilkington        return __nc_ref_pair_type(const_cast<key_type&>(__v.first), __v.second);
769f52318b4SErik Pilkington    }
770f52318b4SErik Pilkington
771f52318b4SErik Pilkington    _LIBCPP_INLINE_VISIBILITY
772f52318b4SErik Pilkington    __nc_rref_pair_type __move()
773f52318b4SErik Pilkington    {
774f52318b4SErik Pilkington        value_type& __v = __get_value();
775f52318b4SErik Pilkington        return __nc_rref_pair_type(
776f52318b4SErik Pilkington            _VSTD::move(const_cast<key_type&>(__v.first)),
777f52318b4SErik Pilkington            _VSTD::move(__v.second));
778f52318b4SErik Pilkington    }
7799fd9f84fSHoward Hinnant
7809fd9f84fSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
7819fd9f84fSHoward Hinnant    __value_type& operator=(const __value_type& __v)
782f52318b4SErik Pilkington    {
783f52318b4SErik Pilkington        __ref() = __v.__get_value();
784f52318b4SErik Pilkington        return *this;
785f52318b4SErik Pilkington    }
7869fd9f84fSHoward Hinnant
7879fd9f84fSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
7889fd9f84fSHoward Hinnant    __value_type& operator=(__value_type&& __v)
789f52318b4SErik Pilkington    {
790f52318b4SErik Pilkington        __ref() = __v.__move();
791f52318b4SErik Pilkington        return *this;
792f52318b4SErik Pilkington    }
7939fd9f84fSHoward Hinnant
7945e3ea4ddSEric Fiselier    template <class _ValueTp,
7954887d047SNikolas Klauser              class = __enable_if_t<__is_same_uncvref<_ValueTp, value_type>::value>
7965e3ea4ddSEric Fiselier             >
7979fd9f84fSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
798f52318b4SErik Pilkington    __value_type& operator=(_ValueTp&& __v)
799f52318b4SErik Pilkington    {
800f52318b4SErik Pilkington        __ref() = _VSTD::forward<_ValueTp>(__v);
801f52318b4SErik Pilkington        return *this;
8025e3ea4ddSEric Fiselier    }
8035e3ea4ddSEric Fiselier
8045e3ea4ddSEric Fiselierprivate:
805d7d70601SArthur O'Dwyer    __value_type() = delete;
806d7d70601SArthur O'Dwyer    ~__value_type() = delete;
807d7d70601SArthur O'Dwyer    __value_type(const __value_type&) = delete;
808d7d70601SArthur O'Dwyer    __value_type(__value_type&&) = delete;
8099fd9f84fSHoward Hinnant};
8109fd9f84fSHoward Hinnant
8119fd9f84fSHoward Hinnant#else
8129fd9f84fSHoward Hinnant
8139fd9f84fSHoward Hinnanttemplate <class _Key, class _Tp>
8149fd9f84fSHoward Hinnantstruct __value_type
8159fd9f84fSHoward Hinnant{
8169fd9f84fSHoward Hinnant    typedef _Key                                     key_type;
8179fd9f84fSHoward Hinnant    typedef _Tp                                      mapped_type;
8189fd9f84fSHoward Hinnant    typedef pair<const key_type, mapped_type>        value_type;
8199fd9f84fSHoward Hinnant
820f52318b4SErik Pilkingtonprivate:
8219fd9f84fSHoward Hinnant    value_type __cc;
8229fd9f84fSHoward Hinnant
823f52318b4SErik Pilkingtonpublic:
824f52318b4SErik Pilkington    _LIBCPP_INLINE_VISIBILITY
825f52318b4SErik Pilkington    value_type& __get_value() { return __cc; }
826f52318b4SErik Pilkington    _LIBCPP_INLINE_VISIBILITY
827f52318b4SErik Pilkington    const value_type& __get_value() const { return __cc; }
828f52318b4SErik Pilkington
8295e3ea4ddSEric Fiselierprivate:
8305e3ea4ddSEric Fiselier   __value_type();
8315e3ea4ddSEric Fiselier   __value_type(__value_type const&);
8325e3ea4ddSEric Fiselier   __value_type& operator=(__value_type const&);
8335e3ea4ddSEric Fiselier   ~__value_type();
8349fd9f84fSHoward Hinnant};
8359fd9f84fSHoward Hinnant
83618293116SEric Fiselier#endif // _LIBCPP_CXX03_LANG
8379fd9f84fSHoward Hinnant
838b3be398cSEric Fiseliertemplate <class _Tp>
839b3be398cSEric Fiselierstruct __extract_key_value_types;
840b3be398cSEric Fiselier
841b3be398cSEric Fiseliertemplate <class _Key, class _Tp>
842b3be398cSEric Fiselierstruct __extract_key_value_types<__value_type<_Key, _Tp> >
843b3be398cSEric Fiselier{
844b3be398cSEric Fiselier  typedef _Key const __key_type;
845b3be398cSEric Fiselier  typedef _Tp        __mapped_type;
846b3be398cSEric Fiselier};
847b3be398cSEric Fiselier
8483e519524SHoward Hinnanttemplate <class _TreeIterator>
849e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS __map_iterator
8503e519524SHoward Hinnant{
851089a7cc5SEric Fiselier    typedef typename _TreeIterator::_NodeTypes                   _NodeTypes;
852089a7cc5SEric Fiselier    typedef typename _TreeIterator::__pointer_traits             __pointer_traits;
853089a7cc5SEric Fiselier
8543e519524SHoward Hinnant    _TreeIterator __i_;
8553e519524SHoward Hinnant
8563e519524SHoward Hinnantpublic:
8573e519524SHoward Hinnant    typedef bidirectional_iterator_tag                           iterator_category;
858089a7cc5SEric Fiselier    typedef typename _NodeTypes::__map_value_type                value_type;
8593e519524SHoward Hinnant    typedef typename _TreeIterator::difference_type              difference_type;
8603e519524SHoward Hinnant    typedef value_type&                                          reference;
861089a7cc5SEric Fiselier    typedef typename _NodeTypes::__map_value_type_pointer        pointer;
8623e519524SHoward Hinnant
863848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
8641052ee39SHoward Hinnant    __map_iterator() _NOEXCEPT {}
8653e519524SHoward Hinnant
866848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
8671052ee39SHoward Hinnant    __map_iterator(_TreeIterator __i) _NOEXCEPT : __i_(__i) {}
8683e519524SHoward Hinnant
869848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
870f52318b4SErik Pilkington    reference operator*() const {return __i_->__get_value();}
871848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
872f52318b4SErik Pilkington    pointer operator->() const {return pointer_traits<pointer>::pointer_to(__i_->__get_value());}
8733e519524SHoward Hinnant
874848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
8753e519524SHoward Hinnant    __map_iterator& operator++() {++__i_; return *this;}
876848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
8773e519524SHoward Hinnant    __map_iterator operator++(int)
8783e519524SHoward Hinnant    {
8793e519524SHoward Hinnant        __map_iterator __t(*this);
8803e519524SHoward Hinnant        ++(*this);
8813e519524SHoward Hinnant        return __t;
8823e519524SHoward Hinnant    }
8833e519524SHoward Hinnant
884848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
8853e519524SHoward Hinnant    __map_iterator& operator--() {--__i_; return *this;}
886848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
8873e519524SHoward Hinnant    __map_iterator operator--(int)
8883e519524SHoward Hinnant    {
8893e519524SHoward Hinnant        __map_iterator __t(*this);
8903e519524SHoward Hinnant        --(*this);
8913e519524SHoward Hinnant        return __t;
8923e519524SHoward Hinnant    }
8933e519524SHoward Hinnant
894848a5374SHoward Hinnant    friend _LIBCPP_INLINE_VISIBILITY
895848a5374SHoward Hinnant    bool operator==(const __map_iterator& __x, const __map_iterator& __y)
8963e519524SHoward Hinnant        {return __x.__i_ == __y.__i_;}
897848a5374SHoward Hinnant    friend
898848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
899848a5374SHoward Hinnant    bool operator!=(const __map_iterator& __x, const __map_iterator& __y)
9003e519524SHoward Hinnant        {return __x.__i_ != __y.__i_;}
9013e519524SHoward Hinnant
902e2f2d1edSEric Fiselier    template <class, class, class, class> friend class _LIBCPP_TEMPLATE_VIS map;
903e2f2d1edSEric Fiselier    template <class, class, class, class> friend class _LIBCPP_TEMPLATE_VIS multimap;
904e2f2d1edSEric Fiselier    template <class> friend class _LIBCPP_TEMPLATE_VIS __map_const_iterator;
9053e519524SHoward Hinnant};
9063e519524SHoward Hinnant
9073e519524SHoward Hinnanttemplate <class _TreeIterator>
908e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS __map_const_iterator
9093e519524SHoward Hinnant{
910089a7cc5SEric Fiselier    typedef typename _TreeIterator::_NodeTypes                   _NodeTypes;
911089a7cc5SEric Fiselier    typedef typename _TreeIterator::__pointer_traits             __pointer_traits;
912089a7cc5SEric Fiselier
9133e519524SHoward Hinnant    _TreeIterator __i_;
9143e519524SHoward Hinnant
9153e519524SHoward Hinnantpublic:
9163e519524SHoward Hinnant    typedef bidirectional_iterator_tag                           iterator_category;
917089a7cc5SEric Fiselier    typedef typename _NodeTypes::__map_value_type                value_type;
9183e519524SHoward Hinnant    typedef typename _TreeIterator::difference_type              difference_type;
9193e519524SHoward Hinnant    typedef const value_type&                                    reference;
920089a7cc5SEric Fiselier    typedef typename _NodeTypes::__const_map_value_type_pointer  pointer;
9213e519524SHoward Hinnant
922848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
9231052ee39SHoward Hinnant    __map_const_iterator() _NOEXCEPT {}
9243e519524SHoward Hinnant
925848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
9261052ee39SHoward Hinnant    __map_const_iterator(_TreeIterator __i) _NOEXCEPT : __i_(__i) {}
927848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
928b3be398cSEric Fiselier    __map_const_iterator(__map_iterator<
929b3be398cSEric Fiselier        typename _TreeIterator::__non_const_iterator> __i) _NOEXCEPT
9303e519524SHoward Hinnant        : __i_(__i.__i_) {}
9313e519524SHoward Hinnant
932848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
933f52318b4SErik Pilkington    reference operator*() const {return __i_->__get_value();}
934848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
935f52318b4SErik Pilkington    pointer operator->() const {return pointer_traits<pointer>::pointer_to(__i_->__get_value());}
9363e519524SHoward Hinnant
937848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
9383e519524SHoward Hinnant    __map_const_iterator& operator++() {++__i_; return *this;}
939848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
9403e519524SHoward Hinnant    __map_const_iterator operator++(int)
9413e519524SHoward Hinnant    {
9423e519524SHoward Hinnant        __map_const_iterator __t(*this);
9433e519524SHoward Hinnant        ++(*this);
9443e519524SHoward Hinnant        return __t;
9453e519524SHoward Hinnant    }
9463e519524SHoward Hinnant
947848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
9483e519524SHoward Hinnant    __map_const_iterator& operator--() {--__i_; return *this;}
949848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
9503e519524SHoward Hinnant    __map_const_iterator operator--(int)
9513e519524SHoward Hinnant    {
9523e519524SHoward Hinnant        __map_const_iterator __t(*this);
9533e519524SHoward Hinnant        --(*this);
9543e519524SHoward Hinnant        return __t;
9553e519524SHoward Hinnant    }
9563e519524SHoward Hinnant
957848a5374SHoward Hinnant    friend _LIBCPP_INLINE_VISIBILITY
958848a5374SHoward Hinnant    bool operator==(const __map_const_iterator& __x, const __map_const_iterator& __y)
9593e519524SHoward Hinnant        {return __x.__i_ == __y.__i_;}
960848a5374SHoward Hinnant    friend _LIBCPP_INLINE_VISIBILITY
961848a5374SHoward Hinnant    bool operator!=(const __map_const_iterator& __x, const __map_const_iterator& __y)
9623e519524SHoward Hinnant        {return __x.__i_ != __y.__i_;}
9633e519524SHoward Hinnant
964e2f2d1edSEric Fiselier    template <class, class, class, class> friend class _LIBCPP_TEMPLATE_VIS map;
965e2f2d1edSEric Fiselier    template <class, class, class, class> friend class _LIBCPP_TEMPLATE_VIS multimap;
966e2f2d1edSEric Fiselier    template <class, class, class> friend class _LIBCPP_TEMPLATE_VIS __tree_const_iterator;
9673e519524SHoward Hinnant};
9683e519524SHoward Hinnant
9693e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare = less<_Key>,
9703e519524SHoward Hinnant          class _Allocator = allocator<pair<const _Key, _Tp> > >
971e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS map
9723e519524SHoward Hinnant{
9733e519524SHoward Hinnantpublic:
9743e519524SHoward Hinnant    // types:
9753e519524SHoward Hinnant    typedef _Key                                     key_type;
9763e519524SHoward Hinnant    typedef _Tp                                      mapped_type;
9773e519524SHoward Hinnant    typedef pair<const key_type, mapped_type>        value_type;
9783c6bd176SNikolas Klauser    typedef __type_identity_t<_Compare>              key_compare;
9793c6bd176SNikolas Klauser    typedef __type_identity_t<_Allocator>            allocator_type;
9803e519524SHoward Hinnant    typedef value_type&                              reference;
9813e519524SHoward Hinnant    typedef const value_type&                        const_reference;
9823e519524SHoward Hinnant
98394f89aeeSMarshall Clow    static_assert((is_same<typename allocator_type::value_type, value_type>::value),
98494f89aeeSMarshall Clow                  "Allocator::value_type must be same type as value_type");
98594f89aeeSMarshall Clow
986e2f2d1edSEric Fiselier    class _LIBCPP_TEMPLATE_VIS value_compare
987681cde7dSNikolas Klauser        : public __binary_function<value_type, value_type, bool>
9883e519524SHoward Hinnant    {
9893e519524SHoward Hinnant        friend class map;
9903e519524SHoward Hinnant    protected:
9913e519524SHoward Hinnant        key_compare comp;
9923e519524SHoward Hinnant
993*b48c5010SNikolas Klauser        _LIBCPP_INLINE_VISIBILITY value_compare(key_compare __c) : comp(__c) {}
9943e519524SHoward Hinnant    public:
995848a5374SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
9963e519524SHoward Hinnant        bool operator()(const value_type& __x, const value_type& __y) const
9973e519524SHoward Hinnant            {return comp(__x.first, __y.first);}
9983e519524SHoward Hinnant    };
9993e519524SHoward Hinnant
10003e519524SHoward Hinnantprivate:
100107d3eccdSHoward Hinnant
10029fd9f84fSHoward Hinnant    typedef _VSTD::__value_type<key_type, mapped_type>             __value_type;
1003abb160e6SHoward Hinnant    typedef __map_value_compare<key_type, __value_type, key_compare> __vc;
10041f508014SMarshall Clow    typedef typename __rebind_alloc_helper<allocator_traits<allocator_type>,
10051f508014SMarshall Clow                                                 __value_type>::type __allocator_type;
10063e519524SHoward Hinnant    typedef __tree<__value_type, __vc, __allocator_type>   __base;
10073e519524SHoward Hinnant    typedef typename __base::__node_traits                 __node_traits;
10083e519524SHoward Hinnant    typedef allocator_traits<allocator_type>               __alloc_traits;
10093e519524SHoward Hinnant
10103e519524SHoward Hinnant    __base __tree_;
10113e519524SHoward Hinnant
10123e519524SHoward Hinnantpublic:
10133e519524SHoward Hinnant    typedef typename __alloc_traits::pointer               pointer;
10143e519524SHoward Hinnant    typedef typename __alloc_traits::const_pointer         const_pointer;
10153e519524SHoward Hinnant    typedef typename __alloc_traits::size_type             size_type;
10163e519524SHoward Hinnant    typedef typename __alloc_traits::difference_type       difference_type;
10173e519524SHoward Hinnant    typedef __map_iterator<typename __base::iterator>             iterator;
10183e519524SHoward Hinnant    typedef __map_const_iterator<typename __base::const_iterator> const_iterator;
1019ce48a113SHoward Hinnant    typedef _VSTD::reverse_iterator<iterator>               reverse_iterator;
1020ce48a113SHoward Hinnant    typedef _VSTD::reverse_iterator<const_iterator>         const_reverse_iterator;
10213e519524SHoward Hinnant
1022b0386a51SErik Pilkington#if _LIBCPP_STD_VER > 14
1023b0386a51SErik Pilkington    typedef __map_node_handle<typename __base::__node, allocator_type> node_type;
1024b0386a51SErik Pilkington    typedef __insert_return_type<iterator, node_type> insert_return_type;
1025b0386a51SErik Pilkington#endif
1026b0386a51SErik Pilkington
10275c4e07aeSErik Pilkington    template <class _Key2, class _Value2, class _Comp2, class _Alloc2>
10285c4e07aeSErik Pilkington        friend class _LIBCPP_TEMPLATE_VIS map;
10295c4e07aeSErik Pilkington    template <class _Key2, class _Value2, class _Comp2, class _Alloc2>
10305c4e07aeSErik Pilkington        friend class _LIBCPP_TEMPLATE_VIS multimap;
10315c4e07aeSErik Pilkington
1032848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
1033415a24e4SMarshall Clow    map()
1034415a24e4SMarshall Clow        _NOEXCEPT_(
1035415a24e4SMarshall Clow            is_nothrow_default_constructible<allocator_type>::value &&
1036415a24e4SMarshall Clow            is_nothrow_default_constructible<key_compare>::value &&
1037415a24e4SMarshall Clow            is_nothrow_copy_constructible<key_compare>::value)
1038415a24e4SMarshall Clow        : __tree_(__vc(key_compare())) {}
1039415a24e4SMarshall Clow
1040415a24e4SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
1041415a24e4SMarshall Clow    explicit map(const key_compare& __comp)
10421052ee39SHoward Hinnant        _NOEXCEPT_(
10431052ee39SHoward Hinnant            is_nothrow_default_constructible<allocator_type>::value &&
10441052ee39SHoward Hinnant            is_nothrow_copy_constructible<key_compare>::value)
10453e519524SHoward Hinnant        : __tree_(__vc(__comp)) {}
10463e519524SHoward Hinnant
1047848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
10483e519524SHoward Hinnant    explicit map(const key_compare& __comp, const allocator_type& __a)
10492a10c960SMarshall Clow        : __tree_(__vc(__comp), typename __base::allocator_type(__a)) {}
10503e519524SHoward Hinnant
10513e519524SHoward Hinnant    template <class _InputIterator>
1052848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
10533e519524SHoward Hinnant        map(_InputIterator __f, _InputIterator __l,
10543e519524SHoward Hinnant            const key_compare& __comp = key_compare())
10553e519524SHoward Hinnant        : __tree_(__vc(__comp))
10563e519524SHoward Hinnant        {
10573e519524SHoward Hinnant            insert(__f, __l);
10583e519524SHoward Hinnant        }
10593e519524SHoward Hinnant
10603e519524SHoward Hinnant    template <class _InputIterator>
1061848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
10623e519524SHoward Hinnant        map(_InputIterator __f, _InputIterator __l,
10633e519524SHoward Hinnant            const key_compare& __comp, const allocator_type& __a)
10642a10c960SMarshall Clow        : __tree_(__vc(__comp), typename __base::allocator_type(__a))
10653e519524SHoward Hinnant        {
10663e519524SHoward Hinnant            insert(__f, __l);
10673e519524SHoward Hinnant        }
10683e519524SHoward Hinnant
1069fbc317d4SMarshall Clow#if _LIBCPP_STD_VER > 11
1070fbc317d4SMarshall Clow    template <class _InputIterator>
1071fbc317d4SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
1072fbc317d4SMarshall Clow    map(_InputIterator __f, _InputIterator __l, const allocator_type& __a)
1073fbc317d4SMarshall Clow        : map(__f, __l, key_compare(), __a) {}
1074fbc317d4SMarshall Clow#endif
1075fbc317d4SMarshall Clow
1076848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
10773e519524SHoward Hinnant    map(const map& __m)
10783e519524SHoward Hinnant        : __tree_(__m.__tree_)
10793e519524SHoward Hinnant        {
10803e519524SHoward Hinnant            insert(__m.begin(), __m.end());
10813e519524SHoward Hinnant        }
10823e519524SHoward Hinnant
10835a33687dSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
10845a33687dSHoward Hinnant    map& operator=(const map& __m)
10855a33687dSHoward Hinnant        {
10862ee83725SMarshall Clow#ifndef _LIBCPP_CXX03_LANG
10875a33687dSHoward Hinnant            __tree_ = __m.__tree_;
108807d3eccdSHoward Hinnant#else
1089b8608b87SMark de Wever            if (this != _VSTD::addressof(__m)) {
109007d3eccdSHoward Hinnant                __tree_.clear();
109107d3eccdSHoward Hinnant                __tree_.value_comp() = __m.__tree_.value_comp();
109207d3eccdSHoward Hinnant                __tree_.__copy_assign_alloc(__m.__tree_);
109307d3eccdSHoward Hinnant                insert(__m.begin(), __m.end());
109474cf6ff5SMarshall Clow            }
109507d3eccdSHoward Hinnant#endif
10965a33687dSHoward Hinnant            return *this;
10975a33687dSHoward Hinnant        }
10985a33687dSHoward Hinnant
109918293116SEric Fiselier#ifndef _LIBCPP_CXX03_LANG
11003e519524SHoward Hinnant
1101848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11023e519524SHoward Hinnant    map(map&& __m)
11031052ee39SHoward Hinnant        _NOEXCEPT_(is_nothrow_move_constructible<__base>::value)
1104ce48a113SHoward Hinnant        : __tree_(_VSTD::move(__m.__tree_))
11053e519524SHoward Hinnant        {
11063e519524SHoward Hinnant        }
11073e519524SHoward Hinnant
11083e519524SHoward Hinnant    map(map&& __m, const allocator_type& __a);
11093e519524SHoward Hinnant
1110848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
111154976f26SHoward Hinnant    map& operator=(map&& __m)
111254976f26SHoward Hinnant        _NOEXCEPT_(is_nothrow_move_assignable<__base>::value)
111354976f26SHoward Hinnant        {
111454976f26SHoward Hinnant            __tree_ = _VSTD::move(__m.__tree_);
111554976f26SHoward Hinnant            return *this;
111654976f26SHoward Hinnant        }
111754976f26SHoward Hinnant
111854976f26SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11193e519524SHoward Hinnant    map(initializer_list<value_type> __il, const key_compare& __comp = key_compare())
11203e519524SHoward Hinnant        : __tree_(__vc(__comp))
11213e519524SHoward Hinnant        {
11223e519524SHoward Hinnant            insert(__il.begin(), __il.end());
11233e519524SHoward Hinnant        }
11243e519524SHoward Hinnant
1125848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11263e519524SHoward Hinnant    map(initializer_list<value_type> __il, const key_compare& __comp, const allocator_type& __a)
11272a10c960SMarshall Clow        : __tree_(__vc(__comp), typename __base::allocator_type(__a))
11283e519524SHoward Hinnant        {
11293e519524SHoward Hinnant            insert(__il.begin(), __il.end());
11303e519524SHoward Hinnant        }
11313e519524SHoward Hinnant
1132fbc317d4SMarshall Clow#if _LIBCPP_STD_VER > 11
1133fbc317d4SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
1134fbc317d4SMarshall Clow    map(initializer_list<value_type> __il, const allocator_type& __a)
1135fbc317d4SMarshall Clow        : map(__il, key_compare(), __a) {}
1136fbc317d4SMarshall Clow#endif
1137fbc317d4SMarshall Clow
1138848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11393e519524SHoward Hinnant    map& operator=(initializer_list<value_type> __il)
11403e519524SHoward Hinnant        {
11413e519524SHoward Hinnant            __tree_.__assign_unique(__il.begin(), __il.end());
11423e519524SHoward Hinnant            return *this;
11433e519524SHoward Hinnant        }
11443e519524SHoward Hinnant
114518293116SEric Fiselier#endif // _LIBCPP_CXX03_LANG
11463e519524SHoward Hinnant
1147848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11483e519524SHoward Hinnant    explicit map(const allocator_type& __a)
11492a10c960SMarshall Clow        : __tree_(typename __base::allocator_type(__a))
11503e519524SHoward Hinnant        {
11513e519524SHoward Hinnant        }
11523e519524SHoward Hinnant
1153848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11543e519524SHoward Hinnant    map(const map& __m, const allocator_type& __a)
11552a10c960SMarshall Clow        : __tree_(__m.__tree_.value_comp(), typename __base::allocator_type(__a))
11563e519524SHoward Hinnant        {
11573e519524SHoward Hinnant            insert(__m.begin(), __m.end());
11583e519524SHoward Hinnant        }
11593e519524SHoward Hinnant
1160848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11617c142fccSLouis Dionne    ~map() {
11627c142fccSLouis Dionne        static_assert(sizeof(__diagnose_non_const_comparator<_Key, _Compare>()), "");
11637c142fccSLouis Dionne    }
11647c142fccSLouis Dionne
11657c142fccSLouis Dionne    _LIBCPP_INLINE_VISIBILITY
11661052ee39SHoward Hinnant          iterator begin() _NOEXCEPT {return __tree_.begin();}
1167848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11681052ee39SHoward Hinnant    const_iterator begin() const _NOEXCEPT {return __tree_.begin();}
1169848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11701052ee39SHoward Hinnant          iterator end() _NOEXCEPT {return __tree_.end();}
1171848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11721052ee39SHoward Hinnant    const_iterator end() const _NOEXCEPT {return __tree_.end();}
11733e519524SHoward Hinnant
1174848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11751052ee39SHoward Hinnant          reverse_iterator rbegin() _NOEXCEPT {return reverse_iterator(end());}
1176848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11771052ee39SHoward Hinnant    const_reverse_iterator rbegin() const _NOEXCEPT
11781052ee39SHoward Hinnant        {return const_reverse_iterator(end());}
1179848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11801052ee39SHoward Hinnant          reverse_iterator rend() _NOEXCEPT
11811052ee39SHoward Hinnant            {return       reverse_iterator(begin());}
1182848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11831052ee39SHoward Hinnant    const_reverse_iterator rend() const _NOEXCEPT
11841052ee39SHoward Hinnant        {return const_reverse_iterator(begin());}
11853e519524SHoward Hinnant
1186848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11871052ee39SHoward Hinnant    const_iterator cbegin() const _NOEXCEPT {return begin();}
1188848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11891052ee39SHoward Hinnant    const_iterator cend() const _NOEXCEPT {return end();}
1190848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11911052ee39SHoward Hinnant    const_reverse_iterator crbegin() const _NOEXCEPT {return rbegin();}
1192848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11931052ee39SHoward Hinnant    const_reverse_iterator crend() const _NOEXCEPT {return rend();}
11943e519524SHoward Hinnant
119572c8fad4SMarshall Clow    _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY
11961052ee39SHoward Hinnant    bool      empty() const _NOEXCEPT {return __tree_.size() == 0;}
1197848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
11981052ee39SHoward Hinnant    size_type size() const _NOEXCEPT {return __tree_.size();}
1199848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
12001052ee39SHoward Hinnant    size_type max_size() const _NOEXCEPT {return __tree_.max_size();}
12013e519524SHoward Hinnant
12023e519524SHoward Hinnant    mapped_type& operator[](const key_type& __k);
120354f0cda6SEric Fiselier#ifndef _LIBCPP_CXX03_LANG
12043e519524SHoward Hinnant    mapped_type& operator[](key_type&& __k);
12053e519524SHoward Hinnant#endif
12063e519524SHoward Hinnant
12073e519524SHoward Hinnant          mapped_type& at(const key_type& __k);
12083e519524SHoward Hinnant    const mapped_type& at(const key_type& __k) const;
12093e519524SHoward Hinnant
1210848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
12112a10c960SMarshall Clow    allocator_type get_allocator() const _NOEXCEPT {return allocator_type(__tree_.__alloc());}
1212848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
12133e519524SHoward Hinnant    key_compare    key_comp()      const {return __tree_.value_comp().key_comp();}
1214848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
12153e519524SHoward Hinnant    value_compare  value_comp()    const {return value_compare(__tree_.value_comp().key_comp());}
12163e519524SHoward Hinnant
12175e3ea4ddSEric Fiselier#ifndef _LIBCPP_CXX03_LANG
12185e3ea4ddSEric Fiselier    template <class ..._Args>
12195e3ea4ddSEric Fiselier    _LIBCPP_INLINE_VISIBILITY
12205e3ea4ddSEric Fiselier    pair<iterator, bool> emplace(_Args&& ...__args) {
12215e3ea4ddSEric Fiselier        return __tree_.__emplace_unique(_VSTD::forward<_Args>(__args)...);
12225e3ea4ddSEric Fiselier    }
12237609c9b6SHoward Hinnant
12248b805c91SHoward Hinnant    template <class ..._Args>
12255e3ea4ddSEric Fiselier    _LIBCPP_INLINE_VISIBILITY
12265e3ea4ddSEric Fiselier    iterator emplace_hint(const_iterator __p, _Args&& ...__args) {
12275e3ea4ddSEric Fiselier        return __tree_.__emplace_hint_unique(__p.__i_, _VSTD::forward<_Args>(__args)...);
12285e3ea4ddSEric Fiselier    }
12297609c9b6SHoward Hinnant
1230c003db1fSHoward Hinnant    template <class _Pp,
12314887d047SNikolas Klauser              class = __enable_if_t<is_constructible<value_type, _Pp>::value> >
1232848a5374SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
1233c003db1fSHoward Hinnant        pair<iterator, bool> insert(_Pp&& __p)
1234c003db1fSHoward Hinnant            {return __tree_.__insert_unique(_VSTD::forward<_Pp>(__p));}
12353e519524SHoward Hinnant
1236c003db1fSHoward Hinnant    template <class _Pp,
12374887d047SNikolas Klauser              class = __enable_if_t<is_constructible<value_type, _Pp>::value> >
1238848a5374SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
1239c003db1fSHoward Hinnant        iterator insert(const_iterator __pos, _Pp&& __p)
1240c003db1fSHoward Hinnant            {return __tree_.__insert_unique(__pos.__i_, _VSTD::forward<_Pp>(__p));}
12413e519524SHoward Hinnant
12425e3ea4ddSEric Fiselier#endif // _LIBCPP_CXX03_LANG
12433e519524SHoward Hinnant
1244848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
12453e519524SHoward Hinnant    pair<iterator, bool>
12463e519524SHoward Hinnant        insert(const value_type& __v) {return __tree_.__insert_unique(__v);}
12473e519524SHoward Hinnant
1248848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
12493e519524SHoward Hinnant    iterator
12503e519524SHoward Hinnant        insert(const_iterator __p, const value_type& __v)
12513e519524SHoward Hinnant            {return __tree_.__insert_unique(__p.__i_, __v);}
12523e519524SHoward Hinnant
12537a9f500fSEric Fiselier#ifndef _LIBCPP_CXX03_LANG
1254afc9ff99SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
1255afc9ff99SMarshall Clow    pair<iterator, bool>
12565e3ea4ddSEric Fiselier    insert(value_type&& __v) {return __tree_.__insert_unique(_VSTD::move(__v));}
1257afc9ff99SMarshall Clow
1258afc9ff99SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
12595e3ea4ddSEric Fiselier    iterator insert(const_iterator __p,  value_type&& __v)
12605e3ea4ddSEric Fiselier    {return __tree_.__insert_unique(__p.__i_, _VSTD::move(__v));}
126118293116SEric Fiselier
126218293116SEric Fiselier    _LIBCPP_INLINE_VISIBILITY
126318293116SEric Fiselier    void insert(initializer_list<value_type> __il)
126418293116SEric Fiselier        {insert(__il.begin(), __il.end());}
1265afc9ff99SMarshall Clow#endif
1266afc9ff99SMarshall Clow
12673e519524SHoward Hinnant    template <class _InputIterator>
1268848a5374SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
12693e519524SHoward Hinnant        void insert(_InputIterator __f, _InputIterator __l)
12703e519524SHoward Hinnant        {
12713e519524SHoward Hinnant            for (const_iterator __e = cend(); __f != __l; ++__f)
12723e519524SHoward Hinnant                insert(__e.__i_, *__f);
12733e519524SHoward Hinnant        }
12743e519524SHoward Hinnant
12758aaf517dSMarshall Clow#if _LIBCPP_STD_VER > 14
127654f0cda6SEric Fiselier
12778aaf517dSMarshall Clow    template <class... _Args>
12788aaf517dSMarshall Clow        _LIBCPP_INLINE_VISIBILITY
12798aaf517dSMarshall Clow        pair<iterator, bool> try_emplace(const key_type& __k, _Args&&... __args)
12808aaf517dSMarshall Clow    {
128154f0cda6SEric Fiselier        return __tree_.__emplace_unique_key_args(__k,
128254f0cda6SEric Fiselier            _VSTD::piecewise_construct,
128354f0cda6SEric Fiselier            _VSTD::forward_as_tuple(__k),
128454f0cda6SEric Fiselier            _VSTD::forward_as_tuple(_VSTD::forward<_Args>(__args)...));
12858aaf517dSMarshall Clow    }
12868aaf517dSMarshall Clow
12878aaf517dSMarshall Clow    template <class... _Args>
12888aaf517dSMarshall Clow        _LIBCPP_INLINE_VISIBILITY
12898aaf517dSMarshall Clow        pair<iterator, bool> try_emplace(key_type&& __k, _Args&&... __args)
12908aaf517dSMarshall Clow    {
129154f0cda6SEric Fiselier        return __tree_.__emplace_unique_key_args(__k,
129254f0cda6SEric Fiselier            _VSTD::piecewise_construct,
129354f0cda6SEric Fiselier            _VSTD::forward_as_tuple(_VSTD::move(__k)),
129454f0cda6SEric Fiselier            _VSTD::forward_as_tuple(_VSTD::forward<_Args>(__args)...));
12958aaf517dSMarshall Clow    }
12968aaf517dSMarshall Clow
12978aaf517dSMarshall Clow    template <class... _Args>
12988aaf517dSMarshall Clow        _LIBCPP_INLINE_VISIBILITY
12998aaf517dSMarshall Clow        iterator try_emplace(const_iterator __h, const key_type& __k, _Args&&... __args)
13008aaf517dSMarshall Clow    {
130154f0cda6SEric Fiselier        return __tree_.__emplace_hint_unique_key_args(__h.__i_, __k,
130254f0cda6SEric Fiselier            _VSTD::piecewise_construct,
130354f0cda6SEric Fiselier            _VSTD::forward_as_tuple(__k),
1304d4dd9613SMark de Wever            _VSTD::forward_as_tuple(_VSTD::forward<_Args>(__args)...)).first;
13058aaf517dSMarshall Clow    }
13068aaf517dSMarshall Clow
13078aaf517dSMarshall Clow    template <class... _Args>
13088aaf517dSMarshall Clow        _LIBCPP_INLINE_VISIBILITY
13098aaf517dSMarshall Clow        iterator try_emplace(const_iterator __h, key_type&& __k, _Args&&... __args)
13108aaf517dSMarshall Clow    {
131154f0cda6SEric Fiselier        return __tree_.__emplace_hint_unique_key_args(__h.__i_, __k,
131254f0cda6SEric Fiselier            _VSTD::piecewise_construct,
131354f0cda6SEric Fiselier            _VSTD::forward_as_tuple(_VSTD::move(__k)),
1314d4dd9613SMark de Wever            _VSTD::forward_as_tuple(_VSTD::forward<_Args>(__args)...)).first;
13158aaf517dSMarshall Clow    }
13168aaf517dSMarshall Clow
13178aaf517dSMarshall Clow    template <class _Vp>
13188aaf517dSMarshall Clow        _LIBCPP_INLINE_VISIBILITY
13198aaf517dSMarshall Clow        pair<iterator, bool> insert_or_assign(const key_type& __k, _Vp&& __v)
13208aaf517dSMarshall Clow    {
13218aaf517dSMarshall Clow        iterator __p = lower_bound(__k);
13228aaf517dSMarshall Clow        if ( __p != end() && !key_comp()(__k, __p->first))
13238aaf517dSMarshall Clow        {
13248aaf517dSMarshall Clow            __p->second = _VSTD::forward<_Vp>(__v);
13258aaf517dSMarshall Clow            return _VSTD::make_pair(__p, false);
13268aaf517dSMarshall Clow        }
13278aaf517dSMarshall Clow        return _VSTD::make_pair(emplace_hint(__p, __k, _VSTD::forward<_Vp>(__v)), true);
13288aaf517dSMarshall Clow    }
13298aaf517dSMarshall Clow
13308aaf517dSMarshall Clow    template <class _Vp>
13318aaf517dSMarshall Clow        _LIBCPP_INLINE_VISIBILITY
13328aaf517dSMarshall Clow        pair<iterator, bool> insert_or_assign(key_type&& __k, _Vp&& __v)
13338aaf517dSMarshall Clow    {
13348aaf517dSMarshall Clow        iterator __p = lower_bound(__k);
13358aaf517dSMarshall Clow        if ( __p != end() && !key_comp()(__k, __p->first))
13368aaf517dSMarshall Clow        {
13378aaf517dSMarshall Clow            __p->second = _VSTD::forward<_Vp>(__v);
13388aaf517dSMarshall Clow            return _VSTD::make_pair(__p, false);
13398aaf517dSMarshall Clow        }
13408aaf517dSMarshall Clow        return _VSTD::make_pair(emplace_hint(__p, _VSTD::move(__k), _VSTD::forward<_Vp>(__v)), true);
13418aaf517dSMarshall Clow    }
13428aaf517dSMarshall Clow
13438aaf517dSMarshall Clow    template <class _Vp>
1344d4dd9613SMark de Wever    _LIBCPP_INLINE_VISIBILITY iterator insert_or_assign(const_iterator __h,
1345d4dd9613SMark de Wever                                                        const key_type& __k,
1346d4dd9613SMark de Wever                                                        _Vp&& __v) {
1347d4dd9613SMark de Wever      auto [__r, __inserted] = __tree_.__emplace_hint_unique_key_args(
1348d4dd9613SMark de Wever          __h.__i_, __k, __k, _VSTD::forward<_Vp>(__v));
1349d4dd9613SMark de Wever
1350d4dd9613SMark de Wever      if (!__inserted)
1351d4dd9613SMark de Wever        __r->__get_value().second = _VSTD::forward<_Vp>(__v);
1352d4dd9613SMark de Wever
1353d4dd9613SMark de Wever      return __r;
13548aaf517dSMarshall Clow    }
13558aaf517dSMarshall Clow
13568aaf517dSMarshall Clow    template <class _Vp>
1357d4dd9613SMark de Wever    _LIBCPP_INLINE_VISIBILITY iterator insert_or_assign(const_iterator __h,
1358d4dd9613SMark de Wever                                                        key_type&& __k,
1359d4dd9613SMark de Wever                                                        _Vp&& __v) {
1360d4dd9613SMark de Wever      auto [__r, __inserted] = __tree_.__emplace_hint_unique_key_args(
1361d4dd9613SMark de Wever          __h.__i_, __k, _VSTD::move(__k), _VSTD::forward<_Vp>(__v));
1362d4dd9613SMark de Wever
1363d4dd9613SMark de Wever      if (!__inserted)
1364d4dd9613SMark de Wever        __r->__get_value().second = _VSTD::forward<_Vp>(__v);
1365d4dd9613SMark de Wever
1366d4dd9613SMark de Wever      return __r;
13678aaf517dSMarshall Clow    }
136854f0cda6SEric Fiselier
136918293116SEric Fiselier#endif // _LIBCPP_STD_VER > 14
13708aaf517dSMarshall Clow
1371848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
13723e519524SHoward Hinnant    iterator erase(const_iterator __p) {return __tree_.erase(__p.__i_);}
1373848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
1374ec392968SMarshall Clow    iterator erase(iterator __p)       {return __tree_.erase(__p.__i_);}
1375ec392968SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
13763e519524SHoward Hinnant    size_type erase(const key_type& __k)
13773e519524SHoward Hinnant        {return __tree_.__erase_unique(__k);}
1378848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
13793e519524SHoward Hinnant    iterator  erase(const_iterator __f, const_iterator __l)
13803e519524SHoward Hinnant        {return __tree_.erase(__f.__i_, __l.__i_);}
1381848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
13821052ee39SHoward Hinnant    void clear() _NOEXCEPT {__tree_.clear();}
13833e519524SHoward Hinnant
1384b0386a51SErik Pilkington#if _LIBCPP_STD_VER > 14
1385b0386a51SErik Pilkington    _LIBCPP_INLINE_VISIBILITY
1386b0386a51SErik Pilkington    insert_return_type insert(node_type&& __nh)
1387b0386a51SErik Pilkington    {
1388b0386a51SErik Pilkington        _LIBCPP_ASSERT(__nh.empty() || __nh.get_allocator() == get_allocator(),
1389b0386a51SErik Pilkington            "node_type with incompatible allocator passed to map::insert()");
1390b0386a51SErik Pilkington        return __tree_.template __node_handle_insert_unique<
1391b0386a51SErik Pilkington            node_type, insert_return_type>(_VSTD::move(__nh));
1392b0386a51SErik Pilkington    }
1393b0386a51SErik Pilkington    _LIBCPP_INLINE_VISIBILITY
1394b0386a51SErik Pilkington    iterator insert(const_iterator __hint, node_type&& __nh)
1395b0386a51SErik Pilkington    {
1396b0386a51SErik Pilkington        _LIBCPP_ASSERT(__nh.empty() || __nh.get_allocator() == get_allocator(),
1397b0386a51SErik Pilkington            "node_type with incompatible allocator passed to map::insert()");
1398b0386a51SErik Pilkington        return __tree_.template __node_handle_insert_unique<node_type>(
1399b0386a51SErik Pilkington            __hint.__i_, _VSTD::move(__nh));
1400b0386a51SErik Pilkington    }
1401b0386a51SErik Pilkington    _LIBCPP_INLINE_VISIBILITY
1402b0386a51SErik Pilkington    node_type extract(key_type const& __key)
1403b0386a51SErik Pilkington    {
1404b0386a51SErik Pilkington        return __tree_.template __node_handle_extract<node_type>(__key);
1405b0386a51SErik Pilkington    }
1406b0386a51SErik Pilkington    _LIBCPP_INLINE_VISIBILITY
1407b0386a51SErik Pilkington    node_type extract(const_iterator __it)
1408b0386a51SErik Pilkington    {
1409b0386a51SErik Pilkington        return __tree_.template __node_handle_extract<node_type>(__it.__i_);
1410b0386a51SErik Pilkington    }
14118df1d5a5SLouis Dionne    template <class _Compare2>
14125c4e07aeSErik Pilkington    _LIBCPP_INLINE_VISIBILITY
14138df1d5a5SLouis Dionne    void merge(map<key_type, mapped_type, _Compare2, allocator_type>& __source)
14145c4e07aeSErik Pilkington    {
14155c4e07aeSErik Pilkington        _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
14165c4e07aeSErik Pilkington                       "merging container with incompatible allocator");
14175c4e07aeSErik Pilkington        __tree_.__node_handle_merge_unique(__source.__tree_);
14185c4e07aeSErik Pilkington    }
14198df1d5a5SLouis Dionne    template <class _Compare2>
14205c4e07aeSErik Pilkington    _LIBCPP_INLINE_VISIBILITY
14218df1d5a5SLouis Dionne    void merge(map<key_type, mapped_type, _Compare2, allocator_type>&& __source)
14225c4e07aeSErik Pilkington    {
14235c4e07aeSErik Pilkington        _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
14245c4e07aeSErik Pilkington                       "merging container with incompatible allocator");
14255c4e07aeSErik Pilkington        __tree_.__node_handle_merge_unique(__source.__tree_);
14265c4e07aeSErik Pilkington    }
14278df1d5a5SLouis Dionne    template <class _Compare2>
14285c4e07aeSErik Pilkington    _LIBCPP_INLINE_VISIBILITY
14298df1d5a5SLouis Dionne    void merge(multimap<key_type, mapped_type, _Compare2, allocator_type>& __source)
14305c4e07aeSErik Pilkington    {
14315c4e07aeSErik Pilkington        _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
14325c4e07aeSErik Pilkington                       "merging container with incompatible allocator");
14335c4e07aeSErik Pilkington        __tree_.__node_handle_merge_unique(__source.__tree_);
14345c4e07aeSErik Pilkington    }
14358df1d5a5SLouis Dionne    template <class _Compare2>
14365c4e07aeSErik Pilkington    _LIBCPP_INLINE_VISIBILITY
14378df1d5a5SLouis Dionne    void merge(multimap<key_type, mapped_type, _Compare2, allocator_type>&& __source)
14385c4e07aeSErik Pilkington    {
14395c4e07aeSErik Pilkington        _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
14405c4e07aeSErik Pilkington                       "merging container with incompatible allocator");
14415c4e07aeSErik Pilkington        __tree_.__node_handle_merge_unique(__source.__tree_);
14425c4e07aeSErik Pilkington    }
1443b0386a51SErik Pilkington#endif
1444b0386a51SErik Pilkington
1445848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
14461052ee39SHoward Hinnant    void swap(map& __m)
14471052ee39SHoward Hinnant        _NOEXCEPT_(__is_nothrow_swappable<__base>::value)
14481052ee39SHoward Hinnant        {__tree_.swap(__m.__tree_);}
14493e519524SHoward Hinnant
1450848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
14513e519524SHoward Hinnant    iterator find(const key_type& __k)             {return __tree_.find(__k);}
1452848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
14533e519524SHoward Hinnant    const_iterator find(const key_type& __k) const {return __tree_.find(__k);}
14542585835cSMarshall Clow#if _LIBCPP_STD_VER > 11
14552585835cSMarshall Clow    template <typename _K2>
14562585835cSMarshall Clow    _LIBCPP_INLINE_VISIBILITY
14574887d047SNikolas Klauser    __enable_if_t<__is_transparent<_Compare, _K2>::value, iterator>
14582585835cSMarshall Clow    find(const _K2& __k)                           {return __tree_.find(__k);}
14592585835cSMarshall Clow    template <typename _K2>
14602585835cSMarshall Clow    _LIBCPP_INLINE_VISIBILITY
14614887d047SNikolas Klauser    __enable_if_t<__is_transparent<_Compare, _K2>::value, const_iterator>
14622585835cSMarshall Clow    find(const _K2& __k) const                     {return __tree_.find(__k);}
14632585835cSMarshall Clow#endif
14642585835cSMarshall Clow
1465848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
14663e519524SHoward Hinnant    size_type      count(const key_type& __k) const
14673e519524SHoward Hinnant        {return __tree_.__count_unique(__k);}
14680aacbc92SMarshall Clow#if _LIBCPP_STD_VER > 11
14690aacbc92SMarshall Clow    template <typename _K2>
14700aacbc92SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
14714887d047SNikolas Klauser    __enable_if_t<__is_transparent<_Compare, _K2>::value, size_type>
14729bfdb770SEric Fiselier    count(const _K2& __k) const {return __tree_.__count_multi(__k);}
14730aacbc92SMarshall Clow#endif
1474a17b1aedSZoe Carver
1475a17b1aedSZoe Carver#if _LIBCPP_STD_VER > 17
1476a17b1aedSZoe Carver    _LIBCPP_INLINE_VISIBILITY
1477a17b1aedSZoe Carver    bool contains(const key_type& __k) const {return find(__k) != end();}
14783fca07d7SMarek Kurdej    template <typename _K2>
14793fca07d7SMarek Kurdej    _LIBCPP_INLINE_VISIBILITY
14804887d047SNikolas Klauser    __enable_if_t<__is_transparent<_Compare, _K2>::value, bool>
14813fca07d7SMarek Kurdej    contains(const _K2& __k) const { return find(__k) != end(); }
1482a17b1aedSZoe Carver#endif // _LIBCPP_STD_VER > 17
1483a17b1aedSZoe Carver
1484848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
14853e519524SHoward Hinnant    iterator lower_bound(const key_type& __k)
14863e519524SHoward Hinnant        {return __tree_.lower_bound(__k);}
1487848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
14883e519524SHoward Hinnant    const_iterator lower_bound(const key_type& __k) const
14893e519524SHoward Hinnant        {return __tree_.lower_bound(__k);}
14902585835cSMarshall Clow#if _LIBCPP_STD_VER > 11
14912585835cSMarshall Clow    template <typename _K2>
14922585835cSMarshall Clow    _LIBCPP_INLINE_VISIBILITY
14934887d047SNikolas Klauser    __enable_if_t<__is_transparent<_Compare, _K2>::value, iterator>
14942585835cSMarshall Clow    lower_bound(const _K2& __k)       {return __tree_.lower_bound(__k);}
14952585835cSMarshall Clow
14962585835cSMarshall Clow    template <typename _K2>
14972585835cSMarshall Clow    _LIBCPP_INLINE_VISIBILITY
14984887d047SNikolas Klauser    __enable_if_t<__is_transparent<_Compare, _K2>::value, const_iterator>
14992585835cSMarshall Clow    lower_bound(const _K2& __k) const {return __tree_.lower_bound(__k);}
15002585835cSMarshall Clow#endif
15012585835cSMarshall Clow
1502848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
15033e519524SHoward Hinnant    iterator upper_bound(const key_type& __k)
15043e519524SHoward Hinnant        {return __tree_.upper_bound(__k);}
1505848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
15063e519524SHoward Hinnant    const_iterator upper_bound(const key_type& __k) const
15073e519524SHoward Hinnant        {return __tree_.upper_bound(__k);}
15082585835cSMarshall Clow#if _LIBCPP_STD_VER > 11
15092585835cSMarshall Clow    template <typename _K2>
15102585835cSMarshall Clow    _LIBCPP_INLINE_VISIBILITY
15114887d047SNikolas Klauser    __enable_if_t<__is_transparent<_Compare, _K2>::value, iterator>
15122585835cSMarshall Clow    upper_bound(const _K2& __k)       {return __tree_.upper_bound(__k);}
15132585835cSMarshall Clow    template <typename _K2>
15142585835cSMarshall Clow    _LIBCPP_INLINE_VISIBILITY
15154887d047SNikolas Klauser    __enable_if_t<__is_transparent<_Compare, _K2>::value, const_iterator>
15162585835cSMarshall Clow    upper_bound(const _K2& __k) const {return __tree_.upper_bound(__k);}
15172585835cSMarshall Clow#endif
15182585835cSMarshall Clow
1519848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
15203e519524SHoward Hinnant    pair<iterator,iterator> equal_range(const key_type& __k)
15213e519524SHoward Hinnant        {return __tree_.__equal_range_unique(__k);}
1522848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
15233e519524SHoward Hinnant    pair<const_iterator,const_iterator> equal_range(const key_type& __k) const
15243e519524SHoward Hinnant        {return __tree_.__equal_range_unique(__k);}
15252585835cSMarshall Clow#if _LIBCPP_STD_VER > 11
15262585835cSMarshall Clow    template <typename _K2>
15272585835cSMarshall Clow    _LIBCPP_INLINE_VISIBILITY
15284887d047SNikolas Klauser    __enable_if_t<__is_transparent<_Compare, _K2>::value, pair<iterator,iterator>>
15299bfdb770SEric Fiselier    equal_range(const _K2& __k)       {return __tree_.__equal_range_multi(__k);}
15302585835cSMarshall Clow    template <typename _K2>
15312585835cSMarshall Clow    _LIBCPP_INLINE_VISIBILITY
15324887d047SNikolas Klauser    __enable_if_t<__is_transparent<_Compare, _K2>::value, pair<const_iterator,const_iterator>>
15339bfdb770SEric Fiselier    equal_range(const _K2& __k) const {return __tree_.__equal_range_multi(__k);}
15342585835cSMarshall Clow#endif
15353e519524SHoward Hinnant
15363e519524SHoward Hinnantprivate:
15373e519524SHoward Hinnant    typedef typename __base::__node                    __node;
15383e519524SHoward Hinnant    typedef typename __base::__node_allocator          __node_allocator;
15393e519524SHoward Hinnant    typedef typename __base::__node_pointer            __node_pointer;
15403e519524SHoward Hinnant    typedef typename __base::__node_base_pointer       __node_base_pointer;
1541cb5cbc8bSEric Fiselier    typedef typename __base::__parent_pointer          __parent_pointer;
15420594ad71SEric Fiselier
1543c003db1fSHoward Hinnant    typedef __map_node_destructor<__node_allocator> _Dp;
1544c003db1fSHoward Hinnant    typedef unique_ptr<__node, _Dp> __node_holder;
15453e519524SHoward Hinnant
154654f0cda6SEric Fiselier#ifdef _LIBCPP_CXX03_LANG
15474a95f9ebSHoward Hinnant    __node_holder __construct_node_with_key(const key_type& __k);
154854f0cda6SEric Fiselier#endif
15493e519524SHoward Hinnant};
15503e519524SHoward Hinnant
155101666904SLouis Dionne#if _LIBCPP_STD_VER >= 17
1552f2f7d72fSLouis Dionnetemplate<class _InputIterator, class _Compare = less<__iter_key_type<_InputIterator>>,
1553f2f7d72fSLouis Dionne         class _Allocator = allocator<__iter_to_alloc_type<_InputIterator>>,
155468072a71SKonstantin Varlamov         class = enable_if_t<__is_cpp17_input_iterator<_InputIterator>::value, void>,
15554e0ea2cfSLouis Dionne         class = enable_if_t<!__is_allocator<_Compare>::value, void>,
15564e0ea2cfSLouis Dionne         class = enable_if_t<__is_allocator<_Allocator>::value, void>>
1557f2f7d72fSLouis Dionnemap(_InputIterator, _InputIterator, _Compare = _Compare(), _Allocator = _Allocator())
1558f2f7d72fSLouis Dionne  -> map<__iter_key_type<_InputIterator>, __iter_mapped_type<_InputIterator>, _Compare, _Allocator>;
1559f2f7d72fSLouis Dionne
1560f2f7d72fSLouis Dionnetemplate<class _Key, class _Tp, class _Compare = less<remove_const_t<_Key>>,
1561f2f7d72fSLouis Dionne         class _Allocator = allocator<pair<const _Key, _Tp>>,
15624e0ea2cfSLouis Dionne         class = enable_if_t<!__is_allocator<_Compare>::value, void>,
15634e0ea2cfSLouis Dionne         class = enable_if_t<__is_allocator<_Allocator>::value, void>>
1564f2f7d72fSLouis Dionnemap(initializer_list<pair<_Key, _Tp>>, _Compare = _Compare(), _Allocator = _Allocator())
1565f2f7d72fSLouis Dionne  -> map<remove_const_t<_Key>, _Tp, _Compare, _Allocator>;
1566f2f7d72fSLouis Dionne
1567f2f7d72fSLouis Dionnetemplate<class _InputIterator, class _Allocator,
156868072a71SKonstantin Varlamov         class = enable_if_t<__is_cpp17_input_iterator<_InputIterator>::value, void>,
15694e0ea2cfSLouis Dionne         class = enable_if_t<__is_allocator<_Allocator>::value, void>>
1570f2f7d72fSLouis Dionnemap(_InputIterator, _InputIterator, _Allocator)
1571f2f7d72fSLouis Dionne  -> map<__iter_key_type<_InputIterator>, __iter_mapped_type<_InputIterator>,
1572f2f7d72fSLouis Dionne         less<__iter_key_type<_InputIterator>>, _Allocator>;
1573f2f7d72fSLouis Dionne
1574f2f7d72fSLouis Dionnetemplate<class _Key, class _Tp, class _Allocator,
15754e0ea2cfSLouis Dionne         class = enable_if_t<__is_allocator<_Allocator>::value, void>>
1576f2f7d72fSLouis Dionnemap(initializer_list<pair<_Key, _Tp>>, _Allocator)
1577f2f7d72fSLouis Dionne  -> map<remove_const_t<_Key>, _Tp, less<remove_const_t<_Key>>, _Allocator>;
1578f2f7d72fSLouis Dionne#endif
15790594ad71SEric Fiselier
15805e3ea4ddSEric Fiselier#ifndef _LIBCPP_CXX03_LANG
15813e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator>
15823e519524SHoward Hinnantmap<_Key, _Tp, _Compare, _Allocator>::map(map&& __m, const allocator_type& __a)
15832a10c960SMarshall Clow    : __tree_(_VSTD::move(__m.__tree_), typename __base::allocator_type(__a))
15843e519524SHoward Hinnant{
15853e519524SHoward Hinnant    if (__a != __m.get_allocator())
15863e519524SHoward Hinnant    {
15873e519524SHoward Hinnant        const_iterator __e = cend();
15883e519524SHoward Hinnant        while (!__m.empty())
15893e519524SHoward Hinnant            __tree_.__insert_unique(__e.__i_,
1590f52318b4SErik Pilkington                    __m.__tree_.remove(__m.begin().__i_)->__value_.__move());
15913e519524SHoward Hinnant    }
15923e519524SHoward Hinnant}
15933e519524SHoward Hinnant
159418293116SEric Fiseliertemplate <class _Key, class _Tp, class _Compare, class _Allocator>
159518293116SEric Fiselier_Tp&
159618293116SEric Fiseliermap<_Key, _Tp, _Compare, _Allocator>::operator[](const key_type& __k)
159718293116SEric Fiselier{
159818293116SEric Fiselier    return __tree_.__emplace_unique_key_args(__k,
159918293116SEric Fiselier        _VSTD::piecewise_construct,
160018293116SEric Fiselier        _VSTD::forward_as_tuple(__k),
1601f52318b4SErik Pilkington        _VSTD::forward_as_tuple()).first->__get_value().second;
160218293116SEric Fiselier}
16033e519524SHoward Hinnant
160418293116SEric Fiseliertemplate <class _Key, class _Tp, class _Compare, class _Allocator>
160518293116SEric Fiselier_Tp&
160618293116SEric Fiseliermap<_Key, _Tp, _Compare, _Allocator>::operator[](key_type&& __k)
160718293116SEric Fiselier{
160818293116SEric Fiselier    return __tree_.__emplace_unique_key_args(__k,
160918293116SEric Fiselier        _VSTD::piecewise_construct,
161018293116SEric Fiselier        _VSTD::forward_as_tuple(_VSTD::move(__k)),
1611f52318b4SErik Pilkington        _VSTD::forward_as_tuple()).first->__get_value().second;
161218293116SEric Fiselier}
161354f0cda6SEric Fiselier
161418293116SEric Fiselier#else // _LIBCPP_CXX03_LANG
161554f0cda6SEric Fiselier
16163e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator>
16173e519524SHoward Hinnanttypename map<_Key, _Tp, _Compare, _Allocator>::__node_holder
16184a95f9ebSHoward Hinnantmap<_Key, _Tp, _Compare, _Allocator>::__construct_node_with_key(const key_type& __k)
16193e519524SHoward Hinnant{
16203e519524SHoward Hinnant    __node_allocator& __na = __tree_.__node_alloc();
1621c003db1fSHoward Hinnant    __node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na));
1622f52318b4SErik Pilkington    __node_traits::construct(__na, _VSTD::addressof(__h->__value_.__get_value().first), __k);
16233e519524SHoward Hinnant    __h.get_deleter().__first_constructed = true;
1624f52318b4SErik Pilkington    __node_traits::construct(__na, _VSTD::addressof(__h->__value_.__get_value().second));
16253e519524SHoward Hinnant    __h.get_deleter().__second_constructed = true;
16268d4860aaSLouis Dionne    return __h;
16273e519524SHoward Hinnant}
16283e519524SHoward Hinnant
16293e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator>
16303e519524SHoward Hinnant_Tp&
16313e519524SHoward Hinnantmap<_Key, _Tp, _Compare, _Allocator>::operator[](const key_type& __k)
16323e519524SHoward Hinnant{
1633cb5cbc8bSEric Fiselier    __parent_pointer __parent;
1634cb5cbc8bSEric Fiselier    __node_base_pointer& __child = __tree_.__find_equal(__parent, __k);
16353e519524SHoward Hinnant    __node_pointer __r = static_cast<__node_pointer>(__child);
16363e519524SHoward Hinnant    if (__child == nullptr)
16373e519524SHoward Hinnant    {
16384a95f9ebSHoward Hinnant        __node_holder __h = __construct_node_with_key(__k);
163907d3eccdSHoward Hinnant        __tree_.__insert_node_at(__parent, __child, static_cast<__node_base_pointer>(__h.get()));
16403e519524SHoward Hinnant        __r = __h.release();
16413e519524SHoward Hinnant    }
1642f52318b4SErik Pilkington    return __r->__value_.__get_value().second;
16433e519524SHoward Hinnant}
16443e519524SHoward Hinnant
164518293116SEric Fiselier#endif // _LIBCPP_CXX03_LANG
16463e519524SHoward Hinnant
16473e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator>
16483e519524SHoward Hinnant_Tp&
16493e519524SHoward Hinnantmap<_Key, _Tp, _Compare, _Allocator>::at(const key_type& __k)
16503e519524SHoward Hinnant{
1651cb5cbc8bSEric Fiselier    __parent_pointer __parent;
1652cb5cbc8bSEric Fiselier    __node_base_pointer& __child = __tree_.__find_equal(__parent, __k);
16533e519524SHoward Hinnant    if (__child == nullptr)
16547232a84eSLouis Dionne        __throw_out_of_range("map::at:  key not found");
1655f52318b4SErik Pilkington    return static_cast<__node_pointer>(__child)->__value_.__get_value().second;
16563e519524SHoward Hinnant}
16573e519524SHoward Hinnant
16583e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator>
16593e519524SHoward Hinnantconst _Tp&
16603e519524SHoward Hinnantmap<_Key, _Tp, _Compare, _Allocator>::at(const key_type& __k) const
16613e519524SHoward Hinnant{
1662cb5cbc8bSEric Fiselier    __parent_pointer __parent;
1663cb5cbc8bSEric Fiselier    __node_base_pointer __child = __tree_.__find_equal(__parent, __k);
16643e519524SHoward Hinnant    if (__child == nullptr)
16657232a84eSLouis Dionne        __throw_out_of_range("map::at:  key not found");
1666f52318b4SErik Pilkington    return static_cast<__node_pointer>(__child)->__value_.__get_value().second;
16673e519524SHoward Hinnant}
16683e519524SHoward Hinnant
16693e519524SHoward Hinnant
16703e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator>
1671848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
16723e519524SHoward Hinnantbool
16733e519524SHoward Hinnantoperator==(const map<_Key, _Tp, _Compare, _Allocator>& __x,
16743e519524SHoward Hinnant           const map<_Key, _Tp, _Compare, _Allocator>& __y)
16753e519524SHoward Hinnant{
1676ce48a113SHoward Hinnant    return __x.size() == __y.size() && _VSTD::equal(__x.begin(), __x.end(), __y.begin());
16773e519524SHoward Hinnant}
16783e519524SHoward Hinnant
16793e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator>
1680848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
16813e519524SHoward Hinnantbool
16823e519524SHoward Hinnantoperator< (const map<_Key, _Tp, _Compare, _Allocator>& __x,
16833e519524SHoward Hinnant           const map<_Key, _Tp, _Compare, _Allocator>& __y)
16843e519524SHoward Hinnant{
1685ce48a113SHoward Hinnant    return _VSTD::lexicographical_compare(__x.begin(), __x.end(), __y.begin(), __y.end());
16863e519524SHoward Hinnant}
16873e519524SHoward Hinnant
16883e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator>
1689848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
16903e519524SHoward Hinnantbool
16913e519524SHoward Hinnantoperator!=(const map<_Key, _Tp, _Compare, _Allocator>& __x,
16923e519524SHoward Hinnant           const map<_Key, _Tp, _Compare, _Allocator>& __y)
16933e519524SHoward Hinnant{
16943e519524SHoward Hinnant    return !(__x == __y);
16953e519524SHoward Hinnant}
16963e519524SHoward Hinnant
16973e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator>
1698848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
16993e519524SHoward Hinnantbool
17003e519524SHoward Hinnantoperator> (const map<_Key, _Tp, _Compare, _Allocator>& __x,
17013e519524SHoward Hinnant           const map<_Key, _Tp, _Compare, _Allocator>& __y)
17023e519524SHoward Hinnant{
17033e519524SHoward Hinnant    return __y < __x;
17043e519524SHoward Hinnant}
17053e519524SHoward Hinnant
17063e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator>
1707848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
17083e519524SHoward Hinnantbool
17093e519524SHoward Hinnantoperator>=(const map<_Key, _Tp, _Compare, _Allocator>& __x,
17103e519524SHoward Hinnant           const map<_Key, _Tp, _Compare, _Allocator>& __y)
17113e519524SHoward Hinnant{
17123e519524SHoward Hinnant    return !(__x < __y);
17133e519524SHoward Hinnant}
17143e519524SHoward Hinnant
17153e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator>
1716848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
17173e519524SHoward Hinnantbool
17183e519524SHoward Hinnantoperator<=(const map<_Key, _Tp, _Compare, _Allocator>& __x,
17193e519524SHoward Hinnant           const map<_Key, _Tp, _Compare, _Allocator>& __y)
17203e519524SHoward Hinnant{
17213e519524SHoward Hinnant    return !(__y < __x);
17223e519524SHoward Hinnant}
17233e519524SHoward Hinnant
17243e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator>
1725848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
17263e519524SHoward Hinnantvoid
17273e519524SHoward Hinnantswap(map<_Key, _Tp, _Compare, _Allocator>& __x,
17283e519524SHoward Hinnant     map<_Key, _Tp, _Compare, _Allocator>& __y)
17291052ee39SHoward Hinnant    _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
17303e519524SHoward Hinnant{
17313e519524SHoward Hinnant    __x.swap(__y);
17323e519524SHoward Hinnant}
17333e519524SHoward Hinnant
1734f60c63c0SMarshall Clow#if _LIBCPP_STD_VER > 17
17353e895085SMarek Kurdejtemplate <class _Key, class _Tp, class _Compare, class _Allocator,
17363e895085SMarek Kurdej          class _Predicate>
1737f60c63c0SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY
17383e895085SMarek Kurdej    typename map<_Key, _Tp, _Compare, _Allocator>::size_type
17393e895085SMarek Kurdej    erase_if(map<_Key, _Tp, _Compare, _Allocator>& __c, _Predicate __pred) {
17402ac6babcSArthur O'Dwyer  return _VSTD::__libcpp_erase_if_container(__c, __pred);
17413e895085SMarek Kurdej}
1742f60c63c0SMarshall Clow#endif
1743f60c63c0SMarshall Clow
1744f60c63c0SMarshall Clow
17453e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare = less<_Key>,
17463e519524SHoward Hinnant          class _Allocator = allocator<pair<const _Key, _Tp> > >
1747e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS multimap
17483e519524SHoward Hinnant{
17493e519524SHoward Hinnantpublic:
17503e519524SHoward Hinnant    // types:
17513e519524SHoward Hinnant    typedef _Key                                     key_type;
17523e519524SHoward Hinnant    typedef _Tp                                      mapped_type;
17533e519524SHoward Hinnant    typedef pair<const key_type, mapped_type>        value_type;
17543c6bd176SNikolas Klauser    typedef __type_identity_t<_Compare>              key_compare;
17553c6bd176SNikolas Klauser    typedef __type_identity_t<_Allocator>            allocator_type;
17563e519524SHoward Hinnant    typedef value_type&                              reference;
17573e519524SHoward Hinnant    typedef const value_type&                        const_reference;
17583e519524SHoward Hinnant
175994f89aeeSMarshall Clow    static_assert((is_same<typename allocator_type::value_type, value_type>::value),
176094f89aeeSMarshall Clow                  "Allocator::value_type must be same type as value_type");
176194f89aeeSMarshall Clow
1762e2f2d1edSEric Fiselier    class _LIBCPP_TEMPLATE_VIS value_compare
1763681cde7dSNikolas Klauser        : public __binary_function<value_type, value_type, bool>
17643e519524SHoward Hinnant    {
17653e519524SHoward Hinnant        friend class multimap;
17663e519524SHoward Hinnant    protected:
17673e519524SHoward Hinnant        key_compare comp;
17683e519524SHoward Hinnant
1769848a5374SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
1770*b48c5010SNikolas Klauser        value_compare(key_compare __c) : comp(__c) {}
17713e519524SHoward Hinnant    public:
1772848a5374SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
17733e519524SHoward Hinnant        bool operator()(const value_type& __x, const value_type& __y) const
17743e519524SHoward Hinnant            {return comp(__x.first, __y.first);}
17753e519524SHoward Hinnant    };
17763e519524SHoward Hinnant
17773e519524SHoward Hinnantprivate:
177807d3eccdSHoward Hinnant
17799fd9f84fSHoward Hinnant    typedef _VSTD::__value_type<key_type, mapped_type>             __value_type;
1780abb160e6SHoward Hinnant    typedef __map_value_compare<key_type, __value_type, key_compare> __vc;
17811f508014SMarshall Clow    typedef typename __rebind_alloc_helper<allocator_traits<allocator_type>,
17821f508014SMarshall Clow                                                 __value_type>::type __allocator_type;
17833e519524SHoward Hinnant    typedef __tree<__value_type, __vc, __allocator_type>            __base;
17843e519524SHoward Hinnant    typedef typename __base::__node_traits                          __node_traits;
17853e519524SHoward Hinnant    typedef allocator_traits<allocator_type>                        __alloc_traits;
17863e519524SHoward Hinnant
17873e519524SHoward Hinnant    __base __tree_;
17883e519524SHoward Hinnant
17893e519524SHoward Hinnantpublic:
17903e519524SHoward Hinnant    typedef typename __alloc_traits::pointer               pointer;
17913e519524SHoward Hinnant    typedef typename __alloc_traits::const_pointer         const_pointer;
17923e519524SHoward Hinnant    typedef typename __alloc_traits::size_type             size_type;
17933e519524SHoward Hinnant    typedef typename __alloc_traits::difference_type       difference_type;
17943e519524SHoward Hinnant    typedef __map_iterator<typename __base::iterator>      iterator;
17953e519524SHoward Hinnant    typedef __map_const_iterator<typename __base::const_iterator> const_iterator;
1796ce48a113SHoward Hinnant    typedef _VSTD::reverse_iterator<iterator>               reverse_iterator;
1797ce48a113SHoward Hinnant    typedef _VSTD::reverse_iterator<const_iterator>         const_reverse_iterator;
17983e519524SHoward Hinnant
1799b0386a51SErik Pilkington#if _LIBCPP_STD_VER > 14
1800b0386a51SErik Pilkington    typedef __map_node_handle<typename __base::__node, allocator_type> node_type;
1801b0386a51SErik Pilkington#endif
1802b0386a51SErik Pilkington
18035c4e07aeSErik Pilkington    template <class _Key2, class _Value2, class _Comp2, class _Alloc2>
18045c4e07aeSErik Pilkington        friend class _LIBCPP_TEMPLATE_VIS map;
18055c4e07aeSErik Pilkington    template <class _Key2, class _Value2, class _Comp2, class _Alloc2>
18065c4e07aeSErik Pilkington        friend class _LIBCPP_TEMPLATE_VIS multimap;
18075c4e07aeSErik Pilkington
1808848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
1809415a24e4SMarshall Clow    multimap()
1810415a24e4SMarshall Clow        _NOEXCEPT_(
1811415a24e4SMarshall Clow            is_nothrow_default_constructible<allocator_type>::value &&
1812415a24e4SMarshall Clow            is_nothrow_default_constructible<key_compare>::value &&
1813415a24e4SMarshall Clow            is_nothrow_copy_constructible<key_compare>::value)
1814415a24e4SMarshall Clow        : __tree_(__vc(key_compare())) {}
1815415a24e4SMarshall Clow
1816415a24e4SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
1817415a24e4SMarshall Clow    explicit multimap(const key_compare& __comp)
18181052ee39SHoward Hinnant        _NOEXCEPT_(
18191052ee39SHoward Hinnant            is_nothrow_default_constructible<allocator_type>::value &&
18201052ee39SHoward Hinnant            is_nothrow_copy_constructible<key_compare>::value)
18213e519524SHoward Hinnant        : __tree_(__vc(__comp)) {}
18223e519524SHoward Hinnant
1823848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
18243e519524SHoward Hinnant    explicit multimap(const key_compare& __comp, const allocator_type& __a)
18252a10c960SMarshall Clow        : __tree_(__vc(__comp), typename __base::allocator_type(__a)) {}
18263e519524SHoward Hinnant
18273e519524SHoward Hinnant    template <class _InputIterator>
1828848a5374SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
18293e519524SHoward Hinnant        multimap(_InputIterator __f, _InputIterator __l,
18303e519524SHoward Hinnant            const key_compare& __comp = key_compare())
18313e519524SHoward Hinnant        : __tree_(__vc(__comp))
18323e519524SHoward Hinnant        {
18333e519524SHoward Hinnant            insert(__f, __l);
18343e519524SHoward Hinnant        }
18353e519524SHoward Hinnant
18363e519524SHoward Hinnant    template <class _InputIterator>
1837848a5374SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
18383e519524SHoward Hinnant        multimap(_InputIterator __f, _InputIterator __l,
18393e519524SHoward Hinnant            const key_compare& __comp, const allocator_type& __a)
18402a10c960SMarshall Clow        : __tree_(__vc(__comp), typename __base::allocator_type(__a))
18413e519524SHoward Hinnant        {
18423e519524SHoward Hinnant            insert(__f, __l);
18433e519524SHoward Hinnant        }
18443e519524SHoward Hinnant
1845fbc317d4SMarshall Clow#if _LIBCPP_STD_VER > 11
1846fbc317d4SMarshall Clow    template <class _InputIterator>
1847fbc317d4SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
1848fbc317d4SMarshall Clow    multimap(_InputIterator __f, _InputIterator __l, const allocator_type& __a)
1849fbc317d4SMarshall Clow        : multimap(__f, __l, key_compare(), __a) {}
1850fbc317d4SMarshall Clow#endif
1851fbc317d4SMarshall Clow
1852848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
18533e519524SHoward Hinnant    multimap(const multimap& __m)
18543e519524SHoward Hinnant        : __tree_(__m.__tree_.value_comp(),
18553e519524SHoward Hinnant          __alloc_traits::select_on_container_copy_construction(__m.__tree_.__alloc()))
18563e519524SHoward Hinnant        {
18573e519524SHoward Hinnant            insert(__m.begin(), __m.end());
18583e519524SHoward Hinnant        }
18593e519524SHoward Hinnant
18605a33687dSHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
18615a33687dSHoward Hinnant    multimap& operator=(const multimap& __m)
18625a33687dSHoward Hinnant        {
18632ee83725SMarshall Clow#ifndef _LIBCPP_CXX03_LANG
18645a33687dSHoward Hinnant            __tree_ = __m.__tree_;
186507d3eccdSHoward Hinnant#else
1866b8608b87SMark de Wever            if (this != _VSTD::addressof(__m)) {
186707d3eccdSHoward Hinnant                __tree_.clear();
186807d3eccdSHoward Hinnant                __tree_.value_comp() = __m.__tree_.value_comp();
186907d3eccdSHoward Hinnant                __tree_.__copy_assign_alloc(__m.__tree_);
187007d3eccdSHoward Hinnant                insert(__m.begin(), __m.end());
187174cf6ff5SMarshall Clow            }
187207d3eccdSHoward Hinnant#endif
18735a33687dSHoward Hinnant            return *this;
18745a33687dSHoward Hinnant        }
18755a33687dSHoward Hinnant
187618293116SEric Fiselier#ifndef _LIBCPP_CXX03_LANG
18773e519524SHoward Hinnant
1878848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
18793e519524SHoward Hinnant    multimap(multimap&& __m)
18801052ee39SHoward Hinnant        _NOEXCEPT_(is_nothrow_move_constructible<__base>::value)
1881ce48a113SHoward Hinnant        : __tree_(_VSTD::move(__m.__tree_))
18823e519524SHoward Hinnant        {
18833e519524SHoward Hinnant        }
18843e519524SHoward Hinnant
18853e519524SHoward Hinnant    multimap(multimap&& __m, const allocator_type& __a);
18863e519524SHoward Hinnant
1887848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
188854976f26SHoward Hinnant    multimap& operator=(multimap&& __m)
188954976f26SHoward Hinnant        _NOEXCEPT_(is_nothrow_move_assignable<__base>::value)
189054976f26SHoward Hinnant        {
189154976f26SHoward Hinnant            __tree_ = _VSTD::move(__m.__tree_);
189254976f26SHoward Hinnant            return *this;
189354976f26SHoward Hinnant        }
189454976f26SHoward Hinnant
189554976f26SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
18963e519524SHoward Hinnant    multimap(initializer_list<value_type> __il, const key_compare& __comp = key_compare())
18973e519524SHoward Hinnant        : __tree_(__vc(__comp))
18983e519524SHoward Hinnant        {
18993e519524SHoward Hinnant            insert(__il.begin(), __il.end());
19003e519524SHoward Hinnant        }
19013e519524SHoward Hinnant
1902848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
19033e519524SHoward Hinnant    multimap(initializer_list<value_type> __il, const key_compare& __comp, const allocator_type& __a)
19042a10c960SMarshall Clow        : __tree_(__vc(__comp), typename __base::allocator_type(__a))
19053e519524SHoward Hinnant        {
19063e519524SHoward Hinnant            insert(__il.begin(), __il.end());
19073e519524SHoward Hinnant        }
19083e519524SHoward Hinnant
1909fbc317d4SMarshall Clow#if _LIBCPP_STD_VER > 11
1910fbc317d4SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
1911fbc317d4SMarshall Clow    multimap(initializer_list<value_type> __il, const allocator_type& __a)
1912fbc317d4SMarshall Clow        : multimap(__il, key_compare(), __a) {}
1913fbc317d4SMarshall Clow#endif
1914fbc317d4SMarshall Clow
1915848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
19163e519524SHoward Hinnant    multimap& operator=(initializer_list<value_type> __il)
19173e519524SHoward Hinnant        {
19183e519524SHoward Hinnant            __tree_.__assign_multi(__il.begin(), __il.end());
19193e519524SHoward Hinnant            return *this;
19203e519524SHoward Hinnant        }
192154976f26SHoward Hinnant
192218293116SEric Fiselier#endif // _LIBCPP_CXX03_LANG
19233e519524SHoward Hinnant
1924848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
19253e519524SHoward Hinnant    explicit multimap(const allocator_type& __a)
19262a10c960SMarshall Clow        : __tree_(typename __base::allocator_type(__a))
19273e519524SHoward Hinnant        {
19283e519524SHoward Hinnant        }
19293e519524SHoward Hinnant
1930848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
19313e519524SHoward Hinnant    multimap(const multimap& __m, const allocator_type& __a)
19322a10c960SMarshall Clow        : __tree_(__m.__tree_.value_comp(), typename __base::allocator_type(__a))
19333e519524SHoward Hinnant        {
19343e519524SHoward Hinnant            insert(__m.begin(), __m.end());
19353e519524SHoward Hinnant        }
19363e519524SHoward Hinnant
1937848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
19387c142fccSLouis Dionne    ~multimap() {
19397c142fccSLouis Dionne        static_assert(sizeof(__diagnose_non_const_comparator<_Key, _Compare>()), "");
19407c142fccSLouis Dionne    }
19417c142fccSLouis Dionne
19427c142fccSLouis Dionne    _LIBCPP_INLINE_VISIBILITY
19431052ee39SHoward Hinnant          iterator begin() _NOEXCEPT {return __tree_.begin();}
1944848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
19451052ee39SHoward Hinnant    const_iterator begin() const _NOEXCEPT {return __tree_.begin();}
1946848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
19471052ee39SHoward Hinnant          iterator end() _NOEXCEPT {return __tree_.end();}
1948848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
19491052ee39SHoward Hinnant    const_iterator end() const _NOEXCEPT {return __tree_.end();}
19503e519524SHoward Hinnant
1951848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
19521052ee39SHoward Hinnant          reverse_iterator rbegin() _NOEXCEPT {return reverse_iterator(end());}
1953848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
19541052ee39SHoward Hinnant    const_reverse_iterator rbegin() const _NOEXCEPT
19551052ee39SHoward Hinnant        {return const_reverse_iterator(end());}
1956848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
19571052ee39SHoward Hinnant          reverse_iterator rend() _NOEXCEPT {return reverse_iterator(begin());}
1958848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
19591052ee39SHoward Hinnant    const_reverse_iterator rend() const _NOEXCEPT
19601052ee39SHoward Hinnant        {return const_reverse_iterator(begin());}
19613e519524SHoward Hinnant
1962848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
19631052ee39SHoward Hinnant    const_iterator cbegin()  const _NOEXCEPT {return begin();}
1964848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
19651052ee39SHoward Hinnant    const_iterator cend() const _NOEXCEPT {return end();}
1966848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
19671052ee39SHoward Hinnant    const_reverse_iterator crbegin() const _NOEXCEPT {return rbegin();}
1968848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
19691052ee39SHoward Hinnant    const_reverse_iterator crend() const _NOEXCEPT {return rend();}
19703e519524SHoward Hinnant
197172c8fad4SMarshall Clow    _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY
19721052ee39SHoward Hinnant    bool empty() const _NOEXCEPT {return __tree_.size() == 0;}
1973848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
19741052ee39SHoward Hinnant    size_type size() const _NOEXCEPT {return __tree_.size();}
1975848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
19761052ee39SHoward Hinnant    size_type max_size() const _NOEXCEPT {return __tree_.max_size();}
19773e519524SHoward Hinnant
1978848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
19792a10c960SMarshall Clow    allocator_type get_allocator() const _NOEXCEPT {return allocator_type(__tree_.__alloc());}
1980848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
19813e519524SHoward Hinnant    key_compare    key_comp() const {return __tree_.value_comp().key_comp();}
1982848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
19831052ee39SHoward Hinnant    value_compare  value_comp() const
19841052ee39SHoward Hinnant        {return value_compare(__tree_.value_comp().key_comp());}
19853e519524SHoward Hinnant
19865e3ea4ddSEric Fiselier#ifndef _LIBCPP_CXX03_LANG
19877609c9b6SHoward Hinnant
19888b805c91SHoward Hinnant    template <class ..._Args>
19895e3ea4ddSEric Fiselier    _LIBCPP_INLINE_VISIBILITY
19905e3ea4ddSEric Fiselier    iterator emplace(_Args&& ...__args) {
19915e3ea4ddSEric Fiselier        return __tree_.__emplace_multi(_VSTD::forward<_Args>(__args)...);
19925e3ea4ddSEric Fiselier    }
19933e519524SHoward Hinnant
19948b805c91SHoward Hinnant    template <class ..._Args>
19955e3ea4ddSEric Fiselier    _LIBCPP_INLINE_VISIBILITY
19965e3ea4ddSEric Fiselier    iterator emplace_hint(const_iterator __p, _Args&& ...__args) {
19975e3ea4ddSEric Fiselier        return __tree_.__emplace_hint_multi(__p.__i_, _VSTD::forward<_Args>(__args)...);
19985e3ea4ddSEric Fiselier    }
19997609c9b6SHoward Hinnant
2000c003db1fSHoward Hinnant    template <class _Pp,
20014887d047SNikolas Klauser              class = __enable_if_t<is_constructible<value_type, _Pp>::value>>
2002848a5374SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
2003c003db1fSHoward Hinnant        iterator insert(_Pp&& __p)
2004c003db1fSHoward Hinnant            {return __tree_.__insert_multi(_VSTD::forward<_Pp>(__p));}
20053e519524SHoward Hinnant
2006c003db1fSHoward Hinnant    template <class _Pp,
20074887d047SNikolas Klauser              class = __enable_if_t<is_constructible<value_type, _Pp>::value>>
2008848a5374SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
2009c003db1fSHoward Hinnant        iterator insert(const_iterator __pos, _Pp&& __p)
2010c003db1fSHoward Hinnant            {return __tree_.__insert_multi(__pos.__i_, _VSTD::forward<_Pp>(__p));}
20113e519524SHoward Hinnant
20127a9f500fSEric Fiselier    _LIBCPP_INLINE_VISIBILITY
20137a9f500fSEric Fiselier    iterator insert(value_type&& __v)
20147a9f500fSEric Fiselier        {return __tree_.__insert_multi(_VSTD::move(__v));}
20157a9f500fSEric Fiselier
20167a9f500fSEric Fiselier    _LIBCPP_INLINE_VISIBILITY
20177a9f500fSEric Fiselier    iterator insert(const_iterator __p, value_type&& __v)
20187a9f500fSEric Fiselier        {return __tree_.__insert_multi(__p.__i_, _VSTD::move(__v));}
20197a9f500fSEric Fiselier
202018293116SEric Fiselier
202118293116SEric Fiselier    _LIBCPP_INLINE_VISIBILITY
202218293116SEric Fiselier    void insert(initializer_list<value_type> __il)
202318293116SEric Fiselier        {insert(__il.begin(), __il.end());}
202418293116SEric Fiselier
20255e3ea4ddSEric Fiselier#endif // _LIBCPP_CXX03_LANG
20263e519524SHoward Hinnant
2027848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
20283e519524SHoward Hinnant    iterator insert(const value_type& __v) {return __tree_.__insert_multi(__v);}
20293e519524SHoward Hinnant
2030848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
20313e519524SHoward Hinnant    iterator insert(const_iterator __p, const value_type& __v)
20323e519524SHoward Hinnant            {return __tree_.__insert_multi(__p.__i_, __v);}
20333e519524SHoward Hinnant
20343e519524SHoward Hinnant    template <class _InputIterator>
2035848a5374SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
20363e519524SHoward Hinnant        void insert(_InputIterator __f, _InputIterator __l)
20373e519524SHoward Hinnant        {
20383e519524SHoward Hinnant            for (const_iterator __e = cend(); __f != __l; ++__f)
20393e519524SHoward Hinnant                __tree_.__insert_multi(__e.__i_, *__f);
20403e519524SHoward Hinnant        }
20413e519524SHoward Hinnant
2042848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
20433e519524SHoward Hinnant    iterator erase(const_iterator __p) {return __tree_.erase(__p.__i_);}
2044848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
2045ec392968SMarshall Clow    iterator erase(iterator __p)       {return __tree_.erase(__p.__i_);}
2046ec392968SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
20473e519524SHoward Hinnant    size_type erase(const key_type& __k) {return __tree_.__erase_multi(__k);}
2048848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
20493e519524SHoward Hinnant    iterator  erase(const_iterator __f, const_iterator __l)
20503e519524SHoward Hinnant        {return __tree_.erase(__f.__i_, __l.__i_);}
2051b0386a51SErik Pilkington
2052b0386a51SErik Pilkington#if _LIBCPP_STD_VER > 14
2053b0386a51SErik Pilkington    _LIBCPP_INLINE_VISIBILITY
2054b0386a51SErik Pilkington    iterator insert(node_type&& __nh)
2055b0386a51SErik Pilkington    {
2056b0386a51SErik Pilkington        _LIBCPP_ASSERT(__nh.empty() || __nh.get_allocator() == get_allocator(),
2057b0386a51SErik Pilkington            "node_type with incompatible allocator passed to multimap::insert()");
2058b0386a51SErik Pilkington        return __tree_.template __node_handle_insert_multi<node_type>(
2059b0386a51SErik Pilkington            _VSTD::move(__nh));
2060b0386a51SErik Pilkington    }
2061b0386a51SErik Pilkington    _LIBCPP_INLINE_VISIBILITY
2062b0386a51SErik Pilkington    iterator insert(const_iterator __hint, node_type&& __nh)
2063b0386a51SErik Pilkington    {
2064b0386a51SErik Pilkington        _LIBCPP_ASSERT(__nh.empty() || __nh.get_allocator() == get_allocator(),
2065b0386a51SErik Pilkington            "node_type with incompatible allocator passed to multimap::insert()");
2066b0386a51SErik Pilkington        return __tree_.template __node_handle_insert_multi<node_type>(
2067b0386a51SErik Pilkington            __hint.__i_, _VSTD::move(__nh));
2068b0386a51SErik Pilkington    }
2069b0386a51SErik Pilkington    _LIBCPP_INLINE_VISIBILITY
2070b0386a51SErik Pilkington    node_type extract(key_type const& __key)
2071b0386a51SErik Pilkington    {
2072b0386a51SErik Pilkington        return __tree_.template __node_handle_extract<node_type>(__key);
2073b0386a51SErik Pilkington    }
2074b0386a51SErik Pilkington    _LIBCPP_INLINE_VISIBILITY
2075b0386a51SErik Pilkington    node_type extract(const_iterator __it)
2076b0386a51SErik Pilkington    {
2077b0386a51SErik Pilkington        return __tree_.template __node_handle_extract<node_type>(
2078b0386a51SErik Pilkington            __it.__i_);
2079b0386a51SErik Pilkington    }
20808df1d5a5SLouis Dionne    template <class _Compare2>
20815c4e07aeSErik Pilkington    _LIBCPP_INLINE_VISIBILITY
20828df1d5a5SLouis Dionne    void merge(multimap<key_type, mapped_type, _Compare2, allocator_type>& __source)
20835c4e07aeSErik Pilkington    {
20845c4e07aeSErik Pilkington        _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
20855c4e07aeSErik Pilkington                       "merging container with incompatible allocator");
20865c4e07aeSErik Pilkington        return __tree_.__node_handle_merge_multi(__source.__tree_);
20875c4e07aeSErik Pilkington    }
20888df1d5a5SLouis Dionne    template <class _Compare2>
20895c4e07aeSErik Pilkington    _LIBCPP_INLINE_VISIBILITY
20908df1d5a5SLouis Dionne    void merge(multimap<key_type, mapped_type, _Compare2, allocator_type>&& __source)
20915c4e07aeSErik Pilkington    {
20925c4e07aeSErik Pilkington        _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
20935c4e07aeSErik Pilkington                       "merging container with incompatible allocator");
20945c4e07aeSErik Pilkington        return __tree_.__node_handle_merge_multi(__source.__tree_);
20955c4e07aeSErik Pilkington    }
20968df1d5a5SLouis Dionne    template <class _Compare2>
20975c4e07aeSErik Pilkington    _LIBCPP_INLINE_VISIBILITY
20988df1d5a5SLouis Dionne    void merge(map<key_type, mapped_type, _Compare2, allocator_type>& __source)
20995c4e07aeSErik Pilkington    {
21005c4e07aeSErik Pilkington        _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
21015c4e07aeSErik Pilkington                       "merging container with incompatible allocator");
21025c4e07aeSErik Pilkington        return __tree_.__node_handle_merge_multi(__source.__tree_);
21035c4e07aeSErik Pilkington    }
21048df1d5a5SLouis Dionne    template <class _Compare2>
21055c4e07aeSErik Pilkington    _LIBCPP_INLINE_VISIBILITY
21068df1d5a5SLouis Dionne    void merge(map<key_type, mapped_type, _Compare2, allocator_type>&& __source)
21075c4e07aeSErik Pilkington    {
21085c4e07aeSErik Pilkington        _LIBCPP_ASSERT(__source.get_allocator() == get_allocator(),
21095c4e07aeSErik Pilkington                       "merging container with incompatible allocator");
21105c4e07aeSErik Pilkington        return __tree_.__node_handle_merge_multi(__source.__tree_);
21115c4e07aeSErik Pilkington    }
2112b0386a51SErik Pilkington#endif
2113b0386a51SErik Pilkington
2114848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
2115934e9a39SMarshall Clow    void clear() _NOEXCEPT {__tree_.clear();}
21163e519524SHoward Hinnant
2117848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
21181052ee39SHoward Hinnant    void swap(multimap& __m)
21191052ee39SHoward Hinnant        _NOEXCEPT_(__is_nothrow_swappable<__base>::value)
21201052ee39SHoward Hinnant        {__tree_.swap(__m.__tree_);}
21213e519524SHoward Hinnant
2122848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
21233e519524SHoward Hinnant    iterator find(const key_type& __k)             {return __tree_.find(__k);}
2124848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
21253e519524SHoward Hinnant    const_iterator find(const key_type& __k) const {return __tree_.find(__k);}
21262585835cSMarshall Clow#if _LIBCPP_STD_VER > 11
21272585835cSMarshall Clow    template <typename _K2>
21282585835cSMarshall Clow    _LIBCPP_INLINE_VISIBILITY
21294887d047SNikolas Klauser    __enable_if_t<__is_transparent<_Compare, _K2>::value, iterator>
21302585835cSMarshall Clow    find(const _K2& __k)                           {return __tree_.find(__k);}
21312585835cSMarshall Clow    template <typename _K2>
21322585835cSMarshall Clow    _LIBCPP_INLINE_VISIBILITY
21334887d047SNikolas Klauser    __enable_if_t<__is_transparent<_Compare, _K2>::value, const_iterator>
21342585835cSMarshall Clow    find(const _K2& __k) const                     {return __tree_.find(__k);}
21352585835cSMarshall Clow#endif
21362585835cSMarshall Clow
2137848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
21383e519524SHoward Hinnant    size_type      count(const key_type& __k) const
21393e519524SHoward Hinnant        {return __tree_.__count_multi(__k);}
21400aacbc92SMarshall Clow#if _LIBCPP_STD_VER > 11
21410aacbc92SMarshall Clow    template <typename _K2>
21420aacbc92SMarshall Clow    _LIBCPP_INLINE_VISIBILITY
21434887d047SNikolas Klauser    __enable_if_t<__is_transparent<_Compare, _K2>::value, size_type>
2144f8457a07SMarshall Clow    count(const _K2& __k) const {return __tree_.__count_multi(__k);}
21450aacbc92SMarshall Clow#endif
2146a17b1aedSZoe Carver
2147a17b1aedSZoe Carver#if _LIBCPP_STD_VER > 17
2148a17b1aedSZoe Carver    _LIBCPP_INLINE_VISIBILITY
2149a17b1aedSZoe Carver    bool contains(const key_type& __k) const {return find(__k) != end();}
21503fca07d7SMarek Kurdej    template <typename _K2>
21513fca07d7SMarek Kurdej    _LIBCPP_INLINE_VISIBILITY
21524887d047SNikolas Klauser    __enable_if_t<__is_transparent<_Compare, _K2>::value, bool>
21533fca07d7SMarek Kurdej    contains(const _K2& __k) const { return find(__k) != end(); }
2154a17b1aedSZoe Carver#endif // _LIBCPP_STD_VER > 17
2155a17b1aedSZoe Carver
2156848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
21573e519524SHoward Hinnant    iterator lower_bound(const key_type& __k)
21583e519524SHoward Hinnant        {return __tree_.lower_bound(__k);}
2159848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
21603e519524SHoward Hinnant    const_iterator lower_bound(const key_type& __k) const
21613e519524SHoward Hinnant            {return __tree_.lower_bound(__k);}
21622585835cSMarshall Clow#if _LIBCPP_STD_VER > 11
21632585835cSMarshall Clow    template <typename _K2>
21642585835cSMarshall Clow    _LIBCPP_INLINE_VISIBILITY
21654887d047SNikolas Klauser    __enable_if_t<__is_transparent<_Compare, _K2>::value, iterator>
21662585835cSMarshall Clow    lower_bound(const _K2& __k)       {return __tree_.lower_bound(__k);}
21672585835cSMarshall Clow
21682585835cSMarshall Clow    template <typename _K2>
21692585835cSMarshall Clow    _LIBCPP_INLINE_VISIBILITY
21704887d047SNikolas Klauser    __enable_if_t<__is_transparent<_Compare, _K2>::value, const_iterator>
21712585835cSMarshall Clow    lower_bound(const _K2& __k) const {return __tree_.lower_bound(__k);}
21722585835cSMarshall Clow#endif
21732585835cSMarshall Clow
2174848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
21753e519524SHoward Hinnant    iterator upper_bound(const key_type& __k)
21763e519524SHoward Hinnant            {return __tree_.upper_bound(__k);}
2177848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
21783e519524SHoward Hinnant    const_iterator upper_bound(const key_type& __k) const
21793e519524SHoward Hinnant            {return __tree_.upper_bound(__k);}
21802585835cSMarshall Clow#if _LIBCPP_STD_VER > 11
21812585835cSMarshall Clow    template <typename _K2>
21822585835cSMarshall Clow    _LIBCPP_INLINE_VISIBILITY
21834887d047SNikolas Klauser    __enable_if_t<__is_transparent<_Compare, _K2>::value, iterator>
21842585835cSMarshall Clow    upper_bound(const _K2& __k)       {return __tree_.upper_bound(__k);}
21852585835cSMarshall Clow    template <typename _K2>
21862585835cSMarshall Clow    _LIBCPP_INLINE_VISIBILITY
21874887d047SNikolas Klauser    __enable_if_t<__is_transparent<_Compare, _K2>::value, const_iterator>
21882585835cSMarshall Clow    upper_bound(const _K2& __k) const {return __tree_.upper_bound(__k);}
21892585835cSMarshall Clow#endif
21902585835cSMarshall Clow
2191848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
21923e519524SHoward Hinnant    pair<iterator,iterator>             equal_range(const key_type& __k)
21933e519524SHoward Hinnant            {return __tree_.__equal_range_multi(__k);}
2194848a5374SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
21953e519524SHoward Hinnant    pair<const_iterator,const_iterator> equal_range(const key_type& __k) const
21963e519524SHoward Hinnant            {return __tree_.__equal_range_multi(__k);}
21972585835cSMarshall Clow#if _LIBCPP_STD_VER > 11
21982585835cSMarshall Clow    template <typename _K2>
21992585835cSMarshall Clow    _LIBCPP_INLINE_VISIBILITY
22004887d047SNikolas Klauser    __enable_if_t<__is_transparent<_Compare, _K2>::value, pair<iterator,iterator>>
22012585835cSMarshall Clow    equal_range(const _K2& __k)       {return __tree_.__equal_range_multi(__k);}
22022585835cSMarshall Clow    template <typename _K2>
22032585835cSMarshall Clow    _LIBCPP_INLINE_VISIBILITY
22044887d047SNikolas Klauser    __enable_if_t<__is_transparent<_Compare, _K2>::value, pair<const_iterator,const_iterator>>
22052585835cSMarshall Clow    equal_range(const _K2& __k) const {return __tree_.__equal_range_multi(__k);}
22062585835cSMarshall Clow#endif
22073e519524SHoward Hinnant
22083e519524SHoward Hinnantprivate:
22093e519524SHoward Hinnant    typedef typename __base::__node                    __node;
22103e519524SHoward Hinnant    typedef typename __base::__node_allocator          __node_allocator;
22113e519524SHoward Hinnant    typedef typename __base::__node_pointer            __node_pointer;
22120594ad71SEric Fiselier
2213c003db1fSHoward Hinnant    typedef __map_node_destructor<__node_allocator> _Dp;
2214c003db1fSHoward Hinnant    typedef unique_ptr<__node, _Dp> __node_holder;
22153e519524SHoward Hinnant};
22163e519524SHoward Hinnant
221701666904SLouis Dionne#if _LIBCPP_STD_VER >= 17
2218f2f7d72fSLouis Dionnetemplate<class _InputIterator, class _Compare = less<__iter_key_type<_InputIterator>>,
2219f2f7d72fSLouis Dionne         class _Allocator = allocator<__iter_to_alloc_type<_InputIterator>>,
222068072a71SKonstantin Varlamov         class = enable_if_t<__is_cpp17_input_iterator<_InputIterator>::value, void>,
22214e0ea2cfSLouis Dionne         class = enable_if_t<!__is_allocator<_Compare>::value, void>,
22224e0ea2cfSLouis Dionne         class = enable_if_t<__is_allocator<_Allocator>::value, void>>
2223f2f7d72fSLouis Dionnemultimap(_InputIterator, _InputIterator, _Compare = _Compare(), _Allocator = _Allocator())
2224f2f7d72fSLouis Dionne  -> multimap<__iter_key_type<_InputIterator>, __iter_mapped_type<_InputIterator>, _Compare, _Allocator>;
2225f2f7d72fSLouis Dionne
2226f2f7d72fSLouis Dionnetemplate<class _Key, class _Tp, class _Compare = less<remove_const_t<_Key>>,
2227f2f7d72fSLouis Dionne         class _Allocator = allocator<pair<const _Key, _Tp>>,
22284e0ea2cfSLouis Dionne         class = enable_if_t<!__is_allocator<_Compare>::value, void>,
22294e0ea2cfSLouis Dionne         class = enable_if_t<__is_allocator<_Allocator>::value, void>>
2230f2f7d72fSLouis Dionnemultimap(initializer_list<pair<_Key, _Tp>>, _Compare = _Compare(), _Allocator = _Allocator())
2231f2f7d72fSLouis Dionne  -> multimap<remove_const_t<_Key>, _Tp, _Compare, _Allocator>;
2232f2f7d72fSLouis Dionne
2233f2f7d72fSLouis Dionnetemplate<class _InputIterator, class _Allocator,
223468072a71SKonstantin Varlamov         class = enable_if_t<__is_cpp17_input_iterator<_InputIterator>::value, void>,
22354e0ea2cfSLouis Dionne         class = enable_if_t<__is_allocator<_Allocator>::value, void>>
2236f2f7d72fSLouis Dionnemultimap(_InputIterator, _InputIterator, _Allocator)
2237f2f7d72fSLouis Dionne  -> multimap<__iter_key_type<_InputIterator>, __iter_mapped_type<_InputIterator>,
2238f2f7d72fSLouis Dionne         less<__iter_key_type<_InputIterator>>, _Allocator>;
2239f2f7d72fSLouis Dionne
2240f2f7d72fSLouis Dionnetemplate<class _Key, class _Tp, class _Allocator,
22414e0ea2cfSLouis Dionne         class = enable_if_t<__is_allocator<_Allocator>::value, void>>
2242f2f7d72fSLouis Dionnemultimap(initializer_list<pair<_Key, _Tp>>, _Allocator)
2243f2f7d72fSLouis Dionne  -> multimap<remove_const_t<_Key>, _Tp, less<remove_const_t<_Key>>, _Allocator>;
2244f2f7d72fSLouis Dionne#endif
2245f2f7d72fSLouis Dionne
22465e3ea4ddSEric Fiselier#ifndef _LIBCPP_CXX03_LANG
22473e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator>
22483e519524SHoward Hinnantmultimap<_Key, _Tp, _Compare, _Allocator>::multimap(multimap&& __m, const allocator_type& __a)
22492a10c960SMarshall Clow    : __tree_(_VSTD::move(__m.__tree_), typename __base::allocator_type(__a))
22503e519524SHoward Hinnant{
22513e519524SHoward Hinnant    if (__a != __m.get_allocator())
22523e519524SHoward Hinnant    {
22533e519524SHoward Hinnant        const_iterator __e = cend();
22543e519524SHoward Hinnant        while (!__m.empty())
22553e519524SHoward Hinnant            __tree_.__insert_multi(__e.__i_,
2256f52318b4SErik Pilkington                    _VSTD::move(__m.__tree_.remove(__m.begin().__i_)->__value_.__move()));
22573e519524SHoward Hinnant    }
22583e519524SHoward Hinnant}
22595e3ea4ddSEric Fiselier#endif
22603e519524SHoward Hinnant
22613e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator>
2262848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
22633e519524SHoward Hinnantbool
22643e519524SHoward Hinnantoperator==(const multimap<_Key, _Tp, _Compare, _Allocator>& __x,
22653e519524SHoward Hinnant           const multimap<_Key, _Tp, _Compare, _Allocator>& __y)
22663e519524SHoward Hinnant{
2267ce48a113SHoward Hinnant    return __x.size() == __y.size() && _VSTD::equal(__x.begin(), __x.end(), __y.begin());
22683e519524SHoward Hinnant}
22693e519524SHoward Hinnant
22703e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator>
2271848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
22723e519524SHoward Hinnantbool
22733e519524SHoward Hinnantoperator< (const multimap<_Key, _Tp, _Compare, _Allocator>& __x,
22743e519524SHoward Hinnant           const multimap<_Key, _Tp, _Compare, _Allocator>& __y)
22753e519524SHoward Hinnant{
2276ce48a113SHoward Hinnant    return _VSTD::lexicographical_compare(__x.begin(), __x.end(), __y.begin(), __y.end());
22773e519524SHoward Hinnant}
22783e519524SHoward Hinnant
22793e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator>
2280848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
22813e519524SHoward Hinnantbool
22823e519524SHoward Hinnantoperator!=(const multimap<_Key, _Tp, _Compare, _Allocator>& __x,
22833e519524SHoward Hinnant           const multimap<_Key, _Tp, _Compare, _Allocator>& __y)
22843e519524SHoward Hinnant{
22853e519524SHoward Hinnant    return !(__x == __y);
22863e519524SHoward Hinnant}
22873e519524SHoward Hinnant
22883e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator>
2289848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
22903e519524SHoward Hinnantbool
22913e519524SHoward Hinnantoperator> (const multimap<_Key, _Tp, _Compare, _Allocator>& __x,
22923e519524SHoward Hinnant           const multimap<_Key, _Tp, _Compare, _Allocator>& __y)
22933e519524SHoward Hinnant{
22943e519524SHoward Hinnant    return __y < __x;
22953e519524SHoward Hinnant}
22963e519524SHoward Hinnant
22973e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator>
2298848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
22993e519524SHoward Hinnantbool
23003e519524SHoward Hinnantoperator>=(const multimap<_Key, _Tp, _Compare, _Allocator>& __x,
23013e519524SHoward Hinnant           const multimap<_Key, _Tp, _Compare, _Allocator>& __y)
23023e519524SHoward Hinnant{
23033e519524SHoward Hinnant    return !(__x < __y);
23043e519524SHoward Hinnant}
23053e519524SHoward Hinnant
23063e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator>
2307848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
23083e519524SHoward Hinnantbool
23093e519524SHoward Hinnantoperator<=(const multimap<_Key, _Tp, _Compare, _Allocator>& __x,
23103e519524SHoward Hinnant           const multimap<_Key, _Tp, _Compare, _Allocator>& __y)
23113e519524SHoward Hinnant{
23123e519524SHoward Hinnant    return !(__y < __x);
23133e519524SHoward Hinnant}
23143e519524SHoward Hinnant
23153e519524SHoward Hinnanttemplate <class _Key, class _Tp, class _Compare, class _Allocator>
2316848a5374SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
23173e519524SHoward Hinnantvoid
23183e519524SHoward Hinnantswap(multimap<_Key, _Tp, _Compare, _Allocator>& __x,
23193e519524SHoward Hinnant     multimap<_Key, _Tp, _Compare, _Allocator>& __y)
23201052ee39SHoward Hinnant    _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
23213e519524SHoward Hinnant{
23223e519524SHoward Hinnant    __x.swap(__y);
23233e519524SHoward Hinnant}
23243e519524SHoward Hinnant
2325f60c63c0SMarshall Clow#if _LIBCPP_STD_VER > 17
23263e895085SMarek Kurdejtemplate <class _Key, class _Tp, class _Compare, class _Allocator,
23273e895085SMarek Kurdej          class _Predicate>
2328f60c63c0SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY
23293e895085SMarek Kurdej    typename multimap<_Key, _Tp, _Compare, _Allocator>::size_type
23303e895085SMarek Kurdej    erase_if(multimap<_Key, _Tp, _Compare, _Allocator>& __c,
23313e895085SMarek Kurdej             _Predicate __pred) {
23322ac6babcSArthur O'Dwyer  return _VSTD::__libcpp_erase_if_container(__c, __pred);
23333e895085SMarek Kurdej}
2334f60c63c0SMarshall Clow#endif
2335f60c63c0SMarshall Clow
23363e519524SHoward Hinnant_LIBCPP_END_NAMESPACE_STD
23373e519524SHoward Hinnant
23383e519524SHoward Hinnant#endif // _LIBCPP_MAP
2339