enum_bitfield_t
The enum_bitfield_t
is a size adaptive bitfiled strage with using enumeration as an indexing type for bitfields
storage type depends on value of enum_size_v<> for enum selecting minimal suitable unisgned intergral
Include the simple_enum/enum_bitfield.h
in your project to use enum_bitfield_t
enum_bitfield_t
Interface
template<enum_concept enum_type_t>
struct enum_bitfield_t;
enum struct color_t { red, green, blue, yellow, first = red, last = yellow };
{
enum_bitfield_t<color_t> colors;
colors[color_t::green] = true;
expect(colors[color_t::green]);
expect(not colors[color_t::red]);
expect(not colors[color_t::yellow]);
expect(enum_bitfield_t{red} != enum_bitfield_t{green});
static_assert(enum_bitfield_t{yellow, red} == enum_bitfield_t{yellow, red});
}
enum_bitfield_t support class template argument deducation when using arguments
{
// construction with varidic number of arguments
enum_bitfield_t colors{color_t::red, color_t::blue};
expect(colors[color_t::blue]);
expect(not colors[color_t::yellow]);
expect(not colors[color_t::green]);
expect(colors[color_t::red]);
colors[color_t::blue] = false;
expect(not colors[color_t::blue]);
}
// operators |, &, |=, &=, ~, ^, ^=
static_assert((enum_bitfield_t{v16, v21} | enum_bitfield_t{v31, v5})
== enum_bitfield_t{v21, v16, v5, v31});
static_assert((enum_bitfield_t{v16, v21, v34, v1} & enum_bitfield_t{v16, v21, v5})
== enum_bitfield_t{v21, v16});
enum_bitfield_t a{v36};
a &= enum_bitfield_t{v21};
expect(a == enum_bitfield_t<large_enum_t>{});
enum_bitfield_t b{v16, v21};
b |= enum_bitfield_t{v31, v5};
expect(b == enum_bitfield_t{v21, v16, v5, v31});
expect((enum_bitfield_t{v1, v2, v5, v6, v7} ^ enum_bitfield_t{v2, v5, v6}) == enum_bitfield_t{v1, v7});
static_assert((~enum_bitfield_t{v1, v2, v5, v6, v7}) == enum_bitfield_t{v0, v3, v4, v8});