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.__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
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.__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
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_.__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
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>
617union __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
645private:
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
654template <class _Key, class _Tp>
655struct __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
663private:
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
672template <class _Tp>
673struct __extract_key_value_types;
674
675template <class _Key, class _Tp>
676struct __extract_key_value_types<__value_type<_Key, _Tp> >
677{
678  typedef _Key const __key_type;
679  typedef _Tp        __mapped_type;
680};
681
682template <class _TreeIterator>
683class _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
690public:
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
741template <class _TreeIterator>
742class _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
749public:
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
803template <class _Key, class _Tp, class _Compare = less<_Key>,
804          class _Allocator = allocator<pair<const _Key, _Tp> > >
805class _LIBCPP_TEMPLATE_VIS map
806{
807public:
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
835private:
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
847public:
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
1285private:
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
1302template <class _Key, class _Tp, class _Compare, class _Allocator>
1303map<_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
1315template <class _Key, class _Tp, class _Compare, class _Allocator>
1316_Tp&
1317map<_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
1325template <class _Key, class _Tp, class _Compare, class _Allocator>
1326_Tp&
1327map<_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
1337template <class _Key, class _Tp, class _Compare, class _Allocator>
1338typename map<_Key, _Tp, _Compare, _Allocator>::__node_holder
1339map<_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
1350template <class _Key, class _Tp, class _Compare, class _Allocator>
1351_Tp&
1352map<_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
1368template <class _Key, class _Tp, class _Compare, class _Allocator>
1369_Tp&
1370map<_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
1381template <class _Key, class _Tp, class _Compare, class _Allocator>
1382const _Tp&
1383map<_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
1395template <class _Key, class _Tp, class _Compare, class _Allocator>
1396inline _LIBCPP_INLINE_VISIBILITY
1397bool
1398operator==(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
1404template <class _Key, class _Tp, class _Compare, class _Allocator>
1405inline _LIBCPP_INLINE_VISIBILITY
1406bool
1407operator< (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
1413template <class _Key, class _Tp, class _Compare, class _Allocator>
1414inline _LIBCPP_INLINE_VISIBILITY
1415bool
1416operator!=(const map<_Key, _Tp, _Compare, _Allocator>& __x,
1417           const map<_Key, _Tp, _Compare, _Allocator>& __y)
1418{
1419    return !(__x == __y);
1420}
1421
1422template <class _Key, class _Tp, class _Compare, class _Allocator>
1423inline _LIBCPP_INLINE_VISIBILITY
1424bool
1425operator> (const map<_Key, _Tp, _Compare, _Allocator>& __x,
1426           const map<_Key, _Tp, _Compare, _Allocator>& __y)
1427{
1428    return __y < __x;
1429}
1430
1431template <class _Key, class _Tp, class _Compare, class _Allocator>
1432inline _LIBCPP_INLINE_VISIBILITY
1433bool
1434operator>=(const map<_Key, _Tp, _Compare, _Allocator>& __x,
1435           const map<_Key, _Tp, _Compare, _Allocator>& __y)
1436{
1437    return !(__x < __y);
1438}
1439
1440template <class _Key, class _Tp, class _Compare, class _Allocator>
1441inline _LIBCPP_INLINE_VISIBILITY
1442bool
1443operator<=(const map<_Key, _Tp, _Compare, _Allocator>& __x,
1444           const map<_Key, _Tp, _Compare, _Allocator>& __y)
1445{
1446    return !(__y < __x);
1447}
1448
1449template <class _Key, class _Tp, class _Compare, class _Allocator>
1450inline _LIBCPP_INLINE_VISIBILITY
1451void
1452swap(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
1459template <class _Key, class _Tp, class _Compare = less<_Key>,
1460          class _Allocator = allocator<pair<const _Key, _Tp> > >
1461class _LIBCPP_TEMPLATE_VIS multimap
1462{
1463public:
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
1492private:
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
1504public:
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
1836private:
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
1846template <class _Key, class _Tp, class _Compare, class _Allocator>
1847multimap<_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
1860template <class _Key, class _Tp, class _Compare, class _Allocator>
1861inline _LIBCPP_INLINE_VISIBILITY
1862bool
1863operator==(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
1869template <class _Key, class _Tp, class _Compare, class _Allocator>
1870inline _LIBCPP_INLINE_VISIBILITY
1871bool
1872operator< (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
1878template <class _Key, class _Tp, class _Compare, class _Allocator>
1879inline _LIBCPP_INLINE_VISIBILITY
1880bool
1881operator!=(const multimap<_Key, _Tp, _Compare, _Allocator>& __x,
1882           const multimap<_Key, _Tp, _Compare, _Allocator>& __y)
1883{
1884    return !(__x == __y);
1885}
1886
1887template <class _Key, class _Tp, class _Compare, class _Allocator>
1888inline _LIBCPP_INLINE_VISIBILITY
1889bool
1890operator> (const multimap<_Key, _Tp, _Compare, _Allocator>& __x,
1891           const multimap<_Key, _Tp, _Compare, _Allocator>& __y)
1892{
1893    return __y < __x;
1894}
1895
1896template <class _Key, class _Tp, class _Compare, class _Allocator>
1897inline _LIBCPP_INLINE_VISIBILITY
1898bool
1899operator>=(const multimap<_Key, _Tp, _Compare, _Allocator>& __x,
1900           const multimap<_Key, _Tp, _Compare, _Allocator>& __y)
1901{
1902    return !(__x < __y);
1903}
1904
1905template <class _Key, class _Tp, class _Compare, class _Allocator>
1906inline _LIBCPP_INLINE_VISIBILITY
1907bool
1908operator<=(const multimap<_Key, _Tp, _Compare, _Allocator>& __x,
1909           const multimap<_Key, _Tp, _Compare, _Allocator>& __y)
1910{
1911    return !(__y < __x);
1912}
1913
1914template <class _Key, class _Tp, class _Compare, class _Allocator>
1915inline _LIBCPP_INLINE_VISIBILITY
1916void
1917swap(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