Home | History | Annotate | Download | only in include
      1 // -*- C++ -*-
      2 //===----------------------------- map ------------------------------------===//
      3 //
      4 //                     The LLVM Compiler Infrastructure
      5 //
      6 // This file is dual licensed under the MIT and the University of Illinois Open
      7 // Source Licenses. See LICENSE.TXT for details.
      8 //
      9 //===----------------------------------------------------------------------===//
     10 
     11 #ifndef _LIBCPP_MAP
     12 #define _LIBCPP_MAP
     13 
     14 /*
     15 
     16     map synopsis
     17 
     18 namespace std
     19 {
     20 
     21 template <class Key, class T, class Compare = less<Key>,
     22           class Allocator = allocator<pair<const Key, T>>>
     23 class map
     24 {
     25 public:
     26     // types:
     27     typedef Key                                      key_type;
     28     typedef T                                        mapped_type;
     29     typedef pair<const key_type, mapped_type>        value_type;
     30     typedef Compare                                  key_compare;
     31     typedef Allocator                                allocator_type;
     32     typedef typename allocator_type::reference       reference;
     33     typedef typename allocator_type::const_reference const_reference;
     34     typedef typename allocator_type::pointer         pointer;
     35     typedef typename allocator_type::const_pointer   const_pointer;
     36     typedef typename allocator_type::size_type       size_type;
     37     typedef typename allocator_type::difference_type difference_type;
     38 
     39     typedef implementation-defined                   iterator;
     40     typedef implementation-defined                   const_iterator;
     41     typedef std::reverse_iterator<iterator>          reverse_iterator;
     42     typedef std::reverse_iterator<const_iterator>    const_reverse_iterator;
     43 
     44     class value_compare
     45         : public binary_function<value_type, value_type, bool>
     46     {
     47         friend class map;
     48     protected:
     49         key_compare comp;
     50 
     51         value_compare(key_compare c);
     52     public:
     53         bool operator()(const value_type& x, const value_type& y) const;
     54     };
     55 
     56     // construct/copy/destroy:
     57     map()
     58         noexcept(
     59             is_nothrow_default_constructible<allocator_type>::value &&
     60             is_nothrow_default_constructible<key_compare>::value &&
     61             is_nothrow_copy_constructible<key_compare>::value);
     62     explicit map(const key_compare& comp);
     63     map(const key_compare& comp, const allocator_type& a);
     64     template <class InputIterator>
     65         map(InputIterator first, InputIterator last,
     66             const key_compare& comp = key_compare());
     67     template <class InputIterator>
     68         map(InputIterator first, InputIterator last,
     69             const key_compare& comp, const allocator_type& a);
     70     map(const map& m);
     71     map(map&& m)
     72         noexcept(
     73             is_nothrow_move_constructible<allocator_type>::value &&
     74             is_nothrow_move_constructible<key_compare>::value);
     75     explicit map(const allocator_type& a);
     76     map(const map& m, const allocator_type& a);
     77     map(map&& m, const allocator_type& a);
     78     map(initializer_list<value_type> il, const key_compare& comp = key_compare());
     79     map(initializer_list<value_type> il, const key_compare& comp, const allocator_type& a);
     80     template <class InputIterator>
     81         map(InputIterator first, InputIterator last, const allocator_type& a)
     82             : map(first, last, Compare(), a) {}  // C++14
     83     map(initializer_list<value_type> il, const allocator_type& a)
     84         : map(il, Compare(), a) {}  // C++14
     85    ~map();
     86 
     87     map& operator=(const map& m);
     88     map& operator=(map&& m)
     89         noexcept(
     90             allocator_type::propagate_on_container_move_assignment::value &&
     91             is_nothrow_move_assignable<allocator_type>::value &&
     92             is_nothrow_move_assignable<key_compare>::value);
     93     map& operator=(initializer_list<value_type> il);
     94 
     95     // iterators:
     96           iterator begin() noexcept;
     97     const_iterator begin() const noexcept;
     98           iterator end() noexcept;
     99     const_iterator end()   const noexcept;
    100 
    101           reverse_iterator rbegin() noexcept;
    102     const_reverse_iterator rbegin() const noexcept;
    103           reverse_iterator rend() noexcept;
    104     const_reverse_iterator rend()   const noexcept;
    105 
    106     const_iterator         cbegin()  const noexcept;
    107     const_iterator         cend()    const noexcept;
    108     const_reverse_iterator crbegin() const noexcept;
    109     const_reverse_iterator crend()   const noexcept;
    110 
    111     // capacity:
    112     bool      empty()    const noexcept;
    113     size_type size()     const noexcept;
    114     size_type max_size() const noexcept;
    115 
    116     // element access:
    117     mapped_type& operator[](const key_type& k);
    118     mapped_type& operator[](key_type&& k);
    119 
    120           mapped_type& at(const key_type& k);
    121     const mapped_type& at(const key_type& k) const;
    122 
    123     // modifiers:
    124     template <class... Args>
    125         pair<iterator, bool> emplace(Args&&... args);
    126     template <class... Args>
    127         iterator emplace_hint(const_iterator position, Args&&... args);
    128     pair<iterator, bool> insert(const value_type& v);
    129     template <class P>
    130         pair<iterator, bool> insert(P&& p);
    131     iterator insert(const_iterator position, const value_type& v);
    132     template <class P>
    133         iterator insert(const_iterator position, P&& p);
    134     template <class InputIterator>
    135         void insert(InputIterator first, InputIterator last);
    136     void insert(initializer_list<value_type> il);
    137 
    138     template <class... Args>
    139         pair<iterator, bool> try_emplace(const key_type& k, Args&&... args);          // C++17
    140     template <class... Args>
    141         pair<iterator, bool> try_emplace(key_type&& k, Args&&... args);               // C++17
    142     template <class... Args>
    143         iterator try_emplace(const_iterator hint, const key_type& k, Args&&... args); // C++17
    144     template <class... Args>
    145         iterator try_emplace(const_iterator hint, key_type&& k, Args&&... args);      // C++17
    146     template <class M>
    147         pair<iterator, bool> insert_or_assign(const key_type& k, M&& obj);            // C++17
    148     template <class M>
    149         pair<iterator, bool> insert_or_assign(key_type&& k, M&& obj);                 // C++17
    150     template <class M>
    151         iterator insert_or_assign(const_iterator hint, const key_type& k, M&& obj);   // C++17
    152     template <class M>
    153         iterator insert_or_assign(const_iterator hint, key_type&& k, M&& obj);        // C++17
    154 
    155     iterator  erase(const_iterator position);
    156     iterator  erase(iterator position); // C++14
    157     size_type erase(const key_type& k);
    158     iterator  erase(const_iterator first, const_iterator last);
    159     void clear() noexcept;
    160 
    161     void swap(map& m)
    162         noexcept(allocator_traits<allocator_type>::is_always_equal::value &&
    163             __is_nothrow_swappable<key_compare>::value); // C++17
    164 
    165     // observers:
    166     allocator_type get_allocator() const noexcept;
    167     key_compare    key_comp()      const;
    168     value_compare  value_comp()    const;
    169 
    170     // map operations:
    171           iterator find(const key_type& k);
    172     const_iterator find(const key_type& k) const;
    173     template<typename K>
    174         iterator find(const K& x);              // C++14
    175     template<typename K>
    176         const_iterator find(const K& x) const;  // C++14
    177     template<typename K>
    178       size_type count(const K& x) const;        // C++14
    179 
    180     size_type      count(const key_type& k) const;
    181           iterator lower_bound(const key_type& k);
    182     const_iterator lower_bound(const key_type& k) const;
    183     template<typename K>
    184         iterator lower_bound(const K& x);              // C++14
    185     template<typename K>
    186         const_iterator lower_bound(const K& x) const;  // C++14
    187 
    188           iterator upper_bound(const key_type& k);
    189     const_iterator upper_bound(const key_type& k) const;
    190     template<typename K>
    191         iterator upper_bound(const K& x);              // C++14
    192     template<typename K>
    193         const_iterator upper_bound(const K& x) const;  // C++14
    194 
    195     pair<iterator,iterator>             equal_range(const key_type& k);
    196     pair<const_iterator,const_iterator> equal_range(const key_type& k) const;
    197     template<typename K>
    198         pair<iterator,iterator>             equal_range(const K& x);        // C++14
    199     template<typename K>
    200         pair<const_iterator,const_iterator> equal_range(const K& x) const;  // C++14
    201 };
    202 
    203 template <class Key, class T, class Compare, class Allocator>
    204 bool
    205 operator==(const map<Key, T, Compare, Allocator>& x,
    206            const map<Key, T, Compare, Allocator>& y);
    207 
    208 template <class Key, class T, class Compare, class Allocator>
    209 bool
    210 operator< (const map<Key, T, Compare, Allocator>& x,
    211            const map<Key, T, Compare, Allocator>& y);
    212 
    213 template <class Key, class T, class Compare, class Allocator>
    214 bool
    215 operator!=(const map<Key, T, Compare, Allocator>& x,
    216            const map<Key, T, Compare, Allocator>& y);
    217 
    218 template <class Key, class T, class Compare, class Allocator>
    219 bool
    220 operator> (const map<Key, T, Compare, Allocator>& x,
    221            const map<Key, T, Compare, Allocator>& y);
    222 
    223 template <class Key, class T, class Compare, class Allocator>
    224 bool
    225 operator>=(const map<Key, T, Compare, Allocator>& x,
    226            const map<Key, T, Compare, Allocator>& y);
    227 
    228 template <class Key, class T, class Compare, class Allocator>
    229 bool
    230 operator<=(const map<Key, T, Compare, Allocator>& x,
    231            const map<Key, T, Compare, Allocator>& y);
    232 
    233 // specialized algorithms:
    234 template <class Key, class T, class Compare, class Allocator>
    235 void
    236 swap(map<Key, T, Compare, Allocator>& x, map<Key, T, Compare, Allocator>& y)
    237     noexcept(noexcept(x.swap(y)));
    238 
    239 template <class Key, class T, class Compare = less<Key>,
    240           class Allocator = allocator<pair<const Key, T>>>
    241 class multimap
    242 {
    243 public:
    244     // types:
    245     typedef Key                                      key_type;
    246     typedef T                                        mapped_type;
    247     typedef pair<const key_type,mapped_type>         value_type;
    248     typedef Compare                                  key_compare;
    249     typedef Allocator                                allocator_type;
    250     typedef typename allocator_type::reference       reference;
    251     typedef typename allocator_type::const_reference const_reference;
    252     typedef typename allocator_type::size_type       size_type;
    253     typedef typename allocator_type::difference_type difference_type;
    254     typedef typename allocator_type::pointer         pointer;
    255     typedef typename allocator_type::const_pointer   const_pointer;
    256 
    257     typedef implementation-defined                   iterator;
    258     typedef implementation-defined                   const_iterator;
    259     typedef std::reverse_iterator<iterator>          reverse_iterator;
    260     typedef std::reverse_iterator<const_iterator>    const_reverse_iterator;
    261 
    262     class value_compare
    263         : public binary_function<value_type,value_type,bool>
    264     {
    265         friend class multimap;
    266     protected:
    267         key_compare comp;
    268         value_compare(key_compare c);
    269     public:
    270         bool operator()(const value_type& x, const value_type& y) const;
    271     };
    272 
    273     // construct/copy/destroy:
    274     multimap()
    275         noexcept(
    276             is_nothrow_default_constructible<allocator_type>::value &&
    277             is_nothrow_default_constructible<key_compare>::value &&
    278             is_nothrow_copy_constructible<key_compare>::value);
    279     explicit multimap(const key_compare& comp);
    280     multimap(const key_compare& comp, const allocator_type& a);
    281     template <class InputIterator>
    282         multimap(InputIterator first, InputIterator last, const key_compare& comp);
    283     template <class InputIterator>
    284         multimap(InputIterator first, InputIterator last, const key_compare& comp,
    285                  const allocator_type& a);
    286     multimap(const multimap& m);
    287     multimap(multimap&& m)
    288         noexcept(
    289             is_nothrow_move_constructible<allocator_type>::value &&
    290             is_nothrow_move_constructible<key_compare>::value);
    291     explicit multimap(const allocator_type& a);
    292     multimap(const multimap& m, const allocator_type& a);
    293     multimap(multimap&& m, const allocator_type& a);
    294     multimap(initializer_list<value_type> il, const key_compare& comp = key_compare());
    295     multimap(initializer_list<value_type> il, const key_compare& comp,
    296              const allocator_type& a);
    297     template <class InputIterator>
    298         multimap(InputIterator first, InputIterator last, const allocator_type& a)
    299             : multimap(first, last, Compare(), a) {} // C++14
    300     multimap(initializer_list<value_type> il, const allocator_type& a)
    301         : multimap(il, Compare(), a) {} // C++14
    302     ~multimap();
    303 
    304     multimap& operator=(const multimap& m);
    305     multimap& operator=(multimap&& m)
    306         noexcept(
    307             allocator_type::propagate_on_container_move_assignment::value &&
    308             is_nothrow_move_assignable<allocator_type>::value &&
    309             is_nothrow_move_assignable<key_compare>::value);
    310     multimap& operator=(initializer_list<value_type> il);
    311 
    312     // iterators:
    313           iterator begin() noexcept;
    314     const_iterator begin() const noexcept;
    315           iterator end() noexcept;
    316     const_iterator end()   const noexcept;
    317 
    318           reverse_iterator rbegin() noexcept;
    319     const_reverse_iterator rbegin() const noexcept;
    320           reverse_iterator rend() noexcept;
    321     const_reverse_iterator rend()   const noexcept;
    322 
    323     const_iterator         cbegin()  const noexcept;
    324     const_iterator         cend()    const noexcept;
    325     const_reverse_iterator crbegin() const noexcept;
    326     const_reverse_iterator crend()   const noexcept;
    327 
    328     // capacity:
    329     bool      empty()    const noexcept;
    330     size_type size()     const noexcept;
    331     size_type max_size() const noexcept;
    332 
    333     // modifiers:
    334     template <class... Args>
    335         iterator emplace(Args&&... args);
    336     template <class... Args>
    337         iterator emplace_hint(const_iterator position, Args&&... args);
    338     iterator insert(const value_type& v);
    339     template <class P>
    340         iterator insert(P&& p);
    341     iterator insert(const_iterator position, const value_type& v);
    342     template <class P>
    343         iterator insert(const_iterator position, P&& p);
    344     template <class InputIterator>
    345         void insert(InputIterator first, InputIterator last);
    346     void insert(initializer_list<value_type> il);
    347 
    348     iterator  erase(const_iterator position);
    349     iterator  erase(iterator position); // C++14
    350     size_type erase(const key_type& k);
    351     iterator  erase(const_iterator first, const_iterator last);
    352     void clear() noexcept;
    353 
    354     void swap(multimap& m)
    355         noexcept(allocator_traits<allocator_type>::is_always_equal::value &&
    356             __is_nothrow_swappable<key_compare>::value); // C++17
    357 
    358     // observers:
    359     allocator_type get_allocator() const noexcept;
    360     key_compare    key_comp()      const;
    361     value_compare  value_comp()    const;
    362 
    363     // map operations:
    364           iterator find(const key_type& k);
    365     const_iterator find(const key_type& k) const;
    366     template<typename K>
    367         iterator find(const K& x);              // C++14
    368     template<typename K>
    369         const_iterator find(const K& x) const;  // C++14
    370     template<typename K>
    371       size_type count(const K& x) const;        // C++14
    372 
    373     size_type      count(const key_type& k) const;
    374           iterator lower_bound(const key_type& k);
    375     const_iterator lower_bound(const key_type& k) const;
    376     template<typename K>
    377         iterator lower_bound(const K& x);              // C++14
    378     template<typename K>
    379         const_iterator lower_bound(const K& x) const;  // C++14
    380 
    381           iterator upper_bound(const key_type& k);
    382     const_iterator upper_bound(const key_type& k) const;
    383     template<typename K>
    384         iterator upper_bound(const K& x);              // C++14
    385     template<typename K>
    386         const_iterator upper_bound(const K& x) const;  // C++14
    387 
    388     pair<iterator,iterator>             equal_range(const key_type& k);
    389     pair<const_iterator,const_iterator> equal_range(const key_type& k) const;
    390     template<typename K>
    391         pair<iterator,iterator>             equal_range(const K& x);        // C++14
    392     template<typename K>
    393         pair<const_iterator,const_iterator> equal_range(const K& x) const;  // C++14
    394 };
    395 
    396 template <class Key, class T, class Compare, class Allocator>
    397 bool
    398 operator==(const multimap<Key, T, Compare, Allocator>& x,
    399            const multimap<Key, T, Compare, Allocator>& y);
    400 
    401 template <class Key, class T, class Compare, class Allocator>
    402 bool
    403 operator< (const multimap<Key, T, Compare, Allocator>& x,
    404            const multimap<Key, T, Compare, Allocator>& y);
    405 
    406 template <class Key, class T, class Compare, class Allocator>
    407 bool
    408 operator!=(const multimap<Key, T, Compare, Allocator>& x,
    409            const multimap<Key, T, Compare, Allocator>& y);
    410 
    411 template <class Key, class T, class Compare, class Allocator>
    412 bool
    413 operator> (const multimap<Key, T, Compare, Allocator>& x,
    414            const multimap<Key, T, Compare, Allocator>& y);
    415 
    416 template <class Key, class T, class Compare, class Allocator>
    417 bool
    418 operator>=(const multimap<Key, T, Compare, Allocator>& x,
    419            const multimap<Key, T, Compare, Allocator>& y);
    420 
    421 template <class Key, class T, class Compare, class Allocator>
    422 bool
    423 operator<=(const multimap<Key, T, Compare, Allocator>& x,
    424            const multimap<Key, T, Compare, Allocator>& y);
    425 
    426 // specialized algorithms:
    427 template <class Key, class T, class Compare, class Allocator>
    428 void
    429 swap(multimap<Key, T, Compare, Allocator>& x,
    430      multimap<Key, T, Compare, Allocator>& y)
    431     noexcept(noexcept(x.swap(y)));
    432 
    433 }  // std
    434 
    435 */
    436 
    437 #include <__config>
    438 #include <__tree>
    439 #include <iterator>
    440 #include <memory>
    441 #include <utility>
    442 #include <functional>
    443 #include <initializer_list>
    444 #include <type_traits>
    445 
    446 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
    447 #pragma GCC system_header
    448 #endif
    449 
    450 _LIBCPP_BEGIN_NAMESPACE_STD
    451 
    452 template <class _Key, class _CP, class _Compare,
    453           bool = is_empty<_Compare>::value && !__libcpp_is_final<_Compare>::value
    454          >
    455 class __map_value_compare
    456     : private _Compare
    457 {
    458 public:
    459     _LIBCPP_INLINE_VISIBILITY
    460     __map_value_compare()
    461         _NOEXCEPT_(is_nothrow_default_constructible<_Compare>::value)
    462         : _Compare() {}
    463     _LIBCPP_INLINE_VISIBILITY
    464     __map_value_compare(_Compare c)
    465         _NOEXCEPT_(is_nothrow_copy_constructible<_Compare>::value)
    466         : _Compare(c) {}
    467     _LIBCPP_INLINE_VISIBILITY
    468     const _Compare& key_comp() const _NOEXCEPT {return *this;}
    469     _LIBCPP_INLINE_VISIBILITY
    470     bool operator()(const _CP& __x, const _CP& __y) const
    471         {return static_cast<const _Compare&>(*this)(__x.__cc.first, __y.__cc.first);}
    472     _LIBCPP_INLINE_VISIBILITY
    473     bool operator()(const _CP& __x, const _Key& __y) const
    474         {return static_cast<const _Compare&>(*this)(__x.__cc.first, __y);}
    475     _LIBCPP_INLINE_VISIBILITY
    476     bool operator()(const _Key& __x, const _CP& __y) const
    477         {return static_cast<const _Compare&>(*this)(__x, __y.__cc.first);}
    478     void swap(__map_value_compare&__y)
    479         _NOEXCEPT_(__is_nothrow_swappable<_Compare>::value)
    480     {
    481         using _VSTD::swap;
    482         swap(static_cast<const _Compare&>(*this), static_cast<const _Compare&>(__y));
    483     }
    484 
    485 #if _LIBCPP_STD_VER > 11
    486     template <typename _K2>
    487     _LIBCPP_INLINE_VISIBILITY
    488     typename enable_if<__is_transparent<_Compare, _K2>::value, bool>::type
    489     operator () ( const _K2& __x, const _CP& __y ) const
    490         {return static_cast<const _Compare&>(*this) (__x, __y.__cc.first);}
    491 
    492     template <typename _K2>
    493     _LIBCPP_INLINE_VISIBILITY
    494     typename enable_if<__is_transparent<_Compare, _K2>::value, bool>::type
    495     operator () (const _CP& __x, const _K2& __y) const
    496         {return static_cast<const _Compare&>(*this) (__x.__cc.first, __y);}
    497 #endif
    498 };
    499 
    500 template <class _Key, class _CP, class _Compare>
    501 class __map_value_compare<_Key, _CP, _Compare, false>
    502 {
    503     _Compare comp;
    504 
    505 public:
    506     _LIBCPP_INLINE_VISIBILITY
    507     __map_value_compare()
    508         _NOEXCEPT_(is_nothrow_default_constructible<_Compare>::value)
    509         : comp() {}
    510     _LIBCPP_INLINE_VISIBILITY
    511     __map_value_compare(_Compare c)
    512         _NOEXCEPT_(is_nothrow_copy_constructible<_Compare>::value)
    513         : comp(c) {}
    514     _LIBCPP_INLINE_VISIBILITY
    515     const _Compare& key_comp() const _NOEXCEPT {return comp;}
    516 
    517     _LIBCPP_INLINE_VISIBILITY
    518     bool operator()(const _CP& __x, const _CP& __y) const
    519         {return comp(__x.__cc.first, __y.__cc.first);}
    520     _LIBCPP_INLINE_VISIBILITY
    521     bool operator()(const _CP& __x, const _Key& __y) const
    522         {return comp(__x.__cc.first, __y);}
    523     _LIBCPP_INLINE_VISIBILITY
    524     bool operator()(const _Key& __x, const _CP& __y) const
    525         {return comp(__x, __y.__cc.first);}
    526     void swap(__map_value_compare&__y)
    527         _NOEXCEPT_(__is_nothrow_swappable<_Compare>::value)
    528     {
    529         using _VSTD::swap;
    530         swap(comp, __y.comp);
    531     }
    532     
    533 #if _LIBCPP_STD_VER > 11
    534     template <typename _K2>
    535     _LIBCPP_INLINE_VISIBILITY
    536     typename enable_if<__is_transparent<_Compare, _K2>::value, bool>::type
    537     operator () ( const _K2& __x, const _CP& __y ) const
    538         {return comp (__x, __y.__cc.first);}
    539 
    540     template <typename _K2>
    541     _LIBCPP_INLINE_VISIBILITY
    542     typename enable_if<__is_transparent<_Compare, _K2>::value, bool>::type
    543     operator () (const _CP& __x, const _K2& __y) const
    544         {return comp (__x.__cc.first, __y);}
    545 #endif
    546 };
    547 
    548 template <class _Key, class _CP, class _Compare, bool __b>
    549 inline _LIBCPP_INLINE_VISIBILITY
    550 void
    551 swap(__map_value_compare<_Key, _CP, _Compare, __b>& __x,
    552      __map_value_compare<_Key, _CP, _Compare, __b>& __y)
    553     _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
    554 {
    555     __x.swap(__y);
    556 }
    557 
    558 template <class _Allocator>
    559 class __map_node_destructor
    560 {
    561     typedef _Allocator                          allocator_type;
    562     typedef allocator_traits<allocator_type>    __alloc_traits;
    563     typedef typename __alloc_traits::value_type::value_type value_type;
    564 public:
    565     typedef typename __alloc_traits::pointer    pointer;
    566 private:
    567     typedef typename value_type::value_type::first_type     first_type;
    568     typedef typename value_type::value_type::second_type    second_type;
    569 
    570     allocator_type& __na_;
    571 
    572     __map_node_destructor& operator=(const __map_node_destructor&);
    573 
    574 public:
    575     bool __first_constructed;
    576     bool __second_constructed;
    577 
    578     _LIBCPP_INLINE_VISIBILITY
    579     explicit __map_node_destructor(allocator_type& __na) _NOEXCEPT
    580         : __na_(__na),
    581           __first_constructed(false),
    582           __second_constructed(false)
    583         {}
    584 
    585 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
    586     _LIBCPP_INLINE_VISIBILITY
    587     __map_node_destructor(__tree_node_destructor<allocator_type>&& __x) _NOEXCEPT
    588         : __na_(__x.__na_),
    589           __first_constructed(__x.__value_constructed),
    590           __second_constructed(__x.__value_constructed)
    591         {
    592             __x.__value_constructed = false;
    593         }
    594 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
    595 
    596     _LIBCPP_INLINE_VISIBILITY
    597     void operator()(pointer __p) _NOEXCEPT
    598     {
    599         if (__second_constructed)
    600             __alloc_traits::destroy(__na_, _VSTD::addressof(__p->__value_.__cc.second));
    601         if (__first_constructed)
    602             __alloc_traits::destroy(__na_, _VSTD::addressof(__p->__value_.__cc.first));
    603         if (__p)
    604             __alloc_traits::deallocate(__na_, __p, 1);
    605     }
    606 };
    607 
    608 template <class _Key, class _Tp, class _Compare, class _Allocator>
    609     class map;
    610 template <class _Key, class _Tp, class _Compare, class _Allocator>
    611     class multimap;
    612 template <class _TreeIterator> class __map_const_iterator;
    613 
    614 #if __cplusplus >= 201103L
    615 
    616 template <class _Key, class _Tp>
    617 union __value_type
    618 {
    619     typedef _Key                                     key_type;
    620     typedef _Tp                                      mapped_type;
    621     typedef pair<const key_type, mapped_type>        value_type;
    622     typedef pair<key_type, mapped_type>              __nc_value_type;
    623 
    624     value_type __cc;
    625     __nc_value_type __nc;
    626 
    627     template <class ..._Args>
    628     _LIBCPP_INLINE_VISIBILITY
    629     __value_type(_Args&& ...__args)
    630         : __cc(std::forward<_Args>(__args)...) {}
    631 
    632     _LIBCPP_INLINE_VISIBILITY
    633     __value_type(const __value_type& __v)
    634         : __cc(__v.__cc) {}
    635 
    636     _LIBCPP_INLINE_VISIBILITY
    637     __value_type(__value_type& __v)
    638         : __cc(__v.__cc) {}
    639 
    640     _LIBCPP_INLINE_VISIBILITY
    641     __value_type(__value_type&& __v)
    642         : __nc(std::move(__v.__nc)) {}
    643 
    644     _LIBCPP_INLINE_VISIBILITY
    645     __value_type& operator=(const __value_type& __v)
    646         {__nc = __v.__cc; return *this;}
    647 
    648     _LIBCPP_INLINE_VISIBILITY
    649     __value_type& operator=(__value_type&& __v)
    650         {__nc = std::move(__v.__nc); return *this;}
    651 
    652     _LIBCPP_INLINE_VISIBILITY
    653     ~__value_type() {__cc.~value_type();}
    654 };
    655 
    656 #else
    657 
    658 template <class _Key, class _Tp>
    659 struct __value_type
    660 {
    661     typedef _Key                                     key_type;
    662     typedef _Tp                                      mapped_type;
    663     typedef pair<const key_type, mapped_type>        value_type;
    664 
    665     value_type __cc;
    666 
    667     _LIBCPP_INLINE_VISIBILITY
    668     __value_type() {}
    669 
    670     template <class _A0>
    671     _LIBCPP_INLINE_VISIBILITY
    672     __value_type(const _A0& __a0)
    673         : __cc(__a0) {}
    674 
    675     template <class _A0, class _A1>
    676     _LIBCPP_INLINE_VISIBILITY
    677     __value_type(const _A0& __a0, const _A1& __a1)
    678         : __cc(__a0, __a1) {}
    679 };
    680 
    681 #endif
    682 
    683 template <class _Tp>
    684 struct __extract_key_value_types;
    685 
    686 template <class _Key, class _Tp>
    687 struct __extract_key_value_types<__value_type<_Key, _Tp> >
    688 {
    689   typedef _Key const __key_type;
    690   typedef _Tp        __mapped_type;
    691 };
    692 
    693 template <class _TreeIterator>
    694 class _LIBCPP_TYPE_VIS_ONLY __map_iterator
    695 {
    696     _TreeIterator __i_;
    697 
    698     typedef typename _TreeIterator::__pointer_traits             __pointer_traits;
    699     typedef typename _TreeIterator::value_type __value_type;
    700     typedef typename __extract_key_value_types<__value_type>::__key_type    __key_type;
    701     typedef typename __extract_key_value_types<__value_type>::__mapped_type __mapped_type;
    702 public:
    703     typedef bidirectional_iterator_tag                           iterator_category;
    704     typedef pair<__key_type, __mapped_type>                      value_type;
    705     typedef typename _TreeIterator::difference_type              difference_type;
    706     typedef value_type&                                          reference;
    707     typedef typename __pointer_traits::template
    708 #ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES
    709             rebind<value_type>
    710 #else
    711             rebind<value_type>::other
    712 #endif
    713                                                                  pointer;
    714 
    715     _LIBCPP_INLINE_VISIBILITY
    716     __map_iterator() _NOEXCEPT {}
    717 
    718     _LIBCPP_INLINE_VISIBILITY
    719     __map_iterator(_TreeIterator __i) _NOEXCEPT : __i_(__i) {}
    720 
    721     _LIBCPP_INLINE_VISIBILITY
    722     reference operator*() const {return __i_->__cc;}
    723     _LIBCPP_INLINE_VISIBILITY
    724     pointer operator->() const {return pointer_traits<pointer>::pointer_to(__i_->__cc);}
    725 
    726     _LIBCPP_INLINE_VISIBILITY
    727     __map_iterator& operator++() {++__i_; return *this;}
    728     _LIBCPP_INLINE_VISIBILITY
    729     __map_iterator operator++(int)
    730     {
    731         __map_iterator __t(*this);
    732         ++(*this);
    733         return __t;
    734     }
    735 
    736     _LIBCPP_INLINE_VISIBILITY
    737     __map_iterator& operator--() {--__i_; return *this;}
    738     _LIBCPP_INLINE_VISIBILITY
    739     __map_iterator operator--(int)
    740     {
    741         __map_iterator __t(*this);
    742         --(*this);
    743         return __t;
    744     }
    745 
    746     friend _LIBCPP_INLINE_VISIBILITY
    747     bool operator==(const __map_iterator& __x, const __map_iterator& __y)
    748         {return __x.__i_ == __y.__i_;}
    749     friend 
    750     _LIBCPP_INLINE_VISIBILITY
    751     bool operator!=(const __map_iterator& __x, const __map_iterator& __y)
    752         {return __x.__i_ != __y.__i_;}
    753 
    754     template <class, class, class, class> friend class _LIBCPP_TYPE_VIS_ONLY map;
    755     template <class, class, class, class> friend class _LIBCPP_TYPE_VIS_ONLY multimap;
    756     template <class> friend class _LIBCPP_TYPE_VIS_ONLY __map_const_iterator;
    757 };
    758 
    759 template <class _TreeIterator>
    760 class _LIBCPP_TYPE_VIS_ONLY __map_const_iterator
    761 {
    762     _TreeIterator __i_;
    763 
    764     typedef typename _TreeIterator::__pointer_traits             __pointer_traits;
    765     typedef typename _TreeIterator::value_type __value_type;
    766     typedef typename __extract_key_value_types<__value_type>::__key_type    __key_type;
    767     typedef typename __extract_key_value_types<__value_type>::__mapped_type __mapped_type;
    768 public:
    769     typedef bidirectional_iterator_tag                           iterator_category;
    770     typedef pair<__key_type, __mapped_type>                      value_type;
    771     typedef typename _TreeIterator::difference_type              difference_type;
    772     typedef const value_type&                                    reference;
    773     typedef typename __pointer_traits::template
    774 #ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES
    775             rebind<const value_type>
    776 #else
    777             rebind<const value_type>::other
    778 #endif
    779                                                                  pointer;
    780 
    781     _LIBCPP_INLINE_VISIBILITY
    782     __map_const_iterator() _NOEXCEPT {}
    783 
    784     _LIBCPP_INLINE_VISIBILITY
    785     __map_const_iterator(_TreeIterator __i) _NOEXCEPT : __i_(__i) {}
    786     _LIBCPP_INLINE_VISIBILITY
    787     __map_const_iterator(__map_iterator<
    788         typename _TreeIterator::__non_const_iterator> __i) _NOEXCEPT
    789         : __i_(__i.__i_) {}
    790 
    791     _LIBCPP_INLINE_VISIBILITY
    792     reference operator*() const {return __i_->__cc;}
    793     _LIBCPP_INLINE_VISIBILITY
    794     pointer operator->() const {return pointer_traits<pointer>::pointer_to(__i_->__cc);}
    795 
    796     _LIBCPP_INLINE_VISIBILITY
    797     __map_const_iterator& operator++() {++__i_; return *this;}
    798     _LIBCPP_INLINE_VISIBILITY
    799     __map_const_iterator operator++(int)
    800     {
    801         __map_const_iterator __t(*this);
    802         ++(*this);
    803         return __t;
    804     }
    805 
    806     _LIBCPP_INLINE_VISIBILITY
    807     __map_const_iterator& operator--() {--__i_; return *this;}
    808     _LIBCPP_INLINE_VISIBILITY
    809     __map_const_iterator operator--(int)
    810     {
    811         __map_const_iterator __t(*this);
    812         --(*this);
    813         return __t;
    814     }
    815 
    816     friend _LIBCPP_INLINE_VISIBILITY
    817     bool operator==(const __map_const_iterator& __x, const __map_const_iterator& __y)
    818         {return __x.__i_ == __y.__i_;}
    819     friend _LIBCPP_INLINE_VISIBILITY
    820     bool operator!=(const __map_const_iterator& __x, const __map_const_iterator& __y)
    821         {return __x.__i_ != __y.__i_;}
    822 
    823     template <class, class, class, class> friend class _LIBCPP_TYPE_VIS_ONLY map;
    824     template <class, class, class, class> friend class _LIBCPP_TYPE_VIS_ONLY multimap;
    825     template <class, class, class> friend class _LIBCPP_TYPE_VIS_ONLY __tree_const_iterator;
    826 };
    827 
    828 template <class _Key, class _Tp, class _Compare = less<_Key>,
    829           class _Allocator = allocator<pair<const _Key, _Tp> > >
    830 class _LIBCPP_TYPE_VIS_ONLY map
    831 {
    832 public:
    833     // types:
    834     typedef _Key                                     key_type;
    835     typedef _Tp                                      mapped_type;
    836     typedef pair<const key_type, mapped_type>        value_type;
    837     typedef pair<key_type, mapped_type>              __nc_value_type;
    838     typedef _Compare                                 key_compare;
    839     typedef _Allocator                               allocator_type;
    840     typedef value_type&                              reference;
    841     typedef const value_type&                        const_reference;
    842 
    843     class _LIBCPP_TYPE_VIS_ONLY value_compare
    844         : public binary_function<value_type, value_type, bool>
    845     {
    846         friend class map;
    847     protected:
    848         key_compare comp;
    849 
    850         _LIBCPP_INLINE_VISIBILITY value_compare(key_compare c) : comp(c) {}
    851     public:
    852         _LIBCPP_INLINE_VISIBILITY
    853         bool operator()(const value_type& __x, const value_type& __y) const
    854             {return comp(__x.first, __y.first);}
    855     };
    856 
    857 private:
    858 
    859     typedef _VSTD::__value_type<key_type, mapped_type>             __value_type;
    860     typedef __map_value_compare<key_type, __value_type, key_compare> __vc;
    861     typedef typename __rebind_alloc_helper<allocator_traits<allocator_type>,
    862                                                  __value_type>::type __allocator_type;
    863     typedef __tree<__value_type, __vc, __allocator_type>   __base;
    864     typedef typename __base::__node_traits                 __node_traits;
    865     typedef allocator_traits<allocator_type>               __alloc_traits;
    866 
    867     __base __tree_;
    868 
    869 public:
    870     typedef typename __alloc_traits::pointer               pointer;
    871     typedef typename __alloc_traits::const_pointer         const_pointer;
    872     typedef typename __alloc_traits::size_type             size_type;
    873     typedef typename __alloc_traits::difference_type       difference_type;
    874     typedef __map_iterator<typename __base::iterator>             iterator;
    875     typedef __map_const_iterator<typename __base::const_iterator> const_iterator;
    876     typedef _VSTD::reverse_iterator<iterator>               reverse_iterator;
    877     typedef _VSTD::reverse_iterator<const_iterator>         const_reverse_iterator;
    878 
    879     _LIBCPP_INLINE_VISIBILITY
    880     map()
    881         _NOEXCEPT_(
    882             is_nothrow_default_constructible<allocator_type>::value &&
    883             is_nothrow_default_constructible<key_compare>::value &&
    884             is_nothrow_copy_constructible<key_compare>::value)
    885         : __tree_(__vc(key_compare())) {}
    886 
    887     _LIBCPP_INLINE_VISIBILITY
    888     explicit map(const key_compare& __comp)
    889         _NOEXCEPT_(
    890             is_nothrow_default_constructible<allocator_type>::value &&
    891             is_nothrow_copy_constructible<key_compare>::value)
    892         : __tree_(__vc(__comp)) {}
    893 
    894     _LIBCPP_INLINE_VISIBILITY
    895     explicit map(const key_compare& __comp, const allocator_type& __a)
    896         : __tree_(__vc(__comp), __a) {}
    897 
    898     template <class _InputIterator>
    899     _LIBCPP_INLINE_VISIBILITY
    900         map(_InputIterator __f, _InputIterator __l,
    901             const key_compare& __comp = key_compare())
    902         : __tree_(__vc(__comp))
    903         {
    904             insert(__f, __l);
    905         }
    906 
    907     template <class _InputIterator>
    908     _LIBCPP_INLINE_VISIBILITY
    909         map(_InputIterator __f, _InputIterator __l,
    910             const key_compare& __comp, const allocator_type& __a)
    911         : __tree_(__vc(__comp), __a)
    912         {
    913             insert(__f, __l);
    914         }
    915 
    916 #if _LIBCPP_STD_VER > 11
    917     template <class _InputIterator>
    918     _LIBCPP_INLINE_VISIBILITY 
    919     map(_InputIterator __f, _InputIterator __l, const allocator_type& __a)
    920         : map(__f, __l, key_compare(), __a) {}
    921 #endif
    922 
    923     _LIBCPP_INLINE_VISIBILITY
    924     map(const map& __m)
    925         : __tree_(__m.__tree_)
    926         {
    927             insert(__m.begin(), __m.end());
    928         }
    929 
    930     _LIBCPP_INLINE_VISIBILITY
    931     map& operator=(const map& __m)
    932         {
    933 #if __cplusplus >= 201103L
    934             __tree_ = __m.__tree_;
    935 #else
    936             if (this != &__m) {
    937                 __tree_.clear();
    938                 __tree_.value_comp() = __m.__tree_.value_comp();
    939                 __tree_.__copy_assign_alloc(__m.__tree_);
    940                 insert(__m.begin(), __m.end());
    941             }
    942 #endif
    943             return *this;
    944         }
    945 
    946 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
    947 
    948     _LIBCPP_INLINE_VISIBILITY
    949     map(map&& __m)
    950         _NOEXCEPT_(is_nothrow_move_constructible<__base>::value)
    951         : __tree_(_VSTD::move(__m.__tree_))
    952         {
    953         }
    954 
    955     map(map&& __m, const allocator_type& __a);
    956 
    957     _LIBCPP_INLINE_VISIBILITY
    958     map& operator=(map&& __m)
    959         _NOEXCEPT_(is_nothrow_move_assignable<__base>::value)
    960         {
    961             __tree_ = _VSTD::move(__m.__tree_);
    962             return *this;
    963         }
    964 
    965 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
    966 
    967 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
    968 
    969     _LIBCPP_INLINE_VISIBILITY
    970     map(initializer_list<value_type> __il, const key_compare& __comp = key_compare())
    971         : __tree_(__vc(__comp))
    972         {
    973             insert(__il.begin(), __il.end());
    974         }
    975 
    976     _LIBCPP_INLINE_VISIBILITY
    977     map(initializer_list<value_type> __il, const key_compare& __comp, const allocator_type& __a)
    978         : __tree_(__vc(__comp), __a)
    979         {
    980             insert(__il.begin(), __il.end());
    981         }
    982 
    983 #if _LIBCPP_STD_VER > 11
    984     _LIBCPP_INLINE_VISIBILITY 
    985     map(initializer_list<value_type> __il, const allocator_type& __a)
    986         : map(__il, key_compare(), __a) {}
    987 #endif
    988 
    989     _LIBCPP_INLINE_VISIBILITY
    990     map& operator=(initializer_list<value_type> __il)
    991         {
    992             __tree_.__assign_unique(__il.begin(), __il.end());
    993             return *this;
    994         }
    995 
    996 #endif  // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
    997 
    998     _LIBCPP_INLINE_VISIBILITY
    999     explicit map(const allocator_type& __a)
   1000         : __tree_(__a)
   1001         {
   1002         }
   1003 
   1004     _LIBCPP_INLINE_VISIBILITY
   1005     map(const map& __m, const allocator_type& __a)
   1006         : __tree_(__m.__tree_.value_comp(), __a)
   1007         {
   1008             insert(__m.begin(), __m.end());
   1009         }
   1010 
   1011     _LIBCPP_INLINE_VISIBILITY
   1012           iterator begin() _NOEXCEPT {return __tree_.begin();}
   1013     _LIBCPP_INLINE_VISIBILITY
   1014     const_iterator begin() const _NOEXCEPT {return __tree_.begin();}
   1015     _LIBCPP_INLINE_VISIBILITY
   1016           iterator end() _NOEXCEPT {return __tree_.end();}
   1017     _LIBCPP_INLINE_VISIBILITY
   1018     const_iterator end() const _NOEXCEPT {return __tree_.end();}
   1019 
   1020     _LIBCPP_INLINE_VISIBILITY
   1021           reverse_iterator rbegin() _NOEXCEPT {return reverse_iterator(end());}
   1022     _LIBCPP_INLINE_VISIBILITY
   1023     const_reverse_iterator rbegin() const _NOEXCEPT
   1024         {return const_reverse_iterator(end());}
   1025     _LIBCPP_INLINE_VISIBILITY
   1026           reverse_iterator rend() _NOEXCEPT
   1027             {return       reverse_iterator(begin());}
   1028     _LIBCPP_INLINE_VISIBILITY
   1029     const_reverse_iterator rend() const _NOEXCEPT
   1030         {return const_reverse_iterator(begin());}
   1031 
   1032     _LIBCPP_INLINE_VISIBILITY
   1033     const_iterator cbegin() const _NOEXCEPT {return begin();}
   1034     _LIBCPP_INLINE_VISIBILITY
   1035     const_iterator cend() const _NOEXCEPT {return end();}
   1036     _LIBCPP_INLINE_VISIBILITY
   1037     const_reverse_iterator crbegin() const _NOEXCEPT {return rbegin();}
   1038     _LIBCPP_INLINE_VISIBILITY
   1039     const_reverse_iterator crend() const _NOEXCEPT {return rend();}
   1040 
   1041     _LIBCPP_INLINE_VISIBILITY
   1042     bool      empty() const _NOEXCEPT {return __tree_.size() == 0;}
   1043     _LIBCPP_INLINE_VISIBILITY
   1044     size_type size() const _NOEXCEPT {return __tree_.size();}
   1045     _LIBCPP_INLINE_VISIBILITY
   1046     size_type max_size() const _NOEXCEPT {return __tree_.max_size();}
   1047 
   1048     mapped_type& operator[](const key_type& __k);
   1049 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
   1050     mapped_type& operator[](key_type&& __k);
   1051 #endif
   1052 
   1053           mapped_type& at(const key_type& __k);
   1054     const mapped_type& at(const key_type& __k) const;
   1055 
   1056     _LIBCPP_INLINE_VISIBILITY
   1057     allocator_type get_allocator() const _NOEXCEPT {return __tree_.__alloc();}
   1058     _LIBCPP_INLINE_VISIBILITY
   1059     key_compare    key_comp()      const {return __tree_.value_comp().key_comp();}
   1060     _LIBCPP_INLINE_VISIBILITY
   1061     value_compare  value_comp()    const {return value_compare(__tree_.value_comp().key_comp());}
   1062 
   1063 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
   1064 #ifndef _LIBCPP_HAS_NO_VARIADICS
   1065 
   1066     template <class ..._Args>
   1067         pair<iterator, bool>
   1068         emplace(_Args&& ...__args);
   1069 
   1070     template <class ..._Args>
   1071         iterator
   1072         emplace_hint(const_iterator __p, _Args&& ...__args);
   1073 
   1074 #endif  // _LIBCPP_HAS_NO_VARIADICS
   1075 
   1076     template <class _Pp,
   1077               class = typename enable_if<is_constructible<value_type, _Pp>::value>::type>
   1078         _LIBCPP_INLINE_VISIBILITY
   1079         pair<iterator, bool> insert(_Pp&& __p)
   1080             {return __tree_.__insert_unique(_VSTD::forward<_Pp>(__p));}
   1081 
   1082     template <class _Pp,
   1083               class = typename enable_if<is_constructible<value_type, _Pp>::value>::type>
   1084         _LIBCPP_INLINE_VISIBILITY
   1085         iterator insert(const_iterator __pos, _Pp&& __p)
   1086             {return __tree_.__insert_unique(__pos.__i_, _VSTD::forward<_Pp>(__p));}
   1087 
   1088 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
   1089 
   1090     _LIBCPP_INLINE_VISIBILITY
   1091     pair<iterator, bool>
   1092         insert(const value_type& __v) {return __tree_.__insert_unique(__v);}
   1093 
   1094     _LIBCPP_INLINE_VISIBILITY
   1095     iterator
   1096         insert(const_iterator __p, const value_type& __v)
   1097             {return __tree_.__insert_unique(__p.__i_, __v);}
   1098 
   1099     template <class _InputIterator>
   1100         _LIBCPP_INLINE_VISIBILITY
   1101         void insert(_InputIterator __f, _InputIterator __l)
   1102         {
   1103             for (const_iterator __e = cend(); __f != __l; ++__f)
   1104                 insert(__e.__i_, *__f);
   1105         }
   1106 
   1107 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
   1108 
   1109     _LIBCPP_INLINE_VISIBILITY
   1110     void insert(initializer_list<value_type> __il)
   1111         {insert(__il.begin(), __il.end());}
   1112 
   1113 #endif  // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
   1114 
   1115 #if _LIBCPP_STD_VER > 14
   1116 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
   1117 #ifndef _LIBCPP_HAS_NO_VARIADICS
   1118     template <class... _Args>
   1119         _LIBCPP_INLINE_VISIBILITY
   1120         pair<iterator, bool> try_emplace(const key_type& __k, _Args&&... __args)
   1121     {
   1122         iterator __p = lower_bound(__k);
   1123         if ( __p != end() && !key_comp()(__k, __p->first))
   1124             return _VSTD::make_pair(__p, false);
   1125         else
   1126             return _VSTD::make_pair(
   1127                       emplace_hint(__p, 
   1128                         _VSTD::piecewise_construct, _VSTD::forward_as_tuple(__k), 
   1129                         _VSTD::forward_as_tuple(_VSTD::forward<_Args>(__args)...)),
   1130                       true);
   1131     }
   1132 
   1133     template <class... _Args>
   1134         _LIBCPP_INLINE_VISIBILITY
   1135         pair<iterator, bool> try_emplace(key_type&& __k, _Args&&... __args)
   1136     {
   1137         iterator __p = lower_bound(__k);
   1138         if ( __p != end() && !key_comp()(__k, __p->first))
   1139             return _VSTD::make_pair(__p, false);
   1140         else
   1141             return _VSTD::make_pair(
   1142                       emplace_hint(__p, 
   1143                         _VSTD::piecewise_construct, _VSTD::forward_as_tuple(_VSTD::move(__k)), 
   1144                         _VSTD::forward_as_tuple(_VSTD::forward<_Args>(__args)...)),
   1145                       true);
   1146     }
   1147 
   1148     template <class... _Args>
   1149         _LIBCPP_INLINE_VISIBILITY
   1150         iterator try_emplace(const_iterator __h, const key_type& __k, _Args&&... __args)
   1151     {
   1152         iterator __p = lower_bound(__k);
   1153         if ( __p != end() && !key_comp()(__k, __p->first))
   1154             return __p;
   1155         else
   1156             return emplace_hint(__p, 
   1157                       _VSTD::piecewise_construct, _VSTD::forward_as_tuple(__k), 
   1158                       _VSTD::forward_as_tuple(_VSTD::forward<_Args>(__args)...));
   1159     }
   1160 
   1161     template <class... _Args>
   1162         _LIBCPP_INLINE_VISIBILITY
   1163         iterator try_emplace(const_iterator __h, key_type&& __k, _Args&&... __args)
   1164     {
   1165         iterator __p = lower_bound(__k);
   1166         if ( __p != end() && !key_comp()(__k, __p->first))
   1167             return __p;
   1168         else
   1169             return emplace_hint(__p, 
   1170                       _VSTD::piecewise_construct, _VSTD::forward_as_tuple(_VSTD::move(__k)), 
   1171                       _VSTD::forward_as_tuple(_VSTD::forward<_Args>(__args)...));
   1172     }
   1173 
   1174     template <class _Vp>
   1175         _LIBCPP_INLINE_VISIBILITY
   1176         pair<iterator, bool> insert_or_assign(const key_type& __k, _Vp&& __v)
   1177     {
   1178         iterator __p = lower_bound(__k);
   1179         if ( __p != end() && !key_comp()(__k, __p->first))
   1180         {
   1181             __p->second = _VSTD::forward<_Vp>(__v);
   1182             return _VSTD::make_pair(__p, false);
   1183         }
   1184         return _VSTD::make_pair(emplace_hint(__p, __k, _VSTD::forward<_Vp>(__v)), true);
   1185     }
   1186         
   1187     template <class _Vp>
   1188         _LIBCPP_INLINE_VISIBILITY
   1189         pair<iterator, bool> insert_or_assign(key_type&& __k, _Vp&& __v)
   1190     {
   1191         iterator __p = lower_bound(__k);
   1192         if ( __p != end() && !key_comp()(__k, __p->first))
   1193         {
   1194             __p->second = _VSTD::forward<_Vp>(__v);
   1195             return _VSTD::make_pair(__p, false);
   1196         }
   1197         return _VSTD::make_pair(emplace_hint(__p, _VSTD::move(__k), _VSTD::forward<_Vp>(__v)), true);
   1198     }
   1199 
   1200     template <class _Vp>
   1201         _LIBCPP_INLINE_VISIBILITY
   1202         iterator insert_or_assign(const_iterator __h, const key_type& __k, _Vp&& __v)
   1203      {
   1204         iterator __p = lower_bound(__k);
   1205         if ( __p != end() && !key_comp()(__k, __p->first))
   1206         {
   1207             __p->second = _VSTD::forward<_Vp>(__v);
   1208             return __p;
   1209         }
   1210         return emplace_hint(__h, __k, _VSTD::forward<_Vp>(__v));
   1211      }
   1212 
   1213     template <class _Vp>
   1214         _LIBCPP_INLINE_VISIBILITY
   1215         iterator insert_or_assign(const_iterator __h, key_type&& __k, _Vp&& __v)
   1216      {
   1217         iterator __p = lower_bound(__k);
   1218         if ( __p != end() && !key_comp()(__k, __p->first))
   1219         {
   1220             __p->second = _VSTD::forward<_Vp>(__v);
   1221             return __p;
   1222         }
   1223         return emplace_hint(__h, _VSTD::move(__k), _VSTD::forward<_Vp>(__v));
   1224      }
   1225 #endif
   1226 #endif
   1227 #endif
   1228 
   1229     _LIBCPP_INLINE_VISIBILITY
   1230     iterator erase(const_iterator __p) {return __tree_.erase(__p.__i_);}
   1231     _LIBCPP_INLINE_VISIBILITY
   1232     iterator erase(iterator __p)       {return __tree_.erase(__p.__i_);}
   1233     _LIBCPP_INLINE_VISIBILITY
   1234     size_type erase(const key_type& __k)
   1235         {return __tree_.__erase_unique(__k);}
   1236     _LIBCPP_INLINE_VISIBILITY
   1237     iterator  erase(const_iterator __f, const_iterator __l)
   1238         {return __tree_.erase(__f.__i_, __l.__i_);}
   1239     _LIBCPP_INLINE_VISIBILITY
   1240     void clear() _NOEXCEPT {__tree_.clear();}
   1241 
   1242     _LIBCPP_INLINE_VISIBILITY
   1243     void swap(map& __m)
   1244         _NOEXCEPT_(__is_nothrow_swappable<__base>::value)
   1245         {__tree_.swap(__m.__tree_);}
   1246 
   1247     _LIBCPP_INLINE_VISIBILITY
   1248     iterator find(const key_type& __k)             {return __tree_.find(__k);}
   1249     _LIBCPP_INLINE_VISIBILITY
   1250     const_iterator find(const key_type& __k) const {return __tree_.find(__k);}
   1251 #if _LIBCPP_STD_VER > 11
   1252     template <typename _K2>
   1253     _LIBCPP_INLINE_VISIBILITY
   1254     typename enable_if<__is_transparent<_Compare, _K2>::value,iterator>::type
   1255     find(const _K2& __k)                           {return __tree_.find(__k);}
   1256     template <typename _K2>
   1257     _LIBCPP_INLINE_VISIBILITY
   1258     typename enable_if<__is_transparent<_Compare, _K2>::value,const_iterator>::type
   1259     find(const _K2& __k) const                     {return __tree_.find(__k);}
   1260 #endif
   1261 
   1262     _LIBCPP_INLINE_VISIBILITY
   1263     size_type      count(const key_type& __k) const
   1264         {return __tree_.__count_unique(__k);}
   1265 #if _LIBCPP_STD_VER > 11
   1266     template <typename _K2>
   1267     _LIBCPP_INLINE_VISIBILITY
   1268     typename enable_if<__is_transparent<_Compare, _K2>::value,size_type>::type
   1269     count(const _K2& __k) const {return __tree_.__count_unique(__k);}
   1270 #endif
   1271     _LIBCPP_INLINE_VISIBILITY
   1272     iterator lower_bound(const key_type& __k)
   1273         {return __tree_.lower_bound(__k);}
   1274     _LIBCPP_INLINE_VISIBILITY
   1275     const_iterator lower_bound(const key_type& __k) const
   1276         {return __tree_.lower_bound(__k);}
   1277 #if _LIBCPP_STD_VER > 11
   1278     template <typename _K2>
   1279     _LIBCPP_INLINE_VISIBILITY
   1280     typename enable_if<__is_transparent<_Compare, _K2>::value,iterator>::type
   1281     lower_bound(const _K2& __k)       {return __tree_.lower_bound(__k);}
   1282 
   1283     template <typename _K2>
   1284     _LIBCPP_INLINE_VISIBILITY
   1285     typename enable_if<__is_transparent<_Compare, _K2>::value,const_iterator>::type
   1286     lower_bound(const _K2& __k) const {return __tree_.lower_bound(__k);}
   1287 #endif
   1288 
   1289     _LIBCPP_INLINE_VISIBILITY
   1290     iterator upper_bound(const key_type& __k)
   1291         {return __tree_.upper_bound(__k);}
   1292     _LIBCPP_INLINE_VISIBILITY
   1293     const_iterator upper_bound(const key_type& __k) const
   1294         {return __tree_.upper_bound(__k);}
   1295 #if _LIBCPP_STD_VER > 11
   1296     template <typename _K2>
   1297     _LIBCPP_INLINE_VISIBILITY
   1298     typename enable_if<__is_transparent<_Compare, _K2>::value,iterator>::type
   1299     upper_bound(const _K2& __k)       {return __tree_.upper_bound(__k);}
   1300     template <typename _K2>
   1301     _LIBCPP_INLINE_VISIBILITY
   1302     typename enable_if<__is_transparent<_Compare, _K2>::value,const_iterator>::type
   1303     upper_bound(const _K2& __k) const {return __tree_.upper_bound(__k);}
   1304 #endif
   1305 
   1306     _LIBCPP_INLINE_VISIBILITY
   1307     pair<iterator,iterator> equal_range(const key_type& __k)
   1308         {return __tree_.__equal_range_unique(__k);}
   1309     _LIBCPP_INLINE_VISIBILITY
   1310     pair<const_iterator,const_iterator> equal_range(const key_type& __k) const
   1311         {return __tree_.__equal_range_unique(__k);}
   1312 #if _LIBCPP_STD_VER > 11
   1313     template <typename _K2>
   1314     _LIBCPP_INLINE_VISIBILITY
   1315     typename enable_if<__is_transparent<_Compare, _K2>::value,pair<iterator,iterator>>::type
   1316     equal_range(const _K2& __k)       {return __tree_.__equal_range_unique(__k);}
   1317     template <typename _K2>
   1318     _LIBCPP_INLINE_VISIBILITY
   1319     typename enable_if<__is_transparent<_Compare, _K2>::value,pair<const_iterator,const_iterator>>::type
   1320     equal_range(const _K2& __k) const {return __tree_.__equal_range_unique(__k);}
   1321 #endif
   1322 
   1323 private:
   1324     typedef typename __base::__node                    __node;
   1325     typedef typename __base::__node_allocator          __node_allocator;
   1326     typedef typename __base::__node_pointer            __node_pointer;
   1327     typedef typename __base::__node_const_pointer      __node_const_pointer;
   1328     typedef typename __base::__node_base_pointer       __node_base_pointer;
   1329     typedef typename __base::__node_base_const_pointer __node_base_const_pointer;
   1330     typedef __map_node_destructor<__node_allocator> _Dp;
   1331     typedef unique_ptr<__node, _Dp> __node_holder;
   1332 
   1333 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
   1334     __node_holder __construct_node();
   1335     template <class _A0>
   1336         __node_holder __construct_node(_A0&& __a0);
   1337     __node_holder __construct_node_with_key(key_type&& __k);
   1338 #ifndef _LIBCPP_HAS_NO_VARIADICS
   1339     template <class _A0, class _A1, class ..._Args>
   1340         __node_holder __construct_node(_A0&& __a0, _A1&& __a1, _Args&& ...__args);
   1341 #endif  // _LIBCPP_HAS_NO_VARIADICS
   1342 #endif
   1343     __node_holder __construct_node_with_key(const key_type& __k);
   1344 
   1345     __node_base_pointer&
   1346         __find_equal_key(__node_base_pointer& __parent, const key_type& __k);
   1347     __node_base_const_pointer
   1348         __find_equal_key(__node_base_const_pointer& __parent, const key_type& __k) const;
   1349 };
   1350 
   1351 // Find place to insert if __k doesn't exist
   1352 // Set __parent to parent of null leaf
   1353 // Return reference to null leaf
   1354 // If __k exists, set parent to node of __k and return reference to node of __k
   1355 template <class _Key, class _Tp, class _Compare, class _Allocator>
   1356 typename map<_Key, _Tp, _Compare, _Allocator>::__node_base_pointer&
   1357 map<_Key, _Tp, _Compare, _Allocator>::__find_equal_key(__node_base_pointer& __parent,
   1358                                                        const key_type& __k)
   1359 {
   1360     __node_pointer __nd = __tree_.__root();
   1361     if (__nd != nullptr)
   1362     {
   1363         while (true)
   1364         {
   1365             if (__tree_.value_comp().key_comp()(__k, __nd->__value_.__cc.first))
   1366             {
   1367                 if (__nd->__left_ != nullptr)
   1368                     __nd = static_cast<__node_pointer>(__nd->__left_);
   1369                 else
   1370                 {
   1371                     __parent = static_cast<__node_base_pointer>(__nd);
   1372                     return __parent->__left_;
   1373                 }
   1374             }
   1375             else if (__tree_.value_comp().key_comp()(__nd->__value_.__cc.first, __k))
   1376             {
   1377                 if (__nd->__right_ != nullptr)
   1378                     __nd = static_cast<__node_pointer>(__nd->__right_);
   1379                 else
   1380                 {
   1381                     __parent = static_cast<__node_base_pointer>(__nd);
   1382                     return __parent->__right_;
   1383                 }
   1384             }
   1385             else
   1386             {
   1387                 __parent = static_cast<__node_base_pointer>(__nd);
   1388                 return __parent;
   1389             }
   1390         }
   1391     }
   1392     __parent = static_cast<__node_base_pointer>(__tree_.__end_node());
   1393     return __parent->__left_;
   1394 }
   1395 
   1396 // Find __k
   1397 // Set __parent to parent of null leaf and
   1398 //    return reference to null leaf iv __k does not exist.
   1399 // If __k exists, set parent to node of __k and return reference to node of __k
   1400 template <class _Key, class _Tp, class _Compare, class _Allocator>
   1401 typename map<_Key, _Tp, _Compare, _Allocator>::__node_base_const_pointer
   1402 map<_Key, _Tp, _Compare, _Allocator>::__find_equal_key(__node_base_const_pointer& __parent,
   1403                                                        const key_type& __k) const
   1404 {
   1405     __node_const_pointer __nd = __tree_.__root();
   1406     if (__nd != nullptr)
   1407     {
   1408         while (true)
   1409         {
   1410             if (__tree_.value_comp().key_comp()(__k, __nd->__value_.__cc.first))
   1411             {
   1412                 if (__nd->__left_ != nullptr)
   1413                     __nd = static_cast<__node_pointer>(__nd->__left_);
   1414                 else
   1415                 {
   1416                     __parent = static_cast<__node_base_pointer>(__nd);
   1417                     return const_cast<const __node_base_const_pointer&>(__parent->__left_);
   1418                 }
   1419             }
   1420             else if (__tree_.value_comp().key_comp()(__nd->__value_.__cc.first, __k))
   1421             {
   1422                 if (__nd->__right_ != nullptr)
   1423                     __nd = static_cast<__node_pointer>(__nd->__right_);
   1424                 else
   1425                 {
   1426                     __parent = static_cast<__node_base_pointer>(__nd);
   1427                     return const_cast<const __node_base_const_pointer&>(__parent->__right_);
   1428                 }
   1429             }
   1430             else
   1431             {
   1432                 __parent = static_cast<__node_base_pointer>(__nd);
   1433                 return __parent;
   1434             }
   1435         }
   1436     }
   1437     __parent = static_cast<__node_base_pointer>(__tree_.__end_node());
   1438     return const_cast<const __node_base_const_pointer&>(__parent->__left_);
   1439 }
   1440 
   1441 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
   1442 
   1443 template <class _Key, class _Tp, class _Compare, class _Allocator>
   1444 map<_Key, _Tp, _Compare, _Allocator>::map(map&& __m, const allocator_type& __a)
   1445     : __tree_(_VSTD::move(__m.__tree_), __a)
   1446 {
   1447     if (__a != __m.get_allocator())
   1448     {
   1449         const_iterator __e = cend();
   1450         while (!__m.empty())
   1451             __tree_.__insert_unique(__e.__i_,
   1452                     _VSTD::move(__m.__tree_.remove(__m.begin().__i_)->__value_));
   1453     }
   1454 }
   1455 
   1456 template <class _Key, class _Tp, class _Compare, class _Allocator>
   1457 typename map<_Key, _Tp, _Compare, _Allocator>::__node_holder
   1458 map<_Key, _Tp, _Compare, _Allocator>::__construct_node()
   1459 {
   1460     __node_allocator& __na = __tree_.__node_alloc();
   1461     __node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na));
   1462     __node_traits::construct(__na, _VSTD::addressof(__h->__value_.__cc.first));
   1463     __h.get_deleter().__first_constructed = true;
   1464     __node_traits::construct(__na, _VSTD::addressof(__h->__value_.__cc.second));
   1465     __h.get_deleter().__second_constructed = true;
   1466     return __h;
   1467 }
   1468 
   1469 template <class _Key, class _Tp, class _Compare, class _Allocator>
   1470 template <class _A0>
   1471 typename map<_Key, _Tp, _Compare, _Allocator>::__node_holder
   1472 map<_Key, _Tp, _Compare, _Allocator>::__construct_node(_A0&& __a0)
   1473 {
   1474     __node_allocator& __na = __tree_.__node_alloc();
   1475     __node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na));
   1476     __node_traits::construct(__na, _VSTD::addressof(__h->__value_), _VSTD::forward<_A0>(__a0));
   1477     __h.get_deleter().__first_constructed = true;
   1478     __h.get_deleter().__second_constructed = true;
   1479     return __h;
   1480 }
   1481 
   1482 template <class _Key, class _Tp, class _Compare, class _Allocator>
   1483 typename map<_Key, _Tp, _Compare, _Allocator>::__node_holder
   1484 map<_Key, _Tp, _Compare, _Allocator>::__construct_node_with_key(key_type&& __k)
   1485 {
   1486     __node_allocator& __na = __tree_.__node_alloc();
   1487     __node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na));
   1488     __node_traits::construct(__na, _VSTD::addressof(__h->__value_.__cc.first), _VSTD::move(__k));
   1489     __h.get_deleter().__first_constructed = true;
   1490     __node_traits::construct(__na, _VSTD::addressof(__h->__value_.__cc.second));
   1491     __h.get_deleter().__second_constructed = true;
   1492     return __h;
   1493 }
   1494 
   1495 #ifndef _LIBCPP_HAS_NO_VARIADICS
   1496 
   1497 template <class _Key, class _Tp, class _Compare, class _Allocator>
   1498 template <class _A0, class _A1, class ..._Args>
   1499 typename map<_Key, _Tp, _Compare, _Allocator>::__node_holder
   1500 map<_Key, _Tp, _Compare, _Allocator>::__construct_node(_A0&& __a0, _A1&& __a1, _Args&& ...__args)
   1501 {
   1502     __node_allocator& __na = __tree_.__node_alloc();
   1503     __node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na));
   1504     __node_traits::construct(__na, _VSTD::addressof(__h->__value_),
   1505                              _VSTD::forward<_A0>(__a0), _VSTD::forward<_A1>(__a1),
   1506                              _VSTD::forward<_Args>(__args)...);
   1507     __h.get_deleter().__first_constructed = true;
   1508     __h.get_deleter().__second_constructed = true;
   1509     return __h;
   1510 }
   1511 
   1512 #endif  // _LIBCPP_HAS_NO_VARIADICS
   1513 
   1514 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
   1515 
   1516 template <class _Key, class _Tp, class _Compare, class _Allocator>
   1517 typename map<_Key, _Tp, _Compare, _Allocator>::__node_holder
   1518 map<_Key, _Tp, _Compare, _Allocator>::__construct_node_with_key(const key_type& __k)
   1519 {
   1520     __node_allocator& __na = __tree_.__node_alloc();
   1521     __node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na));
   1522     __node_traits::construct(__na, _VSTD::addressof(__h->__value_.__cc.first), __k);
   1523     __h.get_deleter().__first_constructed = true;
   1524     __node_traits::construct(__na, _VSTD::addressof(__h->__value_.__cc.second));
   1525     __h.get_deleter().__second_constructed = true;
   1526     return _VSTD::move(__h);  // explicitly moved for C++03
   1527 }
   1528 
   1529 template <class _Key, class _Tp, class _Compare, class _Allocator>
   1530 _Tp&
   1531 map<_Key, _Tp, _Compare, _Allocator>::operator[](const key_type& __k)
   1532 {
   1533     __node_base_pointer __parent;
   1534     __node_base_pointer& __child = __find_equal_key(__parent, __k);
   1535     __node_pointer __r = static_cast<__node_pointer>(__child);
   1536     if (__child == nullptr)
   1537     {
   1538         __node_holder __h = __construct_node_with_key(__k);
   1539         __tree_.__insert_node_at(__parent, __child, static_cast<__node_base_pointer>(__h.get()));
   1540         __r = __h.release();
   1541     }
   1542     return __r->__value_.__cc.second;
   1543 }
   1544 
   1545 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
   1546 
   1547 template <class _Key, class _Tp, class _Compare, class _Allocator>
   1548 _Tp&
   1549 map<_Key, _Tp, _Compare, _Allocator>::operator[](key_type&& __k)
   1550 {
   1551     __node_base_pointer __parent;
   1552     __node_base_pointer& __child = __find_equal_key(__parent, __k);
   1553     __node_pointer __r = static_cast<__node_pointer>(__child);
   1554     if (__child == nullptr)
   1555     {
   1556         __node_holder __h = __construct_node_with_key(_VSTD::move(__k));
   1557         __tree_.__insert_node_at(__parent, __child, static_cast<__node_base_pointer>(__h.get()));
   1558         __r = __h.release();
   1559     }
   1560     return __r->__value_.__cc.second;
   1561 }
   1562 
   1563 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
   1564 
   1565 template <class _Key, class _Tp, class _Compare, class _Allocator>
   1566 _Tp&
   1567 map<_Key, _Tp, _Compare, _Allocator>::at(const key_type& __k)
   1568 {
   1569     __node_base_pointer __parent;
   1570     __node_base_pointer& __child = __find_equal_key(__parent, __k);
   1571 #ifndef _LIBCPP_NO_EXCEPTIONS
   1572     if (__child == nullptr)
   1573         throw out_of_range("map::at:  key not found");
   1574 #endif  // _LIBCPP_NO_EXCEPTIONS
   1575     return static_cast<__node_pointer>(__child)->__value_.__cc.second;
   1576 }
   1577 
   1578 template <class _Key, class _Tp, class _Compare, class _Allocator>
   1579 const _Tp&
   1580 map<_Key, _Tp, _Compare, _Allocator>::at(const key_type& __k) const
   1581 {
   1582     __node_base_const_pointer __parent;
   1583     __node_base_const_pointer __child = __find_equal_key(__parent, __k);
   1584 #ifndef _LIBCPP_NO_EXCEPTIONS
   1585     if (__child == nullptr)
   1586         throw out_of_range("map::at:  key not found");
   1587 #endif  // _LIBCPP_NO_EXCEPTIONS
   1588     return static_cast<__node_const_pointer>(__child)->__value_.__cc.second;
   1589 }
   1590 
   1591 #if !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS)
   1592 
   1593 template <class _Key, class _Tp, class _Compare, class _Allocator>
   1594 template <class ..._Args>
   1595 pair<typename map<_Key, _Tp, _Compare, _Allocator>::iterator, bool>
   1596 map<_Key, _Tp, _Compare, _Allocator>::emplace(_Args&& ...__args)
   1597 {
   1598     __node_holder __h = __construct_node(_VSTD::forward<_Args>(__args)...);
   1599     pair<iterator, bool> __r = __tree_.__node_insert_unique(__h.get());
   1600     if (__r.second)
   1601         __h.release();
   1602     return __r;
   1603 }
   1604 
   1605 template <class _Key, class _Tp, class _Compare, class _Allocator>
   1606 template <class ..._Args>
   1607 typename map<_Key, _Tp, _Compare, _Allocator>::iterator
   1608 map<_Key, _Tp, _Compare, _Allocator>::emplace_hint(const_iterator __p,
   1609                                                    _Args&& ...__args)
   1610 {
   1611     __node_holder __h = __construct_node(_VSTD::forward<_Args>(__args)...);
   1612     iterator __r = __tree_.__node_insert_unique(__p.__i_, __h.get());
   1613     if (__r.__i_.__ptr_ == __h.get())
   1614         __h.release();
   1615     return __r;
   1616 }
   1617 
   1618 #endif  // !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS)
   1619 
   1620 template <class _Key, class _Tp, class _Compare, class _Allocator>
   1621 inline _LIBCPP_INLINE_VISIBILITY
   1622 bool
   1623 operator==(const map<_Key, _Tp, _Compare, _Allocator>& __x,
   1624            const map<_Key, _Tp, _Compare, _Allocator>& __y)
   1625 {
   1626     return __x.size() == __y.size() && _VSTD::equal(__x.begin(), __x.end(), __y.begin());
   1627 }
   1628 
   1629 template <class _Key, class _Tp, class _Compare, class _Allocator>
   1630 inline _LIBCPP_INLINE_VISIBILITY
   1631 bool
   1632 operator< (const map<_Key, _Tp, _Compare, _Allocator>& __x,
   1633            const map<_Key, _Tp, _Compare, _Allocator>& __y)
   1634 {
   1635     return _VSTD::lexicographical_compare(__x.begin(), __x.end(), __y.begin(), __y.end());
   1636 }
   1637 
   1638 template <class _Key, class _Tp, class _Compare, class _Allocator>
   1639 inline _LIBCPP_INLINE_VISIBILITY
   1640 bool
   1641 operator!=(const map<_Key, _Tp, _Compare, _Allocator>& __x,
   1642            const map<_Key, _Tp, _Compare, _Allocator>& __y)
   1643 {
   1644     return !(__x == __y);
   1645 }
   1646 
   1647 template <class _Key, class _Tp, class _Compare, class _Allocator>
   1648 inline _LIBCPP_INLINE_VISIBILITY
   1649 bool
   1650 operator> (const map<_Key, _Tp, _Compare, _Allocator>& __x,
   1651            const map<_Key, _Tp, _Compare, _Allocator>& __y)
   1652 {
   1653     return __y < __x;
   1654 }
   1655 
   1656 template <class _Key, class _Tp, class _Compare, class _Allocator>
   1657 inline _LIBCPP_INLINE_VISIBILITY
   1658 bool
   1659 operator>=(const map<_Key, _Tp, _Compare, _Allocator>& __x,
   1660            const map<_Key, _Tp, _Compare, _Allocator>& __y)
   1661 {
   1662     return !(__x < __y);
   1663 }
   1664 
   1665 template <class _Key, class _Tp, class _Compare, class _Allocator>
   1666 inline _LIBCPP_INLINE_VISIBILITY
   1667 bool
   1668 operator<=(const map<_Key, _Tp, _Compare, _Allocator>& __x,
   1669            const map<_Key, _Tp, _Compare, _Allocator>& __y)
   1670 {
   1671     return !(__y < __x);
   1672 }
   1673 
   1674 template <class _Key, class _Tp, class _Compare, class _Allocator>
   1675 inline _LIBCPP_INLINE_VISIBILITY
   1676 void
   1677 swap(map<_Key, _Tp, _Compare, _Allocator>& __x,
   1678      map<_Key, _Tp, _Compare, _Allocator>& __y)
   1679     _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
   1680 {
   1681     __x.swap(__y);
   1682 }
   1683 
   1684 template <class _Key, class _Tp, class _Compare = less<_Key>,
   1685           class _Allocator = allocator<pair<const _Key, _Tp> > >
   1686 class _LIBCPP_TYPE_VIS_ONLY multimap
   1687 {
   1688 public:
   1689     // types:
   1690     typedef _Key                                     key_type;
   1691     typedef _Tp                                      mapped_type;
   1692     typedef pair<const key_type, mapped_type>        value_type;
   1693     typedef pair<key_type, mapped_type>              __nc_value_type;
   1694     typedef _Compare                                 key_compare;
   1695     typedef _Allocator                               allocator_type;
   1696     typedef value_type&                              reference;
   1697     typedef const value_type&                        const_reference;
   1698 
   1699     class _LIBCPP_TYPE_VIS_ONLY value_compare
   1700         : public binary_function<value_type, value_type, bool>
   1701     {
   1702         friend class multimap;
   1703     protected:
   1704         key_compare comp;
   1705 
   1706         _LIBCPP_INLINE_VISIBILITY
   1707         value_compare(key_compare c) : comp(c) {}
   1708     public:
   1709         _LIBCPP_INLINE_VISIBILITY
   1710         bool operator()(const value_type& __x, const value_type& __y) const
   1711             {return comp(__x.first, __y.first);}
   1712     };
   1713 
   1714 private:
   1715 
   1716     typedef _VSTD::__value_type<key_type, mapped_type>             __value_type;
   1717     typedef __map_value_compare<key_type, __value_type, key_compare> __vc;
   1718     typedef typename __rebind_alloc_helper<allocator_traits<allocator_type>,
   1719                                                  __value_type>::type __allocator_type;
   1720     typedef __tree<__value_type, __vc, __allocator_type>            __base;
   1721     typedef typename __base::__node_traits                          __node_traits;
   1722     typedef allocator_traits<allocator_type>                        __alloc_traits;
   1723 
   1724     __base __tree_;
   1725 
   1726 public:
   1727     typedef typename __alloc_traits::pointer               pointer;
   1728     typedef typename __alloc_traits::const_pointer         const_pointer;
   1729     typedef typename __alloc_traits::size_type             size_type;
   1730     typedef typename __alloc_traits::difference_type       difference_type;
   1731     typedef __map_iterator<typename __base::iterator>      iterator;
   1732     typedef __map_const_iterator<typename __base::const_iterator> const_iterator;
   1733     typedef _VSTD::reverse_iterator<iterator>               reverse_iterator;
   1734     typedef _VSTD::reverse_iterator<const_iterator>         const_reverse_iterator;
   1735 
   1736     _LIBCPP_INLINE_VISIBILITY
   1737     multimap()
   1738         _NOEXCEPT_(
   1739             is_nothrow_default_constructible<allocator_type>::value &&
   1740             is_nothrow_default_constructible<key_compare>::value &&
   1741             is_nothrow_copy_constructible<key_compare>::value)
   1742         : __tree_(__vc(key_compare())) {}
   1743 
   1744     _LIBCPP_INLINE_VISIBILITY
   1745     explicit multimap(const key_compare& __comp)
   1746         _NOEXCEPT_(
   1747             is_nothrow_default_constructible<allocator_type>::value &&
   1748             is_nothrow_copy_constructible<key_compare>::value)
   1749         : __tree_(__vc(__comp)) {}
   1750 
   1751     _LIBCPP_INLINE_VISIBILITY
   1752     explicit multimap(const key_compare& __comp, const allocator_type& __a)
   1753         : __tree_(__vc(__comp), __a) {}
   1754 
   1755     template <class _InputIterator>
   1756         _LIBCPP_INLINE_VISIBILITY
   1757         multimap(_InputIterator __f, _InputIterator __l,
   1758             const key_compare& __comp = key_compare())
   1759         : __tree_(__vc(__comp))
   1760         {
   1761             insert(__f, __l);
   1762         }
   1763 
   1764     template <class _InputIterator>
   1765         _LIBCPP_INLINE_VISIBILITY
   1766         multimap(_InputIterator __f, _InputIterator __l,
   1767             const key_compare& __comp, const allocator_type& __a)
   1768         : __tree_(__vc(__comp), __a)
   1769         {
   1770             insert(__f, __l);
   1771         }
   1772 
   1773 #if _LIBCPP_STD_VER > 11
   1774     template <class _InputIterator>
   1775     _LIBCPP_INLINE_VISIBILITY 
   1776     multimap(_InputIterator __f, _InputIterator __l, const allocator_type& __a)
   1777         : multimap(__f, __l, key_compare(), __a) {}
   1778 #endif
   1779 
   1780     _LIBCPP_INLINE_VISIBILITY
   1781     multimap(const multimap& __m)
   1782         : __tree_(__m.__tree_.value_comp(),
   1783           __alloc_traits::select_on_container_copy_construction(__m.__tree_.__alloc()))
   1784         {
   1785             insert(__m.begin(), __m.end());
   1786         }
   1787 
   1788     _LIBCPP_INLINE_VISIBILITY
   1789     multimap& operator=(const multimap& __m)
   1790         {
   1791 #if __cplusplus >= 201103L
   1792             __tree_ = __m.__tree_;
   1793 #else
   1794             if (this != &__m) {
   1795                 __tree_.clear();
   1796                 __tree_.value_comp() = __m.__tree_.value_comp();
   1797                 __tree_.__copy_assign_alloc(__m.__tree_);
   1798                 insert(__m.begin(), __m.end());
   1799             }
   1800 #endif
   1801             return *this;
   1802         }
   1803 
   1804 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
   1805 
   1806     _LIBCPP_INLINE_VISIBILITY
   1807     multimap(multimap&& __m)
   1808         _NOEXCEPT_(is_nothrow_move_constructible<__base>::value)
   1809         : __tree_(_VSTD::move(__m.__tree_))
   1810         {
   1811         }
   1812 
   1813     multimap(multimap&& __m, const allocator_type& __a);
   1814 
   1815     _LIBCPP_INLINE_VISIBILITY
   1816     multimap& operator=(multimap&& __m)
   1817         _NOEXCEPT_(is_nothrow_move_assignable<__base>::value)
   1818         {
   1819             __tree_ = _VSTD::move(__m.__tree_);
   1820             return *this;
   1821         }
   1822 
   1823 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
   1824 
   1825 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
   1826 
   1827     _LIBCPP_INLINE_VISIBILITY
   1828     multimap(initializer_list<value_type> __il, const key_compare& __comp = key_compare())
   1829         : __tree_(__vc(__comp))
   1830         {
   1831             insert(__il.begin(), __il.end());
   1832         }
   1833 
   1834     _LIBCPP_INLINE_VISIBILITY
   1835     multimap(initializer_list<value_type> __il, const key_compare& __comp, const allocator_type& __a)
   1836         : __tree_(__vc(__comp), __a)
   1837         {
   1838             insert(__il.begin(), __il.end());
   1839         }
   1840 
   1841 #if _LIBCPP_STD_VER > 11
   1842     _LIBCPP_INLINE_VISIBILITY 
   1843     multimap(initializer_list<value_type> __il, const allocator_type& __a)
   1844         : multimap(__il, key_compare(), __a) {}
   1845 #endif
   1846 
   1847     _LIBCPP_INLINE_VISIBILITY
   1848     multimap& operator=(initializer_list<value_type> __il)
   1849         {
   1850             __tree_.__assign_multi(__il.begin(), __il.end());
   1851             return *this;
   1852         }
   1853 
   1854 #endif  // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
   1855 
   1856     _LIBCPP_INLINE_VISIBILITY
   1857     explicit multimap(const allocator_type& __a)
   1858         : __tree_(__a)
   1859         {
   1860         }
   1861 
   1862     _LIBCPP_INLINE_VISIBILITY
   1863     multimap(const multimap& __m, const allocator_type& __a)
   1864         : __tree_(__m.__tree_.value_comp(), __a)
   1865         {
   1866             insert(__m.begin(), __m.end());
   1867         }
   1868 
   1869     _LIBCPP_INLINE_VISIBILITY
   1870           iterator begin() _NOEXCEPT {return __tree_.begin();}
   1871     _LIBCPP_INLINE_VISIBILITY
   1872     const_iterator begin() const _NOEXCEPT {return __tree_.begin();}
   1873     _LIBCPP_INLINE_VISIBILITY
   1874           iterator end() _NOEXCEPT {return __tree_.end();}
   1875     _LIBCPP_INLINE_VISIBILITY
   1876     const_iterator end() const _NOEXCEPT {return __tree_.end();}
   1877 
   1878     _LIBCPP_INLINE_VISIBILITY
   1879           reverse_iterator rbegin() _NOEXCEPT {return reverse_iterator(end());}
   1880     _LIBCPP_INLINE_VISIBILITY
   1881     const_reverse_iterator rbegin() const _NOEXCEPT
   1882         {return const_reverse_iterator(end());}
   1883     _LIBCPP_INLINE_VISIBILITY
   1884           reverse_iterator rend() _NOEXCEPT {return reverse_iterator(begin());}
   1885     _LIBCPP_INLINE_VISIBILITY
   1886     const_reverse_iterator rend() const _NOEXCEPT
   1887         {return const_reverse_iterator(begin());}
   1888 
   1889     _LIBCPP_INLINE_VISIBILITY
   1890     const_iterator cbegin()  const _NOEXCEPT {return begin();}
   1891     _LIBCPP_INLINE_VISIBILITY
   1892     const_iterator cend() const _NOEXCEPT {return end();}
   1893     _LIBCPP_INLINE_VISIBILITY
   1894     const_reverse_iterator crbegin() const _NOEXCEPT {return rbegin();}
   1895     _LIBCPP_INLINE_VISIBILITY
   1896     const_reverse_iterator crend() const _NOEXCEPT {return rend();}
   1897 
   1898     _LIBCPP_INLINE_VISIBILITY
   1899     bool empty() const _NOEXCEPT {return __tree_.size() == 0;}
   1900     _LIBCPP_INLINE_VISIBILITY
   1901     size_type size() const _NOEXCEPT {return __tree_.size();}
   1902     _LIBCPP_INLINE_VISIBILITY
   1903     size_type max_size() const _NOEXCEPT {return __tree_.max_size();}
   1904 
   1905     _LIBCPP_INLINE_VISIBILITY
   1906     allocator_type get_allocator() const _NOEXCEPT {return __tree_.__alloc();}
   1907     _LIBCPP_INLINE_VISIBILITY
   1908     key_compare    key_comp() const {return __tree_.value_comp().key_comp();}
   1909     _LIBCPP_INLINE_VISIBILITY
   1910     value_compare  value_comp() const
   1911         {return value_compare(__tree_.value_comp().key_comp());}
   1912 
   1913 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
   1914 #ifndef _LIBCPP_HAS_NO_VARIADICS
   1915 
   1916     template <class ..._Args>
   1917         iterator
   1918         emplace(_Args&& ...__args);
   1919 
   1920     template <class ..._Args>
   1921         iterator
   1922         emplace_hint(const_iterator __p, _Args&& ...__args);
   1923 
   1924 #endif  // _LIBCPP_HAS_NO_VARIADICS
   1925 
   1926     template <class _Pp,
   1927               class = typename enable_if<is_constructible<value_type, _Pp>::value>::type>
   1928         _LIBCPP_INLINE_VISIBILITY
   1929         iterator insert(_Pp&& __p)
   1930             {return __tree_.__insert_multi(_VSTD::forward<_Pp>(__p));}
   1931 
   1932     template <class _Pp,
   1933               class = typename enable_if<is_constructible<value_type, _Pp>::value>::type>
   1934         _LIBCPP_INLINE_VISIBILITY
   1935         iterator insert(const_iterator __pos, _Pp&& __p)
   1936             {return __tree_.__insert_multi(__pos.__i_, _VSTD::forward<_Pp>(__p));}
   1937 
   1938 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
   1939 
   1940     _LIBCPP_INLINE_VISIBILITY
   1941     iterator insert(const value_type& __v) {return __tree_.__insert_multi(__v);}
   1942 
   1943     _LIBCPP_INLINE_VISIBILITY
   1944     iterator insert(const_iterator __p, const value_type& __v)
   1945             {return __tree_.__insert_multi(__p.__i_, __v);}
   1946 
   1947     template <class _InputIterator>
   1948         _LIBCPP_INLINE_VISIBILITY
   1949         void insert(_InputIterator __f, _InputIterator __l)
   1950         {
   1951             for (const_iterator __e = cend(); __f != __l; ++__f)
   1952                 __tree_.__insert_multi(__e.__i_, *__f);
   1953         }
   1954 
   1955 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
   1956 
   1957     _LIBCPP_INLINE_VISIBILITY
   1958     void insert(initializer_list<value_type> __il)
   1959         {insert(__il.begin(), __il.end());}
   1960 
   1961 #endif  // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
   1962 
   1963     _LIBCPP_INLINE_VISIBILITY
   1964     iterator erase(const_iterator __p) {return __tree_.erase(__p.__i_);}
   1965     _LIBCPP_INLINE_VISIBILITY
   1966     iterator erase(iterator __p)       {return __tree_.erase(__p.__i_);}
   1967     _LIBCPP_INLINE_VISIBILITY
   1968     size_type erase(const key_type& __k) {return __tree_.__erase_multi(__k);}
   1969     _LIBCPP_INLINE_VISIBILITY
   1970     iterator  erase(const_iterator __f, const_iterator __l)
   1971         {return __tree_.erase(__f.__i_, __l.__i_);}
   1972     _LIBCPP_INLINE_VISIBILITY
   1973     void clear() {__tree_.clear();}
   1974 
   1975     _LIBCPP_INLINE_VISIBILITY
   1976     void swap(multimap& __m)
   1977         _NOEXCEPT_(__is_nothrow_swappable<__base>::value)
   1978         {__tree_.swap(__m.__tree_);}
   1979 
   1980     _LIBCPP_INLINE_VISIBILITY
   1981     iterator find(const key_type& __k)             {return __tree_.find(__k);}
   1982     _LIBCPP_INLINE_VISIBILITY
   1983     const_iterator find(const key_type& __k) const {return __tree_.find(__k);}
   1984 #if _LIBCPP_STD_VER > 11
   1985     template <typename _K2>
   1986     _LIBCPP_INLINE_VISIBILITY
   1987     typename enable_if<__is_transparent<_Compare, _K2>::value,iterator>::type
   1988     find(const _K2& __k)                           {return __tree_.find(__k);}
   1989     template <typename _K2>
   1990     _LIBCPP_INLINE_VISIBILITY
   1991     typename enable_if<__is_transparent<_Compare, _K2>::value,const_iterator>::type
   1992     find(const _K2& __k) const                     {return __tree_.find(__k);}
   1993 #endif
   1994 
   1995     _LIBCPP_INLINE_VISIBILITY
   1996     size_type      count(const key_type& __k) const
   1997         {return __tree_.__count_multi(__k);}
   1998 #if _LIBCPP_STD_VER > 11
   1999     template <typename _K2>
   2000     _LIBCPP_INLINE_VISIBILITY
   2001     typename enable_if<__is_transparent<_Compare, _K2>::value,size_type>::type
   2002     count(const _K2& __k) const {return __tree_.__count_multi(__k);}
   2003 #endif
   2004     _LIBCPP_INLINE_VISIBILITY
   2005     iterator lower_bound(const key_type& __k)
   2006         {return __tree_.lower_bound(__k);}
   2007     _LIBCPP_INLINE_VISIBILITY
   2008     const_iterator lower_bound(const key_type& __k) const
   2009             {return __tree_.lower_bound(__k);}
   2010 #if _LIBCPP_STD_VER > 11
   2011     template <typename _K2>
   2012     _LIBCPP_INLINE_VISIBILITY
   2013     typename enable_if<__is_transparent<_Compare, _K2>::value,iterator>::type
   2014     lower_bound(const _K2& __k)       {return __tree_.lower_bound(__k);}
   2015 
   2016     template <typename _K2>
   2017     _LIBCPP_INLINE_VISIBILITY
   2018     typename enable_if<__is_transparent<_Compare, _K2>::value,const_iterator>::type
   2019     lower_bound(const _K2& __k) const {return __tree_.lower_bound(__k);}
   2020 #endif
   2021 
   2022     _LIBCPP_INLINE_VISIBILITY
   2023     iterator upper_bound(const key_type& __k)
   2024             {return __tree_.upper_bound(__k);}
   2025     _LIBCPP_INLINE_VISIBILITY
   2026     const_iterator upper_bound(const key_type& __k) const
   2027             {return __tree_.upper_bound(__k);}
   2028 #if _LIBCPP_STD_VER > 11
   2029     template <typename _K2>
   2030     _LIBCPP_INLINE_VISIBILITY
   2031     typename enable_if<__is_transparent<_Compare, _K2>::value,iterator>::type
   2032     upper_bound(const _K2& __k)       {return __tree_.upper_bound(__k);}
   2033     template <typename _K2>
   2034     _LIBCPP_INLINE_VISIBILITY
   2035     typename enable_if<__is_transparent<_Compare, _K2>::value,const_iterator>::type
   2036     upper_bound(const _K2& __k) const {return __tree_.upper_bound(__k);}
   2037 #endif
   2038 
   2039     _LIBCPP_INLINE_VISIBILITY
   2040     pair<iterator,iterator>             equal_range(const key_type& __k)
   2041             {return __tree_.__equal_range_multi(__k);}
   2042     _LIBCPP_INLINE_VISIBILITY
   2043     pair<const_iterator,const_iterator> equal_range(const key_type& __k) const
   2044             {return __tree_.__equal_range_multi(__k);}
   2045 #if _LIBCPP_STD_VER > 11
   2046     template <typename _K2>
   2047     _LIBCPP_INLINE_VISIBILITY
   2048     typename enable_if<__is_transparent<_Compare, _K2>::value,pair<iterator,iterator>>::type
   2049     equal_range(const _K2& __k)       {return __tree_.__equal_range_multi(__k);}
   2050     template <typename _K2>
   2051     _LIBCPP_INLINE_VISIBILITY
   2052     typename enable_if<__is_transparent<_Compare, _K2>::value,pair<const_iterator,const_iterator>>::type
   2053     equal_range(const _K2& __k) const {return __tree_.__equal_range_multi(__k);}
   2054 #endif
   2055 
   2056 private:
   2057     typedef typename __base::__node                    __node;
   2058     typedef typename __base::__node_allocator          __node_allocator;
   2059     typedef typename __base::__node_pointer            __node_pointer;
   2060     typedef typename __base::__node_const_pointer      __node_const_pointer;
   2061     typedef __map_node_destructor<__node_allocator> _Dp;
   2062     typedef unique_ptr<__node, _Dp> __node_holder;
   2063 
   2064 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
   2065     __node_holder __construct_node();
   2066     template <class _A0>
   2067         __node_holder
   2068          __construct_node(_A0&& __a0);
   2069 #ifndef _LIBCPP_HAS_NO_VARIADICS
   2070     template <class _A0, class _A1, class ..._Args>
   2071         __node_holder __construct_node(_A0&& __a0, _A1&& __a1, _Args&& ...__args);
   2072 #endif  // _LIBCPP_HAS_NO_VARIADICS
   2073 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
   2074 };
   2075 
   2076 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
   2077 
   2078 template <class _Key, class _Tp, class _Compare, class _Allocator>
   2079 multimap<_Key, _Tp, _Compare, _Allocator>::multimap(multimap&& __m, const allocator_type& __a)
   2080     : __tree_(_VSTD::move(__m.__tree_), __a)
   2081 {
   2082     if (__a != __m.get_allocator())
   2083     {
   2084         const_iterator __e = cend();
   2085         while (!__m.empty())
   2086             __tree_.__insert_multi(__e.__i_,
   2087                     _VSTD::move(__m.__tree_.remove(__m.begin().__i_)->__value_));
   2088     }
   2089 }
   2090 
   2091 template <class _Key, class _Tp, class _Compare, class _Allocator>
   2092 typename multimap<_Key, _Tp, _Compare, _Allocator>::__node_holder
   2093 multimap<_Key, _Tp, _Compare, _Allocator>::__construct_node()
   2094 {
   2095     __node_allocator& __na = __tree_.__node_alloc();
   2096     __node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na));
   2097     __node_traits::construct(__na, _VSTD::addressof(__h->__value_.__cc.first));
   2098     __h.get_deleter().__first_constructed = true;
   2099     __node_traits::construct(__na, _VSTD::addressof(__h->__value_.__cc.second));
   2100     __h.get_deleter().__second_constructed = true;
   2101     return __h;
   2102 }
   2103 
   2104 template <class _Key, class _Tp, class _Compare, class _Allocator>
   2105 template <class _A0>
   2106 typename multimap<_Key, _Tp, _Compare, _Allocator>::__node_holder
   2107 multimap<_Key, _Tp, _Compare, _Allocator>::__construct_node(_A0&& __a0)
   2108 {
   2109     __node_allocator& __na = __tree_.__node_alloc();
   2110     __node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na));
   2111     __node_traits::construct(__na, _VSTD::addressof(__h->__value_), _VSTD::forward<_A0>(__a0));
   2112     __h.get_deleter().__first_constructed = true;
   2113     __h.get_deleter().__second_constructed = true;
   2114     return __h;
   2115 }
   2116 
   2117 #ifndef _LIBCPP_HAS_NO_VARIADICS
   2118 
   2119 template <class _Key, class _Tp, class _Compare, class _Allocator>
   2120 template <class _A0, class _A1, class ..._Args>
   2121 typename multimap<_Key, _Tp, _Compare, _Allocator>::__node_holder
   2122 multimap<_Key, _Tp, _Compare, _Allocator>::__construct_node(_A0&& __a0, _A1&& __a1, _Args&& ...__args)
   2123 {
   2124     __node_allocator& __na = __tree_.__node_alloc();
   2125     __node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na));
   2126     __node_traits::construct(__na, _VSTD::addressof(__h->__value_),
   2127                              _VSTD::forward<_A0>(__a0), _VSTD::forward<_A1>(__a1),
   2128                              _VSTD::forward<_Args>(__args)...);
   2129     __h.get_deleter().__first_constructed = true;
   2130     __h.get_deleter().__second_constructed = true;
   2131     return __h;
   2132 }
   2133 
   2134 #endif  // _LIBCPP_HAS_NO_VARIADICS
   2135 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
   2136 
   2137 #if !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS)
   2138 
   2139 template <class _Key, class _Tp, class _Compare, class _Allocator>
   2140 template <class ..._Args>
   2141 typename multimap<_Key, _Tp, _Compare, _Allocator>::iterator
   2142 multimap<_Key, _Tp, _Compare, _Allocator>::emplace(_Args&& ...__args)
   2143 {
   2144     __node_holder __h = __construct_node(_VSTD::forward<_Args>(__args)...);
   2145     iterator __r = __tree_.__node_insert_multi(__h.get());
   2146     __h.release();
   2147     return __r;
   2148 }
   2149 
   2150 template <class _Key, class _Tp, class _Compare, class _Allocator>
   2151 template <class ..._Args>
   2152 typename multimap<_Key, _Tp, _Compare, _Allocator>::iterator
   2153 multimap<_Key, _Tp, _Compare, _Allocator>::emplace_hint(const_iterator __p,
   2154                                                         _Args&& ...__args)
   2155 {
   2156     __node_holder __h = __construct_node(_VSTD::forward<_Args>(__args)...);
   2157     iterator __r = __tree_.__node_insert_multi(__p.__i_, __h.get());
   2158     __h.release();
   2159     return __r;
   2160 }
   2161 
   2162 #endif  // !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS)
   2163 
   2164 template <class _Key, class _Tp, class _Compare, class _Allocator>
   2165 inline _LIBCPP_INLINE_VISIBILITY
   2166 bool
   2167 operator==(const multimap<_Key, _Tp, _Compare, _Allocator>& __x,
   2168            const multimap<_Key, _Tp, _Compare, _Allocator>& __y)
   2169 {
   2170     return __x.size() == __y.size() && _VSTD::equal(__x.begin(), __x.end(), __y.begin());
   2171 }
   2172 
   2173 template <class _Key, class _Tp, class _Compare, class _Allocator>
   2174 inline _LIBCPP_INLINE_VISIBILITY
   2175 bool
   2176 operator< (const multimap<_Key, _Tp, _Compare, _Allocator>& __x,
   2177            const multimap<_Key, _Tp, _Compare, _Allocator>& __y)
   2178 {
   2179     return _VSTD::lexicographical_compare(__x.begin(), __x.end(), __y.begin(), __y.end());
   2180 }
   2181 
   2182 template <class _Key, class _Tp, class _Compare, class _Allocator>
   2183 inline _LIBCPP_INLINE_VISIBILITY
   2184 bool
   2185 operator!=(const multimap<_Key, _Tp, _Compare, _Allocator>& __x,
   2186            const multimap<_Key, _Tp, _Compare, _Allocator>& __y)
   2187 {
   2188     return !(__x == __y);
   2189 }
   2190 
   2191 template <class _Key, class _Tp, class _Compare, class _Allocator>
   2192 inline _LIBCPP_INLINE_VISIBILITY
   2193 bool
   2194 operator> (const multimap<_Key, _Tp, _Compare, _Allocator>& __x,
   2195            const multimap<_Key, _Tp, _Compare, _Allocator>& __y)
   2196 {
   2197     return __y < __x;
   2198 }
   2199 
   2200 template <class _Key, class _Tp, class _Compare, class _Allocator>
   2201 inline _LIBCPP_INLINE_VISIBILITY
   2202 bool
   2203 operator>=(const multimap<_Key, _Tp, _Compare, _Allocator>& __x,
   2204            const multimap<_Key, _Tp, _Compare, _Allocator>& __y)
   2205 {
   2206     return !(__x < __y);
   2207 }
   2208 
   2209 template <class _Key, class _Tp, class _Compare, class _Allocator>
   2210 inline _LIBCPP_INLINE_VISIBILITY
   2211 bool
   2212 operator<=(const multimap<_Key, _Tp, _Compare, _Allocator>& __x,
   2213            const multimap<_Key, _Tp, _Compare, _Allocator>& __y)
   2214 {
   2215     return !(__y < __x);
   2216 }
   2217 
   2218 template <class _Key, class _Tp, class _Compare, class _Allocator>
   2219 inline _LIBCPP_INLINE_VISIBILITY
   2220 void
   2221 swap(multimap<_Key, _Tp, _Compare, _Allocator>& __x,
   2222      multimap<_Key, _Tp, _Compare, _Allocator>& __y)
   2223     _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
   2224 {
   2225     __x.swap(__y);
   2226 }
   2227 
   2228 _LIBCPP_END_NAMESPACE_STD
   2229 
   2230 #endif  // _LIBCPP_MAP
   2231