- 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 {
|
struct pre_order {
|
||||||
list<size_t> visit;
|
list<size_t> visit;
|
||||||
|
size_t head;
|
||||||
|
|
||||||
size_t operator()(const rdtree&, size_t start) {
|
size_t operator()(const rdtree&, size_t start) {
|
||||||
|
head = start;
|
||||||
return start;
|
return start;
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t operator[](const rdtree& tree, size_t node, uint8_t mode) {
|
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()) {
|
if (not visit.empty()) {
|
||||||
node = visit.front();
|
node = visit.front();
|
||||||
visit.pop_front();
|
visit.pop_front();
|
||||||
} else {
|
} else {
|
||||||
return npos;
|
node = 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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return node;
|
return node;
|
||||||
@@ -379,23 +386,28 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
size_t operator[](const rdtree& tree, size_t node, uint8_t) {
|
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()) {
|
if (not visit.empty()) {
|
||||||
node = visit.front();
|
node = visit.front();
|
||||||
visit.pop_front();
|
visit.pop_front();
|
||||||
} else {
|
} else {
|
||||||
return npos;
|
node = 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));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return node;
|
return node;
|
||||||
@@ -412,20 +424,28 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
size_t operator[](const rdtree& tree, size_t node, uint8_t) {
|
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()) {
|
if (not visit.empty()) {
|
||||||
node = visit.front();
|
node = visit.front();
|
||||||
visit.pop_front();
|
visit.pop_front();
|
||||||
} else {
|
} 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;
|
return node;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@@ -509,7 +529,7 @@ protected:
|
|||||||
constexpr void _erase(size_t i) {
|
constexpr void _erase(size_t i) {
|
||||||
list<size_t> queue;
|
list<size_t> queue;
|
||||||
queue.push_back(child(i));
|
queue.push_back(child(i));
|
||||||
while (queue.empty() == false) {
|
while (not queue.empty()) {
|
||||||
size_t n = queue.front(); queue.pop_front();
|
size_t n = queue.front(); queue.pop_front();
|
||||||
if (n == npos) continue;
|
if (n == npos) continue;
|
||||||
queue.push_back(next(n));
|
queue.push_back(next(n));
|
||||||
|
|||||||
@@ -35,7 +35,7 @@ inline void fennec_test_containers_rdtree() {
|
|||||||
tree_t test;
|
tree_t test;
|
||||||
constexpr size_t npos = rdtree<size_t>::npos;
|
constexpr size_t npos = rdtree<size_t>::npos;
|
||||||
constexpr size_t pre_order [] = { 1, 2, 4, 5, 3, 6 };
|
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 };
|
constexpr size_t post_order[] = { 4, 5, 2, 6, 3, 1 };
|
||||||
|
|
||||||
const size_t n = 50;
|
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");
|
assertf(next == rdtree<size_t>::npos || test.prev(next) == l, "Tree Construct Test Failed");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fennec_test_spacer(1);
|
||||||
|
|
||||||
test.erase(0);
|
test.erase(0);
|
||||||
|
|
||||||
|
fennec_test_run(test.empty(), true);
|
||||||
|
|
||||||
|
fennec_test_spacer(1);
|
||||||
|
|
||||||
size_t n1 = test.insert(npos, 0, 1);
|
size_t n1 = test.insert(npos, 0, 1);
|
||||||
size_t n2 = test.insert(n1, 0, 2);
|
size_t n2 = test.insert(n1, 0, 2);
|
||||||
size_t n3 = test.insert(n1, npos, 3);
|
size_t n3 = test.insert(n1, npos, 3);
|
||||||
@@ -94,6 +100,8 @@ inline void fennec_test_containers_rdtree() {
|
|||||||
return traversal_control_continue;
|
return traversal_control_continue;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
fennec_test_spacer(1);
|
||||||
|
|
||||||
test.erase(0);
|
test.erase(0);
|
||||||
|
|
||||||
fennec_test_run(test.empty(), true);
|
fennec_test_run(test.empty(), true);
|
||||||
|
|||||||
Reference in New Issue
Block a user