Engineering Details 2
Add one byte to node for various flags: red/black, alive/dead plus room for
6 more
enum Flags
{
ZERO = 0x00 , DEAD = 0x01, RED = 0x02 , LEFT_THREAD = 0x04 , RIGHT_THREAD = 0x08
};
struct Node
{
...
// support for Erase
bool IsDead () const { return 0 != (DEAD & flags_); }
bool IsAlive () const { return !IsDead(); }
void SetDead () { flags_ |= DEAD; value_ = T(); }
void SetAlive () { flags_ &= ~DEAD; }
// support for color management
bool IsRed () const { return 0 != (RED & flags_); }
bool IsBlack () const { return !IsRed(); }
void SetRed () { flags_ |= RED; }
void SetBlack () { flags_ &= ~RED; }
// support for threaded iterators
bool IsLeftThreaded () const { return 0 != (LEFT_THREAD & flags_); }
bool IsRightThreaded () const { return 0 != (RIGHT_THREAD & flags_); }
void SetLeftThread (Node* n) { lchild_ = n; flags_ |= LEFT_THREAD; }
void SetRightThread (Node* n) { rchild_ = n; flags_ |= RIGHT_THREAD; }
void SetLeftChild (Node* n) { lchild_ = n; flags_ &= ~LEFT_THREAD; }
void SetRightChild (Node* n) { rchild_ = n; flags_ &= ~RIGHT_THREAD; }
// support for search
bool HasLeftChild () const { return (lchild_ != nullptr) && !(IsLeftThreaded()); }
bool HasRightChild () const { return (rchild_ != nullptr) && !(IsRightThreaded()); }
...
}; // struct BST_BASE<T,P>::Node