24template <
int BITS>
class BitSet {
25 static_assert(BITS > 0 && BITS <= 128);
26 using Word = HostUnsignedIntType<(BITS <= 32 ? 32 : BITS)>;
27 static constexpr Word allBits{
28 ~static_cast<Word>(0) >> (8 *
sizeof(Word) - BITS)};
30 constexpr BitSet(Word b) : bits_{b} {}
34 constexpr BitSet(
const std::initializer_list<int> &xs) {
39 constexpr BitSet(
const BitSet &) =
default;
40 constexpr BitSet(BitSet &&) =
default;
41 constexpr BitSet &operator=(
const BitSet &) =
default;
42 constexpr BitSet &operator=(BitSet &&) =
default;
44 constexpr BitSet &operator&=(
const BitSet &that) {
48 constexpr BitSet &operator&=(BitSet &&that) {
52 constexpr BitSet &operator^=(
const BitSet &that) {
56 constexpr BitSet &operator^=(BitSet &&that) {
60 constexpr BitSet &operator|=(
const BitSet &that) {
64 constexpr BitSet &operator|=(BitSet &&that) {
69 constexpr BitSet operator~()
const {
return ~bits_; }
70 constexpr BitSet operator&(
const BitSet &that)
const {
71 return bits_ & that.bits_;
73 constexpr BitSet operator&(BitSet &&that)
const {
return bits_ & that.bits_; }
74 constexpr BitSet operator^(
const BitSet &that)
const {
75 return bits_ ^ that.bits_;
77 constexpr BitSet operator^(BitSet &&that)
const {
return bits_ & that.bits_; }
78 constexpr BitSet operator|(
const BitSet &that)
const {
79 return bits_ | that.bits_;
81 constexpr BitSet operator|(BitSet &&that)
const {
return bits_ | that.bits_; }
83 constexpr bool operator==(
const BitSet &that)
const {
84 return bits_ == that.bits_;
86 constexpr bool operator==(BitSet &&that)
const {
return bits_ == that.bits_; }
87 constexpr bool operator!=(
const BitSet &that)
const {
88 return bits_ != that.bits_;
90 constexpr bool operator!=(BitSet &&that)
const {
return bits_ != that.bits_; }
92 static constexpr std::size_t size() {
return BITS; }
93 constexpr bool test(std::size_t x)
const {
94 return x < BITS && ((bits_ >> x) & 1) != 0;
97 constexpr bool all()
const {
return bits_ == allBits; }
98 constexpr bool any()
const {
return bits_ != 0; }
99 constexpr bool none()
const {
return bits_ == 0; }
101 constexpr std::size_t count()
const {
return BitPopulationCount(bits_); }
103 constexpr BitSet &set() {
107 constexpr BitSet set(std::size_t x,
bool value =
true) {
111 bits_ |=
static_cast<Word
>(1) << x;
115 constexpr BitSet &reset() {
119 constexpr BitSet &reset(std::size_t x) {
120 bits_ &= ~(
static_cast<Word
>(1) << x);
123 constexpr BitSet &flip() {
127 constexpr BitSet &flip(std::size_t x) {
128 bits_ ^=
static_cast<Word
>(1) << x;
132 constexpr std::optional<std::size_t> LeastElement()
const {
136 return {TrailingZeroBitCount(bits_)};
140 Word bits()
const {
return bits_; }