]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/libc++/include/__tree
Merge OpenSSL 1.1.1a.
[FreeBSD/FreeBSD.git] / contrib / libc++ / include / __tree
1 // -*- C++ -*-
2 //===----------------------------------------------------------------------===//
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___TREE
12 #define _LIBCPP___TREE
13
14 #include <__config>
15 #include <iterator>
16 #include <memory>
17 #include <stdexcept>
18 #include <algorithm>
19
20 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
21 #pragma GCC system_header
22 #endif
23
24 _LIBCPP_PUSH_MACROS
25 #include <__undef_macros>
26
27
28 _LIBCPP_BEGIN_NAMESPACE_STD
29
30 template <class _Tp, class _Compare, class _Allocator> class __tree;
31 template <class _Tp, class _NodePtr, class _DiffType>
32     class _LIBCPP_TEMPLATE_VIS __tree_iterator;
33 template <class _Tp, class _ConstNodePtr, class _DiffType>
34     class _LIBCPP_TEMPLATE_VIS __tree_const_iterator;
35
36 template <class _Pointer> class __tree_end_node;
37 template <class _VoidPtr> class __tree_node_base;
38 template <class _Tp, class _VoidPtr> class __tree_node;
39
40 #ifndef _LIBCPP_CXX03_LANG
41 template <class _Key, class _Value>
42 union __value_type;
43 #else
44 template <class _Key, class _Value>
45 struct __value_type;
46 #endif
47
48 template <class _Key, class _CP, class _Compare,
49     bool = is_empty<_Compare>::value && !__libcpp_is_final<_Compare>::value>
50 class __map_value_compare;
51
52 template <class _Allocator> class __map_node_destructor;
53 template <class _TreeIterator> class _LIBCPP_TEMPLATE_VIS __map_iterator;
54 template <class _TreeIterator> class _LIBCPP_TEMPLATE_VIS __map_const_iterator;
55
56 /*
57
58 _NodePtr algorithms
59
60 The algorithms taking _NodePtr are red black tree algorithms.  Those
61 algorithms taking a parameter named __root should assume that __root
62 points to a proper red black tree (unless otherwise specified).
63
64 Each algorithm herein assumes that __root->__parent_ points to a non-null
65 structure which has a member __left_ which points back to __root.  No other
66 member is read or written to at __root->__parent_.
67
68 __root->__parent_ will be referred to below (in comments only) as end_node.
69 end_node->__left_ is an externably accessible lvalue for __root, and can be
70 changed by node insertion and removal (without explicit reference to end_node).
71
72 All nodes (with the exception of end_node), even the node referred to as
73 __root, have a non-null __parent_ field.
74
75 */
76
77 // Returns:  true if __x is a left child of its parent, else false
78 // Precondition:  __x != nullptr.
79 template <class _NodePtr>
80 inline _LIBCPP_INLINE_VISIBILITY
81 bool
82 __tree_is_left_child(_NodePtr __x) _NOEXCEPT
83 {
84     return __x == __x->__parent_->__left_;
85 }
86
87 // Determines if the subtree rooted at __x is a proper red black subtree.  If
88 //    __x is a proper subtree, returns the black height (null counts as 1).  If
89 //    __x is an improper subtree, returns 0.
90 template <class _NodePtr>
91 unsigned
92 __tree_sub_invariant(_NodePtr __x)
93 {
94     if (__x == nullptr)
95         return 1;
96     // parent consistency checked by caller
97     // check __x->__left_ consistency
98     if (__x->__left_ != nullptr && __x->__left_->__parent_ != __x)
99         return 0;
100     // check __x->__right_ consistency
101     if (__x->__right_ != nullptr && __x->__right_->__parent_ != __x)
102         return 0;
103     // check __x->__left_ != __x->__right_ unless both are nullptr
104     if (__x->__left_ == __x->__right_ && __x->__left_ != nullptr)
105         return 0;
106     // If this is red, neither child can be red
107     if (!__x->__is_black_)
108     {
109         if (__x->__left_ && !__x->__left_->__is_black_)
110             return 0;
111         if (__x->__right_ && !__x->__right_->__is_black_)
112             return 0;
113     }
114     unsigned __h = __tree_sub_invariant(__x->__left_);
115     if (__h == 0)
116         return 0;  // invalid left subtree
117     if (__h != __tree_sub_invariant(__x->__right_))
118         return 0;  // invalid or different height right subtree
119     return __h + __x->__is_black_;  // return black height of this node
120 }
121
122 // Determines if the red black tree rooted at __root is a proper red black tree.
123 //    __root == nullptr is a proper tree.  Returns true is __root is a proper
124 //    red black tree, else returns false.
125 template <class _NodePtr>
126 bool
127 __tree_invariant(_NodePtr __root)
128 {
129     if (__root == nullptr)
130         return true;
131     // check __x->__parent_ consistency
132     if (__root->__parent_ == nullptr)
133         return false;
134     if (!__tree_is_left_child(__root))
135         return false;
136     // root must be black
137     if (!__root->__is_black_)
138         return false;
139     // do normal node checks
140     return __tree_sub_invariant(__root) != 0;
141 }
142
143 // Returns:  pointer to the left-most node under __x.
144 // Precondition:  __x != nullptr.
145 template <class _NodePtr>
146 inline _LIBCPP_INLINE_VISIBILITY
147 _NodePtr
148 __tree_min(_NodePtr __x) _NOEXCEPT
149 {
150     while (__x->__left_ != nullptr)
151         __x = __x->__left_;
152     return __x;
153 }
154
155 // Returns:  pointer to the right-most node under __x.
156 // Precondition:  __x != nullptr.
157 template <class _NodePtr>
158 inline _LIBCPP_INLINE_VISIBILITY
159 _NodePtr
160 __tree_max(_NodePtr __x) _NOEXCEPT
161 {
162     while (__x->__right_ != nullptr)
163         __x = __x->__right_;
164     return __x;
165 }
166
167 // Returns:  pointer to the next in-order node after __x.
168 // Precondition:  __x != nullptr.
169 template <class _NodePtr>
170 _NodePtr
171 __tree_next(_NodePtr __x) _NOEXCEPT
172 {
173     if (__x->__right_ != nullptr)
174         return __tree_min(__x->__right_);
175     while (!__tree_is_left_child(__x))
176         __x = __x->__parent_unsafe();
177     return __x->__parent_unsafe();
178 }
179
180 template <class _EndNodePtr, class _NodePtr>
181 inline _LIBCPP_INLINE_VISIBILITY
182 _EndNodePtr
183 __tree_next_iter(_NodePtr __x) _NOEXCEPT
184 {
185     if (__x->__right_ != nullptr)
186         return static_cast<_EndNodePtr>(__tree_min(__x->__right_));
187     while (!__tree_is_left_child(__x))
188         __x = __x->__parent_unsafe();
189     return static_cast<_EndNodePtr>(__x->__parent_);
190 }
191
192 // Returns:  pointer to the previous in-order node before __x.
193 // Precondition:  __x != nullptr.
194 // Note: __x may be the end node.
195 template <class _NodePtr, class _EndNodePtr>
196 inline _LIBCPP_INLINE_VISIBILITY
197 _NodePtr
198 __tree_prev_iter(_EndNodePtr __x) _NOEXCEPT
199 {
200     if (__x->__left_ != nullptr)
201         return __tree_max(__x->__left_);
202     _NodePtr __xx = static_cast<_NodePtr>(__x);
203     while (__tree_is_left_child(__xx))
204         __xx = __xx->__parent_unsafe();
205     return __xx->__parent_unsafe();
206 }
207
208 // Returns:  pointer to a node which has no children
209 // Precondition:  __x != nullptr.
210 template <class _NodePtr>
211 _NodePtr
212 __tree_leaf(_NodePtr __x) _NOEXCEPT
213 {
214     while (true)
215     {
216         if (__x->__left_ != nullptr)
217         {
218             __x = __x->__left_;
219             continue;
220         }
221         if (__x->__right_ != nullptr)
222         {
223             __x = __x->__right_;
224             continue;
225         }
226         break;
227     }
228     return __x;
229 }
230
231 // Effects:  Makes __x->__right_ the subtree root with __x as its left child
232 //           while preserving in-order order.
233 // Precondition:  __x->__right_ != nullptr
234 template <class _NodePtr>
235 void
236 __tree_left_rotate(_NodePtr __x) _NOEXCEPT
237 {
238     _NodePtr __y = __x->__right_;
239     __x->__right_ = __y->__left_;
240     if (__x->__right_ != nullptr)
241         __x->__right_->__set_parent(__x);
242     __y->__parent_ = __x->__parent_;
243     if (__tree_is_left_child(__x))
244         __x->__parent_->__left_ = __y;
245     else
246         __x->__parent_unsafe()->__right_ = __y;
247     __y->__left_ = __x;
248     __x->__set_parent(__y);
249 }
250
251 // Effects:  Makes __x->__left_ the subtree root with __x as its right child
252 //           while preserving in-order order.
253 // Precondition:  __x->__left_ != nullptr
254 template <class _NodePtr>
255 void
256 __tree_right_rotate(_NodePtr __x) _NOEXCEPT
257 {
258     _NodePtr __y = __x->__left_;
259     __x->__left_ = __y->__right_;
260     if (__x->__left_ != nullptr)
261         __x->__left_->__set_parent(__x);
262     __y->__parent_ = __x->__parent_;
263     if (__tree_is_left_child(__x))
264         __x->__parent_->__left_ = __y;
265     else
266         __x->__parent_unsafe()->__right_ = __y;
267     __y->__right_ = __x;
268     __x->__set_parent(__y);
269 }
270
271 // Effects:  Rebalances __root after attaching __x to a leaf.
272 // Precondition:  __root != nulptr && __x != nullptr.
273 //                __x has no children.
274 //                __x == __root or == a direct or indirect child of __root.
275 //                If __x were to be unlinked from __root (setting __root to
276 //                  nullptr if __root == __x), __tree_invariant(__root) == true.
277 // Postcondition: __tree_invariant(end_node->__left_) == true.  end_node->__left_
278 //                may be different than the value passed in as __root.
279 template <class _NodePtr>
280 void
281 __tree_balance_after_insert(_NodePtr __root, _NodePtr __x) _NOEXCEPT
282 {
283     __x->__is_black_ = __x == __root;
284     while (__x != __root && !__x->__parent_unsafe()->__is_black_)
285     {
286         // __x->__parent_ != __root because __x->__parent_->__is_black == false
287         if (__tree_is_left_child(__x->__parent_unsafe()))
288         {
289             _NodePtr __y = __x->__parent_unsafe()->__parent_unsafe()->__right_;
290             if (__y != nullptr && !__y->__is_black_)
291             {
292                 __x = __x->__parent_unsafe();
293                 __x->__is_black_ = true;
294                 __x = __x->__parent_unsafe();
295                 __x->__is_black_ = __x == __root;
296                 __y->__is_black_ = true;
297             }
298             else
299             {
300                 if (!__tree_is_left_child(__x))
301                 {
302                     __x = __x->__parent_unsafe();
303                     __tree_left_rotate(__x);
304                 }
305                 __x = __x->__parent_unsafe();
306                 __x->__is_black_ = true;
307                 __x = __x->__parent_unsafe();
308                 __x->__is_black_ = false;
309                 __tree_right_rotate(__x);
310                 break;
311             }
312         }
313         else
314         {
315             _NodePtr __y = __x->__parent_unsafe()->__parent_->__left_;
316             if (__y != nullptr && !__y->__is_black_)
317             {
318                 __x = __x->__parent_unsafe();
319                 __x->__is_black_ = true;
320                 __x = __x->__parent_unsafe();
321                 __x->__is_black_ = __x == __root;
322                 __y->__is_black_ = true;
323             }
324             else
325             {
326                 if (__tree_is_left_child(__x))
327                 {
328                     __x = __x->__parent_unsafe();
329                     __tree_right_rotate(__x);
330                 }
331                 __x = __x->__parent_unsafe();
332                 __x->__is_black_ = true;
333                 __x = __x->__parent_unsafe();
334                 __x->__is_black_ = false;
335                 __tree_left_rotate(__x);
336                 break;
337             }
338         }
339     }
340 }
341
342 // Precondition:  __root != nullptr && __z != nullptr.
343 //                __tree_invariant(__root) == true.
344 //                __z == __root or == a direct or indirect child of __root.
345 // Effects:  unlinks __z from the tree rooted at __root, rebalancing as needed.
346 // Postcondition: __tree_invariant(end_node->__left_) == true && end_node->__left_
347 //                nor any of its children refer to __z.  end_node->__left_
348 //                may be different than the value passed in as __root.
349 template <class _NodePtr>
350 void
351 __tree_remove(_NodePtr __root, _NodePtr __z) _NOEXCEPT
352 {
353     // __z will be removed from the tree.  Client still needs to destruct/deallocate it
354     // __y is either __z, or if __z has two children, __tree_next(__z).
355     // __y will have at most one child.
356     // __y will be the initial hole in the tree (make the hole at a leaf)
357     _NodePtr __y = (__z->__left_ == nullptr || __z->__right_ == nullptr) ?
358                     __z : __tree_next(__z);
359     // __x is __y's possibly null single child
360     _NodePtr __x = __y->__left_ != nullptr ? __y->__left_ : __y->__right_;
361     // __w is __x's possibly null uncle (will become __x's sibling)
362     _NodePtr __w = nullptr;
363     // link __x to __y's parent, and find __w
364     if (__x != nullptr)
365         __x->__parent_ = __y->__parent_;
366     if (__tree_is_left_child(__y))
367     {
368         __y->__parent_->__left_ = __x;
369         if (__y != __root)
370             __w = __y->__parent_unsafe()->__right_;
371         else
372             __root = __x;  // __w == nullptr
373     }
374     else
375     {
376         __y->__parent_unsafe()->__right_ = __x;
377         // __y can't be root if it is a right child
378         __w = __y->__parent_->__left_;
379     }
380     bool __removed_black = __y->__is_black_;
381     // If we didn't remove __z, do so now by splicing in __y for __z,
382     //    but copy __z's color.  This does not impact __x or __w.
383     if (__y != __z)
384     {
385         // __z->__left_ != nulptr but __z->__right_ might == __x == nullptr
386         __y->__parent_ = __z->__parent_;
387         if (__tree_is_left_child(__z))
388             __y->__parent_->__left_ = __y;
389         else
390             __y->__parent_unsafe()->__right_ = __y;
391         __y->__left_ = __z->__left_;
392         __y->__left_->__set_parent(__y);
393         __y->__right_ = __z->__right_;
394         if (__y->__right_ != nullptr)
395             __y->__right_->__set_parent(__y);
396         __y->__is_black_ = __z->__is_black_;
397         if (__root == __z)
398             __root = __y;
399     }
400     // There is no need to rebalance if we removed a red, or if we removed
401     //     the last node.
402     if (__removed_black && __root != nullptr)
403     {
404         // Rebalance:
405         // __x has an implicit black color (transferred from the removed __y)
406         //    associated with it, no matter what its color is.
407         // If __x is __root (in which case it can't be null), it is supposed
408         //    to be black anyway, and if it is doubly black, then the double
409         //    can just be ignored.
410         // If __x is red (in which case it can't be null), then it can absorb
411         //    the implicit black just by setting its color to black.
412         // Since __y was black and only had one child (which __x points to), __x
413         //   is either red with no children, else null, otherwise __y would have
414         //   different black heights under left and right pointers.
415         // if (__x == __root || __x != nullptr && !__x->__is_black_)
416         if (__x != nullptr)
417             __x->__is_black_ = true;
418         else
419         {
420             //  Else __x isn't root, and is "doubly black", even though it may
421             //     be null.  __w can not be null here, else the parent would
422             //     see a black height >= 2 on the __x side and a black height
423             //     of 1 on the __w side (__w must be a non-null black or a red
424             //     with a non-null black child).
425             while (true)
426             {
427                 if (!__tree_is_left_child(__w))  // if x is left child
428                 {
429                     if (!__w->__is_black_)
430                     {
431                         __w->__is_black_ = true;
432                         __w->__parent_unsafe()->__is_black_ = false;
433                         __tree_left_rotate(__w->__parent_unsafe());
434                         // __x is still valid
435                         // reset __root only if necessary
436                         if (__root == __w->__left_)
437                             __root = __w;
438                         // reset sibling, and it still can't be null
439                         __w = __w->__left_->__right_;
440                     }
441                     // __w->__is_black_ is now true, __w may have null children
442                     if ((__w->__left_  == nullptr || __w->__left_->__is_black_) &&
443                         (__w->__right_ == nullptr || __w->__right_->__is_black_))
444                     {
445                         __w->__is_black_ = false;
446                         __x = __w->__parent_unsafe();
447                         // __x can no longer be null
448                         if (__x == __root || !__x->__is_black_)
449                         {
450                             __x->__is_black_ = true;
451                             break;
452                         }
453                         // reset sibling, and it still can't be null
454                         __w = __tree_is_left_child(__x) ?
455                                     __x->__parent_unsafe()->__right_ :
456                                     __x->__parent_->__left_;
457                         // continue;
458                     }
459                     else  // __w has a red child
460                     {
461                         if (__w->__right_ == nullptr || __w->__right_->__is_black_)
462                         {
463                             // __w left child is non-null and red
464                             __w->__left_->__is_black_ = true;
465                             __w->__is_black_ = false;
466                             __tree_right_rotate(__w);
467                             // __w is known not to be root, so root hasn't changed
468                             // reset sibling, and it still can't be null
469                             __w = __w->__parent_unsafe();
470                         }
471                         // __w has a right red child, left child may be null
472                         __w->__is_black_ = __w->__parent_unsafe()->__is_black_;
473                         __w->__parent_unsafe()->__is_black_ = true;
474                         __w->__right_->__is_black_ = true;
475                         __tree_left_rotate(__w->__parent_unsafe());
476                         break;
477                     }
478                 }
479                 else
480                 {
481                     if (!__w->__is_black_)
482                     {
483                         __w->__is_black_ = true;
484                         __w->__parent_unsafe()->__is_black_ = false;
485                         __tree_right_rotate(__w->__parent_unsafe());
486                         // __x is still valid
487                         // reset __root only if necessary
488                         if (__root == __w->__right_)
489                             __root = __w;
490                         // reset sibling, and it still can't be null
491                         __w = __w->__right_->__left_;
492                     }
493                     // __w->__is_black_ is now true, __w may have null children
494                     if ((__w->__left_  == nullptr || __w->__left_->__is_black_) &&
495                         (__w->__right_ == nullptr || __w->__right_->__is_black_))
496                     {
497                         __w->__is_black_ = false;
498                         __x = __w->__parent_unsafe();
499                         // __x can no longer be null
500                         if (!__x->__is_black_ || __x == __root)
501                         {
502                             __x->__is_black_ = true;
503                             break;
504                         }
505                         // reset sibling, and it still can't be null
506                         __w = __tree_is_left_child(__x) ?
507                                     __x->__parent_unsafe()->__right_ :
508                                     __x->__parent_->__left_;
509                         // continue;
510                     }
511                     else  // __w has a red child
512                     {
513                         if (__w->__left_ == nullptr || __w->__left_->__is_black_)
514                         {
515                             // __w right child is non-null and red
516                             __w->__right_->__is_black_ = true;
517                             __w->__is_black_ = false;
518                             __tree_left_rotate(__w);
519                             // __w is known not to be root, so root hasn't changed
520                             // reset sibling, and it still can't be null
521                             __w = __w->__parent_unsafe();
522                         }
523                         // __w has a left red child, right child may be null
524                         __w->__is_black_ = __w->__parent_unsafe()->__is_black_;
525                         __w->__parent_unsafe()->__is_black_ = true;
526                         __w->__left_->__is_black_ = true;
527                         __tree_right_rotate(__w->__parent_unsafe());
528                         break;
529                     }
530                 }
531             }
532         }
533     }
534 }
535
536 // node traits
537
538
539 #ifndef _LIBCPP_CXX03_LANG
540 template <class _Tp>
541 struct __is_tree_value_type_imp : false_type {};
542
543 template <class _Key, class _Value>
544 struct __is_tree_value_type_imp<__value_type<_Key, _Value>> : true_type {};
545
546 template <class ..._Args>
547 struct __is_tree_value_type : false_type {};
548
549 template <class _One>
550 struct __is_tree_value_type<_One> : __is_tree_value_type_imp<typename __uncvref<_One>::type> {};
551 #endif
552
553 template <class _Tp>
554 struct __tree_key_value_types {
555   typedef _Tp key_type;
556   typedef _Tp __node_value_type;
557   typedef _Tp __container_value_type;
558   static const bool __is_map = false;
559
560   _LIBCPP_INLINE_VISIBILITY
561   static key_type const& __get_key(_Tp const& __v) {
562     return __v;
563   }
564   _LIBCPP_INLINE_VISIBILITY
565   static __container_value_type const& __get_value(__node_value_type const& __v) {
566     return __v;
567   }
568   _LIBCPP_INLINE_VISIBILITY
569   static __container_value_type* __get_ptr(__node_value_type& __n) {
570     return _VSTD::addressof(__n);
571   }
572
573 #ifndef _LIBCPP_CXX03_LANG
574   _LIBCPP_INLINE_VISIBILITY
575   static  __container_value_type&& __move(__node_value_type& __v) {
576     return _VSTD::move(__v);
577   }
578 #endif
579 };
580
581 template <class _Key, class _Tp>
582 struct __tree_key_value_types<__value_type<_Key, _Tp> > {
583   typedef _Key                                         key_type;
584   typedef _Tp                                          mapped_type;
585   typedef __value_type<_Key, _Tp>                      __node_value_type;
586   typedef pair<const _Key, _Tp>                        __container_value_type;
587   typedef pair<_Key, _Tp>                              __nc_value_type;
588   typedef __container_value_type                       __map_value_type;
589   static const bool __is_map = true;
590
591   _LIBCPP_INLINE_VISIBILITY
592   static key_type const&
593   __get_key(__node_value_type const& __t) {
594     return __t.__cc.first;
595   }
596
597   template <class _Up>
598   _LIBCPP_INLINE_VISIBILITY
599   static typename enable_if<__is_same_uncvref<_Up, __container_value_type>::value,
600       key_type const&>::type
601   __get_key(_Up& __t) {
602     return __t.first;
603   }
604
605   _LIBCPP_INLINE_VISIBILITY
606   static __container_value_type const&
607   __get_value(__node_value_type const& __t) {
608     return __t.__cc;
609   }
610
611   template <class _Up>
612   _LIBCPP_INLINE_VISIBILITY
613   static typename enable_if<__is_same_uncvref<_Up, __container_value_type>::value,
614       __container_value_type const&>::type
615   __get_value(_Up& __t) {
616     return __t;
617   }
618
619   _LIBCPP_INLINE_VISIBILITY
620   static __container_value_type* __get_ptr(__node_value_type& __n) {
621     return _VSTD::addressof(__n.__cc);
622   }
623
624 #ifndef _LIBCPP_CXX03_LANG
625   _LIBCPP_INLINE_VISIBILITY
626   static  __nc_value_type&& __move(__node_value_type& __v) {
627     return _VSTD::move(__v.__nc);
628   }
629 #endif
630 };
631
632 template <class _VoidPtr>
633 struct __tree_node_base_types {
634   typedef _VoidPtr                                               __void_pointer;
635
636   typedef __tree_node_base<__void_pointer>                      __node_base_type;
637   typedef typename __rebind_pointer<_VoidPtr, __node_base_type>::type
638                                                              __node_base_pointer;
639
640   typedef __tree_end_node<__node_base_pointer>                  __end_node_type;
641   typedef typename __rebind_pointer<_VoidPtr, __end_node_type>::type
642                                                              __end_node_pointer;
643 #if defined(_LIBCPP_ABI_TREE_REMOVE_NODE_POINTER_UB)
644   typedef __end_node_pointer __parent_pointer;
645 #else
646   typedef typename conditional<
647       is_pointer<__end_node_pointer>::value,
648         __end_node_pointer,
649         __node_base_pointer>::type __parent_pointer;
650 #endif
651
652 private:
653   static_assert((is_same<typename pointer_traits<_VoidPtr>::element_type, void>::value),
654                   "_VoidPtr does not point to unqualified void type");
655 };
656
657 template <class _Tp, class _AllocPtr, class _KVTypes = __tree_key_value_types<_Tp>,
658          bool = _KVTypes::__is_map>
659 struct __tree_map_pointer_types {};
660
661 template <class _Tp, class _AllocPtr, class _KVTypes>
662 struct __tree_map_pointer_types<_Tp, _AllocPtr, _KVTypes, true> {
663   typedef typename _KVTypes::__map_value_type   _Mv;
664   typedef typename __rebind_pointer<_AllocPtr, _Mv>::type
665                                                        __map_value_type_pointer;
666   typedef typename __rebind_pointer<_AllocPtr, const _Mv>::type
667                                                  __const_map_value_type_pointer;
668 };
669
670 template <class _NodePtr, class _NodeT = typename pointer_traits<_NodePtr>::element_type>
671 struct __tree_node_types;
672
673 template <class _NodePtr, class _Tp, class _VoidPtr>
674 struct __tree_node_types<_NodePtr, __tree_node<_Tp, _VoidPtr> >
675     : public __tree_node_base_types<_VoidPtr>,
676              __tree_key_value_types<_Tp>,
677              __tree_map_pointer_types<_Tp, _VoidPtr>
678 {
679   typedef __tree_node_base_types<_VoidPtr> __base;
680   typedef __tree_key_value_types<_Tp>      __key_base;
681   typedef __tree_map_pointer_types<_Tp, _VoidPtr> __map_pointer_base;
682 public:
683
684   typedef typename pointer_traits<_NodePtr>::element_type       __node_type;
685   typedef _NodePtr                                              __node_pointer;
686
687   typedef _Tp                                                 __node_value_type;
688   typedef typename __rebind_pointer<_VoidPtr, __node_value_type>::type
689                                                       __node_value_type_pointer;
690   typedef typename __rebind_pointer<_VoidPtr, const __node_value_type>::type
691                                                 __const_node_value_type_pointer;
692 #if defined(_LIBCPP_ABI_TREE_REMOVE_NODE_POINTER_UB)
693   typedef typename __base::__end_node_pointer __iter_pointer;
694 #else
695   typedef typename conditional<
696       is_pointer<__node_pointer>::value,
697         typename __base::__end_node_pointer,
698         __node_pointer>::type __iter_pointer;
699 #endif
700 private:
701     static_assert(!is_const<__node_type>::value,
702                 "_NodePtr should never be a pointer to const");
703     static_assert((is_same<typename __rebind_pointer<_VoidPtr, __node_type>::type,
704                           _NodePtr>::value), "_VoidPtr does not rebind to _NodePtr.");
705 };
706
707 template <class _ValueTp, class _VoidPtr>
708 struct __make_tree_node_types {
709   typedef typename __rebind_pointer<_VoidPtr, __tree_node<_ValueTp, _VoidPtr> >::type
710                                                                         _NodePtr;
711   typedef __tree_node_types<_NodePtr> type;
712 };
713
714 // node
715
716 template <class _Pointer>
717 class __tree_end_node
718 {
719 public:
720     typedef _Pointer pointer;
721     pointer __left_;
722
723     _LIBCPP_INLINE_VISIBILITY
724     __tree_end_node() _NOEXCEPT : __left_() {}
725 };
726
727 template <class _VoidPtr>
728 class __tree_node_base
729     : public __tree_node_base_types<_VoidPtr>::__end_node_type
730 {
731     typedef __tree_node_base_types<_VoidPtr> _NodeBaseTypes;
732
733 public:
734     typedef typename _NodeBaseTypes::__node_base_pointer pointer;
735     typedef typename _NodeBaseTypes::__parent_pointer __parent_pointer;
736
737     pointer          __right_;
738     __parent_pointer __parent_;
739     bool __is_black_;
740
741     _LIBCPP_INLINE_VISIBILITY
742     pointer __parent_unsafe() const { return static_cast<pointer>(__parent_);}
743
744     _LIBCPP_INLINE_VISIBILITY
745     void __set_parent(pointer __p) {
746         __parent_ = static_cast<__parent_pointer>(__p);
747     }
748
749 private:
750   ~__tree_node_base() _LIBCPP_EQUAL_DELETE;
751   __tree_node_base(__tree_node_base const&) _LIBCPP_EQUAL_DELETE;
752   __tree_node_base& operator=(__tree_node_base const&) _LIBCPP_EQUAL_DELETE;
753 };
754
755 template <class _Tp, class _VoidPtr>
756 class __tree_node
757     : public __tree_node_base<_VoidPtr>
758 {
759 public:
760     typedef _Tp __node_value_type;
761
762     __node_value_type __value_;
763
764 private:
765   ~__tree_node() _LIBCPP_EQUAL_DELETE;
766   __tree_node(__tree_node const&) _LIBCPP_EQUAL_DELETE;
767   __tree_node& operator=(__tree_node const&) _LIBCPP_EQUAL_DELETE;
768 };
769
770
771 template <class _Allocator>
772 class __tree_node_destructor
773 {
774     typedef _Allocator                                      allocator_type;
775     typedef allocator_traits<allocator_type>                __alloc_traits;
776
777 public:
778     typedef typename __alloc_traits::pointer                pointer;
779 private:
780     typedef __tree_node_types<pointer> _NodeTypes;
781     allocator_type& __na_;
782
783     __tree_node_destructor& operator=(const __tree_node_destructor&);
784
785 public:
786     bool __value_constructed;
787
788     _LIBCPP_INLINE_VISIBILITY
789     explicit __tree_node_destructor(allocator_type& __na, bool __val = false) _NOEXCEPT
790         : __na_(__na),
791           __value_constructed(__val)
792         {}
793
794     _LIBCPP_INLINE_VISIBILITY
795     void operator()(pointer __p) _NOEXCEPT
796     {
797         if (__value_constructed)
798             __alloc_traits::destroy(__na_, _NodeTypes::__get_ptr(__p->__value_));
799         if (__p)
800             __alloc_traits::deallocate(__na_, __p, 1);
801     }
802
803     template <class> friend class __map_node_destructor;
804 };
805
806
807 template <class _Tp, class _NodePtr, class _DiffType>
808 class _LIBCPP_TEMPLATE_VIS __tree_iterator
809 {
810     typedef __tree_node_types<_NodePtr>                     _NodeTypes;
811     typedef _NodePtr                                        __node_pointer;
812     typedef typename _NodeTypes::__node_base_pointer        __node_base_pointer;
813     typedef typename _NodeTypes::__end_node_pointer         __end_node_pointer;
814     typedef typename _NodeTypes::__iter_pointer             __iter_pointer;
815     typedef pointer_traits<__node_pointer> __pointer_traits;
816
817     __iter_pointer __ptr_;
818
819 public:
820     typedef bidirectional_iterator_tag                     iterator_category;
821     typedef _Tp                                            value_type;
822     typedef _DiffType                                      difference_type;
823     typedef value_type&                                    reference;
824     typedef typename _NodeTypes::__node_value_type_pointer pointer;
825
826     _LIBCPP_INLINE_VISIBILITY __tree_iterator() _NOEXCEPT
827 #if _LIBCPP_STD_VER > 11
828     : __ptr_(nullptr)
829 #endif
830     {}
831
832     _LIBCPP_INLINE_VISIBILITY reference operator*() const
833         {return __get_np()->__value_;}
834     _LIBCPP_INLINE_VISIBILITY pointer operator->() const
835         {return pointer_traits<pointer>::pointer_to(__get_np()->__value_);}
836
837     _LIBCPP_INLINE_VISIBILITY
838     __tree_iterator& operator++() {
839       __ptr_ = static_cast<__iter_pointer>(
840           __tree_next_iter<__end_node_pointer>(static_cast<__node_base_pointer>(__ptr_)));
841       return *this;
842     }
843     _LIBCPP_INLINE_VISIBILITY
844     __tree_iterator operator++(int)
845         {__tree_iterator __t(*this); ++(*this); return __t;}
846
847     _LIBCPP_INLINE_VISIBILITY
848     __tree_iterator& operator--() {
849       __ptr_ = static_cast<__iter_pointer>(__tree_prev_iter<__node_base_pointer>(
850           static_cast<__end_node_pointer>(__ptr_)));
851       return *this;
852     }
853     _LIBCPP_INLINE_VISIBILITY
854     __tree_iterator operator--(int)
855         {__tree_iterator __t(*this); --(*this); return __t;}
856
857     friend _LIBCPP_INLINE_VISIBILITY 
858         bool operator==(const __tree_iterator& __x, const __tree_iterator& __y)
859         {return __x.__ptr_ == __y.__ptr_;}
860     friend _LIBCPP_INLINE_VISIBILITY
861         bool operator!=(const __tree_iterator& __x, const __tree_iterator& __y)
862         {return !(__x == __y);}
863
864 private:
865     _LIBCPP_INLINE_VISIBILITY
866     explicit __tree_iterator(__node_pointer __p) _NOEXCEPT : __ptr_(__p) {}
867     _LIBCPP_INLINE_VISIBILITY
868     explicit __tree_iterator(__end_node_pointer __p) _NOEXCEPT : __ptr_(__p) {}
869     _LIBCPP_INLINE_VISIBILITY
870     __node_pointer __get_np() const { return static_cast<__node_pointer>(__ptr_); }
871     template <class, class, class> friend class __tree;
872     template <class, class, class> friend class _LIBCPP_TEMPLATE_VIS __tree_const_iterator;
873     template <class> friend class _LIBCPP_TEMPLATE_VIS __map_iterator;
874     template <class, class, class, class> friend class _LIBCPP_TEMPLATE_VIS map;
875     template <class, class, class, class> friend class _LIBCPP_TEMPLATE_VIS multimap;
876     template <class, class, class> friend class _LIBCPP_TEMPLATE_VIS set;
877     template <class, class, class> friend class _LIBCPP_TEMPLATE_VIS multiset;
878 };
879
880 template <class _Tp, class _NodePtr, class _DiffType>
881 class _LIBCPP_TEMPLATE_VIS __tree_const_iterator
882 {
883     typedef __tree_node_types<_NodePtr>                     _NodeTypes;
884     typedef typename _NodeTypes::__node_pointer             __node_pointer;
885     typedef typename _NodeTypes::__node_base_pointer        __node_base_pointer;
886     typedef typename _NodeTypes::__end_node_pointer         __end_node_pointer;
887     typedef typename _NodeTypes::__iter_pointer             __iter_pointer;
888     typedef pointer_traits<__node_pointer> __pointer_traits;
889
890     __iter_pointer __ptr_;
891
892 public:
893     typedef bidirectional_iterator_tag                           iterator_category;
894     typedef _Tp                                                  value_type;
895     typedef _DiffType                                            difference_type;
896     typedef const value_type&                                    reference;
897     typedef typename _NodeTypes::__const_node_value_type_pointer pointer;
898
899     _LIBCPP_INLINE_VISIBILITY __tree_const_iterator() _NOEXCEPT
900 #if _LIBCPP_STD_VER > 11
901     : __ptr_(nullptr)
902 #endif
903     {}
904
905 private:
906     typedef __tree_iterator<value_type, __node_pointer, difference_type>
907                                                            __non_const_iterator;
908 public:
909     _LIBCPP_INLINE_VISIBILITY
910     __tree_const_iterator(__non_const_iterator __p) _NOEXCEPT
911         : __ptr_(__p.__ptr_) {}
912
913     _LIBCPP_INLINE_VISIBILITY reference operator*() const
914         {return __get_np()->__value_;}
915     _LIBCPP_INLINE_VISIBILITY pointer operator->() const
916         {return pointer_traits<pointer>::pointer_to(__get_np()->__value_);}
917
918     _LIBCPP_INLINE_VISIBILITY
919     __tree_const_iterator& operator++() {
920       __ptr_ = static_cast<__iter_pointer>(
921           __tree_next_iter<__end_node_pointer>(static_cast<__node_base_pointer>(__ptr_)));
922       return *this;
923     }
924
925     _LIBCPP_INLINE_VISIBILITY
926     __tree_const_iterator operator++(int)
927         {__tree_const_iterator __t(*this); ++(*this); return __t;}
928
929     _LIBCPP_INLINE_VISIBILITY
930     __tree_const_iterator& operator--() {
931       __ptr_ = static_cast<__iter_pointer>(__tree_prev_iter<__node_base_pointer>(
932           static_cast<__end_node_pointer>(__ptr_)));
933       return *this;
934     }
935
936     _LIBCPP_INLINE_VISIBILITY
937     __tree_const_iterator operator--(int)
938         {__tree_const_iterator __t(*this); --(*this); return __t;}
939
940     friend _LIBCPP_INLINE_VISIBILITY
941         bool operator==(const __tree_const_iterator& __x, const __tree_const_iterator& __y)
942         {return __x.__ptr_ == __y.__ptr_;}
943     friend _LIBCPP_INLINE_VISIBILITY
944         bool operator!=(const __tree_const_iterator& __x, const __tree_const_iterator& __y)
945         {return !(__x == __y);}
946
947 private:
948     _LIBCPP_INLINE_VISIBILITY
949     explicit __tree_const_iterator(__node_pointer __p) _NOEXCEPT
950         : __ptr_(__p) {}
951     _LIBCPP_INLINE_VISIBILITY
952     explicit __tree_const_iterator(__end_node_pointer __p) _NOEXCEPT
953         : __ptr_(__p) {}
954     _LIBCPP_INLINE_VISIBILITY
955     __node_pointer __get_np() const { return static_cast<__node_pointer>(__ptr_); }
956
957     template <class, class, class> friend class __tree;
958     template <class, class, class, class> friend class _LIBCPP_TEMPLATE_VIS map;
959     template <class, class, class, class> friend class _LIBCPP_TEMPLATE_VIS multimap;
960     template <class, class, class> friend class _LIBCPP_TEMPLATE_VIS set;
961     template <class, class, class> friend class _LIBCPP_TEMPLATE_VIS multiset;
962     template <class> friend class _LIBCPP_TEMPLATE_VIS __map_const_iterator;
963
964 };
965
966 #ifndef _LIBCPP_CXX03_LANG
967 template <class _Tp, class _Compare, class _Allocator>
968 struct __diagnose_tree_helper {
969   static constexpr bool __trigger_diagnostics()
970       _LIBCPP_DIAGNOSE_WARNING(!__invokable<_Compare const&, _Tp const&, _Tp const&>::value,
971             "the specified comparator type does not provide a const call operator")
972   { return true; }
973 };
974
975 template <class _Key, class _Value, class _KeyComp, class _Alloc>
976 struct __diagnose_tree_helper<
977     __value_type<_Key, _Value>,
978     __map_value_compare<_Key, __value_type<_Key, _Value>, _KeyComp>,
979     _Alloc
980 > : __diagnose_tree_helper<_Key, _KeyComp, _Alloc>
981 {
982 };
983 #endif // !_LIBCPP_CXX03_LANG
984
985 template <class _Tp, class _Compare, class _Allocator>
986 class __tree
987 {
988 public:
989     typedef _Tp                                      value_type;
990     typedef _Compare                                 value_compare;
991     typedef _Allocator                               allocator_type;
992
993 private:
994     typedef allocator_traits<allocator_type>         __alloc_traits;
995     typedef typename __make_tree_node_types<value_type,
996         typename __alloc_traits::void_pointer>::type
997                                                     _NodeTypes;
998     typedef typename _NodeTypes::key_type           key_type;
999 public:
1000     typedef typename _NodeTypes::__node_value_type      __node_value_type;
1001     typedef typename _NodeTypes::__container_value_type __container_value_type;
1002
1003     typedef typename __alloc_traits::pointer         pointer;
1004     typedef typename __alloc_traits::const_pointer   const_pointer;
1005     typedef typename __alloc_traits::size_type       size_type;
1006     typedef typename __alloc_traits::difference_type difference_type;
1007
1008 public:
1009     typedef typename _NodeTypes::__void_pointer        __void_pointer;
1010
1011     typedef typename _NodeTypes::__node_type           __node;
1012     typedef typename _NodeTypes::__node_pointer        __node_pointer;
1013
1014     typedef typename _NodeTypes::__node_base_type      __node_base;
1015     typedef typename _NodeTypes::__node_base_pointer   __node_base_pointer;
1016
1017     typedef typename _NodeTypes::__end_node_type       __end_node_t;
1018     typedef typename _NodeTypes::__end_node_pointer    __end_node_ptr;
1019
1020     typedef typename _NodeTypes::__parent_pointer      __parent_pointer;
1021     typedef typename _NodeTypes::__iter_pointer        __iter_pointer;
1022
1023     typedef typename __rebind_alloc_helper<__alloc_traits, __node>::type __node_allocator;
1024     typedef allocator_traits<__node_allocator>         __node_traits;
1025
1026 private:
1027     // check for sane allocator pointer rebinding semantics. Rebinding the
1028     // allocator for a new pointer type should be exactly the same as rebinding
1029     // the pointer using 'pointer_traits'.
1030     static_assert((is_same<__node_pointer, typename __node_traits::pointer>::value),
1031                   "Allocator does not rebind pointers in a sane manner.");
1032     typedef typename __rebind_alloc_helper<__node_traits, __node_base>::type
1033         __node_base_allocator;
1034     typedef allocator_traits<__node_base_allocator> __node_base_traits;
1035     static_assert((is_same<__node_base_pointer, typename __node_base_traits::pointer>::value),
1036                  "Allocator does not rebind pointers in a sane manner.");
1037
1038 private:
1039     __iter_pointer                                     __begin_node_;
1040     __compressed_pair<__end_node_t, __node_allocator>  __pair1_;
1041     __compressed_pair<size_type, value_compare>        __pair3_;
1042
1043 public:
1044     _LIBCPP_INLINE_VISIBILITY
1045     __iter_pointer __end_node() _NOEXCEPT
1046     {
1047         return static_cast<__iter_pointer>(
1048                 pointer_traits<__end_node_ptr>::pointer_to(__pair1_.first())
1049         );
1050     }
1051     _LIBCPP_INLINE_VISIBILITY
1052     __iter_pointer __end_node() const _NOEXCEPT
1053     {
1054         return static_cast<__iter_pointer>(
1055             pointer_traits<__end_node_ptr>::pointer_to(
1056                 const_cast<__end_node_t&>(__pair1_.first())
1057             )
1058         );
1059     }
1060     _LIBCPP_INLINE_VISIBILITY
1061           __node_allocator& __node_alloc() _NOEXCEPT {return __pair1_.second();}
1062 private:
1063     _LIBCPP_INLINE_VISIBILITY
1064     const __node_allocator& __node_alloc() const _NOEXCEPT
1065         {return __pair1_.second();}
1066     _LIBCPP_INLINE_VISIBILITY
1067           __iter_pointer& __begin_node() _NOEXCEPT {return __begin_node_;}
1068     _LIBCPP_INLINE_VISIBILITY
1069     const __iter_pointer& __begin_node() const _NOEXCEPT {return __begin_node_;}
1070 public:
1071     _LIBCPP_INLINE_VISIBILITY
1072     allocator_type __alloc() const _NOEXCEPT
1073         {return allocator_type(__node_alloc());}
1074 private:
1075     _LIBCPP_INLINE_VISIBILITY
1076           size_type& size() _NOEXCEPT {return __pair3_.first();}
1077 public:
1078     _LIBCPP_INLINE_VISIBILITY
1079     const size_type& size() const _NOEXCEPT {return __pair3_.first();}
1080     _LIBCPP_INLINE_VISIBILITY
1081           value_compare& value_comp() _NOEXCEPT {return __pair3_.second();}
1082     _LIBCPP_INLINE_VISIBILITY
1083     const value_compare& value_comp() const _NOEXCEPT
1084         {return __pair3_.second();}
1085 public:
1086
1087     _LIBCPP_INLINE_VISIBILITY
1088     __node_pointer __root() const _NOEXCEPT
1089         {return static_cast<__node_pointer>(__end_node()->__left_);}
1090
1091     __node_base_pointer* __root_ptr() const _NOEXCEPT {
1092         return _VSTD::addressof(__end_node()->__left_);
1093     }
1094
1095     typedef __tree_iterator<value_type, __node_pointer, difference_type>             iterator;
1096     typedef __tree_const_iterator<value_type, __node_pointer, difference_type> const_iterator;
1097
1098     explicit __tree(const value_compare& __comp)
1099         _NOEXCEPT_(
1100             is_nothrow_default_constructible<__node_allocator>::value &&
1101             is_nothrow_copy_constructible<value_compare>::value);
1102     explicit __tree(const allocator_type& __a);
1103     __tree(const value_compare& __comp, const allocator_type& __a);
1104     __tree(const __tree& __t);
1105     __tree& operator=(const __tree& __t);
1106     template <class _InputIterator>
1107         void __assign_unique(_InputIterator __first, _InputIterator __last);
1108     template <class _InputIterator>
1109         void __assign_multi(_InputIterator __first, _InputIterator __last);
1110 #ifndef _LIBCPP_CXX03_LANG
1111     __tree(__tree&& __t)
1112         _NOEXCEPT_(
1113             is_nothrow_move_constructible<__node_allocator>::value &&
1114             is_nothrow_move_constructible<value_compare>::value);
1115     __tree(__tree&& __t, const allocator_type& __a);
1116     __tree& operator=(__tree&& __t)
1117         _NOEXCEPT_(
1118             __node_traits::propagate_on_container_move_assignment::value &&
1119             is_nothrow_move_assignable<value_compare>::value &&
1120             is_nothrow_move_assignable<__node_allocator>::value);
1121 #endif // _LIBCPP_CXX03_LANG
1122
1123     ~__tree();
1124
1125     _LIBCPP_INLINE_VISIBILITY
1126           iterator begin()  _NOEXCEPT {return       iterator(__begin_node());}
1127     _LIBCPP_INLINE_VISIBILITY
1128     const_iterator begin() const _NOEXCEPT {return const_iterator(__begin_node());}
1129     _LIBCPP_INLINE_VISIBILITY
1130           iterator end() _NOEXCEPT {return       iterator(__end_node());}
1131     _LIBCPP_INLINE_VISIBILITY
1132     const_iterator end() const _NOEXCEPT {return const_iterator(__end_node());}
1133
1134     _LIBCPP_INLINE_VISIBILITY
1135     size_type max_size() const _NOEXCEPT
1136         {return std::min<size_type>(
1137                 __node_traits::max_size(__node_alloc()),
1138                 numeric_limits<difference_type >::max());}
1139
1140     void clear() _NOEXCEPT;
1141
1142     void swap(__tree& __t)
1143 #if _LIBCPP_STD_VER <= 11
1144         _NOEXCEPT_(
1145             __is_nothrow_swappable<value_compare>::value
1146             && (!__node_traits::propagate_on_container_swap::value ||
1147                  __is_nothrow_swappable<__node_allocator>::value)
1148             );
1149 #else
1150         _NOEXCEPT_(__is_nothrow_swappable<value_compare>::value);
1151 #endif
1152
1153 #ifndef _LIBCPP_CXX03_LANG
1154     template <class _Key, class ..._Args>
1155     pair<iterator, bool>
1156     __emplace_unique_key_args(_Key const&, _Args&&... __args);
1157     template <class _Key, class ..._Args>
1158     iterator
1159     __emplace_hint_unique_key_args(const_iterator, _Key const&, _Args&&...);
1160
1161     template <class... _Args>
1162     pair<iterator, bool> __emplace_unique_impl(_Args&&... __args);
1163
1164     template <class... _Args>
1165     iterator __emplace_hint_unique_impl(const_iterator __p, _Args&&... __args);
1166
1167     template <class... _Args>
1168     iterator __emplace_multi(_Args&&... __args);
1169
1170     template <class... _Args>
1171     iterator __emplace_hint_multi(const_iterator __p, _Args&&... __args);
1172
1173     template <class _Pp>
1174     _LIBCPP_INLINE_VISIBILITY
1175     pair<iterator, bool> __emplace_unique(_Pp&& __x) {
1176         return __emplace_unique_extract_key(_VSTD::forward<_Pp>(__x),
1177                                             __can_extract_key<_Pp, key_type>());
1178     }
1179
1180     template <class _First, class _Second>
1181     _LIBCPP_INLINE_VISIBILITY
1182     typename enable_if<
1183         __can_extract_map_key<_First, key_type, __container_value_type>::value,
1184         pair<iterator, bool>
1185     >::type __emplace_unique(_First&& __f, _Second&& __s) {
1186         return __emplace_unique_key_args(__f, _VSTD::forward<_First>(__f),
1187                                               _VSTD::forward<_Second>(__s));
1188     }
1189
1190     template <class... _Args>
1191     _LIBCPP_INLINE_VISIBILITY
1192     pair<iterator, bool> __emplace_unique(_Args&&... __args) {
1193         return __emplace_unique_impl(_VSTD::forward<_Args>(__args)...);
1194     }
1195
1196     template <class _Pp>
1197     _LIBCPP_INLINE_VISIBILITY
1198     pair<iterator, bool>
1199     __emplace_unique_extract_key(_Pp&& __x, __extract_key_fail_tag) {
1200       return __emplace_unique_impl(_VSTD::forward<_Pp>(__x));
1201     }
1202
1203     template <class _Pp>
1204     _LIBCPP_INLINE_VISIBILITY
1205     pair<iterator, bool>
1206     __emplace_unique_extract_key(_Pp&& __x, __extract_key_self_tag) {
1207       return __emplace_unique_key_args(__x, _VSTD::forward<_Pp>(__x));
1208     }
1209
1210     template <class _Pp>
1211     _LIBCPP_INLINE_VISIBILITY
1212     pair<iterator, bool>
1213     __emplace_unique_extract_key(_Pp&& __x, __extract_key_first_tag) {
1214       return __emplace_unique_key_args(__x.first, _VSTD::forward<_Pp>(__x));
1215     }
1216
1217     template <class _Pp>
1218     _LIBCPP_INLINE_VISIBILITY
1219     iterator __emplace_hint_unique(const_iterator __p, _Pp&& __x) {
1220         return __emplace_hint_unique_extract_key(__p, _VSTD::forward<_Pp>(__x),
1221                                             __can_extract_key<_Pp, key_type>());
1222     }
1223
1224     template <class _First, class _Second>
1225     _LIBCPP_INLINE_VISIBILITY
1226     typename enable_if<
1227         __can_extract_map_key<_First, key_type, __container_value_type>::value,
1228         iterator
1229     >::type __emplace_hint_unique(const_iterator __p, _First&& __f, _Second&& __s) {
1230         return __emplace_hint_unique_key_args(__p, __f,
1231                                               _VSTD::forward<_First>(__f),
1232                                               _VSTD::forward<_Second>(__s));
1233     }
1234
1235     template <class... _Args>
1236     _LIBCPP_INLINE_VISIBILITY
1237     iterator __emplace_hint_unique(const_iterator __p, _Args&&... __args) {
1238         return __emplace_hint_unique_impl(__p, _VSTD::forward<_Args>(__args)...);
1239     }
1240
1241     template <class _Pp>
1242     _LIBCPP_INLINE_VISIBILITY
1243     iterator
1244     __emplace_hint_unique_extract_key(const_iterator __p, _Pp&& __x, __extract_key_fail_tag) {
1245       return __emplace_hint_unique_impl(__p, _VSTD::forward<_Pp>(__x));
1246     }
1247
1248     template <class _Pp>
1249     _LIBCPP_INLINE_VISIBILITY
1250     iterator
1251     __emplace_hint_unique_extract_key(const_iterator __p, _Pp&& __x, __extract_key_self_tag) {
1252       return __emplace_hint_unique_key_args(__p, __x, _VSTD::forward<_Pp>(__x));
1253     }
1254
1255     template <class _Pp>
1256     _LIBCPP_INLINE_VISIBILITY
1257     iterator
1258     __emplace_hint_unique_extract_key(const_iterator __p, _Pp&& __x, __extract_key_first_tag) {
1259       return __emplace_hint_unique_key_args(__p, __x.first, _VSTD::forward<_Pp>(__x));
1260     }
1261
1262 #else
1263     template <class _Key, class _Args>
1264     _LIBCPP_INLINE_VISIBILITY
1265     pair<iterator, bool> __emplace_unique_key_args(_Key const&, _Args& __args);
1266     template <class _Key, class _Args>
1267     _LIBCPP_INLINE_VISIBILITY
1268     iterator __emplace_hint_unique_key_args(const_iterator, _Key const&, _Args&);
1269 #endif
1270
1271     _LIBCPP_INLINE_VISIBILITY
1272     pair<iterator, bool> __insert_unique(const __container_value_type& __v) {
1273         return __emplace_unique_key_args(_NodeTypes::__get_key(__v), __v);
1274     }
1275
1276     _LIBCPP_INLINE_VISIBILITY
1277     iterator __insert_unique(const_iterator __p, const __container_value_type& __v) {
1278         return __emplace_hint_unique_key_args(__p, _NodeTypes::__get_key(__v), __v);
1279     }
1280
1281 #ifdef _LIBCPP_CXX03_LANG
1282     _LIBCPP_INLINE_VISIBILITY
1283     iterator __insert_multi(const __container_value_type& __v);
1284     _LIBCPP_INLINE_VISIBILITY
1285     iterator __insert_multi(const_iterator __p, const __container_value_type& __v);
1286 #else
1287     _LIBCPP_INLINE_VISIBILITY
1288     pair<iterator, bool> __insert_unique(__container_value_type&& __v) {
1289         return __emplace_unique_key_args(_NodeTypes::__get_key(__v), _VSTD::move(__v));
1290     }
1291
1292     _LIBCPP_INLINE_VISIBILITY
1293     iterator __insert_unique(const_iterator __p, __container_value_type&& __v) {
1294         return __emplace_hint_unique_key_args(__p, _NodeTypes::__get_key(__v), _VSTD::move(__v));
1295     }
1296
1297     template <class _Vp, class = typename enable_if<
1298             !is_same<typename __unconstref<_Vp>::type,
1299                      __container_value_type
1300             >::value
1301         >::type>
1302     _LIBCPP_INLINE_VISIBILITY
1303     pair<iterator, bool> __insert_unique(_Vp&& __v) {
1304         return __emplace_unique(_VSTD::forward<_Vp>(__v));
1305     }
1306
1307     template <class _Vp, class = typename enable_if<
1308             !is_same<typename __unconstref<_Vp>::type,
1309                      __container_value_type
1310             >::value
1311         >::type>
1312     _LIBCPP_INLINE_VISIBILITY
1313     iterator __insert_unique(const_iterator __p, _Vp&& __v) {
1314         return __emplace_hint_unique(__p, _VSTD::forward<_Vp>(__v));
1315     }
1316
1317     _LIBCPP_INLINE_VISIBILITY
1318     iterator __insert_multi(__container_value_type&& __v) {
1319         return __emplace_multi(_VSTD::move(__v));
1320     }
1321
1322     _LIBCPP_INLINE_VISIBILITY
1323     iterator __insert_multi(const_iterator __p, __container_value_type&& __v) {
1324         return __emplace_hint_multi(__p, _VSTD::move(__v));
1325     }
1326
1327     template <class _Vp>
1328     _LIBCPP_INLINE_VISIBILITY
1329     iterator __insert_multi(_Vp&& __v) {
1330         return __emplace_multi(_VSTD::forward<_Vp>(__v));
1331     }
1332
1333     template <class _Vp>
1334     _LIBCPP_INLINE_VISIBILITY
1335     iterator __insert_multi(const_iterator __p, _Vp&& __v) {
1336         return __emplace_hint_multi(__p, _VSTD::forward<_Vp>(__v));
1337     }
1338
1339 #endif // !_LIBCPP_CXX03_LANG
1340
1341     pair<iterator, bool> __node_insert_unique(__node_pointer __nd);
1342     iterator             __node_insert_unique(const_iterator __p,
1343                                               __node_pointer __nd);
1344
1345     iterator __node_insert_multi(__node_pointer __nd);
1346     iterator __node_insert_multi(const_iterator __p, __node_pointer __nd);
1347
1348     iterator erase(const_iterator __p);
1349     iterator erase(const_iterator __f, const_iterator __l);
1350     template <class _Key>
1351         size_type __erase_unique(const _Key& __k);
1352     template <class _Key>
1353         size_type __erase_multi(const _Key& __k);
1354
1355     void __insert_node_at(__parent_pointer     __parent,
1356                           __node_base_pointer& __child,
1357                           __node_base_pointer __new_node);
1358
1359     template <class _Key>
1360         iterator find(const _Key& __v);
1361     template <class _Key>
1362         const_iterator find(const _Key& __v) const;
1363
1364     template <class _Key>
1365         size_type __count_unique(const _Key& __k) const;
1366     template <class _Key>
1367         size_type __count_multi(const _Key& __k) const;
1368
1369     template <class _Key>
1370         _LIBCPP_INLINE_VISIBILITY
1371         iterator lower_bound(const _Key& __v)
1372             {return __lower_bound(__v, __root(), __end_node());}
1373     template <class _Key>
1374         iterator __lower_bound(const _Key& __v,
1375                                __node_pointer __root,
1376                                __iter_pointer __result);
1377     template <class _Key>
1378         _LIBCPP_INLINE_VISIBILITY
1379         const_iterator lower_bound(const _Key& __v) const
1380             {return __lower_bound(__v, __root(), __end_node());}
1381     template <class _Key>
1382         const_iterator __lower_bound(const _Key& __v,
1383                                      __node_pointer __root,
1384                                      __iter_pointer __result) const;
1385     template <class _Key>
1386         _LIBCPP_INLINE_VISIBILITY
1387         iterator upper_bound(const _Key& __v)
1388             {return __upper_bound(__v, __root(), __end_node());}
1389     template <class _Key>
1390         iterator __upper_bound(const _Key& __v,
1391                                __node_pointer __root,
1392                                __iter_pointer __result);
1393     template <class _Key>
1394         _LIBCPP_INLINE_VISIBILITY
1395         const_iterator upper_bound(const _Key& __v) const
1396             {return __upper_bound(__v, __root(), __end_node());}
1397     template <class _Key>
1398         const_iterator __upper_bound(const _Key& __v,
1399                                      __node_pointer __root,
1400                                      __iter_pointer __result) const;
1401     template <class _Key>
1402         pair<iterator, iterator>
1403         __equal_range_unique(const _Key& __k);
1404     template <class _Key>
1405         pair<const_iterator, const_iterator>
1406         __equal_range_unique(const _Key& __k) const;
1407
1408     template <class _Key>
1409         pair<iterator, iterator>
1410         __equal_range_multi(const _Key& __k);
1411     template <class _Key>
1412         pair<const_iterator, const_iterator>
1413         __equal_range_multi(const _Key& __k) const;
1414
1415     typedef __tree_node_destructor<__node_allocator> _Dp;
1416     typedef unique_ptr<__node, _Dp> __node_holder;
1417
1418     __node_holder remove(const_iterator __p) _NOEXCEPT;
1419 private:
1420     __node_base_pointer&
1421         __find_leaf_low(__parent_pointer& __parent, const key_type& __v);
1422     __node_base_pointer&
1423         __find_leaf_high(__parent_pointer& __parent, const key_type& __v);
1424     __node_base_pointer&
1425         __find_leaf(const_iterator __hint,
1426                     __parent_pointer& __parent, const key_type& __v);
1427     // FIXME: Make this function const qualified. Unfortunetly doing so
1428     // breaks existing code which uses non-const callable comparators.
1429     template <class _Key>
1430     __node_base_pointer&
1431         __find_equal(__parent_pointer& __parent, const _Key& __v);
1432     template <class _Key>
1433     _LIBCPP_INLINE_VISIBILITY __node_base_pointer&
1434     __find_equal(__parent_pointer& __parent, const _Key& __v) const {
1435       return const_cast<__tree*>(this)->__find_equal(__parent, __v);
1436     }
1437     template <class _Key>
1438     __node_base_pointer&
1439         __find_equal(const_iterator __hint, __parent_pointer& __parent,
1440                      __node_base_pointer& __dummy,
1441                      const _Key& __v);
1442
1443 #ifndef _LIBCPP_CXX03_LANG
1444     template <class ..._Args>
1445     __node_holder __construct_node(_Args&& ...__args);
1446 #else
1447     __node_holder __construct_node(const __container_value_type& __v);
1448 #endif
1449
1450     void destroy(__node_pointer __nd) _NOEXCEPT;
1451
1452     _LIBCPP_INLINE_VISIBILITY
1453     void __copy_assign_alloc(const __tree& __t)
1454         {__copy_assign_alloc(__t, integral_constant<bool,
1455              __node_traits::propagate_on_container_copy_assignment::value>());}
1456
1457     _LIBCPP_INLINE_VISIBILITY
1458     void __copy_assign_alloc(const __tree& __t, true_type)
1459         {
1460         if (__node_alloc() != __t.__node_alloc())
1461                 clear();
1462         __node_alloc() = __t.__node_alloc();
1463         }
1464     _LIBCPP_INLINE_VISIBILITY
1465     void __copy_assign_alloc(const __tree&, false_type) {}
1466
1467     void __move_assign(__tree& __t, false_type);
1468     void __move_assign(__tree& __t, true_type)
1469         _NOEXCEPT_(is_nothrow_move_assignable<value_compare>::value &&
1470                    is_nothrow_move_assignable<__node_allocator>::value);
1471
1472     _LIBCPP_INLINE_VISIBILITY
1473     void __move_assign_alloc(__tree& __t)
1474         _NOEXCEPT_(
1475             !__node_traits::propagate_on_container_move_assignment::value ||
1476             is_nothrow_move_assignable<__node_allocator>::value)
1477         {__move_assign_alloc(__t, integral_constant<bool,
1478              __node_traits::propagate_on_container_move_assignment::value>());}
1479
1480     _LIBCPP_INLINE_VISIBILITY
1481     void __move_assign_alloc(__tree& __t, true_type)
1482         _NOEXCEPT_(is_nothrow_move_assignable<__node_allocator>::value)
1483         {__node_alloc() = _VSTD::move(__t.__node_alloc());}
1484     _LIBCPP_INLINE_VISIBILITY
1485     void __move_assign_alloc(__tree&, false_type) _NOEXCEPT {}
1486
1487     __node_pointer __detach();
1488     static __node_pointer __detach(__node_pointer);
1489
1490     template <class, class, class, class> friend class _LIBCPP_TEMPLATE_VIS map;
1491     template <class, class, class, class> friend class _LIBCPP_TEMPLATE_VIS multimap;
1492 };
1493
1494 template <class _Tp, class _Compare, class _Allocator>
1495 __tree<_Tp, _Compare, _Allocator>::__tree(const value_compare& __comp)
1496         _NOEXCEPT_(
1497             is_nothrow_default_constructible<__node_allocator>::value &&
1498             is_nothrow_copy_constructible<value_compare>::value)
1499     : __pair3_(0, __comp)
1500 {
1501     __begin_node() = __end_node();
1502 }
1503
1504 template <class _Tp, class _Compare, class _Allocator>
1505 __tree<_Tp, _Compare, _Allocator>::__tree(const allocator_type& __a)
1506     : __begin_node_(__iter_pointer()),
1507       __pair1_(__second_tag(), __node_allocator(__a)),
1508       __pair3_(0)
1509 {
1510     __begin_node() = __end_node();
1511 }
1512
1513 template <class _Tp, class _Compare, class _Allocator>
1514 __tree<_Tp, _Compare, _Allocator>::__tree(const value_compare& __comp,
1515                                            const allocator_type& __a)
1516     : __begin_node_(__iter_pointer()),
1517       __pair1_(__second_tag(), __node_allocator(__a)),
1518       __pair3_(0, __comp)
1519 {
1520     __begin_node() = __end_node();
1521 }
1522
1523 // Precondition:  size() != 0
1524 template <class _Tp, class _Compare, class _Allocator>
1525 typename __tree<_Tp, _Compare, _Allocator>::__node_pointer
1526 __tree<_Tp, _Compare, _Allocator>::__detach()
1527 {
1528     __node_pointer __cache = static_cast<__node_pointer>(__begin_node());
1529     __begin_node() = __end_node();
1530     __end_node()->__left_->__parent_ = nullptr;
1531     __end_node()->__left_ = nullptr;
1532     size() = 0;
1533     // __cache->__left_ == nullptr
1534     if (__cache->__right_ != nullptr)
1535         __cache = static_cast<__node_pointer>(__cache->__right_);
1536     // __cache->__left_ == nullptr
1537     // __cache->__right_ == nullptr
1538     return __cache;
1539 }
1540
1541 // Precondition:  __cache != nullptr
1542 //    __cache->left_ == nullptr
1543 //    __cache->right_ == nullptr
1544 //    This is no longer a red-black tree
1545 template <class _Tp, class _Compare, class _Allocator>
1546 typename __tree<_Tp, _Compare, _Allocator>::__node_pointer
1547 __tree<_Tp, _Compare, _Allocator>::__detach(__node_pointer __cache)
1548 {
1549     if (__cache->__parent_ == nullptr)
1550         return nullptr;
1551     if (__tree_is_left_child(static_cast<__node_base_pointer>(__cache)))
1552     {
1553         __cache->__parent_->__left_ = nullptr;
1554         __cache = static_cast<__node_pointer>(__cache->__parent_);
1555         if (__cache->__right_ == nullptr)
1556             return __cache;
1557         return static_cast<__node_pointer>(__tree_leaf(__cache->__right_));
1558     }
1559     // __cache is right child
1560     __cache->__parent_unsafe()->__right_ = nullptr;
1561     __cache = static_cast<__node_pointer>(__cache->__parent_);
1562     if (__cache->__left_ == nullptr)
1563         return __cache;
1564     return static_cast<__node_pointer>(__tree_leaf(__cache->__left_));
1565 }
1566
1567 template <class _Tp, class _Compare, class _Allocator>
1568 __tree<_Tp, _Compare, _Allocator>&
1569 __tree<_Tp, _Compare, _Allocator>::operator=(const __tree& __t)
1570 {
1571     if (this != &__t)
1572     {
1573         value_comp() = __t.value_comp();
1574         __copy_assign_alloc(__t);
1575         __assign_multi(__t.begin(), __t.end());
1576     }
1577     return *this;
1578 }
1579
1580 template <class _Tp, class _Compare, class _Allocator>
1581 template <class _InputIterator>
1582 void
1583 __tree<_Tp, _Compare, _Allocator>::__assign_unique(_InputIterator __first, _InputIterator __last)
1584 {
1585     typedef iterator_traits<_InputIterator> _ITraits;
1586     typedef typename _ITraits::value_type _ItValueType;
1587     static_assert((is_same<_ItValueType, __container_value_type>::value),
1588                   "__assign_unique may only be called with the containers value type");
1589
1590     if (size() != 0)
1591     {
1592         __node_pointer __cache = __detach();
1593 #ifndef _LIBCPP_NO_EXCEPTIONS
1594         try
1595         {
1596 #endif  // _LIBCPP_NO_EXCEPTIONS
1597             for (; __cache != nullptr && __first != __last; ++__first)
1598             {
1599                 __cache->__value_ = *__first;
1600                 __node_pointer __next = __detach(__cache);
1601                 __node_insert_unique(__cache);
1602                 __cache = __next;
1603             }
1604 #ifndef _LIBCPP_NO_EXCEPTIONS
1605         }
1606         catch (...)
1607         {
1608             while (__cache->__parent_ != nullptr)
1609                 __cache = static_cast<__node_pointer>(__cache->__parent_);
1610             destroy(__cache);
1611             throw;
1612         }
1613 #endif  // _LIBCPP_NO_EXCEPTIONS
1614         if (__cache != nullptr)
1615         {
1616             while (__cache->__parent_ != nullptr)
1617                 __cache = static_cast<__node_pointer>(__cache->__parent_);
1618             destroy(__cache);
1619         }
1620     }
1621     for (; __first != __last; ++__first)
1622         __insert_unique(*__first);
1623 }
1624
1625 template <class _Tp, class _Compare, class _Allocator>
1626 template <class _InputIterator>
1627 void
1628 __tree<_Tp, _Compare, _Allocator>::__assign_multi(_InputIterator __first, _InputIterator __last)
1629 {
1630     typedef iterator_traits<_InputIterator> _ITraits;
1631     typedef typename _ITraits::value_type _ItValueType;
1632     static_assert((is_same<_ItValueType, __container_value_type>::value ||
1633                   is_same<_ItValueType, __node_value_type>::value),
1634                   "__assign_multi may only be called with the containers value type"
1635                   " or the nodes value type");
1636     if (size() != 0)
1637     {
1638         __node_pointer __cache = __detach();
1639 #ifndef _LIBCPP_NO_EXCEPTIONS
1640         try
1641         {
1642 #endif  // _LIBCPP_NO_EXCEPTIONS
1643             for (; __cache != nullptr && __first != __last; ++__first)
1644             {
1645                 __cache->__value_ = *__first;
1646                 __node_pointer __next = __detach(__cache);
1647                 __node_insert_multi(__cache);
1648                 __cache = __next;
1649             }
1650 #ifndef _LIBCPP_NO_EXCEPTIONS
1651         }
1652         catch (...)
1653         {
1654             while (__cache->__parent_ != nullptr)
1655                 __cache = static_cast<__node_pointer>(__cache->__parent_);
1656             destroy(__cache);
1657             throw;
1658         }
1659 #endif  // _LIBCPP_NO_EXCEPTIONS
1660         if (__cache != nullptr)
1661         {
1662             while (__cache->__parent_ != nullptr)
1663                 __cache = static_cast<__node_pointer>(__cache->__parent_);
1664             destroy(__cache);
1665         }
1666     }
1667     for (; __first != __last; ++__first)
1668         __insert_multi(_NodeTypes::__get_value(*__first));
1669 }
1670
1671 template <class _Tp, class _Compare, class _Allocator>
1672 __tree<_Tp, _Compare, _Allocator>::__tree(const __tree& __t)
1673     : __begin_node_(__iter_pointer()),
1674       __pair1_(__second_tag(), __node_traits::select_on_container_copy_construction(__t.__node_alloc())),
1675       __pair3_(0, __t.value_comp())
1676 {
1677     __begin_node() = __end_node();
1678 }
1679
1680 #ifndef _LIBCPP_CXX03_LANG
1681
1682 template <class _Tp, class _Compare, class _Allocator>
1683 __tree<_Tp, _Compare, _Allocator>::__tree(__tree&& __t)
1684     _NOEXCEPT_(
1685         is_nothrow_move_constructible<__node_allocator>::value &&
1686         is_nothrow_move_constructible<value_compare>::value)
1687     : __begin_node_(_VSTD::move(__t.__begin_node_)),
1688       __pair1_(_VSTD::move(__t.__pair1_)),
1689       __pair3_(_VSTD::move(__t.__pair3_))
1690 {
1691     if (size() == 0)
1692         __begin_node() = __end_node();
1693     else
1694     {
1695         __end_node()->__left_->__parent_ = static_cast<__parent_pointer>(__end_node());
1696         __t.__begin_node() = __t.__end_node();
1697         __t.__end_node()->__left_ = nullptr;
1698         __t.size() = 0;
1699     }
1700 }
1701
1702 template <class _Tp, class _Compare, class _Allocator>
1703 __tree<_Tp, _Compare, _Allocator>::__tree(__tree&& __t, const allocator_type& __a)
1704     : __pair1_(__second_tag(), __node_allocator(__a)),
1705       __pair3_(0, _VSTD::move(__t.value_comp()))
1706 {
1707     if (__a == __t.__alloc())
1708     {
1709         if (__t.size() == 0)
1710             __begin_node() = __end_node();
1711         else
1712         {
1713             __begin_node() = __t.__begin_node();
1714             __end_node()->__left_ = __t.__end_node()->__left_;
1715             __end_node()->__left_->__parent_ = static_cast<__parent_pointer>(__end_node());
1716             size() = __t.size();
1717             __t.__begin_node() = __t.__end_node();
1718             __t.__end_node()->__left_ = nullptr;
1719             __t.size() = 0;
1720         }
1721     }
1722     else
1723     {
1724         __begin_node() = __end_node();
1725     }
1726 }
1727
1728 template <class _Tp, class _Compare, class _Allocator>
1729 void
1730 __tree<_Tp, _Compare, _Allocator>::__move_assign(__tree& __t, true_type)
1731     _NOEXCEPT_(is_nothrow_move_assignable<value_compare>::value &&
1732                is_nothrow_move_assignable<__node_allocator>::value)
1733 {
1734     destroy(static_cast<__node_pointer>(__end_node()->__left_));
1735     __begin_node_ = __t.__begin_node_;
1736     __pair1_.first() = __t.__pair1_.first();
1737     __move_assign_alloc(__t);
1738     __pair3_ = _VSTD::move(__t.__pair3_);
1739     if (size() == 0)
1740         __begin_node() = __end_node();
1741     else
1742     {
1743         __end_node()->__left_->__parent_ = static_cast<__parent_pointer>(__end_node());
1744         __t.__begin_node() = __t.__end_node();
1745         __t.__end_node()->__left_ = nullptr;
1746         __t.size() = 0;
1747     }
1748 }
1749
1750 template <class _Tp, class _Compare, class _Allocator>
1751 void
1752 __tree<_Tp, _Compare, _Allocator>::__move_assign(__tree& __t, false_type)
1753 {
1754     if (__node_alloc() == __t.__node_alloc())
1755         __move_assign(__t, true_type());
1756     else
1757     {
1758         value_comp() = _VSTD::move(__t.value_comp());
1759         const_iterator __e = end();
1760         if (size() != 0)
1761         {
1762             __node_pointer __cache = __detach();
1763 #ifndef _LIBCPP_NO_EXCEPTIONS
1764             try
1765             {
1766 #endif  // _LIBCPP_NO_EXCEPTIONS
1767                 while (__cache != nullptr && __t.size() != 0)
1768                 {
1769                     __cache->__value_ = _VSTD::move(__t.remove(__t.begin())->__value_);
1770                     __node_pointer __next = __detach(__cache);
1771                     __node_insert_multi(__cache);
1772                     __cache = __next;
1773                 }
1774 #ifndef _LIBCPP_NO_EXCEPTIONS
1775             }
1776             catch (...)
1777             {
1778                 while (__cache->__parent_ != nullptr)
1779                     __cache = static_cast<__node_pointer>(__cache->__parent_);
1780                 destroy(__cache);
1781                 throw;
1782             }
1783 #endif  // _LIBCPP_NO_EXCEPTIONS
1784             if (__cache != nullptr)
1785             {
1786                 while (__cache->__parent_ != nullptr)
1787                     __cache = static_cast<__node_pointer>(__cache->__parent_);
1788                 destroy(__cache);
1789             }
1790         }
1791         while (__t.size() != 0)
1792             __insert_multi(__e, _NodeTypes::__move(__t.remove(__t.begin())->__value_));
1793     }
1794 }
1795
1796 template <class _Tp, class _Compare, class _Allocator>
1797 __tree<_Tp, _Compare, _Allocator>&
1798 __tree<_Tp, _Compare, _Allocator>::operator=(__tree&& __t)
1799     _NOEXCEPT_(
1800         __node_traits::propagate_on_container_move_assignment::value &&
1801         is_nothrow_move_assignable<value_compare>::value &&
1802         is_nothrow_move_assignable<__node_allocator>::value)
1803         
1804 {
1805     __move_assign(__t, integral_constant<bool,
1806                   __node_traits::propagate_on_container_move_assignment::value>());
1807     return *this;
1808 }
1809
1810 #endif  // _LIBCPP_CXX03_LANG
1811
1812 template <class _Tp, class _Compare, class _Allocator>
1813 __tree<_Tp, _Compare, _Allocator>::~__tree()
1814 {
1815     static_assert((is_copy_constructible<value_compare>::value),
1816                  "Comparator must be copy-constructible.");
1817 #ifndef _LIBCPP_CXX03_LANG
1818     static_assert((__diagnose_tree_helper<_Tp, _Compare, _Allocator>::
1819                      __trigger_diagnostics()), "");
1820 #endif
1821   destroy(__root());
1822 }
1823
1824 template <class _Tp, class _Compare, class _Allocator>
1825 void
1826 __tree<_Tp, _Compare, _Allocator>::destroy(__node_pointer __nd) _NOEXCEPT
1827 {
1828     if (__nd != nullptr)
1829     {
1830         destroy(static_cast<__node_pointer>(__nd->__left_));
1831         destroy(static_cast<__node_pointer>(__nd->__right_));
1832         __node_allocator& __na = __node_alloc();
1833         __node_traits::destroy(__na, _NodeTypes::__get_ptr(__nd->__value_));
1834         __node_traits::deallocate(__na, __nd, 1);
1835     }
1836 }
1837
1838 template <class _Tp, class _Compare, class _Allocator>
1839 void
1840 __tree<_Tp, _Compare, _Allocator>::swap(__tree& __t)
1841 #if _LIBCPP_STD_VER <= 11
1842         _NOEXCEPT_(
1843             __is_nothrow_swappable<value_compare>::value
1844             && (!__node_traits::propagate_on_container_swap::value ||
1845                  __is_nothrow_swappable<__node_allocator>::value)
1846             )
1847 #else
1848         _NOEXCEPT_(__is_nothrow_swappable<value_compare>::value)
1849 #endif
1850 {
1851     using _VSTD::swap;
1852     swap(__begin_node_, __t.__begin_node_);
1853     swap(__pair1_.first(), __t.__pair1_.first());
1854     __swap_allocator(__node_alloc(), __t.__node_alloc());
1855     __pair3_.swap(__t.__pair3_);
1856     if (size() == 0)
1857         __begin_node() = __end_node();
1858     else
1859         __end_node()->__left_->__parent_ = static_cast<__parent_pointer>(__end_node());
1860     if (__t.size() == 0)
1861         __t.__begin_node() = __t.__end_node();
1862     else
1863         __t.__end_node()->__left_->__parent_ = static_cast<__parent_pointer>(__t.__end_node());
1864 }
1865
1866 template <class _Tp, class _Compare, class _Allocator>
1867 void
1868 __tree<_Tp, _Compare, _Allocator>::clear() _NOEXCEPT
1869 {
1870     destroy(__root());
1871     size() = 0;
1872     __begin_node() = __end_node();
1873     __end_node()->__left_ = nullptr;
1874 }
1875
1876 // Find lower_bound place to insert
1877 // Set __parent to parent of null leaf
1878 // Return reference to null leaf
1879 template <class _Tp, class _Compare, class _Allocator>
1880 typename __tree<_Tp, _Compare, _Allocator>::__node_base_pointer&
1881 __tree<_Tp, _Compare, _Allocator>::__find_leaf_low(__parent_pointer& __parent,
1882                                                    const key_type& __v)
1883 {
1884     __node_pointer __nd = __root();
1885     if (__nd != nullptr)
1886     {
1887         while (true)
1888         {
1889             if (value_comp()(__nd->__value_, __v))
1890             {
1891                 if (__nd->__right_ != nullptr)
1892                     __nd = static_cast<__node_pointer>(__nd->__right_);
1893                 else
1894                 {
1895                     __parent = static_cast<__parent_pointer>(__nd);
1896                     return __nd->__right_;
1897                 }
1898             }
1899             else
1900             {
1901                 if (__nd->__left_ != nullptr)
1902                     __nd = static_cast<__node_pointer>(__nd->__left_);
1903                 else
1904                 {
1905                     __parent = static_cast<__parent_pointer>(__nd);
1906                     return __parent->__left_;
1907                 }
1908             }
1909         }
1910     }
1911     __parent = static_cast<__parent_pointer>(__end_node());
1912     return __parent->__left_;
1913 }
1914
1915 // Find upper_bound place to insert
1916 // Set __parent to parent of null leaf
1917 // Return reference to null leaf
1918 template <class _Tp, class _Compare, class _Allocator>
1919 typename __tree<_Tp, _Compare, _Allocator>::__node_base_pointer&
1920 __tree<_Tp, _Compare, _Allocator>::__find_leaf_high(__parent_pointer& __parent,
1921                                                     const key_type& __v)
1922 {
1923     __node_pointer __nd = __root();
1924     if (__nd != nullptr)
1925     {
1926         while (true)
1927         {
1928             if (value_comp()(__v, __nd->__value_))
1929             {
1930                 if (__nd->__left_ != nullptr)
1931                     __nd = static_cast<__node_pointer>(__nd->__left_);
1932                 else
1933                 {
1934                     __parent = static_cast<__parent_pointer>(__nd);
1935                     return __parent->__left_;
1936                 }
1937             }
1938             else
1939             {
1940                 if (__nd->__right_ != nullptr)
1941                     __nd = static_cast<__node_pointer>(__nd->__right_);
1942                 else
1943                 {
1944                     __parent = static_cast<__parent_pointer>(__nd);
1945                     return __nd->__right_;
1946                 }
1947             }
1948         }
1949     }
1950     __parent = static_cast<__parent_pointer>(__end_node());
1951     return __parent->__left_;
1952 }
1953
1954 // Find leaf place to insert closest to __hint
1955 // First check prior to __hint.
1956 // Next check after __hint.
1957 // Next do O(log N) search.
1958 // Set __parent to parent of null leaf
1959 // Return reference to null leaf
1960 template <class _Tp, class _Compare, class _Allocator>
1961 typename __tree<_Tp, _Compare, _Allocator>::__node_base_pointer&
1962 __tree<_Tp, _Compare, _Allocator>::__find_leaf(const_iterator __hint,
1963                                                __parent_pointer& __parent,
1964                                                const key_type& __v)
1965 {
1966     if (__hint == end() || !value_comp()(*__hint, __v))  // check before
1967     {
1968         // __v <= *__hint
1969         const_iterator __prior = __hint;
1970         if (__prior == begin() || !value_comp()(__v, *--__prior))
1971         {
1972             // *prev(__hint) <= __v <= *__hint
1973             if (__hint.__ptr_->__left_ == nullptr)
1974             {
1975                 __parent = static_cast<__parent_pointer>(__hint.__ptr_);
1976                 return __parent->__left_;
1977             }
1978             else
1979             {
1980                 __parent = static_cast<__parent_pointer>(__prior.__ptr_);
1981                 return static_cast<__node_base_pointer>(__prior.__ptr_)->__right_;
1982             }
1983         }
1984         // __v < *prev(__hint)
1985         return __find_leaf_high(__parent, __v);
1986     }
1987     // else __v > *__hint
1988     return __find_leaf_low(__parent, __v);
1989 }
1990
1991 // Find place to insert if __v doesn't exist
1992 // Set __parent to parent of null leaf
1993 // Return reference to null leaf
1994 // If __v exists, set parent to node of __v and return reference to node of __v
1995 template <class _Tp, class _Compare, class _Allocator>
1996 template <class _Key>
1997 typename __tree<_Tp, _Compare, _Allocator>::__node_base_pointer&
1998 __tree<_Tp, _Compare, _Allocator>::__find_equal(__parent_pointer& __parent,
1999                                                 const _Key& __v)
2000 {
2001     __node_pointer __nd = __root();
2002     __node_base_pointer* __nd_ptr = __root_ptr();
2003     if (__nd != nullptr)
2004     {
2005         while (true)
2006         {
2007             if (value_comp()(__v, __nd->__value_))
2008             {
2009                 if (__nd->__left_ != nullptr) {
2010                     __nd_ptr = _VSTD::addressof(__nd->__left_);
2011                     __nd = static_cast<__node_pointer>(__nd->__left_);
2012                 } else {
2013                     __parent = static_cast<__parent_pointer>(__nd);
2014                     return __parent->__left_;
2015                 }
2016             }
2017             else if (value_comp()(__nd->__value_, __v))
2018             {
2019                 if (__nd->__right_ != nullptr) {
2020                     __nd_ptr = _VSTD::addressof(__nd->__right_);
2021                     __nd = static_cast<__node_pointer>(__nd->__right_);
2022                 } else {
2023                     __parent = static_cast<__parent_pointer>(__nd);
2024                     return __nd->__right_;
2025                 }
2026             }
2027             else
2028             {
2029                 __parent = static_cast<__parent_pointer>(__nd);
2030                 return *__nd_ptr;
2031             }
2032         }
2033     }
2034     __parent = static_cast<__parent_pointer>(__end_node());
2035     return __parent->__left_;
2036 }
2037
2038 // Find place to insert if __v doesn't exist
2039 // First check prior to __hint.
2040 // Next check after __hint.
2041 // Next do O(log N) search.
2042 // Set __parent to parent of null leaf
2043 // Return reference to null leaf
2044 // If __v exists, set parent to node of __v and return reference to node of __v
2045 template <class _Tp, class _Compare, class _Allocator>
2046 template <class _Key>
2047 typename __tree<_Tp, _Compare, _Allocator>::__node_base_pointer&
2048 __tree<_Tp, _Compare, _Allocator>::__find_equal(const_iterator __hint,
2049                                                 __parent_pointer& __parent,
2050                                                 __node_base_pointer& __dummy,
2051                                                 const _Key& __v)
2052 {
2053     if (__hint == end() || value_comp()(__v, *__hint))  // check before
2054     {
2055         // __v < *__hint
2056         const_iterator __prior = __hint;
2057         if (__prior == begin() || value_comp()(*--__prior, __v))
2058         {
2059             // *prev(__hint) < __v < *__hint
2060             if (__hint.__ptr_->__left_ == nullptr)
2061             {
2062                 __parent = static_cast<__parent_pointer>(__hint.__ptr_);
2063                 return __parent->__left_;
2064             }
2065             else
2066             {
2067                 __parent = static_cast<__parent_pointer>(__prior.__ptr_);
2068                 return static_cast<__node_base_pointer>(__prior.__ptr_)->__right_;
2069             }
2070         }
2071         // __v <= *prev(__hint)
2072         return __find_equal(__parent, __v);
2073     }
2074     else if (value_comp()(*__hint, __v))  // check after
2075     {
2076         // *__hint < __v
2077         const_iterator __next = _VSTD::next(__hint);
2078         if (__next == end() || value_comp()(__v, *__next))
2079         {
2080             // *__hint < __v < *_VSTD::next(__hint)
2081             if (__hint.__get_np()->__right_ == nullptr)
2082             {
2083                 __parent = static_cast<__parent_pointer>(__hint.__ptr_);
2084                 return static_cast<__node_base_pointer>(__hint.__ptr_)->__right_;
2085             }
2086             else
2087             {
2088                 __parent = static_cast<__parent_pointer>(__next.__ptr_);
2089                 return __parent->__left_;
2090             }
2091         }
2092         // *next(__hint) <= __v
2093         return __find_equal(__parent, __v);
2094     }
2095     // else __v == *__hint
2096     __parent = static_cast<__parent_pointer>(__hint.__ptr_);
2097     __dummy = static_cast<__node_base_pointer>(__hint.__ptr_);
2098     return __dummy;
2099 }
2100
2101 template <class _Tp, class _Compare, class _Allocator>
2102 void
2103 __tree<_Tp, _Compare, _Allocator>::__insert_node_at(__parent_pointer     __parent,
2104                                                     __node_base_pointer& __child,
2105                                                     __node_base_pointer  __new_node)
2106 {
2107     __new_node->__left_   = nullptr;
2108     __new_node->__right_  = nullptr;
2109     __new_node->__parent_ = __parent;
2110     // __new_node->__is_black_ is initialized in __tree_balance_after_insert
2111     __child = __new_node;
2112     if (__begin_node()->__left_ != nullptr)
2113         __begin_node() = static_cast<__iter_pointer>(__begin_node()->__left_);
2114     __tree_balance_after_insert(__end_node()->__left_, __child);
2115     ++size();
2116 }
2117
2118 #ifndef _LIBCPP_CXX03_LANG
2119 template <class _Tp, class _Compare, class _Allocator>
2120 template <class _Key, class... _Args>
2121 pair<typename __tree<_Tp, _Compare, _Allocator>::iterator, bool>
2122 __tree<_Tp, _Compare, _Allocator>::__emplace_unique_key_args(_Key const& __k, _Args&&... __args)
2123 #else
2124 template <class _Tp, class _Compare, class _Allocator>
2125 template <class _Key, class _Args>
2126 pair<typename __tree<_Tp, _Compare, _Allocator>::iterator, bool>
2127 __tree<_Tp, _Compare, _Allocator>::__emplace_unique_key_args(_Key const& __k, _Args& __args)
2128 #endif
2129 {
2130     __parent_pointer __parent;
2131     __node_base_pointer& __child = __find_equal(__parent, __k);
2132     __node_pointer __r = static_cast<__node_pointer>(__child);
2133     bool __inserted = false;
2134     if (__child == nullptr)
2135     {
2136 #ifndef _LIBCPP_CXX03_LANG
2137         __node_holder __h = __construct_node(_VSTD::forward<_Args>(__args)...);
2138 #else
2139         __node_holder __h = __construct_node(__args);
2140 #endif
2141         __insert_node_at(__parent, __child, static_cast<__node_base_pointer>(__h.get()));
2142         __r = __h.release();
2143         __inserted = true;
2144     }
2145     return pair<iterator, bool>(iterator(__r), __inserted);
2146 }
2147
2148
2149 #ifndef _LIBCPP_CXX03_LANG
2150 template <class _Tp, class _Compare, class _Allocator>
2151 template <class _Key, class... _Args>
2152 typename __tree<_Tp, _Compare, _Allocator>::iterator
2153 __tree<_Tp, _Compare, _Allocator>::__emplace_hint_unique_key_args(
2154     const_iterator __p, _Key const& __k, _Args&&... __args)
2155 #else
2156 template <class _Tp, class _Compare, class _Allocator>
2157 template <class _Key, class _Args>
2158 typename __tree<_Tp, _Compare, _Allocator>::iterator
2159 __tree<_Tp, _Compare, _Allocator>::__emplace_hint_unique_key_args(
2160     const_iterator __p, _Key const& __k, _Args& __args)
2161 #endif
2162 {
2163     __parent_pointer __parent;
2164     __node_base_pointer __dummy;
2165     __node_base_pointer& __child = __find_equal(__p, __parent, __dummy, __k);
2166     __node_pointer __r = static_cast<__node_pointer>(__child);
2167     if (__child == nullptr)
2168     {
2169 #ifndef _LIBCPP_CXX03_LANG
2170         __node_holder __h = __construct_node(_VSTD::forward<_Args>(__args)...);
2171 #else
2172         __node_holder __h = __construct_node(__args);
2173 #endif
2174         __insert_node_at(__parent, __child, static_cast<__node_base_pointer>(__h.get()));
2175         __r = __h.release();
2176     }
2177     return iterator(__r);
2178 }
2179
2180
2181 #ifndef _LIBCPP_CXX03_LANG
2182
2183 template <class _Tp, class _Compare, class _Allocator>
2184 template <class ..._Args>
2185 typename __tree<_Tp, _Compare, _Allocator>::__node_holder
2186 __tree<_Tp, _Compare, _Allocator>::__construct_node(_Args&& ...__args)
2187 {
2188     static_assert(!__is_tree_value_type<_Args...>::value,
2189                   "Cannot construct from __value_type");
2190     __node_allocator& __na = __node_alloc();
2191     __node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na));
2192     __node_traits::construct(__na, _NodeTypes::__get_ptr(__h->__value_), _VSTD::forward<_Args>(__args)...);
2193     __h.get_deleter().__value_constructed = true;
2194     return __h;
2195 }
2196
2197
2198 template <class _Tp, class _Compare, class _Allocator>
2199 template <class... _Args>
2200 pair<typename __tree<_Tp, _Compare, _Allocator>::iterator, bool>
2201 __tree<_Tp, _Compare, _Allocator>::__emplace_unique_impl(_Args&&... __args)
2202 {
2203     __node_holder __h = __construct_node(_VSTD::forward<_Args>(__args)...);
2204     __parent_pointer __parent;
2205     __node_base_pointer& __child = __find_equal(__parent, __h->__value_);
2206     __node_pointer __r = static_cast<__node_pointer>(__child);
2207     bool __inserted = false;
2208     if (__child == nullptr)
2209     {
2210         __insert_node_at(__parent, __child, static_cast<__node_base_pointer>(__h.get()));
2211         __r = __h.release();
2212         __inserted = true;
2213     }
2214     return pair<iterator, bool>(iterator(__r), __inserted);
2215 }
2216
2217 template <class _Tp, class _Compare, class _Allocator>
2218 template <class... _Args>
2219 typename __tree<_Tp, _Compare, _Allocator>::iterator
2220 __tree<_Tp, _Compare, _Allocator>::__emplace_hint_unique_impl(const_iterator __p, _Args&&... __args)
2221 {
2222     __node_holder __h = __construct_node(_VSTD::forward<_Args>(__args)...);
2223     __parent_pointer __parent;
2224     __node_base_pointer __dummy;
2225     __node_base_pointer& __child = __find_equal(__p, __parent, __dummy, __h->__value_);
2226     __node_pointer __r = static_cast<__node_pointer>(__child);
2227     if (__child == nullptr)
2228     {
2229         __insert_node_at(__parent, __child, static_cast<__node_base_pointer>(__h.get()));
2230         __r = __h.release();
2231     }
2232     return iterator(__r);
2233 }
2234
2235 template <class _Tp, class _Compare, class _Allocator>
2236 template <class... _Args>
2237 typename __tree<_Tp, _Compare, _Allocator>::iterator
2238 __tree<_Tp, _Compare, _Allocator>::__emplace_multi(_Args&&... __args)
2239 {
2240     __node_holder __h = __construct_node(_VSTD::forward<_Args>(__args)...);
2241     __parent_pointer __parent;
2242     __node_base_pointer& __child = __find_leaf_high(__parent, _NodeTypes::__get_key(__h->__value_));
2243     __insert_node_at(__parent, __child, static_cast<__node_base_pointer>(__h.get()));
2244     return iterator(static_cast<__node_pointer>(__h.release()));
2245 }
2246
2247 template <class _Tp, class _Compare, class _Allocator>
2248 template <class... _Args>
2249 typename __tree<_Tp, _Compare, _Allocator>::iterator
2250 __tree<_Tp, _Compare, _Allocator>::__emplace_hint_multi(const_iterator __p,
2251                                                         _Args&&... __args)
2252 {
2253     __node_holder __h = __construct_node(_VSTD::forward<_Args>(__args)...);
2254     __parent_pointer __parent;
2255     __node_base_pointer& __child = __find_leaf(__p, __parent, _NodeTypes::__get_key(__h->__value_));
2256     __insert_node_at(__parent, __child, static_cast<__node_base_pointer>(__h.get()));
2257     return iterator(static_cast<__node_pointer>(__h.release()));
2258 }
2259
2260
2261 #else  // _LIBCPP_CXX03_LANG
2262
2263 template <class _Tp, class _Compare, class _Allocator>
2264 typename __tree<_Tp, _Compare, _Allocator>::__node_holder
2265 __tree<_Tp, _Compare, _Allocator>::__construct_node(const __container_value_type& __v)
2266 {
2267     __node_allocator& __na = __node_alloc();
2268     __node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na));
2269     __node_traits::construct(__na, _NodeTypes::__get_ptr(__h->__value_), __v);
2270     __h.get_deleter().__value_constructed = true;
2271     return _LIBCPP_EXPLICIT_MOVE(__h);  // explicitly moved for C++03
2272 }
2273
2274 #endif  // _LIBCPP_CXX03_LANG
2275
2276 #ifdef _LIBCPP_CXX03_LANG
2277 template <class _Tp, class _Compare, class _Allocator>
2278 typename __tree<_Tp, _Compare, _Allocator>::iterator
2279 __tree<_Tp, _Compare, _Allocator>::__insert_multi(const __container_value_type& __v)
2280 {
2281     __parent_pointer __parent;
2282     __node_base_pointer& __child = __find_leaf_high(__parent, _NodeTypes::__get_key(__v));
2283     __node_holder __h = __construct_node(__v);
2284     __insert_node_at(__parent, __child, static_cast<__node_base_pointer>(__h.get()));
2285     return iterator(__h.release());
2286 }
2287
2288 template <class _Tp, class _Compare, class _Allocator>
2289 typename __tree<_Tp, _Compare, _Allocator>::iterator
2290 __tree<_Tp, _Compare, _Allocator>::__insert_multi(const_iterator __p, const __container_value_type& __v)
2291 {
2292     __parent_pointer __parent;
2293     __node_base_pointer& __child = __find_leaf(__p, __parent, _NodeTypes::__get_key(__v));
2294     __node_holder __h = __construct_node(__v);
2295     __insert_node_at(__parent, __child, static_cast<__node_base_pointer>(__h.get()));
2296     return iterator(__h.release());
2297 }
2298 #endif
2299
2300 template <class _Tp, class _Compare, class _Allocator>
2301 pair<typename __tree<_Tp, _Compare, _Allocator>::iterator, bool>
2302 __tree<_Tp, _Compare, _Allocator>::__node_insert_unique(__node_pointer __nd)
2303 {
2304     __parent_pointer __parent;
2305     __node_base_pointer& __child = __find_equal(__parent, __nd->__value_);
2306     __node_pointer __r = static_cast<__node_pointer>(__child);
2307     bool __inserted = false;
2308     if (__child == nullptr)
2309     {
2310         __insert_node_at(__parent, __child, static_cast<__node_base_pointer>(__nd));
2311         __r = __nd;
2312         __inserted = true;
2313     }
2314     return pair<iterator, bool>(iterator(__r), __inserted);
2315 }
2316
2317 template <class _Tp, class _Compare, class _Allocator>
2318 typename __tree<_Tp, _Compare, _Allocator>::iterator
2319 __tree<_Tp, _Compare, _Allocator>::__node_insert_unique(const_iterator __p,
2320                                                         __node_pointer __nd)
2321 {
2322     __parent_pointer __parent;
2323     __node_base_pointer __dummy;
2324     __node_base_pointer& __child = __find_equal(__p, __parent, __nd->__value_);
2325     __node_pointer __r = static_cast<__node_pointer>(__child);
2326     if (__child == nullptr)
2327     {
2328         __insert_node_at(__parent, __child, static_cast<__node_base_pointer>(__nd));
2329         __r = __nd;
2330     }
2331     return iterator(__r);
2332 }
2333
2334 template <class _Tp, class _Compare, class _Allocator>
2335 typename __tree<_Tp, _Compare, _Allocator>::iterator
2336 __tree<_Tp, _Compare, _Allocator>::__node_insert_multi(__node_pointer __nd)
2337 {
2338     __parent_pointer __parent;
2339     __node_base_pointer& __child = __find_leaf_high(__parent, _NodeTypes::__get_key(__nd->__value_));
2340     __insert_node_at(__parent, __child, static_cast<__node_base_pointer>(__nd));
2341     return iterator(__nd);
2342 }
2343
2344 template <class _Tp, class _Compare, class _Allocator>
2345 typename __tree<_Tp, _Compare, _Allocator>::iterator
2346 __tree<_Tp, _Compare, _Allocator>::__node_insert_multi(const_iterator __p,
2347                                                        __node_pointer __nd)
2348 {
2349     __parent_pointer __parent;
2350     __node_base_pointer& __child = __find_leaf(__p, __parent, _NodeTypes::__get_key(__nd->__value_));
2351     __insert_node_at(__parent, __child, static_cast<__node_base_pointer>(__nd));
2352     return iterator(__nd);
2353 }
2354
2355 template <class _Tp, class _Compare, class _Allocator>
2356 typename __tree<_Tp, _Compare, _Allocator>::iterator
2357 __tree<_Tp, _Compare, _Allocator>::erase(const_iterator __p)
2358 {
2359     __node_pointer __np = __p.__get_np();
2360     iterator __r(__p.__ptr_);
2361     ++__r;
2362     if (__begin_node() == __p.__ptr_)
2363         __begin_node() = __r.__ptr_;
2364     --size();
2365     __node_allocator& __na = __node_alloc();
2366     __tree_remove(__end_node()->__left_,
2367                   static_cast<__node_base_pointer>(__np));
2368     __node_traits::destroy(__na, _NodeTypes::__get_ptr(
2369         const_cast<__node_value_type&>(*__p)));
2370     __node_traits::deallocate(__na, __np, 1);
2371     return __r;
2372 }
2373
2374 template <class _Tp, class _Compare, class _Allocator>
2375 typename __tree<_Tp, _Compare, _Allocator>::iterator
2376 __tree<_Tp, _Compare, _Allocator>::erase(const_iterator __f, const_iterator __l)
2377 {
2378     while (__f != __l)
2379         __f = erase(__f);
2380     return iterator(__l.__ptr_);
2381 }
2382
2383 template <class _Tp, class _Compare, class _Allocator>
2384 template <class _Key>
2385 typename __tree<_Tp, _Compare, _Allocator>::size_type
2386 __tree<_Tp, _Compare, _Allocator>::__erase_unique(const _Key& __k)
2387 {
2388     iterator __i = find(__k);
2389     if (__i == end())
2390         return 0;
2391     erase(__i);
2392     return 1;
2393 }
2394
2395 template <class _Tp, class _Compare, class _Allocator>
2396 template <class _Key>
2397 typename __tree<_Tp, _Compare, _Allocator>::size_type
2398 __tree<_Tp, _Compare, _Allocator>::__erase_multi(const _Key& __k)
2399 {
2400     pair<iterator, iterator> __p = __equal_range_multi(__k);
2401     size_type __r = 0;
2402     for (; __p.first != __p.second; ++__r)
2403         __p.first = erase(__p.first);
2404     return __r;
2405 }
2406
2407 template <class _Tp, class _Compare, class _Allocator>
2408 template <class _Key>
2409 typename __tree<_Tp, _Compare, _Allocator>::iterator
2410 __tree<_Tp, _Compare, _Allocator>::find(const _Key& __v)
2411 {
2412     iterator __p = __lower_bound(__v, __root(), __end_node());
2413     if (__p != end() && !value_comp()(__v, *__p))
2414         return __p;
2415     return end();
2416 }
2417
2418 template <class _Tp, class _Compare, class _Allocator>
2419 template <class _Key>
2420 typename __tree<_Tp, _Compare, _Allocator>::const_iterator
2421 __tree<_Tp, _Compare, _Allocator>::find(const _Key& __v) const
2422 {
2423     const_iterator __p = __lower_bound(__v, __root(), __end_node());
2424     if (__p != end() && !value_comp()(__v, *__p))
2425         return __p;
2426     return end();
2427 }
2428
2429 template <class _Tp, class _Compare, class _Allocator>
2430 template <class _Key>
2431 typename __tree<_Tp, _Compare, _Allocator>::size_type
2432 __tree<_Tp, _Compare, _Allocator>::__count_unique(const _Key& __k) const
2433 {
2434     __node_pointer __rt = __root();
2435     while (__rt != nullptr)
2436     {
2437         if (value_comp()(__k, __rt->__value_))
2438         {
2439             __rt = static_cast<__node_pointer>(__rt->__left_);
2440         }
2441         else if (value_comp()(__rt->__value_, __k))
2442             __rt = static_cast<__node_pointer>(__rt->__right_);
2443         else
2444             return 1;
2445     }
2446     return 0;
2447 }
2448
2449 template <class _Tp, class _Compare, class _Allocator>
2450 template <class _Key>
2451 typename __tree<_Tp, _Compare, _Allocator>::size_type
2452 __tree<_Tp, _Compare, _Allocator>::__count_multi(const _Key& __k) const
2453 {
2454     __iter_pointer __result = __end_node();
2455     __node_pointer __rt = __root();
2456     while (__rt != nullptr)
2457     {
2458         if (value_comp()(__k, __rt->__value_))
2459         {
2460             __result = static_cast<__iter_pointer>(__rt);
2461             __rt = static_cast<__node_pointer>(__rt->__left_);
2462         }
2463         else if (value_comp()(__rt->__value_, __k))
2464             __rt = static_cast<__node_pointer>(__rt->__right_);
2465         else
2466             return _VSTD::distance(
2467                 __lower_bound(__k, static_cast<__node_pointer>(__rt->__left_), static_cast<__iter_pointer>(__rt)),
2468                 __upper_bound(__k, static_cast<__node_pointer>(__rt->__right_), __result)
2469             );
2470     }
2471     return 0;
2472 }
2473
2474 template <class _Tp, class _Compare, class _Allocator>
2475 template <class _Key>
2476 typename __tree<_Tp, _Compare, _Allocator>::iterator
2477 __tree<_Tp, _Compare, _Allocator>::__lower_bound(const _Key& __v,
2478                                                  __node_pointer __root,
2479                                                  __iter_pointer __result)
2480 {
2481     while (__root != nullptr)
2482     {
2483         if (!value_comp()(__root->__value_, __v))
2484         {
2485             __result = static_cast<__iter_pointer>(__root);
2486             __root = static_cast<__node_pointer>(__root->__left_);
2487         }
2488         else
2489             __root = static_cast<__node_pointer>(__root->__right_);
2490     }
2491     return iterator(__result);
2492 }
2493
2494 template <class _Tp, class _Compare, class _Allocator>
2495 template <class _Key>
2496 typename __tree<_Tp, _Compare, _Allocator>::const_iterator
2497 __tree<_Tp, _Compare, _Allocator>::__lower_bound(const _Key& __v,
2498                                                  __node_pointer __root,
2499                                                  __iter_pointer __result) const
2500 {
2501     while (__root != nullptr)
2502     {
2503         if (!value_comp()(__root->__value_, __v))
2504         {
2505             __result = static_cast<__iter_pointer>(__root);
2506             __root = static_cast<__node_pointer>(__root->__left_);
2507         }
2508         else
2509             __root = static_cast<__node_pointer>(__root->__right_);
2510     }
2511     return const_iterator(__result);
2512 }
2513
2514 template <class _Tp, class _Compare, class _Allocator>
2515 template <class _Key>
2516 typename __tree<_Tp, _Compare, _Allocator>::iterator
2517 __tree<_Tp, _Compare, _Allocator>::__upper_bound(const _Key& __v,
2518                                                  __node_pointer __root,
2519                                                  __iter_pointer __result)
2520 {
2521     while (__root != nullptr)
2522     {
2523         if (value_comp()(__v, __root->__value_))
2524         {
2525             __result = static_cast<__iter_pointer>(__root);
2526             __root = static_cast<__node_pointer>(__root->__left_);
2527         }
2528         else
2529             __root = static_cast<__node_pointer>(__root->__right_);
2530     }
2531     return iterator(__result);
2532 }
2533
2534 template <class _Tp, class _Compare, class _Allocator>
2535 template <class _Key>
2536 typename __tree<_Tp, _Compare, _Allocator>::const_iterator
2537 __tree<_Tp, _Compare, _Allocator>::__upper_bound(const _Key& __v,
2538                                                  __node_pointer __root,
2539                                                  __iter_pointer __result) const
2540 {
2541     while (__root != nullptr)
2542     {
2543         if (value_comp()(__v, __root->__value_))
2544         {
2545             __result = static_cast<__iter_pointer>(__root);
2546             __root = static_cast<__node_pointer>(__root->__left_);
2547         }
2548         else
2549             __root = static_cast<__node_pointer>(__root->__right_);
2550     }
2551     return const_iterator(__result);
2552 }
2553
2554 template <class _Tp, class _Compare, class _Allocator>
2555 template <class _Key>
2556 pair<typename __tree<_Tp, _Compare, _Allocator>::iterator,
2557      typename __tree<_Tp, _Compare, _Allocator>::iterator>
2558 __tree<_Tp, _Compare, _Allocator>::__equal_range_unique(const _Key& __k)
2559 {
2560     typedef pair<iterator, iterator> _Pp;
2561     __iter_pointer __result = __end_node();
2562     __node_pointer __rt = __root();
2563     while (__rt != nullptr)
2564     {
2565         if (value_comp()(__k, __rt->__value_))
2566         {
2567             __result = static_cast<__iter_pointer>(__rt);
2568             __rt = static_cast<__node_pointer>(__rt->__left_);
2569         }
2570         else if (value_comp()(__rt->__value_, __k))
2571             __rt = static_cast<__node_pointer>(__rt->__right_);
2572         else
2573             return _Pp(iterator(__rt),
2574                       iterator(
2575                           __rt->__right_ != nullptr ?
2576                               static_cast<__iter_pointer>(__tree_min(__rt->__right_))
2577                             : __result));
2578     }
2579     return _Pp(iterator(__result), iterator(__result));
2580 }
2581
2582 template <class _Tp, class _Compare, class _Allocator>
2583 template <class _Key>
2584 pair<typename __tree<_Tp, _Compare, _Allocator>::const_iterator,
2585      typename __tree<_Tp, _Compare, _Allocator>::const_iterator>
2586 __tree<_Tp, _Compare, _Allocator>::__equal_range_unique(const _Key& __k) const
2587 {
2588     typedef pair<const_iterator, const_iterator> _Pp;
2589     __iter_pointer __result = __end_node();
2590     __node_pointer __rt = __root();
2591     while (__rt != nullptr)
2592     {
2593         if (value_comp()(__k, __rt->__value_))
2594         {
2595             __result = static_cast<__iter_pointer>(__rt);
2596             __rt = static_cast<__node_pointer>(__rt->__left_);
2597         }
2598         else if (value_comp()(__rt->__value_, __k))
2599             __rt = static_cast<__node_pointer>(__rt->__right_);
2600         else
2601             return _Pp(const_iterator(__rt),
2602                       const_iterator(
2603                           __rt->__right_ != nullptr ?
2604                               static_cast<__iter_pointer>(__tree_min(__rt->__right_))
2605                             : __result));
2606     }
2607     return _Pp(const_iterator(__result), const_iterator(__result));
2608 }
2609
2610 template <class _Tp, class _Compare, class _Allocator>
2611 template <class _Key>
2612 pair<typename __tree<_Tp, _Compare, _Allocator>::iterator,
2613      typename __tree<_Tp, _Compare, _Allocator>::iterator>
2614 __tree<_Tp, _Compare, _Allocator>::__equal_range_multi(const _Key& __k)
2615 {
2616     typedef pair<iterator, iterator> _Pp;
2617     __iter_pointer __result = __end_node();
2618     __node_pointer __rt = __root();
2619     while (__rt != nullptr)
2620     {
2621         if (value_comp()(__k, __rt->__value_))
2622         {
2623             __result = static_cast<__iter_pointer>(__rt);
2624             __rt = static_cast<__node_pointer>(__rt->__left_);
2625         }
2626         else if (value_comp()(__rt->__value_, __k))
2627             __rt = static_cast<__node_pointer>(__rt->__right_);
2628         else
2629             return _Pp(__lower_bound(__k, static_cast<__node_pointer>(__rt->__left_), static_cast<__iter_pointer>(__rt)),
2630                       __upper_bound(__k, static_cast<__node_pointer>(__rt->__right_), __result));
2631     }
2632     return _Pp(iterator(__result), iterator(__result));
2633 }
2634
2635 template <class _Tp, class _Compare, class _Allocator>
2636 template <class _Key>
2637 pair<typename __tree<_Tp, _Compare, _Allocator>::const_iterator,
2638      typename __tree<_Tp, _Compare, _Allocator>::const_iterator>
2639 __tree<_Tp, _Compare, _Allocator>::__equal_range_multi(const _Key& __k) const
2640 {
2641     typedef pair<const_iterator, const_iterator> _Pp;
2642     __iter_pointer __result = __end_node();
2643     __node_pointer __rt = __root();
2644     while (__rt != nullptr)
2645     {
2646         if (value_comp()(__k, __rt->__value_))
2647         {
2648             __result = static_cast<__iter_pointer>(__rt);
2649             __rt = static_cast<__node_pointer>(__rt->__left_);
2650         }
2651         else if (value_comp()(__rt->__value_, __k))
2652             __rt = static_cast<__node_pointer>(__rt->__right_);
2653         else
2654             return _Pp(__lower_bound(__k, static_cast<__node_pointer>(__rt->__left_), static_cast<__iter_pointer>(__rt)),
2655                       __upper_bound(__k, static_cast<__node_pointer>(__rt->__right_), __result));
2656     }
2657     return _Pp(const_iterator(__result), const_iterator(__result));
2658 }
2659
2660 template <class _Tp, class _Compare, class _Allocator>
2661 typename __tree<_Tp, _Compare, _Allocator>::__node_holder
2662 __tree<_Tp, _Compare, _Allocator>::remove(const_iterator __p) _NOEXCEPT
2663 {
2664     __node_pointer __np = __p.__get_np();
2665     if (__begin_node() == __p.__ptr_)
2666     {
2667         if (__np->__right_ != nullptr)
2668             __begin_node() = static_cast<__iter_pointer>(__np->__right_);
2669         else
2670             __begin_node() = static_cast<__iter_pointer>(__np->__parent_);
2671     }
2672     --size();
2673     __tree_remove(__end_node()->__left_,
2674                   static_cast<__node_base_pointer>(__np));
2675     return __node_holder(__np, _Dp(__node_alloc(), true));
2676 }
2677
2678 template <class _Tp, class _Compare, class _Allocator>
2679 inline _LIBCPP_INLINE_VISIBILITY
2680 void
2681 swap(__tree<_Tp, _Compare, _Allocator>& __x,
2682      __tree<_Tp, _Compare, _Allocator>& __y)
2683     _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
2684 {
2685     __x.swap(__y);
2686 }
2687
2688 _LIBCPP_END_NAMESPACE_STD
2689
2690 _LIBCPP_POP_MACROS
2691
2692 #endif  // _LIBCPP___TREE