From 15c5ad14e7f4755ecae95e3aae484bdbbea34623 Mon Sep 17 00:00:00 2001 From: Tyge Løvset Date: Sun, 21 Mar 2021 21:06:00 +0100 Subject: Splitted using_carray() into using_carray2() and using_carray3() --- examples/complex.c | 2 +- examples/demos.c | 2 +- stc/carray.h | 112 ++++++++++++++++++++++++++++++----------------------- 3 files changed, 66 insertions(+), 50 deletions(-) diff --git a/examples/complex.c b/examples/complex.c index 49cd0077..4ca833d4 100644 --- a/examples/complex.c +++ b/examples/complex.c @@ -5,7 +5,7 @@ void check_del(float* v) {printf("destroy %g\n", *v);} -using_carray(f, float, check_del, c_trivial_fromraw); +using_carray2(f, float, check_del, c_trivial_fromraw); using_clist(a, carray2f, c_no_compare, carray2f_del, c_no_clone); using_cmap(l, int, clist_a, c_default_equals, c_default_hash, clist_a_del, c_no_clone); using_cmap_strkey(s, cmap_l, cmap_l_del, c_no_clone); diff --git a/examples/demos.c b/examples/demos.c index 553d6d88..eca5609f 100644 --- a/examples/demos.c +++ b/examples/demos.c @@ -175,7 +175,7 @@ void mapdemo3() } -using_carray(f, float); +using_carray3(f, float); void arraydemo1() { diff --git a/stc/carray.h b/stc/carray.h index 289bcb97..fdd69013 100644 --- a/stc/carray.h +++ b/stc/carray.h @@ -31,7 +31,7 @@ // demo: #include #include "stc/carray.h" -using_carray(f, float); +using_carray3(f, float); int main() { @@ -46,50 +46,38 @@ int main() } */ -#define using_carray(...) c_MACRO_OVERLOAD(using_carray, __VA_ARGS__) -#define using_carray_2(X, Value) \ - using_carray_4(X, Value, c_trivial_del, c_trivial_fromraw) +#define using_carray2(...) c_MACRO_OVERLOAD(using_carray2, __VA_ARGS__) -#define using_carray_4(X, Value, valueDel, valueClone) \ +#define using_carray2_2(X, Value) \ + using_carray2_4(X, Value, c_trivial_del, c_trivial_fromraw) + +#define using_carray2_4(X, Value, valueDel, valueClone) \ \ - typedef Value carray1##X##_value_t; \ - typedef carray1##X##_value_t carray2##X##_value_t, carray3##X##_value_t; \ + typedef Value carray1##X##_value_t, carray2##X##_value_t; \ \ typedef struct { \ - Value *data; \ + carray1##X##_value_t *data; \ size_t _xdim; \ } carray1##X; \ \ typedef struct { \ - Value *data; \ + carray2##X##_value_t *data; \ size_t _xdim, _ydim; \ - } carray2##X, carray2##X##_t; \ -\ - typedef struct { \ - Value *data; \ - size_t _xdim, _ydim, _zdim; \ - } carray3##X, carray3##X##_t; \ + } carray2##X; \ \ STC_INLINE size_t \ carray1##X##_size(carray1##X a) {return _carray_xdim(a);} \ STC_INLINE size_t \ carray2##X##_size(carray2##X a) {return _carray_xdim(a)*_carray_ydim(a);} \ STC_INLINE size_t \ - carray3##X##_size(carray3##X a) {return _carray_xdim(a)*_carray_ydim(a)*_carray_zdim(a);} \ - STC_INLINE size_t \ carray2##X##_ydim(carray2##X a) {return _carray_ydim(a);} \ - STC_INLINE size_t \ - carray3##X##_ydim(carray3##X a) {return _carray_ydim(a);} \ - STC_INLINE size_t \ - carray3##X##_zdim(carray3##X a) {return _carray_zdim(a);} \ \ _using_carray_common(1, X, Value, valueDel, valueClone) \ _using_carray_common(2, X, Value, valueDel, valueClone) \ - _using_carray_common(3, X, Value, valueDel, valueClone) \ \ STC_INLINE carray1##X \ carray1##X##_init(size_t xdim, Value val) { \ - Value* m = c_new_2(Value, xdim); \ + carray1##X##_value_t* m = c_new_2(carray1##X##_value_t, xdim); \ for (size_t i=0; idata + x; } \ \ STC_INLINE carray1##X \ @@ -135,10 +110,51 @@ int main() carray1##X sub = {a->data + y*_carray_xdim(*a), _carray_xdim(*a)}; \ return sub; \ } \ - STC_INLINE Value* \ + STC_INLINE carray2##X##_value_t* \ carray2##X##_at(const carray2##X *a, size_t y, size_t x) { \ return a->data + y*_carray_xdim(*a) + x; \ } \ + typedef carray2##X carray2##X##_t + + +#define using_carray3(...) c_MACRO_OVERLOAD(using_carray3, __VA_ARGS__) + +#define using_carray3_2(X, Value) \ + using_carray3_4(X, Value, c_trivial_del, c_trivial_fromraw) + +#define using_carray3_4(X, Value, valueDel, valueClone) \ +\ + using_carray2_4(X, Value, valueDel, valueClone); \ + typedef Value carray3##X##_value_t; \ +\ + typedef struct { \ + carray3##X##_value_t *data; \ + size_t _xdim, _ydim, _zdim; \ + } carray3##X; \ +\ + STC_INLINE size_t \ + carray3##X##_size(carray3##X a) {return _carray_xdim(a)*_carray_ydim(a)*_carray_zdim(a);} \ + STC_INLINE size_t \ + carray3##X##_ydim(carray3##X a) {return _carray_ydim(a);} \ + STC_INLINE size_t \ + carray3##X##_zdim(carray3##X a) {return _carray_zdim(a);} \ +\ + _using_carray_common(3, X, Value, valueDel, valueClone) \ +\ + STC_INLINE carray3##X \ + carray3##X##_init(size_t zdim, size_t ydim, size_t xdim, Value val) { \ + const size_t n = zdim * ydim * xdim; \ + carray3##X##_value_t* m = c_new_2(carray3##X##_value_t, n); \ + for (size_t i=0; idata + (z*_carray_ydim(*a) + y)*_carray_xdim(*a), _carray_xdim(*a)}; \ return sub; \ } \ - STC_INLINE Value* \ + STC_INLINE carray3##X##_value_t* \ carray3##X##_at(const carray3##X *a, size_t z, size_t y, size_t x) { \ return a->data + (z*_carray_ydim(*a) + y)*_carray_xdim(*a) + x; \ } \ - typedef carray1##X carray1##X##_t + typedef carray3##X carray3##X##_t #define _carray_SUB (SIZE_MAX >> 1) @@ -164,7 +180,7 @@ int main() #define _carray_zdim(a) (a)._zdim #define _using_carray_common(D, X, Value, valueDel, valueClone) \ - typedef struct { Value *ref; } carray##D##X##_iter_t; \ + typedef struct { carray1##X##_value_t *ref; } carray##D##X##_iter_t; \ \ STC_INLINE carray##D##X##_iter_t \ carray##D##X##_begin(const carray##D##X* a) { \ @@ -187,11 +203,11 @@ int main() } \ STC_INLINE carray##D##X \ carray##D##X##_clone(carray##D##X arr) { \ - carray##D##X c = arr; size_t k = 0; \ - c.data = c_new_2(Value, carray##D##X##_size(arr)); \ + carray##D##X cp = arr; size_t k = 0; \ + cp.data = c_new_2(carray1##X##_value_t, carray##D##X##_size(arr)); \ c_foreach_3 (i, carray##D##X, arr) \ - c.data[k++] = valueClone(*i.ref); \ - return c; \ + cp.data[k++] = valueClone(*i.ref); \ + return cp; \ } \ STC_INLINE size_t \ carray##D##X##_xdim(carray##D##X a) {return _carray_xdim(a);} \ -- cgit v1.2.3