53 #ifndef __W_BITVECTOR_H 54 #define __W_BITVECTOR_H 61 template<
int BIT_COUNT>
93 int n =
sizeof(
data) /
sizeof(data[0]);
116 const uint64_t* mine = &data[0];
117 const uint64_t* theirs = &other.
data[0];
118 uint64_t* newvec = &merged.
data[0];
122 if (*mine == (*mine & *theirs)) {
125 *newvec = (*mine | *theirs);
137 for (
int i = 0; i <
WORDS; ++i) {
138 if ((data[i] & subset.
data[i]) != subset.
data[i]) {
149 for (
int i = 0; i <
WORDS; ++i) {
150 data[i] |= added.
data[i];
156 const char* sep =
"";
158 for (
int i = 0; i <
BITS; i++) {
183 for (
int i = 0; i <
WORDS; i++) {
191 for (
int i = 0; i <
WORDS; i++) {
199 for (
int i = 0; i <
BITS; i++) {
214 for (
int i = 0; i <
WORDS; i++) {
215 data[i] = other.
data[i];
219 #define BIT_VECTOR_PROLOGUE(idx) \ 220 w_assert1(idx < BITS); \ 221 Word wdex = idx / BITS_PER_WORD; \ 222 Word bdex = idx % BITS_PER_WORD 227 return (data[wdex] >> bdex) & 0x1;
238 data[wdex] |= (1ul << bdex);
244 data[wdex] &= ~(1ul << bdex);
247 #undef BIT_VECTOR_PROLOGUE 250 template<
int BIT_COUNT>
251 ostream& operator<<(ostream& o, const w_bitvector_t<BIT_COUNT>& t) {
252 const char* sep =
"";
254 for (
int i = 0; i < BIT_COUNT; i++) {
264 #endif // __W_BITVECTOR_H int words_overlap(w_bitvector_t &merged, const w_bitvector_t &other) const
OR-together and return merged vector.
Definition: w_bitvector.h:115
uint64_t Word
Definition: w_bitvector.h:68
#define w_assert1(x)
Level 1 should not add significant extra time.
Definition: w_base.h:198
void copy(const w_bitvector_t &other)
copy operator
Definition: w_bitvector.h:213
#define BIT_VECTOR_PROLOGUE(idx)
Definition: w_bitvector.h:219
bool overlap(w_bitvector_t &merged, const w_bitvector_t &other) const
OR-together and return merged vector.
Definition: w_bitvector.h:104
bool is_empty() const
true if all bits are clear
Definition: w_bitvector.h:189
bool is_set(Word idx) const
true if bit at index idx is set
Definition: w_bitvector.h:231
int num_bits_set() const
Definition: w_bitvector.h:197
Definition: w_bitvector.h:75
void clear_bit(Word idx)
clear bit at index idx
Definition: w_bitvector.h:242
w_bitvector_t()
Definition: w_bitvector.h:82
Definition: w_bitvector.h:65
int num_words() const
return size in words (unsigned long)
Definition: w_bitvector.h:92
Templated bitmap for arbitrary size in bits.
Definition: w_bitvector.h:62
void clear()
clear all bits
Definition: w_bitvector.h:182
Word get_bit(Word idx) const
Should use is_set()
Definition: w_bitvector.h:225
int num_bits() const
return size in bits
Definition: w_bitvector.h:87
Definition: w_bitvector.h:72
bool contains(const w_bitvector_t &subset) const
Definition: w_bitvector.h:136
uint64_t data[WORDS]
Definition: w_bitvector.h:78
bool is_full() const
true if all bits are set
Definition: w_bitvector.h:208
void merge(const w_bitvector_t &added)
Definition: w_bitvector.h:148
void set_bit(Word idx)
set bit at index idx
Definition: w_bitvector.h:236
ostream & print(ostream &o) const
Definition: w_bitvector.h:154