#pragma once #include #include class CBitFlags8 { public: using storage_type = std::uint8_t; constexpr CBitFlags8() = default; constexpr explicit CBitFlags8(storage_type v) : bits_(v) {} constexpr bool operator[](std::size_t i) const noexcept { assert(i < 8); return (bits_ >> i) & 1u; } constexpr void set(std::size_t i, bool value = true) noexcept { assert(i < 8); if (value) { bits_ |= (storage_type(1) << i); } else { bits_ &= ~(storage_type(1) << i); } } constexpr void reset(std::size_t i) noexcept { set(i, false); } constexpr void toggle(std::size_t i) noexcept { assert(i < 8); bits_ ^= (storage_type(1) << i); } constexpr void clear() noexcept { bits_ = 0; } constexpr storage_type raw() const noexcept { return bits_; } private: storage_type bits_ = 0; }; static_assert(sizeof(CBitFlags8) == 1);