#include "obst.h"
#define BITS_PER_ELEM (sizeof(unsigned) * 8)
-#define BITSET_SIZE_ELEMS(size_bits) ((size_bits)/BITS_PER_ELEM + 1)
+#define BITSET_SIZE_ELEMS(size_bits) ((size_bits+BITS_PER_ELEM-1)/BITS_PER_ELEM)
#define BITSET_SIZE_BYTES(size_bits) (BITSET_SIZE_ELEMS(size_bits) * sizeof(unsigned))
#define BITSET_ELEM(bitset,pos) bitset[pos / BITS_PER_ELEM]
unsigned i;
unsigned n = BITSET_SIZE_ELEMS(size);
+ if (n == 0)
+ return;
+
for (i = 0; i < n-1; ++i) {
bitset[i] = ~0u;
}
static inline void rbitset_flip_all(unsigned *bitset, unsigned size)
{
unsigned pos;
- unsigned n = BITSET_SIZE_ELEMS(size);
+ unsigned n = BITSET_SIZE_ELEMS(size);
+
+ if (n == 0)
+ return;
+
for (pos = 0; pos < n-1; ++pos) {
bitset[pos] ^= ~0u;
}
memcpy(dst, src, BITSET_SIZE_BYTES(size));
}
+static inline void rbitset_copy_into(unsigned *dst, const unsigned *src,
+ unsigned size)
+{
+ unsigned n = BITSET_SIZE_ELEMS(size);
+ unsigned last_mask = rbitset_last_mask_(size);
+
+ memcpy(dst, src, (n-1) * (BITS_PER_ELEM/8));
+ dst[n-1] = (src[n-1] & last_mask) | (dst[n-1] & ~last_mask);
+}
+
#endif