summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorTyge <[email protected]>2020-04-15 15:36:31 +0200
committerTyge <[email protected]>2020-04-15 15:36:31 +0200
commit466173620bf5775f2ce77beb7b9fd45e8d1ee78a (patch)
tree261b54c6324c355d98f9ea6d9bcc512b55ebf50d
parent5da345a969853ed301e41da3c6ce32b7b837951c (diff)
downloadSTC-modified-466173620bf5775f2ce77beb7b9fd45e8d1ee78a.tar.gz
STC-modified-466173620bf5775f2ce77beb7b9fd45e8d1ee78a.zip
Updated array
-rw-r--r--stc/carray.h64
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