- 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));
|
||||
|
||||
Reference in New Issue
Block a user