X-Git-Url: http://git.nguyen.vg/gitweb/?a=blobdiff_plain;f=bit-vector.cpp;h=2c401a5e5fffdadace770261f26e982659bec55a;hb=daf6549ca274aaa8d9c0b3964c5502f0f0f08d7d;hp=d69c1779025095b5520234bbd9b3e7abcca48efa;hpb=c6266d8fd1872fad45b18d3d554410d080b65099;p=SXSI%2FXMLTree.git diff --git a/bit-vector.cpp b/bit-vector.cpp index d69c177..2c401a5 100644 --- a/bit-vector.cpp +++ b/bit-vector.cpp @@ -1,5 +1,10 @@ + #include #include "bit-vector.hpp" +#include +extern "C" { +#include +} static inline uint8_t pow2_mult8(uint8_t x){ return (~((x & (x-1))==0) + 1) & (x >> 3); @@ -11,10 +16,9 @@ static inline size_t uint32bits(size_t bits){ } - -void array_copy(const uint32_t * src, uint32_t * dst, size_t len) +static void array_copy(const uint32_t * src, uint32_t * dst, size_t len) { - while (len--) *dst++ = *src++; + for(size_t i = 0; i < len; i++) dst[i] = src[i]; } size_t bit_vector::allocforsize(size_t bits) @@ -135,27 +139,40 @@ void bit_vector::pack() size_t nalloc = uint32bits(_size); uint32_t * nvector = new uint32_t[nalloc]; - array_copy(_vector,nvector,nalloc); - if (!_leaked) delete [] _vector; + array_copy(_vector, nvector, nalloc); + if (!_leaked && _vector) delete [] _vector; _alloc = nalloc; - _vector = nvector; - _leaked = false; + this->_vector = nvector; + this->_leaked = false; } //sets the idxth bit to b void bit_vector::set(size_t idx, bool b) { - size_t i = idx / sizeof(uint32_t); - size_t j = idx % sizeof(uint32_t); - grow(allocforsize(idx+1)); - if (idx >= _size) - _size = idx+1; - uint32_t mask = 1 << j; - if (b) - _vector[i] |= mask; - else - _vector[i] &= ~mask; + size_t i = idx / W; + size_t j = idx % W; + grow(allocforsize(idx+1)); + if (idx >= _size) + _size = idx+1; + uint32_t mask = 1 << (W - 1 - j); + if (b) + _vector[i] |= mask; + else + _vector[i] &= ~mask; +} +void bit_vector::set_le(size_t idx, bool b) +{ + size_t i = idx / W; + size_t j = idx % W; + grow(allocforsize(idx+1)); + if (idx >= _size) + _size = idx+1; + uint32_t mask = 1 << j; + if (b) + _vector[i] |= mask; + else + _vector[i] &= ~mask; } void bit_vector::push_back(bool b) @@ -221,3 +238,12 @@ uint32_t * bit_vector::get_vector() const array_copy(_vector,vector,_alloc); return vector; } + +void bit_vector::debug(void) const +{ + for(size_t i = 0; i < _size; i++) + fprintf(stderr, "%i ", get(i)); + fprintf(stderr, "\n"); + + +}