17 static_assert((InternalCapacity % 64) == 0);
19 SmallVector<u64, InternalCapacity / 64> data;
25 : data(other.data), bit_size(other.bit_size) {}
28 data = std::move(other.data);
29 bit_size = other.bit_size;
35 bit_size = other.bit_size;
42 data = std::move(data);
43 bit_size = other.bit_size;
48 void clear()
noexcept {
53 void resize(
const u32 bit_size)
noexcept {
54 const auto byte_size = align_up(bit_size, 64) / 64;
55 if (bit_size > this->bit_size && this->bit_size != 0) {
56 const auto last_bits = this->bit_size & 63;
57 const auto set_mask = (1ull << last_bits) - 1;
58 data.back() = data.back() & set_mask;
61 data.resize(byte_size);
62 this->bit_size = bit_size;
66 for (
auto &v : data) {
71 void push_back(
const bool val)
noexcept {
72 if (bit_size / 64 != (bit_size - 1) / 64) {
83 mark_unset(bit_size++);
87 [[nodiscard]]
bool is_set(
const u32 idx)
const noexcept {
88 const u32 elem_idx = idx >> 6;
89 const u64 bit = 1ull << (idx & 63);
90 return data[elem_idx] & bit;
93 void mark_set(
const u32 idx)
noexcept {
94 const u32 elem_idx = idx >> 6;
95 const u64 bit = 1ull << (idx & 63);
96 data[elem_idx] |= bit;
99 void mark_unset(
const u32 idx)
noexcept {
100 const u32 elem_idx = idx >> 6;
101 const u64 bit = 1ull << (idx & 63);
102 data[elem_idx] &= ~bit;
105 std::optional<u32> first_set()
noexcept {
106 for (u32 i = 0; i < data.size(); ++i) {
110 return i + util::cnt_tz(data[i]);