LCOV - code coverage report
Current view: top level - asmjit - zonelist.h (source / functions) Hit Total Coverage
Test: plumed test coverage (other modules) Lines: 15 24 62.5 %
Date: 2026-11-05 10:19:06 Functions: 0 1 0.0 %

          Line data    Source code
       1             : #ifdef __PLUMED_HAS_ASMJIT
       2             : // This file is part of AsmJit project <https://asmjit.com>
       3             : //
       4             : // See asmjit.h or LICENSE.md for license and copyright information
       5             : // SPDX-License-Identifier: Zlib
       6             : 
       7             : #ifndef ASMJIT_CORE_ZONELIST_H_INCLUDED
       8             : #define ASMJIT_CORE_ZONELIST_H_INCLUDED
       9             : 
      10             : #include "support.h"
      11             : 
      12             : ASMJIT_BEGIN_NAMESPACE
      13             : 
      14             : //! \addtogroup asmjit_zone
      15             : //! \{
      16             : 
      17             : //! Node used by \ref ZoneList template.
      18             : template<typename NodeT>
      19             : class ZoneListNode {
      20             : public:
      21             :   ASMJIT_NONCOPYABLE(ZoneListNode)
      22             : 
      23             :   //! \name Constants
      24             :   //! \{
      25             : 
      26             :   enum : size_t {
      27             :     kNodeIndexPrev = 0,
      28             :     kNodeIndexNext = 1
      29             :   };
      30             : 
      31             :   //! \}
      32             : 
      33             :   //! \name Members
      34             :   //! \{
      35             : 
      36             :   NodeT* _listNodes[2];
      37             : 
      38             :   //! \}
      39             : 
      40             :   //! \name Construction & Destruction
      41             :   //! \{
      42             : 
      43       27392 :   inline ZoneListNode() noexcept
      44       27392 :     : _listNodes { nullptr, nullptr } {}
      45             : 
      46             :   inline ZoneListNode(ZoneListNode&& other) noexcept
      47             :     : _listNodes { other._listNodes[0], other._listNodes[1] } {}
      48             : 
      49             :   //! \}
      50             : 
      51             :   //! \name Accessors
      52             :   //! \{
      53             : 
      54           0 :   inline bool hasPrev() const noexcept { return _listNodes[kNodeIndexPrev] != nullptr; }
      55         100 :   inline bool hasNext() const noexcept { return _listNodes[kNodeIndexNext] != nullptr; }
      56             : 
      57           0 :   inline NodeT* prev() const noexcept { return _listNodes[kNodeIndexPrev]; }
      58       27392 :   inline NodeT* next() const noexcept { return _listNodes[kNodeIndexNext]; }
      59             : 
      60             :   //! \}
      61             : };
      62             : 
      63             : //! Zone allocated list container that uses nodes of `NodeT` type.
      64             : template <typename NodeT>
      65             : class ZoneList {
      66             : public:
      67             :   ASMJIT_NONCOPYABLE(ZoneList)
      68             : 
      69             :   //! \name Constants
      70             :   //! \{
      71             : 
      72             :   enum : size_t {
      73             :     kNodeIndexFirst = 0,
      74             :     kNodeIndexLast = 1
      75             :   };
      76             : 
      77             :   //! \}
      78             : 
      79             :   //! \name Members
      80             :   //! \{
      81             : 
      82             :   NodeT* _nodes[2];
      83             : 
      84             :   //! \}
      85             : 
      86             :   //! \name Construction & Destruction
      87             :   //! \{
      88             : 
      89       27422 :   inline ZoneList() noexcept
      90       27422 :     : _nodes { nullptr, nullptr } {}
      91             : 
      92             :   inline ZoneList(ZoneList&& other) noexcept
      93             :     : _nodes { other._nodes[0], other._nodes[1] } {}
      94             : 
      95             :   inline void reset() noexcept {
      96       27422 :     _nodes[0] = nullptr;
      97       27422 :     _nodes[1] = nullptr;
      98             :   }
      99             : 
     100             :   //! \}
     101             : 
     102             :   //! \name Accessors
     103             :   //! \{
     104             : 
     105             :   inline bool empty() const noexcept { return _nodes[0] == nullptr; }
     106       55014 :   inline NodeT* first() const noexcept { return _nodes[kNodeIndexFirst]; }
     107       27392 :   inline NodeT* last() const noexcept { return _nodes[kNodeIndexLast]; }
     108             : 
     109             :   //! \}
     110             : 
     111             :   //! \name Utilities
     112             :   //! \{
     113             : 
     114             :   inline void swap(ZoneList& other) noexcept {
     115             :     std::swap(_nodes[0], other._nodes[0]);
     116             :     std::swap(_nodes[1], other._nodes[1]);
     117             :   }
     118             : 
     119             :   // Can be used to both append and prepend.
     120             :   inline void _addNode(NodeT* node, size_t dir) noexcept {
     121       27392 :     NodeT* prev = _nodes[dir];
     122             : 
     123       27392 :     node->_listNodes[!dir] = prev;
     124       27392 :     _nodes[dir] = node;
     125       27392 :     if (prev)
     126           0 :       prev->_listNodes[dir] = node;
     127             :     else
     128       27392 :       _nodes[!dir] = node;
     129             :   }
     130             : 
     131             :   // Can be used to both append and prepend.
     132             :   inline void _insertNode(NodeT* ref, NodeT* node, size_t dir) noexcept {
     133             :     ASMJIT_ASSERT(ref != nullptr);
     134             : 
     135             :     NodeT* prev = ref;
     136             :     NodeT* next = ref->_listNodes[dir];
     137             : 
     138             :     prev->_listNodes[dir] = node;
     139             :     if (next)
     140             :       next->_listNodes[!dir] = node;
     141             :     else
     142             :       _nodes[dir] = node;
     143             : 
     144             :     node->_listNodes[!dir] = prev;
     145             :     node->_listNodes[ dir] = next;
     146             :   }
     147             : 
     148             :   inline void append(NodeT* node) noexcept { _addNode(node, kNodeIndexLast); }
     149             :   inline void prepend(NodeT* node) noexcept { _addNode(node, kNodeIndexFirst); }
     150             : 
     151             :   inline void insertAfter(NodeT* ref, NodeT* node) noexcept { _insertNode(ref, node, NodeT::kNodeIndexNext); }
     152             :   inline void insertBefore(NodeT* ref, NodeT* node) noexcept { _insertNode(ref, node, NodeT::kNodeIndexPrev); }
     153             : 
     154           0 :   inline NodeT* unlink(NodeT* node) noexcept {
     155             :     NodeT* prev = node->prev();
     156             :     NodeT* next = node->next();
     157             : 
     158           0 :     if (prev) { prev->_listNodes[1] = next; node->_listNodes[0] = nullptr; } else { _nodes[0] = next; }
     159           0 :     if (next) { next->_listNodes[0] = prev; node->_listNodes[1] = nullptr; } else { _nodes[1] = prev; }
     160             : 
     161           0 :     node->_listNodes[0] = nullptr;
     162           0 :     node->_listNodes[1] = nullptr;
     163             : 
     164           0 :     return node;
     165             :   }
     166             : 
     167             :   inline NodeT* popFirst() noexcept {
     168             :     NodeT* node = _nodes[0];
     169             :     ASMJIT_ASSERT(node != nullptr);
     170             : 
     171             :     NodeT* next = node->next();
     172             :     _nodes[0] = next;
     173             : 
     174             :     if (next) {
     175             :       next->_listNodes[0] = nullptr;
     176             :       node->_listNodes[1] = nullptr;
     177             :     }
     178             :     else {
     179             :       _nodes[1] = nullptr;
     180             :     }
     181             : 
     182             :     return node;
     183             :   }
     184             : 
     185             :   inline NodeT* pop() noexcept {
     186             :     NodeT* node = _nodes[1];
     187             :     ASMJIT_ASSERT(node != nullptr);
     188             : 
     189             :     NodeT* prev = node->prev();
     190             :     _nodes[1] = prev;
     191             : 
     192             :     if (prev) {
     193             :       prev->_listNodes[1] = nullptr;
     194             :       node->_listNodes[0] = nullptr;
     195             :     }
     196             :     else {
     197             :       _nodes[0] = nullptr;
     198             :     }
     199             : 
     200             :     return node;
     201             :   }
     202             : 
     203             :   //! \}
     204             : };
     205             : 
     206             : //! \}
     207             : 
     208             : ASMJIT_END_NAMESPACE
     209             : 
     210             : #endif // ASMJIT_CORE_ZONELIST_H_INCLUDED
     211             : 
     212             : #endif // __PLUMED_HAS_ASMJIT

Generated by: LCOV version 1.16