Home | History | Annotate | Download | only in associative
      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 
     20 struct 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 
     33 void
     34 test1()
     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 
    320 void
    321 test2()
    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 
   1105 void
   1106 test3()
   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 
   1375 void
   1376 test4()
   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 
   1645 int main()
   1646 {
   1647     test1();
   1648     test2();
   1649     test3();
   1650     test4();
   1651 }
   1652