Skip to content

Commit

Permalink
Add Ndt_FromOffsetsAndDtype().
Browse files Browse the repository at this point in the history
  • Loading branch information
skrah committed Oct 23, 2018
1 parent d0c312b commit 0e7da0b
Show file tree
Hide file tree
Showing 4 changed files with 78 additions and 1 deletion.
1 change: 1 addition & 0 deletions libndtypes/ndtypes.h.in
Expand Up @@ -833,6 +833,7 @@ NDTYPES_API ndt_t *ndt_from_string_fill_meta(ndt_meta_t *m, const char *input, n

/* Metadata is provided and managed by an external source. */
NDTYPES_API ndt_t *ndt_from_metadata_and_dtype(const ndt_meta_t *m, const char *dtype, ndt_context_t *ctx);
NDTYPES_API ndt_t *ndt_from_metadata_opt_and_dtype(const ndt_meta_t *m, bool *opt, ndt_t *dtype, ndt_context_t *ctx);

NDTYPES_API ndt_meta_t *ndt_meta_new(ndt_context_t *ctx);
NDTYPES_API void ndt_meta_del(ndt_meta_t *m);
Expand Down
32 changes: 32 additions & 0 deletions libndtypes/parser.c
Expand Up @@ -244,3 +244,35 @@ ndt_from_metadata_and_dtype(const ndt_meta_t *m, const char *dtype, ndt_context_

return t;
}

ndt_t *
ndt_from_metadata_opt_and_dtype(const ndt_meta_t *m, bool *opt, ndt_t *dtype,
ndt_context_t *ctx)
{
ndt_t *t;
int i;

if (ndt_is_abstract(dtype)) {
ndt_err_format(ctx, NDT_InvalidArgumentError,
"cannot create abstract type with offsets");
ndt_free(opt);
ndt_del(dtype);
return NULL;
}

t = dtype;
for (i = 0; i < m->ndims; i++) {
t = ndt_var_dim(t, ExternalOffsets, m->noffsets[i], m->offsets[i],
0, NULL, ctx);
if (t == NULL) {
ndt_free(opt);
return NULL;
}
if (opt[i]) {
t = ndt_option(t);
}
}

ndt_free(opt);
return t;
}
36 changes: 36 additions & 0 deletions python/ndtypes/_ndtypes.c
Expand Up @@ -412,6 +412,34 @@ ndtype_from_offsets_and_dtype(PyTypeObject *tp, PyObject *offsets, PyObject *dty
return self;
}

static PyObject *
ndtype_from_offsets_opt_and_dtype(PyTypeObject *tp, PyObject *offsets, bool *opt,
ndt_t *dtype)
{
NDT_STATIC_CONTEXT(ctx);
PyObject *self;

self = ndtype_alloc(tp);
if (self == NULL) {
return NULL;
}

RBUF(self) = rbuf_from_offset_lists(offsets);
if (RBUF(self) == NULL) {
Py_DECREF(self);
return NULL;
}

NDT(self) = ndt_from_metadata_opt_and_dtype(RBUF_NDT_META(self), opt, dtype, &ctx);

if (NDT(self) == NULL) {
Py_DECREF(self);
return seterr(&ctx);
}

return self;
}

static PyObject *
ndtype_deserialize(PyTypeObject *tp, PyObject *bytes)
{
Expand Down Expand Up @@ -1138,6 +1166,13 @@ Ndt_FromObject(PyObject *obj)
return ndtype_from_object(&Ndt_Type, obj);
}

static PyObject *
Ndt_FromOffsetsAndDtype(PyObject *offsets, bool *opt, ndt_t *dtype)
{
return ndtype_from_offsets_opt_and_dtype(&Ndt_Type, offsets, opt, dtype);
}


static PyObject *
init_api(void)
{
Expand All @@ -1149,6 +1184,7 @@ init_api(void)
ndtypes_api[Ndt_MoveSubtree_INDEX] = (void *)Ndt_MoveSubtree;
ndtypes_api[Ndt_FromType_INDEX] = (void *)Ndt_FromType;
ndtypes_api[Ndt_FromObject_INDEX] = (void *)Ndt_FromObject;
ndtypes_api[Ndt_FromOffsetsAndDtype_INDEX] = (void *)Ndt_FromOffsetsAndDtype;

return PyCapsule_New(ndtypes_api, "ndtypes._ndtypes._API", NULL);
}
Expand Down
10 changes: 9 additions & 1 deletion python/ndtypes/pyndtypes.h
Expand Up @@ -96,7 +96,11 @@ typedef struct {
#define Ndt_FromObject_RETURN PyObject *
#define Ndt_FromObject_ARGS (PyObject *)

#define NDTYPES_MAX_API 8
#define Ndt_FromOffsetsAndDtype_INDEX 8
#define Ndt_FromOffsetsAndDtype_RETURN PyObject *
#define Ndt_FromOffsetsAndDtype_ARGS (PyObject *offsets, bool *opt, ndt_t *dtype)

#define NDTYPES_MAX_API 9


#ifdef NDTYPES_MODULE
Expand All @@ -108,6 +112,7 @@ static Ndt_CopySubtree_RETURN Ndt_CopySubtree Ndt_CopySubtree_ARGS;
static Ndt_MoveSubtree_RETURN Ndt_MoveSubtree Ndt_MoveSubtree_ARGS;
static Ndt_FromType_RETURN Ndt_FromType Ndt_FromType_ARGS;
static Ndt_FromObject_RETURN Ndt_FromObject Ndt_FromObject_ARGS;
static Ndt_FromOffsetsAndDtype_RETURN Ndt_FromOffsetsAndDtype Ndt_FromOffsetsAndDtype_ARGS;
#else
static void **_ndtypes_api;

Expand Down Expand Up @@ -135,6 +140,9 @@ static void **_ndtypes_api;
#define Ndt_FromObject \
(*(Ndt_FromObject_RETURN (*)Ndt_FromObject_ARGS) _ndtypes_api[Ndt_FromObject_INDEX])

#define Ndt_FromOffsetsAndDtype \
(*(Ndt_FromOffsetsAndDtype_RETURN (*)Ndt_FromOffsetsAndDtype_ARGS) _ndtypes_api[Ndt_FromOffsetsAndDtype_INDEX])

static int
import_ndtypes(void)
{
Expand Down

0 comments on commit 0e7da0b

Please sign in to comment.