LCOV - code coverage report
Current view: top level - asyncImpl/include/async - Queue.h (source / functions) Hit Total Coverage
Test: coverage.info Lines: 32 32 100.0 %
Date: 2025-04-15 08:32:23 Functions: 1 1 100.0 %

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

Generated by: LCOV version 1.14