diff options
| author | Tyge <[email protected]> | 2020-04-15 15:36:31 +0200 |
|---|---|---|
| committer | Tyge <[email protected]> | 2020-04-15 15:36:31 +0200 |
| commit | 466173620bf5775f2ce77beb7b9fd45e8d1ee78a (patch) | |
| tree | 261b54c6324c355d98f9ea6d9bcc512b55ebf50d | |
| parent | 5da345a969853ed301e41da3c6ce32b7b837951c (diff) | |
| download | STC-modified-466173620bf5775f2ce77beb7b9fd45e8d1ee78a.tar.gz STC-modified-466173620bf5775f2ce77beb7b9fd45e8d1ee78a.zip | |
Updated array
| -rw-r--r-- | stc/carray.h | 64 |
1 files 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 <stdlib.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 <stc/carray.h>
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,26 +69,49 @@ 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
#endif
\ No newline at end of file |
