From 63ccf43460b4553176e431449638accfcc29324f Mon Sep 17 00:00:00 2001 From: Tyge Løvset <60263450+tylo-work@users.noreply.github.com> Date: Wed, 1 Apr 2020 15:07:39 +0200 Subject: Add files via upload --- ccl/carray.h | 65 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ccl/cdefs.h | 25 +++++++++++++++++------ 2 files changed, 84 insertions(+), 6 deletions(-) create mode 100644 ccl/carray.h diff --git a/ccl/carray.h b/ccl/carray.h new file mode 100644 index 00000000..ddb4bd9d --- /dev/null +++ b/ccl/carray.h @@ -0,0 +1,65 @@ +#ifndef CARRAY__H__ +#define CARRAY__H__ + +#include "cdefs.h" + +#define carray_xdim(a) ((a).xdim) +#define carray_ydim(a) ((a)._yxdim / (a).xdim) +#define carray_zdim(a) ((a).zdim) +#define carray_ref(a) (++(a)._refCount, a) +#define carray_unref(a) ({if (--(a)._refCount == 0) free((a).data);0;}) + +/* // demo: +#include "ccl/carray.h" +declare_CArray(f, float); + +int main() +{ + CArray3f a3 = carray3f_make(30, 20, 10); + carray3f_at2(a3, 3, 2).data[1] = 10.2f; + CArray2f a2 = carray3f_at(a3, 3); + printf("%f\n", carray2f_at(a2, 2).data[1]); + carray_unref(a2); + carray_unref(a3); +} +*/ + +#define declare_CArray(tag, T) \ + c_struct (CArray1##tag) { \ + T* data; \ + int _refCount; \ + size_t xdim; \ + }; \ + c_struct (CArray2##tag) { \ + T* data; \ + int _refCount; \ + size_t xdim, _yxdim; \ + }; \ + c_struct (CArray3##tag) { \ + T* data; \ + int _refCount; \ + size_t xdim, _yxdim, zdim; \ + }; \ + \ + static inline CArray1##tag carray1##tag##_make(size_t xdim) { \ + CArray1##tag a = {c_new_2(T, xdim), 1, xdim}; return a; \ + } \ + static inline CArray2##tag carray2##tag##_make(size_t ydim, size_t xdim) { \ + CArray2##tag a = {c_new_2(T, ydim*xdim), 1, xdim, ydim*xdim}; return a; \ + } \ + static inline CArray3##tag carray3##tag##_make(size_t zdim, size_t ydim, size_t xdim) { \ + CArray3##tag a = {c_new_2(T, zdim*ydim*xdim), 1, xdim, ydim*xdim, zdim}; return a; \ + } \ + \ + static inline CArray1##tag carray2##tag##_at(CArray2##tag a, size_t y) { \ + CArray1##tag out = {a.data + y*a.xdim, 1000, a.xdim}; return out; \ + } \ + static inline CArray2##tag carray3##tag##_at(CArray3##tag a, size_t z) { \ + CArray2##tag out = {a.data + z*a._yxdim, 1000, a.xdim, a._yxdim}; return out; \ + } \ + static inline CArray1##tag carray3##tag##_at2(CArray3##tag a, size_t z, size_t y) { \ + CArray1##tag out = {a.data + z*a._yxdim + y*a.xdim, 1000, a.xdim}; return out; \ + } \ + typedef T carray_##tag##_t + +#endif \ No newline at end of file diff --git a/ccl/cdefs.h b/ccl/cdefs.h index 8c657d96..9a29c36b 100644 --- a/ccl/cdefs.h +++ b/ccl/cdefs.h @@ -51,7 +51,8 @@ #define c_defaultGetRaw(x) (x) #define c_defaultCompare(x, y) (*(x) == *(y) ? 0 : *(x) < *(y) ? -1 : 1) #define c_defaultEquals(x, y) (memcmp(x, y, sizeof(*(y))) == 0) -static inline void c_defaultDestroy(void* value) {} +#define c_defaultDestroy(p) (p) +//static inline void c_defaultDestroy(void* value) {} #define c_foreach(it, ctag, con) \ for (ctag##_iter_t it = ctag##_begin(con); it.item != ctag##_end(con).item; it = ctag##_next(it)) @@ -59,14 +60,26 @@ static inline void c_defaultDestroy(void* value) {} // One-byte-at-a-time hash based on Murmur's mix static inline uint32_t c_defaultHash(const void *data, size_t len) { const uint8_t *key = (const uint8_t *) data; - uint32_t h = 0xc613fc15; + uint32_t x = UINT32_C(0xc613fc15); while (len--) { - h ^= *key++; - h *= 0x5bd1e995; - h ^= h >> 15; + x ^= *key++; + x *= UINT32_C(0x5bd1e995); + x ^= x >> 15; } - return h; + return x; } +// https://nullprogram.com/blog/2018/07/31/: assume len positive multiple of 4 +static inline uint32_t c_lowbias32Hash(const void *data, size_t len) { + const uint32_t *key = (const uint32_t *) data; uint32_t x = *key; + do { + x ^= *key++ >> 16; + x *= UINT32_C(0x7feb352d); + x ^= x >> 15; + x *= UINT32_C(0x846ca68b); + x ^= x >> 16; + } while (len -= 4); + return x; +} #endif -- cgit v1.2.3