LCOV - code coverage report
Current view: top level - usr/include/c++/4.4/bits - stl_tree.h (source / functions) Hit Total Coverage
Test: coverage.info Lines: 184 346 53.2 %
Date: 2017-07-14 10:03:36 Functions: 238 2422 9.8 %

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

Generated by: LCOV version 1.11