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