summaryrefslogtreecommitdiff
path: root/ndarray.c
diff options
context:
space:
mode:
Diffstat (limited to 'ndarray.c')
-rw-r--r--ndarray.c48
1 files changed, 48 insertions, 0 deletions
diff --git a/ndarray.c b/ndarray.c
index a733955..504bfb7 100644
--- a/ndarray.c
+++ b/ndarray.c
@@ -168,6 +168,54 @@ fail:
return ret;
}
+int mg2di_ndarray_wrap(NDArray **result, unsigned int dims,
+ const size_t * const size, double *data,
+ const ptrdiff_t * const stride)
+{
+ NDArray *a;
+ int ret;
+
+ if (!dims || dims >= INT_MAX)
+ return -EINVAL;
+
+ a = calloc(1, sizeof(*a));
+ if (!a)
+ return -ENOMEM;
+
+ a->priv = calloc(1, sizeof(*a->priv));
+ if (!a->priv) {
+ free(a);
+ return -ENOMEM;
+ }
+
+ a->priv->shape = calloc(dims, sizeof(*a->priv->shape));
+ if (!a->priv->shape) {
+ ret = -ENOMEM;
+ goto fail;
+ }
+ memcpy(a->priv->shape, size, dims * sizeof(*a->priv->shape));
+
+ a->priv->stride = calloc(dims, sizeof(*a->priv->stride));
+ if (!a->priv->stride) {
+ ret = -ENOMEM;
+ goto fail;
+ }
+ memcpy(a->priv->stride, stride, dims * sizeof(*a->priv->shape));
+
+ a->dims = dims;
+
+ a->data = data;
+ a->shape = a->priv->shape;
+ a->stride = a->priv->stride;
+
+ *result = a;
+
+ return 0;
+fail:
+ mg2di_ndarray_free(&a);
+ return ret;
+}
+
void mg2di_ndarray_free(NDArray **pa)
{
NDArray *a = *pa;