Add util::flag_set for enum-based bitsets

This commit is contained in:
Nikita Lisitsa 2022-05-19 21:33:16 +03:00
parent 9d8e83d957
commit 5eab34a1dd

View file

@ -0,0 +1,53 @@
#pragma once
#include <type_traits>
#include <cstdint>
namespace psemek::util
{
template <typename Flag, typename Repr = std::uint32_t>
struct flag_set
{
using flag_type = Flag;
using underlying_type = std::conditional_t<std::is_enum_v<Flag>, std::underlying_type_t<Flag>, Flag>;
using repr_type = Repr;
repr_type value = repr_type{};
flag_set() = default;
flag_set(flag_set const &) = default;
template <typename ... Flags>
flag_set(Flags const & ... flags)
: value{((1 << static_cast<underlying_type>(flags)) | ...)}
{}
bool is_set(Flag const & flag) const
{
return value & (1 << static_cast<underlying_type>(flag));
}
void set(Flag const & flag)
{
value |= (1 << static_cast<underlying_type>(flag));
}
void flip(Flag const & flag)
{
value ^= (1 << static_cast<underlying_type>(flag));
}
void unset(Flag const & flag)
{
value &= ~(1 << static_cast<underlying_type>(flag));
}
void clear()
{
value = {};
}
};
}