IntrusiveQueue add remove method, iterators, and update test

This commit is contained in:
Daniel Agar
2019-06-13 10:47:27 -04:00
parent 327354705b
commit 1623de8bd0
2 changed files with 109 additions and 0 deletions
+52
View File
@@ -95,6 +95,58 @@ public:
return ret;
}
bool remove(T removeNode)
{
// base case
if (removeNode == _head) {
if (_head->next_intrusive_queue_node() != nullptr) {
_head = _head->next_intrusive_queue_node();
} else {
_head = nullptr;
}
return true;
}
for (T node = _head; node != nullptr; node = node->next_intrusive_queue_node()) {
// is sibling the node to remove?
if (node->next_intrusive_queue_node() == removeNode) {
// replace sibling
if (node->next_intrusive_queue_node() != nullptr) {
node->set_next_intrusive_queue_node(node->next_intrusive_queue_node()->next_intrusive_queue_node());
} else {
node->set_next_intrusive_queue_node(nullptr);
}
return true;
}
}
return false;
}
struct Iterator {
T node;
Iterator(T v) : node(v) {}
operator T() const { return node; }
operator T &() { return node; }
T operator* () const { return node; }
Iterator &operator++ ()
{
if (node) {
node = node->next_intrusive_queue_node();
};
return *this;
}
};
Iterator begin() { return Iterator(_head); }
Iterator end() { return Iterator(nullptr); }
private:
T _head{nullptr};