From e6559eff9faaef0b9873fffc0b81df0f2a295dde Mon Sep 17 00:00:00 2001 From: Pavel Kirienko Date: Tue, 8 Apr 2014 18:59:15 +0400 Subject: [PATCH] Out of line methods in linked_list.hpp --- libuavcan/include/uavcan/linked_list.hpp | 156 +++++++++++++---------- 1 file changed, 87 insertions(+), 69 deletions(-) diff --git a/libuavcan/include/uavcan/linked_list.hpp b/libuavcan/include/uavcan/linked_list.hpp index 7d5a1460e3..814eb99388 100644 --- a/libuavcan/include/uavcan/linked_list.hpp +++ b/libuavcan/include/uavcan/linked_list.hpp @@ -49,83 +49,101 @@ public: T* get() const { return root_; } bool isEmpty() const { return get() == NULL; } - unsigned getLength() const - { - T* node = root_; - unsigned cnt = 0; - while (node) - { - cnt++; - node = node->getNextListNode(); - } - return cnt; - } + unsigned getLength() const; - void insert(T* node) - { - assert(node); - remove(node); // Making sure there will be no loops - node->setNextListNode(root_); - root_ = node; - } + void insert(T* node); /** * Inserts node A immediately before the node B where * predicate(B) -> true. */ template - void insertBefore(T* node, Predicate predicate) - { - assert(node); - remove(node); + void insertBefore(T* node, Predicate predicate); - if (root_ == NULL || predicate(root_)) - { - insert(node); - } - else - { - T* p = root_; - while (p->getNextListNode()) - { - if (predicate(p->getNextListNode())) - { - break; - } - p = p->getNextListNode(); - } - node->setNextListNode(p->getNextListNode()); - p->setNextListNode(node); - } - } - - bool remove(const T* node) - { - if (root_ == NULL || node == NULL) - { - return false; - } - - if (root_ == node) - { - root_ = root_->getNextListNode(); - return true; - } - else - { - T* p = root_; - while (p->getNextListNode()) - { - if (p->getNextListNode() == node) - { - p->setNextListNode(p->getNextListNode()->getNextListNode()); - return true; - } - p = p->getNextListNode(); - } - return false; - } - } + bool remove(const T* node); }; +// ---------------------------------------------------------------------------- + +/* + * LinkedListRoot<> + */ +template +unsigned LinkedListRoot::getLength() const +{ + T* node = root_; + unsigned cnt = 0; + while (node) + { + cnt++; + node = node->getNextListNode(); + } + return cnt; +} + +template +void LinkedListRoot::insert(T* node) +{ + assert(node); + remove(node); // Making sure there will be no loops + node->setNextListNode(root_); + root_ = node; +} + +template +template +void LinkedListRoot::insertBefore(T* node, Predicate predicate) +{ + assert(node); + remove(node); + + if (root_ == NULL || predicate(root_)) + { + insert(node); + } + else + { + T* p = root_; + while (p->getNextListNode()) + { + if (predicate(p->getNextListNode())) + { + break; + } + p = p->getNextListNode(); + } + node->setNextListNode(p->getNextListNode()); + p->setNextListNode(node); + } +} + +template +bool LinkedListRoot::remove(const T* node) +{ + if (root_ == NULL || node == NULL) + { + return false; + } + + if (root_ == node) + { + root_ = root_->getNextListNode(); + return true; + } + else + { + T* p = root_; + while (p->getNextListNode()) + { + if (p->getNextListNode() == node) + { + p->setNextListNode(p->getNextListNode()->getNextListNode()); + return true; + } + p = p->getNextListNode(); + } + return false; + } +} + }