From 7742fc40ef868260b7120d7269865d38014a0a41 Mon Sep 17 00:00:00 2001 From: Tylo Date: Thu, 25 Jun 2020 09:08:53 +0200 Subject: Updated carray.h: renamed carray_xdim to separate carray1_xdim, carray2_xdim, etc. Added complex.c example. --- examples/complex.c | 36 ++++++++++++++++++++++++++++++++++++ stc/carray.h | 33 +++++++++++++++++++-------------- 2 files changed, 55 insertions(+), 14 deletions(-) create mode 100644 examples/complex.c diff --git a/examples/complex.c b/examples/complex.c new file mode 100644 index 00000000..3fb0f0a1 --- /dev/null +++ b/examples/complex.c @@ -0,0 +1,36 @@ +#include "../stc/cstring.h" +#include "../stc/chash.h" +#include "../stc/clist.h" +#include "../stc/carray.h" + +void check_destroy(float* v) {printf("destroy %g\n", *v);} + +declare_CArray(f, float, check_destroy); // normally omit the last argument - float type need no destroy. +declare_CList(t2, CArray2_f, carray2_f_destroy, c_noCompare); +declare_CHash(il, MAP, int, CList_t2, clist_t2_destroy); +declare_CHash_string(sm, MAP, CHash_il, chash_il_destroy); + +int main() { + int xdim = 4, ydim = 6; + int x = 1, y = 5, entry = 42; + CHash_sm theMap = chash_init; + { + // Construct. + CArray2_f table = carray2_f_make(ydim, xdim, 0.f); + printf("table: (%zu, %zu)\n", carray2_ydim(table), carray2_xdim(table)); + CList_t2 tableList = clist_init; + CHash_il listMap = chash_init; + + // Put in some data. + carray2_f_data(table, y)[x] = 3.1415927; // table[x][y] + clist_t2_pushBack(&tableList, table); + chash_il_put(&listMap, entry, tableList); + chash_sm_put(&theMap, "First", listMap); + } + + // Access the data entry + CArray2_f table = clist_back(chash_il_get(&chash_sm_get(&theMap, "First")->value, entry)->value); + printf("value (%d, %d) is: %f\n", y, x, carray2_f_value(table, y, x)); + + chash_sm_destroy(&theMap); // free up the whole shebang! +} \ No newline at end of file diff --git a/stc/carray.h b/stc/carray.h index b39bb35c..d56aee58 100644 --- a/stc/carray.h +++ b/stc/carray.h @@ -44,22 +44,27 @@ int main() printf("%f\n", carray3_f_data(a3, 5, 4)[3]); printf("%f\n", carray3_f_at2(a3, 5, 4).data[3]); - carray_f_destroy(&a2); // does nothing, since it is a sub-array. - carray_f_destroy(&a3); // also invalidates a2. + carray2_f_destroy(&a2); // does nothing, since it is a sub-array. + carray3_f_destroy(&a3); // also invalidates a2. } */ -#define carray_xdim(a) ((a)._xdim & _carray_sub) -#define carray_ydim(a) _carray_ydim(&(a)._yxdim) -#define carray_zdim(a) ((a)._zdim) -#define carray1_size(a) carray_xdim(a) +#define carray1_xdim(a) ((a)._xdim & _carray_sub) +#define carray1_size(a) carray1_xdim(a) + +#define carray2_xdim(a) carray1_xdim(a) +#define carray2_ydim(a) _carray2_ydim(&(a)._yxdim) #define carray2_size(a) ((a)._yxdim) + +#define carray3_xdim(a) carray1_xdim(a) +#define carray3_ydim(a) carray2_ydim(a) +#define carray3_zdim(a) ((a)._zdim) #define carray3_size(a) _carray3_size(&(a)._zdim) #define _carray_sub (SIZE_MAX >> 1) #define _carray_own (_carray_sub + 1) -static inline size_t _carray_ydim(const size_t* yxdim) { +static inline size_t _carray2_ydim(const size_t* yxdim) { return yxdim[0] / (yxdim[-1] & _carray_sub); } static inline size_t _carray3_size(const size_t* zdim) { @@ -137,35 +142,35 @@ static inline size_t _carray3_size(const size_t* zdim) { \ static inline CArray1_##tag \ carray2_##tag##_at(CArray2_##tag a, size_t y) { \ - CArray1_##tag sub = {a.data + y*carray_xdim(a), carray_xdim(a)}; \ + CArray1_##tag sub = {a.data + y*carray2_xdim(a), carray2_xdim(a)}; \ return sub; \ } \ static inline Value* \ carray2_##tag##_data(CArray2_##tag a, size_t y) { \ - return a.data + y*carray_xdim(a); \ + return a.data + y*carray2_xdim(a); \ } \ static inline Value \ carray2_##tag##_value(CArray2_##tag a, size_t y, size_t x) { \ - return a.data[ y*carray_xdim(a) + x ]; \ + return a.data[ y*carray2_xdim(a) + x ]; \ } \ \ static inline CArray2_##tag \ carray3_##tag##_at(CArray3_##tag a, size_t z) { \ - CArray2_##tag sub = {a.data + z*a._yxdim, carray_xdim(a), a._yxdim}; \ + CArray2_##tag sub = {a.data + z*a._yxdim, carray3_xdim(a), a._yxdim}; \ return sub; \ } \ static inline CArray1_##tag \ carray3_##tag##_at2(CArray3_##tag a, size_t z, size_t y) { \ - CArray1_##tag sub = {a.data + z*a._yxdim + y*carray_xdim(a), carray_xdim(a)}; \ + CArray1_##tag sub = {a.data + z*a._yxdim + y*carray3_xdim(a), carray3_xdim(a)}; \ return sub; \ } \ static inline Value* \ carray3_##tag##_data(CArray3_##tag a, size_t z, size_t y) { \ - return a.data + z*a._yxdim + y*carray_xdim(a); \ + return a.data + z*a._yxdim + y*carray3_xdim(a); \ } \ static inline Value \ carray3_##tag##_value(CArray3_##tag a, size_t z, size_t y, size_t x) { \ - return a.data[ z*a._yxdim + y*carray_xdim(a) + x ]; \ + return a.data[ z*a._yxdim + y*carray3_xdim(a) + x ]; \ } \ typedef Value CArrayValue_##tag -- cgit v1.2.3