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-01-20 13:53:09 Functions: 1 1 100.0 %

          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

Generated by: LCOV version 1.14