1//===----------------------------------------------------------------------===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is dual licensed under the MIT and the University of Illinois Open 6// Source Licenses. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9 10// Not a portable test 11 12// Returns __tree_next(__z) 13// template <class _NodePtr> 14// void 15// __tree_remove(_NodePtr __root, _NodePtr __z) 16 17#include <__tree> 18#include <cassert> 19 20struct Node 21{ 22 Node* __left_; 23 Node* __right_; 24 Node* __parent_; 25 bool __is_black_; 26 27 Node* __parent_unsafe() const { return __parent_; } 28 void __set_parent(Node* x) { __parent_ = x;} 29 30 Node() : __left_(), __right_(), __parent_(), __is_black_() {} 31}; 32 33void 34test1() 35{ 36 { 37 // Left 38 // Case 1 -> Case 2 -> x is red turned to black 39 Node root; 40 Node b; 41 Node c; 42 Node d; 43 Node e; 44 Node y; 45 46 root.__left_ = &b; 47 48 b.__parent_ = &root; 49 b.__left_ = &y; 50 b.__right_ = &d; 51 b.__is_black_ = true; 52 53 y.__parent_ = &b; 54 y.__left_ = 0; 55 y.__right_ = 0; 56 y.__is_black_ = true; 57 58 d.__parent_ = &b; 59 d.__left_ = &c; 60 d.__right_ = &e; 61 d.__is_black_ = false; 62 63 c.__parent_ = &d; 64 c.__left_ = 0; 65 c.__right_ = 0; 66 c.__is_black_ = true; 67 68 e.__parent_ = &d; 69 e.__left_ = 0; 70 e.__right_ = 0; 71 e.__is_black_ = true; 72 73 std::__tree_remove(root.__left_, &y); 74 assert(std::__tree_invariant(root.__left_)); 75 76 assert(root.__parent_ == 0); 77 assert(root.__left_ == &d); 78 assert(root.__right_ == 0); 79 assert(root.__is_black_ == false); 80 81 assert(d.__parent_ == &root); 82 assert(d.__left_ == &b); 83 assert(d.__right_ == &e); 84 assert(d.__is_black_ == true); 85 86 assert(b.__parent_ == &d); 87 assert(b.__left_ == 0); 88 assert(b.__right_ == &c); 89 assert(b.__is_black_ == true); 90 91 assert(c.__parent_ == &b); 92 assert(c.__left_ == 0); 93 assert(c.__right_ == 0); 94 assert(c.__is_black_ == false); 95 96 assert(e.__parent_ == &d); 97 assert(e.__left_ == 0); 98 assert(e.__right_ == 0); 99 assert(e.__is_black_ == true); 100 } 101 { 102 // Right 103 // Case 1 -> Case 2 -> x is red turned to black 104 Node root; 105 Node b; 106 Node c; 107 Node d; 108 Node e; 109 Node y; 110 111 root.__left_ = &b; 112 113 b.__parent_ = &root; 114 b.__right_ = &y; 115 b.__left_ = &d; 116 b.__is_black_ = true; 117 118 y.__parent_ = &b; 119 y.__right_ = 0; 120 y.__left_ = 0; 121 y.__is_black_ = true; 122 123 d.__parent_ = &b; 124 d.__right_ = &c; 125 d.__left_ = &e; 126 d.__is_black_ = false; 127 128 c.__parent_ = &d; 129 c.__right_ = 0; 130 c.__left_ = 0; 131 c.__is_black_ = true; 132 133 e.__parent_ = &d; 134 e.__right_ = 0; 135 e.__left_ = 0; 136 e.__is_black_ = true; 137 138 std::__tree_remove(root.__left_, &y); 139 assert(std::__tree_invariant(root.__left_)); 140 141 assert(root.__parent_ == 0); 142 assert(root.__left_ == &d); 143 assert(root.__right_ == 0); 144 assert(root.__is_black_ == false); 145 146 assert(d.__parent_ == &root); 147 assert(d.__right_ == &b); 148 assert(d.__left_ == &e); 149 assert(d.__is_black_ == true); 150 151 assert(b.__parent_ == &d); 152 assert(b.__right_ == 0); 153 assert(b.__left_ == &c); 154 assert(b.__is_black_ == true); 155 156 assert(c.__parent_ == &b); 157 assert(c.__right_ == 0); 158 assert(c.__left_ == 0); 159 assert(c.__is_black_ == false); 160 161 assert(e.__parent_ == &d); 162 assert(e.__right_ == 0); 163 assert(e.__left_ == 0); 164 assert(e.__is_black_ == true); 165 } 166 { 167 // Left 168 // Case 1 -> Case 3 -> Case 4 169 Node root; 170 Node b; 171 Node c; 172 Node d; 173 Node e; 174 Node f; 175 Node y; 176 177 root.__left_ = &b; 178 179 b.__parent_ = &root; 180 b.__left_ = &y; 181 b.__right_ = &d; 182 b.__is_black_ = true; 183 184 y.__parent_ = &b; 185 y.__left_ = 0; 186 y.__right_ = 0; 187 y.__is_black_ = true; 188 189 d.__parent_ = &b; 190 d.__left_ = &c; 191 d.__right_ = &e; 192 d.__is_black_ = false; 193 194 c.__parent_ = &d; 195 c.__left_ = &f; 196 c.__right_ = 0; 197 c.__is_black_ = true; 198 199 e.__parent_ = &d; 200 e.__left_ = 0; 201 e.__right_ = 0; 202 e.__is_black_ = true; 203 204 f.__parent_ = &c; 205 f.__left_ = 0; 206 f.__right_ = 0; 207 f.__is_black_ = false; 208 209 std::__tree_remove(root.__left_, &y); 210 assert(std::__tree_invariant(root.__left_)); 211 212 assert(root.__parent_ == 0); 213 assert(root.__left_ == &d); 214 assert(root.__right_ == 0); 215 assert(root.__is_black_ == false); 216 217 assert(d.__parent_ == &root); 218 assert(d.__left_ == &f); 219 assert(d.__right_ == &e); 220 assert(d.__is_black_ == true); 221 222 assert(f.__parent_ == &d); 223 assert(f.__left_ == &b); 224 assert(f.__right_ == &c); 225 assert(f.__is_black_ == false); 226 227 assert(b.__parent_ == &f); 228 assert(b.__left_ == 0); 229 assert(b.__right_ == 0); 230 assert(b.__is_black_ == true); 231 232 assert(c.__parent_ == &f); 233 assert(c.__left_ == 0); 234 assert(c.__right_ == 0); 235 assert(c.__is_black_ == true); 236 237 assert(e.__parent_ == &d); 238 assert(e.__left_ == 0); 239 assert(e.__right_ == 0); 240 assert(e.__is_black_ == true); 241 } 242 { 243 // Right 244 // Case 1 -> Case 3 -> Case 4 245 Node root; 246 Node b; 247 Node c; 248 Node d; 249 Node e; 250 Node f; 251 Node y; 252 253 root.__left_ = &b; 254 255 b.__parent_ = &root; 256 b.__right_ = &y; 257 b.__left_ = &d; 258 b.__is_black_ = true; 259 260 y.__parent_ = &b; 261 y.__right_ = 0; 262 y.__left_ = 0; 263 y.__is_black_ = true; 264 265 d.__parent_ = &b; 266 d.__right_ = &c; 267 d.__left_ = &e; 268 d.__is_black_ = false; 269 270 c.__parent_ = &d; 271 c.__right_ = &f; 272 c.__left_ = 0; 273 c.__is_black_ = true; 274 275 e.__parent_ = &d; 276 e.__right_ = 0; 277 e.__left_ = 0; 278 e.__is_black_ = true; 279 280 f.__parent_ = &c; 281 f.__right_ = 0; 282 f.__left_ = 0; 283 f.__is_black_ = false; 284 285 std::__tree_remove(root.__left_, &y); 286 assert(std::__tree_invariant(root.__left_)); 287 288 assert(root.__parent_ == 0); 289 assert(root.__left_ == &d); 290 assert(root.__right_ == 0); 291 assert(root.__is_black_ == false); 292 293 assert(d.__parent_ == &root); 294 assert(d.__right_ == &f); 295 assert(d.__left_ == &e); 296 assert(d.__is_black_ == true); 297 298 assert(f.__parent_ == &d); 299 assert(f.__right_ == &b); 300 assert(f.__left_ == &c); 301 assert(f.__is_black_ == false); 302 303 assert(b.__parent_ == &f); 304 assert(b.__right_ == 0); 305 assert(b.__left_ == 0); 306 assert(b.__is_black_ == true); 307 308 assert(c.__parent_ == &f); 309 assert(c.__right_ == 0); 310 assert(c.__left_ == 0); 311 assert(c.__is_black_ == true); 312 313 assert(e.__parent_ == &d); 314 assert(e.__right_ == 0); 315 assert(e.__left_ == 0); 316 assert(e.__is_black_ == true); 317 } 318} 319 320void 321test2() 322{ 323 { 324 Node root; 325 Node a; 326 Node b; 327 Node c; 328 329 root.__left_ = &b; 330 331 b.__parent_ = &root; 332 b.__left_ = &a; 333 b.__right_ = &c; 334 b.__is_black_ = true; 335 336 a.__parent_ = &b; 337 a.__left_ = 0; 338 a.__right_ = 0; 339 a.__is_black_ = true; 340 341 c.__parent_ = &b; 342 c.__left_ = 0; 343 c.__right_ = 0; 344 c.__is_black_ = true; 345 346 std::__tree_remove(root.__left_, &a); 347 348 assert(std::__tree_invariant(root.__left_)); 349 350 assert(root.__parent_ == 0); 351 assert(root.__left_ == &b); 352 assert(root.__right_ == 0); 353 assert(root.__is_black_ == false); 354 355 assert(b.__parent_ == &root); 356 assert(b.__left_ == 0); 357 assert(b.__right_ == &c); 358 assert(b.__is_black_ == true); 359 360 assert(c.__parent_ == &b); 361 assert(c.__left_ == 0); 362 assert(c.__right_ == 0); 363 assert(c.__is_black_ == false); 364 365 std::__tree_remove(root.__left_, &b); 366 367 assert(std::__tree_invariant(root.__left_)); 368 369 assert(root.__parent_ == 0); 370 assert(root.__left_ == &c); 371 assert(root.__right_ == 0); 372 assert(root.__is_black_ == false); 373 374 assert(c.__parent_ == &root); 375 assert(c.__left_ == 0); 376 assert(c.__right_ == 0); 377 assert(c.__is_black_ == true); 378 379 std::__tree_remove(root.__left_, &c); 380 381 assert(std::__tree_invariant(root.__left_)); 382 383 assert(root.__parent_ == 0); 384 assert(root.__left_ == 0); 385 assert(root.__right_ == 0); 386 assert(root.__is_black_ == false); 387 } 388 { 389 Node root; 390 Node a; 391 Node b; 392 Node c; 393 394 root.__left_ = &b; 395 396 b.__parent_ = &root; 397 b.__left_ = &a; 398 b.__right_ = &c; 399 b.__is_black_ = true; 400 401 a.__parent_ = &b; 402 a.__left_ = 0; 403 a.__right_ = 0; 404 a.__is_black_ = false; 405 406 c.__parent_ = &b; 407 c.__left_ = 0; 408 c.__right_ = 0; 409 c.__is_black_ = false; 410 411 std::__tree_remove(root.__left_, &a); 412 413 assert(std::__tree_invariant(root.__left_)); 414 415 assert(root.__parent_ == 0); 416 assert(root.__left_ == &b); 417 assert(root.__right_ == 0); 418 assert(root.__is_black_ == false); 419 420 assert(b.__parent_ == &root); 421 assert(b.__left_ == 0); 422 assert(b.__right_ == &c); 423 assert(b.__is_black_ == true); 424 425 assert(c.__parent_ == &b); 426 assert(c.__left_ == 0); 427 assert(c.__right_ == 0); 428 assert(c.__is_black_ == false); 429 430 std::__tree_remove(root.__left_, &b); 431 432 assert(std::__tree_invariant(root.__left_)); 433 434 assert(root.__parent_ == 0); 435 assert(root.__left_ == &c); 436 assert(root.__right_ == 0); 437 assert(root.__is_black_ == false); 438 439 assert(c.__parent_ == &root); 440 assert(c.__left_ == 0); 441 assert(c.__right_ == 0); 442 assert(c.__is_black_ == true); 443 444 std::__tree_remove(root.__left_, &c); 445 446 assert(std::__tree_invariant(root.__left_)); 447 448 assert(root.__parent_ == 0); 449 assert(root.__left_ == 0); 450 assert(root.__right_ == 0); 451 assert(root.__is_black_ == false); 452 } 453 { 454 Node root; 455 Node a; 456 Node b; 457 Node c; 458 459 root.__left_ = &b; 460 461 b.__parent_ = &root; 462 b.__left_ = &a; 463 b.__right_ = &c; 464 b.__is_black_ = true; 465 466 a.__parent_ = &b; 467 a.__left_ = 0; 468 a.__right_ = 0; 469 a.__is_black_ = true; 470 471 c.__parent_ = &b; 472 c.__left_ = 0; 473 c.__right_ = 0; 474 c.__is_black_ = true; 475 476 std::__tree_remove(root.__left_, &a); 477 478 assert(std::__tree_invariant(root.__left_)); 479 480 assert(root.__parent_ == 0); 481 assert(root.__left_ == &b); 482 assert(root.__right_ == 0); 483 assert(root.__is_black_ == false); 484 485 assert(b.__parent_ == &root); 486 assert(b.__left_ == 0); 487 assert(b.__right_ == &c); 488 assert(b.__is_black_ == true); 489 490 assert(c.__parent_ == &b); 491 assert(c.__left_ == 0); 492 assert(c.__right_ == 0); 493 assert(c.__is_black_ == false); 494 495 std::__tree_remove(root.__left_, &c); 496 497 assert(std::__tree_invariant(root.__left_)); 498 499 assert(root.__parent_ == 0); 500 assert(root.__left_ == &b); 501 assert(root.__right_ == 0); 502 assert(root.__is_black_ == false); 503 504 assert(b.__parent_ == &root); 505 assert(b.__left_ == 0); 506 assert(b.__right_ == 0); 507 assert(b.__is_black_ == true); 508 509 std::__tree_remove(root.__left_, &b); 510 511 assert(std::__tree_invariant(root.__left_)); 512 513 assert(root.__parent_ == 0); 514 assert(root.__left_ == 0); 515 assert(root.__right_ == 0); 516 assert(root.__is_black_ == false); 517 } 518 { 519 Node root; 520 Node a; 521 Node b; 522 Node c; 523 524 root.__left_ = &b; 525 526 b.__parent_ = &root; 527 b.__left_ = &a; 528 b.__right_ = &c; 529 b.__is_black_ = true; 530 531 a.__parent_ = &b; 532 a.__left_ = 0; 533 a.__right_ = 0; 534 a.__is_black_ = false; 535 536 c.__parent_ = &b; 537 c.__left_ = 0; 538 c.__right_ = 0; 539 c.__is_black_ = false; 540 541 std::__tree_remove(root.__left_, &a); 542 543 assert(std::__tree_invariant(root.__left_)); 544 545 assert(root.__parent_ == 0); 546 assert(root.__left_ == &b); 547 assert(root.__right_ == 0); 548 assert(root.__is_black_ == false); 549 550 assert(b.__parent_ == &root); 551 assert(b.__left_ == 0); 552 assert(b.__right_ == &c); 553 assert(b.__is_black_ == true); 554 555 assert(c.__parent_ == &b); 556 assert(c.__left_ == 0); 557 assert(c.__right_ == 0); 558 assert(c.__is_black_ == false); 559 560 std::__tree_remove(root.__left_, &c); 561 562 assert(std::__tree_invariant(root.__left_)); 563 564 assert(root.__parent_ == 0); 565 assert(root.__left_ == &b); 566 assert(root.__right_ == 0); 567 assert(root.__is_black_ == false); 568 569 assert(b.__parent_ == &root); 570 assert(b.__left_ == 0); 571 assert(b.__right_ == 0); 572 assert(b.__is_black_ == true); 573 574 std::__tree_remove(root.__left_, &b); 575 576 assert(std::__tree_invariant(root.__left_)); 577 578 assert(root.__parent_ == 0); 579 assert(root.__left_ == 0); 580 assert(root.__right_ == 0); 581 assert(root.__is_black_ == false); 582 } 583 { 584 Node root; 585 Node a; 586 Node b; 587 Node c; 588 589 root.__left_ = &b; 590 591 b.__parent_ = &root; 592 b.__left_ = &a; 593 b.__right_ = &c; 594 b.__is_black_ = true; 595 596 a.__parent_ = &b; 597 a.__left_ = 0; 598 a.__right_ = 0; 599 a.__is_black_ = true; 600 601 c.__parent_ = &b; 602 c.__left_ = 0; 603 c.__right_ = 0; 604 c.__is_black_ = true; 605 606 std::__tree_remove(root.__left_, &b); 607 608 assert(std::__tree_invariant(root.__left_)); 609 610 assert(root.__parent_ == 0); 611 assert(root.__left_ == &c); 612 assert(root.__right_ == 0); 613 assert(root.__is_black_ == false); 614 615 assert(a.__parent_ == &c); 616 assert(a.__left_ == 0); 617 assert(a.__right_ == 0); 618 assert(a.__is_black_ == false); 619 620 assert(c.__parent_ == &root); 621 assert(c.__left_ == &a); 622 assert(c.__right_ == 0); 623 assert(c.__is_black_ == true); 624 625 std::__tree_remove(root.__left_, &a); 626 627 assert(std::__tree_invariant(root.__left_)); 628 629 assert(root.__parent_ == 0); 630 assert(root.__left_ == &c); 631 assert(root.__right_ == 0); 632 assert(root.__is_black_ == false); 633 634 assert(c.__parent_ == &root); 635 assert(c.__left_ == 0); 636 assert(c.__right_ == 0); 637 assert(c.__is_black_ == true); 638 639 std::__tree_remove(root.__left_, &c); 640 641 assert(std::__tree_invariant(root.__left_)); 642 643 assert(root.__parent_ == 0); 644 assert(root.__left_ == 0); 645 assert(root.__right_ == 0); 646 assert(root.__is_black_ == false); 647 } 648 { 649 Node root; 650 Node a; 651 Node b; 652 Node c; 653 654 root.__left_ = &b; 655 656 b.__parent_ = &root; 657 b.__left_ = &a; 658 b.__right_ = &c; 659 b.__is_black_ = true; 660 661 a.__parent_ = &b; 662 a.__left_ = 0; 663 a.__right_ = 0; 664 a.__is_black_ = false; 665 666 c.__parent_ = &b; 667 c.__left_ = 0; 668 c.__right_ = 0; 669 c.__is_black_ = false; 670 671 std::__tree_remove(root.__left_, &b); 672 673 assert(std::__tree_invariant(root.__left_)); 674 675 assert(root.__parent_ == 0); 676 assert(root.__left_ == &c); 677 assert(root.__right_ == 0); 678 assert(root.__is_black_ == false); 679 680 assert(a.__parent_ == &c); 681 assert(a.__left_ == 0); 682 assert(a.__right_ == 0); 683 assert(a.__is_black_ == false); 684 685 assert(c.__parent_ == &root); 686 assert(c.__left_ == &a); 687 assert(c.__right_ == 0); 688 assert(c.__is_black_ == true); 689 690 std::__tree_remove(root.__left_, &a); 691 692 assert(std::__tree_invariant(root.__left_)); 693 694 assert(root.__parent_ == 0); 695 assert(root.__left_ == &c); 696 assert(root.__right_ == 0); 697 assert(root.__is_black_ == false); 698 699 assert(c.__parent_ == &root); 700 assert(c.__left_ == 0); 701 assert(c.__right_ == 0); 702 assert(c.__is_black_ == true); 703 704 std::__tree_remove(root.__left_, &c); 705 706 assert(std::__tree_invariant(root.__left_)); 707 708 assert(root.__parent_ == 0); 709 assert(root.__left_ == 0); 710 assert(root.__right_ == 0); 711 assert(root.__is_black_ == false); 712 } 713 { 714 Node root; 715 Node a; 716 Node b; 717 Node c; 718 719 root.__left_ = &b; 720 721 b.__parent_ = &root; 722 b.__left_ = &a; 723 b.__right_ = &c; 724 b.__is_black_ = true; 725 726 a.__parent_ = &b; 727 a.__left_ = 0; 728 a.__right_ = 0; 729 a.__is_black_ = true; 730 731 c.__parent_ = &b; 732 c.__left_ = 0; 733 c.__right_ = 0; 734 c.__is_black_ = true; 735 736 std::__tree_remove(root.__left_, &b); 737 738 assert(std::__tree_invariant(root.__left_)); 739 740 assert(root.__parent_ == 0); 741 assert(root.__left_ == &c); 742 assert(root.__right_ == 0); 743 assert(root.__is_black_ == false); 744 745 assert(a.__parent_ == &c); 746 assert(a.__left_ == 0); 747 assert(a.__right_ == 0); 748 assert(a.__is_black_ == false); 749 750 assert(c.__parent_ == &root); 751 assert(c.__left_ == &a); 752 assert(c.__right_ == 0); 753 assert(c.__is_black_ == true); 754 755 std::__tree_remove(root.__left_, &c); 756 757 assert(std::__tree_invariant(root.__left_)); 758 759 assert(root.__parent_ == 0); 760 assert(root.__left_ == &a); 761 assert(root.__right_ == 0); 762 assert(root.__is_black_ == false); 763 764 assert(a.__parent_ == &root); 765 assert(a.__left_ == 0); 766 assert(a.__right_ == 0); 767 assert(a.__is_black_ == true); 768 769 std::__tree_remove(root.__left_, &a); 770 771 assert(std::__tree_invariant(root.__left_)); 772 773 assert(root.__parent_ == 0); 774 assert(root.__left_ == 0); 775 assert(root.__right_ == 0); 776 assert(root.__is_black_ == false); 777 } 778 { 779 Node root; 780 Node a; 781 Node b; 782 Node c; 783 784 root.__left_ = &b; 785 786 b.__parent_ = &root; 787 b.__left_ = &a; 788 b.__right_ = &c; 789 b.__is_black_ = true; 790 791 a.__parent_ = &b; 792 a.__left_ = 0; 793 a.__right_ = 0; 794 a.__is_black_ = false; 795 796 c.__parent_ = &b; 797 c.__left_ = 0; 798 c.__right_ = 0; 799 c.__is_black_ = false; 800 801 std::__tree_remove(root.__left_, &b); 802 803 assert(std::__tree_invariant(root.__left_)); 804 805 assert(root.__parent_ == 0); 806 assert(root.__left_ == &c); 807 assert(root.__right_ == 0); 808 assert(root.__is_black_ == false); 809 810 assert(a.__parent_ == &c); 811 assert(a.__left_ == 0); 812 assert(a.__right_ == 0); 813 assert(a.__is_black_ == false); 814 815 assert(c.__parent_ == &root); 816 assert(c.__left_ == &a); 817 assert(c.__right_ == 0); 818 assert(c.__is_black_ == true); 819 820 std::__tree_remove(root.__left_, &c); 821 822 assert(std::__tree_invariant(root.__left_)); 823 824 assert(root.__parent_ == 0); 825 assert(root.__left_ == &a); 826 assert(root.__right_ == 0); 827 assert(root.__is_black_ == false); 828 829 assert(a.__parent_ == &root); 830 assert(a.__left_ == 0); 831 assert(a.__right_ == 0); 832 assert(a.__is_black_ == true); 833 834 std::__tree_remove(root.__left_, &a); 835 836 assert(std::__tree_invariant(root.__left_)); 837 838 assert(root.__parent_ == 0); 839 assert(root.__left_ == 0); 840 assert(root.__right_ == 0); 841 assert(root.__is_black_ == false); 842 } 843 { 844 Node root; 845 Node a; 846 Node b; 847 Node c; 848 849 root.__left_ = &b; 850 851 b.__parent_ = &root; 852 b.__left_ = &a; 853 b.__right_ = &c; 854 b.__is_black_ = true; 855 856 a.__parent_ = &b; 857 a.__left_ = 0; 858 a.__right_ = 0; 859 a.__is_black_ = true; 860 861 c.__parent_ = &b; 862 c.__left_ = 0; 863 c.__right_ = 0; 864 c.__is_black_ = true; 865 866 std::__tree_remove(root.__left_, &c); 867 868 assert(std::__tree_invariant(root.__left_)); 869 870 assert(root.__parent_ == 0); 871 assert(root.__left_ == &b); 872 assert(root.__right_ == 0); 873 assert(root.__is_black_ == false); 874 875 assert(a.__parent_ == &b); 876 assert(a.__left_ == 0); 877 assert(a.__right_ == 0); 878 assert(a.__is_black_ == false); 879 880 assert(b.__parent_ == &root); 881 assert(b.__left_ == &a); 882 assert(b.__right_ == 0); 883 assert(b.__is_black_ == true); 884 885 std::__tree_remove(root.__left_, &b); 886 887 assert(std::__tree_invariant(root.__left_)); 888 889 assert(root.__parent_ == 0); 890 assert(root.__left_ == &a); 891 assert(root.__right_ == 0); 892 assert(root.__is_black_ == false); 893 894 assert(a.__parent_ == &root); 895 assert(a.__left_ == 0); 896 assert(a.__right_ == 0); 897 assert(a.__is_black_ == true); 898 899 std::__tree_remove(root.__left_, &a); 900 901 assert(std::__tree_invariant(root.__left_)); 902 903 assert(root.__parent_ == 0); 904 assert(root.__left_ == 0); 905 assert(root.__right_ == 0); 906 assert(root.__is_black_ == false); 907 } 908 { 909 Node root; 910 Node a; 911 Node b; 912 Node c; 913 914 root.__left_ = &b; 915 916 b.__parent_ = &root; 917 b.__left_ = &a; 918 b.__right_ = &c; 919 b.__is_black_ = true; 920 921 a.__parent_ = &b; 922 a.__left_ = 0; 923 a.__right_ = 0; 924 a.__is_black_ = false; 925 926 c.__parent_ = &b; 927 c.__left_ = 0; 928 c.__right_ = 0; 929 c.__is_black_ = false; 930 931 std::__tree_remove(root.__left_, &c); 932 933 assert(std::__tree_invariant(root.__left_)); 934 935 assert(root.__parent_ == 0); 936 assert(root.__left_ == &b); 937 assert(root.__right_ == 0); 938 assert(root.__is_black_ == false); 939 940 assert(a.__parent_ == &b); 941 assert(a.__left_ == 0); 942 assert(a.__right_ == 0); 943 assert(a.__is_black_ == false); 944 945 assert(b.__parent_ == &root); 946 assert(b.__left_ == &a); 947 assert(b.__right_ == 0); 948 assert(b.__is_black_ == true); 949 950 std::__tree_remove(root.__left_, &b); 951 952 assert(std::__tree_invariant(root.__left_)); 953 954 assert(root.__parent_ == 0); 955 assert(root.__left_ == &a); 956 assert(root.__right_ == 0); 957 assert(root.__is_black_ == false); 958 959 assert(a.__parent_ == &root); 960 assert(a.__left_ == 0); 961 assert(a.__right_ == 0); 962 assert(a.__is_black_ == true); 963 964 std::__tree_remove(root.__left_, &a); 965 966 assert(std::__tree_invariant(root.__left_)); 967 968 assert(root.__parent_ == 0); 969 assert(root.__left_ == 0); 970 assert(root.__right_ == 0); 971 assert(root.__is_black_ == false); 972 } 973 { 974 Node root; 975 Node a; 976 Node b; 977 Node c; 978 979 root.__left_ = &b; 980 981 b.__parent_ = &root; 982 b.__left_ = &a; 983 b.__right_ = &c; 984 b.__is_black_ = true; 985 986 a.__parent_ = &b; 987 a.__left_ = 0; 988 a.__right_ = 0; 989 a.__is_black_ = true; 990 991 c.__parent_ = &b; 992 c.__left_ = 0; 993 c.__right_ = 0; 994 c.__is_black_ = true; 995 996 std::__tree_remove(root.__left_, &c); 997 998 assert(std::__tree_invariant(root.__left_)); 999 1000 assert(root.__parent_ == 0); 1001 assert(root.__left_ == &b); 1002 assert(root.__right_ == 0); 1003 assert(root.__is_black_ == false); 1004 1005 assert(a.__parent_ == &b); 1006 assert(a.__left_ == 0); 1007 assert(a.__right_ == 0); 1008 assert(a.__is_black_ == false); 1009 1010 assert(b.__parent_ == &root); 1011 assert(b.__left_ == &a); 1012 assert(b.__right_ == 0); 1013 assert(b.__is_black_ == true); 1014 1015 std::__tree_remove(root.__left_, &a); 1016 1017 assert(std::__tree_invariant(root.__left_)); 1018 1019 assert(root.__parent_ == 0); 1020 assert(root.__left_ == &b); 1021 assert(root.__right_ == 0); 1022 assert(root.__is_black_ == false); 1023 1024 assert(b.__parent_ == &root); 1025 assert(b.__left_ == 0); 1026 assert(b.__right_ == 0); 1027 assert(b.__is_black_ == true); 1028 1029 std::__tree_remove(root.__left_, &b); 1030 1031 assert(std::__tree_invariant(root.__left_)); 1032 1033 assert(root.__parent_ == 0); 1034 assert(root.__left_ == 0); 1035 assert(root.__right_ == 0); 1036 assert(root.__is_black_ == false); 1037 } 1038 { 1039 Node root; 1040 Node a; 1041 Node b; 1042 Node c; 1043 1044 root.__left_ = &b; 1045 1046 b.__parent_ = &root; 1047 b.__left_ = &a; 1048 b.__right_ = &c; 1049 b.__is_black_ = true; 1050 1051 a.__parent_ = &b; 1052 a.__left_ = 0; 1053 a.__right_ = 0; 1054 a.__is_black_ = false; 1055 1056 c.__parent_ = &b; 1057 c.__left_ = 0; 1058 c.__right_ = 0; 1059 c.__is_black_ = false; 1060 1061 std::__tree_remove(root.__left_, &c); 1062 1063 assert(std::__tree_invariant(root.__left_)); 1064 1065 assert(root.__parent_ == 0); 1066 assert(root.__left_ == &b); 1067 assert(root.__right_ == 0); 1068 assert(root.__is_black_ == false); 1069 1070 assert(a.__parent_ == &b); 1071 assert(a.__left_ == 0); 1072 assert(a.__right_ == 0); 1073 assert(a.__is_black_ == false); 1074 1075 assert(b.__parent_ == &root); 1076 assert(b.__left_ == &a); 1077 assert(b.__right_ == 0); 1078 assert(b.__is_black_ == true); 1079 1080 std::__tree_remove(root.__left_, &a); 1081 1082 assert(std::__tree_invariant(root.__left_)); 1083 1084 assert(root.__parent_ == 0); 1085 assert(root.__left_ == &b); 1086 assert(root.__right_ == 0); 1087 assert(root.__is_black_ == false); 1088 1089 assert(b.__parent_ == &root); 1090 assert(b.__left_ == 0); 1091 assert(b.__right_ == 0); 1092 assert(b.__is_black_ == true); 1093 1094 std::__tree_remove(root.__left_, &b); 1095 1096 assert(std::__tree_invariant(root.__left_)); 1097 1098 assert(root.__parent_ == 0); 1099 assert(root.__left_ == 0); 1100 assert(root.__right_ == 0); 1101 assert(root.__is_black_ == false); 1102 } 1103} 1104 1105void 1106test3() 1107{ 1108 Node root; 1109 Node a; 1110 Node b; 1111 Node c; 1112 Node d; 1113 Node e; 1114 Node f; 1115 Node g; 1116 Node h; 1117 1118 root.__left_ = &e; 1119 1120 e.__parent_ = &root; 1121 e.__left_ = &c; 1122 e.__right_ = &g; 1123 e.__is_black_ = true; 1124 1125 c.__parent_ = &e; 1126 c.__left_ = &b; 1127 c.__right_ = &d; 1128 c.__is_black_ = false; 1129 1130 g.__parent_ = &e; 1131 g.__left_ = &f; 1132 g.__right_ = &h; 1133 g.__is_black_ = false; 1134 1135 b.__parent_ = &c; 1136 b.__left_ = &a; 1137 b.__right_ = 0; 1138 b.__is_black_ = true; 1139 1140 d.__parent_ = &c; 1141 d.__left_ = 0; 1142 d.__right_ = 0; 1143 d.__is_black_ = true; 1144 1145 f.__parent_ = &g; 1146 f.__left_ = 0; 1147 f.__right_ = 0; 1148 f.__is_black_ = true; 1149 1150 h.__parent_ = &g; 1151 h.__left_ = 0; 1152 h.__right_ = 0; 1153 h.__is_black_ = true; 1154 1155 a.__parent_ = &b; 1156 a.__left_ = 0; 1157 a.__right_ = 0; 1158 a.__is_black_ = false; 1159 1160 assert(std::__tree_invariant(root.__left_)); 1161 1162 std::__tree_remove(root.__left_, &h); 1163 1164 assert(std::__tree_invariant(root.__left_)); 1165 1166 assert(root.__parent_ == 0); 1167 assert(root.__left_ == &e); 1168 assert(root.__right_ == 0); 1169 assert(root.__is_black_ == false); 1170 1171 assert(e.__parent_ == &root); 1172 assert(e.__left_ == &c); 1173 assert(e.__right_ == &g); 1174 assert(e.__is_black_ == true); 1175 1176 assert(c.__parent_ == &e); 1177 assert(c.__left_ == &b); 1178 assert(c.__right_ == &d); 1179 assert(c.__is_black_ == false); 1180 1181 assert(g.__parent_ == &e); 1182 assert(g.__left_ == &f); 1183 assert(g.__right_ == 0); 1184 assert(g.__is_black_ == true); 1185 1186 assert(b.__parent_ == &c); 1187 assert(b.__left_ == &a); 1188 assert(b.__right_ == 0); 1189 assert(b.__is_black_ == true); 1190 1191 assert(a.__parent_ == &b); 1192 assert(a.__left_ == 0); 1193 assert(a.__right_ == 0); 1194 assert(a.__is_black_ == false); 1195 1196 assert(d.__parent_ == &c); 1197 assert(d.__left_ == 0); 1198 assert(d.__right_ == 0); 1199 assert(d.__is_black_ == true); 1200 1201 assert(f.__parent_ == &g); 1202 assert(f.__left_ == 0); 1203 assert(f.__right_ == 0); 1204 assert(f.__is_black_ == false); 1205 1206 std::__tree_remove(root.__left_, &g); 1207 1208 assert(std::__tree_invariant(root.__left_)); 1209 1210 assert(root.__parent_ == 0); 1211 assert(root.__left_ == &e); 1212 assert(root.__right_ == 0); 1213 assert(root.__is_black_ == false); 1214 1215 assert(e.__parent_ == &root); 1216 assert(e.__left_ == &c); 1217 assert(e.__right_ == &f); 1218 assert(e.__is_black_ == true); 1219 1220 assert(c.__parent_ == &e); 1221 assert(c.__left_ == &b); 1222 assert(c.__right_ == &d); 1223 assert(c.__is_black_ == false); 1224 1225 assert(b.__parent_ == &c); 1226 assert(b.__left_ == &a); 1227 assert(b.__right_ == 0); 1228 assert(b.__is_black_ == true); 1229 1230 assert(a.__parent_ == &b); 1231 assert(a.__left_ == 0); 1232 assert(a.__right_ == 0); 1233 assert(a.__is_black_ == false); 1234 1235 assert(d.__parent_ == &c); 1236 assert(d.__left_ == 0); 1237 assert(d.__right_ == 0); 1238 assert(d.__is_black_ == true); 1239 1240 assert(f.__parent_ == &e); 1241 assert(f.__left_ == 0); 1242 assert(f.__right_ == 0); 1243 assert(f.__is_black_ == true); 1244 1245 std::__tree_remove(root.__left_, &f); 1246 1247 assert(std::__tree_invariant(root.__left_)); 1248 1249 assert(root.__parent_ == 0); 1250 assert(root.__left_ == &c); 1251 assert(root.__right_ == 0); 1252 assert(root.__is_black_ == false); 1253 1254 assert(c.__parent_ == &root); 1255 assert(c.__left_ == &b); 1256 assert(c.__right_ == &e); 1257 assert(c.__is_black_ == true); 1258 1259 assert(b.__parent_ == &c); 1260 assert(b.__left_ == &a); 1261 assert(b.__right_ == 0); 1262 assert(b.__is_black_ == true); 1263 1264 assert(e.__parent_ == &c); 1265 assert(e.__left_ == &d); 1266 assert(e.__right_ == 0); 1267 assert(e.__is_black_ == true); 1268 1269 assert(a.__parent_ == &b); 1270 assert(a.__left_ == 0); 1271 assert(a.__right_ == 0); 1272 assert(a.__is_black_ == false); 1273 1274 assert(d.__parent_ == &e); 1275 assert(d.__left_ == 0); 1276 assert(d.__right_ == 0); 1277 assert(d.__is_black_ == false); 1278 1279 std::__tree_remove(root.__left_, &e); 1280 1281 assert(std::__tree_invariant(root.__left_)); 1282 1283 assert(root.__parent_ == 0); 1284 assert(root.__left_ == &c); 1285 assert(root.__right_ == 0); 1286 assert(root.__is_black_ == false); 1287 1288 assert(c.__parent_ == &root); 1289 assert(c.__left_ == &b); 1290 assert(c.__right_ == &d); 1291 assert(c.__is_black_ == true); 1292 1293 assert(b.__parent_ == &c); 1294 assert(b.__left_ == &a); 1295 assert(b.__right_ == 0); 1296 assert(b.__is_black_ == true); 1297 1298 assert(a.__parent_ == &b); 1299 assert(a.__left_ == 0); 1300 assert(a.__right_ == 0); 1301 assert(a.__is_black_ == false); 1302 1303 assert(d.__parent_ == &c); 1304 assert(d.__left_ == 0); 1305 assert(d.__right_ == 0); 1306 assert(d.__is_black_ == true); 1307 1308 std::__tree_remove(root.__left_, &d); 1309 1310 assert(std::__tree_invariant(root.__left_)); 1311 1312 assert(root.__parent_ == 0); 1313 assert(root.__left_ == &b); 1314 assert(root.__right_ == 0); 1315 assert(root.__is_black_ == false); 1316 1317 assert(b.__parent_ == &root); 1318 assert(b.__left_ == &a); 1319 assert(b.__right_ == &c); 1320 assert(b.__is_black_ == true); 1321 1322 assert(a.__parent_ == &b); 1323 assert(a.__left_ == 0); 1324 assert(a.__right_ == 0); 1325 assert(a.__is_black_ == true); 1326 1327 assert(c.__parent_ == &b); 1328 assert(c.__left_ == 0); 1329 assert(c.__right_ == 0); 1330 assert(c.__is_black_ == true); 1331 1332 std::__tree_remove(root.__left_, &c); 1333 1334 assert(std::__tree_invariant(root.__left_)); 1335 1336 assert(root.__parent_ == 0); 1337 assert(root.__left_ == &b); 1338 assert(root.__right_ == 0); 1339 assert(root.__is_black_ == false); 1340 1341 assert(b.__parent_ == &root); 1342 assert(b.__left_ == &a); 1343 assert(b.__right_ == 0); 1344 assert(b.__is_black_ == true); 1345 1346 assert(a.__parent_ == &b); 1347 assert(a.__left_ == 0); 1348 assert(a.__right_ == 0); 1349 assert(a.__is_black_ == false); 1350 1351 std::__tree_remove(root.__left_, &b); 1352 1353 assert(std::__tree_invariant(root.__left_)); 1354 1355 assert(root.__parent_ == 0); 1356 assert(root.__left_ == &a); 1357 assert(root.__right_ == 0); 1358 assert(root.__is_black_ == false); 1359 1360 assert(a.__parent_ == &root); 1361 assert(a.__left_ == 0); 1362 assert(a.__right_ == 0); 1363 assert(a.__is_black_ == true); 1364 1365 std::__tree_remove(root.__left_, &a); 1366 1367 assert(std::__tree_invariant(root.__left_)); 1368 1369 assert(root.__parent_ == 0); 1370 assert(root.__left_ == 0); 1371 assert(root.__right_ == 0); 1372 assert(root.__is_black_ == false); 1373} 1374 1375void 1376test4() 1377{ 1378 Node root; 1379 Node a; 1380 Node b; 1381 Node c; 1382 Node d; 1383 Node e; 1384 Node f; 1385 Node g; 1386 Node h; 1387 1388 root.__left_ = &d; 1389 1390 d.__parent_ = &root; 1391 d.__left_ = &b; 1392 d.__right_ = &f; 1393 d.__is_black_ = true; 1394 1395 b.__parent_ = &d; 1396 b.__left_ = &a; 1397 b.__right_ = &c; 1398 b.__is_black_ = false; 1399 1400 f.__parent_ = &d; 1401 f.__left_ = &e; 1402 f.__right_ = &g; 1403 f.__is_black_ = false; 1404 1405 a.__parent_ = &b; 1406 a.__left_ = 0; 1407 a.__right_ = 0; 1408 a.__is_black_ = true; 1409 1410 c.__parent_ = &b; 1411 c.__left_ = 0; 1412 c.__right_ = 0; 1413 c.__is_black_ = true; 1414 1415 e.__parent_ = &f; 1416 e.__left_ = 0; 1417 e.__right_ = 0; 1418 e.__is_black_ = true; 1419 1420 g.__parent_ = &f; 1421 g.__left_ = 0; 1422 g.__right_ = &h; 1423 g.__is_black_ = true; 1424 1425 h.__parent_ = &g; 1426 h.__left_ = 0; 1427 h.__right_ = 0; 1428 h.__is_black_ = false; 1429 1430 assert(std::__tree_invariant(root.__left_)); 1431 1432 std::__tree_remove(root.__left_, &a); 1433 1434 assert(std::__tree_invariant(root.__left_)); 1435 1436 assert(root.__parent_ == 0); 1437 assert(root.__left_ == &d); 1438 assert(root.__right_ == 0); 1439 assert(root.__is_black_ == false); 1440 1441 assert(d.__parent_ == &root); 1442 assert(d.__left_ == &b); 1443 assert(d.__right_ == &f); 1444 assert(d.__is_black_ == true); 1445 1446 assert(b.__parent_ == &d); 1447 assert(b.__left_ == 0); 1448 assert(b.__right_ == &c); 1449 assert(b.__is_black_ == true); 1450 1451 assert(f.__parent_ == &d); 1452 assert(f.__left_ == &e); 1453 assert(f.__right_ == &g); 1454 assert(f.__is_black_ == false); 1455 1456 assert(c.__parent_ == &b); 1457 assert(c.__left_ == 0); 1458 assert(c.__right_ == 0); 1459 assert(c.__is_black_ == false); 1460 1461 assert(e.__parent_ == &f); 1462 assert(e.__left_ == 0); 1463 assert(e.__right_ == 0); 1464 assert(e.__is_black_ == true); 1465 1466 assert(g.__parent_ == &f); 1467 assert(g.__left_ == 0); 1468 assert(g.__right_ == &h); 1469 assert(g.__is_black_ == true); 1470 1471 assert(h.__parent_ == &g); 1472 assert(h.__left_ == 0); 1473 assert(h.__right_ == 0); 1474 assert(h.__is_black_ == false); 1475 1476 std::__tree_remove(root.__left_, &b); 1477 1478 assert(std::__tree_invariant(root.__left_)); 1479 1480 assert(root.__parent_ == 0); 1481 assert(root.__left_ == &d); 1482 assert(root.__right_ == 0); 1483 assert(root.__is_black_ == false); 1484 1485 assert(d.__parent_ == &root); 1486 assert(d.__left_ == &c); 1487 assert(d.__right_ == &f); 1488 assert(d.__is_black_ == true); 1489 1490 assert(c.__parent_ == &d); 1491 assert(c.__left_ == 0); 1492 assert(c.__right_ == 0); 1493 assert(c.__is_black_ == true); 1494 1495 assert(f.__parent_ == &d); 1496 assert(f.__left_ == &e); 1497 assert(f.__right_ == &g); 1498 assert(f.__is_black_ == false); 1499 1500 assert(e.__parent_ == &f); 1501 assert(e.__left_ == 0); 1502 assert(e.__right_ == 0); 1503 assert(e.__is_black_ == true); 1504 1505 assert(g.__parent_ == &f); 1506 assert(g.__left_ == 0); 1507 assert(g.__right_ == &h); 1508 assert(g.__is_black_ == true); 1509 1510 assert(h.__parent_ == &g); 1511 assert(h.__left_ == 0); 1512 assert(h.__right_ == 0); 1513 assert(h.__is_black_ == false); 1514 1515 std::__tree_remove(root.__left_, &c); 1516 1517 assert(std::__tree_invariant(root.__left_)); 1518 1519 assert(root.__parent_ == 0); 1520 assert(root.__left_ == &f); 1521 assert(root.__right_ == 0); 1522 assert(root.__is_black_ == false); 1523 1524 assert(f.__parent_ == &root); 1525 assert(f.__left_ == &d); 1526 assert(f.__right_ == &g); 1527 assert(f.__is_black_ == true); 1528 1529 assert(d.__parent_ == &f); 1530 assert(d.__left_ == 0); 1531 assert(d.__right_ == &e); 1532 assert(d.__is_black_ == true); 1533 1534 assert(g.__parent_ == &f); 1535 assert(g.__left_ == 0); 1536 assert(g.__right_ == &h); 1537 assert(g.__is_black_ == true); 1538 1539 assert(e.__parent_ == &d); 1540 assert(e.__left_ == 0); 1541 assert(e.__right_ == 0); 1542 assert(e.__is_black_ == false); 1543 1544 assert(h.__parent_ == &g); 1545 assert(h.__left_ == 0); 1546 assert(h.__right_ == 0); 1547 assert(h.__is_black_ == false); 1548 1549 std::__tree_remove(root.__left_, &d); 1550 1551 assert(std::__tree_invariant(root.__left_)); 1552 1553 assert(root.__parent_ == 0); 1554 assert(root.__left_ == &f); 1555 assert(root.__right_ == 0); 1556 assert(root.__is_black_ == false); 1557 1558 assert(f.__parent_ == &root); 1559 assert(f.__left_ == &e); 1560 assert(f.__right_ == &g); 1561 assert(f.__is_black_ == true); 1562 1563 assert(e.__parent_ == &f); 1564 assert(e.__left_ == 0); 1565 assert(e.__right_ == 0); 1566 assert(e.__is_black_ == true); 1567 1568 assert(g.__parent_ == &f); 1569 assert(g.__left_ == 0); 1570 assert(g.__right_ == &h); 1571 assert(g.__is_black_ == true); 1572 1573 assert(h.__parent_ == &g); 1574 assert(h.__left_ == 0); 1575 assert(h.__right_ == 0); 1576 assert(h.__is_black_ == false); 1577 1578 std::__tree_remove(root.__left_, &e); 1579 1580 assert(std::__tree_invariant(root.__left_)); 1581 1582 assert(root.__parent_ == 0); 1583 assert(root.__left_ == &g); 1584 assert(root.__right_ == 0); 1585 assert(root.__is_black_ == false); 1586 1587 assert(g.__parent_ == &root); 1588 assert(g.__left_ == &f); 1589 assert(g.__right_ == &h); 1590 assert(g.__is_black_ == true); 1591 1592 assert(f.__parent_ == &g); 1593 assert(f.__left_ == 0); 1594 assert(f.__right_ == 0); 1595 assert(f.__is_black_ == true); 1596 1597 assert(h.__parent_ == &g); 1598 assert(h.__left_ == 0); 1599 assert(h.__right_ == 0); 1600 assert(h.__is_black_ == true); 1601 1602 std::__tree_remove(root.__left_, &f); 1603 1604 assert(std::__tree_invariant(root.__left_)); 1605 1606 assert(root.__parent_ == 0); 1607 assert(root.__left_ == &g); 1608 assert(root.__right_ == 0); 1609 assert(root.__is_black_ == false); 1610 1611 assert(g.__parent_ == &root); 1612 assert(g.__left_ == 0); 1613 assert(g.__right_ == &h); 1614 assert(g.__is_black_ == true); 1615 1616 assert(h.__parent_ == &g); 1617 assert(h.__left_ == 0); 1618 assert(h.__right_ == 0); 1619 assert(h.__is_black_ == false); 1620 1621 std::__tree_remove(root.__left_, &g); 1622 1623 assert(std::__tree_invariant(root.__left_)); 1624 1625 assert(root.__parent_ == 0); 1626 assert(root.__left_ == &h); 1627 assert(root.__right_ == 0); 1628 assert(root.__is_black_ == false); 1629 1630 assert(h.__parent_ == &root); 1631 assert(h.__left_ == 0); 1632 assert(h.__right_ == 0); 1633 assert(h.__is_black_ == true); 1634 1635 std::__tree_remove(root.__left_, &h); 1636 1637 assert(std::__tree_invariant(root.__left_)); 1638 1639 assert(root.__parent_ == 0); 1640 assert(root.__left_ == 0); 1641 assert(root.__right_ == 0); 1642 assert(root.__is_black_ == false); 1643} 1644 1645int main() 1646{ 1647 test1(); 1648 test2(); 1649 test3(); 1650 test4(); 1651} 1652