diff options
Diffstat (limited to 'ndarray.c')
-rw-r--r-- | ndarray.c | 48 |
1 files changed, 48 insertions, 0 deletions
@@ -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; |