diff --git a/cnorxz/core/include/array_wrapper.h b/cnorxz/core/include/array_wrapper.h index ca8745f..58052df 100644 --- a/cnorxz/core/include/array_wrapper.h +++ b/cnorxz/core/include/array_wrapper.h @@ -24,7 +24,7 @@ namespace CNORXZ virtual void readFile(cer::Format f, const String& fname) const = 0; #endif virtual int typenum() const = 0; - virtual const void* data() const = 0; + virtual void* data() const = 0; virtual SizeT datasize() const = 0; }; @@ -92,8 +92,8 @@ namespace CNORXZ } #endif virtual int typenum() const override final { return Typenum::value; } - virtual const void* data() const override final - { return reinterpret_cast( mArr->data() ); } + virtual void* data() const override final + { return reinterpret_cast( mArr->data() ); } virtual SizeT datasize() const override final { return size() * sizeof(T); } }; @@ -108,6 +108,9 @@ struct PyCxArrayB int PyCxArrayB_init(PyCxArrayB* self, PyObject* args, PyObject* kwds); void PyCxArrayB_dealloc(PyCxArrayB* self); PyObject* PyCxArrayB_size(PyCxArrayB* self); +PyObject* PyCxArrayB_range(PyCxArrayB* self); +PyObject* PyCxArrayB_writeFile(PyCxArrayB* self, PyObject* args, PyObject* kwds); +PyObject* PyCxArrayB_readFile(PyCxArrayB* self, PyObject* args, PyObject* kwds); PyTypeObject* PyCxArrayBType_init(); extern PyMethodDef PyCxArrayB_methods[]; diff --git a/cnorxz/core/lib/array_wrapper.cpp b/cnorxz/core/lib/array_wrapper.cpp index 6194e68..81b71a9 100644 --- a/cnorxz/core/lib/array_wrapper.cpp +++ b/cnorxz/core/lib/array_wrapper.cpp @@ -77,7 +77,9 @@ Format formatFromString(const char* fstr) return f; } -void PyCxArrayB_writeFile(PyCxArrayB* self, PyObject* args, PyObject* kwds) +#ifdef HAVE_CEREAL + +PyObject* PyCxArrayB_writeFile(PyCxArrayB* self, PyObject* args, PyObject* kwds) { if(not self->ptrObj->range()){ PyErr_SetString(PyExc_RuntimeError, "array not initialized"); @@ -87,26 +89,29 @@ void PyCxArrayB_writeFile(PyCxArrayB* self, PyObject* args, PyObject* kwds) char* format = NULL; if(not PyArg_ParseTupleAndKeywords(args, kwds, "s|s", kwlist, &fname, &format)){ - return; + return NULL; } const String fn(fname); const Format f = formatFromString(format); self->ptrObj->writeFile(f, fn); + Py_RETURN_NONE; } -void PyCxArrayB_readFile(PyCxArrayB* self, PyObject* args, PyObject* kwds) +PyObject* PyCxArrayB_readFile(PyCxArrayB* self, PyObject* args, PyObject* kwds) { static char* kwlist[] = { "format", "filename" , NULL }; char* fname = NULL; char* format = NULL; if(not PyArg_ParseTupleAndKeywords(args, kwds, "s|s", kwlist, &fname, &format)){ - return; + return NULL; } const String fn(fname); const Format f = formatFromString(format); self->ptrObj->readFile(f, fn); + Py_RETURN_NONE; } +#endif PyObject* PyCxArrayB_npa(PyCxArrayB* self) { @@ -117,6 +122,10 @@ PyObject* PyCxArrayB_npa(PyCxArrayB* self) } const SizeT d = self->ptrObj->range()->dim(); std::vector dims(d); + for(SizeT i = 0; i != dims.size(); ++i){ + dims[i] = self->ptrObj->range()->sub(i)->size(); + } + // TODO: Do the following for mutable arrays!!! /* Py_INCREF(self); // keep data alive PyObject* o = PyArray_SimpleNewFromData @@ -129,7 +138,9 @@ PyObject* PyCxArrayB_npa(PyCxArrayB* self) //const npy_intp s = PyArray_NBYTES(o); const SizeT s = static_cast( PyArray_NBYTES(o) ); if(s != self->ptrObj->datasize()) { - PyErr_SetString(PyExc_RuntimeError, "lib error"); + PyErr_Format(PyExc_RuntimeError, "lib error %d vs %d", s, self->ptrObj->datasize()); + //PyErr_SetString(PyExc_RuntimeError, "lib error"); + return NULL; } memcpy( data, self->ptrObj->data(), self->ptrObj->datasize() ); return o; @@ -156,7 +167,7 @@ PyTypeObject* PyCxArrayBType_init() PyCxArrayBType.tp_methods = PyCxArrayB_methods; PyCxArrayBType.tp_init = (initproc) PyCxArrayB_init; - //import_array(); + import_array(); if(PyType_Ready(&PyCxArrayBType) < 0) { return NULL;