#include <stdexcept>
#include "bit-vector.hpp"
+#include <cstdio>
static inline uint8_t pow2_mult8(uint8_t x){
return (~((x & (x-1))==0) + 1) & (x >> 3);
}
-
-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)
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);
+
+ 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;
+ uint32_t mask = 1 << (W - 1 - j);
if (b)
_vector[i] |= mask;
else
*/
inline bool bit_vector::unsafe_get(size_t idx) const
{
- return (_vector[idx / W] >> (idx % W)) & true;
+ size_t i = idx / W;
+ size_t j = idx % W;
+ return (_vector[i] >> (W - 1 - j)) & true;
};
/** Unsafe version of get_field. Does not perform bound checking.
*/
inline uint32_t bit_vector::unsafe_get_field(size_t idx, size_t len) const
{
+ //TODO FIX TO REFLECT BIG ENDIAN ORDER.
switch (len){
case 8:
return ((uint8_t*)_vector)[idx];