diff --git a/include/fennec/containers/rdtree.h b/include/fennec/containers/rdtree.h index 5f646fa..fbfb047 100644 --- a/include/fennec/containers/rdtree.h +++ b/include/fennec/containers/rdtree.h @@ -342,27 +342,34 @@ public: struct pre_order { list visit; + size_t head; size_t operator()(const rdtree&, size_t start) { + head = start; return start; } size_t operator[](const rdtree& tree, size_t node, uint8_t mode) { + if (node == npos) { + return npos; + } + + size_t nxt = tree.next(node); + size_t chd = tree.child(node); + + if (nxt != npos && node != head) { + visit.push_front(nxt); + } + + if (chd != npos && mode != traversal_control_jump_over) { + visit.push_front(chd); + } + if (not visit.empty()) { node = visit.front(); visit.pop_front(); } else { - return npos; - } - - size_t next = tree.next(node); - if (next != npos) { - visit.push_front(next); - } - - size_t child = tree.child(node); - if (child != npos && mode != traversal_control_jump_over) { - visit.push_front(child); + node = npos; } return node; @@ -379,23 +386,28 @@ public: } size_t operator[](const rdtree& tree, size_t node, uint8_t) { + if (node == npos) { + return npos; + } + + size_t prnt = tree.parent(node); + size_t next = tree.next(node); + if (node != head) { + if (tree.child(prnt) == node) { + visit.push_back(prnt); + if (next != npos) { + visit.push_back(tree.left_most(next)); + } + } else if (next != npos) { + visit.push_front(tree.left_most(next)); + } + } + if (not visit.empty()) { node = visit.front(); visit.pop_front(); } else { - return npos; - } - - size_t parent = tree.parent(node); - size_t next = tree.next(node); - size_t nnext = next == npos ? npos : tree.next(next); - - if (next != npos && node != head) { - if (nnext == npos && parent != npos) { - visit.push_back(parent); - } - - visit.push_back(tree.left_most(next)); + node = npos; } return node; @@ -412,20 +424,28 @@ public: } size_t operator[](const rdtree& tree, size_t node, uint8_t) { + if (node == npos) { + return npos; + } + + size_t prnt = tree.parent(node); + size_t next = tree.next(node); + + if (node != head) { + if (next != npos) { + visit.push_front(tree.left_most(next)); + } else { + visit.push_front(prnt); + } + } + if (not visit.empty()) { node = visit.front(); visit.pop_front(); } else { - return npos; + node = npos; } - if (node == head) { - return node; - } - - size_t next = tree.next(node); - visit.push_back(next != npos ? tree.left_most(next) : tree.parent(node)); - return node; } }; @@ -509,7 +529,7 @@ protected: constexpr void _erase(size_t i) { list queue; queue.push_back(child(i)); - while (queue.empty() == false) { + while (not queue.empty()) { size_t n = queue.front(); queue.pop_front(); if (n == npos) continue; queue.push_back(next(n)); diff --git a/test/tests/containers/test_rdtree.h b/test/tests/containers/test_rdtree.h index 45ed064..da471bd 100644 --- a/test/tests/containers/test_rdtree.h +++ b/test/tests/containers/test_rdtree.h @@ -35,7 +35,7 @@ inline void fennec_test_containers_rdtree() { tree_t test; constexpr size_t npos = rdtree::npos; constexpr size_t pre_order [] = { 1, 2, 4, 5, 3, 6 }; - constexpr size_t in_order [] = { 4, 2, 5, 1, 3, 6 }; + constexpr size_t in_order [] = { 4, 2, 5, 1, 6, 3 }; constexpr size_t post_order[] = { 4, 5, 2, 6, 3, 1 }; const size_t n = 50; @@ -53,8 +53,14 @@ inline void fennec_test_containers_rdtree() { assertf(next == rdtree::npos || test.prev(next) == l, "Tree Construct Test Failed"); } + fennec_test_spacer(1); + test.erase(0); + fennec_test_run(test.empty(), true); + + fennec_test_spacer(1); + size_t n1 = test.insert(npos, 0, 1); size_t n2 = test.insert(n1, 0, 2); size_t n3 = test.insert(n1, npos, 3); @@ -94,6 +100,8 @@ inline void fennec_test_containers_rdtree() { return traversal_control_continue; }); + fennec_test_spacer(1); + test.erase(0); fennec_test_run(test.empty(), true);