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 ++++++++++++++++++++++++++++++++++++++++++++++++ include/util/endian.hpp | 21 +++++++++++++++++++++ 2 files changed, 69 insertions(+) create mode 100644 include/util/bitset.hpp create mode 100644 include/util/endian.hpp (limited to 'include/util') 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 diff --git a/include/util/endian.hpp b/include/util/endian.hpp new file mode 100644 index 0000000..18e49f6 --- /dev/null +++ b/include/util/endian.hpp @@ -0,0 +1,21 @@ +#pragma once + +#include +#include + +template + requires(sizeof(T) <= 8) +T to_little(T x) +{ + if constexpr (std::endian::native == std::endian::little || sizeof(T) == 1) { + return x; + } + switch (sizeof(T)) { + case 2: + return __builtin_bswap16(x); + case 4: + return __builtin_bswap32(x); + case 8: + return __builtin_bswap64(x); + } +} \ No newline at end of file -- cgit v1.2.3