summaryrefslogtreecommitdiff
path: root/ndarray.h
diff options
context:
space:
mode:
Diffstat (limited to 'ndarray.h')
-rw-r--r--ndarray.h33
1 files changed, 33 insertions, 0 deletions
diff --git a/ndarray.h b/ndarray.h
index db58254..ce08056 100644
--- a/ndarray.h
+++ b/ndarray.h
@@ -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);