xref: /llvm-project-15.0.7/libcxx/include/map (revision 5f11e128)
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
18namespace std
19{
20
21template <class Key, class T, class Compare = less<Key>,
22          class Allocator = allocator<pair<const Key, T>>>
23class map
24{
25public:
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
205template <class Key, class T, class Compare, class Allocator>
206bool
207operator==(const map<Key, T, Compare, Allocator>& x,
208           const map<Key, T, Compare, Allocator>& y);
209
210template <class Key, class T, class Compare, class Allocator>
211bool
212operator< (const map<Key, T, Compare, Allocator>& x,
213           const map<Key, T, Compare, Allocator>& y);
214
215template <class Key, class T, class Compare, class Allocator>
216bool
217operator!=(const map<Key, T, Compare, Allocator>& x,
218           const map<Key, T, Compare, Allocator>& y);
219
220template <class Key, class T, class Compare, class Allocator>
221bool
222operator> (const map<Key, T, Compare, Allocator>& x,
223           const map<Key, T, Compare, Allocator>& y);
224
225template <class Key, class T, class Compare, class Allocator>
226bool
227operator>=(const map<Key, T, Compare, Allocator>& x,
228           const map<Key, T, Compare, Allocator>& y);
229
230template <class Key, class T, class Compare, class Allocator>
231bool
232operator<=(const map<Key, T, Compare, Allocator>& x,
233           const map<Key, T, Compare, Allocator>& y);
234
235// specialized algorithms:
236template <class Key, class T, class Compare, class Allocator>
237void
238swap(map<Key, T, Compare, Allocator>& x, map<Key, T, Compare, Allocator>& y)
239    noexcept(noexcept(x.swap(y)));
240
241template <class Key, class T, class Compare = less<Key>,
242          class Allocator = allocator<pair<const Key, T>>>
243class multimap
244{
245public:
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
400template <class Key, class T, class Compare, class Allocator>
401bool
402operator==(const multimap<Key, T, Compare, Allocator>& x,
403           const multimap<Key, T, Compare, Allocator>& y);
404
405template <class Key, class T, class Compare, class Allocator>
406bool
407operator< (const multimap<Key, T, Compare, Allocator>& x,
408           const multimap<Key, T, Compare, Allocator>& y);
409
410template <class Key, class T, class Compare, class Allocator>
411bool
412operator!=(const multimap<Key, T, Compare, Allocator>& x,
413           const multimap<Key, T, Compare, Allocator>& y);
414
415template <class Key, class T, class Compare, class Allocator>
416bool
417operator> (const multimap<Key, T, Compare, Allocator>& x,
418           const multimap<Key, T, Compare, Allocator>& y);
419
420template <class Key, class T, class Compare, class Allocator>
421bool
422operator>=(const multimap<Key, T, Compare, Allocator>& x,
423           const multimap<Key, T, Compare, Allocator>& y);
424
425template <class Key, class T, class Compare, class Allocator>
426bool
427operator<=(const multimap<Key, T, Compare, Allocator>& x,
428           const multimap<Key, T, Compare, Allocator>& y);
429
430// specialized algorithms:
431template <class Key, class T, class Compare, class Allocator>
432void
433swap(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
456template <class _Key, class _CP, class _Compare, bool _IsSmall>
457class __map_value_compare
458    : private _Compare
459{
460public:
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.__get_value().first, __y.__get_value().first);}
474    _LIBCPP_INLINE_VISIBILITY
475    bool operator()(const _CP& __x, const _Key& __y) const
476        {return static_cast<const _Compare&>(*this)(__x.__get_value().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.__get_value().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.__get_value().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.__get_value().first, __y);}
499#endif
500};
501
502template <class _Key, class _CP, class _Compare>
503class __map_value_compare<_Key, _CP, _Compare, false>
504{
505    _Compare comp;
506
507public:
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.__get_value().first, __y.__get_value().first);}
522    _LIBCPP_INLINE_VISIBILITY
523    bool operator()(const _CP& __x, const _Key& __y) const
524        {return comp(__x.__get_value().first, __y);}
525    _LIBCPP_INLINE_VISIBILITY
526    bool operator()(const _Key& __x, const _CP& __y) const
527        {return comp(__x, __y.__get_value().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.__get_value().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.__get_value().first, __y);}
547#endif
548};
549
550template <class _Key, class _CP, class _Compare, bool __b>
551inline _LIBCPP_INLINE_VISIBILITY
552void
553swap(__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
560template <class _Allocator>
561class __map_node_destructor
562{
563    typedef _Allocator                          allocator_type;
564    typedef allocator_traits<allocator_type>    __alloc_traits;
565
566public:
567    typedef typename __alloc_traits::pointer    pointer;
568
569private:
570    allocator_type& __na_;
571
572    __map_node_destructor& operator=(const __map_node_destructor&);
573
574public:
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_.__get_value().second));
601        if (__first_constructed)
602            __alloc_traits::destroy(__na_, _VSTD::addressof(__p->__value_.__get_value().first));
603        if (__p)
604            __alloc_traits::deallocate(__na_, __p, 1);
605    }
606};
607
608template <class _Key, class _Tp, class _Compare, class _Allocator>
609    class map;
610template <class _Key, class _Tp, class _Compare, class _Allocator>
611    class multimap;
612template <class _TreeIterator> class __map_const_iterator;
613
614#ifndef _LIBCPP_CXX03_LANG
615
616template <class _Key, class _Tp>
617struct __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_ref_pair_type;
623    typedef pair<key_type&&, mapped_type&&>          __nc_rref_pair_type;
624
625private:
626    value_type __cc;
627
628public:
629    _LIBCPP_INLINE_VISIBILITY
630    value_type& __get_value()
631    {
632#if _LIBCPP_STD_VER > 14
633        return *_VSTD::launder(_VSTD::addressof(__cc));
634#else
635        return __cc;
636#endif
637    }
638
639    _LIBCPP_INLINE_VISIBILITY
640    const value_type& __get_value() const
641    {
642#if _LIBCPP_STD_VER > 14
643        return *_VSTD::launder(_VSTD::addressof(__cc));
644#else
645        return __cc;
646#endif
647    }
648
649    _LIBCPP_INLINE_VISIBILITY
650    __nc_ref_pair_type __ref()
651    {
652        value_type& __v = __get_value();
653        return __nc_ref_pair_type(const_cast<key_type&>(__v.first), __v.second);
654    }
655
656    _LIBCPP_INLINE_VISIBILITY
657    __nc_rref_pair_type __move()
658    {
659        value_type& __v = __get_value();
660        return __nc_rref_pair_type(
661            _VSTD::move(const_cast<key_type&>(__v.first)),
662            _VSTD::move(__v.second));
663    }
664
665    _LIBCPP_INLINE_VISIBILITY
666    __value_type& operator=(const __value_type& __v)
667    {
668        __ref() = __v.__get_value();
669        return *this;
670    }
671
672    _LIBCPP_INLINE_VISIBILITY
673    __value_type& operator=(__value_type&& __v)
674    {
675        __ref() = __v.__move();
676        return *this;
677    }
678
679    template <class _ValueTp,
680              class = typename enable_if<
681                    __is_same_uncvref<_ValueTp, value_type>::value
682                 >::type
683             >
684    _LIBCPP_INLINE_VISIBILITY
685    __value_type& operator=(_ValueTp&& __v)
686    {
687        __ref() = _VSTD::forward<_ValueTp>(__v);
688        return *this;
689    }
690
691private:
692    __value_type() _LIBCPP_EQUAL_DELETE;
693    ~__value_type() _LIBCPP_EQUAL_DELETE;
694    __value_type(const __value_type& __v) _LIBCPP_EQUAL_DELETE;
695    __value_type(__value_type&& __v) _LIBCPP_EQUAL_DELETE;
696};
697
698#else
699
700template <class _Key, class _Tp>
701struct __value_type
702{
703    typedef _Key                                     key_type;
704    typedef _Tp                                      mapped_type;
705    typedef pair<const key_type, mapped_type>        value_type;
706
707private:
708    value_type __cc;
709
710public:
711    _LIBCPP_INLINE_VISIBILITY
712    value_type& __get_value() { return __cc; }
713    _LIBCPP_INLINE_VISIBILITY
714    const value_type& __get_value() const { return __cc; }
715
716private:
717   __value_type();
718   __value_type(__value_type const&);
719   __value_type& operator=(__value_type const&);
720   ~__value_type();
721};
722
723#endif // _LIBCPP_CXX03_LANG
724
725template <class _Tp>
726struct __extract_key_value_types;
727
728template <class _Key, class _Tp>
729struct __extract_key_value_types<__value_type<_Key, _Tp> >
730{
731  typedef _Key const __key_type;
732  typedef _Tp        __mapped_type;
733};
734
735template <class _TreeIterator>
736class _LIBCPP_TEMPLATE_VIS __map_iterator
737{
738    typedef typename _TreeIterator::_NodeTypes                   _NodeTypes;
739    typedef typename _TreeIterator::__pointer_traits             __pointer_traits;
740
741    _TreeIterator __i_;
742
743public:
744    typedef bidirectional_iterator_tag                           iterator_category;
745    typedef typename _NodeTypes::__map_value_type                value_type;
746    typedef typename _TreeIterator::difference_type              difference_type;
747    typedef value_type&                                          reference;
748    typedef typename _NodeTypes::__map_value_type_pointer        pointer;
749
750    _LIBCPP_INLINE_VISIBILITY
751    __map_iterator() _NOEXCEPT {}
752
753    _LIBCPP_INLINE_VISIBILITY
754    __map_iterator(_TreeIterator __i) _NOEXCEPT : __i_(__i) {}
755
756    _LIBCPP_INLINE_VISIBILITY
757    reference operator*() const {return __i_->__get_value();}
758    _LIBCPP_INLINE_VISIBILITY
759    pointer operator->() const {return pointer_traits<pointer>::pointer_to(__i_->__get_value());}
760
761    _LIBCPP_INLINE_VISIBILITY
762    __map_iterator& operator++() {++__i_; return *this;}
763    _LIBCPP_INLINE_VISIBILITY
764    __map_iterator operator++(int)
765    {
766        __map_iterator __t(*this);
767        ++(*this);
768        return __t;
769    }
770
771    _LIBCPP_INLINE_VISIBILITY
772    __map_iterator& operator--() {--__i_; return *this;}
773    _LIBCPP_INLINE_VISIBILITY
774    __map_iterator operator--(int)
775    {
776        __map_iterator __t(*this);
777        --(*this);
778        return __t;
779    }
780
781    friend _LIBCPP_INLINE_VISIBILITY
782    bool operator==(const __map_iterator& __x, const __map_iterator& __y)
783        {return __x.__i_ == __y.__i_;}
784    friend
785    _LIBCPP_INLINE_VISIBILITY
786    bool operator!=(const __map_iterator& __x, const __map_iterator& __y)
787        {return __x.__i_ != __y.__i_;}
788
789    template <class, class, class, class> friend class _LIBCPP_TEMPLATE_VIS map;
790    template <class, class, class, class> friend class _LIBCPP_TEMPLATE_VIS multimap;
791    template <class> friend class _LIBCPP_TEMPLATE_VIS __map_const_iterator;
792};
793
794template <class _TreeIterator>
795class _LIBCPP_TEMPLATE_VIS __map_const_iterator
796{
797    typedef typename _TreeIterator::_NodeTypes                   _NodeTypes;
798    typedef typename _TreeIterator::__pointer_traits             __pointer_traits;
799
800    _TreeIterator __i_;
801
802public:
803    typedef bidirectional_iterator_tag                           iterator_category;
804    typedef typename _NodeTypes::__map_value_type                value_type;
805    typedef typename _TreeIterator::difference_type              difference_type;
806    typedef const value_type&                                    reference;
807    typedef typename _NodeTypes::__const_map_value_type_pointer  pointer;
808
809    _LIBCPP_INLINE_VISIBILITY
810    __map_const_iterator() _NOEXCEPT {}
811
812    _LIBCPP_INLINE_VISIBILITY
813    __map_const_iterator(_TreeIterator __i) _NOEXCEPT : __i_(__i) {}
814    _LIBCPP_INLINE_VISIBILITY
815    __map_const_iterator(__map_iterator<
816        typename _TreeIterator::__non_const_iterator> __i) _NOEXCEPT
817        : __i_(__i.__i_) {}
818
819    _LIBCPP_INLINE_VISIBILITY
820    reference operator*() const {return __i_->__get_value();}
821    _LIBCPP_INLINE_VISIBILITY
822    pointer operator->() const {return pointer_traits<pointer>::pointer_to(__i_->__get_value());}
823
824    _LIBCPP_INLINE_VISIBILITY
825    __map_const_iterator& operator++() {++__i_; return *this;}
826    _LIBCPP_INLINE_VISIBILITY
827    __map_const_iterator operator++(int)
828    {
829        __map_const_iterator __t(*this);
830        ++(*this);
831        return __t;
832    }
833
834    _LIBCPP_INLINE_VISIBILITY
835    __map_const_iterator& operator--() {--__i_; return *this;}
836    _LIBCPP_INLINE_VISIBILITY
837    __map_const_iterator operator--(int)
838    {
839        __map_const_iterator __t(*this);
840        --(*this);
841        return __t;
842    }
843
844    friend _LIBCPP_INLINE_VISIBILITY
845    bool operator==(const __map_const_iterator& __x, const __map_const_iterator& __y)
846        {return __x.__i_ == __y.__i_;}
847    friend _LIBCPP_INLINE_VISIBILITY
848    bool operator!=(const __map_const_iterator& __x, const __map_const_iterator& __y)
849        {return __x.__i_ != __y.__i_;}
850
851    template <class, class, class, class> friend class _LIBCPP_TEMPLATE_VIS map;
852    template <class, class, class, class> friend class _LIBCPP_TEMPLATE_VIS multimap;
853    template <class, class, class> friend class _LIBCPP_TEMPLATE_VIS __tree_const_iterator;
854};
855
856template <class _Key, class _Tp, class _Compare = less<_Key>,
857          class _Allocator = allocator<pair<const _Key, _Tp> > >
858class _LIBCPP_TEMPLATE_VIS map
859{
860public:
861    // types:
862    typedef _Key                                     key_type;
863    typedef _Tp                                      mapped_type;
864    typedef pair<const key_type, mapped_type>        value_type;
865    typedef _Compare                                 key_compare;
866    typedef _Allocator                               allocator_type;
867    typedef value_type&                              reference;
868    typedef const value_type&                        const_reference;
869
870    static_assert((is_same<typename allocator_type::value_type, value_type>::value),
871                  "Allocator::value_type must be same type as value_type");
872
873    class _LIBCPP_TEMPLATE_VIS value_compare
874        : public binary_function<value_type, value_type, bool>
875    {
876        friend class map;
877    protected:
878        key_compare comp;
879
880        _LIBCPP_INLINE_VISIBILITY value_compare(key_compare c) : comp(c) {}
881    public:
882        _LIBCPP_INLINE_VISIBILITY
883        bool operator()(const value_type& __x, const value_type& __y) const
884            {return comp(__x.first, __y.first);}
885    };
886
887private:
888
889    typedef _VSTD::__value_type<key_type, mapped_type>             __value_type;
890    typedef __map_value_compare<key_type, __value_type, key_compare> __vc;
891    typedef typename __rebind_alloc_helper<allocator_traits<allocator_type>,
892                                                 __value_type>::type __allocator_type;
893    typedef __tree<__value_type, __vc, __allocator_type>   __base;
894    typedef typename __base::__node_traits                 __node_traits;
895    typedef allocator_traits<allocator_type>               __alloc_traits;
896
897    __base __tree_;
898
899public:
900    typedef typename __alloc_traits::pointer               pointer;
901    typedef typename __alloc_traits::const_pointer         const_pointer;
902    typedef typename __alloc_traits::size_type             size_type;
903    typedef typename __alloc_traits::difference_type       difference_type;
904    typedef __map_iterator<typename __base::iterator>             iterator;
905    typedef __map_const_iterator<typename __base::const_iterator> const_iterator;
906    typedef _VSTD::reverse_iterator<iterator>               reverse_iterator;
907    typedef _VSTD::reverse_iterator<const_iterator>         const_reverse_iterator;
908
909    _LIBCPP_INLINE_VISIBILITY
910    map()
911        _NOEXCEPT_(
912            is_nothrow_default_constructible<allocator_type>::value &&
913            is_nothrow_default_constructible<key_compare>::value &&
914            is_nothrow_copy_constructible<key_compare>::value)
915        : __tree_(__vc(key_compare())) {}
916
917    _LIBCPP_INLINE_VISIBILITY
918    explicit map(const key_compare& __comp)
919        _NOEXCEPT_(
920            is_nothrow_default_constructible<allocator_type>::value &&
921            is_nothrow_copy_constructible<key_compare>::value)
922        : __tree_(__vc(__comp)) {}
923
924    _LIBCPP_INLINE_VISIBILITY
925    explicit map(const key_compare& __comp, const allocator_type& __a)
926        : __tree_(__vc(__comp), typename __base::allocator_type(__a)) {}
927
928    template <class _InputIterator>
929    _LIBCPP_INLINE_VISIBILITY
930        map(_InputIterator __f, _InputIterator __l,
931            const key_compare& __comp = key_compare())
932        : __tree_(__vc(__comp))
933        {
934            insert(__f, __l);
935        }
936
937    template <class _InputIterator>
938    _LIBCPP_INLINE_VISIBILITY
939        map(_InputIterator __f, _InputIterator __l,
940            const key_compare& __comp, const allocator_type& __a)
941        : __tree_(__vc(__comp), typename __base::allocator_type(__a))
942        {
943            insert(__f, __l);
944        }
945
946#if _LIBCPP_STD_VER > 11
947    template <class _InputIterator>
948    _LIBCPP_INLINE_VISIBILITY
949    map(_InputIterator __f, _InputIterator __l, const allocator_type& __a)
950        : map(__f, __l, key_compare(), __a) {}
951#endif
952
953    _LIBCPP_INLINE_VISIBILITY
954    map(const map& __m)
955        : __tree_(__m.__tree_)
956        {
957            insert(__m.begin(), __m.end());
958        }
959
960    _LIBCPP_INLINE_VISIBILITY
961    map& operator=(const map& __m)
962        {
963#ifndef _LIBCPP_CXX03_LANG
964            __tree_ = __m.__tree_;
965#else
966            if (this != &__m) {
967                __tree_.clear();
968                __tree_.value_comp() = __m.__tree_.value_comp();
969                __tree_.__copy_assign_alloc(__m.__tree_);
970                insert(__m.begin(), __m.end());
971            }
972#endif
973            return *this;
974        }
975
976#ifndef _LIBCPP_CXX03_LANG
977
978    _LIBCPP_INLINE_VISIBILITY
979    map(map&& __m)
980        _NOEXCEPT_(is_nothrow_move_constructible<__base>::value)
981        : __tree_(_VSTD::move(__m.__tree_))
982        {
983        }
984
985    map(map&& __m, const allocator_type& __a);
986
987    _LIBCPP_INLINE_VISIBILITY
988    map& operator=(map&& __m)
989        _NOEXCEPT_(is_nothrow_move_assignable<__base>::value)
990        {
991            __tree_ = _VSTD::move(__m.__tree_);
992            return *this;
993        }
994
995    _LIBCPP_INLINE_VISIBILITY
996    map(initializer_list<value_type> __il, const key_compare& __comp = key_compare())
997        : __tree_(__vc(__comp))
998        {
999            insert(__il.begin(), __il.end());
1000        }
1001
1002    _LIBCPP_INLINE_VISIBILITY
1003    map(initializer_list<value_type> __il, const key_compare& __comp, const allocator_type& __a)
1004        : __tree_(__vc(__comp), typename __base::allocator_type(__a))
1005        {
1006            insert(__il.begin(), __il.end());
1007        }
1008
1009#if _LIBCPP_STD_VER > 11
1010    _LIBCPP_INLINE_VISIBILITY
1011    map(initializer_list<value_type> __il, const allocator_type& __a)
1012        : map(__il, key_compare(), __a) {}
1013#endif
1014
1015    _LIBCPP_INLINE_VISIBILITY
1016    map& operator=(initializer_list<value_type> __il)
1017        {
1018            __tree_.__assign_unique(__il.begin(), __il.end());
1019            return *this;
1020        }
1021
1022#endif  // _LIBCPP_CXX03_LANG
1023
1024    _LIBCPP_INLINE_VISIBILITY
1025    explicit map(const allocator_type& __a)
1026        : __tree_(typename __base::allocator_type(__a))
1027        {
1028        }
1029
1030    _LIBCPP_INLINE_VISIBILITY
1031    map(const map& __m, const allocator_type& __a)
1032        : __tree_(__m.__tree_.value_comp(), typename __base::allocator_type(__a))
1033        {
1034            insert(__m.begin(), __m.end());
1035        }
1036
1037    _LIBCPP_INLINE_VISIBILITY
1038          iterator begin() _NOEXCEPT {return __tree_.begin();}
1039    _LIBCPP_INLINE_VISIBILITY
1040    const_iterator begin() const _NOEXCEPT {return __tree_.begin();}
1041    _LIBCPP_INLINE_VISIBILITY
1042          iterator end() _NOEXCEPT {return __tree_.end();}
1043    _LIBCPP_INLINE_VISIBILITY
1044    const_iterator end() const _NOEXCEPT {return __tree_.end();}
1045
1046    _LIBCPP_INLINE_VISIBILITY
1047          reverse_iterator rbegin() _NOEXCEPT {return reverse_iterator(end());}
1048    _LIBCPP_INLINE_VISIBILITY
1049    const_reverse_iterator rbegin() const _NOEXCEPT
1050        {return const_reverse_iterator(end());}
1051    _LIBCPP_INLINE_VISIBILITY
1052          reverse_iterator rend() _NOEXCEPT
1053            {return       reverse_iterator(begin());}
1054    _LIBCPP_INLINE_VISIBILITY
1055    const_reverse_iterator rend() const _NOEXCEPT
1056        {return const_reverse_iterator(begin());}
1057
1058    _LIBCPP_INLINE_VISIBILITY
1059    const_iterator cbegin() const _NOEXCEPT {return begin();}
1060    _LIBCPP_INLINE_VISIBILITY
1061    const_iterator cend() const _NOEXCEPT {return end();}
1062    _LIBCPP_INLINE_VISIBILITY
1063    const_reverse_iterator crbegin() const _NOEXCEPT {return rbegin();}
1064    _LIBCPP_INLINE_VISIBILITY
1065    const_reverse_iterator crend() const _NOEXCEPT {return rend();}
1066
1067    _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY
1068    bool      empty() const _NOEXCEPT {return __tree_.size() == 0;}
1069    _LIBCPP_INLINE_VISIBILITY
1070    size_type size() const _NOEXCEPT {return __tree_.size();}
1071    _LIBCPP_INLINE_VISIBILITY
1072    size_type max_size() const _NOEXCEPT {return __tree_.max_size();}
1073
1074    mapped_type& operator[](const key_type& __k);
1075#ifndef _LIBCPP_CXX03_LANG
1076    mapped_type& operator[](key_type&& __k);
1077#endif
1078
1079          mapped_type& at(const key_type& __k);
1080    const mapped_type& at(const key_type& __k) const;
1081
1082    _LIBCPP_INLINE_VISIBILITY
1083    allocator_type get_allocator() const _NOEXCEPT {return allocator_type(__tree_.__alloc());}
1084    _LIBCPP_INLINE_VISIBILITY
1085    key_compare    key_comp()      const {return __tree_.value_comp().key_comp();}
1086    _LIBCPP_INLINE_VISIBILITY
1087    value_compare  value_comp()    const {return value_compare(__tree_.value_comp().key_comp());}
1088
1089#ifndef _LIBCPP_CXX03_LANG
1090    template <class ..._Args>
1091    _LIBCPP_INLINE_VISIBILITY
1092    pair<iterator, bool> emplace(_Args&& ...__args) {
1093        return __tree_.__emplace_unique(_VSTD::forward<_Args>(__args)...);
1094    }
1095
1096    template <class ..._Args>
1097    _LIBCPP_INLINE_VISIBILITY
1098    iterator emplace_hint(const_iterator __p, _Args&& ...__args) {
1099        return __tree_.__emplace_hint_unique(__p.__i_, _VSTD::forward<_Args>(__args)...);
1100    }
1101
1102    template <class _Pp,
1103              class = typename enable_if<is_constructible<value_type, _Pp>::value>::type>
1104        _LIBCPP_INLINE_VISIBILITY
1105        pair<iterator, bool> insert(_Pp&& __p)
1106            {return __tree_.__insert_unique(_VSTD::forward<_Pp>(__p));}
1107
1108    template <class _Pp,
1109              class = typename enable_if<is_constructible<value_type, _Pp>::value>::type>
1110        _LIBCPP_INLINE_VISIBILITY
1111        iterator insert(const_iterator __pos, _Pp&& __p)
1112            {return __tree_.__insert_unique(__pos.__i_, _VSTD::forward<_Pp>(__p));}
1113
1114#endif  // _LIBCPP_CXX03_LANG
1115
1116    _LIBCPP_INLINE_VISIBILITY
1117    pair<iterator, bool>
1118        insert(const value_type& __v) {return __tree_.__insert_unique(__v);}
1119
1120    _LIBCPP_INLINE_VISIBILITY
1121    iterator
1122        insert(const_iterator __p, const value_type& __v)
1123            {return __tree_.__insert_unique(__p.__i_, __v);}
1124
1125#ifndef _LIBCPP_CXX03_LANG
1126    _LIBCPP_INLINE_VISIBILITY
1127    pair<iterator, bool>
1128    insert(value_type&& __v) {return __tree_.__insert_unique(_VSTD::move(__v));}
1129
1130    _LIBCPP_INLINE_VISIBILITY
1131    iterator insert(const_iterator __p,  value_type&& __v)
1132    {return __tree_.__insert_unique(__p.__i_, _VSTD::move(__v));}
1133
1134    _LIBCPP_INLINE_VISIBILITY
1135    void insert(initializer_list<value_type> __il)
1136        {insert(__il.begin(), __il.end());}
1137#endif
1138
1139    template <class _InputIterator>
1140        _LIBCPP_INLINE_VISIBILITY
1141        void insert(_InputIterator __f, _InputIterator __l)
1142        {
1143            for (const_iterator __e = cend(); __f != __l; ++__f)
1144                insert(__e.__i_, *__f);
1145        }
1146
1147#if _LIBCPP_STD_VER > 14
1148
1149    template <class... _Args>
1150        _LIBCPP_INLINE_VISIBILITY
1151        pair<iterator, bool> try_emplace(const key_type& __k, _Args&&... __args)
1152    {
1153        return __tree_.__emplace_unique_key_args(__k,
1154            _VSTD::piecewise_construct,
1155            _VSTD::forward_as_tuple(__k),
1156            _VSTD::forward_as_tuple(_VSTD::forward<_Args>(__args)...));
1157    }
1158
1159    template <class... _Args>
1160        _LIBCPP_INLINE_VISIBILITY
1161        pair<iterator, bool> try_emplace(key_type&& __k, _Args&&... __args)
1162    {
1163        return __tree_.__emplace_unique_key_args(__k,
1164            _VSTD::piecewise_construct,
1165            _VSTD::forward_as_tuple(_VSTD::move(__k)),
1166            _VSTD::forward_as_tuple(_VSTD::forward<_Args>(__args)...));
1167    }
1168
1169    template <class... _Args>
1170        _LIBCPP_INLINE_VISIBILITY
1171        iterator try_emplace(const_iterator __h, const key_type& __k, _Args&&... __args)
1172    {
1173        return __tree_.__emplace_hint_unique_key_args(__h.__i_, __k,
1174            _VSTD::piecewise_construct,
1175            _VSTD::forward_as_tuple(__k),
1176            _VSTD::forward_as_tuple(_VSTD::forward<_Args>(__args)...));
1177    }
1178
1179    template <class... _Args>
1180        _LIBCPP_INLINE_VISIBILITY
1181        iterator try_emplace(const_iterator __h, key_type&& __k, _Args&&... __args)
1182    {
1183        return __tree_.__emplace_hint_unique_key_args(__h.__i_, __k,
1184            _VSTD::piecewise_construct,
1185            _VSTD::forward_as_tuple(_VSTD::move(__k)),
1186            _VSTD::forward_as_tuple(_VSTD::forward<_Args>(__args)...));
1187    }
1188
1189    template <class _Vp>
1190        _LIBCPP_INLINE_VISIBILITY
1191        pair<iterator, bool> insert_or_assign(const key_type& __k, _Vp&& __v)
1192    {
1193        iterator __p = lower_bound(__k);
1194        if ( __p != end() && !key_comp()(__k, __p->first))
1195        {
1196            __p->second = _VSTD::forward<_Vp>(__v);
1197            return _VSTD::make_pair(__p, false);
1198        }
1199        return _VSTD::make_pair(emplace_hint(__p, __k, _VSTD::forward<_Vp>(__v)), true);
1200    }
1201
1202    template <class _Vp>
1203        _LIBCPP_INLINE_VISIBILITY
1204        pair<iterator, bool> insert_or_assign(key_type&& __k, _Vp&& __v)
1205    {
1206        iterator __p = lower_bound(__k);
1207        if ( __p != end() && !key_comp()(__k, __p->first))
1208        {
1209            __p->second = _VSTD::forward<_Vp>(__v);
1210            return _VSTD::make_pair(__p, false);
1211        }
1212        return _VSTD::make_pair(emplace_hint(__p, _VSTD::move(__k), _VSTD::forward<_Vp>(__v)), true);
1213    }
1214
1215    template <class _Vp>
1216        _LIBCPP_INLINE_VISIBILITY
1217        iterator insert_or_assign(const_iterator __h, const key_type& __k, _Vp&& __v)
1218     {
1219        iterator __p = lower_bound(__k);
1220        if ( __p != end() && !key_comp()(__k, __p->first))
1221        {
1222            __p->second = _VSTD::forward<_Vp>(__v);
1223            return __p;
1224        }
1225        return emplace_hint(__h, __k, _VSTD::forward<_Vp>(__v));
1226     }
1227
1228    template <class _Vp>
1229        _LIBCPP_INLINE_VISIBILITY
1230        iterator insert_or_assign(const_iterator __h, key_type&& __k, _Vp&& __v)
1231     {
1232        iterator __p = lower_bound(__k);
1233        if ( __p != end() && !key_comp()(__k, __p->first))
1234        {
1235            __p->second = _VSTD::forward<_Vp>(__v);
1236            return __p;
1237        }
1238        return emplace_hint(__h, _VSTD::move(__k), _VSTD::forward<_Vp>(__v));
1239     }
1240
1241#endif // _LIBCPP_STD_VER > 14
1242
1243    _LIBCPP_INLINE_VISIBILITY
1244    iterator erase(const_iterator __p) {return __tree_.erase(__p.__i_);}
1245    _LIBCPP_INLINE_VISIBILITY
1246    iterator erase(iterator __p)       {return __tree_.erase(__p.__i_);}
1247    _LIBCPP_INLINE_VISIBILITY
1248    size_type erase(const key_type& __k)
1249        {return __tree_.__erase_unique(__k);}
1250    _LIBCPP_INLINE_VISIBILITY
1251    iterator  erase(const_iterator __f, const_iterator __l)
1252        {return __tree_.erase(__f.__i_, __l.__i_);}
1253    _LIBCPP_INLINE_VISIBILITY
1254    void clear() _NOEXCEPT {__tree_.clear();}
1255
1256    _LIBCPP_INLINE_VISIBILITY
1257    void swap(map& __m)
1258        _NOEXCEPT_(__is_nothrow_swappable<__base>::value)
1259        {__tree_.swap(__m.__tree_);}
1260
1261    _LIBCPP_INLINE_VISIBILITY
1262    iterator find(const key_type& __k)             {return __tree_.find(__k);}
1263    _LIBCPP_INLINE_VISIBILITY
1264    const_iterator find(const key_type& __k) const {return __tree_.find(__k);}
1265#if _LIBCPP_STD_VER > 11
1266    template <typename _K2>
1267    _LIBCPP_INLINE_VISIBILITY
1268    typename enable_if<__is_transparent<_Compare, _K2>::value,iterator>::type
1269    find(const _K2& __k)                           {return __tree_.find(__k);}
1270    template <typename _K2>
1271    _LIBCPP_INLINE_VISIBILITY
1272    typename enable_if<__is_transparent<_Compare, _K2>::value,const_iterator>::type
1273    find(const _K2& __k) const                     {return __tree_.find(__k);}
1274#endif
1275
1276    _LIBCPP_INLINE_VISIBILITY
1277    size_type      count(const key_type& __k) const
1278        {return __tree_.__count_unique(__k);}
1279#if _LIBCPP_STD_VER > 11
1280    template <typename _K2>
1281    _LIBCPP_INLINE_VISIBILITY
1282    typename enable_if<__is_transparent<_Compare, _K2>::value,size_type>::type
1283    count(const _K2& __k) const {return __tree_.__count_multi(__k);}
1284#endif
1285    _LIBCPP_INLINE_VISIBILITY
1286    iterator lower_bound(const key_type& __k)
1287        {return __tree_.lower_bound(__k);}
1288    _LIBCPP_INLINE_VISIBILITY
1289    const_iterator lower_bound(const key_type& __k) const
1290        {return __tree_.lower_bound(__k);}
1291#if _LIBCPP_STD_VER > 11
1292    template <typename _K2>
1293    _LIBCPP_INLINE_VISIBILITY
1294    typename enable_if<__is_transparent<_Compare, _K2>::value,iterator>::type
1295    lower_bound(const _K2& __k)       {return __tree_.lower_bound(__k);}
1296
1297    template <typename _K2>
1298    _LIBCPP_INLINE_VISIBILITY
1299    typename enable_if<__is_transparent<_Compare, _K2>::value,const_iterator>::type
1300    lower_bound(const _K2& __k) const {return __tree_.lower_bound(__k);}
1301#endif
1302
1303    _LIBCPP_INLINE_VISIBILITY
1304    iterator upper_bound(const key_type& __k)
1305        {return __tree_.upper_bound(__k);}
1306    _LIBCPP_INLINE_VISIBILITY
1307    const_iterator upper_bound(const key_type& __k) const
1308        {return __tree_.upper_bound(__k);}
1309#if _LIBCPP_STD_VER > 11
1310    template <typename _K2>
1311    _LIBCPP_INLINE_VISIBILITY
1312    typename enable_if<__is_transparent<_Compare, _K2>::value,iterator>::type
1313    upper_bound(const _K2& __k)       {return __tree_.upper_bound(__k);}
1314    template <typename _K2>
1315    _LIBCPP_INLINE_VISIBILITY
1316    typename enable_if<__is_transparent<_Compare, _K2>::value,const_iterator>::type
1317    upper_bound(const _K2& __k) const {return __tree_.upper_bound(__k);}
1318#endif
1319
1320    _LIBCPP_INLINE_VISIBILITY
1321    pair<iterator,iterator> equal_range(const key_type& __k)
1322        {return __tree_.__equal_range_unique(__k);}
1323    _LIBCPP_INLINE_VISIBILITY
1324    pair<const_iterator,const_iterator> equal_range(const key_type& __k) const
1325        {return __tree_.__equal_range_unique(__k);}
1326#if _LIBCPP_STD_VER > 11
1327    template <typename _K2>
1328    _LIBCPP_INLINE_VISIBILITY
1329    typename enable_if<__is_transparent<_Compare, _K2>::value,pair<iterator,iterator>>::type
1330    equal_range(const _K2& __k)       {return __tree_.__equal_range_multi(__k);}
1331    template <typename _K2>
1332    _LIBCPP_INLINE_VISIBILITY
1333    typename enable_if<__is_transparent<_Compare, _K2>::value,pair<const_iterator,const_iterator>>::type
1334    equal_range(const _K2& __k) const {return __tree_.__equal_range_multi(__k);}
1335#endif
1336
1337private:
1338    typedef typename __base::__node                    __node;
1339    typedef typename __base::__node_allocator          __node_allocator;
1340    typedef typename __base::__node_pointer            __node_pointer;
1341    typedef typename __base::__node_base_pointer       __node_base_pointer;
1342    typedef typename __base::__parent_pointer          __parent_pointer;
1343
1344    typedef __map_node_destructor<__node_allocator> _Dp;
1345    typedef unique_ptr<__node, _Dp> __node_holder;
1346
1347#ifdef _LIBCPP_CXX03_LANG
1348    __node_holder __construct_node_with_key(const key_type& __k);
1349#endif
1350};
1351
1352
1353#ifndef _LIBCPP_CXX03_LANG
1354template <class _Key, class _Tp, class _Compare, class _Allocator>
1355map<_Key, _Tp, _Compare, _Allocator>::map(map&& __m, const allocator_type& __a)
1356    : __tree_(_VSTD::move(__m.__tree_), typename __base::allocator_type(__a))
1357{
1358    if (__a != __m.get_allocator())
1359    {
1360        const_iterator __e = cend();
1361        while (!__m.empty())
1362            __tree_.__insert_unique(__e.__i_,
1363                    __m.__tree_.remove(__m.begin().__i_)->__value_.__move());
1364    }
1365}
1366
1367template <class _Key, class _Tp, class _Compare, class _Allocator>
1368_Tp&
1369map<_Key, _Tp, _Compare, _Allocator>::operator[](const key_type& __k)
1370{
1371    return __tree_.__emplace_unique_key_args(__k,
1372        _VSTD::piecewise_construct,
1373        _VSTD::forward_as_tuple(__k),
1374        _VSTD::forward_as_tuple()).first->__get_value().second;
1375}
1376
1377template <class _Key, class _Tp, class _Compare, class _Allocator>
1378_Tp&
1379map<_Key, _Tp, _Compare, _Allocator>::operator[](key_type&& __k)
1380{
1381    return __tree_.__emplace_unique_key_args(__k,
1382        _VSTD::piecewise_construct,
1383        _VSTD::forward_as_tuple(_VSTD::move(__k)),
1384        _VSTD::forward_as_tuple()).first->__get_value().second;
1385}
1386
1387#else // _LIBCPP_CXX03_LANG
1388
1389template <class _Key, class _Tp, class _Compare, class _Allocator>
1390typename map<_Key, _Tp, _Compare, _Allocator>::__node_holder
1391map<_Key, _Tp, _Compare, _Allocator>::__construct_node_with_key(const key_type& __k)
1392{
1393    __node_allocator& __na = __tree_.__node_alloc();
1394    __node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na));
1395    __node_traits::construct(__na, _VSTD::addressof(__h->__value_.__get_value().first), __k);
1396    __h.get_deleter().__first_constructed = true;
1397    __node_traits::construct(__na, _VSTD::addressof(__h->__value_.__get_value().second));
1398    __h.get_deleter().__second_constructed = true;
1399    return _LIBCPP_EXPLICIT_MOVE(__h);  // explicitly moved for C++03
1400}
1401
1402template <class _Key, class _Tp, class _Compare, class _Allocator>
1403_Tp&
1404map<_Key, _Tp, _Compare, _Allocator>::operator[](const key_type& __k)
1405{
1406    __parent_pointer __parent;
1407    __node_base_pointer& __child = __tree_.__find_equal(__parent, __k);
1408    __node_pointer __r = static_cast<__node_pointer>(__child);
1409    if (__child == nullptr)
1410    {
1411        __node_holder __h = __construct_node_with_key(__k);
1412        __tree_.__insert_node_at(__parent, __child, static_cast<__node_base_pointer>(__h.get()));
1413        __r = __h.release();
1414    }
1415    return __r->__value_.__get_value().second;
1416}
1417
1418#endif  // _LIBCPP_CXX03_LANG
1419
1420template <class _Key, class _Tp, class _Compare, class _Allocator>
1421_Tp&
1422map<_Key, _Tp, _Compare, _Allocator>::at(const key_type& __k)
1423{
1424    __parent_pointer __parent;
1425    __node_base_pointer& __child = __tree_.__find_equal(__parent, __k);
1426#ifndef _LIBCPP_NO_EXCEPTIONS
1427    if (__child == nullptr)
1428        throw out_of_range("map::at:  key not found");
1429#endif  // _LIBCPP_NO_EXCEPTIONS
1430    return static_cast<__node_pointer>(__child)->__value_.__get_value().second;
1431}
1432
1433template <class _Key, class _Tp, class _Compare, class _Allocator>
1434const _Tp&
1435map<_Key, _Tp, _Compare, _Allocator>::at(const key_type& __k) const
1436{
1437    __parent_pointer __parent;
1438    __node_base_pointer __child = __tree_.__find_equal(__parent, __k);
1439#ifndef _LIBCPP_NO_EXCEPTIONS
1440    if (__child == nullptr)
1441        throw out_of_range("map::at:  key not found");
1442#endif  // _LIBCPP_NO_EXCEPTIONS
1443    return static_cast<__node_pointer>(__child)->__value_.__get_value().second;
1444}
1445
1446
1447template <class _Key, class _Tp, class _Compare, class _Allocator>
1448inline _LIBCPP_INLINE_VISIBILITY
1449bool
1450operator==(const map<_Key, _Tp, _Compare, _Allocator>& __x,
1451           const map<_Key, _Tp, _Compare, _Allocator>& __y)
1452{
1453    return __x.size() == __y.size() && _VSTD::equal(__x.begin(), __x.end(), __y.begin());
1454}
1455
1456template <class _Key, class _Tp, class _Compare, class _Allocator>
1457inline _LIBCPP_INLINE_VISIBILITY
1458bool
1459operator< (const map<_Key, _Tp, _Compare, _Allocator>& __x,
1460           const map<_Key, _Tp, _Compare, _Allocator>& __y)
1461{
1462    return _VSTD::lexicographical_compare(__x.begin(), __x.end(), __y.begin(), __y.end());
1463}
1464
1465template <class _Key, class _Tp, class _Compare, class _Allocator>
1466inline _LIBCPP_INLINE_VISIBILITY
1467bool
1468operator!=(const map<_Key, _Tp, _Compare, _Allocator>& __x,
1469           const map<_Key, _Tp, _Compare, _Allocator>& __y)
1470{
1471    return !(__x == __y);
1472}
1473
1474template <class _Key, class _Tp, class _Compare, class _Allocator>
1475inline _LIBCPP_INLINE_VISIBILITY
1476bool
1477operator> (const map<_Key, _Tp, _Compare, _Allocator>& __x,
1478           const map<_Key, _Tp, _Compare, _Allocator>& __y)
1479{
1480    return __y < __x;
1481}
1482
1483template <class _Key, class _Tp, class _Compare, class _Allocator>
1484inline _LIBCPP_INLINE_VISIBILITY
1485bool
1486operator>=(const map<_Key, _Tp, _Compare, _Allocator>& __x,
1487           const map<_Key, _Tp, _Compare, _Allocator>& __y)
1488{
1489    return !(__x < __y);
1490}
1491
1492template <class _Key, class _Tp, class _Compare, class _Allocator>
1493inline _LIBCPP_INLINE_VISIBILITY
1494bool
1495operator<=(const map<_Key, _Tp, _Compare, _Allocator>& __x,
1496           const map<_Key, _Tp, _Compare, _Allocator>& __y)
1497{
1498    return !(__y < __x);
1499}
1500
1501template <class _Key, class _Tp, class _Compare, class _Allocator>
1502inline _LIBCPP_INLINE_VISIBILITY
1503void
1504swap(map<_Key, _Tp, _Compare, _Allocator>& __x,
1505     map<_Key, _Tp, _Compare, _Allocator>& __y)
1506    _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
1507{
1508    __x.swap(__y);
1509}
1510
1511template <class _Key, class _Tp, class _Compare = less<_Key>,
1512          class _Allocator = allocator<pair<const _Key, _Tp> > >
1513class _LIBCPP_TEMPLATE_VIS multimap
1514{
1515public:
1516    // types:
1517    typedef _Key                                     key_type;
1518    typedef _Tp                                      mapped_type;
1519    typedef pair<const key_type, mapped_type>        value_type;
1520    typedef _Compare                                 key_compare;
1521    typedef _Allocator                               allocator_type;
1522    typedef value_type&                              reference;
1523    typedef const value_type&                        const_reference;
1524
1525    static_assert((is_same<typename allocator_type::value_type, value_type>::value),
1526                  "Allocator::value_type must be same type as value_type");
1527
1528    class _LIBCPP_TEMPLATE_VIS value_compare
1529        : public binary_function<value_type, value_type, bool>
1530    {
1531        friend class multimap;
1532    protected:
1533        key_compare comp;
1534
1535        _LIBCPP_INLINE_VISIBILITY
1536        value_compare(key_compare c) : comp(c) {}
1537    public:
1538        _LIBCPP_INLINE_VISIBILITY
1539        bool operator()(const value_type& __x, const value_type& __y) const
1540            {return comp(__x.first, __y.first);}
1541    };
1542
1543private:
1544
1545    typedef _VSTD::__value_type<key_type, mapped_type>             __value_type;
1546    typedef __map_value_compare<key_type, __value_type, key_compare> __vc;
1547    typedef typename __rebind_alloc_helper<allocator_traits<allocator_type>,
1548                                                 __value_type>::type __allocator_type;
1549    typedef __tree<__value_type, __vc, __allocator_type>            __base;
1550    typedef typename __base::__node_traits                          __node_traits;
1551    typedef allocator_traits<allocator_type>                        __alloc_traits;
1552
1553    __base __tree_;
1554
1555public:
1556    typedef typename __alloc_traits::pointer               pointer;
1557    typedef typename __alloc_traits::const_pointer         const_pointer;
1558    typedef typename __alloc_traits::size_type             size_type;
1559    typedef typename __alloc_traits::difference_type       difference_type;
1560    typedef __map_iterator<typename __base::iterator>      iterator;
1561    typedef __map_const_iterator<typename __base::const_iterator> const_iterator;
1562    typedef _VSTD::reverse_iterator<iterator>               reverse_iterator;
1563    typedef _VSTD::reverse_iterator<const_iterator>         const_reverse_iterator;
1564
1565    _LIBCPP_INLINE_VISIBILITY
1566    multimap()
1567        _NOEXCEPT_(
1568            is_nothrow_default_constructible<allocator_type>::value &&
1569            is_nothrow_default_constructible<key_compare>::value &&
1570            is_nothrow_copy_constructible<key_compare>::value)
1571        : __tree_(__vc(key_compare())) {}
1572
1573    _LIBCPP_INLINE_VISIBILITY
1574    explicit multimap(const key_compare& __comp)
1575        _NOEXCEPT_(
1576            is_nothrow_default_constructible<allocator_type>::value &&
1577            is_nothrow_copy_constructible<key_compare>::value)
1578        : __tree_(__vc(__comp)) {}
1579
1580    _LIBCPP_INLINE_VISIBILITY
1581    explicit multimap(const key_compare& __comp, const allocator_type& __a)
1582        : __tree_(__vc(__comp), typename __base::allocator_type(__a)) {}
1583
1584    template <class _InputIterator>
1585        _LIBCPP_INLINE_VISIBILITY
1586        multimap(_InputIterator __f, _InputIterator __l,
1587            const key_compare& __comp = key_compare())
1588        : __tree_(__vc(__comp))
1589        {
1590            insert(__f, __l);
1591        }
1592
1593    template <class _InputIterator>
1594        _LIBCPP_INLINE_VISIBILITY
1595        multimap(_InputIterator __f, _InputIterator __l,
1596            const key_compare& __comp, const allocator_type& __a)
1597        : __tree_(__vc(__comp), typename __base::allocator_type(__a))
1598        {
1599            insert(__f, __l);
1600        }
1601
1602#if _LIBCPP_STD_VER > 11
1603    template <class _InputIterator>
1604    _LIBCPP_INLINE_VISIBILITY
1605    multimap(_InputIterator __f, _InputIterator __l, const allocator_type& __a)
1606        : multimap(__f, __l, key_compare(), __a) {}
1607#endif
1608
1609    _LIBCPP_INLINE_VISIBILITY
1610    multimap(const multimap& __m)
1611        : __tree_(__m.__tree_.value_comp(),
1612          __alloc_traits::select_on_container_copy_construction(__m.__tree_.__alloc()))
1613        {
1614            insert(__m.begin(), __m.end());
1615        }
1616
1617    _LIBCPP_INLINE_VISIBILITY
1618    multimap& operator=(const multimap& __m)
1619        {
1620#ifndef _LIBCPP_CXX03_LANG
1621            __tree_ = __m.__tree_;
1622#else
1623            if (this != &__m) {
1624                __tree_.clear();
1625                __tree_.value_comp() = __m.__tree_.value_comp();
1626                __tree_.__copy_assign_alloc(__m.__tree_);
1627                insert(__m.begin(), __m.end());
1628            }
1629#endif
1630            return *this;
1631        }
1632
1633#ifndef _LIBCPP_CXX03_LANG
1634
1635    _LIBCPP_INLINE_VISIBILITY
1636    multimap(multimap&& __m)
1637        _NOEXCEPT_(is_nothrow_move_constructible<__base>::value)
1638        : __tree_(_VSTD::move(__m.__tree_))
1639        {
1640        }
1641
1642    multimap(multimap&& __m, const allocator_type& __a);
1643
1644    _LIBCPP_INLINE_VISIBILITY
1645    multimap& operator=(multimap&& __m)
1646        _NOEXCEPT_(is_nothrow_move_assignable<__base>::value)
1647        {
1648            __tree_ = _VSTD::move(__m.__tree_);
1649            return *this;
1650        }
1651
1652    _LIBCPP_INLINE_VISIBILITY
1653    multimap(initializer_list<value_type> __il, const key_compare& __comp = key_compare())
1654        : __tree_(__vc(__comp))
1655        {
1656            insert(__il.begin(), __il.end());
1657        }
1658
1659    _LIBCPP_INLINE_VISIBILITY
1660    multimap(initializer_list<value_type> __il, const key_compare& __comp, const allocator_type& __a)
1661        : __tree_(__vc(__comp), typename __base::allocator_type(__a))
1662        {
1663            insert(__il.begin(), __il.end());
1664        }
1665
1666#if _LIBCPP_STD_VER > 11
1667    _LIBCPP_INLINE_VISIBILITY
1668    multimap(initializer_list<value_type> __il, const allocator_type& __a)
1669        : multimap(__il, key_compare(), __a) {}
1670#endif
1671
1672    _LIBCPP_INLINE_VISIBILITY
1673    multimap& operator=(initializer_list<value_type> __il)
1674        {
1675            __tree_.__assign_multi(__il.begin(), __il.end());
1676            return *this;
1677        }
1678
1679#endif  // _LIBCPP_CXX03_LANG
1680
1681    _LIBCPP_INLINE_VISIBILITY
1682    explicit multimap(const allocator_type& __a)
1683        : __tree_(typename __base::allocator_type(__a))
1684        {
1685        }
1686
1687    _LIBCPP_INLINE_VISIBILITY
1688    multimap(const multimap& __m, const allocator_type& __a)
1689        : __tree_(__m.__tree_.value_comp(), typename __base::allocator_type(__a))
1690        {
1691            insert(__m.begin(), __m.end());
1692        }
1693
1694    _LIBCPP_INLINE_VISIBILITY
1695          iterator begin() _NOEXCEPT {return __tree_.begin();}
1696    _LIBCPP_INLINE_VISIBILITY
1697    const_iterator begin() const _NOEXCEPT {return __tree_.begin();}
1698    _LIBCPP_INLINE_VISIBILITY
1699          iterator end() _NOEXCEPT {return __tree_.end();}
1700    _LIBCPP_INLINE_VISIBILITY
1701    const_iterator end() const _NOEXCEPT {return __tree_.end();}
1702
1703    _LIBCPP_INLINE_VISIBILITY
1704          reverse_iterator rbegin() _NOEXCEPT {return reverse_iterator(end());}
1705    _LIBCPP_INLINE_VISIBILITY
1706    const_reverse_iterator rbegin() const _NOEXCEPT
1707        {return const_reverse_iterator(end());}
1708    _LIBCPP_INLINE_VISIBILITY
1709          reverse_iterator rend() _NOEXCEPT {return reverse_iterator(begin());}
1710    _LIBCPP_INLINE_VISIBILITY
1711    const_reverse_iterator rend() const _NOEXCEPT
1712        {return const_reverse_iterator(begin());}
1713
1714    _LIBCPP_INLINE_VISIBILITY
1715    const_iterator cbegin()  const _NOEXCEPT {return begin();}
1716    _LIBCPP_INLINE_VISIBILITY
1717    const_iterator cend() const _NOEXCEPT {return end();}
1718    _LIBCPP_INLINE_VISIBILITY
1719    const_reverse_iterator crbegin() const _NOEXCEPT {return rbegin();}
1720    _LIBCPP_INLINE_VISIBILITY
1721    const_reverse_iterator crend() const _NOEXCEPT {return rend();}
1722
1723    _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY
1724    bool empty() const _NOEXCEPT {return __tree_.size() == 0;}
1725    _LIBCPP_INLINE_VISIBILITY
1726    size_type size() const _NOEXCEPT {return __tree_.size();}
1727    _LIBCPP_INLINE_VISIBILITY
1728    size_type max_size() const _NOEXCEPT {return __tree_.max_size();}
1729
1730    _LIBCPP_INLINE_VISIBILITY
1731    allocator_type get_allocator() const _NOEXCEPT {return allocator_type(__tree_.__alloc());}
1732    _LIBCPP_INLINE_VISIBILITY
1733    key_compare    key_comp() const {return __tree_.value_comp().key_comp();}
1734    _LIBCPP_INLINE_VISIBILITY
1735    value_compare  value_comp() const
1736        {return value_compare(__tree_.value_comp().key_comp());}
1737
1738#ifndef _LIBCPP_CXX03_LANG
1739
1740    template <class ..._Args>
1741    _LIBCPP_INLINE_VISIBILITY
1742    iterator emplace(_Args&& ...__args) {
1743        return __tree_.__emplace_multi(_VSTD::forward<_Args>(__args)...);
1744    }
1745
1746    template <class ..._Args>
1747    _LIBCPP_INLINE_VISIBILITY
1748    iterator emplace_hint(const_iterator __p, _Args&& ...__args) {
1749        return __tree_.__emplace_hint_multi(__p.__i_, _VSTD::forward<_Args>(__args)...);
1750    }
1751
1752    template <class _Pp,
1753              class = typename enable_if<is_constructible<value_type, _Pp>::value>::type>
1754        _LIBCPP_INLINE_VISIBILITY
1755        iterator insert(_Pp&& __p)
1756            {return __tree_.__insert_multi(_VSTD::forward<_Pp>(__p));}
1757
1758    template <class _Pp,
1759              class = typename enable_if<is_constructible<value_type, _Pp>::value>::type>
1760        _LIBCPP_INLINE_VISIBILITY
1761        iterator insert(const_iterator __pos, _Pp&& __p)
1762            {return __tree_.__insert_multi(__pos.__i_, _VSTD::forward<_Pp>(__p));}
1763
1764    _LIBCPP_INLINE_VISIBILITY
1765    iterator insert(value_type&& __v)
1766        {return __tree_.__insert_multi(_VSTD::move(__v));}
1767
1768    _LIBCPP_INLINE_VISIBILITY
1769    iterator insert(const_iterator __p, value_type&& __v)
1770        {return __tree_.__insert_multi(__p.__i_, _VSTD::move(__v));}
1771
1772
1773    _LIBCPP_INLINE_VISIBILITY
1774    void insert(initializer_list<value_type> __il)
1775        {insert(__il.begin(), __il.end());}
1776
1777#endif  // _LIBCPP_CXX03_LANG
1778
1779    _LIBCPP_INLINE_VISIBILITY
1780    iterator insert(const value_type& __v) {return __tree_.__insert_multi(__v);}
1781
1782    _LIBCPP_INLINE_VISIBILITY
1783    iterator insert(const_iterator __p, const value_type& __v)
1784            {return __tree_.__insert_multi(__p.__i_, __v);}
1785
1786    template <class _InputIterator>
1787        _LIBCPP_INLINE_VISIBILITY
1788        void insert(_InputIterator __f, _InputIterator __l)
1789        {
1790            for (const_iterator __e = cend(); __f != __l; ++__f)
1791                __tree_.__insert_multi(__e.__i_, *__f);
1792        }
1793
1794    _LIBCPP_INLINE_VISIBILITY
1795    iterator erase(const_iterator __p) {return __tree_.erase(__p.__i_);}
1796    _LIBCPP_INLINE_VISIBILITY
1797    iterator erase(iterator __p)       {return __tree_.erase(__p.__i_);}
1798    _LIBCPP_INLINE_VISIBILITY
1799    size_type erase(const key_type& __k) {return __tree_.__erase_multi(__k);}
1800    _LIBCPP_INLINE_VISIBILITY
1801    iterator  erase(const_iterator __f, const_iterator __l)
1802        {return __tree_.erase(__f.__i_, __l.__i_);}
1803    _LIBCPP_INLINE_VISIBILITY
1804    void clear() {__tree_.clear();}
1805
1806    _LIBCPP_INLINE_VISIBILITY
1807    void swap(multimap& __m)
1808        _NOEXCEPT_(__is_nothrow_swappable<__base>::value)
1809        {__tree_.swap(__m.__tree_);}
1810
1811    _LIBCPP_INLINE_VISIBILITY
1812    iterator find(const key_type& __k)             {return __tree_.find(__k);}
1813    _LIBCPP_INLINE_VISIBILITY
1814    const_iterator find(const key_type& __k) const {return __tree_.find(__k);}
1815#if _LIBCPP_STD_VER > 11
1816    template <typename _K2>
1817    _LIBCPP_INLINE_VISIBILITY
1818    typename enable_if<__is_transparent<_Compare, _K2>::value,iterator>::type
1819    find(const _K2& __k)                           {return __tree_.find(__k);}
1820    template <typename _K2>
1821    _LIBCPP_INLINE_VISIBILITY
1822    typename enable_if<__is_transparent<_Compare, _K2>::value,const_iterator>::type
1823    find(const _K2& __k) const                     {return __tree_.find(__k);}
1824#endif
1825
1826    _LIBCPP_INLINE_VISIBILITY
1827    size_type      count(const key_type& __k) const
1828        {return __tree_.__count_multi(__k);}
1829#if _LIBCPP_STD_VER > 11
1830    template <typename _K2>
1831    _LIBCPP_INLINE_VISIBILITY
1832    typename enable_if<__is_transparent<_Compare, _K2>::value,size_type>::type
1833    count(const _K2& __k) const {return __tree_.__count_multi(__k);}
1834#endif
1835    _LIBCPP_INLINE_VISIBILITY
1836    iterator lower_bound(const key_type& __k)
1837        {return __tree_.lower_bound(__k);}
1838    _LIBCPP_INLINE_VISIBILITY
1839    const_iterator lower_bound(const key_type& __k) const
1840            {return __tree_.lower_bound(__k);}
1841#if _LIBCPP_STD_VER > 11
1842    template <typename _K2>
1843    _LIBCPP_INLINE_VISIBILITY
1844    typename enable_if<__is_transparent<_Compare, _K2>::value,iterator>::type
1845    lower_bound(const _K2& __k)       {return __tree_.lower_bound(__k);}
1846
1847    template <typename _K2>
1848    _LIBCPP_INLINE_VISIBILITY
1849    typename enable_if<__is_transparent<_Compare, _K2>::value,const_iterator>::type
1850    lower_bound(const _K2& __k) const {return __tree_.lower_bound(__k);}
1851#endif
1852
1853    _LIBCPP_INLINE_VISIBILITY
1854    iterator upper_bound(const key_type& __k)
1855            {return __tree_.upper_bound(__k);}
1856    _LIBCPP_INLINE_VISIBILITY
1857    const_iterator upper_bound(const key_type& __k) const
1858            {return __tree_.upper_bound(__k);}
1859#if _LIBCPP_STD_VER > 11
1860    template <typename _K2>
1861    _LIBCPP_INLINE_VISIBILITY
1862    typename enable_if<__is_transparent<_Compare, _K2>::value,iterator>::type
1863    upper_bound(const _K2& __k)       {return __tree_.upper_bound(__k);}
1864    template <typename _K2>
1865    _LIBCPP_INLINE_VISIBILITY
1866    typename enable_if<__is_transparent<_Compare, _K2>::value,const_iterator>::type
1867    upper_bound(const _K2& __k) const {return __tree_.upper_bound(__k);}
1868#endif
1869
1870    _LIBCPP_INLINE_VISIBILITY
1871    pair<iterator,iterator>             equal_range(const key_type& __k)
1872            {return __tree_.__equal_range_multi(__k);}
1873    _LIBCPP_INLINE_VISIBILITY
1874    pair<const_iterator,const_iterator> equal_range(const key_type& __k) const
1875            {return __tree_.__equal_range_multi(__k);}
1876#if _LIBCPP_STD_VER > 11
1877    template <typename _K2>
1878    _LIBCPP_INLINE_VISIBILITY
1879    typename enable_if<__is_transparent<_Compare, _K2>::value,pair<iterator,iterator>>::type
1880    equal_range(const _K2& __k)       {return __tree_.__equal_range_multi(__k);}
1881    template <typename _K2>
1882    _LIBCPP_INLINE_VISIBILITY
1883    typename enable_if<__is_transparent<_Compare, _K2>::value,pair<const_iterator,const_iterator>>::type
1884    equal_range(const _K2& __k) const {return __tree_.__equal_range_multi(__k);}
1885#endif
1886
1887private:
1888    typedef typename __base::__node                    __node;
1889    typedef typename __base::__node_allocator          __node_allocator;
1890    typedef typename __base::__node_pointer            __node_pointer;
1891
1892    typedef __map_node_destructor<__node_allocator> _Dp;
1893    typedef unique_ptr<__node, _Dp> __node_holder;
1894};
1895
1896#ifndef _LIBCPP_CXX03_LANG
1897template <class _Key, class _Tp, class _Compare, class _Allocator>
1898multimap<_Key, _Tp, _Compare, _Allocator>::multimap(multimap&& __m, const allocator_type& __a)
1899    : __tree_(_VSTD::move(__m.__tree_), typename __base::allocator_type(__a))
1900{
1901    if (__a != __m.get_allocator())
1902    {
1903        const_iterator __e = cend();
1904        while (!__m.empty())
1905            __tree_.__insert_multi(__e.__i_,
1906                    _VSTD::move(__m.__tree_.remove(__m.begin().__i_)->__value_.__move()));
1907    }
1908}
1909#endif
1910
1911template <class _Key, class _Tp, class _Compare, class _Allocator>
1912inline _LIBCPP_INLINE_VISIBILITY
1913bool
1914operator==(const multimap<_Key, _Tp, _Compare, _Allocator>& __x,
1915           const multimap<_Key, _Tp, _Compare, _Allocator>& __y)
1916{
1917    return __x.size() == __y.size() && _VSTD::equal(__x.begin(), __x.end(), __y.begin());
1918}
1919
1920template <class _Key, class _Tp, class _Compare, class _Allocator>
1921inline _LIBCPP_INLINE_VISIBILITY
1922bool
1923operator< (const multimap<_Key, _Tp, _Compare, _Allocator>& __x,
1924           const multimap<_Key, _Tp, _Compare, _Allocator>& __y)
1925{
1926    return _VSTD::lexicographical_compare(__x.begin(), __x.end(), __y.begin(), __y.end());
1927}
1928
1929template <class _Key, class _Tp, class _Compare, class _Allocator>
1930inline _LIBCPP_INLINE_VISIBILITY
1931bool
1932operator!=(const multimap<_Key, _Tp, _Compare, _Allocator>& __x,
1933           const multimap<_Key, _Tp, _Compare, _Allocator>& __y)
1934{
1935    return !(__x == __y);
1936}
1937
1938template <class _Key, class _Tp, class _Compare, class _Allocator>
1939inline _LIBCPP_INLINE_VISIBILITY
1940bool
1941operator> (const multimap<_Key, _Tp, _Compare, _Allocator>& __x,
1942           const multimap<_Key, _Tp, _Compare, _Allocator>& __y)
1943{
1944    return __y < __x;
1945}
1946
1947template <class _Key, class _Tp, class _Compare, class _Allocator>
1948inline _LIBCPP_INLINE_VISIBILITY
1949bool
1950operator>=(const multimap<_Key, _Tp, _Compare, _Allocator>& __x,
1951           const multimap<_Key, _Tp, _Compare, _Allocator>& __y)
1952{
1953    return !(__x < __y);
1954}
1955
1956template <class _Key, class _Tp, class _Compare, class _Allocator>
1957inline _LIBCPP_INLINE_VISIBILITY
1958bool
1959operator<=(const multimap<_Key, _Tp, _Compare, _Allocator>& __x,
1960           const multimap<_Key, _Tp, _Compare, _Allocator>& __y)
1961{
1962    return !(__y < __x);
1963}
1964
1965template <class _Key, class _Tp, class _Compare, class _Allocator>
1966inline _LIBCPP_INLINE_VISIBILITY
1967void
1968swap(multimap<_Key, _Tp, _Compare, _Allocator>& __x,
1969     multimap<_Key, _Tp, _Compare, _Allocator>& __y)
1970    _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
1971{
1972    __x.swap(__y);
1973}
1974
1975_LIBCPP_END_NAMESPACE_STD
1976
1977#endif  // _LIBCPP_MAP
1978