Table::Node
enum Flags
{
ZERO = 0x00 , DEAD = 0x01, RED = 0x02 , LEFT_THREAD = 0x04 , RIGHT_THREAD = 0x08
};
struct Node
{
K key_;
D data_;
Node * lchild_, * rchild_;
unsigned char flags_;
Node (const K& k, const D& d, Flags flags = DEFAULT)
: key_(k), data_(d), lchild_(0), rchild_(0), flags_(flags)
{}
bool IsRed () const { return 0 != (RED & flags_); }
bool IsBlack () const { return !IsRed(); }
bool IsDead () const { return 0 != (DEAD & flags_); }
bool IsAlive () const { return !IsDead(); }
void SetRed () { flags_ |= RED; }
void SetBlack () { flags_ &= ~RED; }
void SetDead () { flags_ |= DEAD; data_ = D(); }
void SetAlive () { flags_ &= ~DEAD; }
// plus Is/Set/Unset for other flags
};