- Fixed rdtree traversers once more, a bug with initializing the queues was causing faulty results. Consider setting up more robust tests.
This commit is contained in:
@@ -342,27 +342,34 @@ public:
|
||||
|
||||
struct pre_order {
|
||||
list<size_t> 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<size_t> 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));
|
||||
|
||||
@@ -35,7 +35,7 @@ inline void fennec_test_containers_rdtree() {
|
||||
tree_t test;
|
||||
constexpr size_t npos = rdtree<size_t>::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<size_t>::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);
|
||||
|
||||
Reference in New Issue
Block a user