13 #include <GATreeBASE.h>
104 auto *newnode =
new GANode<T>(node->contents);
105 newnode->parent = parent;
106 newnode->child = _GATreeCopy(DYN_CAST(
GANode<T> *, node->child), newnode);
108 GANode<T> *lasttmp = newnode, *newtmp =
nullptr;
110 while (tmp && tmp != node)
113 newtmp->parent = parent;
114 newtmp->child = _GATreeCopy(DYN_CAST(
GANode<T> *, tmp->child), newtmp);
115 newtmp->prev = lasttmp;
116 lasttmp->next = newtmp;
124 newtmp->next = newnode;
125 newnode->prev = newtmp;
129 newnode->next = newnode;
130 newnode->prev = newnode;
139 template <
class T>
void _GATreeDestroy(
GANode<T> *node)
145 node->parent->child =
nullptr;
146 _GATreeDestroy(DYN_CAST(
GANode<T> *, node->child));
149 while (node->next && node->next != node)
152 node->next = tmp->next;
153 tmp->next->prev = node;
154 _GATreeDestroy(DYN_CAST(
GANode<T> *, tmp->child));
184 _GATreeDestroy(DYN_CAST(
GANode<T> *, rt));
197 GATree<T> *clone(
unsigned int i = 0)
const
205 node = DYN_CAST(
GANode<T> *, _GATreeTraverse(i, w, rt));
209 auto *newnode =
new GANode<T>(node->contents);
211 _GATreeCopy(DYN_CAST(
GANode<T> *, node->child), newnode);
213 newnode->child->parent = newnode;
215 t->insert(newnode,
nullptr, GATreeBASE::ROOT);
228 _GATreeDestroy(DYN_CAST(
GANode<T> *, rt));
255 return GATreeBASE::NO_ERR;
256 if (node->prev == node || !node->prev)
258 iter.node = node->parent;
263 _GATreeDestroy(DYN_CAST(
GANode<T> *, node->child));
264 delete GATreeBASE::remove(node);
265 return GATreeBASE::NO_ERR;
284 if (t->iter.node && iter.node)
286 if (GATreeBASE::swaptree(t->iter.node, iter.node) ==
288 return GATreeBASE::ERR;
289 if (t->rt == t->iter.node)
292 t->iter.node = iter.node;
300 else if (t->iter.node)
304 tmp = t->GATreeBASE::remove(t->iter.node);
307 t->iter.node =
nullptr;
308 if (insert(DYN_CAST(
GANode<T> *, tmp),
nullptr,
309 GATreeBASE::ROOT) == GATreeBASE::ERR)
310 return GATreeBASE::ERR;
317 tmp = GATreeBASE::remove(iter.node);
321 if (t->insert(DYN_CAST(
GANode<T> *, tmp),
nullptr,
322 GATreeBASE::ROOT) == GATreeBASE::ERR)
323 return GATreeBASE::ERR;
327 return GATreeBASE::NO_ERR;
340 int swaptree(
unsigned int a,
unsigned int b)
342 unsigned int aw = 0, bw = 0;
343 GANodeBASE *anode = _GATreeTraverse(a, aw, rt);
344 GANodeBASE *bnode = _GATreeTraverse(b, bw, rt);
345 return GATreeBASE::swaptree(anode, bnode);
350 int swap(
unsigned int a,
unsigned int b)
352 unsigned int aw = 0, bw = 0;
353 GANodeBASE *anode = _GATreeTraverse(a, aw, rt);
354 GANodeBASE *bnode = _GATreeTraverse(b, bw, rt);
355 return GATreeBASE::swapnode(anode, bnode);
377 if (node->prev != node)
379 else if (node->parent)
385 tmpnode->prev = tmpnode;
386 tmpnode->next = tmpnode;
387 tmpnode->parent =
nullptr;
389 t->insert(tmpnode,
nullptr, GATreeBASE::ROOT);
394 int insert(
GATree<T> *t, GATreeBASE::Location where = GATreeBASE::BELOW)
398 GAErr(GA_LOC,
"GATree",
"insert", GAError::CannotInsertIntoSelf);
399 return GATreeBASE::ERR;
401 if (GATreeBASE::insert(t->rt, iter.node, where) == GATreeBASE::ERR)
403 return GATreeBASE::ERR;
405 iter.node = (t->rt ? t->rt : iter.node);
407 t->iter.node =
nullptr;
408 return GATreeBASE::NO_ERR;
410 int insert(
const T &t, GATreeBASE::Location where = GATreeBASE::BELOW)
413 if (GATreeBASE::insert(c, iter.node, where) == GATreeBASE::ERR)
416 return GATreeBASE::ERR;
419 return GATreeBASE::NO_ERR;
425 T *root() {
return iter.root(); }
426 T *current() {
return iter.current(); }
427 T *next() {
return iter.next(); }
428 T *prev() {
return iter.prev(); }
429 T *parent() {
return iter.parent(); }
430 T *child() {
return iter.child(); }
431 T *eldest() {
return iter.eldest(); }
432 T *youngest() {
return iter.youngest(); }
433 T *warp(
unsigned int i) {
return iter.warp(i); }
436 return ((i.tree ==
this) ? iter.warp(i) :
nullptr);
438 int nchildren() {
return iter.nchildren(); }
439 int nsiblings() {
return iter.nsiblings(); }
443 GATreeBASE::Location where = GATreeBASE::BELOW)
445 if (GATreeBASE::insert(n, idx, where) == GATreeBASE::ERR)
446 return GATreeBASE::ERR;
448 return GATreeBASE::NO_ERR;
471 template <
class T>
class GATree;
482 T *current() {
return (node ? &((
GANode<T> *)node)->contents :
nullptr); }
485 return (((node = GATreeIterBASE::root()) !=
nullptr) ? &((
GANode<T> *)GATreeIterBASE::root(node))->contents :
nullptr);
489 return ((node && node->next) ? &((
GANode<T> *)(node = node->next))->contents :
nullptr);
493 return ((node && node->prev) ? &((
GANode<T> *)(node = node->prev))->contents :
nullptr);
497 return ((node && node->parent) ? &((
GANode<T> *)(node = node->parent))->contents :
nullptr);
501 return ((node && node->child) ? &((
GANode<T> *)(node = node->child))->contents :
nullptr);
505 return (node ? &((
GANode<T> *)GATreeIterBASE::eldest(node))->contents :
nullptr);
509 return (node ? &((
GANode<T> *)GATreeIterBASE::youngest(node))->contents :
nullptr);
515 return (t.iter.node ? &((
GANode<T> *)(node = t.iter.node))->contents :
nullptr);
521 return (i.node ? &((
GANode<T> *)(node = i.node))->contents :
nullptr);
523 T *warp(
unsigned int i)
526 return (n ? &((
GANode<T> *)(node = n))->contents :
nullptr);
Definition: GATreeBASE.h:91
Definition: GATreeBASE.h:180
Definition: GATree.hpp:474
Definition: GATree.hpp:163
This is the basic node object.
Definition: GANode.h:18