22 #ifndef ELM_UTIL_BIT_VECTOR_H
23 #define ELM_UTIL_BIT_VECTOR_H
25 #include <elm/assert.h>
28 #include <elm/PreIterator.h>
35 static const int shift = 3;
43 inline int size(
void)
const;
44 inline bool bit(
int index)
const;
45 inline bool isEmpty(
void)
const;
50 inline void resize(
int new_size);
52 inline void set(
int index)
const;
53 inline void set(
int index,
bool value)
const;
54 inline void clear(
int index)
const;
57 inline void clear(
void);
58 inline void set(
void) { memset(bits, 0xff, bytes()); mask(); }
82 inline int item(
void)
const {
return i; }
83 inline bool ended(
void)
const {
return i >= bvec.
size(); }
84 inline void next(
void) {
do i++;
while(i < bvec.
size() && !bvec.
bit(i)); }
93 inline int item(
void)
const {
return i; }
94 inline bool ended(
void)
const {
return i >= bvec.
size(); }
95 inline void next(
void) {
do i++;
while(i < bvec.
size() && bvec.
bit(i)); }
99 inline operator bool(
void)
const;
123 inline void mask(
void)
const;
124 inline int bytes(
void)
const;
125 inline int byte_index(
int index)
const;
126 inline int bit_index(
int index)
const;
137 inline int BitVector::bytes(
void)
const {
138 return (_size + 7) / 8;
141 inline void BitVector::mask(
void)
const {
142 unsigned char mask = 0xff >> (8 - (_size % 8));
144 bits[bytes() - 1] &= mask;
147 inline int BitVector::byte_index(
int index)
const {
150 inline int BitVector::bit_index(
int index)
const {
155 ASSERTP(size > 0,
"size must be positive");
156 bits =
new unsigned char[bytes()];
158 memset(bits, set ? 0xff : 0, bytes());
162 bits =
new unsigned char[bytes()];
164 memcpy(bits, vec.bits, bytes());
177 ASSERTP(index < _size,
"index out of bounds");
178 return (bits[byte_index(index)] & (1 << bit_index(index))) != 0;
183 for(
int i = 0; i < bytes(); i++)
190 ASSERTP(_size == vec._size,
"bit vector must have the same size");
192 for(
int i = 0; i < bytes(); i++)
193 if(~bits[i] & vec.bits[i])
199 ASSERTP(_size == vec._size,
"bit vector must have the same size");
202 for(
int i = 0; i < bytes(); i++) {
203 if(~bits[i] & vec.bits[i])
205 if(bits[i] != vec.bits[i])
212 ASSERTP(_size == vec._size,
"bit vector must have the same size");
214 for(
int i = 0; i < bytes(); i++)
215 if(bits[i] != vec.bits[i])
221 ASSERTP(index < _size,
"index out of bounds");
222 bits[byte_index(index)] |= 1 << bit_index(index);
226 ASSERTP(index < _size,
"index out of bounds");
234 ASSERTP(index < _size,
"index out of bounds");
235 bits[byte_index(index)] &= ~(1 << bit_index(index));
239 ASSERTP(_size == vec._size,
"bit vectors must have the same size");
240 memcpy(bits, vec.bits, bytes());
244 memset(bits, 0, bytes());
248 for(
int i = 0; i < bytes(); i++)
253 ASSERTP(_size == vec._size,
"bit vectors must have the same size");
254 for(
int i = 0; i < bytes(); i++)
255 bits[i] |= vec.bits[i];
259 ASSERTP(_size == vec._size,
"bit vectors must have the same size");
260 for(
int i = 0; i < bytes(); i++)
261 bits[i] &= vec.bits[i];
265 ASSERTP(_size == vec._size,
"bit vectors must have the same size");
266 for(
int i = 0; i < bytes(); i++)
267 bits[i] &= ~vec.bits[i];
273 for(
int i = 0; i < bytes(); i++)
274 vec.bits[i] = ~ bits[i];
279 ASSERTP(_size == vec._size,
"bit vectors must have the same size");
281 for(
int i = 0; i < bytes(); i++)
282 res.bits[i] = bits[i] | vec.bits[i];
287 ASSERTP(_size == vec._size,
"bit vectors must have the same size");
289 for(
int i = 0; i < bytes(); i++)
290 res.bits[i] = bits[i] & vec.bits[i];
295 ASSERTP(_size == vec._size,
"bit vectors must have the same size");
297 for(
int i = 0; i < bytes(); i++)
298 res.bits[i] = bits[i] & ~vec.bits[i];
302 inline BitVector::operator bool(
void)
const {
375 int new_bytes = (new_size + 7) >> 3;
376 if(bytes() != new_bytes) {
379 bits =
new unsigned char[new_bytes];
386 #endif // ELM_UTIL_BIT_VECTOR_H
BitVector operator~(void) const
Definition: BitVector.h:310
bool includes(const BitVector &vec) const
Definition: BitVector.h:189
void set(T *target, int size, const T &v)
Definition: array.h:63
BitVector makeOr(const BitVector &vec) const
Definition: BitVector.h:278
Definition: PreIterator.h:29
BitVector(void)
Definition: BitVector.h:37
BitVector makeReset(const BitVector &vec) const
Definition: BitVector.h:294
bool equals(const BitVector &vec) const
Definition: BitVector.h:211
bool operator<(const BitVector &vec) const
Definition: BitVector.h:358
t::size __size(void) const
Definition: BitVector.h:118
BitVector makeAnd(const BitVector &vec) const
Definition: BitVector.h:286
bool ended(void) const
Definition: BitVector.h:94
int item(void) const
Definition: BitVector.h:93
WAHVector::word_t word_t
Definition: util_WAHVector.cpp:29
BitVector makeNot(void) const
Definition: BitVector.h:271
void clear(void)
Definition: BitVector.h:243
Definition: BitVector.h:77
bool includesStrictly(const BitVector &vec) const
Definition: BitVector.h:198
int countBits(void) const
Definition: util_BitVector.cpp:372
BitVector operator+(const BitVector &vec) const
Definition: BitVector.h:322
bool bit(int index) const
Definition: BitVector.h:176
uint32 size
Definition: int.h:41
~BitVector(void)
Definition: BitVector.h:167
bool operator<=(const BitVector &vec) const
Definition: BitVector.h:362
void next(void)
Definition: BitVector.h:84
Definition: BitVector.h:33
value_t value(CString name, int value)
Definition: rtti.h:40
bool operator>=(const BitVector &vec) const
Definition: BitVector.h:370
void resize(int new_size)
Definition: BitVector.h:374
int item(void) const
Definition: BitVector.h:82
OneIterator(const BitVector &bit_vector)
Definition: BitVector.h:81
bool operator==(const BitVector &vec) const
Definition: BitVector.h:350
BitVector operator-(const BitVector &vec) const
Definition: BitVector.h:326
int countOnes(void) const
Definition: util_BitVector.cpp:401
BitVector operator|(const BitVector &vec) const
Definition: BitVector.h:314
BitVector & operator+=(const BitVector &vec)
Definition: BitVector.h:340
BitVector operator&(const BitVector &vec) const
Definition: BitVector.h:318
uint8_t uint8
Definition: int.h:31
ZeroIterator(const BitVector &bit_vector)
Definition: BitVector.h:92
sys::SystemOutStream & out
Definition: system_SystemIO.cpp:101
bool isEmpty(void) const
Definition: BitVector.h:181
bool ended(void) const
Definition: BitVector.h:83
int size(void) const
Definition: BitVector.h:172
void set(void)
Definition: BitVector.h:58
BitVector & operator=(const BitVector &vec)
Definition: util_BitVector.cpp:93
AutoString & operator<<(CString str, const T &value)
Definition: AutoString.h:90
int countZeroes(void) const
Definition: BitVector.h:74
bool operator[](int index) const
Definition: BitVector.h:306
void applyReset(const BitVector &vec)
Definition: BitVector.h:264
BitVector & operator-=(const BitVector &vec)
Definition: BitVector.h:345
BitVector & operator|=(const BitVector &vec)
Definition: BitVector.h:330
void applyNot(void)
Definition: BitVector.h:247
void applyOr(const BitVector &vec)
Definition: BitVector.h:252
void applyAnd(const BitVector &vec)
Definition: BitVector.h:258
void print(io::Output &out) const
Definition: util_BitVector.cpp:363
Definition: BitVector.h:88
void copy(const BitVector &bits) const
Definition: BitVector.h:238
BitVector & operator&=(const BitVector &vec)
Definition: BitVector.h:335
bool operator>(const BitVector &vec) const
Definition: BitVector.h:366
bool operator!=(const BitVector &vec) const
Definition: BitVector.h:354
void next(void)
Definition: BitVector.h:95