blob: fb14bd929e9134b6c6410198c5df28bd0359add7 [file] [log] [blame]
//===----------------------------------------------------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is dual licensed under the MIT and the University of Illinois Open
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
// Not a portable test
// Returns __tree_next(__z)
// template <class _NodePtr>
// void
// __tree_remove(_NodePtr __root, _NodePtr __z)
#include <__tree>
#include <cassert>
struct Node
{
Node* __left_;
Node* __right_;
Node* __parent_;
bool __is_black_;
Node() : __left_(), __right_(), __parent_(), __is_black_() {}
};
void
test1()
{
{
// Left
// Case 1 -> Case 2 -> x is red turned to black
Node root;
Node b;
Node c;
Node d;
Node e;
Node y;
root.__left_ = &b;
b.__parent_ = &root;
b.__left_ = &y;
b.__right_ = &d;
b.__is_black_ = true;
y.__parent_ = &b;
y.__left_ = 0;
y.__right_ = 0;
y.__is_black_ = true;
d.__parent_ = &b;
d.__left_ = &c;
d.__right_ = &e;
d.__is_black_ = false;
c.__parent_ = &d;
c.__left_ = 0;
c.__right_ = 0;
c.__is_black_ = true;
e.__parent_ = &d;
e.__left_ = 0;
e.__right_ = 0;
e.__is_black_ = true;
std::__tree_remove(root.__left_, &y);
assert(std::__tree_invariant(root.__left_));
assert(root.__parent_ == 0);
assert(root.__left_ == &d);
assert(root.__right_ == 0);
assert(root.__is_black_ == false);
assert(d.__parent_ == &root);
assert(d.__left_ == &b);
assert(d.__right_ == &e);
assert(d.__is_black_ == true);
assert(b.__parent_ == &d);
assert(b.__left_ == 0);
assert(b.__right_ == &c);
assert(b.__is_black_ == true);
assert(c.__parent_ == &b);
assert(c.__left_ == 0);
assert(c.__right_ == 0);
assert(c.__is_black_ == false);
assert(e.__parent_ == &d);
assert(e.__left_ == 0);
assert(e.__right_ == 0);
assert(e.__is_black_ == true);
}
{
// Right
// Case 1 -> Case 2 -> x is red turned to black
Node root;
Node b;
Node c;
Node d;
Node e;
Node y;
root.__left_ = &b;
b.__parent_ = &root;
b.__right_ = &y;
b.__left_ = &d;
b.__is_black_ = true;
y.__parent_ = &b;
y.__right_ = 0;
y.__left_ = 0;
y.__is_black_ = true;
d.__parent_ = &b;
d.__right_ = &c;
d.__left_ = &e;
d.__is_black_ = false;
c.__parent_ = &d;
c.__right_ = 0;
c.__left_ = 0;
c.__is_black_ = true;
e.__parent_ = &d;
e.__right_ = 0;
e.__left_ = 0;
e.__is_black_ = true;
std::__tree_remove(root.__left_, &y);
assert(std::__tree_invariant(root.__left_));
assert(root.__parent_ == 0);
assert(root.__left_ == &d);
assert(root.__right_ == 0);
assert(root.__is_black_ == false);
assert(d.__parent_ == &root);
assert(d.__right_ == &b);
assert(d.__left_ == &e);
assert(d.__is_black_ == true);
assert(b.__parent_ == &d);
assert(b.__right_ == 0);
assert(b.__left_ == &c);
assert(b.__is_black_ == true);
assert(c.__parent_ == &b);
assert(c.__right_ == 0);
assert(c.__left_ == 0);
assert(c.__is_black_ == false);
assert(e.__parent_ == &d);
assert(e.__right_ == 0);
assert(e.__left_ == 0);
assert(e.__is_black_ == true);
}
{
// Left
// Case 1 -> Case 3 -> Case 4
Node root;
Node b;
Node c;
Node d;
Node e;
Node f;
Node y;
root.__left_ = &b;
b.__parent_ = &root;
b.__left_ = &y;
b.__right_ = &d;
b.__is_black_ = true;
y.__parent_ = &b;
y.__left_ = 0;
y.__right_ = 0;
y.__is_black_ = true;
d.__parent_ = &b;
d.__left_ = &c;
d.__right_ = &e;
d.__is_black_ = false;
c.__parent_ = &d;
c.__left_ = &f;
c.__right_ = 0;
c.__is_black_ = true;
e.__parent_ = &d;
e.__left_ = 0;
e.__right_ = 0;
e.__is_black_ = true;
f.__parent_ = &c;
f.__left_ = 0;
f.__right_ = 0;
f.__is_black_ = false;
std::__tree_remove(root.__left_, &y);
assert(std::__tree_invariant(root.__left_));
assert(root.__parent_ == 0);
assert(root.__left_ == &d);
assert(root.__right_ == 0);
assert(root.__is_black_ == false);
assert(d.__parent_ == &root);
assert(d.__left_ == &f);
assert(d.__right_ == &e);
assert(d.__is_black_ == true);
assert(f.__parent_ == &d);
assert(f.__left_ == &b);
assert(f.__right_ == &c);
assert(f.__is_black_ == false);
assert(b.__parent_ == &f);
assert(b.__left_ == 0);
assert(b.__right_ == 0);
assert(b.__is_black_ == true);
assert(c.__parent_ == &f);
assert(c.__left_ == 0);
assert(c.__right_ == 0);
assert(c.__is_black_ == true);
assert(e.__parent_ == &d);
assert(e.__left_ == 0);
assert(e.__right_ == 0);
assert(e.__is_black_ == true);
}
{
// Right
// Case 1 -> Case 3 -> Case 4
Node root;
Node b;
Node c;
Node d;
Node e;
Node f;
Node y;
root.__left_ = &b;
b.__parent_ = &root;
b.__right_ = &y;
b.__left_ = &d;
b.__is_black_ = true;
y.__parent_ = &b;
y.__right_ = 0;
y.__left_ = 0;
y.__is_black_ = true;
d.__parent_ = &b;
d.__right_ = &c;
d.__left_ = &e;
d.__is_black_ = false;
c.__parent_ = &d;
c.__right_ = &f;
c.__left_ = 0;
c.__is_black_ = true;
e.__parent_ = &d;
e.__right_ = 0;
e.__left_ = 0;
e.__is_black_ = true;
f.__parent_ = &c;
f.__right_ = 0;
f.__left_ = 0;
f.__is_black_ = false;
std::__tree_remove(root.__left_, &y);
assert(std::__tree_invariant(root.__left_));
assert(root.__parent_ == 0);
assert(root.__left_ == &d);
assert(root.__right_ == 0);
assert(root.__is_black_ == false);
assert(d.__parent_ == &root);
assert(d.__right_ == &f);
assert(d.__left_ == &e);
assert(d.__is_black_ == true);
assert(f.__parent_ == &d);
assert(f.__right_ == &b);
assert(f.__left_ == &c);
assert(f.__is_black_ == false);
assert(b.__parent_ == &f);
assert(b.__right_ == 0);
assert(b.__left_ == 0);
assert(b.__is_black_ == true);
assert(c.__parent_ == &f);
assert(c.__right_ == 0);
assert(c.__left_ == 0);
assert(c.__is_black_ == true);
assert(e.__parent_ == &d);
assert(e.__right_ == 0);
assert(e.__left_ == 0);
assert(e.__is_black_ == true);
}
}
void
test2()
{
{
Node root;
Node a;
Node b;
Node c;
root.__left_ = &b;
b.__parent_ = &root;
b.__left_ = &a;
b.__right_ = &c;
b.__is_black_ = true;
a.__parent_ = &b;
a.__left_ = 0;
a.__right_ = 0;
a.__is_black_ = true;
c.__parent_ = &b;
c.__left_ = 0;
c.__right_ = 0;
c.__is_black_ = true;
std::__tree_remove(root.__left_, &a);
assert(std::__tree_invariant(root.__left_));
assert(root.__parent_ == 0);
assert(root.__left_ == &b);
assert(root.__right_ == 0);
assert(root.__is_black_ == false);
assert(b.__parent_ == &root);
assert(b.__left_ == 0);
assert(b.__right_ == &c);
assert(b.__is_black_ == true);
assert(c.__parent_ == &b);
assert(c.__left_ == 0);
assert(c.__right_ == 0);
assert(c.__is_black_ == false);
std::__tree_remove(root.__left_, &b);
assert(std::__tree_invariant(root.__left_));
assert(root.__parent_ == 0);
assert(root.__left_ == &c);
assert(root.__right_ == 0);
assert(root.__is_black_ == false);
assert(c.__parent_ == &root);
assert(c.__left_ == 0);
assert(c.__right_ == 0);
assert(c.__is_black_ == true);
std::__tree_remove(root.__left_, &c);
assert(std::__tree_invariant(root.__left_));
assert(root.__parent_ == 0);
assert(root.__left_ == 0);
assert(root.__right_ == 0);
assert(root.__is_black_ == false);
}
{
Node root;
Node a;
Node b;
Node c;
root.__left_ = &b;
b.__parent_ = &root;
b.__left_ = &a;
b.__right_ = &c;
b.__is_black_ = true;
a.__parent_ = &b;
a.__left_ = 0;
a.__right_ = 0;
a.__is_black_ = false;
c.__parent_ = &b;
c.__left_ = 0;
c.__right_ = 0;
c.__is_black_ = false;
std::__tree_remove(root.__left_, &a);
assert(std::__tree_invariant(root.__left_));
assert(root.__parent_ == 0);
assert(root.__left_ == &b);
assert(root.__right_ == 0);
assert(root.__is_black_ == false);
assert(b.__parent_ == &root);
assert(b.__left_ == 0);
assert(b.__right_ == &c);
assert(b.__is_black_ == true);
assert(c.__parent_ == &b);
assert(c.__left_ == 0);
assert(c.__right_ == 0);
assert(c.__is_black_ == false);
std::__tree_remove(root.__left_, &b);
assert(std::__tree_invariant(root.__left_));
assert(root.__parent_ == 0);
assert(root.__left_ == &c);
assert(root.__right_ == 0);
assert(root.__is_black_ == false);
assert(c.__parent_ == &root);
assert(c.__left_ == 0);
assert(c.__right_ == 0);
assert(c.__is_black_ == true);
std::__tree_remove(root.__left_, &c);
assert(std::__tree_invariant(root.__left_));
assert(root.__parent_ == 0);
assert(root.__left_ == 0);
assert(root.__right_ == 0);
assert(root.__is_black_ == false);
}
{
Node root;
Node a;
Node b;
Node c;
root.__left_ = &b;
b.__parent_ = &root;
b.__left_ = &a;
b.__right_ = &c;
b.__is_black_ = true;
a.__parent_ = &b;
a.__left_ = 0;
a.__right_ = 0;
a.__is_black_ = true;
c.__parent_ = &b;
c.__left_ = 0;
c.__right_ = 0;
c.__is_black_ = true;
std::__tree_remove(root.__left_, &a);
assert(std::__tree_invariant(root.__left_));
assert(root.__parent_ == 0);
assert(root.__left_ == &b);
assert(root.__right_ == 0);
assert(root.__is_black_ == false);
assert(b.__parent_ == &root);
assert(b.__left_ == 0);
assert(b.__right_ == &c);
assert(b.__is_black_ == true);
assert(c.__parent_ == &b);
assert(c.__left_ == 0);
assert(c.__right_ == 0);
assert(c.__is_black_ == false);
std::__tree_remove(root.__left_, &c);
assert(std::__tree_invariant(root.__left_));
assert(root.__parent_ == 0);
assert(root.__left_ == &b);
assert(root.__right_ == 0);
assert(root.__is_black_ == false);
assert(b.__parent_ == &root);
assert(b.__left_ == 0);
assert(b.__right_ == 0);
assert(b.__is_black_ == true);
std::__tree_remove(root.__left_, &b);
assert(std::__tree_invariant(root.__left_));
assert(root.__parent_ == 0);
assert(root.__left_ == 0);
assert(root.__right_ == 0);
assert(root.__is_black_ == false);
}
{
Node root;
Node a;
Node b;
Node c;
root.__left_ = &b;
b.__parent_ = &root;
b.__left_ = &a;
b.__right_ = &c;
b.__is_black_ = true;
a.__parent_ = &b;
a.__left_ = 0;
a.__right_ = 0;
a.__is_black_ = false;
c.__parent_ = &b;
c.__left_ = 0;
c.__right_ = 0;
c.__is_black_ = false;
std::__tree_remove(root.__left_, &a);
assert(std::__tree_invariant(root.__left_));
assert(root.__parent_ == 0);
assert(root.__left_ == &b);
assert(root.__right_ == 0);
assert(root.__is_black_ == false);
assert(b.__parent_ == &root);
assert(b.__left_ == 0);
assert(b.__right_ == &c);
assert(b.__is_black_ == true);
assert(c.__parent_ == &b);
assert(c.__left_ == 0);
assert(c.__right_ == 0);
assert(c.__is_black_ == false);
std::__tree_remove(root.__left_, &c);
assert(std::__tree_invariant(root.__left_));
assert(root.__parent_ == 0);
assert(root.__left_ == &b);
assert(root.__right_ == 0);
assert(root.__is_black_ == false);
assert(b.__parent_ == &root);
assert(b.__left_ == 0);
assert(b.__right_ == 0);
assert(b.__is_black_ == true);
std::__tree_remove(root.__left_, &b);
assert(std::__tree_invariant(root.__left_));
assert(root.__parent_ == 0);
assert(root.__left_ == 0);
assert(root.__right_ == 0);
assert(root.__is_black_ == false);
}
{
Node root;
Node a;
Node b;
Node c;
root.__left_ = &b;
b.__parent_ = &root;
b.__left_ = &a;
b.__right_ = &c;
b.__is_black_ = true;
a.__parent_ = &b;
a.__left_ = 0;
a.__right_ = 0;
a.__is_black_ = true;
c.__parent_ = &b;
c.__left_ = 0;
c.__right_ = 0;
c.__is_black_ = true;
std::__tree_remove(root.__left_, &b);
assert(std::__tree_invariant(root.__left_));
assert(root.__parent_ == 0);
assert(root.__left_ == &c);
assert(root.__right_ == 0);
assert(root.__is_black_ == false);
assert(a.__parent_ == &c);
assert(a.__left_ == 0);
assert(a.__right_ == 0);
assert(a.__is_black_ == false);
assert(c.__parent_ == &root);
assert(c.__left_ == &a);
assert(c.__right_ == 0);
assert(c.__is_black_ == true);
std::__tree_remove(root.__left_, &a);
assert(std::__tree_invariant(root.__left_));
assert(root.__parent_ == 0);
assert(root.__left_ == &c);
assert(root.__right_ == 0);
assert(root.__is_black_ == false);
assert(c.__parent_ == &root);
assert(c.__left_ == 0);
assert(c.__right_ == 0);
assert(c.__is_black_ == true);
std::__tree_remove(root.__left_, &c);
assert(std::__tree_invariant(root.__left_));
assert(root.__parent_ == 0);
assert(root.__left_ == 0);
assert(root.__right_ == 0);
assert(root.__is_black_ == false);
}
{
Node root;
Node a;
Node b;
Node c;
root.__left_ = &b;
b.__parent_ = &root;
b.__left_ = &a;
b.__right_ = &c;
b.__is_black_ = true;
a.__parent_ = &b;
a.__left_ = 0;
a.__right_ = 0;
a.__is_black_ = false;
c.__parent_ = &b;
c.__left_ = 0;
c.__right_ = 0;
c.__is_black_ = false;
std::__tree_remove(root.__left_, &b);
assert(std::__tree_invariant(root.__left_));
assert(root.__parent_ == 0);
assert(root.__left_ == &c);
assert(root.__right_ == 0);
assert(root.__is_black_ == false);
assert(a.__parent_ == &c);
assert(a.__left_ == 0);
assert(a.__right_ == 0);
assert(a.__is_black_ == false);
assert(c.__parent_ == &root);
assert(c.__left_ == &a);
assert(c.__right_ == 0);
assert(c.__is_black_ == true);
std::__tree_remove(root.__left_, &a);
assert(std::__tree_invariant(root.__left_));
assert(root.__parent_ == 0);
assert(root.__left_ == &c);
assert(root.__right_ == 0);
assert(root.__is_black_ == false);
assert(c.__parent_ == &root);
assert(c.__left_ == 0);
assert(c.__right_ == 0);
assert(c.__is_black_ == true);
std::__tree_remove(root.__left_, &c);
assert(std::__tree_invariant(root.__left_));
assert(root.__parent_ == 0);
assert(root.__left_ == 0);
assert(root.__right_ == 0);
assert(root.__is_black_ == false);
}
{
Node root;
Node a;
Node b;
Node c;
root.__left_ = &b;
b.__parent_ = &root;
b.__left_ = &a;
b.__right_ = &c;
b.__is_black_ = true;
a.__parent_ = &b;
a.__left_ = 0;
a.__right_ = 0;
a.__is_black_ = true;
c.__parent_ = &b;
c.__left_ = 0;
c.__right_ = 0;
c.__is_black_ = true;
std::__tree_remove(root.__left_, &b);
assert(std::__tree_invariant(root.__left_));
assert(root.__parent_ == 0);
assert(root.__left_ == &c);
assert(root.__right_ == 0);
assert(root.__is_black_ == false);
assert(a.__parent_ == &c);
assert(a.__left_ == 0);
assert(a.__right_ == 0);
assert(a.__is_black_ == false);
assert(c.__parent_ == &root);
assert(c.__left_ == &a);
assert(c.__right_ == 0);
assert(c.__is_black_ == true);
std::__tree_remove(root.__left_, &c);
assert(std::__tree_invariant(root.__left_));
assert(root.__parent_ == 0);
assert(root.__left_ == &a);
assert(root.__right_ == 0);
assert(root.__is_black_ == false);
assert(a.__parent_ == &root);
assert(a.__left_ == 0);
assert(a.__right_ == 0);
assert(a.__is_black_ == true);
std::__tree_remove(root.__left_, &a);
assert(std::__tree_invariant(root.__left_));
assert(root.__parent_ == 0);
assert(root.__left_ == 0);
assert(root.__right_ == 0);
assert(root.__is_black_ == false);
}
{
Node root;
Node a;
Node b;
Node c;
root.__left_ = &b;
b.__parent_ = &root;
b.__left_ = &a;
b.__right_ = &c;
b.__is_black_ = true;
a.__parent_ = &b;
a.__left_ = 0;
a.__right_ = 0;
a.__is_black_ = false;
c.__parent_ = &b;
c.__left_ = 0;
c.__right_ = 0;
c.__is_black_ = false;
std::__tree_remove(root.__left_, &b);
assert(std::__tree_invariant(root.__left_));
assert(root.__parent_ == 0);
assert(root.__left_ == &c);
assert(root.__right_ == 0);
assert(root.__is_black_ == false);
assert(a.__parent_ == &c);
assert(a.__left_ == 0);
assert(a.__right_ == 0);
assert(a.__is_black_ == false);
assert(c.__parent_ == &root);
assert(c.__left_ == &a);
assert(c.__right_ == 0);
assert(c.__is_black_ == true);
std::__tree_remove(root.__left_, &c);
assert(std::__tree_invariant(root.__left_));
assert(root.__parent_ == 0);
assert(root.__left_ == &a);
assert(root.__right_ == 0);
assert(root.__is_black_ == false);
assert(a.__parent_ == &root);
assert(a.__left_ == 0);
assert(a.__right_ == 0);
assert(a.__is_black_ == true);
std::__tree_remove(root.__left_, &a);
assert(std::__tree_invariant(root.__left_));
assert(root.__parent_ == 0);
assert(root.__left_ == 0);
assert(root.__right_ == 0);
assert(root.__is_black_ == false);
}
{
Node root;
Node a;
Node b;
Node c;
root.__left_ = &b;
b.__parent_ = &root;
b.__left_ = &a;
b.__right_ = &c;
b.__is_black_ = true;
a.__parent_ = &b;
a.__left_ = 0;
a.__right_ = 0;
a.__is_black_ = true;
c.__parent_ = &b;
c.__left_ = 0;
c.__right_ = 0;
c.__is_black_ = true;
std::__tree_remove(root.__left_, &c);
assert(std::__tree_invariant(root.__left_));
assert(root.__parent_ == 0);
assert(root.__left_ == &b);
assert(root.__right_ == 0);
assert(root.__is_black_ == false);
assert(a.__parent_ == &b);
assert(a.__left_ == 0);
assert(a.__right_ == 0);
assert(a.__is_black_ == false);
assert(b.__parent_ == &root);
assert(b.__left_ == &a);
assert(b.__right_ == 0);
assert(b.__is_black_ == true);
std::__tree_remove(root.__left_, &b);
assert(std::__tree_invariant(root.__left_));
assert(root.__parent_ == 0);
assert(root.__left_ == &a);
assert(root.__right_ == 0);
assert(root.__is_black_ == false);
assert(a.__parent_ == &root);
assert(a.__left_ == 0);
assert(a.__right_ == 0);
assert(a.__is_black_ == true);
std::__tree_remove(root.__left_, &a);
assert(std::__tree_invariant(root.__left_));
assert(root.__parent_ == 0);
assert(root.__left_ == 0);
assert(root.__right_ == 0);
assert(root.__is_black_ == false);
}
{
Node root;
Node a;
Node b;
Node c;
root.__left_ = &b;
b.__parent_ = &root;
b.__left_ = &a;
b.__right_ = &c;
b.__is_black_ = true;
a.__parent_ = &b;
a.__left_ = 0;
a.__right_ = 0;
a.__is_black_ = false;
c.__parent_ = &b;
c.__left_ = 0;
c.__right_ = 0;
c.__is_black_ = false;
std::__tree_remove(root.__left_, &c);
assert(std::__tree_invariant(root.__left_));
assert(root.__parent_ == 0);
assert(root.__left_ == &b);
assert(root.__right_ == 0);
assert(root.__is_black_ == false);
assert(a.__parent_ == &b);
assert(a.__left_ == 0);
assert(a.__right_ == 0);
assert(a.__is_black_ == false);
assert(b.__parent_ == &root);
assert(b.__left_ == &a);
assert(b.__right_ == 0);
assert(b.__is_black_ == true);
std::__tree_remove(root.__left_, &b);
assert(std::__tree_invariant(root.__left_));
assert(root.__parent_ == 0);
assert(root.__left_ == &a);
assert(root.__right_ == 0);
assert(root.__is_black_ == false);
assert(a.__parent_ == &root);
assert(a.__left_ == 0);
assert(a.__right_ == 0);
assert(a.__is_black_ == true);
std::__tree_remove(root.__left_, &a);
assert(std::__tree_invariant(root.__left_));
assert(root.__parent_ == 0);
assert(root.__left_ == 0);
assert(root.__right_ == 0);
assert(root.__is_black_ == false);
}
{
Node root;
Node a;
Node b;
Node c;
root.__left_ = &b;
b.__parent_ = &root;
b.__left_ = &a;
b.__right_ = &c;
b.__is_black_ = true;
a.__parent_ = &b;
a.__left_ = 0;
a.__right_ = 0;
a.__is_black_ = true;
c.__parent_ = &b;
c.__left_ = 0;
c.__right_ = 0;
c.__is_black_ = true;
std::__tree_remove(root.__left_, &c);
assert(std::__tree_invariant(root.__left_));
assert(root.__parent_ == 0);
assert(root.__left_ == &b);
assert(root.__right_ == 0);
assert(root.__is_black_ == false);
assert(a.__parent_ == &b);
assert(a.__left_ == 0);
assert(a.__right_ == 0);
assert(a.__is_black_ == false);
assert(b.__parent_ == &root);
assert(b.__left_ == &a);
assert(b.__right_ == 0);
assert(b.__is_black_ == true);
std::__tree_remove(root.__left_, &a);
assert(std::__tree_invariant(root.__left_));
assert(root.__parent_ == 0);
assert(root.__left_ == &b);
assert(root.__right_ == 0);
assert(root.__is_black_ == false);
assert(b.__parent_ == &root);
assert(b.__left_ == 0);
assert(b.__right_ == 0);
assert(b.__is_black_ == true);
std::__tree_remove(root.__left_, &b);
assert(std::__tree_invariant(root.__left_));
assert(root.__parent_ == 0);
assert(root.__left_ == 0);
assert(root.__right_ == 0);
assert(root.__is_black_ == false);
}
{
Node root;
Node a;
Node b;
Node c;
root.__left_ = &b;
b.__parent_ = &root;
b.__left_ = &a;
b.__right_ = &c;
b.__is_black_ = true;
a.__parent_ = &b;
a.__left_ = 0;
a.__right_ = 0;
a.__is_black_ = false;
c.__parent_ = &b;
c.__left_ = 0;
c.__right_ = 0;
c.__is_black_ = false;
std::__tree_remove(root.__left_, &c);
assert(std::__tree_invariant(root.__left_));
assert(root.__parent_ == 0);
assert(root.__left_ == &b);
assert(root.__right_ == 0);
assert(root.__is_black_ == false);
assert(a.__parent_ == &b);
assert(a.__left_ == 0);
assert(a.__right_ == 0);
assert(a.__is_black_ == false);
assert(b.__parent_ == &root);
assert(b.__left_ == &a);
assert(b.__right_ == 0);
assert(b.__is_black_ == true);
std::__tree_remove(root.__left_, &a);
assert(std::__tree_invariant(root.__left_));
assert(root.__parent_ == 0);
assert(root.__left_ == &b);
assert(root.__right_ == 0);
assert(root.__is_black_ == false);
assert(b.__parent_ == &root);
assert(b.__left_ == 0);
assert(b.__right_ == 0);
assert(b.__is_black_ == true);
std::__tree_remove(root.__left_, &b);
assert(std::__tree_invariant(root.__left_));
assert(root.__parent_ == 0);
assert(root.__left_ == 0);
assert(root.__right_ == 0);
assert(root.__is_black_ == false);
}
}
void
test3()
{
Node root;
Node a;
Node b;
Node c;
Node d;
Node e;
Node f;
Node g;
Node h;
root.__left_ = &e;
e.__parent_ = &root;
e.__left_ = &c;
e.__right_ = &g;
e.__is_black_ = true;
c.__parent_ = &e;
c.__left_ = &b;
c.__right_ = &d;
c.__is_black_ = false;
g.__parent_ = &e;
g.__left_ = &f;
g.__right_ = &h;
g.__is_black_ = false;
b.__parent_ = &c;
b.__left_ = &a;
b.__right_ = 0;
b.__is_black_ = true;
d.__parent_ = &c;
d.__left_ = 0;
d.__right_ = 0;
d.__is_black_ = true;
f.__parent_ = &g;
f.__left_ = 0;
f.__right_ = 0;
f.__is_black_ = true;
h.__parent_ = &g;
h.__left_ = 0;
h.__right_ = 0;
h.__is_black_ = true;
a.__parent_ = &b;
a.__left_ = 0;
a.__right_ = 0;
a.__is_black_ = false;
assert(std::__tree_invariant(root.__left_));
std::__tree_remove(root.__left_, &h);
assert(std::__tree_invariant(root.__left_));
assert(root.__parent_ == 0);
assert(root.__left_ == &e);
assert(root.__right_ == 0);
assert(root.__is_black_ == false);
assert(e.__parent_ == &root);
assert(e.__left_ == &c);
assert(e.__right_ == &g);
assert(e.__is_black_ == true);
assert(c.__parent_ == &e);
assert(c.__left_ == &b);
assert(c.__right_ == &d);
assert(c.__is_black_ == false);
assert(g.__parent_ == &e);
assert(g.__left_ == &f);
assert(g.__right_ == 0);
assert(g.__is_black_ == true);
assert(b.__parent_ == &c);
assert(b.__left_ == &a);
assert(b.__right_ == 0);
assert(b.__is_black_ == true);
assert(a.__parent_ == &b);
assert(a.__left_ == 0);
assert(a.__right_ == 0);
assert(a.__is_black_ == false);
assert(d.__parent_ == &c);
assert(d.__left_ == 0);
assert(d.__right_ == 0);
assert(d.__is_black_ == true);
assert(f.__parent_ == &g);
assert(f.__left_ == 0);
assert(f.__right_ == 0);
assert(f.__is_black_ == false);
std::__tree_remove(root.__left_, &g);
assert(std::__tree_invariant(root.__left_));
assert(root.__parent_ == 0);
assert(root.__left_ == &e);
assert(root.__right_ == 0);
assert(root.__is_black_ == false);
assert(e.__parent_ == &root);
assert(e.__left_ == &c);
assert(e.__right_ == &f);
assert(e.__is_black_ == true);
assert(c.__parent_ == &e);
assert(c.__left_ == &b);
assert(c.__right_ == &d);
assert(c.__is_black_ == false);
assert(b.__parent_ == &c);
assert(b.__left_ == &a);
assert(b.__right_ == 0);
assert(b.__is_black_ == true);
assert(a.__parent_ == &b);
assert(a.__left_ == 0);
assert(a.__right_ == 0);
assert(a.__is_black_ == false);
assert(d.__parent_ == &c);
assert(d.__left_ == 0);
assert(d.__right_ == 0);
assert(d.__is_black_ == true);
assert(f.__parent_ == &e);
assert(f.__left_ == 0);
assert(f.__right_ == 0);
assert(f.__is_black_ == true);
std::__tree_remove(root.__left_, &f);
assert(std::__tree_invariant(root.__left_));
assert(root.__parent_ == 0);
assert(root.__left_ == &c);
assert(root.__right_ == 0);
assert(root.__is_black_ == false);
assert(c.__parent_ == &root);
assert(c.__left_ == &b);
assert(c.__right_ == &e);
assert(c.__is_black_ == true);
assert(b.__parent_ == &c);
assert(b.__left_ == &a);
assert(b.__right_ == 0);
assert(b.__is_black_ == true);
assert(e.__parent_ == &c);
assert(e.__left_ == &d);
assert(e.__right_ == 0);
assert(e.__is_black_ == true);
assert(a.__parent_ == &b);
assert(a.__left_ == 0);
assert(a.__right_ == 0);
assert(a.__is_black_ == false);
assert(d.__parent_ == &e);
assert(d.__left_ == 0);
assert(d.__right_ == 0);
assert(d.__is_black_ == false);
std::__tree_remove(root.__left_, &e);
assert(std::__tree_invariant(root.__left_));
assert(root.__parent_ == 0);
assert(root.__left_ == &c);
assert(root.__right_ == 0);
assert(root.__is_black_ == false);
assert(c.__parent_ == &root);
assert(c.__left_ == &b);
assert(c.__right_ == &d);
assert(c.__is_black_ == true);
assert(b.__parent_ == &c);
assert(b.__left_ == &a);
assert(b.__right_ == 0);
assert(b.__is_black_ == true);
assert(a.__parent_ == &b);
assert(a.__left_ == 0);
assert(a.__right_ == 0);
assert(a.__is_black_ == false);
assert(d.__parent_ == &c);
assert(d.__left_ == 0);
assert(d.__right_ == 0);
assert(d.__is_black_ == true);
std::__tree_remove(root.__left_, &d);
assert(std::__tree_invariant(root.__left_));
assert(root.__parent_ == 0);
assert(root.__left_ == &b);
assert(root.__right_ == 0);
assert(root.__is_black_ == false);
assert(b.__parent_ == &root);
assert(b.__left_ == &a);
assert(b.__right_ == &c);
assert(b.__is_black_ == true);
assert(a.__parent_ == &b);
assert(a.__left_ == 0);
assert(a.__right_ == 0);
assert(a.__is_black_ == true);
assert(c.__parent_ == &b);
assert(c.__left_ == 0);
assert(c.__right_ == 0);
assert(c.__is_black_ == true);
std::__tree_remove(root.__left_, &c);
assert(std::__tree_invariant(root.__left_));
assert(root.__parent_ == 0);
assert(root.__left_ == &b);
assert(root.__right_ == 0);
assert(root.__is_black_ == false);
assert(b.__parent_ == &root);
assert(b.__left_ == &a);
assert(b.__right_ == 0);
assert(b.__is_black_ == true);
assert(a.__parent_ == &b);
assert(a.__left_ == 0);
assert(a.__right_ == 0);
assert(a.__is_black_ == false);
std::__tree_remove(root.__left_, &b);
assert(std::__tree_invariant(root.__left_));
assert(root.__parent_ == 0);
assert(root.__left_ == &a);
assert(root.__right_ == 0);
assert(root.__is_black_ == false);
assert(a.__parent_ == &root);
assert(a.__left_ == 0);
assert(a.__right_ == 0);
assert(a.__is_black_ == true);
std::__tree_remove(root.__left_, &a);
assert(std::__tree_invariant(root.__left_));
assert(root.__parent_ == 0);
assert(root.__left_ == 0);
assert(root.__right_ == 0);
assert(root.__is_black_ == false);
}
void
test4()
{
Node root;
Node a;
Node b;
Node c;
Node d;
Node e;
Node f;
Node g;
Node h;
root.__left_ = &d;
d.__parent_ = &root;
d.__left_ = &b;
d.__right_ = &f;
d.__is_black_ = true;
b.__parent_ = &d;
b.__left_ = &a;
b.__right_ = &c;
b.__is_black_ = false;
f.__parent_ = &d;
f.__left_ = &e;
f.__right_ = &g;
f.__is_black_ = false;
a.__parent_ = &b;
a.__left_ = 0;
a.__right_ = 0;
a.__is_black_ = true;
c.__parent_ = &b;
c.__left_ = 0;
c.__right_ = 0;
c.__is_black_ = true;
e.__parent_ = &f;
e.__left_ = 0;
e.__right_ = 0;
e.__is_black_ = true;
g.__parent_ = &f;
g.__left_ = 0;
g.__right_ = &h;
g.__is_black_ = true;
h.__parent_ = &g;
h.__left_ = 0;
h.__right_ = 0;
h.__is_black_ = false;
assert(std::__tree_invariant(root.__left_));
std::__tree_remove(root.__left_, &a);
assert(std::__tree_invariant(root.__left_));
assert(root.__parent_ == 0);
assert(root.__left_ == &d);
assert(root.__right_ == 0);
assert(root.__is_black_ == false);
assert(d.__parent_ == &root);
assert(d.__left_ == &b);
assert(d.__right_ == &f);
assert(d.__is_black_ == true);
assert(b.__parent_ == &d);
assert(b.__left_ == 0);
assert(b.__right_ == &c);
assert(b.__is_black_ == true);
assert(f.__parent_ == &d);
assert(f.__left_ == &e);
assert(f.__right_ == &g);
assert(f.__is_black_ == false);
assert(c.__parent_ == &b);
assert(c.__left_ == 0);
assert(c.__right_ == 0);
assert(c.__is_black_ == false);
assert(e.__parent_ == &f);
assert(e.__left_ == 0);
assert(e.__right_ == 0);
assert(e.__is_black_ == true);
assert(g.__parent_ == &f);
assert(g.__left_ == 0);
assert(g.__right_ == &h);
assert(g.__is_black_ == true);
assert(h.__parent_ == &g);
assert(h.__left_ == 0);
assert(h.__right_ == 0);
assert(h.__is_black_ == false);
std::__tree_remove(root.__left_, &b);
assert(std::__tree_invariant(root.__left_));
assert(root.__parent_ == 0);
assert(root.__left_ == &d);
assert(root.__right_ == 0);
assert(root.__is_black_ == false);
assert(d.__parent_ == &root);
assert(d.__left_ == &c);
assert(d.__right_ == &f);
assert(d.__is_black_ == true);
assert(c.__parent_ == &d);
assert(c.__left_ == 0);
assert(c.__right_ == 0);
assert(c.__is_black_ == true);
assert(f.__parent_ == &d);
assert(f.__left_ == &e);
assert(f.__right_ == &g);
assert(f.__is_black_ == false);
assert(e.__parent_ == &f);
assert(e.__left_ == 0);
assert(e.__right_ == 0);
assert(e.__is_black_ == true);
assert(g.__parent_ == &f);
assert(g.__left_ == 0);
assert(g.__right_ == &h);
assert(g.__is_black_ == true);
assert(h.__parent_ == &g);
assert(h.__left_ == 0);
assert(h.__right_ == 0);
assert(h.__is_black_ == false);
std::__tree_remove(root.__left_, &c);
assert(std::__tree_invariant(root.__left_));
assert(root.__parent_ == 0);
assert(root.__left_ == &f);
assert(root.__right_ == 0);
assert(root.__is_black_ == false);
assert(f.__parent_ == &root);
assert(f.__left_ == &d);
assert(f.__right_ == &g);
assert(f.__is_black_ == true);
assert(d.__parent_ == &f);
assert(d.__left_ == 0);
assert(d.__right_ == &e);
assert(d.__is_black_ == true);
assert(g.__parent_ == &f);
assert(g.__left_ == 0);
assert(g.__right_ == &h);
assert(g.__is_black_ == true);
assert(e.__parent_ == &d);
assert(e.__left_ == 0);
assert(e.__right_ == 0);
assert(e.__is_black_ == false);
assert(h.__parent_ == &g);
assert(h.__left_ == 0);
assert(h.__right_ == 0);
assert(h.__is_black_ == false);
std::__tree_remove(root.__left_, &d);
assert(std::__tree_invariant(root.__left_));
assert(root.__parent_ == 0);
assert(root.__left_ == &f);
assert(root.__right_ == 0);
assert(root.__is_black_ == false);
assert(f.__parent_ == &root);
assert(f.__left_ == &e);
assert(f.__right_ == &g);
assert(f.__is_black_ == true);
assert(e.__parent_ == &f);
assert(e.__left_ == 0);
assert(e.__right_ == 0);
assert(e.__is_black_ == true);
assert(g.__parent_ == &f);
assert(g.__left_ == 0);
assert(g.__right_ == &h);
assert(g.__is_black_ == true);
assert(h.__parent_ == &g);
assert(h.__left_ == 0);
assert(h.__right_ == 0);
assert(h.__is_black_ == false);
std::__tree_remove(root.__left_, &e);
assert(std::__tree_invariant(root.__left_));
assert(root.__parent_ == 0);
assert(root.__left_ == &g);
assert(root.__right_ == 0);
assert(root.__is_black_ == false);
assert(g.__parent_ == &root);
assert(g.__left_ == &f);
assert(g.__right_ == &h);
assert(g.__is_black_ == true);
assert(f.__parent_ == &g);
assert(f.__left_ == 0);
assert(f.__right_ == 0);
assert(f.__is_black_ == true);
assert(h.__parent_ == &g);
assert(h.__left_ == 0);
assert(h.__right_ == 0);
assert(h.__is_black_ == true);
std::__tree_remove(root.__left_, &f);
assert(std::__tree_invariant(root.__left_));
assert(root.__parent_ == 0);
assert(root.__left_ == &g);
assert(root.__right_ == 0);
assert(root.__is_black_ == false);
assert(g.__parent_ == &root);
assert(g.__left_ == 0);
assert(g.__right_ == &h);
assert(g.__is_black_ == true);
assert(h.__parent_ == &g);
assert(h.__left_ == 0);
assert(h.__right_ == 0);
assert(h.__is_black_ == false);
std::__tree_remove(root.__left_, &g);
assert(std::__tree_invariant(root.__left_));
assert(root.__parent_ == 0);
assert(root.__left_ == &h);
assert(root.__right_ == 0);
assert(root.__is_black_ == false);
assert(h.__parent_ == &root);
assert(h.__left_ == 0);
assert(h.__right_ == 0);
assert(h.__is_black_ == true);
std::__tree_remove(root.__left_, &h);
assert(std::__tree_invariant(root.__left_));
assert(root.__parent_ == 0);
assert(root.__left_ == 0);
assert(root.__right_ == 0);
assert(root.__is_black_ == false);
}
int main()
{
test1();
test2();
test3();
test4();
}