From 4cff2c39e1bac80d9ab95f293c144bb6c0f30961 Mon Sep 17 00:00:00 2001 From: Tyge Løvset Date: Mon, 3 Aug 2020 23:40:58 +0200 Subject: Improved API. --- examples/bits.c | 6 ++--- examples/prime.c | 2 +- stc/cbitset.h | 69 ++++++++++++++++++++++++++++++++++++++------------------ stc/cstr.h | 29 ++++++++++-------------- stc/cvec.h | 64 +++++++++++++++++++++++++++++----------------------- 5 files changed, 99 insertions(+), 71 deletions(-) diff --git a/examples/bits.c b/examples/bits.c index 42f7931f..8b3ecd97 100644 --- a/examples/bits.c +++ b/examples/bits.c @@ -2,7 +2,7 @@ #include int main() { - cbitset_t set = cbitset_make(23, true); + cbitset_t set = cbitset_with_size(23, true); printf("count %zu, %zu\n", cbitset_count(set), set.size); cbitset_reset(&set, 9); cbitset_resize(&set, 43, false); @@ -21,7 +21,7 @@ int main() { printf("%d", cbitset_test(set, i)); puts(""); - cbitset_t s2 = cbitset_make_copy(set); + cbitset_t s2 = cbitset_clone(set); cbitset_flip_all(&s2); cbitset_set(&s2, 16); cbitset_set(&s2, 17); @@ -32,7 +32,7 @@ int main() { puts(""); printf(" xor: "); - cbitset_set_xor(&set, s2); + cbitset_xor_with(&set, s2); for (int i=0; i> 6) * 8), size}; cbitset_set_all(&set, value); return set; } -STC_INLINE cbitset_t cbitset_make_copy(cbitset_t other) { +STC_INLINE cbitset_t cbitset_clone(cbitset_t other) { size_t bytes = ((other.size + 63) >> 6) * 8; cbitset_t set = {(uint64_t *) memcpy(malloc(bytes), other._arr, bytes), other.size}; return set; @@ -101,38 +104,38 @@ STC_INLINE void cbitset_flip_all(cbitset_t *self) { for (size_t i=0; i_arr[i] ^= ~0ull; } /* Intersection */ -STC_INLINE void cbitset_set_and(cbitset_t *self, cbitset_t other) { +STC_INLINE void cbitset_intersect_with(cbitset_t *self, cbitset_t other) { assert(self->size == other.size); size_t n = (self->size + 63) >> 6; for (size_t i=0; i_arr[i] &= other._arr[i]; } /* Union */ -STC_INLINE void cbitset_set_or(cbitset_t *self, cbitset_t other) { +STC_INLINE void cbitset_union_with(cbitset_t *self, cbitset_t other) { assert(self->size == other.size); size_t n = (self->size + 63) >> 6; for (size_t i=0; i_arr[i] |= other._arr[i]; } /* Exclusive disjunction */ -STC_INLINE void cbitset_set_xor(cbitset_t *self, cbitset_t other) { +STC_INLINE void cbitset_xor_with(cbitset_t *self, cbitset_t other) { assert(self->size == other.size); size_t n = (self->size + 63) >> 6; for (size_t i=0; i_arr[i] ^= other._arr[i]; } -STC_INLINE cbitset_t cbitset_and(cbitset_t s1, cbitset_t s2) { - cbitset_t set = cbitset_make_copy(s1); - cbitset_set_and(&set, s2); return set; +STC_INLINE cbitset_t cbitset_intersect(cbitset_t s1, cbitset_t s2) { + cbitset_t set = cbitset_clone(s1); + cbitset_intersect_with(&set, s2); return set; } -STC_INLINE cbitset_t cbitset_or(cbitset_t s1, cbitset_t s2) { - cbitset_t set = cbitset_make_copy(s1); - cbitset_set_or(&set, s2); return set; +STC_INLINE cbitset_t cbitset_union(cbitset_t s1, cbitset_t s2) { + cbitset_t set = cbitset_clone(s1); + cbitset_union_with(&set, s2); return set; } STC_INLINE cbitset_t cbitset_xor(cbitset_t s1, cbitset_t s2) { - cbitset_t set = cbitset_make_copy(s1); - cbitset_set_xor(&set, s2); return set; + cbitset_t set = cbitset_clone(s1); + cbitset_xor_with(&set, s2); return set; } STC_INLINE cbitset_t cbitset_not(cbitset_t s1) { - cbitset_t set = cbitset_make_copy(s1); + cbitset_t set = cbitset_clone(s1); cbitset_flip_all(&set); return set; } @@ -145,8 +148,8 @@ STC_API void cbitset_resize(cbitset_t* self, size_t size, bool value) { 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); + uint64_t m = (1ull << (osize & 63)) - 1; /* mask */ + value ? (self->_arr[old_n - 1] |= ~m) : (self->_arr[old_n - 1] &= m); } } } @@ -168,15 +171,37 @@ static inline uint64_t c_popcount64(uint64_t x) { } #endif -STC_API size_t cbitset_count(cbitset_t set) { - size_t count = 0, n = ((set.size + 63) >> 6) - 1; - if (set.size > 0) { - for (size_t i=0; i> 6) - 1; + if (s.size > 0) { + for (size_t i=0; i> 6) - 1; \ + for (size_t i=0; istr[_cstr_size(*self) = len] = '\0'; } -STC_API cstr_t -cstr_make_reserved(size_t cap) { - if (cap == 0) return cstr_init; - size_t *rep = (size_t *) malloc(_cstr_mem(cap)); - cstr_t s = {(char *) (rep + 2)}; - rep[0] = 0, rep[1] = cap, s.str[0] = '\0'; - return s; -} - STC_API cstr_t cstr_make_n(const char* str, size_t len) { if (len == 0) return cstr_init; @@ -244,7 +239,7 @@ cstr_from(const char* fmt, ...) { va_start(args, fmt); int len = vsnprintf(c_nullptr, (size_t)0, fmt, args); if (len > 0) { - tmp = cstr_make_reserved(len); + tmp = cstr_with_capacity(len); vsprintf(tmp.str, fmt, args); _cstr_size(tmp) = len; } diff --git a/stc/cvec.h b/stc/cvec.h index 01cc718d..42d430a7 100644 --- a/stc/cvec.h +++ b/stc/cvec.h @@ -51,20 +51,45 @@ typedef struct cvec_##tag { \ Value* data; \ } cvec_##tag; \ \ -STC_INLINE cvec_##tag \ -cvec_##tag##_init(void) {cvec_##tag x = cvec_init; return x;} \ -STC_API cvec_##tag \ -cvec_##tag##_make(size_t size, Value null); \ -STC_API void \ -cvec_##tag##_push_n(cvec_##tag *self, const Value in[], size_t size); \ STC_API void \ cvec_##tag##_destroy(cvec_##tag* self); \ STC_API void \ cvec_##tag##_reserve(cvec_##tag* self, size_t cap); \ STC_API void \ -cvec_##tag##_clear(cvec_##tag* self); \ +cvec_##tag##_resize(cvec_##tag* self, size_t size, Value null_val); \ +STC_API void \ +cvec_##tag##_push_n(cvec_##tag *self, const Value in[], size_t size); \ STC_API void \ cvec_##tag##_push_back(cvec_##tag* self, Value value); \ +STC_API void \ +cvec_##tag##_insert(cvec_##tag* self, size_t pos, Value value); \ +STC_API void \ +cvec_##tag##_erase(cvec_##tag* self, size_t pos, size_t size); \ +STC_API void \ +cvec_##tag##_sort(cvec_##tag* self); \ +STC_API size_t \ +cvec_##tag##_find(const cvec_##tag* self, RawValue rawValue); \ + \ +STC_INLINE cvec_##tag \ +cvec_##tag##_init(void) { \ + cvec_##tag x = cvec_init; return x; \ +} \ +STC_INLINE cvec_##tag \ +cvec_##tag##_with_size(size_t size, Value null_val) { \ + cvec_##tag x = cvec_init; \ + cvec_##tag##_resize(&x, size, null_val); \ + return x; \ +} \ +STC_INLINE cvec_##tag \ +cvec_##tag##_with_capacity(size_t size) { \ + cvec_##tag x = cvec_init; \ + cvec_##tag##_reserve(&x, size); \ + return x; \ +} \ +STC_INLINE void \ +cvec_##tag##_clear(cvec_##tag* self) { \ + if (self->data) _cvec_size(*self) = 0; \ +} \ STC_INLINE void \ cvec_##tag##_pop_back(cvec_##tag* self) { \ valueDestroy(&self->data[_cvec_size(*self) - 1]); \ @@ -76,14 +101,6 @@ STC_INLINE Value* \ cvec_##tag##_back(cvec_##tag* self) {return self->data + _cvec_size(*self) - 1;} \ STC_INLINE Value* \ cvec_##tag##_at(cvec_##tag* self, size_t i) {return self->data + i;} \ -STC_API void \ -cvec_##tag##_insert(cvec_##tag* self, size_t pos, Value value); \ -STC_API void \ -cvec_##tag##_erase(cvec_##tag* self, size_t pos, size_t size); \ -STC_API void \ -cvec_##tag##_sort(cvec_##tag* self); \ -STC_API size_t \ -cvec_##tag##_find(const cvec_##tag* self, RawValue rawValue); \ STC_INLINE void \ cvec_##tag##_swap(cvec_##tag* a, cvec_##tag* b) { \ c_swap(Value*, a->data, b->data); \ @@ -114,14 +131,6 @@ typedef RawValue cvec_##tag##_rawvalue_t #if !defined(STC_HEADER) || defined(STC_IMPLEMENTATION) #define implement_cvec_6(tag, Value, valueDestroy, RawValue, valueCompareRaw, valueGetRaw) \ \ -STC_API cvec_##tag \ -cvec_##tag##_make(size_t size, Value null) { \ - cvec_##tag vec = cvec_init; \ - cvec_##tag##_reserve(&vec, size); \ - _cvec_size(vec) = size; \ - for (size_t i=0; idata[i] = null_val; \ + if (self->data) _cvec_size(*self) = size; \ } \ \ STC_API void \ -- cgit v1.2.3