From a8a7f8359e21a46019682328c7d4ad13739678f2 Mon Sep 17 00:00:00 2001 From: Tyge Løvset Date: Fri, 24 Jul 2020 15:54:10 +0200 Subject: Fixed cbitset_resize(). Added front()/back() macros to CVec. --- stc/cbitset.h | 18 +++++++++++------- stc/cvec.h | 2 ++ 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/stc/cbitset.h b/stc/cbitset.h index 8ab4fe09..6f7c9c9b 100644 --- a/stc/cbitset.h +++ b/stc/cbitset.h @@ -50,6 +50,8 @@ int main() { typedef struct { uint64_t* _arr; size_t size; } CBitset; +#define cbitset_init {NULL, 0} + STC_INLINE void cbitset_setAll(CBitset *self, bool value); STC_INLINE CBitset cbitset_make(size_t size, bool value) { @@ -67,14 +69,16 @@ STC_INLINE void cbitset_destroy(CBitset* self) { } STC_INLINE void cbitset_resize(CBitset* self, size_t size, bool value) { - size_t newsz = (size + 63) >> 6, oldsz = (self->size + 63) >> 6; - self->_arr = (uint64_t *) realloc(self->_arr, newsz * 8); - memset(self->_arr + oldsz, value ? 0xff : 0x0, (newsz - oldsz) * 8); - if (self->size & 63) { - size_t idx = (self->size - 1) >> 6; uint64_t bits = (1ull << (self->size & 63)) - 1; - value ? (self->_arr[idx] |= ~bits) : (self->_arr[idx] &= bits); - } + size_t new_n = (size + 63) >> 6, osize = self->size, old_n = (osize + 63) >> 6; + self->_arr = (uint64_t *) realloc(self->_arr, new_n * 8); self->size = size; + if (new_n >= old_n) { + memset(self->_arr + old_n, value ? 0xff : 0x0, (new_n - old_n) * 8); + if (old_n > 0) { + uint64_t mask = (1ull << (osize & 63)) - 1; + value ? (self->_arr[old_n - 1] |= ~mask) : (self->_arr[old_n - 1] &= mask); + } + } } STC_INLINE size_t cbitset_size(CBitset set) {return set.size;} diff --git a/stc/cvec.h b/stc/cvec.h index 0ddeeb9b..5f393223 100644 --- a/stc/cvec.h +++ b/stc/cvec.h @@ -31,6 +31,8 @@ #define cvec_size(cv) _cvec_safe_size((cv).data) #define cvec_capacity(cv) _cvec_safe_capacity((cv).data) #define cvec_empty(cv) (_cvec_safe_size((cv).data) == 0) +#define cvec_front(cv) (cv).data[0] +#define cvec_back(cv) (cv).data[_cvec_size(cv) - 1] /* may have side effect */ #define declare_CVec(...) c_MACRO_OVERLOAD(declare_CVec, __VA_ARGS__) #define declare_CVec_2(tag, Value) \ -- cgit v1.2.3