std_bitset.h: Use GLIBCPP in multiple-inclusion guard.
[gcc.git] / libstdc++-v3 / include / bits / stl_tree.h
1 // RB tree implementation -*- C++ -*-
2
3 // Copyright (C) 2001 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
94 typedef bool _Rb_tree_Color_type;
95 const _Rb_tree_Color_type _S_rb_tree_red = false;
96 const _Rb_tree_Color_type _S_rb_tree_black = true;
97
98 struct _Rb_tree_node_base
99 {
100 typedef _Rb_tree_Color_type _Color_type;
101 typedef _Rb_tree_node_base* _Base_ptr;
102
103 _Color_type _M_color;
104 _Base_ptr _M_parent;
105 _Base_ptr _M_left;
106 _Base_ptr _M_right;
107
108 static _Base_ptr _S_minimum(_Base_ptr __x)
109 {
110 while (__x->_M_left != 0) __x = __x->_M_left;
111 return __x;
112 }
113
114 static _Base_ptr _S_maximum(_Base_ptr __x)
115 {
116 while (__x->_M_right != 0) __x = __x->_M_right;
117 return __x;
118 }
119 };
120
121 template <class _Value>
122 struct _Rb_tree_node : public _Rb_tree_node_base
123 {
124 typedef _Rb_tree_node<_Value>* _Link_type;
125 _Value _M_value_field;
126 };
127
128
129 struct _Rb_tree_base_iterator
130 {
131 typedef _Rb_tree_node_base::_Base_ptr _Base_ptr;
132 typedef bidirectional_iterator_tag iterator_category;
133 typedef ptrdiff_t difference_type;
134 _Base_ptr _M_node;
135
136 void _M_increment()
137 {
138 if (_M_node->_M_right != 0) {
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 _Base_ptr __y = _M_node->_M_parent;
145 while (_M_node == __y->_M_right) {
146 _M_node = __y;
147 __y = __y->_M_parent;
148 }
149 if (_M_node->_M_right != __y)
150 _M_node = __y;
151 }
152 }
153
154 void _M_decrement()
155 {
156 if (_M_node->_M_color == _S_rb_tree_red &&
157 _M_node->_M_parent->_M_parent == _M_node)
158 _M_node = _M_node->_M_right;
159 else if (_M_node->_M_left != 0) {
160 _Base_ptr __y = _M_node->_M_left;
161 while (__y->_M_right != 0)
162 __y = __y->_M_right;
163 _M_node = __y;
164 }
165 else {
166 _Base_ptr __y = _M_node->_M_parent;
167 while (_M_node == __y->_M_left) {
168 _M_node = __y;
169 __y = __y->_M_parent;
170 }
171 _M_node = __y;
172 }
173 }
174 };
175
176 template <class _Value, class _Ref, class _Ptr>
177 struct _Rb_tree_iterator : public _Rb_tree_base_iterator
178 {
179 typedef _Value value_type;
180 typedef _Ref reference;
181 typedef _Ptr pointer;
182 typedef _Rb_tree_iterator<_Value, _Value&, _Value*>
183 iterator;
184 typedef _Rb_tree_iterator<_Value, const _Value&, const _Value*>
185 const_iterator;
186 typedef _Rb_tree_iterator<_Value, _Ref, _Ptr>
187 _Self;
188 typedef _Rb_tree_node<_Value>* _Link_type;
189
190 _Rb_tree_iterator() {}
191 _Rb_tree_iterator(_Link_type __x) { _M_node = __x; }
192 _Rb_tree_iterator(const iterator& __it) { _M_node = __it._M_node; }
193
194 reference operator*() const { return _Link_type(_M_node)->_M_value_field; }
195 pointer operator->() const { return &(operator*()); }
196
197 _Self& operator++() { _M_increment(); return *this; }
198 _Self operator++(int) {
199 _Self __tmp = *this;
200 _M_increment();
201 return __tmp;
202 }
203
204 _Self& operator--() { _M_decrement(); return *this; }
205 _Self operator--(int) {
206 _Self __tmp = *this;
207 _M_decrement();
208 return __tmp;
209 }
210 };
211
212 template <class _Value, class _Ref, class _Ptr>
213 inline bool operator==(const _Rb_tree_iterator<_Value, _Ref, _Ptr>& __x,
214 const _Rb_tree_iterator<_Value, _Ref, _Ptr>& __y) {
215 return __x._M_node == __y._M_node;
216 }
217
218 template <class _Value>
219 inline bool operator==(const _Rb_tree_iterator<_Value, const _Value&, const _Value*>& __x,
220 const _Rb_tree_iterator<_Value, _Value&, _Value*>& __y) {
221 return __x._M_node == __y._M_node;
222 }
223
224 template <class _Value>
225 inline bool operator==(const _Rb_tree_iterator<_Value, _Value&, _Value*>& __x,
226 const _Rb_tree_iterator<_Value, const _Value&, const _Value*>& __y) {
227 return __x._M_node == __y._M_node;
228 }
229
230 template <class _Value, class _Ref, class _Ptr>
231 inline bool operator!=(const _Rb_tree_iterator<_Value, _Ref, _Ptr>& __x,
232 const _Rb_tree_iterator<_Value, _Ref, _Ptr>& __y) {
233 return __x._M_node != __y._M_node;
234 }
235
236 template <class _Value>
237 inline bool operator!=(const _Rb_tree_iterator<_Value, const _Value&, const _Value*>& __x,
238 const _Rb_tree_iterator<_Value, _Value&, _Value*>& __y) {
239 return __x._M_node != __y._M_node;
240 }
241
242 template <class _Value>
243 inline bool operator!=(const _Rb_tree_iterator<_Value, _Value&, _Value*>& __x,
244 const _Rb_tree_iterator<_Value, const _Value&, const _Value*>& __y) {
245 return __x._M_node != __y._M_node;
246 }
247
248 inline void
249 _Rb_tree_rotate_left(_Rb_tree_node_base* __x, _Rb_tree_node_base*& __root)
250 {
251 _Rb_tree_node_base* __y = __x->_M_right;
252 __x->_M_right = __y->_M_left;
253 if (__y->_M_left !=0)
254 __y->_M_left->_M_parent = __x;
255 __y->_M_parent = __x->_M_parent;
256
257 if (__x == __root)
258 __root = __y;
259 else if (__x == __x->_M_parent->_M_left)
260 __x->_M_parent->_M_left = __y;
261 else
262 __x->_M_parent->_M_right = __y;
263 __y->_M_left = __x;
264 __x->_M_parent = __y;
265 }
266
267 inline void
268 _Rb_tree_rotate_right(_Rb_tree_node_base* __x, _Rb_tree_node_base*& __root)
269 {
270 _Rb_tree_node_base* __y = __x->_M_left;
271 __x->_M_left = __y->_M_right;
272 if (__y->_M_right != 0)
273 __y->_M_right->_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_right)
279 __x->_M_parent->_M_right = __y;
280 else
281 __x->_M_parent->_M_left = __y;
282 __y->_M_right = __x;
283 __x->_M_parent = __y;
284 }
285
286 inline void
287 _Rb_tree_rebalance(_Rb_tree_node_base* __x, _Rb_tree_node_base*& __root)
288 {
289 __x->_M_color = _S_rb_tree_red;
290 while (__x != __root && __x->_M_parent->_M_color == _S_rb_tree_red) {
291 if (__x->_M_parent == __x->_M_parent->_M_parent->_M_left) {
292 _Rb_tree_node_base* __y = __x->_M_parent->_M_parent->_M_right;
293 if (__y && __y->_M_color == _S_rb_tree_red) {
294 __x->_M_parent->_M_color = _S_rb_tree_black;
295 __y->_M_color = _S_rb_tree_black;
296 __x->_M_parent->_M_parent->_M_color = _S_rb_tree_red;
297 __x = __x->_M_parent->_M_parent;
298 }
299 else {
300 if (__x == __x->_M_parent->_M_right) {
301 __x = __x->_M_parent;
302 _Rb_tree_rotate_left(__x, __root);
303 }
304 __x->_M_parent->_M_color = _S_rb_tree_black;
305 __x->_M_parent->_M_parent->_M_color = _S_rb_tree_red;
306 _Rb_tree_rotate_right(__x->_M_parent->_M_parent, __root);
307 }
308 }
309 else {
310 _Rb_tree_node_base* __y = __x->_M_parent->_M_parent->_M_left;
311 if (__y && __y->_M_color == _S_rb_tree_red) {
312 __x->_M_parent->_M_color = _S_rb_tree_black;
313 __y->_M_color = _S_rb_tree_black;
314 __x->_M_parent->_M_parent->_M_color = _S_rb_tree_red;
315 __x = __x->_M_parent->_M_parent;
316 }
317 else {
318 if (__x == __x->_M_parent->_M_left) {
319 __x = __x->_M_parent;
320 _Rb_tree_rotate_right(__x, __root);
321 }
322 __x->_M_parent->_M_color = _S_rb_tree_black;
323 __x->_M_parent->_M_parent->_M_color = _S_rb_tree_red;
324 _Rb_tree_rotate_left(__x->_M_parent->_M_parent, __root);
325 }
326 }
327 }
328 __root->_M_color = _S_rb_tree_black;
329 }
330
331 inline _Rb_tree_node_base*
332 _Rb_tree_rebalance_for_erase(_Rb_tree_node_base* __z,
333 _Rb_tree_node_base*& __root,
334 _Rb_tree_node_base*& __leftmost,
335 _Rb_tree_node_base*& __rightmost)
336 {
337 _Rb_tree_node_base* __y = __z;
338 _Rb_tree_node_base* __x = 0;
339 _Rb_tree_node_base* __x_parent = 0;
340 if (__y->_M_left == 0) // __z has at most one non-null child. y == z.
341 __x = __y->_M_right; // __x might be null.
342 else
343 if (__y->_M_right == 0) // __z has exactly one non-null child. y == z.
344 __x = __y->_M_left; // __x is not null.
345 else { // __z has two non-null children. Set __y to
346 __y = __y->_M_right; // __z's successor. __x might be null.
347 while (__y->_M_left != 0)
348 __y = __y->_M_left;
349 __x = __y->_M_right;
350 }
351 if (__y != __z) { // relink y in place of z. y is z's successor
352 __z->_M_left->_M_parent = __y;
353 __y->_M_left = __z->_M_left;
354 if (__y != __z->_M_right) {
355 __x_parent = __y->_M_parent;
356 if (__x) __x->_M_parent = __y->_M_parent;
357 __y->_M_parent->_M_left = __x; // __y must be a child of _M_left
358 __y->_M_right = __z->_M_right;
359 __z->_M_right->_M_parent = __y;
360 }
361 else
362 __x_parent = __y;
363 if (__root == __z)
364 __root = __y;
365 else if (__z->_M_parent->_M_left == __z)
366 __z->_M_parent->_M_left = __y;
367 else
368 __z->_M_parent->_M_right = __y;
369 __y->_M_parent = __z->_M_parent;
370 std::swap(__y->_M_color, __z->_M_color);
371 __y = __z;
372 // __y now points to node to be actually deleted
373 }
374 else { // __y == __z
375 __x_parent = __y->_M_parent;
376 if (__x) __x->_M_parent = __y->_M_parent;
377 if (__root == __z)
378 __root = __x;
379 else
380 if (__z->_M_parent->_M_left == __z)
381 __z->_M_parent->_M_left = __x;
382 else
383 __z->_M_parent->_M_right = __x;
384 if (__leftmost == __z)
385 if (__z->_M_right == 0) // __z->_M_left must be null also
386 __leftmost = __z->_M_parent;
387 // makes __leftmost == _M_header if __z == __root
388 else
389 __leftmost = _Rb_tree_node_base::_S_minimum(__x);
390 if (__rightmost == __z)
391 if (__z->_M_left == 0) // __z->_M_right must be null also
392 __rightmost = __z->_M_parent;
393 // makes __rightmost == _M_header if __z == __root
394 else // __x == __z->_M_left
395 __rightmost = _Rb_tree_node_base::_S_maximum(__x);
396 }
397 if (__y->_M_color != _S_rb_tree_red) {
398 while (__x != __root && (__x == 0 || __x->_M_color == _S_rb_tree_black))
399 if (__x == __x_parent->_M_left) {
400 _Rb_tree_node_base* __w = __x_parent->_M_right;
401 if (__w->_M_color == _S_rb_tree_red) {
402 __w->_M_color = _S_rb_tree_black;
403 __x_parent->_M_color = _S_rb_tree_red;
404 _Rb_tree_rotate_left(__x_parent, __root);
405 __w = __x_parent->_M_right;
406 }
407 if ((__w->_M_left == 0 ||
408 __w->_M_left->_M_color == _S_rb_tree_black) &&
409 (__w->_M_right == 0 ||
410 __w->_M_right->_M_color == _S_rb_tree_black)) {
411 __w->_M_color = _S_rb_tree_red;
412 __x = __x_parent;
413 __x_parent = __x_parent->_M_parent;
414 } else {
415 if (__w->_M_right == 0 ||
416 __w->_M_right->_M_color == _S_rb_tree_black) {
417 if (__w->_M_left) __w->_M_left->_M_color = _S_rb_tree_black;
418 __w->_M_color = _S_rb_tree_red;
419 _Rb_tree_rotate_right(__w, __root);
420 __w = __x_parent->_M_right;
421 }
422 __w->_M_color = __x_parent->_M_color;
423 __x_parent->_M_color = _S_rb_tree_black;
424 if (__w->_M_right) __w->_M_right->_M_color = _S_rb_tree_black;
425 _Rb_tree_rotate_left(__x_parent, __root);
426 break;
427 }
428 } else { // same as above, with _M_right <-> _M_left.
429 _Rb_tree_node_base* __w = __x_parent->_M_left;
430 if (__w->_M_color == _S_rb_tree_red) {
431 __w->_M_color = _S_rb_tree_black;
432 __x_parent->_M_color = _S_rb_tree_red;
433 _Rb_tree_rotate_right(__x_parent, __root);
434 __w = __x_parent->_M_left;
435 }
436 if ((__w->_M_right == 0 ||
437 __w->_M_right->_M_color == _S_rb_tree_black) &&
438 (__w->_M_left == 0 ||
439 __w->_M_left->_M_color == _S_rb_tree_black)) {
440 __w->_M_color = _S_rb_tree_red;
441 __x = __x_parent;
442 __x_parent = __x_parent->_M_parent;
443 } else {
444 if (__w->_M_left == 0 ||
445 __w->_M_left->_M_color == _S_rb_tree_black) {
446 if (__w->_M_right) __w->_M_right->_M_color = _S_rb_tree_black;
447 __w->_M_color = _S_rb_tree_red;
448 _Rb_tree_rotate_left(__w, __root);
449 __w = __x_parent->_M_left;
450 }
451 __w->_M_color = __x_parent->_M_color;
452 __x_parent->_M_color = _S_rb_tree_black;
453 if (__w->_M_left) __w->_M_left->_M_color = _S_rb_tree_black;
454 _Rb_tree_rotate_right(__x_parent, __root);
455 break;
456 }
457 }
458 if (__x) __x->_M_color = _S_rb_tree_black;
459 }
460 return __y;
461 }
462
463 // Base class to encapsulate the differences between old SGI-style
464 // allocators and standard-conforming allocators. In order to avoid
465 // having an empty base class, we arbitrarily move one of rb_tree's
466 // data members into the base class.
467
468 // _Base for general standard-conforming allocators.
469 template <class _Tp, class _Alloc, bool _S_instanceless>
470 class _Rb_tree_alloc_base {
471 public:
472 typedef typename _Alloc_traits<_Tp, _Alloc>::allocator_type allocator_type;
473 allocator_type get_allocator() const { return _M_node_allocator; }
474
475 _Rb_tree_alloc_base(const allocator_type& __a)
476 : _M_node_allocator(__a), _M_header(0) {}
477
478 protected:
479 typename _Alloc_traits<_Rb_tree_node<_Tp>, _Alloc>::allocator_type
480 _M_node_allocator;
481 _Rb_tree_node<_Tp>* _M_header;
482
483 _Rb_tree_node<_Tp>* _M_get_node()
484 { return _M_node_allocator.allocate(1); }
485 void _M_put_node(_Rb_tree_node<_Tp>* __p)
486 { _M_node_allocator.deallocate(__p, 1); }
487 };
488
489 // Specialization for instanceless allocators.
490 template <class _Tp, class _Alloc>
491 class _Rb_tree_alloc_base<_Tp, _Alloc, true> {
492 public:
493 typedef typename _Alloc_traits<_Tp, _Alloc>::allocator_type allocator_type;
494 allocator_type get_allocator() const { return allocator_type(); }
495
496 _Rb_tree_alloc_base(const allocator_type&) : _M_header(0) {}
497
498 protected:
499 _Rb_tree_node<_Tp>* _M_header;
500
501 typedef typename _Alloc_traits<_Rb_tree_node<_Tp>, _Alloc>::_Alloc_type
502 _Alloc_type;
503
504 _Rb_tree_node<_Tp>* _M_get_node()
505 { return _Alloc_type::allocate(1); }
506 void _M_put_node(_Rb_tree_node<_Tp>* __p)
507 { _Alloc_type::deallocate(__p, 1); }
508 };
509
510 template <class _Tp, class _Alloc>
511 struct _Rb_tree_base
512 : public _Rb_tree_alloc_base<_Tp, _Alloc,
513 _Alloc_traits<_Tp, _Alloc>::_S_instanceless>
514 {
515 typedef _Rb_tree_alloc_base<_Tp, _Alloc,
516 _Alloc_traits<_Tp, _Alloc>::_S_instanceless>
517 _Base;
518 typedef typename _Base::allocator_type allocator_type;
519
520 _Rb_tree_base(const allocator_type& __a)
521 : _Base(__a) { _M_header = _M_get_node(); }
522 ~_Rb_tree_base() { _M_put_node(_M_header); }
523
524 };
525
526
527 template <class _Key, class _Value, class _KeyOfValue, class _Compare,
528 class _Alloc = allocator<_Value> >
529 class _Rb_tree : protected _Rb_tree_base<_Value, _Alloc> {
530 typedef _Rb_tree_base<_Value, _Alloc> _Base;
531 protected:
532 typedef _Rb_tree_node_base* _Base_ptr;
533 typedef _Rb_tree_node<_Value> _Rb_tree_node;
534 typedef _Rb_tree_Color_type _Color_type;
535 public:
536 typedef _Key key_type;
537 typedef _Value value_type;
538 typedef value_type* pointer;
539 typedef const value_type* const_pointer;
540 typedef value_type& reference;
541 typedef const value_type& const_reference;
542 typedef _Rb_tree_node* _Link_type;
543 typedef size_t size_type;
544 typedef ptrdiff_t difference_type;
545
546 typedef typename _Base::allocator_type allocator_type;
547 allocator_type get_allocator() const { return _Base::get_allocator(); }
548
549 protected:
550 using _Base::_M_get_node;
551 using _Base::_M_put_node;
552 using _Base::_M_header;
553
554 protected:
555
556 _Link_type
557 _M_create_node(const value_type& __x)
558 {
559 _Link_type __tmp = _M_get_node();
560 try {
561 _Construct(&__tmp->_M_value_field, __x);
562 }
563 catch(...)
564 {
565 _M_put_node(__tmp);
566 __throw_exception_again;
567 }
568 return __tmp;
569 }
570
571 _Link_type _M_clone_node(_Link_type __x)
572 {
573 _Link_type __tmp = _M_create_node(__x->_M_value_field);
574 __tmp->_M_color = __x->_M_color;
575 __tmp->_M_left = 0;
576 __tmp->_M_right = 0;
577 return __tmp;
578 }
579
580 void
581 destroy_node(_Link_type __p)
582 {
583 _Destroy(&__p->_M_value_field);
584 _M_put_node(__p);
585 }
586
587 protected:
588 size_type _M_node_count; // keeps track of size of tree
589 _Compare _M_key_compare;
590
591 _Link_type& _M_root() const
592 { return (_Link_type&) _M_header->_M_parent; }
593 _Link_type& _M_leftmost() const
594 { return (_Link_type&) _M_header->_M_left; }
595 _Link_type& _M_rightmost() const
596 { return (_Link_type&) _M_header->_M_right; }
597
598 static _Link_type& _S_left(_Link_type __x)
599 { return (_Link_type&)(__x->_M_left); }
600 static _Link_type& _S_right(_Link_type __x)
601 { return (_Link_type&)(__x->_M_right); }
602 static _Link_type& _S_parent(_Link_type __x)
603 { return (_Link_type&)(__x->_M_parent); }
604 static reference _S_value(_Link_type __x)
605 { return __x->_M_value_field; }
606 static const _Key& _S_key(_Link_type __x)
607 { return _KeyOfValue()(_S_value(__x)); }
608 static _Color_type& _S_color(_Link_type __x)
609 { return (_Color_type&)(__x->_M_color); }
610
611 static _Link_type& _S_left(_Base_ptr __x)
612 { return (_Link_type&)(__x->_M_left); }
613 static _Link_type& _S_right(_Base_ptr __x)
614 { return (_Link_type&)(__x->_M_right); }
615 static _Link_type& _S_parent(_Base_ptr __x)
616 { return (_Link_type&)(__x->_M_parent); }
617 static reference _S_value(_Base_ptr __x)
618 { return ((_Link_type)__x)->_M_value_field; }
619 static const _Key& _S_key(_Base_ptr __x)
620 { return _KeyOfValue()(_S_value(_Link_type(__x)));}
621 static _Color_type& _S_color(_Base_ptr __x)
622 { return (_Color_type&)(_Link_type(__x)->_M_color); }
623
624 static _Link_type _S_minimum(_Link_type __x)
625 { return (_Link_type) _Rb_tree_node_base::_S_minimum(__x); }
626
627 static _Link_type _S_maximum(_Link_type __x)
628 { return (_Link_type) _Rb_tree_node_base::_S_maximum(__x); }
629
630 public:
631 typedef _Rb_tree_iterator<value_type, reference, pointer> iterator;
632 typedef _Rb_tree_iterator<value_type, const_reference, const_pointer>
633 const_iterator;
634
635 typedef reverse_iterator<const_iterator> const_reverse_iterator;
636 typedef reverse_iterator<iterator> reverse_iterator;
637
638 private:
639 iterator _M_insert(_Base_ptr __x, _Base_ptr __y, const value_type& __v);
640 _Link_type _M_copy(_Link_type __x, _Link_type __p);
641 void _M_erase(_Link_type __x);
642
643 public:
644 // allocation/deallocation
645 _Rb_tree()
646 : _Base(allocator_type()), _M_node_count(0), _M_key_compare()
647 { _M_empty_initialize(); }
648
649 _Rb_tree(const _Compare& __comp)
650 : _Base(allocator_type()), _M_node_count(0), _M_key_compare(__comp)
651 { _M_empty_initialize(); }
652
653 _Rb_tree(const _Compare& __comp, const allocator_type& __a)
654 : _Base(__a), _M_node_count(0), _M_key_compare(__comp)
655 { _M_empty_initialize(); }
656
657 _Rb_tree(const _Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc>& __x)
658 : _Base(__x.get_allocator()),
659 _M_node_count(0), _M_key_compare(__x._M_key_compare)
660 {
661 if (__x._M_root() == 0)
662 _M_empty_initialize();
663 else {
664 _S_color(_M_header) = _S_rb_tree_red;
665 _M_root() = _M_copy(__x._M_root(), _M_header);
666 _M_leftmost() = _S_minimum(_M_root());
667 _M_rightmost() = _S_maximum(_M_root());
668 }
669 _M_node_count = __x._M_node_count;
670 }
671 ~_Rb_tree() { clear(); }
672 _Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc>&
673 operator=(const _Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc>& __x);
674
675 private:
676 void _M_empty_initialize() {
677 _S_color(_M_header) = _S_rb_tree_red; // used to distinguish header from
678 // __root, in iterator.operator++
679 _M_root() = 0;
680 _M_leftmost() = _M_header;
681 _M_rightmost() = _M_header;
682 }
683
684 public:
685 // accessors:
686 _Compare key_comp() const { return _M_key_compare; }
687 iterator begin() { return _M_leftmost(); }
688 const_iterator begin() const { return _M_leftmost(); }
689 iterator end() { return _M_header; }
690 const_iterator end() const { return _M_header; }
691 reverse_iterator rbegin() { return reverse_iterator(end()); }
692 const_reverse_iterator rbegin() const {
693 return const_reverse_iterator(end());
694 }
695 reverse_iterator rend() { return reverse_iterator(begin()); }
696 const_reverse_iterator rend() const {
697 return const_reverse_iterator(begin());
698 }
699 bool empty() const { return _M_node_count == 0; }
700 size_type size() const { return _M_node_count; }
701 size_type max_size() const { return size_type(-1); }
702
703 void swap(_Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc>& __t) {
704 std::swap(_M_header, __t._M_header);
705 std::swap(_M_node_count, __t._M_node_count);
706 std::swap(_M_key_compare, __t._M_key_compare);
707 }
708
709 public:
710 // insert/erase
711 pair<iterator,bool> insert_unique(const value_type& __x);
712 iterator insert_equal(const value_type& __x);
713
714 iterator insert_unique(iterator __position, const value_type& __x);
715 iterator insert_equal(iterator __position, const value_type& __x);
716
717 template <class _InputIterator>
718 void insert_unique(_InputIterator __first, _InputIterator __last);
719 template <class _InputIterator>
720 void insert_equal(_InputIterator __first, _InputIterator __last);
721
722 void erase(iterator __position);
723 size_type erase(const key_type& __x);
724 void erase(iterator __first, iterator __last);
725 void erase(const key_type* __first, const key_type* __last);
726 void clear() {
727 if (_M_node_count != 0) {
728 _M_erase(_M_root());
729 _M_leftmost() = _M_header;
730 _M_root() = 0;
731 _M_rightmost() = _M_header;
732 _M_node_count = 0;
733 }
734 }
735
736 public:
737 // set operations:
738 iterator find(const key_type& __x);
739 const_iterator find(const key_type& __x) const;
740 size_type count(const key_type& __x) const;
741 iterator lower_bound(const key_type& __x);
742 const_iterator lower_bound(const key_type& __x) const;
743 iterator upper_bound(const key_type& __x);
744 const_iterator upper_bound(const key_type& __x) const;
745 pair<iterator,iterator> equal_range(const key_type& __x);
746 pair<const_iterator, const_iterator> equal_range(const key_type& __x) const;
747
748 public:
749 // Debugging.
750 bool __rb_verify() const;
751 };
752
753 template <class _Key, class _Value, class _KeyOfValue,
754 class _Compare, class _Alloc>
755 inline bool
756 operator==(const _Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc>& __x,
757 const _Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc>& __y)
758 {
759 return __x.size() == __y.size() &&
760 equal(__x.begin(), __x.end(), __y.begin());
761 }
762
763 template <class _Key, class _Value, class _KeyOfValue,
764 class _Compare, class _Alloc>
765 inline bool
766 operator<(const _Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc>& __x,
767 const _Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc>& __y)
768 {
769 return lexicographical_compare(__x.begin(), __x.end(),
770 __y.begin(), __y.end());
771 }
772
773 template <class _Key, class _Value, class _KeyOfValue,
774 class _Compare, class _Alloc>
775 inline bool
776 operator!=(const _Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc>& __x,
777 const _Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc>& __y) {
778 return !(__x == __y);
779 }
780
781 template <class _Key, class _Value, class _KeyOfValue,
782 class _Compare, class _Alloc>
783 inline bool
784 operator>(const _Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc>& __x,
785 const _Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc>& __y) {
786 return __y < __x;
787 }
788
789 template <class _Key, class _Value, class _KeyOfValue,
790 class _Compare, class _Alloc>
791 inline bool
792 operator<=(const _Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc>& __x,
793 const _Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc>& __y) {
794 return !(__y < __x);
795 }
796
797 template <class _Key, class _Value, class _KeyOfValue,
798 class _Compare, class _Alloc>
799 inline bool
800 operator>=(const _Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc>& __x,
801 const _Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc>& __y) {
802 return !(__x < __y);
803 }
804
805
806 template <class _Key, class _Value, class _KeyOfValue,
807 class _Compare, class _Alloc>
808 inline void
809 swap(_Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc>& __x,
810 _Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc>& __y)
811 {
812 __x.swap(__y);
813 }
814
815
816 template <class _Key, class _Value, class _KeyOfValue,
817 class _Compare, class _Alloc>
818 _Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc>&
819 _Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc>
820 ::operator=(const _Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc>& __x)
821 {
822 if (this != &__x) {
823 // Note that _Key may be a constant type.
824 clear();
825 _M_node_count = 0;
826 _M_key_compare = __x._M_key_compare;
827 if (__x._M_root() == 0) {
828 _M_root() = 0;
829 _M_leftmost() = _M_header;
830 _M_rightmost() = _M_header;
831 }
832 else {
833 _M_root() = _M_copy(__x._M_root(), _M_header);
834 _M_leftmost() = _S_minimum(_M_root());
835 _M_rightmost() = _S_maximum(_M_root());
836 _M_node_count = __x._M_node_count;
837 }
838 }
839 return *this;
840 }
841
842 template <class _Key, class _Value, class _KeyOfValue,
843 class _Compare, class _Alloc>
844 typename _Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc>::iterator
845 _Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc>
846 ::_M_insert(_Base_ptr __x_, _Base_ptr __y_, const _Value& __v)
847 {
848 _Link_type __x = (_Link_type) __x_;
849 _Link_type __y = (_Link_type) __y_;
850 _Link_type __z;
851
852 if (__y == _M_header || __x != 0 ||
853 _M_key_compare(_KeyOfValue()(__v), _S_key(__y))) {
854 __z = _M_create_node(__v);
855 _S_left(__y) = __z; // also makes _M_leftmost() = __z
856 // when __y == _M_header
857 if (__y == _M_header) {
858 _M_root() = __z;
859 _M_rightmost() = __z;
860 }
861 else if (__y == _M_leftmost())
862 _M_leftmost() = __z; // maintain _M_leftmost() pointing to min node
863 }
864 else {
865 __z = _M_create_node(__v);
866 _S_right(__y) = __z;
867 if (__y == _M_rightmost())
868 _M_rightmost() = __z; // maintain _M_rightmost() pointing to max node
869 }
870 _S_parent(__z) = __y;
871 _S_left(__z) = 0;
872 _S_right(__z) = 0;
873 _Rb_tree_rebalance(__z, _M_header->_M_parent);
874 ++_M_node_count;
875 return iterator(__z);
876 }
877
878 template <class _Key, class _Value, class _KeyOfValue,
879 class _Compare, class _Alloc>
880 typename _Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc>::iterator
881 _Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc>
882 ::insert_equal(const _Value& __v)
883 {
884 _Link_type __y = _M_header;
885 _Link_type __x = _M_root();
886 while (__x != 0) {
887 __y = __x;
888 __x = _M_key_compare(_KeyOfValue()(__v), _S_key(__x)) ?
889 _S_left(__x) : _S_right(__x);
890 }
891 return _M_insert(__x, __y, __v);
892 }
893
894
895 template <class _Key, class _Value, class _KeyOfValue,
896 class _Compare, class _Alloc>
897 pair<typename _Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc>::iterator,
898 bool>
899 _Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc>
900 ::insert_unique(const _Value& __v)
901 {
902 _Link_type __y = _M_header;
903 _Link_type __x = _M_root();
904 bool __comp = true;
905 while (__x != 0) {
906 __y = __x;
907 __comp = _M_key_compare(_KeyOfValue()(__v), _S_key(__x));
908 __x = __comp ? _S_left(__x) : _S_right(__x);
909 }
910 iterator __j = iterator(__y);
911 if (__comp)
912 if (__j == begin())
913 return pair<iterator,bool>(_M_insert(__x, __y, __v), true);
914 else
915 --__j;
916 if (_M_key_compare(_S_key(__j._M_node), _KeyOfValue()(__v)))
917 return pair<iterator,bool>(_M_insert(__x, __y, __v), true);
918 return pair<iterator,bool>(__j, false);
919 }
920
921
922 template <class _Key, class _Val, class _KeyOfValue,
923 class _Compare, class _Alloc>
924 typename _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::iterator
925 _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>
926 ::insert_unique(iterator __position, const _Val& __v)
927 {
928 if (__position._M_node == _M_header->_M_left) { // begin()
929 if (size() > 0 &&
930 _M_key_compare(_KeyOfValue()(__v), _S_key(__position._M_node)))
931 return _M_insert(__position._M_node, __position._M_node, __v);
932 // first argument just needs to be non-null
933 else
934 return insert_unique(__v).first;
935 } else if (__position._M_node == _M_header) { // end()
936 if (_M_key_compare(_S_key(_M_rightmost()), _KeyOfValue()(__v)))
937 return _M_insert(0, _M_rightmost(), __v);
938 else
939 return insert_unique(__v).first;
940 } else {
941 iterator __before = __position;
942 --__before;
943 if (_M_key_compare(_S_key(__before._M_node), _KeyOfValue()(__v))
944 && _M_key_compare(_KeyOfValue()(__v), _S_key(__position._M_node))) {
945 if (_S_right(__before._M_node) == 0)
946 return _M_insert(0, __before._M_node, __v);
947 else
948 return _M_insert(__position._M_node, __position._M_node, __v);
949 // first argument just needs to be non-null
950 } else
951 return insert_unique(__v).first;
952 }
953 }
954
955 template <class _Key, class _Val, class _KeyOfValue,
956 class _Compare, class _Alloc>
957 typename _Rb_tree<_Key,_Val,_KeyOfValue,_Compare,_Alloc>::iterator
958 _Rb_tree<_Key,_Val,_KeyOfValue,_Compare,_Alloc>
959 ::insert_equal(iterator __position, const _Val& __v)
960 {
961 if (__position._M_node == _M_header->_M_left) { // begin()
962 if (size() > 0 &&
963 !_M_key_compare(_S_key(__position._M_node), _KeyOfValue()(__v)))
964 return _M_insert(__position._M_node, __position._M_node, __v);
965 // first argument just needs to be non-null
966 else
967 return insert_equal(__v);
968 } else if (__position._M_node == _M_header) {// end()
969 if (!_M_key_compare(_KeyOfValue()(__v), _S_key(_M_rightmost())))
970 return _M_insert(0, _M_rightmost(), __v);
971 else
972 return insert_equal(__v);
973 } else {
974 iterator __before = __position;
975 --__before;
976 if (!_M_key_compare(_KeyOfValue()(__v), _S_key(__before._M_node))
977 && !_M_key_compare(_S_key(__position._M_node), _KeyOfValue()(__v))) {
978 if (_S_right(__before._M_node) == 0)
979 return _M_insert(0, __before._M_node, __v);
980 else
981 return _M_insert(__position._M_node, __position._M_node, __v);
982 // first argument just needs to be non-null
983 } else
984 return insert_equal(__v);
985 }
986 }
987
988 template <class _Key, class _Val, class _KoV, class _Cmp, class _Alloc>
989 template<class _II>
990 void _Rb_tree<_Key,_Val,_KoV,_Cmp,_Alloc>
991 ::insert_equal(_II __first, _II __last)
992 {
993 for ( ; __first != __last; ++__first)
994 insert_equal(*__first);
995 }
996
997 template <class _Key, class _Val, class _KoV, class _Cmp, class _Alloc>
998 template<class _II>
999 void _Rb_tree<_Key,_Val,_KoV,_Cmp,_Alloc>
1000 ::insert_unique(_II __first, _II __last) {
1001 for ( ; __first != __last; ++__first)
1002 insert_unique(*__first);
1003 }
1004
1005 template <class _Key, class _Value, class _KeyOfValue,
1006 class _Compare, class _Alloc>
1007 inline void _Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc>
1008 ::erase(iterator __position)
1009 {
1010 _Link_type __y =
1011 (_Link_type) _Rb_tree_rebalance_for_erase(__position._M_node,
1012 _M_header->_M_parent,
1013 _M_header->_M_left,
1014 _M_header->_M_right);
1015 destroy_node(__y);
1016 --_M_node_count;
1017 }
1018
1019 template <class _Key, class _Value, class _KeyOfValue,
1020 class _Compare, class _Alloc>
1021 typename _Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc>::size_type
1022 _Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc>::erase(const _Key& __x)
1023 {
1024 pair<iterator,iterator> __p = equal_range(__x);
1025 size_type __n = 0;
1026 distance(__p.first, __p.second, __n);
1027 erase(__p.first, __p.second);
1028 return __n;
1029 }
1030
1031 template <class _Key, class _Val, class _KoV, class _Compare, class _Alloc>
1032 typename _Rb_tree<_Key, _Val, _KoV, _Compare, _Alloc>::_Link_type
1033 _Rb_tree<_Key,_Val,_KoV,_Compare,_Alloc>
1034 ::_M_copy(_Link_type __x, _Link_type __p)
1035 {
1036 // structural copy. __x and __p must be non-null.
1037 _Link_type __top = _M_clone_node(__x);
1038 __top->_M_parent = __p;
1039
1040 try {
1041 if (__x->_M_right)
1042 __top->_M_right = _M_copy(_S_right(__x), __top);
1043 __p = __top;
1044 __x = _S_left(__x);
1045
1046 while (__x != 0) {
1047 _Link_type __y = _M_clone_node(__x);
1048 __p->_M_left = __y;
1049 __y->_M_parent = __p;
1050 if (__x->_M_right)
1051 __y->_M_right = _M_copy(_S_right(__x), __y);
1052 __p = __y;
1053 __x = _S_left(__x);
1054 }
1055 }
1056 catch(...)
1057 {
1058 _M_erase(__top);
1059 __throw_exception_again;
1060 }
1061 return __top;
1062 }
1063
1064 template <class _Key, class _Value, class _KeyOfValue,
1065 class _Compare, class _Alloc>
1066 void _Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc>
1067 ::_M_erase(_Link_type __x)
1068 {
1069 // erase without rebalancing
1070 while (__x != 0) {
1071 _M_erase(_S_right(__x));
1072 _Link_type __y = _S_left(__x);
1073 destroy_node(__x);
1074 __x = __y;
1075 }
1076 }
1077
1078 template <class _Key, class _Value, class _KeyOfValue,
1079 class _Compare, class _Alloc>
1080 void _Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc>
1081 ::erase(iterator __first, iterator __last)
1082 {
1083 if (__first == begin() && __last == end())
1084 clear();
1085 else
1086 while (__first != __last) erase(__first++);
1087 }
1088
1089 template <class _Key, class _Value, class _KeyOfValue,
1090 class _Compare, class _Alloc>
1091 void _Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc>
1092 ::erase(const _Key* __first, const _Key* __last)
1093 {
1094 while (__first != __last) erase(*__first++);
1095 }
1096
1097 template <class _Key, class _Value, class _KeyOfValue,
1098 class _Compare, class _Alloc>
1099 typename _Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc>::iterator
1100 _Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc>::find(const _Key& __k)
1101 {
1102 _Link_type __y = _M_header; // Last node which is not less than __k.
1103 _Link_type __x = _M_root(); // Current node.
1104
1105 while (__x != 0)
1106 if (!_M_key_compare(_S_key(__x), __k))
1107 __y = __x, __x = _S_left(__x);
1108 else
1109 __x = _S_right(__x);
1110
1111 iterator __j = iterator(__y);
1112 return (__j == end() || _M_key_compare(__k, _S_key(__j._M_node))) ?
1113 end() : __j;
1114 }
1115
1116 template <class _Key, class _Value, class _KeyOfValue,
1117 class _Compare, class _Alloc>
1118 typename _Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc>::const_iterator
1119 _Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc>::find(const _Key& __k) const
1120 {
1121 _Link_type __y = _M_header; /* Last node which is not less than __k. */
1122 _Link_type __x = _M_root(); /* Current node. */
1123
1124 while (__x != 0) {
1125 if (!_M_key_compare(_S_key(__x), __k))
1126 __y = __x, __x = _S_left(__x);
1127 else
1128 __x = _S_right(__x);
1129 }
1130 const_iterator __j = const_iterator(__y);
1131 return (__j == end() || _M_key_compare(__k, _S_key(__j._M_node))) ?
1132 end() : __j;
1133 }
1134
1135 template <class _Key, class _Value, class _KeyOfValue,
1136 class _Compare, class _Alloc>
1137 typename _Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc>::size_type
1138 _Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc>
1139 ::count(const _Key& __k) const
1140 {
1141 pair<const_iterator, const_iterator> __p = equal_range(__k);
1142 size_type __n = 0;
1143 distance(__p.first, __p.second, __n);
1144 return __n;
1145 }
1146
1147 template <class _Key, class _Value, class _KeyOfValue,
1148 class _Compare, class _Alloc>
1149 typename _Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc>::iterator
1150 _Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc>
1151 ::lower_bound(const _Key& __k)
1152 {
1153 _Link_type __y = _M_header; /* Last node which is not less than __k. */
1154 _Link_type __x = _M_root(); /* Current node. */
1155
1156 while (__x != 0)
1157 if (!_M_key_compare(_S_key(__x), __k))
1158 __y = __x, __x = _S_left(__x);
1159 else
1160 __x = _S_right(__x);
1161
1162 return iterator(__y);
1163 }
1164
1165 template <class _Key, class _Value, class _KeyOfValue,
1166 class _Compare, class _Alloc>
1167 typename _Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc>::const_iterator
1168 _Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc>
1169 ::lower_bound(const _Key& __k) const
1170 {
1171 _Link_type __y = _M_header; /* Last node which is not less than __k. */
1172 _Link_type __x = _M_root(); /* Current node. */
1173
1174 while (__x != 0)
1175 if (!_M_key_compare(_S_key(__x), __k))
1176 __y = __x, __x = _S_left(__x);
1177 else
1178 __x = _S_right(__x);
1179
1180 return const_iterator(__y);
1181 }
1182
1183 template <class _Key, class _Value, class _KeyOfValue,
1184 class _Compare, class _Alloc>
1185 typename _Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc>::iterator
1186 _Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc>
1187 ::upper_bound(const _Key& __k)
1188 {
1189 _Link_type __y = _M_header; /* Last node which is greater than __k. */
1190 _Link_type __x = _M_root(); /* Current node. */
1191
1192 while (__x != 0)
1193 if (_M_key_compare(__k, _S_key(__x)))
1194 __y = __x, __x = _S_left(__x);
1195 else
1196 __x = _S_right(__x);
1197
1198 return iterator(__y);
1199 }
1200
1201 template <class _Key, class _Value, class _KeyOfValue,
1202 class _Compare, class _Alloc>
1203 typename _Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc>::const_iterator
1204 _Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc>
1205 ::upper_bound(const _Key& __k) const
1206 {
1207 _Link_type __y = _M_header; /* Last node which is greater than __k. */
1208 _Link_type __x = _M_root(); /* Current node. */
1209
1210 while (__x != 0)
1211 if (_M_key_compare(__k, _S_key(__x)))
1212 __y = __x, __x = _S_left(__x);
1213 else
1214 __x = _S_right(__x);
1215
1216 return const_iterator(__y);
1217 }
1218
1219 template <class _Key, class _Value, class _KeyOfValue,
1220 class _Compare, class _Alloc>
1221 inline
1222 pair<typename _Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc>::iterator,
1223 typename _Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc>::iterator>
1224 _Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc>
1225 ::equal_range(const _Key& __k)
1226 {
1227 return pair<iterator, iterator>(lower_bound(__k), upper_bound(__k));
1228 }
1229
1230 template <class _Key, class _Value, class _KoV, class _Compare, class _Alloc>
1231 inline
1232 pair<typename _Rb_tree<_Key, _Value, _KoV, _Compare, _Alloc>::const_iterator,
1233 typename _Rb_tree<_Key, _Value, _KoV, _Compare, _Alloc>::const_iterator>
1234 _Rb_tree<_Key, _Value, _KoV, _Compare, _Alloc>
1235 ::equal_range(const _Key& __k) const
1236 {
1237 return pair<const_iterator,const_iterator>(lower_bound(__k),
1238 upper_bound(__k));
1239 }
1240
1241 inline int
1242 __black_count(_Rb_tree_node_base* __node, _Rb_tree_node_base* __root)
1243 {
1244 if (__node == 0)
1245 return 0;
1246 int __sum = 0;
1247 do {
1248 if (__node->_M_color == _S_rb_tree_black)
1249 ++__sum;
1250 if (__node == __root)
1251 break;
1252 __node = __node->_M_parent;
1253 } while (1);
1254 return __sum;
1255 }
1256
1257 template <class _Key, class _Value, class _KeyOfValue,
1258 class _Compare, class _Alloc>
1259 bool _Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc>::__rb_verify() const
1260 {
1261 if (_M_node_count == 0 || begin() == end())
1262 return _M_node_count == 0 && begin() == end() &&
1263 _M_header->_M_left == _M_header && _M_header->_M_right == _M_header;
1264
1265 int __len = __black_count(_M_leftmost(), _M_root());
1266 for (const_iterator __it = begin(); __it != end(); ++__it) {
1267 _Link_type __x = (_Link_type) __it._M_node;
1268 _Link_type __L = _S_left(__x);
1269 _Link_type __R = _S_right(__x);
1270
1271 if (__x->_M_color == _S_rb_tree_red)
1272 if ((__L && __L->_M_color == _S_rb_tree_red) ||
1273 (__R && __R->_M_color == _S_rb_tree_red))
1274 return false;
1275
1276 if (__L && _M_key_compare(_S_key(__x), _S_key(__L)))
1277 return false;
1278 if (__R && _M_key_compare(_S_key(__R), _S_key(__x)))
1279 return false;
1280
1281 if (!__L && !__R && __black_count(__x, _M_root()) != __len)
1282 return false;
1283 }
1284
1285 if (_M_leftmost() != _Rb_tree_node_base::_S_minimum(_M_root()))
1286 return false;
1287 if (_M_rightmost() != _Rb_tree_node_base::_S_maximum(_M_root()))
1288 return false;
1289
1290 return true;
1291 }
1292
1293 // Class rb_tree is not part of the C++ standard. It is provided for
1294 // compatibility with the HP STL.
1295
1296 template <class _Key, class _Value, class _KeyOfValue, class _Compare,
1297 class _Alloc = allocator<_Value> >
1298 struct rb_tree : public _Rb_tree<_Key, _Value, _KeyOfValue, _Compare, _Alloc>
1299 {
1300 typedef _Rb_tree<_Key, _Value, _KeyOfValue, _Compare, _Alloc> _Base;
1301 typedef typename _Base::allocator_type allocator_type;
1302
1303 rb_tree(const _Compare& __comp = _Compare(),
1304 const allocator_type& __a = allocator_type())
1305 : _Base(__comp, __a) {}
1306
1307 ~rb_tree() {}
1308 };
1309
1310 } // namespace std
1311
1312 #endif /* __GLIBCPP_INTERNAL_TREE_H */
1313
1314 // Local Variables:
1315 // mode:C++
1316 // End: