diff options
| author | Tyge Løvset <[email protected]> | 2020-07-24 15:54:10 +0200 |
|---|---|---|
| committer | Tyge Løvset <[email protected]> | 2020-07-24 15:54:10 +0200 |
| commit | a8a7f8359e21a46019682328c7d4ad13739678f2 (patch) | |
| tree | 649e4fb7af2a8b766e5470a57cb88425377c752c | |
| parent | 54e135b6453fed2cd210bd9b738eb69fdde93a88 (diff) | |
| download | STC-modified-a8a7f8359e21a46019682328c7d4ad13739678f2.tar.gz STC-modified-a8a7f8359e21a46019682328c7d4ad13739678f2.zip | |
Fixed cbitset_resize(). Added front()/back() macros to CVec.
| -rw-r--r-- | stc/cbitset.h | 18 | ||||
| -rw-r--r-- | 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;}
@@ -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) \
|
