From 4d2e9fc6e7dd2b217d3d230f5de70d04feba2c2d Mon Sep 17 00:00:00 2001
From: Christian Zimmermann <christian.zimmermann@ur.de>
Date: Tue, 23 May 2023 00:48:01 +0200
Subject: [PATCH] WIP cpp array wrapper

---
 cnorxz/core/include/array_wrapper.h | 39 ++++++++++++++++++++++++
 cnorxz/core/lib/array_wrapper.cpp   | 46 +++++++++++++++++++++++++++++
 2 files changed, 85 insertions(+)
 create mode 100644 cnorxz/core/include/array_wrapper.h
 create mode 100644 cnorxz/core/lib/array_wrapper.cpp

diff --git a/cnorxz/core/include/array_wrapper.h b/cnorxz/core/include/array_wrapper.h
new file mode 100644
index 0000000..cb1abcb
--- /dev/null
+++ b/cnorxz/core/include/array_wrapper.h
@@ -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;
+};
diff --git a/cnorxz/core/lib/array_wrapper.cpp b/cnorxz/core/lib/array_wrapper.cpp
new file mode 100644
index 0000000..456db02
--- /dev/null
+++ b/cnorxz/core/lib/array_wrapper.cpp
@@ -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 }
+};
+