50#ifndef DOXYGEN_SHOULD_SKIP_THIS
54 template <
typename Val >
57 GUM_CONSTRUCTOR(BinTreeNode);
60 children_[0] =
nullptr;
61 children_[1] =
nullptr;
64 template <
typename Val >
65 INLINE BinTreeNode< Val >::BinTreeNode(
const BinTreeNode< Val >& from) :
66 val_(from.val_), parent_(nullptr), parent_dir_(BinTreeDir::
NO_PARENT) {
67 GUM_CONS_CPY(BinTreeNode);
70 children_[0] =
nullptr;
71 children_[1] =
nullptr;
74 template <
typename Val >
75 INLINE BinTreeNode< Val >::~BinTreeNode() {
76 GUM_DESTRUCTOR(BinTreeNode);
79 if (parent_ !=
nullptr)
80 parent_->children_[
static_cast< int >(parent_dir_)]
83 if (children_[0] !=
nullptr) {
84 children_[0]->parent_ =
nullptr;
85 children_[0]->parent_dir_ = BinTreeDir::NO_PARENT;
88 if (children_[1] !=
nullptr) {
89 children_[1]->parent_ =
nullptr;
90 children_[1]->parent_dir_ = BinTreeDir::NO_PARENT;
97 template <
typename Val >
98 INLINE BinTreeNode< Val >& BinTreeNode< Val >::operator=(
const BinTreeNode< Val >& from) {
101 GUM_OP_CPY(BinTreeNode);
108 template <
typename Val >
109 INLINE Val& BinTreeNode< Val >::value() {
113 template <
typename Val >
114 INLINE Val& BinTreeNode< Val >::operator*() {
118 template <
typename Val >
119 INLINE BinTreeNode< Val >* BinTreeNode< Val >::child(BinTreeDir dir)
const {
120 return children_[
static_cast< int >(dir)];
123 template <
typename Val >
124 INLINE BinTreeNode< Val >* BinTreeNode< Val >::leftChild()
const {
125 return children_[
static_cast< int >(BinTreeDir::LEFT_CHILD)];
128 template <
typename Val >
129 INLINE BinTreeNode< Val >* BinTreeNode< Val >::rightChild()
const {
130 return children_[
static_cast< int >(BinTreeDir::RIGHT_CHILD)];
133 template <
typename Val >
134 INLINE BinTreeNode< Val >* BinTreeNode< Val >::parent()
const {
138 template <
typename Val >
139 INLINE BinTreeDir BinTreeNode< Val >::parentDir()
const {
143 template <
typename Val >
144 INLINE
void BinTreeNode< Val >::insertLeftChild(BinTreeNode< Val >& new_child) {
145 if (new_child.parent_ !=
nullptr) {
149 if (children_[
static_cast< int >(BinTreeDir::LEFT_CHILD)] !=
nullptr) {
154 new_child.parent_ =
this;
155 new_child.parent_dir_ = BinTreeDir::LEFT_CHILD;
156 children_[
static_cast< int >(BinTreeDir::LEFT_CHILD)] = &new_child;
159 template <
typename Val >
160 INLINE BinTreeNode< Val >* BinTreeNode< Val >::insertLeftChild(
const Val& val) {
161 if (children_[
static_cast< int >(BinTreeDir::LEFT_CHILD)] !=
nullptr) {
165 BinTreeNode< Val >* new_child =
new BinTreeNode< Val >(val);
168 new_child->parent_ =
this;
169 new_child->parent_dir_ = BinTreeDir::LEFT_CHILD;
170 children_[
static_cast< int >(BinTreeDir::LEFT_CHILD)] = new_child;
175 template <
typename Val >
176 INLINE
void BinTreeNode< Val >::insertRightChild(BinTreeNode< Val >& new_child) {
177 if (new_child.parent_ !=
nullptr) {
181 if (children_[
static_cast< int >(BinTreeDir::RIGHT_CHILD)] !=
nullptr) {
186 new_child.parent_ =
this;
187 new_child.parent_dir_ = BinTreeDir::RIGHT_CHILD;
188 children_[
static_cast< int >(BinTreeDir::RIGHT_CHILD)] = &new_child;
191 template <
typename Val >
192 INLINE BinTreeNode< Val >* BinTreeNode< Val >::insertRightChild(
const Val& val) {
193 if (children_[
static_cast< int >(BinTreeDir::RIGHT_CHILD)] !=
nullptr) {
197 BinTreeNode< Val >* new_child =
new BinTreeNode< Val >(val);
200 new_child->parent_ =
this;
201 new_child->parent_dir_ = BinTreeDir::RIGHT_CHILD;
202 children_[
static_cast< int >(BinTreeDir::RIGHT_CHILD)] = new_child;
207 template <
typename Val >
208 INLINE
void BinTreeNode< Val >::insertChild(BinTreeNode< Val >& new_child, BinTreeDir child_dir) {
209 if (new_child.parent_ !=
nullptr) {
213 if (children_[
static_cast< int >(child_dir)] !=
nullptr) {
218 new_child.parent_ =
this;
219 new_child.parent_dir_ = child_dir;
220 children_[
static_cast< int >(child_dir)] = &new_child;
223 template <
typename Val >
224 INLINE BinTreeNode< Val >* BinTreeNode< Val >::insertChild(
const Val& val, BinTreeDir child_dir) {
225 if (children_[
static_cast< int >(child_dir)] !=
nullptr) {
229 BinTreeNode< Val >* new_child =
new BinTreeNode< Val >(val);
232 new_child->parent_ =
this;
233 new_child->parent_dir_ = child_dir;
234 children_[
static_cast< int >(child_dir)] = new_child;
239 template <
typename Val >
240 INLINE
void BinTreeNode< Val >::eraseLeftLink() {
241 if (children_[
static_cast< int >(BinTreeDir::LEFT_CHILD)] !=
nullptr) {
242 children_[
static_cast< int >(BinTreeDir::LEFT_CHILD)]->parent_ =
nullptr;
243 children_[
static_cast< int >(BinTreeDir::LEFT_CHILD)]->parent_dir_ = BinTreeDir::NO_PARENT;
244 children_[
static_cast< int >(BinTreeDir::LEFT_CHILD)] =
nullptr;
248 template <
typename Val >
249 INLINE
void BinTreeNode< Val >::eraseRightLink() {
250 if (children_[
static_cast< int >(BinTreeDir::RIGHT_CHILD)] !=
nullptr) {
251 children_[
static_cast< int >(BinTreeDir::RIGHT_CHILD)]->parent_ =
nullptr;
252 children_[
static_cast< int >(BinTreeDir::RIGHT_CHILD)]->parent_dir_ = BinTreeDir::NO_PARENT;
253 children_[
static_cast< int >(BinTreeDir::RIGHT_CHILD)] =
nullptr;
257 template <
typename Val >
258 INLINE
void BinTreeNode< Val >::eraseLink(BinTreeDir tree_dir) {
259 if (children_[
static_cast< int >(tree_dir)] !=
nullptr) {
260 children_[
static_cast< int >(tree_dir)]->parent_ =
nullptr;
261 children_[
static_cast< int >(tree_dir)]->parent_dir_ = BinTreeDir::NO_PARENT;
262 children_[
static_cast< int >(tree_dir)] =
nullptr;
266 template <
typename Val >
267 INLINE BinTreeNode< Val >* BinTreeNode< Val >::leftmostNode()
const {
268 BinTreeNode< Val >* node =
const_cast< BinTreeNode< Val >*
>(
this);
270 while (node->children_[
static_cast< int >(BinTreeDir::LEFT_CHILD)] !=
nullptr)
271 node = node->children_[
static_cast< int >(BinTreeDir::LEFT_CHILD)];
276 template <
typename Val >
277 INLINE BinTreeNode< Val >* BinTreeNode< Val >::rightmostNode()
const {
278 BinTreeNode< Val >* node =
const_cast< BinTreeNode< Val >*
>(
this);
280 while (node->children_[
static_cast< int >(BinTreeDir::RIGHT_CHILD)] !=
nullptr)
281 node = node->children_[
static_cast< int >(BinTreeDir::RIGHT_CHILD)];
286 template <
typename Val >
287 INLINE BinTreeNode< Val >* BinTreeNode< Val >::root()
const {
288 BinTreeNode< Val >* node =
const_cast< BinTreeNode< Val >*
>(
this);
290 while (node->parent_ !=
nullptr)
291 node = node->parent_;
BinTreeNode(const Val &v)
Basic constructor: a node without parent nor children.
Exception : a similar element already exists.
#define GUM_ERROR(type, msg)
gum is the global namespace for all aGrUM entities
BinTreeDir
The direction of a given edge in a binary tree.