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