From 466173620bf5775f2ce77beb7b9fd45e8d1ee78a Mon Sep 17 00:00:00 2001 From: Tyge Date: Wed, 15 Apr 2020 15:36:31 +0200 Subject: Updated array --- stc/carray.h | 64 ++++++++++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 47 insertions(+), 17 deletions(-) diff --git a/stc/carray.h b/stc/carray.h index eca07ed4..e8e7e5ba 100644 --- a/stc/carray.h +++ b/stc/carray.h @@ -23,14 +23,9 @@ #ifndef CARRAY__H__ #define CARRAY__H__ +#include #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 declare_CArray(f, float); @@ -38,14 +33,26 @@ 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]); + carray3f_at2(a3, 5, 4).data[3] = 10.2f; + CArray2f a2 = carray3f_at(a3, 5); + + printf("%f\n", carray3f_at2(a3, 5, 4).data[3]); + printf("%f\n", carray3f_at3(a3, 5, 4, 3)); + printf("%f\n", carray2f_at(a2, 4).data[3]); + printf("%f\n", carray2f_data(a2, 4)[3]); + printf("%f\n", carray2f_at2(a2, 4, 3)); + carray_unref(a2); carray_unref(a3); } */ +#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;}) + #define declare_CArray(tag, T) \ c_struct (CArray1##tag) { \ T* data; \ @@ -62,25 +69,48 @@ int main() int _refCount; \ size_t xdim, _yxdim, zdim; \ }; \ - \ - static inline CArray1##tag carray1##tag##_make(size_t xdim) { \ + \ + 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) { \ + 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) { \ + 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) { \ + \ + static inline T* \ + carray2##tag##_data(CArray2##tag a, size_t y) { \ + return a.data + y*a.xdim; \ + } \ + 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) { \ + static inline T \ + carray2##tag##_at2(CArray2##tag a, size_t y, size_t x) { \ + return a.data[ y*a.xdim + x ]; \ + } \ + \ + static inline T* \ + carray3##tag##_data(CArray3##tag a, size_t z, size_t y) { \ + return a.data + z*a._yxdim + y*a.xdim; \ + } \ + 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) { \ + 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; \ + } \ + static inline T \ + carray3##tag##_at3(CArray3##tag a, size_t z, size_t y, size_t x) { \ + return a.data[ z*a._yxdim + y*a.xdim + x ]; \ } \ typedef T carray_##tag##_t -- cgit v1.2.3