xref: /netbsd-src/external/gpl3/gcc.old/dist/libstdc++-v3/include/bits/stl_tree.h (revision 946379e7b37692fc43f68eb0d1c10daa0a7f3b6c)
1 // RB tree implementation -*- C++ -*-
2 
3 // Copyright (C) 2001-2013 Free Software Foundation, Inc.
4 //
5 // This file is part of the GNU ISO C++ Library.  This library is free
6 // software; you can redistribute it and/or modify it under the
7 // terms of the GNU General Public License as published by the
8 // Free Software Foundation; either version 3, or (at your option)
9 // any later version.
10 
11 // This library is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 // GNU General Public License for more details.
15 
16 // Under Section 7 of GPL version 3, you are granted additional
17 // permissions described in the GCC Runtime Library Exception, version
18 // 3.1, as published by the Free Software Foundation.
19 
20 // You should have received a copy of the GNU General Public License and
21 // a copy of the GCC Runtime Library Exception along with this program;
22 // see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
23 // <http://www.gnu.org/licenses/>.
24 
25 /*
26  *
27  * Copyright (c) 1996,1997
28  * Silicon Graphics Computer Systems, Inc.
29  *
30  * Permission to use, copy, modify, distribute and sell this software
31  * and its documentation for any purpose is hereby granted without fee,
32  * provided that the above copyright notice appear in all copies and
33  * that both that copyright notice and this permission notice appear
34  * in supporting documentation.  Silicon Graphics makes no
35  * representations about the suitability of this software for any
36  * purpose.  It is provided "as is" without express or implied warranty.
37  *
38  *
39  * Copyright (c) 1994
40  * Hewlett-Packard Company
41  *
42  * Permission to use, copy, modify, distribute and sell this software
43  * and its documentation for any purpose is hereby granted without fee,
44  * provided that the above copyright notice appear in all copies and
45  * that both that copyright notice and this permission notice appear
46  * in supporting documentation.  Hewlett-Packard Company makes no
47  * representations about the suitability of this software for any
48  * purpose.  It is provided "as is" without express or implied warranty.
49  *
50  *
51  */
52 
53 /** @file bits/stl_tree.h
54  *  This is an internal header file, included by other library headers.
55  *  Do not attempt to use it directly. @headername{map,set}
56  */
57 
58 #ifndef _STL_TREE_H
59 #define _STL_TREE_H 1
60 
61 #include <bits/stl_algobase.h>
62 #include <bits/allocator.h>
63 #include <bits/stl_function.h>
64 #include <bits/cpp_type_traits.h>
65 #if __cplusplus >= 201103L
66 #include <bits/alloc_traits.h>
67 #endif
68 
69 namespace std _GLIBCXX_VISIBILITY(default)
70 {
71 _GLIBCXX_BEGIN_NAMESPACE_VERSION
72 
73   // Red-black tree class, designed for use in implementing STL
74   // associative containers (set, multiset, map, and multimap). The
75   // insertion and deletion algorithms are based on those in Cormen,
76   // Leiserson, and Rivest, Introduction to Algorithms (MIT Press,
77   // 1990), except that
78   //
79   // (1) the header cell is maintained with links not only to the root
80   // but also to the leftmost node of the tree, to enable constant
81   // time begin(), and to the rightmost node of the tree, to enable
82   // linear time performance when used with the generic set algorithms
83   // (set_union, etc.)
84   //
85   // (2) when a node being deleted has two children its successor node
86   // is relinked into its place, rather than copied, so that the only
87   // iterators invalidated are those referring to the deleted node.
88 
89   enum _Rb_tree_color { _S_red = false, _S_black = true };
90 
91   struct _Rb_tree_node_base
92   {
93     typedef _Rb_tree_node_base* _Base_ptr;
94     typedef const _Rb_tree_node_base* _Const_Base_ptr;
95 
96     _Rb_tree_color	_M_color;
97     _Base_ptr		_M_parent;
98     _Base_ptr		_M_left;
99     _Base_ptr		_M_right;
100 
101     static _Base_ptr
102     _S_minimum(_Base_ptr __x)
103     {
104       while (__x->_M_left != 0) __x = __x->_M_left;
105       return __x;
106     }
107 
108     static _Const_Base_ptr
109     _S_minimum(_Const_Base_ptr __x)
110     {
111       while (__x->_M_left != 0) __x = __x->_M_left;
112       return __x;
113     }
114 
115     static _Base_ptr
116     _S_maximum(_Base_ptr __x)
117     {
118       while (__x->_M_right != 0) __x = __x->_M_right;
119       return __x;
120     }
121 
122     static _Const_Base_ptr
123     _S_maximum(_Const_Base_ptr __x)
124     {
125       while (__x->_M_right != 0) __x = __x->_M_right;
126       return __x;
127     }
128   };
129 
130   template<typename _Val>
131     struct _Rb_tree_node : public _Rb_tree_node_base
132     {
133       typedef _Rb_tree_node<_Val>* _Link_type;
134       _Val _M_value_field;
135 
136 #if __cplusplus >= 201103L
137       template<typename... _Args>
138         _Rb_tree_node(_Args&&... __args)
139 	: _Rb_tree_node_base(),
140 	  _M_value_field(std::forward<_Args>(__args)...) { }
141 #endif
142     };
143 
144   _GLIBCXX_PURE _Rb_tree_node_base*
145   _Rb_tree_increment(_Rb_tree_node_base* __x) throw ();
146 
147   _GLIBCXX_PURE const _Rb_tree_node_base*
148   _Rb_tree_increment(const _Rb_tree_node_base* __x) throw ();
149 
150   _GLIBCXX_PURE _Rb_tree_node_base*
151   _Rb_tree_decrement(_Rb_tree_node_base* __x) throw ();
152 
153   _GLIBCXX_PURE const _Rb_tree_node_base*
154   _Rb_tree_decrement(const _Rb_tree_node_base* __x) throw ();
155 
156   template<typename _Tp>
157     struct _Rb_tree_iterator
158     {
159       typedef _Tp  value_type;
160       typedef _Tp& reference;
161       typedef _Tp* pointer;
162 
163       typedef bidirectional_iterator_tag iterator_category;
164       typedef ptrdiff_t                  difference_type;
165 
166       typedef _Rb_tree_iterator<_Tp>        _Self;
167       typedef _Rb_tree_node_base::_Base_ptr _Base_ptr;
168       typedef _Rb_tree_node<_Tp>*           _Link_type;
169 
170       _Rb_tree_iterator()
171       : _M_node() { }
172 
173       explicit
174       _Rb_tree_iterator(_Link_type __x)
175       : _M_node(__x) { }
176 
177       reference
178       operator*() const
179       { return static_cast<_Link_type>(_M_node)->_M_value_field; }
180 
181       pointer
182       operator->() const
183       { return std::__addressof(static_cast<_Link_type>
184 				(_M_node)->_M_value_field); }
185 
186       _Self&
187       operator++()
188       {
189 	_M_node = _Rb_tree_increment(_M_node);
190 	return *this;
191       }
192 
193       _Self
194       operator++(int)
195       {
196 	_Self __tmp = *this;
197 	_M_node = _Rb_tree_increment(_M_node);
198 	return __tmp;
199       }
200 
201       _Self&
202       operator--()
203       {
204 	_M_node = _Rb_tree_decrement(_M_node);
205 	return *this;
206       }
207 
208       _Self
209       operator--(int)
210       {
211 	_Self __tmp = *this;
212 	_M_node = _Rb_tree_decrement(_M_node);
213 	return __tmp;
214       }
215 
216       bool
217       operator==(const _Self& __x) const
218       { return _M_node == __x._M_node; }
219 
220       bool
221       operator!=(const _Self& __x) const
222       { return _M_node != __x._M_node; }
223 
224       _Base_ptr _M_node;
225   };
226 
227   template<typename _Tp>
228     struct _Rb_tree_const_iterator
229     {
230       typedef _Tp        value_type;
231       typedef const _Tp& reference;
232       typedef const _Tp* pointer;
233 
234       typedef _Rb_tree_iterator<_Tp> iterator;
235 
236       typedef bidirectional_iterator_tag iterator_category;
237       typedef ptrdiff_t                  difference_type;
238 
239       typedef _Rb_tree_const_iterator<_Tp>        _Self;
240       typedef _Rb_tree_node_base::_Const_Base_ptr _Base_ptr;
241       typedef const _Rb_tree_node<_Tp>*           _Link_type;
242 
243       _Rb_tree_const_iterator()
244       : _M_node() { }
245 
246       explicit
247       _Rb_tree_const_iterator(_Link_type __x)
248       : _M_node(__x) { }
249 
250       _Rb_tree_const_iterator(const iterator& __it)
251       : _M_node(__it._M_node) { }
252 
253       iterator
254       _M_const_cast() const
255       { return iterator(static_cast<typename iterator::_Link_type>
256 			(const_cast<typename iterator::_Base_ptr>(_M_node))); }
257 
258       reference
259       operator*() const
260       { return static_cast<_Link_type>(_M_node)->_M_value_field; }
261 
262       pointer
263       operator->() const
264       { return std::__addressof(static_cast<_Link_type>
265 				(_M_node)->_M_value_field); }
266 
267       _Self&
268       operator++()
269       {
270 	_M_node = _Rb_tree_increment(_M_node);
271 	return *this;
272       }
273 
274       _Self
275       operator++(int)
276       {
277 	_Self __tmp = *this;
278 	_M_node = _Rb_tree_increment(_M_node);
279 	return __tmp;
280       }
281 
282       _Self&
283       operator--()
284       {
285 	_M_node = _Rb_tree_decrement(_M_node);
286 	return *this;
287       }
288 
289       _Self
290       operator--(int)
291       {
292 	_Self __tmp = *this;
293 	_M_node = _Rb_tree_decrement(_M_node);
294 	return __tmp;
295       }
296 
297       bool
298       operator==(const _Self& __x) const
299       { return _M_node == __x._M_node; }
300 
301       bool
302       operator!=(const _Self& __x) const
303       { return _M_node != __x._M_node; }
304 
305       _Base_ptr _M_node;
306     };
307 
308   template<typename _Val>
309     inline bool
310     operator==(const _Rb_tree_iterator<_Val>& __x,
311                const _Rb_tree_const_iterator<_Val>& __y)
312     { return __x._M_node == __y._M_node; }
313 
314   template<typename _Val>
315     inline bool
316     operator!=(const _Rb_tree_iterator<_Val>& __x,
317                const _Rb_tree_const_iterator<_Val>& __y)
318     { return __x._M_node != __y._M_node; }
319 
320   void
321   _Rb_tree_insert_and_rebalance(const bool __insert_left,
322                                 _Rb_tree_node_base* __x,
323                                 _Rb_tree_node_base* __p,
324                                 _Rb_tree_node_base& __header) throw ();
325 
326   _Rb_tree_node_base*
327   _Rb_tree_rebalance_for_erase(_Rb_tree_node_base* const __z,
328 			       _Rb_tree_node_base& __header) throw ();
329 
330 
331   template<typename _Key, typename _Val, typename _KeyOfValue,
332            typename _Compare, typename _Alloc = allocator<_Val> >
333     class _Rb_tree
334     {
335       typedef typename _Alloc::template rebind<_Rb_tree_node<_Val> >::other
336               _Node_allocator;
337 
338     protected:
339       typedef _Rb_tree_node_base* 		_Base_ptr;
340       typedef const _Rb_tree_node_base* 	_Const_Base_ptr;
341 
342     public:
343       typedef _Key 				key_type;
344       typedef _Val 				value_type;
345       typedef value_type* 			pointer;
346       typedef const value_type* 		const_pointer;
347       typedef value_type& 			reference;
348       typedef const value_type& 		const_reference;
349       typedef _Rb_tree_node<_Val>* 		_Link_type;
350       typedef const _Rb_tree_node<_Val>*	_Const_Link_type;
351       typedef size_t 				size_type;
352       typedef ptrdiff_t 			difference_type;
353       typedef _Alloc 				allocator_type;
354 
355       _Node_allocator&
356       _M_get_Node_allocator() _GLIBCXX_NOEXCEPT
357       { return *static_cast<_Node_allocator*>(&this->_M_impl); }
358 
359       const _Node_allocator&
360       _M_get_Node_allocator() const _GLIBCXX_NOEXCEPT
361       { return *static_cast<const _Node_allocator*>(&this->_M_impl); }
362 
363       allocator_type
364       get_allocator() const _GLIBCXX_NOEXCEPT
365       { return allocator_type(_M_get_Node_allocator()); }
366 
367     protected:
368       _Link_type
369       _M_get_node()
370       { return _M_impl._Node_allocator::allocate(1); }
371 
372       void
373       _M_put_node(_Link_type __p)
374       { _M_impl._Node_allocator::deallocate(__p, 1); }
375 
376 #if __cplusplus < 201103L
377       _Link_type
378       _M_create_node(const value_type& __x)
379       {
380 	_Link_type __tmp = _M_get_node();
381 	__try
382 	  { get_allocator().construct
383 	      (std::__addressof(__tmp->_M_value_field), __x); }
384 	__catch(...)
385 	  {
386 	    _M_put_node(__tmp);
387 	    __throw_exception_again;
388 	  }
389 	return __tmp;
390       }
391 
392       void
393       _M_destroy_node(_Link_type __p)
394       {
395 	get_allocator().destroy(std::__addressof(__p->_M_value_field));
396 	_M_put_node(__p);
397       }
398 #else
399       template<typename... _Args>
400         _Link_type
401         _M_create_node(_Args&&... __args)
402 	{
403 	  _Link_type __tmp = _M_get_node();
404 	  __try
405 	    {
406 	      allocator_traits<_Node_allocator>::
407 		construct(_M_get_Node_allocator(), __tmp,
408 			  std::forward<_Args>(__args)...);
409 	    }
410 	  __catch(...)
411 	    {
412 	      _M_put_node(__tmp);
413 	      __throw_exception_again;
414 	    }
415 	  return __tmp;
416 	}
417 
418       void
419       _M_destroy_node(_Link_type __p)
420       {
421 	_M_get_Node_allocator().destroy(__p);
422 	_M_put_node(__p);
423       }
424 #endif
425 
426       _Link_type
427       _M_clone_node(_Const_Link_type __x)
428       {
429 	_Link_type __tmp = _M_create_node(__x->_M_value_field);
430 	__tmp->_M_color = __x->_M_color;
431 	__tmp->_M_left = 0;
432 	__tmp->_M_right = 0;
433 	return __tmp;
434       }
435 
436     protected:
437       template<typename _Key_compare,
438 	       bool _Is_pod_comparator = __is_pod(_Key_compare)>
439         struct _Rb_tree_impl : public _Node_allocator
440         {
441 	  _Key_compare		_M_key_compare;
442 	  _Rb_tree_node_base 	_M_header;
443 	  size_type 		_M_node_count; // Keeps track of size of tree.
444 
445 	  _Rb_tree_impl()
446 	  : _Node_allocator(), _M_key_compare(), _M_header(),
447 	    _M_node_count(0)
448 	  { _M_initialize(); }
449 
450 	  _Rb_tree_impl(const _Key_compare& __comp, const _Node_allocator& __a)
451 	  : _Node_allocator(__a), _M_key_compare(__comp), _M_header(),
452 	    _M_node_count(0)
453 	  { _M_initialize(); }
454 
455 #if __cplusplus >= 201103L
456 	  _Rb_tree_impl(const _Key_compare& __comp, _Node_allocator&& __a)
457 	  : _Node_allocator(std::move(__a)), _M_key_compare(__comp),
458 	    _M_header(), _M_node_count(0)
459 	  { _M_initialize(); }
460 #endif
461 
462 	private:
463 	  void
464 	  _M_initialize()
465 	  {
466 	    this->_M_header._M_color = _S_red;
467 	    this->_M_header._M_parent = 0;
468 	    this->_M_header._M_left = &this->_M_header;
469 	    this->_M_header._M_right = &this->_M_header;
470 	  }
471 	};
472 
473       _Rb_tree_impl<_Compare> _M_impl;
474 
475     protected:
476       _Base_ptr&
477       _M_root()
478       { return this->_M_impl._M_header._M_parent; }
479 
480       _Const_Base_ptr
481       _M_root() const
482       { return this->_M_impl._M_header._M_parent; }
483 
484       _Base_ptr&
485       _M_leftmost()
486       { return this->_M_impl._M_header._M_left; }
487 
488       _Const_Base_ptr
489       _M_leftmost() const
490       { return this->_M_impl._M_header._M_left; }
491 
492       _Base_ptr&
493       _M_rightmost()
494       { return this->_M_impl._M_header._M_right; }
495 
496       _Const_Base_ptr
497       _M_rightmost() const
498       { return this->_M_impl._M_header._M_right; }
499 
500       _Link_type
501       _M_begin()
502       { return static_cast<_Link_type>(this->_M_impl._M_header._M_parent); }
503 
504       _Const_Link_type
505       _M_begin() const
506       {
507 	return static_cast<_Const_Link_type>
508 	  (this->_M_impl._M_header._M_parent);
509       }
510 
511       _Link_type
512       _M_end()
513       { return reinterpret_cast<_Link_type>(&this->_M_impl._M_header); }
514 
515       _Const_Link_type
516       _M_end() const
517       { return reinterpret_cast<_Const_Link_type>(&this->_M_impl._M_header); }
518 
519       static const_reference
520       _S_value(_Const_Link_type __x)
521       { return __x->_M_value_field; }
522 
523       static const _Key&
524       _S_key(_Const_Link_type __x)
525       { return _KeyOfValue()(_S_value(__x)); }
526 
527       static _Link_type
528       _S_left(_Base_ptr __x)
529       { return static_cast<_Link_type>(__x->_M_left); }
530 
531       static _Const_Link_type
532       _S_left(_Const_Base_ptr __x)
533       { return static_cast<_Const_Link_type>(__x->_M_left); }
534 
535       static _Link_type
536       _S_right(_Base_ptr __x)
537       { return static_cast<_Link_type>(__x->_M_right); }
538 
539       static _Const_Link_type
540       _S_right(_Const_Base_ptr __x)
541       { return static_cast<_Const_Link_type>(__x->_M_right); }
542 
543       static const_reference
544       _S_value(_Const_Base_ptr __x)
545       { return static_cast<_Const_Link_type>(__x)->_M_value_field; }
546 
547       static const _Key&
548       _S_key(_Const_Base_ptr __x)
549       { return _KeyOfValue()(_S_value(__x)); }
550 
551       static _Base_ptr
552       _S_minimum(_Base_ptr __x)
553       { return _Rb_tree_node_base::_S_minimum(__x); }
554 
555       static _Const_Base_ptr
556       _S_minimum(_Const_Base_ptr __x)
557       { return _Rb_tree_node_base::_S_minimum(__x); }
558 
559       static _Base_ptr
560       _S_maximum(_Base_ptr __x)
561       { return _Rb_tree_node_base::_S_maximum(__x); }
562 
563       static _Const_Base_ptr
564       _S_maximum(_Const_Base_ptr __x)
565       { return _Rb_tree_node_base::_S_maximum(__x); }
566 
567     public:
568       typedef _Rb_tree_iterator<value_type>       iterator;
569       typedef _Rb_tree_const_iterator<value_type> const_iterator;
570 
571       typedef std::reverse_iterator<iterator>       reverse_iterator;
572       typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
573 
574     private:
575       pair<_Base_ptr, _Base_ptr>
576       _M_get_insert_unique_pos(const key_type& __k);
577 
578       pair<_Base_ptr, _Base_ptr>
579       _M_get_insert_equal_pos(const key_type& __k);
580 
581       pair<_Base_ptr, _Base_ptr>
582       _M_get_insert_hint_unique_pos(const_iterator __pos,
583 				    const key_type& __k);
584 
585       pair<_Base_ptr, _Base_ptr>
586       _M_get_insert_hint_equal_pos(const_iterator __pos,
587 				   const key_type& __k);
588 
589 #if __cplusplus >= 201103L
590       template<typename _Arg>
591         iterator
592         _M_insert_(_Base_ptr __x, _Base_ptr __y, _Arg&& __v);
593 
594       iterator
595       _M_insert_node(_Base_ptr __x, _Base_ptr __y, _Link_type __z);
596 
597       template<typename _Arg>
598         iterator
599         _M_insert_lower(_Base_ptr __y, _Arg&& __v);
600 
601       template<typename _Arg>
602         iterator
603         _M_insert_equal_lower(_Arg&& __x);
604 
605       iterator
606       _M_insert_lower_node(_Base_ptr __p, _Link_type __z);
607 
608       iterator
609       _M_insert_equal_lower_node(_Link_type __z);
610 #else
611       iterator
612       _M_insert_(_Base_ptr __x, _Base_ptr __y,
613 		 const value_type& __v);
614 
615       // _GLIBCXX_RESOLVE_LIB_DEFECTS
616       // 233. Insertion hints in associative containers.
617       iterator
618       _M_insert_lower(_Base_ptr __y, const value_type& __v);
619 
620       iterator
621       _M_insert_equal_lower(const value_type& __x);
622 #endif
623 
624       _Link_type
625       _M_copy(_Const_Link_type __x, _Link_type __p);
626 
627       void
628       _M_erase(_Link_type __x);
629 
630       iterator
631       _M_lower_bound(_Link_type __x, _Link_type __y,
632 		     const _Key& __k);
633 
634       const_iterator
635       _M_lower_bound(_Const_Link_type __x, _Const_Link_type __y,
636 		     const _Key& __k) const;
637 
638       iterator
639       _M_upper_bound(_Link_type __x, _Link_type __y,
640 		     const _Key& __k);
641 
642       const_iterator
643       _M_upper_bound(_Const_Link_type __x, _Const_Link_type __y,
644 		     const _Key& __k) const;
645 
646     public:
647       // allocation/deallocation
648       _Rb_tree() { }
649 
650       _Rb_tree(const _Compare& __comp,
651 	       const allocator_type& __a = allocator_type())
652       : _M_impl(__comp, _Node_allocator(__a)) { }
653 
654       _Rb_tree(const _Rb_tree& __x)
655       : _M_impl(__x._M_impl._M_key_compare, __x._M_get_Node_allocator())
656       {
657 	if (__x._M_root() != 0)
658 	  {
659 	    _M_root() = _M_copy(__x._M_begin(), _M_end());
660 	    _M_leftmost() = _S_minimum(_M_root());
661 	    _M_rightmost() = _S_maximum(_M_root());
662 	    _M_impl._M_node_count = __x._M_impl._M_node_count;
663 	  }
664       }
665 
666 #if __cplusplus >= 201103L
667       _Rb_tree(_Rb_tree&& __x);
668 #endif
669 
670       ~_Rb_tree() _GLIBCXX_NOEXCEPT
671       { _M_erase(_M_begin()); }
672 
673       _Rb_tree&
674       operator=(const _Rb_tree& __x);
675 
676       // Accessors.
677       _Compare
678       key_comp() const
679       { return _M_impl._M_key_compare; }
680 
681       iterator
682       begin() _GLIBCXX_NOEXCEPT
683       {
684 	return iterator(static_cast<_Link_type>
685 			(this->_M_impl._M_header._M_left));
686       }
687 
688       const_iterator
689       begin() const _GLIBCXX_NOEXCEPT
690       {
691 	return const_iterator(static_cast<_Const_Link_type>
692 			      (this->_M_impl._M_header._M_left));
693       }
694 
695       iterator
696       end() _GLIBCXX_NOEXCEPT
697       { return iterator(static_cast<_Link_type>(&this->_M_impl._M_header)); }
698 
699       const_iterator
700       end() const _GLIBCXX_NOEXCEPT
701       {
702 	return const_iterator(static_cast<_Const_Link_type>
703 			      (&this->_M_impl._M_header));
704       }
705 
706       reverse_iterator
707       rbegin() _GLIBCXX_NOEXCEPT
708       { return reverse_iterator(end()); }
709 
710       const_reverse_iterator
711       rbegin() const _GLIBCXX_NOEXCEPT
712       { return const_reverse_iterator(end()); }
713 
714       reverse_iterator
715       rend() _GLIBCXX_NOEXCEPT
716       { return reverse_iterator(begin()); }
717 
718       const_reverse_iterator
719       rend() const _GLIBCXX_NOEXCEPT
720       { return const_reverse_iterator(begin()); }
721 
722       bool
723       empty() const _GLIBCXX_NOEXCEPT
724       { return _M_impl._M_node_count == 0; }
725 
726       size_type
727       size() const _GLIBCXX_NOEXCEPT
728       { return _M_impl._M_node_count; }
729 
730       size_type
731       max_size() const _GLIBCXX_NOEXCEPT
732       { return _M_get_Node_allocator().max_size(); }
733 
734       void
735       swap(_Rb_tree& __t);
736 
737       // Insert/erase.
738 #if __cplusplus >= 201103L
739       template<typename _Arg>
740         pair<iterator, bool>
741         _M_insert_unique(_Arg&& __x);
742 
743       template<typename _Arg>
744         iterator
745         _M_insert_equal(_Arg&& __x);
746 
747       template<typename _Arg>
748         iterator
749         _M_insert_unique_(const_iterator __position, _Arg&& __x);
750 
751       template<typename _Arg>
752         iterator
753         _M_insert_equal_(const_iterator __position, _Arg&& __x);
754 
755       template<typename... _Args>
756 	pair<iterator, bool>
757 	_M_emplace_unique(_Args&&... __args);
758 
759       template<typename... _Args>
760 	iterator
761 	_M_emplace_equal(_Args&&... __args);
762 
763       template<typename... _Args>
764 	iterator
765 	_M_emplace_hint_unique(const_iterator __pos, _Args&&... __args);
766 
767       template<typename... _Args>
768 	iterator
769 	_M_emplace_hint_equal(const_iterator __pos, _Args&&... __args);
770 #else
771       pair<iterator, bool>
772       _M_insert_unique(const value_type& __x);
773 
774       iterator
775       _M_insert_equal(const value_type& __x);
776 
777       iterator
778       _M_insert_unique_(const_iterator __position, const value_type& __x);
779 
780       iterator
781       _M_insert_equal_(const_iterator __position, const value_type& __x);
782 #endif
783 
784       template<typename _InputIterator>
785         void
786         _M_insert_unique(_InputIterator __first, _InputIterator __last);
787 
788       template<typename _InputIterator>
789         void
790         _M_insert_equal(_InputIterator __first, _InputIterator __last);
791 
792     private:
793       void
794       _M_erase_aux(const_iterator __position);
795 
796       void
797       _M_erase_aux(const_iterator __first, const_iterator __last);
798 
799     public:
800 #if __cplusplus >= 201103L
801       // _GLIBCXX_RESOLVE_LIB_DEFECTS
802       // DR 130. Associative erase should return an iterator.
803       _GLIBCXX_ABI_TAG_CXX11
804       iterator
805       erase(const_iterator __position)
806       {
807 	const_iterator __result = __position;
808 	++__result;
809 	_M_erase_aux(__position);
810 	return __result._M_const_cast();
811       }
812 
813       // LWG 2059.
814       _GLIBCXX_ABI_TAG_CXX11
815       iterator
816       erase(iterator __position)
817       {
818 	iterator __result = __position;
819 	++__result;
820 	_M_erase_aux(__position);
821 	return __result;
822       }
823 #else
824       void
825       erase(iterator __position)
826       { _M_erase_aux(__position); }
827 
828       void
829       erase(const_iterator __position)
830       { _M_erase_aux(__position); }
831 #endif
832       size_type
833       erase(const key_type& __x);
834 
835 #if __cplusplus >= 201103L
836       // _GLIBCXX_RESOLVE_LIB_DEFECTS
837       // DR 130. Associative erase should return an iterator.
838       _GLIBCXX_ABI_TAG_CXX11
839       iterator
840       erase(const_iterator __first, const_iterator __last)
841       {
842 	_M_erase_aux(__first, __last);
843 	return __last._M_const_cast();
844       }
845 #else
846       void
847       erase(iterator __first, iterator __last)
848       { _M_erase_aux(__first, __last); }
849 
850       void
851       erase(const_iterator __first, const_iterator __last)
852       { _M_erase_aux(__first, __last); }
853 #endif
854       void
855       erase(const key_type* __first, const key_type* __last);
856 
857       void
858       clear() _GLIBCXX_NOEXCEPT
859       {
860         _M_erase(_M_begin());
861         _M_leftmost() = _M_end();
862         _M_root() = 0;
863         _M_rightmost() = _M_end();
864         _M_impl._M_node_count = 0;
865       }
866 
867       // Set operations.
868       iterator
869       find(const key_type& __k);
870 
871       const_iterator
872       find(const key_type& __k) const;
873 
874       size_type
875       count(const key_type& __k) const;
876 
877       iterator
878       lower_bound(const key_type& __k)
879       { return _M_lower_bound(_M_begin(), _M_end(), __k); }
880 
881       const_iterator
882       lower_bound(const key_type& __k) const
883       { return _M_lower_bound(_M_begin(), _M_end(), __k); }
884 
885       iterator
886       upper_bound(const key_type& __k)
887       { return _M_upper_bound(_M_begin(), _M_end(), __k); }
888 
889       const_iterator
890       upper_bound(const key_type& __k) const
891       { return _M_upper_bound(_M_begin(), _M_end(), __k); }
892 
893       pair<iterator, iterator>
894       equal_range(const key_type& __k);
895 
896       pair<const_iterator, const_iterator>
897       equal_range(const key_type& __k) const;
898 
899       // Debugging.
900       bool
901       __rb_verify() const;
902     };
903 
904   template<typename _Key, typename _Val, typename _KeyOfValue,
905            typename _Compare, typename _Alloc>
906     inline bool
907     operator==(const _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>& __x,
908 	       const _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>& __y)
909     {
910       return __x.size() == __y.size()
911 	     && std::equal(__x.begin(), __x.end(), __y.begin());
912     }
913 
914   template<typename _Key, typename _Val, typename _KeyOfValue,
915            typename _Compare, typename _Alloc>
916     inline bool
917     operator<(const _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>& __x,
918 	      const _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>& __y)
919     {
920       return std::lexicographical_compare(__x.begin(), __x.end(),
921 					  __y.begin(), __y.end());
922     }
923 
924   template<typename _Key, typename _Val, typename _KeyOfValue,
925            typename _Compare, typename _Alloc>
926     inline bool
927     operator!=(const _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>& __x,
928 	       const _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>& __y)
929     { return !(__x == __y); }
930 
931   template<typename _Key, typename _Val, typename _KeyOfValue,
932            typename _Compare, typename _Alloc>
933     inline bool
934     operator>(const _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>& __x,
935 	      const _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>& __y)
936     { return __y < __x; }
937 
938   template<typename _Key, typename _Val, typename _KeyOfValue,
939            typename _Compare, typename _Alloc>
940     inline bool
941     operator<=(const _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>& __x,
942 	       const _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>& __y)
943     { return !(__y < __x); }
944 
945   template<typename _Key, typename _Val, typename _KeyOfValue,
946            typename _Compare, typename _Alloc>
947     inline bool
948     operator>=(const _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>& __x,
949 	       const _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>& __y)
950     { return !(__x < __y); }
951 
952   template<typename _Key, typename _Val, typename _KeyOfValue,
953            typename _Compare, typename _Alloc>
954     inline void
955     swap(_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>& __x,
956 	 _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>& __y)
957     { __x.swap(__y); }
958 
959 #if __cplusplus >= 201103L
960   template<typename _Key, typename _Val, typename _KeyOfValue,
961            typename _Compare, typename _Alloc>
962     _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::
963     _Rb_tree(_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>&& __x)
964     : _M_impl(__x._M_impl._M_key_compare,
965 	      std::move(__x._M_get_Node_allocator()))
966     {
967       if (__x._M_root() != 0)
968 	{
969 	  _M_root() = __x._M_root();
970 	  _M_leftmost() = __x._M_leftmost();
971 	  _M_rightmost() = __x._M_rightmost();
972 	  _M_root()->_M_parent = _M_end();
973 
974 	  __x._M_root() = 0;
975 	  __x._M_leftmost() = __x._M_end();
976 	  __x._M_rightmost() = __x._M_end();
977 
978 	  this->_M_impl._M_node_count = __x._M_impl._M_node_count;
979 	  __x._M_impl._M_node_count = 0;
980 	}
981     }
982 #endif
983 
984   template<typename _Key, typename _Val, typename _KeyOfValue,
985            typename _Compare, typename _Alloc>
986     _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>&
987     _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::
988     operator=(const _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>& __x)
989     {
990       if (this != &__x)
991 	{
992 	  // Note that _Key may be a constant type.
993 	  clear();
994 	  _M_impl._M_key_compare = __x._M_impl._M_key_compare;
995 	  if (__x._M_root() != 0)
996 	    {
997 	      _M_root() = _M_copy(__x._M_begin(), _M_end());
998 	      _M_leftmost() = _S_minimum(_M_root());
999 	      _M_rightmost() = _S_maximum(_M_root());
1000 	      _M_impl._M_node_count = __x._M_impl._M_node_count;
1001 	    }
1002 	}
1003       return *this;
1004     }
1005 
1006   template<typename _Key, typename _Val, typename _KeyOfValue,
1007            typename _Compare, typename _Alloc>
1008 #if __cplusplus >= 201103L
1009     template<typename _Arg>
1010 #endif
1011     typename _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::iterator
1012     _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::
1013 #if __cplusplus >= 201103L
1014     _M_insert_(_Base_ptr __x, _Base_ptr __p, _Arg&& __v)
1015 #else
1016     _M_insert_(_Base_ptr __x, _Base_ptr __p, const _Val& __v)
1017 #endif
1018     {
1019       bool __insert_left = (__x != 0 || __p == _M_end()
1020 			    || _M_impl._M_key_compare(_KeyOfValue()(__v),
1021 						      _S_key(__p)));
1022 
1023       _Link_type __z = _M_create_node(_GLIBCXX_FORWARD(_Arg, __v));
1024 
1025       _Rb_tree_insert_and_rebalance(__insert_left, __z, __p,
1026 				    this->_M_impl._M_header);
1027       ++_M_impl._M_node_count;
1028       return iterator(__z);
1029     }
1030 
1031   template<typename _Key, typename _Val, typename _KeyOfValue,
1032            typename _Compare, typename _Alloc>
1033 #if __cplusplus >= 201103L
1034     template<typename _Arg>
1035 #endif
1036     typename _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::iterator
1037     _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::
1038 #if __cplusplus >= 201103L
1039     _M_insert_lower(_Base_ptr __p, _Arg&& __v)
1040 #else
1041     _M_insert_lower(_Base_ptr __p, const _Val& __v)
1042 #endif
1043     {
1044       bool __insert_left = (__p == _M_end()
1045 			    || !_M_impl._M_key_compare(_S_key(__p),
1046 						       _KeyOfValue()(__v)));
1047 
1048       _Link_type __z = _M_create_node(_GLIBCXX_FORWARD(_Arg, __v));
1049 
1050       _Rb_tree_insert_and_rebalance(__insert_left, __z, __p,
1051 				    this->_M_impl._M_header);
1052       ++_M_impl._M_node_count;
1053       return iterator(__z);
1054     }
1055 
1056   template<typename _Key, typename _Val, typename _KeyOfValue,
1057            typename _Compare, typename _Alloc>
1058 #if __cplusplus >= 201103L
1059     template<typename _Arg>
1060 #endif
1061     typename _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::iterator
1062     _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::
1063 #if __cplusplus >= 201103L
1064     _M_insert_equal_lower(_Arg&& __v)
1065 #else
1066     _M_insert_equal_lower(const _Val& __v)
1067 #endif
1068     {
1069       _Link_type __x = _M_begin();
1070       _Link_type __y = _M_end();
1071       while (__x != 0)
1072 	{
1073 	  __y = __x;
1074 	  __x = !_M_impl._M_key_compare(_S_key(__x), _KeyOfValue()(__v)) ?
1075 	        _S_left(__x) : _S_right(__x);
1076 	}
1077       return _M_insert_lower(__y, _GLIBCXX_FORWARD(_Arg, __v));
1078     }
1079 
1080   template<typename _Key, typename _Val, typename _KoV,
1081            typename _Compare, typename _Alloc>
1082     typename _Rb_tree<_Key, _Val, _KoV, _Compare, _Alloc>::_Link_type
1083     _Rb_tree<_Key, _Val, _KoV, _Compare, _Alloc>::
1084     _M_copy(_Const_Link_type __x, _Link_type __p)
1085     {
1086       // Structural copy.  __x and __p must be non-null.
1087       _Link_type __top = _M_clone_node(__x);
1088       __top->_M_parent = __p;
1089 
1090       __try
1091 	{
1092 	  if (__x->_M_right)
1093 	    __top->_M_right = _M_copy(_S_right(__x), __top);
1094 	  __p = __top;
1095 	  __x = _S_left(__x);
1096 
1097 	  while (__x != 0)
1098 	    {
1099 	      _Link_type __y = _M_clone_node(__x);
1100 	      __p->_M_left = __y;
1101 	      __y->_M_parent = __p;
1102 	      if (__x->_M_right)
1103 		__y->_M_right = _M_copy(_S_right(__x), __y);
1104 	      __p = __y;
1105 	      __x = _S_left(__x);
1106 	    }
1107 	}
1108       __catch(...)
1109 	{
1110 	  _M_erase(__top);
1111 	  __throw_exception_again;
1112 	}
1113       return __top;
1114     }
1115 
1116   template<typename _Key, typename _Val, typename _KeyOfValue,
1117            typename _Compare, typename _Alloc>
1118     void
1119     _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::
1120     _M_erase(_Link_type __x)
1121     {
1122       // Erase without rebalancing.
1123       while (__x != 0)
1124 	{
1125 	  _M_erase(_S_right(__x));
1126 	  _Link_type __y = _S_left(__x);
1127 	  _M_destroy_node(__x);
1128 	  __x = __y;
1129 	}
1130     }
1131 
1132   template<typename _Key, typename _Val, typename _KeyOfValue,
1133            typename _Compare, typename _Alloc>
1134     typename _Rb_tree<_Key, _Val, _KeyOfValue,
1135 		      _Compare, _Alloc>::iterator
1136     _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::
1137     _M_lower_bound(_Link_type __x, _Link_type __y,
1138 		   const _Key& __k)
1139     {
1140       while (__x != 0)
1141 	if (!_M_impl._M_key_compare(_S_key(__x), __k))
1142 	  __y = __x, __x = _S_left(__x);
1143 	else
1144 	  __x = _S_right(__x);
1145       return iterator(__y);
1146     }
1147 
1148   template<typename _Key, typename _Val, typename _KeyOfValue,
1149            typename _Compare, typename _Alloc>
1150     typename _Rb_tree<_Key, _Val, _KeyOfValue,
1151 		      _Compare, _Alloc>::const_iterator
1152     _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::
1153     _M_lower_bound(_Const_Link_type __x, _Const_Link_type __y,
1154 		   const _Key& __k) const
1155     {
1156       while (__x != 0)
1157 	if (!_M_impl._M_key_compare(_S_key(__x), __k))
1158 	  __y = __x, __x = _S_left(__x);
1159 	else
1160 	  __x = _S_right(__x);
1161       return const_iterator(__y);
1162     }
1163 
1164   template<typename _Key, typename _Val, typename _KeyOfValue,
1165            typename _Compare, typename _Alloc>
1166     typename _Rb_tree<_Key, _Val, _KeyOfValue,
1167 		      _Compare, _Alloc>::iterator
1168     _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::
1169     _M_upper_bound(_Link_type __x, _Link_type __y,
1170 		   const _Key& __k)
1171     {
1172       while (__x != 0)
1173 	if (_M_impl._M_key_compare(__k, _S_key(__x)))
1174 	  __y = __x, __x = _S_left(__x);
1175 	else
1176 	  __x = _S_right(__x);
1177       return iterator(__y);
1178     }
1179 
1180   template<typename _Key, typename _Val, typename _KeyOfValue,
1181            typename _Compare, typename _Alloc>
1182     typename _Rb_tree<_Key, _Val, _KeyOfValue,
1183 		      _Compare, _Alloc>::const_iterator
1184     _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::
1185     _M_upper_bound(_Const_Link_type __x, _Const_Link_type __y,
1186 		   const _Key& __k) const
1187     {
1188       while (__x != 0)
1189 	if (_M_impl._M_key_compare(__k, _S_key(__x)))
1190 	  __y = __x, __x = _S_left(__x);
1191 	else
1192 	  __x = _S_right(__x);
1193       return const_iterator(__y);
1194     }
1195 
1196   template<typename _Key, typename _Val, typename _KeyOfValue,
1197            typename _Compare, typename _Alloc>
1198     pair<typename _Rb_tree<_Key, _Val, _KeyOfValue,
1199 			   _Compare, _Alloc>::iterator,
1200 	 typename _Rb_tree<_Key, _Val, _KeyOfValue,
1201 			   _Compare, _Alloc>::iterator>
1202     _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::
1203     equal_range(const _Key& __k)
1204     {
1205       _Link_type __x = _M_begin();
1206       _Link_type __y = _M_end();
1207       while (__x != 0)
1208 	{
1209 	  if (_M_impl._M_key_compare(_S_key(__x), __k))
1210 	    __x = _S_right(__x);
1211 	  else if (_M_impl._M_key_compare(__k, _S_key(__x)))
1212 	    __y = __x, __x = _S_left(__x);
1213 	  else
1214 	    {
1215 	      _Link_type __xu(__x), __yu(__y);
1216 	      __y = __x, __x = _S_left(__x);
1217 	      __xu = _S_right(__xu);
1218 	      return pair<iterator,
1219 		          iterator>(_M_lower_bound(__x, __y, __k),
1220 				    _M_upper_bound(__xu, __yu, __k));
1221 	    }
1222 	}
1223       return pair<iterator, iterator>(iterator(__y),
1224 				      iterator(__y));
1225     }
1226 
1227   template<typename _Key, typename _Val, typename _KeyOfValue,
1228            typename _Compare, typename _Alloc>
1229     pair<typename _Rb_tree<_Key, _Val, _KeyOfValue,
1230 			   _Compare, _Alloc>::const_iterator,
1231 	 typename _Rb_tree<_Key, _Val, _KeyOfValue,
1232 			   _Compare, _Alloc>::const_iterator>
1233     _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::
1234     equal_range(const _Key& __k) const
1235     {
1236       _Const_Link_type __x = _M_begin();
1237       _Const_Link_type __y = _M_end();
1238       while (__x != 0)
1239 	{
1240 	  if (_M_impl._M_key_compare(_S_key(__x), __k))
1241 	    __x = _S_right(__x);
1242 	  else if (_M_impl._M_key_compare(__k, _S_key(__x)))
1243 	    __y = __x, __x = _S_left(__x);
1244 	  else
1245 	    {
1246 	      _Const_Link_type __xu(__x), __yu(__y);
1247 	      __y = __x, __x = _S_left(__x);
1248 	      __xu = _S_right(__xu);
1249 	      return pair<const_iterator,
1250 		          const_iterator>(_M_lower_bound(__x, __y, __k),
1251 					  _M_upper_bound(__xu, __yu, __k));
1252 	    }
1253 	}
1254       return pair<const_iterator, const_iterator>(const_iterator(__y),
1255 						  const_iterator(__y));
1256     }
1257 
1258   template<typename _Key, typename _Val, typename _KeyOfValue,
1259            typename _Compare, typename _Alloc>
1260     void
1261     _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::
1262     swap(_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>& __t)
1263     {
1264       if (_M_root() == 0)
1265 	{
1266 	  if (__t._M_root() != 0)
1267 	    {
1268 	      _M_root() = __t._M_root();
1269 	      _M_leftmost() = __t._M_leftmost();
1270 	      _M_rightmost() = __t._M_rightmost();
1271 	      _M_root()->_M_parent = _M_end();
1272 
1273 	      __t._M_root() = 0;
1274 	      __t._M_leftmost() = __t._M_end();
1275 	      __t._M_rightmost() = __t._M_end();
1276 	    }
1277 	}
1278       else if (__t._M_root() == 0)
1279 	{
1280 	  __t._M_root() = _M_root();
1281 	  __t._M_leftmost() = _M_leftmost();
1282 	  __t._M_rightmost() = _M_rightmost();
1283 	  __t._M_root()->_M_parent = __t._M_end();
1284 
1285 	  _M_root() = 0;
1286 	  _M_leftmost() = _M_end();
1287 	  _M_rightmost() = _M_end();
1288 	}
1289       else
1290 	{
1291 	  std::swap(_M_root(),__t._M_root());
1292 	  std::swap(_M_leftmost(),__t._M_leftmost());
1293 	  std::swap(_M_rightmost(),__t._M_rightmost());
1294 
1295 	  _M_root()->_M_parent = _M_end();
1296 	  __t._M_root()->_M_parent = __t._M_end();
1297 	}
1298       // No need to swap header's color as it does not change.
1299       std::swap(this->_M_impl._M_node_count, __t._M_impl._M_node_count);
1300       std::swap(this->_M_impl._M_key_compare, __t._M_impl._M_key_compare);
1301 
1302       // _GLIBCXX_RESOLVE_LIB_DEFECTS
1303       // 431. Swapping containers with unequal allocators.
1304       std::__alloc_swap<_Node_allocator>::
1305 	_S_do_it(_M_get_Node_allocator(), __t._M_get_Node_allocator());
1306     }
1307 
1308   template<typename _Key, typename _Val, typename _KeyOfValue,
1309            typename _Compare, typename _Alloc>
1310     pair<typename _Rb_tree<_Key, _Val, _KeyOfValue,
1311 			   _Compare, _Alloc>::_Base_ptr,
1312 	 typename _Rb_tree<_Key, _Val, _KeyOfValue,
1313 			   _Compare, _Alloc>::_Base_ptr>
1314     _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::
1315     _M_get_insert_unique_pos(const key_type& __k)
1316     {
1317       typedef pair<_Base_ptr, _Base_ptr> _Res;
1318       _Link_type __x = _M_begin();
1319       _Link_type __y = _M_end();
1320       bool __comp = true;
1321       while (__x != 0)
1322 	{
1323 	  __y = __x;
1324 	  __comp = _M_impl._M_key_compare(__k, _S_key(__x));
1325 	  __x = __comp ? _S_left(__x) : _S_right(__x);
1326 	}
1327       iterator __j = iterator(__y);
1328       if (__comp)
1329 	{
1330 	  if (__j == begin())
1331 	    return _Res(__x, __y);
1332 	  else
1333 	    --__j;
1334 	}
1335       if (_M_impl._M_key_compare(_S_key(__j._M_node), __k))
1336 	return _Res(__x, __y);
1337       return _Res(__j._M_node, 0);
1338     }
1339 
1340   template<typename _Key, typename _Val, typename _KeyOfValue,
1341            typename _Compare, typename _Alloc>
1342     pair<typename _Rb_tree<_Key, _Val, _KeyOfValue,
1343 			   _Compare, _Alloc>::_Base_ptr,
1344 	 typename _Rb_tree<_Key, _Val, _KeyOfValue,
1345 			   _Compare, _Alloc>::_Base_ptr>
1346     _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::
1347     _M_get_insert_equal_pos(const key_type& __k)
1348     {
1349       typedef pair<_Base_ptr, _Base_ptr> _Res;
1350       _Link_type __x = _M_begin();
1351       _Link_type __y = _M_end();
1352       while (__x != 0)
1353 	{
1354 	  __y = __x;
1355 	  __x = _M_impl._M_key_compare(__k, _S_key(__x)) ?
1356 	        _S_left(__x) : _S_right(__x);
1357 	}
1358       return _Res(__x, __y);
1359     }
1360 
1361   template<typename _Key, typename _Val, typename _KeyOfValue,
1362            typename _Compare, typename _Alloc>
1363 #if __cplusplus >= 201103L
1364     template<typename _Arg>
1365 #endif
1366     pair<typename _Rb_tree<_Key, _Val, _KeyOfValue,
1367 			   _Compare, _Alloc>::iterator, bool>
1368     _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::
1369 #if __cplusplus >= 201103L
1370     _M_insert_unique(_Arg&& __v)
1371 #else
1372     _M_insert_unique(const _Val& __v)
1373 #endif
1374     {
1375       typedef pair<iterator, bool> _Res;
1376       pair<_Base_ptr, _Base_ptr> __res
1377 	= _M_get_insert_unique_pos(_KeyOfValue()(__v));
1378 
1379       if (__res.second)
1380 	return _Res(_M_insert_(__res.first, __res.second,
1381 			       _GLIBCXX_FORWARD(_Arg, __v)),
1382 		    true);
1383 
1384       return _Res(iterator(static_cast<_Link_type>(__res.first)), false);
1385     }
1386 
1387   template<typename _Key, typename _Val, typename _KeyOfValue,
1388            typename _Compare, typename _Alloc>
1389 #if __cplusplus >= 201103L
1390     template<typename _Arg>
1391 #endif
1392     typename _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::iterator
1393     _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::
1394 #if __cplusplus >= 201103L
1395     _M_insert_equal(_Arg&& __v)
1396 #else
1397     _M_insert_equal(const _Val& __v)
1398 #endif
1399     {
1400       pair<_Base_ptr, _Base_ptr> __res
1401 	= _M_get_insert_equal_pos(_KeyOfValue()(__v));
1402       return _M_insert_(__res.first, __res.second, _GLIBCXX_FORWARD(_Arg, __v));
1403     }
1404 
1405   template<typename _Key, typename _Val, typename _KeyOfValue,
1406            typename _Compare, typename _Alloc>
1407     pair<typename _Rb_tree<_Key, _Val, _KeyOfValue,
1408 			   _Compare, _Alloc>::_Base_ptr,
1409          typename _Rb_tree<_Key, _Val, _KeyOfValue,
1410 			   _Compare, _Alloc>::_Base_ptr>
1411     _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::
1412     _M_get_insert_hint_unique_pos(const_iterator __position,
1413 				  const key_type& __k)
1414     {
1415       iterator __pos = __position._M_const_cast();
1416       typedef pair<_Base_ptr, _Base_ptr> _Res;
1417 
1418       // end()
1419       if (__pos._M_node == _M_end())
1420 	{
1421 	  if (size() > 0
1422 	      && _M_impl._M_key_compare(_S_key(_M_rightmost()), __k))
1423 	    return _Res(0, _M_rightmost());
1424 	  else
1425 	    return _M_get_insert_unique_pos(__k);
1426 	}
1427       else if (_M_impl._M_key_compare(__k, _S_key(__pos._M_node)))
1428 	{
1429 	  // First, try before...
1430 	  iterator __before = __pos;
1431 	  if (__pos._M_node == _M_leftmost()) // begin()
1432 	    return _Res(_M_leftmost(), _M_leftmost());
1433 	  else if (_M_impl._M_key_compare(_S_key((--__before)._M_node), __k))
1434 	    {
1435 	      if (_S_right(__before._M_node) == 0)
1436 		return _Res(0, __before._M_node);
1437 	      else
1438 		return _Res(__pos._M_node, __pos._M_node);
1439 	    }
1440 	  else
1441 	    return _M_get_insert_unique_pos(__k);
1442 	}
1443       else if (_M_impl._M_key_compare(_S_key(__pos._M_node), __k))
1444 	{
1445 	  // ... then try after.
1446 	  iterator __after = __pos;
1447 	  if (__pos._M_node == _M_rightmost())
1448 	    return _Res(0, _M_rightmost());
1449 	  else if (_M_impl._M_key_compare(__k, _S_key((++__after)._M_node)))
1450 	    {
1451 	      if (_S_right(__pos._M_node) == 0)
1452 		return _Res(0, __pos._M_node);
1453 	      else
1454 		return _Res(__after._M_node, __after._M_node);
1455 	    }
1456 	  else
1457 	    return _M_get_insert_unique_pos(__k);
1458 	}
1459       else
1460 	// Equivalent keys.
1461 	return _Res(__pos._M_node, 0);
1462     }
1463 
1464   template<typename _Key, typename _Val, typename _KeyOfValue,
1465            typename _Compare, typename _Alloc>
1466 #if __cplusplus >= 201103L
1467     template<typename _Arg>
1468 #endif
1469     typename _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::iterator
1470     _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::
1471 #if __cplusplus >= 201103L
1472     _M_insert_unique_(const_iterator __position, _Arg&& __v)
1473 #else
1474     _M_insert_unique_(const_iterator __position, const _Val& __v)
1475 #endif
1476     {
1477       pair<_Base_ptr, _Base_ptr> __res
1478 	= _M_get_insert_hint_unique_pos(__position, _KeyOfValue()(__v));
1479 
1480       if (__res.second)
1481 	return _M_insert_(__res.first, __res.second,
1482 			  _GLIBCXX_FORWARD(_Arg, __v));
1483       return iterator(static_cast<_Link_type>(__res.first));
1484     }
1485 
1486   template<typename _Key, typename _Val, typename _KeyOfValue,
1487            typename _Compare, typename _Alloc>
1488     pair<typename _Rb_tree<_Key, _Val, _KeyOfValue,
1489 			   _Compare, _Alloc>::_Base_ptr,
1490          typename _Rb_tree<_Key, _Val, _KeyOfValue,
1491 			   _Compare, _Alloc>::_Base_ptr>
1492     _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::
1493     _M_get_insert_hint_equal_pos(const_iterator __position, const key_type& __k)
1494     {
1495       iterator __pos = __position._M_const_cast();
1496       typedef pair<_Base_ptr, _Base_ptr> _Res;
1497 
1498       // end()
1499       if (__pos._M_node == _M_end())
1500 	{
1501 	  if (size() > 0
1502 	      && !_M_impl._M_key_compare(__k, _S_key(_M_rightmost())))
1503 	    return _Res(0, _M_rightmost());
1504 	  else
1505 	    return _M_get_insert_equal_pos(__k);
1506 	}
1507       else if (!_M_impl._M_key_compare(_S_key(__pos._M_node), __k))
1508 	{
1509 	  // First, try before...
1510 	  iterator __before = __pos;
1511 	  if (__pos._M_node == _M_leftmost()) // begin()
1512 	    return _Res(_M_leftmost(), _M_leftmost());
1513 	  else if (!_M_impl._M_key_compare(__k, _S_key((--__before)._M_node)))
1514 	    {
1515 	      if (_S_right(__before._M_node) == 0)
1516 		return _Res(0, __before._M_node);
1517 	      else
1518 		return _Res(__pos._M_node, __pos._M_node);
1519 	    }
1520 	  else
1521 	    return _M_get_insert_equal_pos(__k);
1522 	}
1523       else
1524 	{
1525 	  // ... then try after.
1526 	  iterator __after = __pos;
1527 	  if (__pos._M_node == _M_rightmost())
1528 	    return _Res(0, _M_rightmost());
1529 	  else if (!_M_impl._M_key_compare(_S_key((++__after)._M_node), __k))
1530 	    {
1531 	      if (_S_right(__pos._M_node) == 0)
1532 		return _Res(0, __pos._M_node);
1533 	      else
1534 		return _Res(__after._M_node, __after._M_node);
1535 	    }
1536 	  else
1537 	    return _Res(0, 0);
1538 	}
1539     }
1540 
1541   template<typename _Key, typename _Val, typename _KeyOfValue,
1542            typename _Compare, typename _Alloc>
1543 #if __cplusplus >= 201103L
1544     template<typename _Arg>
1545 #endif
1546     typename _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::iterator
1547     _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::
1548 #if __cplusplus >= 201103L
1549     _M_insert_equal_(const_iterator __position, _Arg&& __v)
1550 #else
1551     _M_insert_equal_(const_iterator __position, const _Val& __v)
1552 #endif
1553     {
1554       pair<_Base_ptr, _Base_ptr> __res
1555 	= _M_get_insert_hint_equal_pos(__position, _KeyOfValue()(__v));
1556 
1557       if (__res.second)
1558 	return _M_insert_(__res.first, __res.second,
1559 			  _GLIBCXX_FORWARD(_Arg, __v));
1560 
1561       return _M_insert_equal_lower(_GLIBCXX_FORWARD(_Arg, __v));
1562     }
1563 
1564 #if __cplusplus >= 201103L
1565   template<typename _Key, typename _Val, typename _KeyOfValue,
1566            typename _Compare, typename _Alloc>
1567     typename _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::iterator
1568     _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::
1569     _M_insert_node(_Base_ptr __x, _Base_ptr __p, _Link_type __z)
1570     {
1571       bool __insert_left = (__x != 0 || __p == _M_end()
1572 			    || _M_impl._M_key_compare(_S_key(__z),
1573 						      _S_key(__p)));
1574 
1575       _Rb_tree_insert_and_rebalance(__insert_left, __z, __p,
1576 				    this->_M_impl._M_header);
1577       ++_M_impl._M_node_count;
1578       return iterator(__z);
1579     }
1580 
1581   template<typename _Key, typename _Val, typename _KeyOfValue,
1582            typename _Compare, typename _Alloc>
1583     typename _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::iterator
1584     _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::
1585     _M_insert_lower_node(_Base_ptr __p, _Link_type __z)
1586     {
1587       bool __insert_left = (__p == _M_end()
1588 			    || !_M_impl._M_key_compare(_S_key(__p),
1589 						       _S_key(__z)));
1590 
1591       _Rb_tree_insert_and_rebalance(__insert_left, __z, __p,
1592 				    this->_M_impl._M_header);
1593       ++_M_impl._M_node_count;
1594       return iterator(__z);
1595     }
1596 
1597   template<typename _Key, typename _Val, typename _KeyOfValue,
1598            typename _Compare, typename _Alloc>
1599     typename _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::iterator
1600     _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::
1601     _M_insert_equal_lower_node(_Link_type __z)
1602     {
1603       _Link_type __x = _M_begin();
1604       _Link_type __y = _M_end();
1605       while (__x != 0)
1606 	{
1607 	  __y = __x;
1608 	  __x = !_M_impl._M_key_compare(_S_key(__x), _S_key(__z)) ?
1609 	        _S_left(__x) : _S_right(__x);
1610 	}
1611       return _M_insert_lower_node(__y, __z);
1612     }
1613 
1614   template<typename _Key, typename _Val, typename _KeyOfValue,
1615            typename _Compare, typename _Alloc>
1616     template<typename... _Args>
1617       pair<typename _Rb_tree<_Key, _Val, _KeyOfValue,
1618 			     _Compare, _Alloc>::iterator, bool>
1619       _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::
1620       _M_emplace_unique(_Args&&... __args)
1621       {
1622 	_Link_type __z = _M_create_node(std::forward<_Args>(__args)...);
1623 
1624 	__try
1625 	  {
1626 	    typedef pair<iterator, bool> _Res;
1627 	    auto __res = _M_get_insert_unique_pos(_S_key(__z));
1628 	    if (__res.second)
1629 	      return _Res(_M_insert_node(__res.first, __res.second, __z), true);
1630 
1631 	    _M_destroy_node(__z);
1632 	    return _Res(iterator(static_cast<_Link_type>(__res.first)), false);
1633 	  }
1634 	__catch(...)
1635 	  {
1636 	    _M_destroy_node(__z);
1637 	    __throw_exception_again;
1638 	  }
1639       }
1640 
1641   template<typename _Key, typename _Val, typename _KeyOfValue,
1642            typename _Compare, typename _Alloc>
1643     template<typename... _Args>
1644       typename _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::iterator
1645       _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::
1646       _M_emplace_equal(_Args&&... __args)
1647       {
1648 	_Link_type __z = _M_create_node(std::forward<_Args>(__args)...);
1649 
1650 	__try
1651 	  {
1652 	    auto __res = _M_get_insert_equal_pos(_S_key(__z));
1653 	    return _M_insert_node(__res.first, __res.second, __z);
1654 	  }
1655 	__catch(...)
1656 	  {
1657 	    _M_destroy_node(__z);
1658 	    __throw_exception_again;
1659 	  }
1660       }
1661 
1662   template<typename _Key, typename _Val, typename _KeyOfValue,
1663            typename _Compare, typename _Alloc>
1664     template<typename... _Args>
1665       typename _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::iterator
1666       _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::
1667       _M_emplace_hint_unique(const_iterator __pos, _Args&&... __args)
1668       {
1669 	_Link_type __z = _M_create_node(std::forward<_Args>(__args)...);
1670 
1671 	__try
1672 	  {
1673 	    auto __res = _M_get_insert_hint_unique_pos(__pos, _S_key(__z));
1674 
1675 	    if (__res.second)
1676 	      return _M_insert_node(__res.first, __res.second, __z);
1677 
1678 	    _M_destroy_node(__z);
1679 	    return iterator(static_cast<_Link_type>(__res.first));
1680 	  }
1681 	__catch(...)
1682 	  {
1683 	    _M_destroy_node(__z);
1684 	    __throw_exception_again;
1685 	  }
1686       }
1687 
1688   template<typename _Key, typename _Val, typename _KeyOfValue,
1689            typename _Compare, typename _Alloc>
1690     template<typename... _Args>
1691       typename _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::iterator
1692       _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::
1693       _M_emplace_hint_equal(const_iterator __pos, _Args&&... __args)
1694       {
1695 	_Link_type __z = _M_create_node(std::forward<_Args>(__args)...);
1696 
1697 	__try
1698 	  {
1699 	    auto __res = _M_get_insert_hint_equal_pos(__pos, _S_key(__z));
1700 
1701 	    if (__res.second)
1702 	      return _M_insert_node(__res.first, __res.second, __z);
1703 
1704 	    return _M_insert_equal_lower_node(__z);
1705 	  }
1706 	__catch(...)
1707 	  {
1708 	    _M_destroy_node(__z);
1709 	    __throw_exception_again;
1710 	  }
1711       }
1712 #endif
1713 
1714   template<typename _Key, typename _Val, typename _KoV,
1715            typename _Cmp, typename _Alloc>
1716     template<class _II>
1717       void
1718       _Rb_tree<_Key, _Val, _KoV, _Cmp, _Alloc>::
1719       _M_insert_unique(_II __first, _II __last)
1720       {
1721 	for (; __first != __last; ++__first)
1722 	  _M_insert_unique_(end(), *__first);
1723       }
1724 
1725   template<typename _Key, typename _Val, typename _KoV,
1726            typename _Cmp, typename _Alloc>
1727     template<class _II>
1728       void
1729       _Rb_tree<_Key, _Val, _KoV, _Cmp, _Alloc>::
1730       _M_insert_equal(_II __first, _II __last)
1731       {
1732 	for (; __first != __last; ++__first)
1733 	  _M_insert_equal_(end(), *__first);
1734       }
1735 
1736   template<typename _Key, typename _Val, typename _KeyOfValue,
1737            typename _Compare, typename _Alloc>
1738     void
1739     _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::
1740     _M_erase_aux(const_iterator __position)
1741     {
1742       _Link_type __y =
1743 	static_cast<_Link_type>(_Rb_tree_rebalance_for_erase
1744 				(const_cast<_Base_ptr>(__position._M_node),
1745 				 this->_M_impl._M_header));
1746       _M_destroy_node(__y);
1747       --_M_impl._M_node_count;
1748     }
1749 
1750   template<typename _Key, typename _Val, typename _KeyOfValue,
1751            typename _Compare, typename _Alloc>
1752     void
1753     _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::
1754     _M_erase_aux(const_iterator __first, const_iterator __last)
1755     {
1756       if (__first == begin() && __last == end())
1757 	clear();
1758       else
1759 	while (__first != __last)
1760 	  erase(__first++);
1761     }
1762 
1763   template<typename _Key, typename _Val, typename _KeyOfValue,
1764            typename _Compare, typename _Alloc>
1765     typename _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::size_type
1766     _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::
1767     erase(const _Key& __x)
1768     {
1769       pair<iterator, iterator> __p = equal_range(__x);
1770       const size_type __old_size = size();
1771       erase(__p.first, __p.second);
1772       return __old_size - size();
1773     }
1774 
1775   template<typename _Key, typename _Val, typename _KeyOfValue,
1776            typename _Compare, typename _Alloc>
1777     void
1778     _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::
1779     erase(const _Key* __first, const _Key* __last)
1780     {
1781       while (__first != __last)
1782 	erase(*__first++);
1783     }
1784 
1785   template<typename _Key, typename _Val, typename _KeyOfValue,
1786            typename _Compare, typename _Alloc>
1787     typename _Rb_tree<_Key, _Val, _KeyOfValue,
1788 		      _Compare, _Alloc>::iterator
1789     _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::
1790     find(const _Key& __k)
1791     {
1792       iterator __j = _M_lower_bound(_M_begin(), _M_end(), __k);
1793       return (__j == end()
1794 	      || _M_impl._M_key_compare(__k,
1795 					_S_key(__j._M_node))) ? end() : __j;
1796     }
1797 
1798   template<typename _Key, typename _Val, typename _KeyOfValue,
1799            typename _Compare, typename _Alloc>
1800     typename _Rb_tree<_Key, _Val, _KeyOfValue,
1801 		      _Compare, _Alloc>::const_iterator
1802     _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::
1803     find(const _Key& __k) const
1804     {
1805       const_iterator __j = _M_lower_bound(_M_begin(), _M_end(), __k);
1806       return (__j == end()
1807 	      || _M_impl._M_key_compare(__k,
1808 					_S_key(__j._M_node))) ? end() : __j;
1809     }
1810 
1811   template<typename _Key, typename _Val, typename _KeyOfValue,
1812            typename _Compare, typename _Alloc>
1813     typename _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::size_type
1814     _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::
1815     count(const _Key& __k) const
1816     {
1817       pair<const_iterator, const_iterator> __p = equal_range(__k);
1818       const size_type __n = std::distance(__p.first, __p.second);
1819       return __n;
1820     }
1821 
1822   _GLIBCXX_PURE unsigned int
1823   _Rb_tree_black_count(const _Rb_tree_node_base* __node,
1824                        const _Rb_tree_node_base* __root) throw ();
1825 
1826   template<typename _Key, typename _Val, typename _KeyOfValue,
1827            typename _Compare, typename _Alloc>
1828     bool
1829     _Rb_tree<_Key,_Val,_KeyOfValue,_Compare,_Alloc>::__rb_verify() const
1830     {
1831       if (_M_impl._M_node_count == 0 || begin() == end())
1832 	return _M_impl._M_node_count == 0 && begin() == end()
1833 	       && this->_M_impl._M_header._M_left == _M_end()
1834 	       && this->_M_impl._M_header._M_right == _M_end();
1835 
1836       unsigned int __len = _Rb_tree_black_count(_M_leftmost(), _M_root());
1837       for (const_iterator __it = begin(); __it != end(); ++__it)
1838 	{
1839 	  _Const_Link_type __x = static_cast<_Const_Link_type>(__it._M_node);
1840 	  _Const_Link_type __L = _S_left(__x);
1841 	  _Const_Link_type __R = _S_right(__x);
1842 
1843 	  if (__x->_M_color == _S_red)
1844 	    if ((__L && __L->_M_color == _S_red)
1845 		|| (__R && __R->_M_color == _S_red))
1846 	      return false;
1847 
1848 	  if (__L && _M_impl._M_key_compare(_S_key(__x), _S_key(__L)))
1849 	    return false;
1850 	  if (__R && _M_impl._M_key_compare(_S_key(__R), _S_key(__x)))
1851 	    return false;
1852 
1853 	  if (!__L && !__R && _Rb_tree_black_count(__x, _M_root()) != __len)
1854 	    return false;
1855 	}
1856 
1857       if (_M_leftmost() != _Rb_tree_node_base::_S_minimum(_M_root()))
1858 	return false;
1859       if (_M_rightmost() != _Rb_tree_node_base::_S_maximum(_M_root()))
1860 	return false;
1861       return true;
1862     }
1863 
1864 _GLIBCXX_END_NAMESPACE_VERSION
1865 } // namespace
1866 
1867 #endif
1868