mirror of
https://gitee.com/mirrors_PX4/PX4-Autopilot.git
synced 2026-10-03 16:48:52 +08:00
IntrusiveQueue add remove method, iterators, and update test
This commit is contained in:
@@ -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};
|
||||
|
||||
Reference in New Issue
Block a user