+
#include <stdexcept>
#include "bit-vector.hpp"
+#include <cstdio>
+extern "C" {
+#include <unistd.h>
+}
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);
- 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)
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");
+
+
+}