WIP cpp array wrapper
This commit is contained in:
parent
c155319b59
commit
4d2e9fc6e7
2 changed files with 85 additions and 0 deletions
39
cnorxz/core/include/array_wrapper.h
Normal file
39
cnorxz/core/include/array_wrapper.h
Normal file
|
@ -0,0 +1,39 @@
|
|||
|
||||
#include <Python.h>
|
||||
#include "cnorxz.h"
|
||||
|
||||
namespace CNORXZ
|
||||
{
|
||||
|
||||
class CArrayWrapperBase
|
||||
{
|
||||
public:
|
||||
DEFAULT_MEMBERS(ArrayWrapperBase);
|
||||
virtual ~CArrayWrapperBase() = default;
|
||||
|
||||
virtual RangePtr range() const = 0;
|
||||
virtual SizeT size() const = 0;
|
||||
// virtual PyObject* get() const = 0; // operator[]!!
|
||||
};
|
||||
|
||||
template <typename T>
|
||||
class CArrayWrapper : public CArrayWrapperBase
|
||||
{
|
||||
private:
|
||||
Sptr<CArrayBase<T>> mArr;
|
||||
|
||||
public:
|
||||
DEFAULT_MEMBERS(ArrayWrapper);
|
||||
CArrayWrapper(const RangePtr& r) : mArr( std::make_shared<MArray<T>>(r) ) {}
|
||||
|
||||
virtual RangePtr range() const override final { return mArr->range(); }
|
||||
virtual SizeT size() const override final { return mArr->size(); }
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
struct PyCArrayB
|
||||
{
|
||||
PyObject_HEAD
|
||||
CNORXZ::CArrayWrapperBase* ptrObj;
|
||||
};
|
46
cnorxz/core/lib/array_wrapper.cpp
Normal file
46
cnorxz/core/lib/array_wrapper.cpp
Normal file
|
@ -0,0 +1,46 @@
|
|||
|
||||
#include "cnorxz/core/include/array_wrapper.h"
|
||||
|
||||
using namespace CNORXZ
|
||||
|
||||
static int PyCArrayB_init(CArrayWrapperBase* self, PyObject* args, PyObject* kwds)
|
||||
{
|
||||
static char* kwlist[] = { "type", "extension" , NULL };
|
||||
SizeT ext = 0;
|
||||
const char* type;
|
||||
|
||||
if(not PyArg_ParseTupleAndKeywords(args, kwds, "s|k", kwlist, &type, &ext)){
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if(ext != 0){
|
||||
RangePtr r = CRangeFactory(ext).create();
|
||||
self->ptrObj = new CArrayBase<T>(r);
|
||||
}
|
||||
else {
|
||||
self->ptrObj = new CArrayBase<T>();
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void PyCArrayB_dealloc(CArrayWrapperBase* self)
|
||||
{
|
||||
delete self->ptrObject;
|
||||
Py_TYPE(self)->tp_free(self);
|
||||
}
|
||||
|
||||
static PyObject* PyCArrayB_size(CArrayWrapperBase* self)
|
||||
{
|
||||
if(not self->ptrObj->range()){
|
||||
PyErr_SetString(PyExc_RuntimeError, "array not initialized");
|
||||
return NULL;
|
||||
}
|
||||
const SizeT retval = self->ptrObj->size();
|
||||
return Py_BuildValue("k",retval);
|
||||
}
|
||||
|
||||
static PyMethodDef PyCArrayB_methods[] = {
|
||||
{ "size", (PyCFunction)PyCArrayB_size, METH_VARARGS, "return size of the array" },
|
||||
{ NULL }
|
||||
};
|
||||
|
Loading…
Reference in a new issue