summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorTyge Løvset <[email protected]>2020-07-24 15:54:10 +0200
committerTyge Løvset <[email protected]>2020-07-24 15:54:10 +0200
commita8a7f8359e21a46019682328c7d4ad13739678f2 (patch)
tree649e4fb7af2a8b766e5470a57cb88425377c752c
parent54e135b6453fed2cd210bd9b738eb69fdde93a88 (diff)
downloadSTC-modified-a8a7f8359e21a46019682328c7d4ad13739678f2.tar.gz
STC-modified-a8a7f8359e21a46019682328c7d4ad13739678f2.zip
Fixed cbitset_resize(). Added front()/back() macros to CVec.
-rw-r--r--stc/cbitset.h18
-rw-r--r--stc/cvec.h2
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) \