Line data Source code
1 : // Copyright 2024 Accenture. 2 : 3 : /** 4 : * \ingroup async 5 : */ 6 : #ifndef GUARD_FA81A16F_4593_4FAF_899A_101D87027137 7 : #define GUARD_FA81A16F_4593_4FAF_899A_101D87027137 8 : 9 : #include <estd/functional.h> 10 : 11 : namespace async 12 : { 13 : template<typename Node> 14 : class Queue 15 : { 16 : public: 17 : Queue(); 18 : 19 : void enqueue(Node& node); 20 : Node* dequeue(); 21 : 22 : void clear(); 23 : void remove(Node& node); 24 : 25 : private: 26 : Node* _first; 27 : Node* _last; 28 : }; 29 : 30 : /** 31 : * Inline implementations. 32 : */ 33 : template<typename Node> 34 195 : Queue<Node>::Queue() : _first(nullptr), _last(nullptr) 35 : {} 36 : 37 : template<typename Node> 38 21 : void Queue<Node>::enqueue(Node& node) 39 : { 40 19 : node.enqueue(); 41 14 : if (_last != nullptr) 42 : { 43 8 : _last->setNext(&node); 44 : } 45 : else 46 : { 47 11 : _first = &node; 48 : } 49 17 : _last = &node; 50 8 : } 51 : 52 : template<typename Node> 53 24 : Node* Queue<Node>::dequeue() 54 : { 55 25 : if (_first != nullptr) 56 : { 57 14 : Node* const node = _first; 58 13 : if (_last == node) 59 : { 60 8 : _last = nullptr; 61 : } 62 14 : _first = node->dequeue(); 63 10 : return node; 64 : } 65 : return nullptr; 66 : } 67 : 68 : template<typename Node> 69 1 : void Queue<Node>::clear() 70 : { 71 3 : while (_first != nullptr) 72 : { 73 2 : _first = _first->dequeue(); 74 : } 75 1 : _last = nullptr; 76 : } 77 : 78 : template<typename Node> 79 4 : void Queue<Node>::remove(Node& node) 80 : { 81 4 : Node* prevNode = nullptr; 82 4 : Node* currentNode = _first; 83 6 : while (currentNode != nullptr) 84 : { 85 5 : if (currentNode == &node) 86 : { 87 3 : if (prevNode != nullptr) 88 : { 89 2 : prevNode->setNext(node.dequeue()); 90 : } 91 : else 92 : { 93 1 : _first = node.dequeue(); 94 : } 95 3 : if (_last == &node) 96 : { 97 1 : _last = prevNode; 98 : } 99 : break; 100 : } 101 2 : prevNode = currentNode; 102 2 : currentNode = currentNode->getNext(); 103 : } 104 4 : } 105 : 106 : } // namespace async 107 : 108 : #endif // GUARD_FA81A16F_4593_4FAF_899A_101D87027137