#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))); } };