From a5b377745116de2b269cdfc5b90f08f46d0432d2 Mon Sep 17 00:00:00 2001 From: hovertank3d Date: Thu, 13 Nov 2025 23:02:56 +0100 Subject: initial commit --- include/util/bitset.hpp | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 include/util/bitset.hpp (limited to 'include/util/bitset.hpp') diff --git a/include/util/bitset.hpp b/include/util/bitset.hpp new file mode 100644 index 0000000..8798a4a --- /dev/null +++ b/include/util/bitset.hpp @@ -0,0 +1,48 @@ +#pragma once + +#include +#include +#include + +constexpr int bits_ceil(int bits) { + return bits / 8 + (bits % 8 > 0 ? 1 : 0); +} + +template +struct bitset : std::array { + using array_type = std::array; + +private: + struct bit_ref { + bitset &a; + int referenced_byte; + uint8_t referenced_bit_mask; + + bool operator=(bool b) { + if (b) + a.at(referenced_byte) |= referenced_bit_mask; + else + a.at(referenced_byte) &= ~referenced_bit_mask; + return b; + } + + constexpr operator bool() const { + return (a.at(referenced_byte) & referenced_bit_mask) > 0; + } + }; + +public: + template + constexpr bool operator [](T idx) const { + unsigned int i = (unsigned int)(idx); + assert(i < flags); + return (array_type::at(i/8) & (1 << (i%8))) > 0; + } + + template + bit_ref operator[](T idx) { + unsigned int i = (unsigned int)(idx); + assert(i < flags); + return bit_ref(*this, i/8, (1 << (i%8))); + } +}; \ No newline at end of file -- cgit v1.2.3