diff options
| author | Tyge Løvset <[email protected]> | 2023-02-13 16:18:05 +0100 |
|---|---|---|
| committer | Tyge Løvset <[email protected]> | 2023-02-13 16:18:05 +0100 |
| commit | 3421d7b745310da05117fa97348a99a4a6ef8b5b (patch) | |
| tree | 02ea44f402f063f9295d733047a34d04aa049546 | |
| parent | 7dc6fddc079f4f572c8fb7c0ffd5a27e03291a2d (diff) | |
| download | STC-modified-3421d7b745310da05117fa97348a99a4a6ef8b5b.tar.gz STC-modified-3421d7b745310da05117fa97348a99a4a6ef8b5b.zip | |
Docs update and improvements
| -rw-r--r-- | README.md | 69 | ||||
| -rw-r--r-- | docs/cbits_api.md | 40 | ||||
| -rw-r--r-- | docs/ccommon_api.md | 2 | ||||
| -rw-r--r-- | include/stc/algo/filter.h | 6 | ||||
| -rw-r--r-- | include/stc/cbits.h | 74 | ||||
| -rw-r--r-- | misc/examples/prime.c | 14 |
6 files changed, 104 insertions, 101 deletions
@@ -3,7 +3,7 @@ STC - Smart Template Containers for C ===================================== -News: Version 4.1 Released (Feb 2023) +News: Version 4.1.1 Released (Feb 2023) ------------------------------------------------ I am happy to finally announce a new release! Major changes: - A new exciting [**cspan**](docs/cspan_api.md) single/multi-dimensional array view (with numpy-like slicing). @@ -133,7 +133,7 @@ as lookup type. It will then use the input `const char*` directly when comparing container. This avoids the construction of a new `cstr` (which possible allocates memory) for the lookup. Finally, destruction of the lookup key (i.e. string literal) after usage is not needed (or allowed), which is convenient in C. A great ergonomic feature is that the alternative lookup type can also be used for adding -entries into containers through using the *emplace*-functions. E.g. `MyCStrVec_emplace_back(&vec, "Hello")`. +entries into containers through using the *emplace*-functions. E.g. `cvec_str_emplace_back(&vec, "Hello")`. 3. ***Standardized container iterators***. All container can be iterated the same way, and uses the same element access syntax. E.g.: - `c_foreach (it, IntContainer, container) printf(" %d", *it.ref);` will work for @@ -368,47 +368,50 @@ Each templated type requires one `#include`, even if it's the same container bas The template parameters are given by a `#define i_xxxx` statement, where *xxxx* is the parameter name. The list of template parameters: -- `i_key` - Element key type for map/set only. **[required]**. -- `i_val` - Element value type. **[required for]** cmap/csmap, it is the mapped value type. -- `i_cmp` - Three-way comparison of two *i_keyraw*\* or *i_valraw*\* - **[required for]** non-integral *i_keyraw* elements unless *i_opt* is defined with *c_no_cmp*. -- `i_hash` - Hash function taking *i_keyraw*\* - defaults to *c_default_hash*. **[required for]** ***cmap/cset*** with non-POD *i_keyraw* elements. -- `i_eq` - Equality comparison of two *i_keyraw*\* - defaults to *!i_cmp*. Companion with *i_hash*. +- `i_key` *Type* - Element key type for map/set only. **[required]**. +- `i_val` *Type* - Element value type. **[required for]** cmap/csmap, it is the mapped value type. +- `i_cmp` *Func* - Three-way comparison of two *i_keyraw*\* or *i_valraw*\* - **[required for]** non-integral *i_keyraw* elements unless *i_opt* is defined with *c_no_cmp*. +- `i_hash` *Func* - Hash function taking *i_keyraw*\* - defaults to *c_default_hash*. **[required for]** ***cmap/cset*** with non-POD *i_keyraw* elements. +- `i_eq` *Func* - Equality comparison of two *i_keyraw*\* - defaults to *!i_cmp*. Companion with *i_hash*. Properties: -- `i_tag` - Container type name tag. Defaults to *i_key* name. -- `i_type` - Full container type name. Alternative to *i_tag*. -- `i_opt` - Boolean properties: may combine *c_no_cmp*, *c_no_clone*, *c_no_atomic*, *c_is_forward*, *c_static*, *c_header* with the *|* separator. +- `i_tag` *Name* - Container type name tag. Defaults to *i_key* name. +- `i_type` *Name* - Full container type name. Alternative to *i_tag*. +- `i_opt` *Flags* - Boolean properties: may combine *c_no_cmp*, *c_no_clone*, *c_no_atomic*, *c_is_forward*, *c_static*, *c_header* with the *|* separator. Key: -- `i_keydrop` - Destroy map/set key func - defaults to empty destructor. -- `i_keyclone` - **[required if]** *i_keydrop* is defined (exception for **carc**, as it shares). -- `i_keyraw` - Convertion "raw" type - defaults to *i_key*. -- `i_keyfrom` - Convertion func *i_key* <- *i_keyraw*. -- `i_keyto` - Convertion func *i_key*\* -> *i_keyraw*. **[required if]** *i_keyraw* is defined +- `i_keydrop` *Func* - Destroy map/set key func - defaults to empty destructor. +- `i_keyclone` *Func* - **[required if]** *i_keydrop* is defined (exception for **carc**, as it shares). +- `i_keyraw` *Type* - Convertion "raw" type - defaults to *i_key*. +- `i_keyfrom` *Func* - Convertion func *i_key* <= *i_keyraw*. +- `i_keyto` *Func* - Convertion func *i_key*\* => *i_keyraw*. **[required if]** *i_keyraw* is defined Val: -- `i_valdrop` - Destroy mapped or value func - defaults to empty destruct. -- `i_valclone` - **[required if]** *i_valdrop* is defined. -- `i_valraw` - Convertion "raw" type - defaults to *i_val*. -- `i_valfrom` - Convertion func *i_val* <- *i_valraw*. -- `i_valto` - Convertion func *i_val*\* -> *i_valraw*. - -Specials (meta-template parameters): -- `i_keyclass TYPE` - Auto-binds to standard named functions: *TYPE_clone()*, *TYPE_drop()*, *TYPE_cmp()*, *TYPE_eq()*, *TYPE_hash()*. If `i_keyraw` is defined, function *TYPE_toraw()* is bound to `i_keyto`, and *TYPE_from()* binds to `i_keyfrom`. Only functions required by the container type needs to be defined. E.g.: - - *TYPE_hash()* and *TYPE_eq()* are only required by **cmap**, **cset** and smart pointers. - - *TYPE_cmp()* is not used by **cstack** and **cmap/cset**, or if *#define i_opt c_no_cmp* is specified. - - *TYPE_clone()* is not used by if *#define i_opt c_no_clone* is specified. -- `i_key_str` - Defines *i_keyclass = cstr*, *i_tag = str*, and *i_keyraw = const char*\*. Defines type convertion -*i_keyfrom/i_keyto*, and *i_cmp*, *i_eq*, *i_hash*, *i_keydrop* functions using *const char*\* as input. -- `i_key_ssv` - Defines *i_keyclass = cstr*, *i_tag = ssv*, and *i_keyraw = csview*. Defines type convertion -*i_keyfrom/i_keyto* and *i_cmp*, *i_eq*, *i_hash*, *i_keydrop* functions using *csview* as input. -- `i_keyboxed TYPE` - Use when TYPE is a smart pointer **carc** or **cbox**. Defines *i_keyclass = TYPE*, and *i_keyraw = TYPE\**. NB: Do not use when defining carc/cbox types themselves. -- `i_valclass`, `i_val_str`, `i_val_ssv`, `i_valboxed` - Similar rules as for ***key***. +- `i_valdrop` *Func* - Destroy mapped or value func - defaults to empty destruct. +- `i_valclone` *Func* - **[required if]** *i_valdrop* is defined. +- `i_valraw` *Type* - Convertion "raw" type - defaults to *i_val*. +- `i_valfrom` *Func* - Convertion func *i_val* <= *i_valraw*. +- `i_valto` *Func* - Convertion func *i_val*\* => *i_valraw*. + +Specials: Meta-template parameters (use instead of `i_key` / `i_val`): +- `i_keyclass` *Type* - Auto-set standard named functions: *Type_clone()*, *Type_drop()*, *Type_cmp()*, *Type_eq()*, *Type_hash()*. +If `i_keyraw` is defined, it sets `i_keyto` = *Type_toraw()* and `i_keyfrom` = *Type_from()*. +Only functions required by the container type is required to be defined. E.g.: + - *Type_hash()* and *Type_eq()* are only required by **cmap**, **cset** and smart pointers. + - *Type_cmp()* is not used by **cstack** and **cmap/cset**, or if *#define i_opt c_no_cmp* is specified. + - *Type_clone()* is not used if *#define i_opt c_no_clone* is specified. +- `i_key_str` - Sets `i_keyclass` = *cstr*, `i_tag` = *str*, and `i_keyraw` = *const char*\*. Defines both type convertion +`i_keyfrom`, `i_keyto`, and sets `i_cmp`, `i_eq`, `i_hash` functions with *const char\*\** as argument. +- `i_key_ssv` - Sets `i_keyclass` = *cstr*, `i_tag` = *ssv*, and `i_keyraw` = *csview\**. Defines both type convertion +`i_keyfrom`, `i_keyto`, and sets `i_cmp`, `i_eq`, `i_hash` functions with *csview\** as argument. +- `i_keyboxed` *Type* - Use when *Type* is a smart pointer **carc** or **cbox**. Defines *i_keyclass = Type*, and *i_keyraw = Type\**. +NB: Do not use when defining carc/cbox types themselves. +- `i_valclass` *Type*, `i_val_str`, `i_val_ssv`, `i_valboxed` - Similar rules as for ***key***. **Notes**: - Instead of defining `i_cmp`, you may define *i_opt c_no_cmp* to disable *searching and sorting* functions. - Instead of defining `i_*clone`, you may define *i_opt c_no_clone* to disable *clone* functionality. -- For `i_keyclass`, if *i_keyraw RAWTYPE* is defined along with it, *i_keyfrom* may also be defined to enable the *emplace*-functions. NB: the signature for ***cmp***, ***eq***, and ***hash*** uses *RAWTYPE* as input. +- For `i_keyclass`, if *i_keyraw* is defined along with it, *i_keyfrom* may also be defined to enable the *emplace*-functions. NB: the signature for ***cmp***, ***eq***, and ***hash*** uses *i_keyraw* as input. The *emplace* versus non-emplace container methods -------------------------------------------------- diff --git a/docs/cbits_api.md b/docs/cbits_api.md index 60586a5b..21c9a86d 100644 --- a/docs/cbits_api.md +++ b/docs/cbits_api.md @@ -21,34 +21,34 @@ All cbits definitions and prototypes are available by including a single header ```c cbits cbits_init(void); cbits cbits_from(const char* str); -cbits cbits_with_size(intptr_t size, bool value); // size must be <= N if N is defined -cbits cbits_with_pattern(intptr_t size, uint64_t pattern); +cbits cbits_with_size(int64_t size, bool value); // size must be <= N if N is defined +cbits cbits_with_pattern(int64_t size, uint64_t pattern); cbits cbits_clone(cbits other); void cbits_clear(cbits* self); cbits* cbits_copy(cbits* self, const cbits* other); -void cbits_resize(cbits* self, intptr_t size, bool value); // only if i_len is not defined +void cbits_resize(cbits* self, int64_t size, bool value); // only if i_len is not defined void cbits_drop(cbits* self); cbits* cbits_take(cbits* self, const cbits* other); // give other to self cbits cbits_move(cbits* self); // transfer self to caller -intptr_t cbits_size(const cbits* self); -intptr_t cbits_count(const cbits* self); // count number of bits set +int64_t cbits_size(const cbits* self); +int64_t cbits_count(const cbits* self); // count number of bits set -bool cbits_test(const cbits* self, intptr_t i); -bool cbits_at(const cbits* self, intptr_t i); // same as cbits_test() +bool cbits_test(const cbits* self, int64_t i); +bool cbits_at(const cbits* self, int64_t i); // same as cbits_test() bool cbits_subset_of(const cbits* self, const cbits* other); // is set a subset of other? bool cbits_disjoint(const cbits* self, const cbits* other); // no common bits -char* cbits_to_str(const cbits* self, char* str, intptr_t start, intptr_t stop); +char* cbits_to_str(const cbits* self, char* str, int64_t start, int64_t stop); -void cbits_set(cbits* self, intptr_t i); -void cbits_reset(cbits* self, intptr_t i); -void cbits_set_value(cbits* self, intptr_t i, bool value); +void cbits_set(cbits* self, int64_t i); +void cbits_reset(cbits* self, int64_t i); +void cbits_set_value(cbits* self, int64_t i, bool value); void cbits_set_all(cbits* self, bool value); void cbits_set_pattern(cbits* self, uint64_t pattern); void cbits_flip_all(cbits* self); -void cbits_flip(cbits* self, intptr_t i); +void cbits_flip(cbits* self, int64_t i); void cbits_intersect(cbits* self, const cbits* other); void cbits_union(cbits* self, const cbits* other); @@ -70,19 +70,19 @@ void cbits_xor(cbits* self, const cbits* other); // set of di #include <math.h> #include <time.h> -cbits sieveOfEratosthenes(intptr_t n) +cbits sieveOfEratosthenes(int64_t n) { cbits bits = cbits_with_size(n>>1, true); - intptr_t q = (intptr_t) sqrt(n); + int64_t q = (int64_t) sqrt(n); - for (intptr_t i = 3; i <= q; i += 2) { - for (intptr_t j = i; j < n; j += 2) { + for (int64_t i = 3; i <= q; i += 2) { + for (int64_t j = i; j < n; j += 2) { if (cbits_test(&bits, j>>1)) { i = j; break; } } - for (intptr_t j = i*i; j < n; j += i*2) + for (int64_t j = i*i; j < n; j += i*2) cbits_reset(&bits, j>>1); } return bits; @@ -90,18 +90,18 @@ cbits sieveOfEratosthenes(intptr_t n) int main(void) { - intptr_t n = 100000000; + int64_t n = 100000000; printf("computing prime numbers up to %" c_ZI "\n", n); clock_t t1 = clock(); cbits primes = sieveOfEratosthenes(n + 1); - intptr_t nprimes = cbits_count(&primes); + int64_t nprimes = cbits_count(&primes); clock_t t2 = clock(); printf("number of primes: %" c_ZI ", time: %f\n", nprimes, (float)(t2 - t1)/CLOCKS_PER_SEC); printf(" 2"); - for (intptr_t i = 3; i < 1000; i += 2) + for (int64_t i = 3; i < 1000; i += 2) if (cbits_test(&primes, i>>1)) printf(" %" c_ZI, i); puts(""); diff --git a/docs/ccommon_api.md b/docs/ccommon_api.md index a2f0b99d..4553ada0 100644 --- a/docs/ccommon_api.md +++ b/docs/ccommon_api.md @@ -234,7 +234,7 @@ Iterate containers with stop-criteria and chained range filtering. | `c_flt_skipwhile(it, predicate)` | Skip items until predicate is false | | `c_flt_takewhile(it, predicate)` | Take items until predicate is false | | `c_flt_last(it)` | Get count of last filter successes | -| `c_flt_lastwhile(it)` | Get value of last while-filter | +| `c_flt_inc(it)` | Increment and return on the stack | `it.index` holds the index of the source item. ```c diff --git a/include/stc/algo/filter.h b/include/stc/algo/filter.h index 8357cb4d..65c6982a 100644 --- a/include/stc/algo/filter.h +++ b/include/stc/algo/filter.h @@ -53,12 +53,12 @@ int main() #define c_NFILTERS 14 /* 22, 30, .. */ #endif -#define c_flt_take(i, n) (++(i).s1[(i).s1top++] <= (n)) -#define c_flt_skip(i, n) (++(i).s1[(i).s1top++] > (n)) +#define c_flt_take(i, n) (c_flt_inc(i) <= (n)) +#define c_flt_skip(i, n) (c_flt_inc(i) > (n)) #define c_flt_skipwhile(i, pred) ((i).s2[(i).s2top++] |= !(pred)) #define c_flt_takewhile(i, pred) !c_flt_skipwhile(i, pred) #define c_flt_last(i) (i).s1[(i).s1top-1] -#define c_flt_lastwhile(i) (i).s2[(i).s2top-1] +#define c_flt_inc(i) ++(i).s1[(i).s1top++] #define c_forfilter(...) c_MACRO_OVERLOAD(c_forfilter, __VA_ARGS__) diff --git a/include/stc/cbits.h b/include/stc/cbits.h index 0c169b88..c3167dae 100644 --- a/include/stc/cbits.h +++ b/include/stc/cbits.h @@ -56,7 +56,7 @@ int main() { #include <string.h> #define _cbits_bit(i) ((uint64_t)1 << ((i) & 63)) -#define _cbits_words(n) (intptr_t)(((n) + 63)>>6) +#define _cbits_words(n) (int64_t)(((n) + 63)>>6) #define _cbits_bytes(n) (_cbits_words(n) * c_sizeof(uint64_t)) #if defined(__GNUC__) || defined(__clang__) @@ -73,23 +73,23 @@ int main() { } #endif -STC_INLINE intptr_t _cbits_count(const uint64_t* set, const intptr_t sz) { - const intptr_t n = sz>>6; - intptr_t count = 0; - for (intptr_t i = 0; i < n; ++i) +STC_INLINE int64_t _cbits_count(const uint64_t* set, const int64_t sz) { + const int64_t n = sz>>6; + int64_t count = 0; + for (int64_t i = 0; i < n; ++i) count += cpopcount64(set[i]); if (sz & 63) count += cpopcount64(set[n] & (_cbits_bit(sz) - 1)); return count; } -STC_INLINE char* _cbits_to_str(const uint64_t* set, const intptr_t sz, - char* out, intptr_t start, intptr_t stop) { +STC_INLINE char* _cbits_to_str(const uint64_t* set, const int64_t sz, + char* out, int64_t start, int64_t stop) { if (stop > sz) stop = sz; assert(start <= stop); c_memset(out, '0', stop - start); - for (intptr_t i = start; i < stop; ++i) + for (int64_t i = start; i < stop; ++i) if ((set[i>>6] & _cbits_bit(i)) != 0) out[i - start] = '1'; out[stop - start] = '\0'; @@ -97,19 +97,19 @@ STC_INLINE char* _cbits_to_str(const uint64_t* set, const intptr_t sz, } #define _cbits_OPR(OPR, VAL) \ - const uint64_t n = (uint64_t)sz>>6; \ - for (uint64_t i = 0; i < n; ++i) \ + const int64_t n = sz>>6; \ + for (int64_t i = 0; i < n; ++i) \ if ((set[i] OPR other[i]) != VAL) \ return false; \ if (!(sz & 63)) \ return true; \ - const uint64_t i = n, m = _cbits_bit(sz) - 1; \ + const uint64_t i = (uint64_t)n, m = _cbits_bit(sz) - 1; \ return ((set[i] OPR other[i]) & m) == (VAL & m) -STC_INLINE bool _cbits_subset_of(const uint64_t* set, const uint64_t* other, const intptr_t sz) +STC_INLINE bool _cbits_subset_of(const uint64_t* set, const uint64_t* other, const int64_t sz) { _cbits_OPR(|, set[i]); } -STC_INLINE bool _cbits_disjoint(const uint64_t* set, const uint64_t* other, const intptr_t sz) +STC_INLINE bool _cbits_disjoint(const uint64_t* set, const uint64_t* other, const int64_t sz) { _cbits_OPR(&, 0); } #endif // CBITS_H_INCLUDED @@ -121,12 +121,12 @@ STC_INLINE bool _cbits_disjoint(const uint64_t* set, const uint64_t* other, cons #define _i_assert(x) assert(x) #define i_type cbits -struct { uint64_t *data64; intptr_t _size; } typedef i_type; +struct { uint64_t *data64; int64_t _size; } typedef i_type; STC_INLINE cbits cbits_init(void) { return c_LITERAL(cbits){NULL}; } STC_INLINE void cbits_create(cbits* self) { self->data64 = NULL; self->_size = 0; } STC_INLINE void cbits_drop(cbits* self) { c_free(self->data64); } -STC_INLINE intptr_t cbits_size(const cbits* self) { return self->_size; } +STC_INLINE int64_t cbits_size(const cbits* self) { return self->_size; } STC_INLINE cbits* cbits_take(cbits* self, cbits other) { if (self->data64 != other.data64) { @@ -137,7 +137,7 @@ STC_INLINE cbits* cbits_take(cbits* self, cbits other) { } STC_INLINE cbits cbits_clone(cbits other) { - const intptr_t bytes = _cbits_bytes(other._size); + const int64_t bytes = _cbits_bytes(other._size); cbits set = {(uint64_t *)c_memcpy(c_malloc(bytes), other.data64, bytes), other._size}; return set; } @@ -151,8 +151,8 @@ STC_INLINE cbits* cbits_copy(cbits* self, const cbits* other) { return self; } -STC_INLINE void cbits_resize(cbits* self, const intptr_t size, const bool value) { - const intptr_t new_n = _cbits_words(size), osize = self->_size, old_n = _cbits_words(osize); +STC_INLINE void cbits_resize(cbits* self, const int64_t size, const bool value) { + const int64_t new_n = _cbits_words(size), osize = self->_size, old_n = _cbits_words(osize); self->data64 = (uint64_t *)c_realloc(self->data64, new_n*8); self->_size = size; if (new_n >= old_n) { @@ -174,13 +174,13 @@ STC_INLINE cbits cbits_move(cbits* self) { return tmp; } -STC_INLINE cbits cbits_with_size(const intptr_t size, const bool value) { +STC_INLINE cbits cbits_with_size(const int64_t size, const bool value) { cbits set = {(uint64_t *)c_malloc(_cbits_bytes(size)), size}; cbits_set_all(&set, value); return set; } -STC_INLINE cbits cbits_with_pattern(const intptr_t size, const uint64_t pattern) { +STC_INLINE cbits cbits_with_pattern(const int64_t size, const uint64_t pattern) { cbits set = {(uint64_t *)c_malloc(_cbits_bytes(size)), size}; cbits_set_pattern(&set, pattern); return set; @@ -198,7 +198,7 @@ struct { uint64_t data64[(i_capacity - 1)/64 + 1]; } typedef i_type; STC_INLINE i_type _i_memb(_init)(void) { return c_LITERAL(i_type){0}; } STC_INLINE void _i_memb(_create)(i_type* self) {} STC_INLINE void _i_memb(_drop)(i_type* self) {} -STC_INLINE intptr_t _i_memb(_size)(const i_type* self) { return i_capacity; } +STC_INLINE int64_t _i_memb(_size)(const i_type* self) { return i_capacity; } STC_INLINE i_type _i_memb(_move)(i_type* self) { return *self; } STC_INLINE i_type* _i_memb(_take)(i_type* self, i_type other) @@ -213,13 +213,13 @@ STC_INLINE i_type* _i_memb(_copy)(i_type* self, const i_type* other) STC_INLINE void _i_memb(_set_all)(i_type *self, const bool value); STC_INLINE void _i_memb(_set_pattern)(i_type *self, const uint64_t pattern); -STC_INLINE i_type _i_memb(_with_size)(const intptr_t size, const bool value) { +STC_INLINE i_type _i_memb(_with_size)(const int64_t size, const bool value) { assert(size <= i_capacity); i_type set; _i_memb(_set_all)(&set, value); return set; } -STC_INLINE i_type _i_memb(_with_pattern)(const intptr_t size, const uint64_t pattern) { +STC_INLINE i_type _i_memb(_with_pattern)(const int64_t size, const uint64_t pattern) { assert(size <= i_capacity); i_type set; _i_memb(_set_pattern)(&set, pattern); return set; @@ -232,36 +232,36 @@ STC_INLINE void _i_memb(_set_all)(i_type *self, const bool value) { c_memset(self->data64, value? ~0 : 0, _cbits_bytes(_i_memb(_size)(self))); } STC_INLINE void _i_memb(_set_pattern)(i_type *self, const uint64_t pattern) { - intptr_t n = _cbits_words(_i_memb(_size)(self)); + int64_t n = _cbits_words(_i_memb(_size)(self)); while (n--) self->data64[n] = pattern; } -STC_INLINE bool _i_memb(_test)(const i_type* self, const intptr_t i) +STC_INLINE bool _i_memb(_test)(const i_type* self, const int64_t i) { return (self->data64[i>>6] & _cbits_bit(i)) != 0; } -STC_INLINE bool _i_memb(_at)(const i_type* self, const intptr_t i) +STC_INLINE bool _i_memb(_at)(const i_type* self, const int64_t i) { return (self->data64[i>>6] & _cbits_bit(i)) != 0; } -STC_INLINE void _i_memb(_set)(i_type *self, const intptr_t i) +STC_INLINE void _i_memb(_set)(i_type *self, const int64_t i) { self->data64[i>>6] |= _cbits_bit(i); } -STC_INLINE void _i_memb(_reset)(i_type *self, const intptr_t i) +STC_INLINE void _i_memb(_reset)(i_type *self, const int64_t i) { self->data64[i>>6] &= ~_cbits_bit(i); } -STC_INLINE void _i_memb(_set_value)(i_type *self, const intptr_t i, const bool b) { +STC_INLINE void _i_memb(_set_value)(i_type *self, const int64_t i, const bool b) { self->data64[i>>6] ^= ((uint64_t)-(int)b ^ self->data64[i>>6]) & _cbits_bit(i); } -STC_INLINE void _i_memb(_flip)(i_type *self, const intptr_t i) +STC_INLINE void _i_memb(_flip)(i_type *self, const int64_t i) { self->data64[i>>6] ^= _cbits_bit(i); } STC_INLINE void _i_memb(_flip_all)(i_type *self) { - intptr_t n = _cbits_words(_i_memb(_size)(self)); + int64_t n = _cbits_words(_i_memb(_size)(self)); while (n--) self->data64[n] ^= ~(uint64_t)0; } STC_INLINE i_type _i_memb(_from)(const char* str) { - intptr_t n = c_strlen(str); + int64_t n = c_strlen(str); i_type set = _i_memb(_with_size)(n, false); while (n--) if (str[n] == '1') _i_memb(_set)(&set, n); return set; @@ -270,26 +270,26 @@ STC_INLINE i_type _i_memb(_from)(const char* str) { /* Intersection */ STC_INLINE void _i_memb(_intersect)(i_type *self, const i_type* other) { _i_assert(self->_size == other->_size); - intptr_t n = _cbits_words(_i_memb(_size)(self)); + int64_t n = _cbits_words(_i_memb(_size)(self)); while (n--) self->data64[n] &= other->data64[n]; } /* Union */ STC_INLINE void _i_memb(_union)(i_type *self, const i_type* other) { _i_assert(self->_size == other->_size); - intptr_t n = _cbits_words(_i_memb(_size)(self)); + int64_t n = _cbits_words(_i_memb(_size)(self)); while (n--) self->data64[n] |= other->data64[n]; } /* Exclusive disjunction */ STC_INLINE void _i_memb(_xor)(i_type *self, const i_type* other) { _i_assert(self->_size == other->_size); - intptr_t n = _cbits_words(_i_memb(_size)(self)); + int64_t n = _cbits_words(_i_memb(_size)(self)); while (n--) self->data64[n] ^= other->data64[n]; } -STC_INLINE intptr_t _i_memb(_count)(const i_type* self) +STC_INLINE int64_t _i_memb(_count)(const i_type* self) { return _cbits_count(self->data64, _i_memb(_size)(self)); } -STC_INLINE char* _i_memb(_to_str)(const i_type* self, char* out, intptr_t start, intptr_t stop) +STC_INLINE char* _i_memb(_to_str)(const i_type* self, char* out, int64_t start, int64_t stop) { return _cbits_to_str(self->data64, _i_memb(_size)(self), out, start, stop); } STC_INLINE bool _i_memb(_subset_of)(const i_type* self, const i_type* other) { diff --git a/misc/examples/prime.c b/misc/examples/prime.c index 1a272e78..e705dcb7 100644 --- a/misc/examples/prime.c +++ b/misc/examples/prime.c @@ -6,19 +6,19 @@ #include <stc/algo/crange.h> -cbits sieveOfEratosthenes(intptr_t n) +cbits sieveOfEratosthenes(int64_t n) { cbits bits = cbits_with_size(n/2 + 1, true); - intptr_t q = (intptr_t)sqrt((double) n) + 1; - for (intptr_t i = 3; i < q; i += 2) { - intptr_t j = i; + int64_t q = (int64_t)sqrt((double) n) + 1; + for (int64_t i = 3; i < q; i += 2) { + int64_t j = i; for (; j < n; j += 2) { if (cbits_test(&bits, j>>1)) { i = j; break; } } - for (intptr_t j = i*i; j < n; j += i*2) + for (int64_t j = i*i; j < n; j += i*2) cbits_reset(&bits, j>>1); } return bits; @@ -26,12 +26,12 @@ cbits sieveOfEratosthenes(intptr_t n) int main(void) { - intptr_t n = 1000000000; + int64_t n = 1000000000; printf("Computing prime numbers up to %" c_ZI "\n", n); clock_t t1 = clock(); c_with (cbits primes = sieveOfEratosthenes(n + 1), cbits_drop(&primes)) { - intptr_t np = cbits_count(&primes); + int64_t np = cbits_count(&primes); clock_t t2 = clock(); printf("Number of primes: %" c_ZI ", time: %f\n\n", np, (float)(t2 - t1) / (float)CLOCKS_PER_SEC); |
