LCOV - code coverage report
Current view: top level - libs/bsw/common/include/util - Mask.h (source / functions) Coverage Total Hit
Test: coverage.info Lines: 100.0 % 16 16
Test Date: 2026-02-24 11:21:15 Functions: 100.0 % 7 7

            Line data    Source code
       1              : // Copyright 2024 Accenture.
       2              : 
       3              : /**
       4              :  * \file Mask.h
       5              :  */
       6              : #pragma once
       7              : 
       8              : #include <platform/estdint.h>
       9              : 
      10              : // This class is in the global scope for backwards compatibility
      11              : /**
      12              :  * Generic bitmask helper class
      13              :  *
      14              :  */
      15              : template<typename T, typename V = uint8_t>
      16              : class Mask
      17              : {
      18              : public:
      19              :     using mask_type = V;
      20              :     static_assert((sizeof(V) * 8) >= T::MAX_INDEX, "");
      21              : 
      22              :     Mask(V mask = V());
      23              : 
      24         2406 :     Mask(Mask const& mask) : fMask(mask.fMask) {}
      25              : 
      26              :     Mask& operator=(Mask const& mask)
      27              :     {
      28              :         fMask = mask.fMask;
      29              :         return *this;
      30              :     }
      31              : 
      32              :     Mask const operator&(Mask const& mask) const
      33              :     {
      34              :         V const result = static_cast<V>(fMask & mask.fMask);
      35              :         return Mask(result);
      36              :     }
      37              : 
      38              :     Mask const operator|(Mask const& mask) const
      39              :     {
      40              :         V const result = static_cast<V>(fMask | mask.fMask);
      41              :         return Mask(result);
      42              :     }
      43              : 
      44              :     Mask& operator|=(Mask const& mask)
      45              :     {
      46              :         fMask |= mask.fMask;
      47              :         return *this;
      48              :     }
      49              : 
      50              :     bool operator==(Mask const& mask) const { return fMask == mask.getMask(); }
      51              : 
      52              :     bool operator!=(Mask const& mask) const { return fMask != mask.getMask(); }
      53              : 
      54              :     V getMask() const { return fMask; }
      55              : 
      56              :     void setMask(V mask);
      57              : 
      58          404 :     void clear() { fMask = 0U; }
      59              : 
      60              :     bool isSet(V b) const;
      61              : 
      62          123 :     bool match(T const& t) const
      63              :     {
      64          123 :         V const v = static_cast<V>(1U) << t.toIndex();
      65          123 :         return (fMask & v) > 0U;
      66              :     }
      67              : 
      68              :     bool overlaps(Mask const& mask) const { return ((fMask & mask.getMask()) != 0U); }
      69              : 
      70              :     Mask& add(T const& t) { return (*this << t); }
      71              : 
      72              :     Mask& remove(T const& t) { return (*this >> t); }
      73              : 
      74          313 :     Mask& operator<<(T const& t)
      75              :     {
      76          313 :         V const v = static_cast<V>(1U) << t.toIndex();
      77          313 :         fMask     = static_cast<V>(fMask | v);
      78          313 :         return *this;
      79              :     }
      80              : 
      81              :     Mask& operator>>(T const& t)
      82              :     {
      83              :         V const v = static_cast<V>(1U) << t.toIndex();
      84              :         fMask     = (fMask & static_cast<V>(~v));
      85              :         return *this;
      86              :     }
      87              : 
      88          218 :     static V getOpenMask() { return ~static_cast<V>(0); }
      89              : 
      90          404 :     static Mask& getInstance()
      91              :     {
      92          404 :         static Mask theMaskInstance;
      93          404 :         theMaskInstance.clear();
      94          404 :         return theMaskInstance;
      95              :     }
      96              : 
      97              : private:
      98              :     V fMask;
      99              : };
     100              : 
     101              : /*
     102              :  * inline
     103              :  */
     104              : 
     105              : template<typename T, typename V>
     106          485 : inline Mask<T, V>::Mask(V const mask) : fMask(mask)
     107          485 : {}
     108              : 
     109              : template<typename T, typename V>
     110              : inline void Mask<T, V>::setMask(V const mask)
     111              : {
     112              :     fMask = mask;
     113              : }
     114              : 
     115              : template<typename T, typename V>
     116              : inline bool Mask<T, V>::isSet(V const b) const
     117              : {
     118              :     V const v = static_cast<V>(1U) << b;
     119              :     return (fMask & v) > 0U;
     120              : }
        

Generated by: LCOV version 2.0-1