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