LCOV - code coverage report
Current view: top level - common/include/util - Mask.h (source / functions) Hit Total Coverage
Test: coverage.info Lines: 13 13 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             :  * \file Mask.h
       5             :  */
       6             : #ifndef GUARD_8D0525C5_14FD_4D1C_B139_6808D353F468
       7             : #define GUARD_8D0525C5_14FD_4D1C_B139_6808D353F468
       8             : 
       9             : #include <platform/estdint.h>
      10             : 
      11             : // This class is in the global scope for backwards compatibility
      12             : /**
      13             :  * Generic bitmask helper class
      14             :  *
      15             :  */
      16             : template<typename T, typename V = uint8_t>
      17             : class Mask
      18             : {
      19             : public:
      20             :     using mask_type = V;
      21             :     static_assert((sizeof(V) * 8) >= T::MAX_INDEX, "");
      22             : 
      23             :     Mask(V mask = V());
      24             : 
      25        1940 :     Mask(Mask const& mask) : fMask(mask.fMask) {}
      26             : 
      27             :     Mask& operator=(Mask const& mask)
      28             :     {
      29             :         fMask = mask.fMask;
      30             :         return *this;
      31             :     }
      32             : 
      33             :     Mask const operator&(Mask const& mask) const
      34             :     {
      35             :         V const result = static_cast<V>(fMask & mask.fMask);
      36             :         return Mask(result);
      37             :     }
      38             : 
      39             :     Mask const operator|(Mask const& mask) const
      40             :     {
      41             :         V const result = static_cast<V>(fMask | mask.fMask);
      42             :         return Mask(result);
      43             :     }
      44             : 
      45             :     Mask& operator|=(Mask const& mask)
      46             :     {
      47             :         fMask |= mask.fMask;
      48             :         return *this;
      49             :     }
      50             : 
      51             :     bool operator==(Mask const& mask) const { return fMask == mask.getMask(); }
      52             : 
      53             :     bool operator!=(Mask const& mask) const { return fMask != mask.getMask(); }
      54             : 
      55             :     V getMask() const { return fMask; }
      56             : 
      57             :     void setMask(V mask);
      58             : 
      59         447 :     void clear() { fMask = 0U; }
      60             : 
      61             :     bool isSet(V b) const;
      62             : 
      63         127 :     bool match(T const& t) const
      64             :     {
      65         127 :         V const v = static_cast<V>(1U) << t.toIndex();
      66         127 :         return (fMask & v) > 0U;
      67             :     }
      68             : 
      69             :     bool overlaps(Mask const& mask) const { return ((fMask & mask.getMask()) != 0U); }
      70             : 
      71             :     Mask& add(T const& t) { return (*this << t); }
      72             : 
      73             :     Mask& remove(T const& t) { return (*this >> t); }
      74             : 
      75         217 :     Mask& operator<<(T const& t)
      76             :     {
      77         377 :         V const v = static_cast<V>(1U) << t.toIndex();
      78         219 :         fMask     = static_cast<V>(fMask | v);
      79             :         return *this;
      80             :     }
      81             : 
      82             :     Mask& operator>>(T const& t)
      83             :     {
      84             :         V const v = static_cast<V>(1U) << t.toIndex();
      85             :         fMask     = (fMask & static_cast<V>(~v));
      86             :         return *this;
      87             :     }
      88             : 
      89             :     static V getOpenMask() { return ~static_cast<V>(0); }
      90             : 
      91         447 :     static Mask& getInstance()
      92             :     {
      93         447 :         static Mask theMaskInstance;
      94         447 :         theMaskInstance.clear();
      95         447 :         return theMaskInstance;
      96             :     }
      97             : 
      98             : private:
      99             :     V fMask;
     100             : };
     101             : 
     102             : /*
     103             :  * inline
     104             :  */
     105             : 
     106             : template<typename T, typename V>
     107         506 : inline Mask<T, V>::Mask(V const mask) : fMask(mask)
     108             : {}
     109             : 
     110             : template<typename T, typename V>
     111             : inline void Mask<T, V>::setMask(V const mask)
     112             : {
     113             :     fMask = mask;
     114             : }
     115             : 
     116             : template<typename T, typename V>
     117             : inline bool Mask<T, V>::isSet(V const b) const
     118             : {
     119             :     V const v = static_cast<V>(1U) << b;
     120             :     return (fMask & v) > 0U;
     121             : }
     122             : 
     123             : #endif /*GUARD_8D0525C5_14FD_4D1C_B139_6808D353F468*/

Generated by: LCOV version 1.14