diff --git a/src/util/util_bit.h b/src/util/util_bit.h index 925edea8c..7c375d198 100644 --- a/src/util/util_bit.h +++ b/src/util/util_bit.h @@ -17,6 +17,7 @@ #include "util_math.h" #include +#include #include namespace dxvk::bit { @@ -291,5 +292,58 @@ namespace dxvk::bit { uint32_t m_dwords[Dwords]; }; - + + class BitMask { + + public: + + class iterator: public std::iterator { + public: + + explicit iterator(uint32_t flags) + : m_mask(flags) { } + + iterator& operator ++ () { + m_mask &= m_mask - 1; + return *this; + } + + iterator operator ++ (int) { + iterator retval = *this; + m_mask &= m_mask - 1; + return retval; + } + + uint32_t operator * () const { + return bsf(m_mask); + } + + bool operator == (iterator other) const { return m_mask == other.m_mask; } + bool operator != (iterator other) const { return m_mask != other.m_mask; } + + private: + + uint32_t m_mask; + + }; + + BitMask() { } + + BitMask(uint32_t n) + : m_mask(n) { } + + iterator begin() { + return iterator(m_mask); + } + + iterator end() { + return iterator(0); + } + + private: + + uint32_t m_mask; + + }; }