diff options
Diffstat (limited to 'ndarray.h')
-rw-r--r-- | ndarray.h | 33 |
1 files changed, 33 insertions, 0 deletions
@@ -49,10 +49,43 @@ typedef struct NDArray { #define NDIDX2D(arr, x, y) ((arr)->stride[0] * (y) + (arr)->stride[1] * (x)) #define NDIDX3D(arr, x, y, z) ((arr)->stride[0] * (z) + (arr)->stride[1] * (y) + (arr)->stride[0] * (x)) +static inline ptrdiff_t mg2di_ndarray_vidx(NDArray *arr, va_list ap) +{ + ptrdiff_t ret = 0; + for (unsigned int i = 0; i < arr->dims; i++) + ret += arr->stride[i] * va_arg(ap, ptrdiff_t); + return ret; +} + +static inline ptrdiff_t mg2di_ndarray_idx(NDArray *arr, ...) +{ + ptrdiff_t ret; + va_list ap; + va_start(ap, arr); + ret = mg2di_ndarray_vidx(arr, ap); + va_end(ap); + return ret; +} + #define NDPTR1D(arr, x) ((arr)->data + NDIDX1D(arr, x)) #define NDPTR2D(arr, x, y) ((arr)->data + NDIDX2D(arr, x, y)) #define NDPTR3D(arr, x, y, z) ((arr)->data + NDIDX2D(arr, x, y, z)) +static inline double *mg2di_ndarray_vdataptr(NDArray *arr, va_list ap) +{ + return arr->data + mg2di_ndarray_vidx(arr, ap); +} + +static inline double *mg2di_ndarray_dataptr(NDArray *arr, ...) +{ + va_list ap; + double *ret; + va_start(ap, arr); + ret = mg2di_ndarray_vdataptr(arr, ap); + va_end(ap); + return ret; +} + int mg2di_ndarray_alloc(NDArray **result, unsigned int dims, const size_t * const size, unsigned int flags); void mg2di_ndarray_free(NDArray **a); |