diff options
| author | hovertank3d <[email protected]> | 2025-11-13 23:02:56 +0100 |
|---|---|---|
| committer | hovertank3d <[email protected]> | 2025-11-13 23:06:37 +0100 |
| commit | a5b377745116de2b269cdfc5b90f08f46d0432d2 (patch) | |
| tree | 7aea9482dadc4d66df17907282f2359c54c9df0d /include/util/bitset.hpp | |
| download | ogurec-a5b377745116de2b269cdfc5b90f08f46d0432d2.tar.gz ogurec-a5b377745116de2b269cdfc5b90f08f46d0432d2.zip | |
initial commit
Diffstat (limited to 'include/util/bitset.hpp')
| -rw-r--r-- | include/util/bitset.hpp | 48 |
1 files changed, 48 insertions, 0 deletions
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 <array> +#include <cassert> +#include <cstdint> + +constexpr int bits_ceil(int bits) { + return bits / 8 + (bits % 8 > 0 ? 1 : 0); +} + +template <unsigned int flags, auto size = bits_ceil(flags)> +struct bitset : std::array<std::uint8_t, size> { + using array_type = std::array<std::uint8_t, size>; + +private: + struct bit_ref { + bitset<flags> &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<class T> + 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<class T> + 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 |
