blob: de5bd4991ff49e52368e04dfafcc92c32d82401e (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
|
#pragma once
#include <array>
#include <cassert>
#include <cstdint>
constexpr int bits_ceil(int bits)
{
return bits / 8 + (bits % 8 > 0 ? 1 : 0);
}
template <unsigned int flags, auto size = bits_ceil(flags)>
struct bitset : std::array<std::uint8_t, size> {
using array_type = std::array<std::uint8_t, size>;
private:
struct bit_ref {
bitset<flags>& 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 <class T>
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 <class T>
bit_ref operator[](T idx)
{
unsigned int i = (unsigned int)(idx);
assert(i < flags);
return bit_ref(*this, i / 8, (1 << (i % 8)));
}
};
|