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