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