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 static_cast<_Link_type>(&this->_M_impl._M_header); }
514  	
515  	      _Const_Link_type
516  	      _M_end() const
517  	      { return static_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