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     pair<iterator, bool> insert(      value_type&& v);                                // C++17
    130     template <class P>
    131         pair<iterator, bool> insert(P&& p);
    132     iterator insert(const_iterator position, const value_type& v);
    133     iterator insert(const_iterator position,       value_type&& v);                   // C++17
    134     template <class P>
    135         iterator insert(const_iterator position, P&& p);
    136     template <class InputIterator>
    137         void insert(InputIterator first, InputIterator last);
    138     void insert(initializer_list<value_type> il);
    139 
    140     template <class... Args>
    141         pair<iterator, bool> try_emplace(const key_type& k, Args&&... args);          // C++17
    142     template <class... Args>
    143         pair<iterator, bool> try_emplace(key_type&& k, Args&&... args);               // C++17
    144     template <class... Args>
    145         iterator try_emplace(const_iterator hint, const key_type& k, Args&&... args); // C++17
    146     template <class... Args>
    147         iterator try_emplace(const_iterator hint, key_type&& k, Args&&... args);      // C++17
    148     template <class M>
    149         pair<iterator, bool> insert_or_assign(const key_type& k, M&& obj);            // C++17
    150     template <class M>
    151         pair<iterator, bool> insert_or_assign(key_type&& k, M&& obj);                 // C++17
    152     template <class M>
    153         iterator insert_or_assign(const_iterator hint, const key_type& k, M&& obj);   // C++17
    154     template <class M>
    155         iterator insert_or_assign(const_iterator hint, key_type&& k, M&& obj);        // C++17
    156 
    157     iterator  erase(const_iterator position);
    158     iterator  erase(iterator position); // C++14
    159     size_type erase(const key_type& k);
    160     iterator  erase(const_iterator first, const_iterator last);
    161     void clear() noexcept;
    162 
    163     void swap(map& m)
    164         noexcept(allocator_traits<allocator_type>::is_always_equal::value &&
    165             is_nothrow_swappable<key_compare>::value); // C++17
    166 
    167     // observers:
    168     allocator_type get_allocator() const noexcept;
    169     key_compare    key_comp()      const;
    170     value_compare  value_comp()    const;
    171 
    172     // map operations:
    173           iterator find(const key_type& k);
    174     const_iterator find(const key_type& k) const;
    175     template<typename K>
    176         iterator find(const K& x);              // C++14
    177     template<typename K>
    178         const_iterator find(const K& x) const;  // C++14
    179     template<typename K>
    180       size_type count(const K& x) const;        // C++14
    181 
    182     size_type      count(const key_type& k) const;
    183           iterator lower_bound(const key_type& k);
    184     const_iterator lower_bound(const key_type& k) const;
    185     template<typename K>
    186         iterator lower_bound(const K& x);              // C++14
    187     template<typename K>
    188         const_iterator lower_bound(const K& x) const;  // C++14
    189 
    190           iterator upper_bound(const key_type& k);
    191     const_iterator upper_bound(const key_type& k) const;
    192     template<typename K>
    193         iterator upper_bound(const K& x);              // C++14
    194     template<typename K>
    195         const_iterator upper_bound(const K& x) const;  // C++14
    196 
    197     pair<iterator,iterator>             equal_range(const key_type& k);
    198     pair<const_iterator,const_iterator> equal_range(const key_type& k) const;
    199     template<typename K>
    200         pair<iterator,iterator>             equal_range(const K& x);        // C++14
    201     template<typename K>
    202         pair<const_iterator,const_iterator> equal_range(const K& x) const;  // C++14
    203 };
    204 
    205 template <class Key, class T, class Compare, class Allocator>
    206 bool
    207 operator==(const map<Key, T, Compare, Allocator>& x,
    208            const map<Key, T, Compare, Allocator>& y);
    209 
    210 template <class Key, class T, class Compare, class Allocator>
    211 bool
    212 operator< (const map<Key, T, Compare, Allocator>& x,
    213            const map<Key, T, Compare, Allocator>& y);
    214 
    215 template <class Key, class T, class Compare, class Allocator>
    216 bool
    217 operator!=(const map<Key, T, Compare, Allocator>& x,
    218            const map<Key, T, Compare, Allocator>& y);
    219 
    220 template <class Key, class T, class Compare, class Allocator>
    221 bool
    222 operator> (const map<Key, T, Compare, Allocator>& x,
    223            const map<Key, T, Compare, Allocator>& y);
    224 
    225 template <class Key, class T, class Compare, class Allocator>
    226 bool
    227 operator>=(const map<Key, T, Compare, Allocator>& x,
    228            const map<Key, T, Compare, Allocator>& y);
    229 
    230 template <class Key, class T, class Compare, class Allocator>
    231 bool
    232 operator<=(const map<Key, T, Compare, Allocator>& x,
    233            const map<Key, T, Compare, Allocator>& y);
    234 
    235 // specialized algorithms:
    236 template <class Key, class T, class Compare, class Allocator>
    237 void
    238 swap(map<Key, T, Compare, Allocator>& x, map<Key, T, Compare, Allocator>& y)
    239     noexcept(noexcept(x.swap(y)));
    240 
    241 template <class Key, class T, class Compare = less<Key>,
    242           class Allocator = allocator<pair<const Key, T>>>
    243 class multimap
    244 {
    245 public:
    246     // types:
    247     typedef Key                                      key_type;
    248     typedef T                                        mapped_type;
    249     typedef pair<const key_type,mapped_type>         value_type;
    250     typedef Compare                                  key_compare;
    251     typedef Allocator                                allocator_type;
    252     typedef typename allocator_type::reference       reference;
    253     typedef typename allocator_type::const_reference const_reference;
    254     typedef typename allocator_type::size_type       size_type;
    255     typedef typename allocator_type::difference_type difference_type;
    256     typedef typename allocator_type::pointer         pointer;
    257     typedef typename allocator_type::const_pointer   const_pointer;
    258 
    259     typedef implementation-defined                   iterator;
    260     typedef implementation-defined                   const_iterator;
    261     typedef std::reverse_iterator<iterator>          reverse_iterator;
    262     typedef std::reverse_iterator<const_iterator>    const_reverse_iterator;
    263 
    264     class value_compare
    265         : public binary_function<value_type,value_type,bool>
    266     {
    267         friend class multimap;
    268     protected:
    269         key_compare comp;
    270         value_compare(key_compare c);
    271     public:
    272         bool operator()(const value_type& x, const value_type& y) const;
    273     };
    274 
    275     // construct/copy/destroy:
    276     multimap()
    277         noexcept(
    278             is_nothrow_default_constructible<allocator_type>::value &&
    279             is_nothrow_default_constructible<key_compare>::value &&
    280             is_nothrow_copy_constructible<key_compare>::value);
    281     explicit multimap(const key_compare& comp);
    282     multimap(const key_compare& comp, const allocator_type& a);
    283     template <class InputIterator>
    284         multimap(InputIterator first, InputIterator last, const key_compare& comp);
    285     template <class InputIterator>
    286         multimap(InputIterator first, InputIterator last, const key_compare& comp,
    287                  const allocator_type& a);
    288     multimap(const multimap& m);
    289     multimap(multimap&& m)
    290         noexcept(
    291             is_nothrow_move_constructible<allocator_type>::value &&
    292             is_nothrow_move_constructible<key_compare>::value);
    293     explicit multimap(const allocator_type& a);
    294     multimap(const multimap& m, const allocator_type& a);
    295     multimap(multimap&& m, const allocator_type& a);
    296     multimap(initializer_list<value_type> il, const key_compare& comp = key_compare());
    297     multimap(initializer_list<value_type> il, const key_compare& comp,
    298              const allocator_type& a);
    299     template <class InputIterator>
    300         multimap(InputIterator first, InputIterator last, const allocator_type& a)
    301             : multimap(first, last, Compare(), a) {} // C++14
    302     multimap(initializer_list<value_type> il, const allocator_type& a)
    303         : multimap(il, Compare(), a) {} // C++14
    304     ~multimap();
    305 
    306     multimap& operator=(const multimap& m);
    307     multimap& operator=(multimap&& m)
    308         noexcept(
    309             allocator_type::propagate_on_container_move_assignment::value &&
    310             is_nothrow_move_assignable<allocator_type>::value &&
    311             is_nothrow_move_assignable<key_compare>::value);
    312     multimap& operator=(initializer_list<value_type> il);
    313 
    314     // iterators:
    315           iterator begin() noexcept;
    316     const_iterator begin() const noexcept;
    317           iterator end() noexcept;
    318     const_iterator end()   const noexcept;
    319 
    320           reverse_iterator rbegin() noexcept;
    321     const_reverse_iterator rbegin() const noexcept;
    322           reverse_iterator rend() noexcept;
    323     const_reverse_iterator rend()   const noexcept;
    324 
    325     const_iterator         cbegin()  const noexcept;
    326     const_iterator         cend()    const noexcept;
    327     const_reverse_iterator crbegin() const noexcept;
    328     const_reverse_iterator crend()   const noexcept;
    329 
    330     // capacity:
    331     bool      empty()    const noexcept;
    332     size_type size()     const noexcept;
    333     size_type max_size() const noexcept;
    334 
    335     // modifiers:
    336     template <class... Args>
    337         iterator emplace(Args&&... args);
    338     template <class... Args>
    339         iterator emplace_hint(const_iterator position, Args&&... args);
    340     iterator insert(const value_type& v);
    341     iterator insert(      value_type&& v);                                            // C++17
    342     template <class P>
    343         iterator insert(P&& p);
    344     iterator insert(const_iterator position, const value_type& v);
    345     iterator insert(const_iterator position,       value_type&& v);                   // C++17
    346     template <class P>
    347         iterator insert(const_iterator position, P&& p);
    348     template <class InputIterator>
    349         void insert(InputIterator first, InputIterator last);
    350     void insert(initializer_list<value_type> il);
    351 
    352     iterator  erase(const_iterator position);
    353     iterator  erase(iterator position); // C++14
    354     size_type erase(const key_type& k);
    355     iterator  erase(const_iterator first, const_iterator last);
    356     void clear() noexcept;
    357 
    358     void swap(multimap& m)
    359         noexcept(allocator_traits<allocator_type>::is_always_equal::value &&
    360             is_nothrow_swappable<key_compare>::value); // C++17
    361 
    362     // observers:
    363     allocator_type get_allocator() const noexcept;
    364     key_compare    key_comp()      const;
    365     value_compare  value_comp()    const;
    366 
    367     // map operations:
    368           iterator find(const key_type& k);
    369     const_iterator find(const key_type& k) const;
    370     template<typename K>
    371         iterator find(const K& x);              // C++14
    372     template<typename K>
    373         const_iterator find(const K& x) const;  // C++14
    374     template<typename K>
    375       size_type count(const K& x) const;        // C++14
    376 
    377     size_type      count(const key_type& k) const;
    378           iterator lower_bound(const key_type& k);
    379     const_iterator lower_bound(const key_type& k) const;
    380     template<typename K>
    381         iterator lower_bound(const K& x);              // C++14
    382     template<typename K>
    383         const_iterator lower_bound(const K& x) const;  // C++14
    384 
    385           iterator upper_bound(const key_type& k);
    386     const_iterator upper_bound(const key_type& k) const;
    387     template<typename K>
    388         iterator upper_bound(const K& x);              // C++14
    389     template<typename K>
    390         const_iterator upper_bound(const K& x) const;  // C++14
    391 
    392     pair<iterator,iterator>             equal_range(const key_type& k);
    393     pair<const_iterator,const_iterator> equal_range(const key_type& k) const;
    394     template<typename K>
    395         pair<iterator,iterator>             equal_range(const K& x);        // C++14
    396     template<typename K>
    397         pair<const_iterator,const_iterator> equal_range(const K& x) const;  // C++14
    398 };
    399 
    400 template <class Key, class T, class Compare, class Allocator>
    401 bool
    402 operator==(const multimap<Key, T, Compare, Allocator>& x,
    403            const multimap<Key, T, Compare, Allocator>& y);
    404 
    405 template <class Key, class T, class Compare, class Allocator>
    406 bool
    407 operator< (const multimap<Key, T, Compare, Allocator>& x,
    408            const multimap<Key, T, Compare, Allocator>& y);
    409 
    410 template <class Key, class T, class Compare, class Allocator>
    411 bool
    412 operator!=(const multimap<Key, T, Compare, Allocator>& x,
    413            const multimap<Key, T, Compare, Allocator>& y);
    414 
    415 template <class Key, class T, class Compare, class Allocator>
    416 bool
    417 operator> (const multimap<Key, T, Compare, Allocator>& x,
    418            const multimap<Key, T, Compare, Allocator>& y);
    419 
    420 template <class Key, class T, class Compare, class Allocator>
    421 bool
    422 operator>=(const multimap<Key, T, Compare, Allocator>& x,
    423            const multimap<Key, T, Compare, Allocator>& y);
    424 
    425 template <class Key, class T, class Compare, class Allocator>
    426 bool
    427 operator<=(const multimap<Key, T, Compare, Allocator>& x,
    428            const multimap<Key, T, Compare, Allocator>& y);
    429 
    430 // specialized algorithms:
    431 template <class Key, class T, class Compare, class Allocator>
    432 void
    433 swap(multimap<Key, T, Compare, Allocator>& x,
    434      multimap<Key, T, Compare, Allocator>& y)
    435     noexcept(noexcept(x.swap(y)));
    436 
    437 }  // std
    438 
    439 */
    440 
    441 #include <__config>
    442 #include <__tree>
    443 #include <iterator>
    444 #include <memory>
    445 #include <utility>
    446 #include <functional>
    447 #include <initializer_list>
    448 #include <type_traits>
    449 
    450 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
    451 #pragma GCC system_header
    452 #endif
    453 
    454 _LIBCPP_BEGIN_NAMESPACE_STD
    455 
    456 template <class _Key, class _CP, class _Compare, bool _IsSmall>
    457 class __map_value_compare
    458     : private _Compare
    459 {
    460 public:
    461     _LIBCPP_INLINE_VISIBILITY
    462     __map_value_compare()
    463         _NOEXCEPT_(is_nothrow_default_constructible<_Compare>::value)
    464         : _Compare() {}
    465     _LIBCPP_INLINE_VISIBILITY
    466     __map_value_compare(_Compare c)
    467         _NOEXCEPT_(is_nothrow_copy_constructible<_Compare>::value)
    468         : _Compare(c) {}
    469     _LIBCPP_INLINE_VISIBILITY
    470     const _Compare& key_comp() const _NOEXCEPT {return *this;}
    471     _LIBCPP_INLINE_VISIBILITY
    472     bool operator()(const _CP& __x, const _CP& __y) const
    473         {return static_cast<const _Compare&>(*this)(__x.__cc.first, __y.__cc.first);}
    474     _LIBCPP_INLINE_VISIBILITY
    475     bool operator()(const _CP& __x, const _Key& __y) const
    476         {return static_cast<const _Compare&>(*this)(__x.__cc.first, __y);}
    477     _LIBCPP_INLINE_VISIBILITY
    478     bool operator()(const _Key& __x, const _CP& __y) const
    479         {return static_cast<const _Compare&>(*this)(__x, __y.__cc.first);}
    480     void swap(__map_value_compare&__y)
    481         _NOEXCEPT_(__is_nothrow_swappable<_Compare>::value)
    482     {
    483       using _VSTD::swap;
    484       swap(static_cast<_Compare&>(*this), static_cast<_Compare&>(__y));
    485     }
    486 
    487 #if _LIBCPP_STD_VER > 11
    488     template <typename _K2>
    489     _LIBCPP_INLINE_VISIBILITY
    490     typename enable_if<__is_transparent<_Compare, _K2>::value, bool>::type
    491     operator () ( const _K2& __x, const _CP& __y ) const
    492         {return static_cast<const _Compare&>(*this) (__x, __y.__cc.first);}
    493 
    494     template <typename _K2>
    495     _LIBCPP_INLINE_VISIBILITY
    496     typename enable_if<__is_transparent<_Compare, _K2>::value, bool>::type
    497     operator () (const _CP& __x, const _K2& __y) const
    498         {return static_cast<const _Compare&>(*this) (__x.__cc.first, __y);}
    499 #endif
    500 };
    501 
    502 template <class _Key, class _CP, class _Compare>
    503 class __map_value_compare<_Key, _CP, _Compare, false>
    504 {
    505     _Compare comp;
    506 
    507 public:
    508     _LIBCPP_INLINE_VISIBILITY
    509     __map_value_compare()
    510         _NOEXCEPT_(is_nothrow_default_constructible<_Compare>::value)
    511         : comp() {}
    512     _LIBCPP_INLINE_VISIBILITY
    513     __map_value_compare(_Compare c)
    514         _NOEXCEPT_(is_nothrow_copy_constructible<_Compare>::value)
    515         : comp(c) {}
    516     _LIBCPP_INLINE_VISIBILITY
    517     const _Compare& key_comp() const _NOEXCEPT {return comp;}
    518 
    519     _LIBCPP_INLINE_VISIBILITY
    520     bool operator()(const _CP& __x, const _CP& __y) const
    521         {return comp(__x.__cc.first, __y.__cc.first);}
    522     _LIBCPP_INLINE_VISIBILITY
    523     bool operator()(const _CP& __x, const _Key& __y) const
    524         {return comp(__x.__cc.first, __y);}
    525     _LIBCPP_INLINE_VISIBILITY
    526     bool operator()(const _Key& __x, const _CP& __y) const
    527         {return comp(__x, __y.__cc.first);}
    528     void swap(__map_value_compare&__y)
    529         _NOEXCEPT_(__is_nothrow_swappable<_Compare>::value)
    530     {
    531         using _VSTD::swap;
    532         swap(comp, __y.comp);
    533     }
    534 
    535 #if _LIBCPP_STD_VER > 11
    536     template <typename _K2>
    537     _LIBCPP_INLINE_VISIBILITY
    538     typename enable_if<__is_transparent<_Compare, _K2>::value, bool>::type
    539     operator () ( const _K2& __x, const _CP& __y ) const
    540         {return comp (__x, __y.__cc.first);}
    541 
    542     template <typename _K2>
    543     _LIBCPP_INLINE_VISIBILITY
    544     typename enable_if<__is_transparent<_Compare, _K2>::value, bool>::type
    545     operator () (const _CP& __x, const _K2& __y) const
    546         {return comp (__x.__cc.first, __y);}
    547 #endif
    548 };
    549 
    550 template <class _Key, class _CP, class _Compare, bool __b>
    551 inline _LIBCPP_INLINE_VISIBILITY
    552 void
    553 swap(__map_value_compare<_Key, _CP, _Compare, __b>& __x,
    554      __map_value_compare<_Key, _CP, _Compare, __b>& __y)
    555     _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
    556 {
    557     __x.swap(__y);
    558 }
    559 
    560 template <class _Allocator>
    561 class __map_node_destructor
    562 {
    563     typedef _Allocator                          allocator_type;
    564     typedef allocator_traits<allocator_type>    __alloc_traits;
    565 
    566 public:
    567     typedef typename __alloc_traits::pointer    pointer;
    568 
    569 private:
    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_CXX03_LANG
    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_CXX03_LANG
    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 #ifndef _LIBCPP_CXX03_LANG
    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     _LIBCPP_INLINE_VISIBILITY
    628     __value_type& operator=(const __value_type& __v)
    629         {__nc = __v.__cc; return *this;}
    630 
    631     _LIBCPP_INLINE_VISIBILITY
    632     __value_type& operator=(__value_type&& __v)
    633         {__nc = _VSTD::move(__v.__nc); return *this;}
    634 
    635     template <class _ValueTp,
    636               class = typename enable_if<
    637                     __is_same_uncvref<_ValueTp, value_type>::value
    638                  >::type
    639              >
    640     _LIBCPP_INLINE_VISIBILITY
    641     __value_type& operator=(_ValueTp&& __v) {
    642         __nc = _VSTD::forward<_ValueTp>(__v); return *this;
    643     }
    644 
    645 private:
    646     __value_type() _LIBCPP_EQUAL_DELETE;
    647     ~__value_type() _LIBCPP_EQUAL_DELETE;
    648     __value_type(const __value_type& __v) _LIBCPP_EQUAL_DELETE;
    649     __value_type(__value_type&& __v) _LIBCPP_EQUAL_DELETE;
    650 };
    651 
    652 #else
    653 
    654 template <class _Key, class _Tp>
    655 struct __value_type
    656 {
    657     typedef _Key                                     key_type;
    658     typedef _Tp                                      mapped_type;
    659     typedef pair<const key_type, mapped_type>        value_type;
    660 
    661     value_type __cc;
    662 
    663 private:
    664    __value_type();
    665    __value_type(__value_type const&);
    666    __value_type& operator=(__value_type const&);
    667    ~__value_type();
    668 };
    669 
    670 #endif // _LIBCPP_CXX03_LANG
    671 
    672 template <class _Tp>
    673 struct __extract_key_value_types;
    674 
    675 template <class _Key, class _Tp>
    676 struct __extract_key_value_types<__value_type<_Key, _Tp> >
    677 {
    678   typedef _Key const __key_type;
    679   typedef _Tp        __mapped_type;
    680 };
    681 
    682 template <class _TreeIterator>
    683 class _LIBCPP_TEMPLATE_VIS __map_iterator
    684 {
    685     typedef typename _TreeIterator::_NodeTypes                   _NodeTypes;
    686     typedef typename _TreeIterator::__pointer_traits             __pointer_traits;
    687 
    688     _TreeIterator __i_;
    689 
    690 public:
    691     typedef bidirectional_iterator_tag                           iterator_category;
    692     typedef typename _NodeTypes::__map_value_type                value_type;
    693     typedef typename _TreeIterator::difference_type              difference_type;
    694     typedef value_type&                                          reference;
    695     typedef typename _NodeTypes::__map_value_type_pointer        pointer;
    696 
    697     _LIBCPP_INLINE_VISIBILITY
    698     __map_iterator() _NOEXCEPT {}
    699 
    700     _LIBCPP_INLINE_VISIBILITY
    701     __map_iterator(_TreeIterator __i) _NOEXCEPT : __i_(__i) {}
    702 
    703     _LIBCPP_INLINE_VISIBILITY
    704     reference operator*() const {return __i_->__cc;}
    705     _LIBCPP_INLINE_VISIBILITY
    706     pointer operator->() const {return pointer_traits<pointer>::pointer_to(__i_->__cc);}
    707 
    708     _LIBCPP_INLINE_VISIBILITY
    709     __map_iterator& operator++() {++__i_; return *this;}
    710     _LIBCPP_INLINE_VISIBILITY
    711     __map_iterator operator++(int)
    712     {
    713         __map_iterator __t(*this);
    714         ++(*this);
    715         return __t;
    716     }
    717 
    718     _LIBCPP_INLINE_VISIBILITY
    719     __map_iterator& operator--() {--__i_; return *this;}
    720     _LIBCPP_INLINE_VISIBILITY
    721     __map_iterator operator--(int)
    722     {
    723         __map_iterator __t(*this);
    724         --(*this);
    725         return __t;
    726     }
    727 
    728     friend _LIBCPP_INLINE_VISIBILITY
    729     bool operator==(const __map_iterator& __x, const __map_iterator& __y)
    730         {return __x.__i_ == __y.__i_;}
    731     friend
    732     _LIBCPP_INLINE_VISIBILITY
    733     bool operator!=(const __map_iterator& __x, const __map_iterator& __y)
    734         {return __x.__i_ != __y.__i_;}
    735 
    736     template <class, class, class, class> friend class _LIBCPP_TEMPLATE_VIS map;
    737     template <class, class, class, class> friend class _LIBCPP_TEMPLATE_VIS multimap;
    738     template <class> friend class _LIBCPP_TEMPLATE_VIS __map_const_iterator;
    739 };
    740 
    741 template <class _TreeIterator>
    742 class _LIBCPP_TEMPLATE_VIS __map_const_iterator
    743 {
    744     typedef typename _TreeIterator::_NodeTypes                   _NodeTypes;
    745     typedef typename _TreeIterator::__pointer_traits             __pointer_traits;
    746 
    747     _TreeIterator __i_;
    748 
    749 public:
    750     typedef bidirectional_iterator_tag                           iterator_category;
    751     typedef typename _NodeTypes::__map_value_type                value_type;
    752     typedef typename _TreeIterator::difference_type              difference_type;
    753     typedef const value_type&                                    reference;
    754     typedef typename _NodeTypes::__const_map_value_type_pointer  pointer;
    755 
    756     _LIBCPP_INLINE_VISIBILITY
    757     __map_const_iterator() _NOEXCEPT {}
    758 
    759     _LIBCPP_INLINE_VISIBILITY
    760     __map_const_iterator(_TreeIterator __i) _NOEXCEPT : __i_(__i) {}
    761     _LIBCPP_INLINE_VISIBILITY
    762     __map_const_iterator(__map_iterator<
    763         typename _TreeIterator::__non_const_iterator> __i) _NOEXCEPT
    764         : __i_(__i.__i_) {}
    765 
    766     _LIBCPP_INLINE_VISIBILITY
    767     reference operator*() const {return __i_->__cc;}
    768     _LIBCPP_INLINE_VISIBILITY
    769     pointer operator->() const {return pointer_traits<pointer>::pointer_to(__i_->__cc);}
    770 
    771     _LIBCPP_INLINE_VISIBILITY
    772     __map_const_iterator& operator++() {++__i_; return *this;}
    773     _LIBCPP_INLINE_VISIBILITY
    774     __map_const_iterator operator++(int)
    775     {
    776         __map_const_iterator __t(*this);
    777         ++(*this);
    778         return __t;
    779     }
    780 
    781     _LIBCPP_INLINE_VISIBILITY
    782     __map_const_iterator& operator--() {--__i_; return *this;}
    783     _LIBCPP_INLINE_VISIBILITY
    784     __map_const_iterator operator--(int)
    785     {
    786         __map_const_iterator __t(*this);
    787         --(*this);
    788         return __t;
    789     }
    790 
    791     friend _LIBCPP_INLINE_VISIBILITY
    792     bool operator==(const __map_const_iterator& __x, const __map_const_iterator& __y)
    793         {return __x.__i_ == __y.__i_;}
    794     friend _LIBCPP_INLINE_VISIBILITY
    795     bool operator!=(const __map_const_iterator& __x, const __map_const_iterator& __y)
    796         {return __x.__i_ != __y.__i_;}
    797 
    798     template <class, class, class, class> friend class _LIBCPP_TEMPLATE_VIS map;
    799     template <class, class, class, class> friend class _LIBCPP_TEMPLATE_VIS multimap;
    800     template <class, class, class> friend class _LIBCPP_TEMPLATE_VIS __tree_const_iterator;
    801 };
    802 
    803 template <class _Key, class _Tp, class _Compare = less<_Key>,
    804           class _Allocator = allocator<pair<const _Key, _Tp> > >
    805 class _LIBCPP_TEMPLATE_VIS map
    806 {
    807 public:
    808     // types:
    809     typedef _Key                                     key_type;
    810     typedef _Tp                                      mapped_type;
    811     typedef pair<const key_type, mapped_type>        value_type;
    812     typedef pair<key_type, mapped_type>              __nc_value_type;
    813     typedef _Compare                                 key_compare;
    814     typedef _Allocator                               allocator_type;
    815     typedef value_type&                              reference;
    816     typedef const value_type&                        const_reference;
    817 
    818     static_assert((is_same<typename allocator_type::value_type, value_type>::value),
    819                   "Allocator::value_type must be same type as value_type");
    820 
    821     class _LIBCPP_TEMPLATE_VIS value_compare
    822         : public binary_function<value_type, value_type, bool>
    823     {
    824         friend class map;
    825     protected:
    826         key_compare comp;
    827 
    828         _LIBCPP_INLINE_VISIBILITY value_compare(key_compare c) : comp(c) {}
    829     public:
    830         _LIBCPP_INLINE_VISIBILITY
    831         bool operator()(const value_type& __x, const value_type& __y) const
    832             {return comp(__x.first, __y.first);}
    833     };
    834 
    835 private:
    836 
    837     typedef _VSTD::__value_type<key_type, mapped_type>             __value_type;
    838     typedef __map_value_compare<key_type, __value_type, key_compare> __vc;
    839     typedef typename __rebind_alloc_helper<allocator_traits<allocator_type>,
    840                                                  __value_type>::type __allocator_type;
    841     typedef __tree<__value_type, __vc, __allocator_type>   __base;
    842     typedef typename __base::__node_traits                 __node_traits;
    843     typedef allocator_traits<allocator_type>               __alloc_traits;
    844 
    845     __base __tree_;
    846 
    847 public:
    848     typedef typename __alloc_traits::pointer               pointer;
    849     typedef typename __alloc_traits::const_pointer         const_pointer;
    850     typedef typename __alloc_traits::size_type             size_type;
    851     typedef typename __alloc_traits::difference_type       difference_type;
    852     typedef __map_iterator<typename __base::iterator>             iterator;
    853     typedef __map_const_iterator<typename __base::const_iterator> const_iterator;
    854     typedef _VSTD::reverse_iterator<iterator>               reverse_iterator;
    855     typedef _VSTD::reverse_iterator<const_iterator>         const_reverse_iterator;
    856 
    857     _LIBCPP_INLINE_VISIBILITY
    858     map()
    859         _NOEXCEPT_(
    860             is_nothrow_default_constructible<allocator_type>::value &&
    861             is_nothrow_default_constructible<key_compare>::value &&
    862             is_nothrow_copy_constructible<key_compare>::value)
    863         : __tree_(__vc(key_compare())) {}
    864 
    865     _LIBCPP_INLINE_VISIBILITY
    866     explicit map(const key_compare& __comp)
    867         _NOEXCEPT_(
    868             is_nothrow_default_constructible<allocator_type>::value &&
    869             is_nothrow_copy_constructible<key_compare>::value)
    870         : __tree_(__vc(__comp)) {}
    871 
    872     _LIBCPP_INLINE_VISIBILITY
    873     explicit map(const key_compare& __comp, const allocator_type& __a)
    874         : __tree_(__vc(__comp), typename __base::allocator_type(__a)) {}
    875 
    876     template <class _InputIterator>
    877     _LIBCPP_INLINE_VISIBILITY
    878         map(_InputIterator __f, _InputIterator __l,
    879             const key_compare& __comp = key_compare())
    880         : __tree_(__vc(__comp))
    881         {
    882             insert(__f, __l);
    883         }
    884 
    885     template <class _InputIterator>
    886     _LIBCPP_INLINE_VISIBILITY
    887         map(_InputIterator __f, _InputIterator __l,
    888             const key_compare& __comp, const allocator_type& __a)
    889         : __tree_(__vc(__comp), typename __base::allocator_type(__a))
    890         {
    891             insert(__f, __l);
    892         }
    893 
    894 #if _LIBCPP_STD_VER > 11
    895     template <class _InputIterator>
    896     _LIBCPP_INLINE_VISIBILITY
    897     map(_InputIterator __f, _InputIterator __l, const allocator_type& __a)
    898         : map(__f, __l, key_compare(), __a) {}
    899 #endif
    900 
    901     _LIBCPP_INLINE_VISIBILITY
    902     map(const map& __m)
    903         : __tree_(__m.__tree_)
    904         {
    905             insert(__m.begin(), __m.end());
    906         }
    907 
    908     _LIBCPP_INLINE_VISIBILITY
    909     map& operator=(const map& __m)
    910         {
    911 #ifndef _LIBCPP_CXX03_LANG
    912             __tree_ = __m.__tree_;
    913 #else
    914             if (this != &__m) {
    915                 __tree_.clear();
    916                 __tree_.value_comp() = __m.__tree_.value_comp();
    917                 __tree_.__copy_assign_alloc(__m.__tree_);
    918                 insert(__m.begin(), __m.end());
    919             }
    920 #endif
    921             return *this;
    922         }
    923 
    924 #ifndef _LIBCPP_CXX03_LANG
    925 
    926     _LIBCPP_INLINE_VISIBILITY
    927     map(map&& __m)
    928         _NOEXCEPT_(is_nothrow_move_constructible<__base>::value)
    929         : __tree_(_VSTD::move(__m.__tree_))
    930         {
    931         }
    932 
    933     map(map&& __m, const allocator_type& __a);
    934 
    935     _LIBCPP_INLINE_VISIBILITY
    936     map& operator=(map&& __m)
    937         _NOEXCEPT_(is_nothrow_move_assignable<__base>::value)
    938         {
    939             __tree_ = _VSTD::move(__m.__tree_);
    940             return *this;
    941         }
    942 
    943     _LIBCPP_INLINE_VISIBILITY
    944     map(initializer_list<value_type> __il, const key_compare& __comp = key_compare())
    945         : __tree_(__vc(__comp))
    946         {
    947             insert(__il.begin(), __il.end());
    948         }
    949 
    950     _LIBCPP_INLINE_VISIBILITY
    951     map(initializer_list<value_type> __il, const key_compare& __comp, const allocator_type& __a)
    952         : __tree_(__vc(__comp), typename __base::allocator_type(__a))
    953         {
    954             insert(__il.begin(), __il.end());
    955         }
    956 
    957 #if _LIBCPP_STD_VER > 11
    958     _LIBCPP_INLINE_VISIBILITY
    959     map(initializer_list<value_type> __il, const allocator_type& __a)
    960         : map(__il, key_compare(), __a) {}
    961 #endif
    962 
    963     _LIBCPP_INLINE_VISIBILITY
    964     map& operator=(initializer_list<value_type> __il)
    965         {
    966             __tree_.__assign_unique(__il.begin(), __il.end());
    967             return *this;
    968         }
    969 
    970 #endif  // _LIBCPP_CXX03_LANG
    971 
    972     _LIBCPP_INLINE_VISIBILITY
    973     explicit map(const allocator_type& __a)
    974         : __tree_(typename __base::allocator_type(__a))
    975         {
    976         }
    977 
    978     _LIBCPP_INLINE_VISIBILITY
    979     map(const map& __m, const allocator_type& __a)
    980         : __tree_(__m.__tree_.value_comp(), typename __base::allocator_type(__a))
    981         {
    982             insert(__m.begin(), __m.end());
    983         }
    984 
    985     _LIBCPP_INLINE_VISIBILITY
    986           iterator begin() _NOEXCEPT {return __tree_.begin();}
    987     _LIBCPP_INLINE_VISIBILITY
    988     const_iterator begin() const _NOEXCEPT {return __tree_.begin();}
    989     _LIBCPP_INLINE_VISIBILITY
    990           iterator end() _NOEXCEPT {return __tree_.end();}
    991     _LIBCPP_INLINE_VISIBILITY
    992     const_iterator end() const _NOEXCEPT {return __tree_.end();}
    993 
    994     _LIBCPP_INLINE_VISIBILITY
    995           reverse_iterator rbegin() _NOEXCEPT {return reverse_iterator(end());}
    996     _LIBCPP_INLINE_VISIBILITY
    997     const_reverse_iterator rbegin() const _NOEXCEPT
    998         {return const_reverse_iterator(end());}
    999     _LIBCPP_INLINE_VISIBILITY
   1000           reverse_iterator rend() _NOEXCEPT
   1001             {return       reverse_iterator(begin());}
   1002     _LIBCPP_INLINE_VISIBILITY
   1003     const_reverse_iterator rend() const _NOEXCEPT
   1004         {return const_reverse_iterator(begin());}
   1005 
   1006     _LIBCPP_INLINE_VISIBILITY
   1007     const_iterator cbegin() const _NOEXCEPT {return begin();}
   1008     _LIBCPP_INLINE_VISIBILITY
   1009     const_iterator cend() const _NOEXCEPT {return end();}
   1010     _LIBCPP_INLINE_VISIBILITY
   1011     const_reverse_iterator crbegin() const _NOEXCEPT {return rbegin();}
   1012     _LIBCPP_INLINE_VISIBILITY
   1013     const_reverse_iterator crend() const _NOEXCEPT {return rend();}
   1014 
   1015     _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY
   1016     bool      empty() const _NOEXCEPT {return __tree_.size() == 0;}
   1017     _LIBCPP_INLINE_VISIBILITY
   1018     size_type size() const _NOEXCEPT {return __tree_.size();}
   1019     _LIBCPP_INLINE_VISIBILITY
   1020     size_type max_size() const _NOEXCEPT {return __tree_.max_size();}
   1021 
   1022     mapped_type& operator[](const key_type& __k);
   1023 #ifndef _LIBCPP_CXX03_LANG
   1024     mapped_type& operator[](key_type&& __k);
   1025 #endif
   1026 
   1027           mapped_type& at(const key_type& __k);
   1028     const mapped_type& at(const key_type& __k) const;
   1029 
   1030     _LIBCPP_INLINE_VISIBILITY
   1031     allocator_type get_allocator() const _NOEXCEPT {return allocator_type(__tree_.__alloc());}
   1032     _LIBCPP_INLINE_VISIBILITY
   1033     key_compare    key_comp()      const {return __tree_.value_comp().key_comp();}
   1034     _LIBCPP_INLINE_VISIBILITY
   1035     value_compare  value_comp()    const {return value_compare(__tree_.value_comp().key_comp());}
   1036 
   1037 #ifndef _LIBCPP_CXX03_LANG
   1038     template <class ..._Args>
   1039     _LIBCPP_INLINE_VISIBILITY
   1040     pair<iterator, bool> emplace(_Args&& ...__args) {
   1041         return __tree_.__emplace_unique(_VSTD::forward<_Args>(__args)...);
   1042     }
   1043 
   1044     template <class ..._Args>
   1045     _LIBCPP_INLINE_VISIBILITY
   1046     iterator emplace_hint(const_iterator __p, _Args&& ...__args) {
   1047         return __tree_.__emplace_hint_unique(__p.__i_, _VSTD::forward<_Args>(__args)...);
   1048     }
   1049 
   1050     template <class _Pp,
   1051               class = typename enable_if<is_constructible<value_type, _Pp>::value>::type>
   1052         _LIBCPP_INLINE_VISIBILITY
   1053         pair<iterator, bool> insert(_Pp&& __p)
   1054             {return __tree_.__insert_unique(_VSTD::forward<_Pp>(__p));}
   1055 
   1056     template <class _Pp,
   1057               class = typename enable_if<is_constructible<value_type, _Pp>::value>::type>
   1058         _LIBCPP_INLINE_VISIBILITY
   1059         iterator insert(const_iterator __pos, _Pp&& __p)
   1060             {return __tree_.__insert_unique(__pos.__i_, _VSTD::forward<_Pp>(__p));}
   1061 
   1062 #endif  // _LIBCPP_CXX03_LANG
   1063 
   1064     _LIBCPP_INLINE_VISIBILITY
   1065     pair<iterator, bool>
   1066         insert(const value_type& __v) {return __tree_.__insert_unique(__v);}
   1067 
   1068     _LIBCPP_INLINE_VISIBILITY
   1069     iterator
   1070         insert(const_iterator __p, const value_type& __v)
   1071             {return __tree_.__insert_unique(__p.__i_, __v);}
   1072 
   1073 #ifndef _LIBCPP_CXX03_LANG
   1074     _LIBCPP_INLINE_VISIBILITY
   1075     pair<iterator, bool>
   1076     insert(value_type&& __v) {return __tree_.__insert_unique(_VSTD::move(__v));}
   1077 
   1078     _LIBCPP_INLINE_VISIBILITY
   1079     iterator insert(const_iterator __p,  value_type&& __v)
   1080     {return __tree_.__insert_unique(__p.__i_, _VSTD::move(__v));}
   1081 
   1082     _LIBCPP_INLINE_VISIBILITY
   1083     void insert(initializer_list<value_type> __il)
   1084         {insert(__il.begin(), __il.end());}
   1085 #endif
   1086 
   1087     template <class _InputIterator>
   1088         _LIBCPP_INLINE_VISIBILITY
   1089         void insert(_InputIterator __f, _InputIterator __l)
   1090         {
   1091             for (const_iterator __e = cend(); __f != __l; ++__f)
   1092                 insert(__e.__i_, *__f);
   1093         }
   1094 
   1095 #if _LIBCPP_STD_VER > 14
   1096 
   1097     template <class... _Args>
   1098         _LIBCPP_INLINE_VISIBILITY
   1099         pair<iterator, bool> try_emplace(const key_type& __k, _Args&&... __args)
   1100     {
   1101         return __tree_.__emplace_unique_key_args(__k,
   1102             _VSTD::piecewise_construct,
   1103             _VSTD::forward_as_tuple(__k),
   1104             _VSTD::forward_as_tuple(_VSTD::forward<_Args>(__args)...));
   1105     }
   1106 
   1107     template <class... _Args>
   1108         _LIBCPP_INLINE_VISIBILITY
   1109         pair<iterator, bool> try_emplace(key_type&& __k, _Args&&... __args)
   1110     {
   1111         return __tree_.__emplace_unique_key_args(__k,
   1112             _VSTD::piecewise_construct,
   1113             _VSTD::forward_as_tuple(_VSTD::move(__k)),
   1114             _VSTD::forward_as_tuple(_VSTD::forward<_Args>(__args)...));
   1115     }
   1116 
   1117     template <class... _Args>
   1118         _LIBCPP_INLINE_VISIBILITY
   1119         iterator try_emplace(const_iterator __h, const key_type& __k, _Args&&... __args)
   1120     {
   1121         return __tree_.__emplace_hint_unique_key_args(__h.__i_, __k,
   1122             _VSTD::piecewise_construct,
   1123             _VSTD::forward_as_tuple(__k),
   1124             _VSTD::forward_as_tuple(_VSTD::forward<_Args>(__args)...));
   1125     }
   1126 
   1127     template <class... _Args>
   1128         _LIBCPP_INLINE_VISIBILITY
   1129         iterator try_emplace(const_iterator __h, key_type&& __k, _Args&&... __args)
   1130     {
   1131         return __tree_.__emplace_hint_unique_key_args(__h.__i_, __k,
   1132             _VSTD::piecewise_construct,
   1133             _VSTD::forward_as_tuple(_VSTD::move(__k)),
   1134             _VSTD::forward_as_tuple(_VSTD::forward<_Args>(__args)...));
   1135     }
   1136 
   1137     template <class _Vp>
   1138         _LIBCPP_INLINE_VISIBILITY
   1139         pair<iterator, bool> insert_or_assign(const key_type& __k, _Vp&& __v)
   1140     {
   1141         iterator __p = lower_bound(__k);
   1142         if ( __p != end() && !key_comp()(__k, __p->first))
   1143         {
   1144             __p->second = _VSTD::forward<_Vp>(__v);
   1145             return _VSTD::make_pair(__p, false);
   1146         }
   1147         return _VSTD::make_pair(emplace_hint(__p, __k, _VSTD::forward<_Vp>(__v)), true);
   1148     }
   1149 
   1150     template <class _Vp>
   1151         _LIBCPP_INLINE_VISIBILITY
   1152         pair<iterator, bool> insert_or_assign(key_type&& __k, _Vp&& __v)
   1153     {
   1154         iterator __p = lower_bound(__k);
   1155         if ( __p != end() && !key_comp()(__k, __p->first))
   1156         {
   1157             __p->second = _VSTD::forward<_Vp>(__v);
   1158             return _VSTD::make_pair(__p, false);
   1159         }
   1160         return _VSTD::make_pair(emplace_hint(__p, _VSTD::move(__k), _VSTD::forward<_Vp>(__v)), true);
   1161     }
   1162 
   1163     template <class _Vp>
   1164         _LIBCPP_INLINE_VISIBILITY
   1165         iterator insert_or_assign(const_iterator __h, const key_type& __k, _Vp&& __v)
   1166      {
   1167         iterator __p = lower_bound(__k);
   1168         if ( __p != end() && !key_comp()(__k, __p->first))
   1169         {
   1170             __p->second = _VSTD::forward<_Vp>(__v);
   1171             return __p;
   1172         }
   1173         return emplace_hint(__h, __k, _VSTD::forward<_Vp>(__v));
   1174      }
   1175 
   1176     template <class _Vp>
   1177         _LIBCPP_INLINE_VISIBILITY
   1178         iterator insert_or_assign(const_iterator __h, key_type&& __k, _Vp&& __v)
   1179      {
   1180         iterator __p = lower_bound(__k);
   1181         if ( __p != end() && !key_comp()(__k, __p->first))
   1182         {
   1183             __p->second = _VSTD::forward<_Vp>(__v);
   1184             return __p;
   1185         }
   1186         return emplace_hint(__h, _VSTD::move(__k), _VSTD::forward<_Vp>(__v));
   1187      }
   1188 
   1189 #endif // _LIBCPP_STD_VER > 14
   1190 
   1191     _LIBCPP_INLINE_VISIBILITY
   1192     iterator erase(const_iterator __p) {return __tree_.erase(__p.__i_);}
   1193     _LIBCPP_INLINE_VISIBILITY
   1194     iterator erase(iterator __p)       {return __tree_.erase(__p.__i_);}
   1195     _LIBCPP_INLINE_VISIBILITY
   1196     size_type erase(const key_type& __k)
   1197         {return __tree_.__erase_unique(__k);}
   1198     _LIBCPP_INLINE_VISIBILITY
   1199     iterator  erase(const_iterator __f, const_iterator __l)
   1200         {return __tree_.erase(__f.__i_, __l.__i_);}
   1201     _LIBCPP_INLINE_VISIBILITY
   1202     void clear() _NOEXCEPT {__tree_.clear();}
   1203 
   1204     _LIBCPP_INLINE_VISIBILITY
   1205     void swap(map& __m)
   1206         _NOEXCEPT_(__is_nothrow_swappable<__base>::value)
   1207         {__tree_.swap(__m.__tree_);}
   1208 
   1209     _LIBCPP_INLINE_VISIBILITY
   1210     iterator find(const key_type& __k)             {return __tree_.find(__k);}
   1211     _LIBCPP_INLINE_VISIBILITY
   1212     const_iterator find(const key_type& __k) const {return __tree_.find(__k);}
   1213 #if _LIBCPP_STD_VER > 11
   1214     template <typename _K2>
   1215     _LIBCPP_INLINE_VISIBILITY
   1216     typename enable_if<__is_transparent<_Compare, _K2>::value,iterator>::type
   1217     find(const _K2& __k)                           {return __tree_.find(__k);}
   1218     template <typename _K2>
   1219     _LIBCPP_INLINE_VISIBILITY
   1220     typename enable_if<__is_transparent<_Compare, _K2>::value,const_iterator>::type
   1221     find(const _K2& __k) const                     {return __tree_.find(__k);}
   1222 #endif
   1223 
   1224     _LIBCPP_INLINE_VISIBILITY
   1225     size_type      count(const key_type& __k) const
   1226         {return __tree_.__count_unique(__k);}
   1227 #if _LIBCPP_STD_VER > 11
   1228     template <typename _K2>
   1229     _LIBCPP_INLINE_VISIBILITY
   1230     typename enable_if<__is_transparent<_Compare, _K2>::value,size_type>::type
   1231     count(const _K2& __k) const {return __tree_.__count_unique(__k);}
   1232 #endif
   1233     _LIBCPP_INLINE_VISIBILITY
   1234     iterator lower_bound(const key_type& __k)
   1235         {return __tree_.lower_bound(__k);}
   1236     _LIBCPP_INLINE_VISIBILITY
   1237     const_iterator lower_bound(const key_type& __k) const
   1238         {return __tree_.lower_bound(__k);}
   1239 #if _LIBCPP_STD_VER > 11
   1240     template <typename _K2>
   1241     _LIBCPP_INLINE_VISIBILITY
   1242     typename enable_if<__is_transparent<_Compare, _K2>::value,iterator>::type
   1243     lower_bound(const _K2& __k)       {return __tree_.lower_bound(__k);}
   1244 
   1245     template <typename _K2>
   1246     _LIBCPP_INLINE_VISIBILITY
   1247     typename enable_if<__is_transparent<_Compare, _K2>::value,const_iterator>::type
   1248     lower_bound(const _K2& __k) const {return __tree_.lower_bound(__k);}
   1249 #endif
   1250 
   1251     _LIBCPP_INLINE_VISIBILITY
   1252     iterator upper_bound(const key_type& __k)
   1253         {return __tree_.upper_bound(__k);}
   1254     _LIBCPP_INLINE_VISIBILITY
   1255     const_iterator upper_bound(const key_type& __k) const
   1256         {return __tree_.upper_bound(__k);}
   1257 #if _LIBCPP_STD_VER > 11
   1258     template <typename _K2>
   1259     _LIBCPP_INLINE_VISIBILITY
   1260     typename enable_if<__is_transparent<_Compare, _K2>::value,iterator>::type
   1261     upper_bound(const _K2& __k)       {return __tree_.upper_bound(__k);}
   1262     template <typename _K2>
   1263     _LIBCPP_INLINE_VISIBILITY
   1264     typename enable_if<__is_transparent<_Compare, _K2>::value,const_iterator>::type
   1265     upper_bound(const _K2& __k) const {return __tree_.upper_bound(__k);}
   1266 #endif
   1267 
   1268     _LIBCPP_INLINE_VISIBILITY
   1269     pair<iterator,iterator> equal_range(const key_type& __k)
   1270         {return __tree_.__equal_range_unique(__k);}
   1271     _LIBCPP_INLINE_VISIBILITY
   1272     pair<const_iterator,const_iterator> equal_range(const key_type& __k) const
   1273         {return __tree_.__equal_range_unique(__k);}
   1274 #if _LIBCPP_STD_VER > 11
   1275     template <typename _K2>
   1276     _LIBCPP_INLINE_VISIBILITY
   1277     typename enable_if<__is_transparent<_Compare, _K2>::value,pair<iterator,iterator>>::type
   1278     equal_range(const _K2& __k)       {return __tree_.__equal_range_unique(__k);}
   1279     template <typename _K2>
   1280     _LIBCPP_INLINE_VISIBILITY
   1281     typename enable_if<__is_transparent<_Compare, _K2>::value,pair<const_iterator,const_iterator>>::type
   1282     equal_range(const _K2& __k) const {return __tree_.__equal_range_unique(__k);}
   1283 #endif
   1284 
   1285 private:
   1286     typedef typename __base::__node                    __node;
   1287     typedef typename __base::__node_allocator          __node_allocator;
   1288     typedef typename __base::__node_pointer            __node_pointer;
   1289     typedef typename __base::__node_base_pointer       __node_base_pointer;
   1290     typedef typename __base::__parent_pointer          __parent_pointer;
   1291 
   1292     typedef __map_node_destructor<__node_allocator> _Dp;
   1293     typedef unique_ptr<__node, _Dp> __node_holder;
   1294 
   1295 #ifdef _LIBCPP_CXX03_LANG
   1296     __node_holder __construct_node_with_key(const key_type& __k);
   1297 #endif
   1298 };
   1299 
   1300 
   1301 #ifndef _LIBCPP_CXX03_LANG
   1302 template <class _Key, class _Tp, class _Compare, class _Allocator>
   1303 map<_Key, _Tp, _Compare, _Allocator>::map(map&& __m, const allocator_type& __a)
   1304     : __tree_(_VSTD::move(__m.__tree_), typename __base::allocator_type(__a))
   1305 {
   1306     if (__a != __m.get_allocator())
   1307     {
   1308         const_iterator __e = cend();
   1309         while (!__m.empty())
   1310             __tree_.__insert_unique(__e.__i_,
   1311                     _VSTD::move(__m.__tree_.remove(__m.begin().__i_)->__value_.__nc));
   1312     }
   1313 }
   1314 
   1315 template <class _Key, class _Tp, class _Compare, class _Allocator>
   1316 _Tp&
   1317 map<_Key, _Tp, _Compare, _Allocator>::operator[](const key_type& __k)
   1318 {
   1319     return __tree_.__emplace_unique_key_args(__k,
   1320         _VSTD::piecewise_construct,
   1321         _VSTD::forward_as_tuple(__k),
   1322         _VSTD::forward_as_tuple()).first->__cc.second;
   1323 }
   1324 
   1325 template <class _Key, class _Tp, class _Compare, class _Allocator>
   1326 _Tp&
   1327 map<_Key, _Tp, _Compare, _Allocator>::operator[](key_type&& __k)
   1328 {
   1329     return __tree_.__emplace_unique_key_args(__k,
   1330         _VSTD::piecewise_construct,
   1331         _VSTD::forward_as_tuple(_VSTD::move(__k)),
   1332         _VSTD::forward_as_tuple()).first->__cc.second;
   1333 }
   1334 
   1335 #else // _LIBCPP_CXX03_LANG
   1336 
   1337 template <class _Key, class _Tp, class _Compare, class _Allocator>
   1338 typename map<_Key, _Tp, _Compare, _Allocator>::__node_holder
   1339 map<_Key, _Tp, _Compare, _Allocator>::__construct_node_with_key(const key_type& __k)
   1340 {
   1341     __node_allocator& __na = __tree_.__node_alloc();
   1342     __node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na));
   1343     __node_traits::construct(__na, _VSTD::addressof(__h->__value_.__cc.first), __k);
   1344     __h.get_deleter().__first_constructed = true;
   1345     __node_traits::construct(__na, _VSTD::addressof(__h->__value_.__cc.second));
   1346     __h.get_deleter().__second_constructed = true;
   1347     return _LIBCPP_EXPLICIT_MOVE(__h);  // explicitly moved for C++03
   1348 }
   1349 
   1350 template <class _Key, class _Tp, class _Compare, class _Allocator>
   1351 _Tp&
   1352 map<_Key, _Tp, _Compare, _Allocator>::operator[](const key_type& __k)
   1353 {
   1354     __parent_pointer __parent;
   1355     __node_base_pointer& __child = __tree_.__find_equal(__parent, __k);
   1356     __node_pointer __r = static_cast<__node_pointer>(__child);
   1357     if (__child == nullptr)
   1358     {
   1359         __node_holder __h = __construct_node_with_key(__k);
   1360         __tree_.__insert_node_at(__parent, __child, static_cast<__node_base_pointer>(__h.get()));
   1361         __r = __h.release();
   1362     }
   1363     return __r->__value_.__cc.second;
   1364 }
   1365 
   1366 #endif  // _LIBCPP_CXX03_LANG
   1367 
   1368 template <class _Key, class _Tp, class _Compare, class _Allocator>
   1369 _Tp&
   1370 map<_Key, _Tp, _Compare, _Allocator>::at(const key_type& __k)
   1371 {
   1372     __parent_pointer __parent;
   1373     __node_base_pointer& __child = __tree_.__find_equal(__parent, __k);
   1374 #ifndef _LIBCPP_NO_EXCEPTIONS
   1375     if (__child == nullptr)
   1376         throw out_of_range("map::at:  key not found");
   1377 #endif  // _LIBCPP_NO_EXCEPTIONS
   1378     return static_cast<__node_pointer>(__child)->__value_.__cc.second;
   1379 }
   1380 
   1381 template <class _Key, class _Tp, class _Compare, class _Allocator>
   1382 const _Tp&
   1383 map<_Key, _Tp, _Compare, _Allocator>::at(const key_type& __k) const
   1384 {
   1385     __parent_pointer __parent;
   1386     __node_base_pointer __child = __tree_.__find_equal(__parent, __k);
   1387 #ifndef _LIBCPP_NO_EXCEPTIONS
   1388     if (__child == nullptr)
   1389         throw out_of_range("map::at:  key not found");
   1390 #endif  // _LIBCPP_NO_EXCEPTIONS
   1391     return static_cast<__node_pointer>(__child)->__value_.__cc.second;
   1392 }
   1393 
   1394 
   1395 template <class _Key, class _Tp, class _Compare, class _Allocator>
   1396 inline _LIBCPP_INLINE_VISIBILITY
   1397 bool
   1398 operator==(const map<_Key, _Tp, _Compare, _Allocator>& __x,
   1399            const map<_Key, _Tp, _Compare, _Allocator>& __y)
   1400 {
   1401     return __x.size() == __y.size() && _VSTD::equal(__x.begin(), __x.end(), __y.begin());
   1402 }
   1403 
   1404 template <class _Key, class _Tp, class _Compare, class _Allocator>
   1405 inline _LIBCPP_INLINE_VISIBILITY
   1406 bool
   1407 operator< (const map<_Key, _Tp, _Compare, _Allocator>& __x,
   1408            const map<_Key, _Tp, _Compare, _Allocator>& __y)
   1409 {
   1410     return _VSTD::lexicographical_compare(__x.begin(), __x.end(), __y.begin(), __y.end());
   1411 }
   1412 
   1413 template <class _Key, class _Tp, class _Compare, class _Allocator>
   1414 inline _LIBCPP_INLINE_VISIBILITY
   1415 bool
   1416 operator!=(const map<_Key, _Tp, _Compare, _Allocator>& __x,
   1417            const map<_Key, _Tp, _Compare, _Allocator>& __y)
   1418 {
   1419     return !(__x == __y);
   1420 }
   1421 
   1422 template <class _Key, class _Tp, class _Compare, class _Allocator>
   1423 inline _LIBCPP_INLINE_VISIBILITY
   1424 bool
   1425 operator> (const map<_Key, _Tp, _Compare, _Allocator>& __x,
   1426            const map<_Key, _Tp, _Compare, _Allocator>& __y)
   1427 {
   1428     return __y < __x;
   1429 }
   1430 
   1431 template <class _Key, class _Tp, class _Compare, class _Allocator>
   1432 inline _LIBCPP_INLINE_VISIBILITY
   1433 bool
   1434 operator>=(const map<_Key, _Tp, _Compare, _Allocator>& __x,
   1435            const map<_Key, _Tp, _Compare, _Allocator>& __y)
   1436 {
   1437     return !(__x < __y);
   1438 }
   1439 
   1440 template <class _Key, class _Tp, class _Compare, class _Allocator>
   1441 inline _LIBCPP_INLINE_VISIBILITY
   1442 bool
   1443 operator<=(const map<_Key, _Tp, _Compare, _Allocator>& __x,
   1444            const map<_Key, _Tp, _Compare, _Allocator>& __y)
   1445 {
   1446     return !(__y < __x);
   1447 }
   1448 
   1449 template <class _Key, class _Tp, class _Compare, class _Allocator>
   1450 inline _LIBCPP_INLINE_VISIBILITY
   1451 void
   1452 swap(map<_Key, _Tp, _Compare, _Allocator>& __x,
   1453      map<_Key, _Tp, _Compare, _Allocator>& __y)
   1454     _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
   1455 {
   1456     __x.swap(__y);
   1457 }
   1458 
   1459 template <class _Key, class _Tp, class _Compare = less<_Key>,
   1460           class _Allocator = allocator<pair<const _Key, _Tp> > >
   1461 class _LIBCPP_TEMPLATE_VIS multimap
   1462 {
   1463 public:
   1464     // types:
   1465     typedef _Key                                     key_type;
   1466     typedef _Tp                                      mapped_type;
   1467     typedef pair<const key_type, mapped_type>        value_type;
   1468     typedef pair<key_type, mapped_type>              __nc_value_type;
   1469     typedef _Compare                                 key_compare;
   1470     typedef _Allocator                               allocator_type;
   1471     typedef value_type&                              reference;
   1472     typedef const value_type&                        const_reference;
   1473 
   1474     static_assert((is_same<typename allocator_type::value_type, value_type>::value),
   1475                   "Allocator::value_type must be same type as value_type");
   1476 
   1477     class _LIBCPP_TEMPLATE_VIS value_compare
   1478         : public binary_function<value_type, value_type, bool>
   1479     {
   1480         friend class multimap;
   1481     protected:
   1482         key_compare comp;
   1483 
   1484         _LIBCPP_INLINE_VISIBILITY
   1485         value_compare(key_compare c) : comp(c) {}
   1486     public:
   1487         _LIBCPP_INLINE_VISIBILITY
   1488         bool operator()(const value_type& __x, const value_type& __y) const
   1489             {return comp(__x.first, __y.first);}
   1490     };
   1491 
   1492 private:
   1493 
   1494     typedef _VSTD::__value_type<key_type, mapped_type>             __value_type;
   1495     typedef __map_value_compare<key_type, __value_type, key_compare> __vc;
   1496     typedef typename __rebind_alloc_helper<allocator_traits<allocator_type>,
   1497                                                  __value_type>::type __allocator_type;
   1498     typedef __tree<__value_type, __vc, __allocator_type>            __base;
   1499     typedef typename __base::__node_traits                          __node_traits;
   1500     typedef allocator_traits<allocator_type>                        __alloc_traits;
   1501 
   1502     __base __tree_;
   1503 
   1504 public:
   1505     typedef typename __alloc_traits::pointer               pointer;
   1506     typedef typename __alloc_traits::const_pointer         const_pointer;
   1507     typedef typename __alloc_traits::size_type             size_type;
   1508     typedef typename __alloc_traits::difference_type       difference_type;
   1509     typedef __map_iterator<typename __base::iterator>      iterator;
   1510     typedef __map_const_iterator<typename __base::const_iterator> const_iterator;
   1511     typedef _VSTD::reverse_iterator<iterator>               reverse_iterator;
   1512     typedef _VSTD::reverse_iterator<const_iterator>         const_reverse_iterator;
   1513 
   1514     _LIBCPP_INLINE_VISIBILITY
   1515     multimap()
   1516         _NOEXCEPT_(
   1517             is_nothrow_default_constructible<allocator_type>::value &&
   1518             is_nothrow_default_constructible<key_compare>::value &&
   1519             is_nothrow_copy_constructible<key_compare>::value)
   1520         : __tree_(__vc(key_compare())) {}
   1521 
   1522     _LIBCPP_INLINE_VISIBILITY
   1523     explicit multimap(const key_compare& __comp)
   1524         _NOEXCEPT_(
   1525             is_nothrow_default_constructible<allocator_type>::value &&
   1526             is_nothrow_copy_constructible<key_compare>::value)
   1527         : __tree_(__vc(__comp)) {}
   1528 
   1529     _LIBCPP_INLINE_VISIBILITY
   1530     explicit multimap(const key_compare& __comp, const allocator_type& __a)
   1531         : __tree_(__vc(__comp), typename __base::allocator_type(__a)) {}
   1532 
   1533     template <class _InputIterator>
   1534         _LIBCPP_INLINE_VISIBILITY
   1535         multimap(_InputIterator __f, _InputIterator __l,
   1536             const key_compare& __comp = key_compare())
   1537         : __tree_(__vc(__comp))
   1538         {
   1539             insert(__f, __l);
   1540         }
   1541 
   1542     template <class _InputIterator>
   1543         _LIBCPP_INLINE_VISIBILITY
   1544         multimap(_InputIterator __f, _InputIterator __l,
   1545             const key_compare& __comp, const allocator_type& __a)
   1546         : __tree_(__vc(__comp), typename __base::allocator_type(__a))
   1547         {
   1548             insert(__f, __l);
   1549         }
   1550 
   1551 #if _LIBCPP_STD_VER > 11
   1552     template <class _InputIterator>
   1553     _LIBCPP_INLINE_VISIBILITY
   1554     multimap(_InputIterator __f, _InputIterator __l, const allocator_type& __a)
   1555         : multimap(__f, __l, key_compare(), __a) {}
   1556 #endif
   1557 
   1558     _LIBCPP_INLINE_VISIBILITY
   1559     multimap(const multimap& __m)
   1560         : __tree_(__m.__tree_.value_comp(),
   1561           __alloc_traits::select_on_container_copy_construction(__m.__tree_.__alloc()))
   1562         {
   1563             insert(__m.begin(), __m.end());
   1564         }
   1565 
   1566     _LIBCPP_INLINE_VISIBILITY
   1567     multimap& operator=(const multimap& __m)
   1568         {
   1569 #ifndef _LIBCPP_CXX03_LANG
   1570             __tree_ = __m.__tree_;
   1571 #else
   1572             if (this != &__m) {
   1573                 __tree_.clear();
   1574                 __tree_.value_comp() = __m.__tree_.value_comp();
   1575                 __tree_.__copy_assign_alloc(__m.__tree_);
   1576                 insert(__m.begin(), __m.end());
   1577             }
   1578 #endif
   1579             return *this;
   1580         }
   1581 
   1582 #ifndef _LIBCPP_CXX03_LANG
   1583 
   1584     _LIBCPP_INLINE_VISIBILITY
   1585     multimap(multimap&& __m)
   1586         _NOEXCEPT_(is_nothrow_move_constructible<__base>::value)
   1587         : __tree_(_VSTD::move(__m.__tree_))
   1588         {
   1589         }
   1590 
   1591     multimap(multimap&& __m, const allocator_type& __a);
   1592 
   1593     _LIBCPP_INLINE_VISIBILITY
   1594     multimap& operator=(multimap&& __m)
   1595         _NOEXCEPT_(is_nothrow_move_assignable<__base>::value)
   1596         {
   1597             __tree_ = _VSTD::move(__m.__tree_);
   1598             return *this;
   1599         }
   1600 
   1601     _LIBCPP_INLINE_VISIBILITY
   1602     multimap(initializer_list<value_type> __il, const key_compare& __comp = key_compare())
   1603         : __tree_(__vc(__comp))
   1604         {
   1605             insert(__il.begin(), __il.end());
   1606         }
   1607 
   1608     _LIBCPP_INLINE_VISIBILITY
   1609     multimap(initializer_list<value_type> __il, const key_compare& __comp, const allocator_type& __a)
   1610         : __tree_(__vc(__comp), typename __base::allocator_type(__a))
   1611         {
   1612             insert(__il.begin(), __il.end());
   1613         }
   1614 
   1615 #if _LIBCPP_STD_VER > 11
   1616     _LIBCPP_INLINE_VISIBILITY
   1617     multimap(initializer_list<value_type> __il, const allocator_type& __a)
   1618         : multimap(__il, key_compare(), __a) {}
   1619 #endif
   1620 
   1621     _LIBCPP_INLINE_VISIBILITY
   1622     multimap& operator=(initializer_list<value_type> __il)
   1623         {
   1624             __tree_.__assign_multi(__il.begin(), __il.end());
   1625             return *this;
   1626         }
   1627 
   1628 #endif  // _LIBCPP_CXX03_LANG
   1629 
   1630     _LIBCPP_INLINE_VISIBILITY
   1631     explicit multimap(const allocator_type& __a)
   1632         : __tree_(typename __base::allocator_type(__a))
   1633         {
   1634         }
   1635 
   1636     _LIBCPP_INLINE_VISIBILITY
   1637     multimap(const multimap& __m, const allocator_type& __a)
   1638         : __tree_(__m.__tree_.value_comp(), typename __base::allocator_type(__a))
   1639         {
   1640             insert(__m.begin(), __m.end());
   1641         }
   1642 
   1643     _LIBCPP_INLINE_VISIBILITY
   1644           iterator begin() _NOEXCEPT {return __tree_.begin();}
   1645     _LIBCPP_INLINE_VISIBILITY
   1646     const_iterator begin() const _NOEXCEPT {return __tree_.begin();}
   1647     _LIBCPP_INLINE_VISIBILITY
   1648           iterator end() _NOEXCEPT {return __tree_.end();}
   1649     _LIBCPP_INLINE_VISIBILITY
   1650     const_iterator end() const _NOEXCEPT {return __tree_.end();}
   1651 
   1652     _LIBCPP_INLINE_VISIBILITY
   1653           reverse_iterator rbegin() _NOEXCEPT {return reverse_iterator(end());}
   1654     _LIBCPP_INLINE_VISIBILITY
   1655     const_reverse_iterator rbegin() const _NOEXCEPT
   1656         {return const_reverse_iterator(end());}
   1657     _LIBCPP_INLINE_VISIBILITY
   1658           reverse_iterator rend() _NOEXCEPT {return reverse_iterator(begin());}
   1659     _LIBCPP_INLINE_VISIBILITY
   1660     const_reverse_iterator rend() const _NOEXCEPT
   1661         {return const_reverse_iterator(begin());}
   1662 
   1663     _LIBCPP_INLINE_VISIBILITY
   1664     const_iterator cbegin()  const _NOEXCEPT {return begin();}
   1665     _LIBCPP_INLINE_VISIBILITY
   1666     const_iterator cend() const _NOEXCEPT {return end();}
   1667     _LIBCPP_INLINE_VISIBILITY
   1668     const_reverse_iterator crbegin() const _NOEXCEPT {return rbegin();}
   1669     _LIBCPP_INLINE_VISIBILITY
   1670     const_reverse_iterator crend() const _NOEXCEPT {return rend();}
   1671 
   1672     _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY
   1673     bool empty() const _NOEXCEPT {return __tree_.size() == 0;}
   1674     _LIBCPP_INLINE_VISIBILITY
   1675     size_type size() const _NOEXCEPT {return __tree_.size();}
   1676     _LIBCPP_INLINE_VISIBILITY
   1677     size_type max_size() const _NOEXCEPT {return __tree_.max_size();}
   1678 
   1679     _LIBCPP_INLINE_VISIBILITY
   1680     allocator_type get_allocator() const _NOEXCEPT {return allocator_type(__tree_.__alloc());}
   1681     _LIBCPP_INLINE_VISIBILITY
   1682     key_compare    key_comp() const {return __tree_.value_comp().key_comp();}
   1683     _LIBCPP_INLINE_VISIBILITY
   1684     value_compare  value_comp() const
   1685         {return value_compare(__tree_.value_comp().key_comp());}
   1686 
   1687 #ifndef _LIBCPP_CXX03_LANG
   1688 
   1689     template <class ..._Args>
   1690     _LIBCPP_INLINE_VISIBILITY
   1691     iterator emplace(_Args&& ...__args) {
   1692         return __tree_.__emplace_multi(_VSTD::forward<_Args>(__args)...);
   1693     }
   1694 
   1695     template <class ..._Args>
   1696     _LIBCPP_INLINE_VISIBILITY
   1697     iterator emplace_hint(const_iterator __p, _Args&& ...__args) {
   1698         return __tree_.__emplace_hint_multi(__p.__i_, _VSTD::forward<_Args>(__args)...);
   1699     }
   1700 
   1701     template <class _Pp,
   1702               class = typename enable_if<is_constructible<value_type, _Pp>::value>::type>
   1703         _LIBCPP_INLINE_VISIBILITY
   1704         iterator insert(_Pp&& __p)
   1705             {return __tree_.__insert_multi(_VSTD::forward<_Pp>(__p));}
   1706 
   1707     template <class _Pp,
   1708               class = typename enable_if<is_constructible<value_type, _Pp>::value>::type>
   1709         _LIBCPP_INLINE_VISIBILITY
   1710         iterator insert(const_iterator __pos, _Pp&& __p)
   1711             {return __tree_.__insert_multi(__pos.__i_, _VSTD::forward<_Pp>(__p));}
   1712 
   1713     _LIBCPP_INLINE_VISIBILITY
   1714     iterator insert(value_type&& __v)
   1715         {return __tree_.__insert_multi(_VSTD::move(__v));}
   1716 
   1717     _LIBCPP_INLINE_VISIBILITY
   1718     iterator insert(const_iterator __p, value_type&& __v)
   1719         {return __tree_.__insert_multi(__p.__i_, _VSTD::move(__v));}
   1720 
   1721 
   1722     _LIBCPP_INLINE_VISIBILITY
   1723     void insert(initializer_list<value_type> __il)
   1724         {insert(__il.begin(), __il.end());}
   1725 
   1726 #endif  // _LIBCPP_CXX03_LANG
   1727 
   1728     _LIBCPP_INLINE_VISIBILITY
   1729     iterator insert(const value_type& __v) {return __tree_.__insert_multi(__v);}
   1730 
   1731     _LIBCPP_INLINE_VISIBILITY
   1732     iterator insert(const_iterator __p, const value_type& __v)
   1733             {return __tree_.__insert_multi(__p.__i_, __v);}
   1734 
   1735     template <class _InputIterator>
   1736         _LIBCPP_INLINE_VISIBILITY
   1737         void insert(_InputIterator __f, _InputIterator __l)
   1738         {
   1739             for (const_iterator __e = cend(); __f != __l; ++__f)
   1740                 __tree_.__insert_multi(__e.__i_, *__f);
   1741         }
   1742 
   1743     _LIBCPP_INLINE_VISIBILITY
   1744     iterator erase(const_iterator __p) {return __tree_.erase(__p.__i_);}
   1745     _LIBCPP_INLINE_VISIBILITY
   1746     iterator erase(iterator __p)       {return __tree_.erase(__p.__i_);}
   1747     _LIBCPP_INLINE_VISIBILITY
   1748     size_type erase(const key_type& __k) {return __tree_.__erase_multi(__k);}
   1749     _LIBCPP_INLINE_VISIBILITY
   1750     iterator  erase(const_iterator __f, const_iterator __l)
   1751         {return __tree_.erase(__f.__i_, __l.__i_);}
   1752     _LIBCPP_INLINE_VISIBILITY
   1753     void clear() {__tree_.clear();}
   1754 
   1755     _LIBCPP_INLINE_VISIBILITY
   1756     void swap(multimap& __m)
   1757         _NOEXCEPT_(__is_nothrow_swappable<__base>::value)
   1758         {__tree_.swap(__m.__tree_);}
   1759 
   1760     _LIBCPP_INLINE_VISIBILITY
   1761     iterator find(const key_type& __k)             {return __tree_.find(__k);}
   1762     _LIBCPP_INLINE_VISIBILITY
   1763     const_iterator find(const key_type& __k) const {return __tree_.find(__k);}
   1764 #if _LIBCPP_STD_VER > 11
   1765     template <typename _K2>
   1766     _LIBCPP_INLINE_VISIBILITY
   1767     typename enable_if<__is_transparent<_Compare, _K2>::value,iterator>::type
   1768     find(const _K2& __k)                           {return __tree_.find(__k);}
   1769     template <typename _K2>
   1770     _LIBCPP_INLINE_VISIBILITY
   1771     typename enable_if<__is_transparent<_Compare, _K2>::value,const_iterator>::type
   1772     find(const _K2& __k) const                     {return __tree_.find(__k);}
   1773 #endif
   1774 
   1775     _LIBCPP_INLINE_VISIBILITY
   1776     size_type      count(const key_type& __k) const
   1777         {return __tree_.__count_multi(__k);}
   1778 #if _LIBCPP_STD_VER > 11
   1779     template <typename _K2>
   1780     _LIBCPP_INLINE_VISIBILITY
   1781     typename enable_if<__is_transparent<_Compare, _K2>::value,size_type>::type
   1782     count(const _K2& __k) const {return __tree_.__count_multi(__k);}
   1783 #endif
   1784     _LIBCPP_INLINE_VISIBILITY
   1785     iterator lower_bound(const key_type& __k)
   1786         {return __tree_.lower_bound(__k);}
   1787     _LIBCPP_INLINE_VISIBILITY
   1788     const_iterator lower_bound(const key_type& __k) const
   1789             {return __tree_.lower_bound(__k);}
   1790 #if _LIBCPP_STD_VER > 11
   1791     template <typename _K2>
   1792     _LIBCPP_INLINE_VISIBILITY
   1793     typename enable_if<__is_transparent<_Compare, _K2>::value,iterator>::type
   1794     lower_bound(const _K2& __k)       {return __tree_.lower_bound(__k);}
   1795 
   1796     template <typename _K2>
   1797     _LIBCPP_INLINE_VISIBILITY
   1798     typename enable_if<__is_transparent<_Compare, _K2>::value,const_iterator>::type
   1799     lower_bound(const _K2& __k) const {return __tree_.lower_bound(__k);}
   1800 #endif
   1801 
   1802     _LIBCPP_INLINE_VISIBILITY
   1803     iterator upper_bound(const key_type& __k)
   1804             {return __tree_.upper_bound(__k);}
   1805     _LIBCPP_INLINE_VISIBILITY
   1806     const_iterator upper_bound(const key_type& __k) const
   1807             {return __tree_.upper_bound(__k);}
   1808 #if _LIBCPP_STD_VER > 11
   1809     template <typename _K2>
   1810     _LIBCPP_INLINE_VISIBILITY
   1811     typename enable_if<__is_transparent<_Compare, _K2>::value,iterator>::type
   1812     upper_bound(const _K2& __k)       {return __tree_.upper_bound(__k);}
   1813     template <typename _K2>
   1814     _LIBCPP_INLINE_VISIBILITY
   1815     typename enable_if<__is_transparent<_Compare, _K2>::value,const_iterator>::type
   1816     upper_bound(const _K2& __k) const {return __tree_.upper_bound(__k);}
   1817 #endif
   1818 
   1819     _LIBCPP_INLINE_VISIBILITY
   1820     pair<iterator,iterator>             equal_range(const key_type& __k)
   1821             {return __tree_.__equal_range_multi(__k);}
   1822     _LIBCPP_INLINE_VISIBILITY
   1823     pair<const_iterator,const_iterator> equal_range(const key_type& __k) const
   1824             {return __tree_.__equal_range_multi(__k);}
   1825 #if _LIBCPP_STD_VER > 11
   1826     template <typename _K2>
   1827     _LIBCPP_INLINE_VISIBILITY
   1828     typename enable_if<__is_transparent<_Compare, _K2>::value,pair<iterator,iterator>>::type
   1829     equal_range(const _K2& __k)       {return __tree_.__equal_range_multi(__k);}
   1830     template <typename _K2>
   1831     _LIBCPP_INLINE_VISIBILITY
   1832     typename enable_if<__is_transparent<_Compare, _K2>::value,pair<const_iterator,const_iterator>>::type
   1833     equal_range(const _K2& __k) const {return __tree_.__equal_range_multi(__k);}
   1834 #endif
   1835 
   1836 private:
   1837     typedef typename __base::__node                    __node;
   1838     typedef typename __base::__node_allocator          __node_allocator;
   1839     typedef typename __base::__node_pointer            __node_pointer;
   1840 
   1841     typedef __map_node_destructor<__node_allocator> _Dp;
   1842     typedef unique_ptr<__node, _Dp> __node_holder;
   1843 };
   1844 
   1845 #ifndef _LIBCPP_CXX03_LANG
   1846 template <class _Key, class _Tp, class _Compare, class _Allocator>
   1847 multimap<_Key, _Tp, _Compare, _Allocator>::multimap(multimap&& __m, const allocator_type& __a)
   1848     : __tree_(_VSTD::move(__m.__tree_), typename __base::allocator_type(__a))
   1849 {
   1850     if (__a != __m.get_allocator())
   1851     {
   1852         const_iterator __e = cend();
   1853         while (!__m.empty())
   1854             __tree_.__insert_multi(__e.__i_,
   1855                     _VSTD::move(__m.__tree_.remove(__m.begin().__i_)->__value_.__nc));
   1856     }
   1857 }
   1858 #endif
   1859 
   1860 template <class _Key, class _Tp, class _Compare, class _Allocator>
   1861 inline _LIBCPP_INLINE_VISIBILITY
   1862 bool
   1863 operator==(const multimap<_Key, _Tp, _Compare, _Allocator>& __x,
   1864            const multimap<_Key, _Tp, _Compare, _Allocator>& __y)
   1865 {
   1866     return __x.size() == __y.size() && _VSTD::equal(__x.begin(), __x.end(), __y.begin());
   1867 }
   1868 
   1869 template <class _Key, class _Tp, class _Compare, class _Allocator>
   1870 inline _LIBCPP_INLINE_VISIBILITY
   1871 bool
   1872 operator< (const multimap<_Key, _Tp, _Compare, _Allocator>& __x,
   1873            const multimap<_Key, _Tp, _Compare, _Allocator>& __y)
   1874 {
   1875     return _VSTD::lexicographical_compare(__x.begin(), __x.end(), __y.begin(), __y.end());
   1876 }
   1877 
   1878 template <class _Key, class _Tp, class _Compare, class _Allocator>
   1879 inline _LIBCPP_INLINE_VISIBILITY
   1880 bool
   1881 operator!=(const multimap<_Key, _Tp, _Compare, _Allocator>& __x,
   1882            const multimap<_Key, _Tp, _Compare, _Allocator>& __y)
   1883 {
   1884     return !(__x == __y);
   1885 }
   1886 
   1887 template <class _Key, class _Tp, class _Compare, class _Allocator>
   1888 inline _LIBCPP_INLINE_VISIBILITY
   1889 bool
   1890 operator> (const multimap<_Key, _Tp, _Compare, _Allocator>& __x,
   1891            const multimap<_Key, _Tp, _Compare, _Allocator>& __y)
   1892 {
   1893     return __y < __x;
   1894 }
   1895 
   1896 template <class _Key, class _Tp, class _Compare, class _Allocator>
   1897 inline _LIBCPP_INLINE_VISIBILITY
   1898 bool
   1899 operator>=(const multimap<_Key, _Tp, _Compare, _Allocator>& __x,
   1900            const multimap<_Key, _Tp, _Compare, _Allocator>& __y)
   1901 {
   1902     return !(__x < __y);
   1903 }
   1904 
   1905 template <class _Key, class _Tp, class _Compare, class _Allocator>
   1906 inline _LIBCPP_INLINE_VISIBILITY
   1907 bool
   1908 operator<=(const multimap<_Key, _Tp, _Compare, _Allocator>& __x,
   1909            const multimap<_Key, _Tp, _Compare, _Allocator>& __y)
   1910 {
   1911     return !(__y < __x);
   1912 }
   1913 
   1914 template <class _Key, class _Tp, class _Compare, class _Allocator>
   1915 inline _LIBCPP_INLINE_VISIBILITY
   1916 void
   1917 swap(multimap<_Key, _Tp, _Compare, _Allocator>& __x,
   1918      multimap<_Key, _Tp, _Compare, _Allocator>& __y)
   1919     _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
   1920 {
   1921     __x.swap(__y);
   1922 }
   1923 
   1924 _LIBCPP_END_NAMESPACE_STD
   1925 
   1926 #endif  // _LIBCPP_MAP
   1927