diff --git a/FEXCore/Source/Common/BitSet.h b/FEXCore/Source/Common/BitSet.h index 988bf1a6e..e7e306514 100644 --- a/FEXCore/Source/Common/BitSet.h +++ b/FEXCore/Source/Common/BitSet.h @@ -18,7 +18,7 @@ struct BitSet final { constexpr static size_t MinimumSize = sizeof(ElementType); constexpr static size_t MinimumSizeBits = sizeof(ElementType) * 8; - ElementType* Memory; + ElementType* Memory {}; void Allocate(size_t Elements) { size_t AllocateSize = ToBytes(Elements); LOGMAN_THROW_A_FMT((AllocateSize * MinimumSize) >= Elements, "Fail"); @@ -33,14 +33,15 @@ struct BitSet final { FEXCore::Allocator::free(Memory); Memory = nullptr; } - bool Get(T Element) { + [[nodiscard]] + bool Get(T Element) const { return (Memory[Element / MinimumSizeBits] & (1ULL << (Element % MinimumSizeBits))) != 0; } void Set(T Element) { Memory[Element / MinimumSizeBits] |= (1ULL << (Element % MinimumSizeBits)); } void Clear(T Element) { - Memory[Element / MinimumSizeBits] &= (1ULL << (Element % MinimumSizeBits)); + Memory[Element / MinimumSizeBits] &= ~(1ULL << (Element % MinimumSizeBits)); } void MemClear(size_t Elements) { memset(Memory, 0, ToBytes(Elements)); @@ -48,13 +49,15 @@ struct BitSet final { void MemSet(size_t Elements) { memset(Memory, 0xFF, ToBytes(Elements)); } - uint32_t ToBytes(size_t Elements) { + [[nodiscard]] + uint32_t ToBytes(size_t Elements) const { return AlignUp(Elements, MinimumSizeBits) / MinimumSize; } // This very explicitly doesn't let you take an address // Is only a getter - bool operator[](T Element) { + [[nodiscard]] + bool operator[](T Element) const { return Get(Element); } }; @@ -65,21 +68,22 @@ struct BitSetView final { constexpr static size_t MinimumSize = sizeof(ElementType); constexpr static size_t MinimumSizeBits = sizeof(ElementType) * 8; - ElementType* Memory; + ElementType* Memory {}; void GetView(BitSet& Set, uint64_t ElementOffset) { LOGMAN_THROW_A_FMT((ElementOffset % MinimumSize) == 0, "Bitset view offset needs to be aligned to size of backing element"); Memory = &Set.Memory[ElementOffset / MinimumSizeBits]; } - bool Get(T Element) { + [[nodiscard]] + bool Get(T Element) const { return (Memory[Element / MinimumSizeBits] & (1ULL << (Element % MinimumSizeBits))) != 0; } void Set(T Element) { Memory[Element / MinimumSizeBits] |= (1ULL << (Element % MinimumSizeBits)); } void Clear(T Element) { - Memory[Element / MinimumSizeBits] &= (1ULL << (Element % MinimumSizeBits)); + Memory[Element / MinimumSizeBits] &= ~(1ULL << (Element % MinimumSizeBits)); } void MemClear(size_t Elements) { memset(Memory, 0, AlignUp(Elements / MinimumSizeBits, MinimumSizeBits)); @@ -90,7 +94,8 @@ struct BitSetView final { // This very explicitly doesn't let you take an address // Is only a getter - bool operator[](T Element) { + [[nodiscard]] + bool operator[](T Element) const { return Get(Element); } };