// To reject a transition to an incomplete node, set_is_phantom() invalidates // its label and links when it becomes non-phantom. void set_is_phantom(bool x) { if (x) { GRN_DAT_DEBUG_THROW_IF(is_phantom()); value_ |= IS_PHANTOM_FLAG; } else { GRN_DAT_DEBUG_THROW_IF(!is_phantom()); value_ = (value_ & IS_OFFSET_FLAG) | (INVALID_LABEL << CHILD_SHIFT) | (INVALID_LABEL << SIBLING_SHIFT) | INVALID_LABEL; } }
void set_except_is_offset(UInt32 x) { GRN_DAT_DEBUG_THROW_IF(is_phantom()); GRN_DAT_DEBUG_THROW_IF((x & IS_OFFSET_FLAG) == IS_OFFSET_FLAG); value_ = (value_ & IS_OFFSET_FLAG) | x; }
void set_sibling(UInt32 x) { GRN_DAT_DEBUG_THROW_IF(is_phantom()); GRN_DAT_DEBUG_THROW_IF(label() > MAX_LABEL); GRN_DAT_DEBUG_THROW_IF((sibling() != INVALID_LABEL) && (x == INVALID_LABEL)); value_ = (value_ & ~(LABEL_MASK << SIBLING_SHIFT)) | (x << SIBLING_SHIFT); }
UInt32 prev() const { GRN_DAT_DEBUG_THROW_IF(!is_phantom()); return (value_ >> PREV_SHIFT) & BLOCK_MASK; }
void set_label(UInt32 x) { GRN_DAT_DEBUG_THROW_IF(is_phantom()); GRN_DAT_DEBUG_THROW_IF(x > MAX_LABEL); value_ = (value_ & ~LABEL_MASK) | x; }
void set_child(UInt32 x) { GRN_DAT_DEBUG_THROW_IF(is_phantom()); GRN_DAT_DEBUG_THROW_IF(x > MAX_LABEL); value_ = (value_ & ~(LABEL_MASK << CHILD_SHIFT)) | (x << CHILD_SHIFT); }
void set_key_id(UInt32 x) { GRN_DAT_DEBUG_THROW_IF(is_phantom()); base_.set_key_id(x); }
void set_prev(UInt32 x) { GRN_DAT_DEBUG_THROW_IF(!is_phantom()); GRN_DAT_DEBUG_THROW_IF(x > BLOCK_MASK); value_ = (value_ & ~(BLOCK_MASK << PREV_SHIFT)) | (x << PREV_SHIFT); }
void set_offset(UInt32 x) { GRN_DAT_DEBUG_THROW_IF(is_phantom()); base_.set_offset(x); }
void set_base(Base x) { GRN_DAT_DEBUG_THROW_IF(is_phantom()); base_ = x; }
UInt32 key_id() const { GRN_DAT_DEBUG_THROW_IF(is_phantom()); return base_.key_id(); }
UInt32 offset() const { GRN_DAT_DEBUG_THROW_IF(is_phantom()); return base_.offset(); }
bool is_terminal() const { GRN_DAT_DEBUG_THROW_IF(is_phantom()); return base_.is_terminal(); }