Add reserve for bitset
Fix bug in resize for bitset
This commit is contained in:
1 parent
418d868b1d
commit
f57968fcd8
2 files changed
+39
-8
No files matched your search
+30
-8
@@ -171,19 +171,41 @@ static inline void
|
||||
bitset_resize (bitset_t v, size_t size)
|
||||
{
|
||||
BITSETI_CONTRACT (v);
|
||||
size_t oldbytes = BITSETI_TO_ALLOC (v->size);
|
||||
size_t newbytes = BITSETI_TO_ALLOC (size);
|
||||
if (oldbytes != newbytes) {
|
||||
bitset_limb *ptr = M_MEMORY_REALLOC (bitset_limb, v->ptr, newbytes);
|
||||
size_t newAlloc = BITSETI_TO_ALLOC (size);
|
||||
if (newAlloc > v->alloc) {
|
||||
bitset_limb *ptr = M_MEMORY_REALLOC (bitset_limb, v->ptr, newAlloc);
|
||||
if (M_UNLIKELY (ptr == NULL) ) {
|
||||
M_MEMORY_FULL(newbytes);
|
||||
M_MEMORY_FULL(newAlloc * sizeof(bitset_limb));
|
||||
return;
|
||||
}
|
||||
v->ptr = ptr;
|
||||
v->alloc = newbytes;
|
||||
v->alloc = newAlloc;
|
||||
}
|
||||
v->size = size;
|
||||
//FIXME: Last bit are not cleared.
|
||||
//TODO: More efficient!
|
||||
size_t i = v->size;
|
||||
v->size = size;
|
||||
for( ; i < size; i++)
|
||||
bitset_set_at(v, i, 0);
|
||||
BITSETI_CONTRACT (v);
|
||||
}
|
||||
|
||||
static inline void
|
||||
bitset_reserve (bitset_t v, size_t size)
|
||||
{
|
||||
BITSETI_CONTRACT (v);
|
||||
size_t oldbytes = BITSETI_TO_ALLOC (v->size);
|
||||
size_t newbytes = BITSETI_TO_ALLOC (size);
|
||||
if (oldbytes > newbytes) {
|
||||
newbytes = oldbytes;
|
||||
}
|
||||
bitset_limb *ptr = M_MEMORY_REALLOC (bitset_limb, v->ptr, newbytes);
|
||||
if (M_UNLIKELY (ptr == NULL) ) {
|
||||
M_MEMORY_FULL(newbytes);
|
||||
return;
|
||||
}
|
||||
v->ptr = ptr;
|
||||
v->alloc = newbytes;
|
||||
BITSETI_CONTRACT (v);
|
||||
}
|
||||
|
||||
@@ -625,6 +647,6 @@ bitset_hash(const bitset_t dest)
|
||||
,EQUAL(bitset_equal_p) \
|
||||
)
|
||||
|
||||
// TODO: set_at2, insert_v, remove_v, reserve
|
||||
// TODO: set_at2, insert_v, remove_v
|
||||
|
||||
#endif
|
||||
@@ -54,6 +54,15 @@ static void test1(void)
|
||||
for(int i = 0; i < 50; i ++) {
|
||||
assert (bitset_get(set2, i) == (i%2));
|
||||
}
|
||||
bitset_reserve(set2, 100);
|
||||
assert(bitset_capacity(set2) >= 100); // rounded
|
||||
bitset_reserve(set2, 0);
|
||||
assert(bitset_capacity(set2) >= 50 && bitset_capacity(set2) < 100); // rounded
|
||||
bitset_resize(set2, 100);
|
||||
for(int i = 50; i < 100; i ++) {
|
||||
assert (bitset_get(set2, i) == false);
|
||||
}
|
||||
bitset_resize(set2, 50);
|
||||
|
||||
// Push from 0
|
||||
bitset_push_at(set2, 0, 1);
|
||||
|
||||
Reference in new issue
Block a user