diff options
| author | Tyge Løvset <[email protected]> | 2020-04-01 15:07:39 +0200 |
|---|---|---|
| committer | GitHub <[email protected]> | 2020-04-01 15:07:39 +0200 |
| commit | 63ccf43460b4553176e431449638accfcc29324f (patch) | |
| tree | a93afc4a2025aecca88bcef8ca2f79712278d4e8 | |
| parent | da55c590c556743670ed216c3a2d8069be3bdf7b (diff) | |
| download | STC-modified-63ccf43460b4553176e431449638accfcc29324f.tar.gz STC-modified-63ccf43460b4553176e431449638accfcc29324f.zip | |
Add files via upload
| -rw-r--r-- | ccl/carray.h | 65 | ||||
| -rw-r--r-- | ccl/cdefs.h | 25 |
2 files changed, 84 insertions, 6 deletions
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
|
