11#include <numpy/arrayobject.h>
14namespace nda::python {
19 static inline void py_decref(
void *x) { Py_DECREF((PyObject *)x); }
24 nda::mem::handle_shared<T> make_handle(PyObject *obj) {
26 if (obj == NULL)
throw std::runtime_error(
" Can not build an mem_blk_handle from a NULL PyObject *");
27 if (!PyArray_Check(obj))
throw std::runtime_error(
"Internal error : ref_counter construct from pyo : obj is not an array");
32 PyArrayObject *arr = (PyArrayObject *)(obj);
34 nda::mem::handle_shared<T> r{
35 (T *)PyArray_DATA(arr),
36 size_t(PyArray_SIZE(arr)),
47 static void delete_pycapsule(PyObject *capsule) {
48 nda::mem::handle_shared<T> *handle =
static_cast<nda::mem::handle_shared<T> *
>(PyCapsule_GetPointer(capsule,
"guard"));
57 PyObject *make_pycapsule(nda::mem::handle_heap<T>
const &h) {
58 void *keep =
new nda::mem::handle_shared<T>{h};
59 return PyCapsule_New(keep,
"guard", &delete_pycapsule<T>);
63 PyObject *make_pycapsule(nda::mem::handle_borrowed<T>
const &h) {
64 using U = std::remove_const_t<T>;
65 if (h.
parent() ==
nullptr)
throw std::runtime_error(
"Can not return to python a view on something else than an nda::array");
66 void *keep =
new nda::mem::handle_shared<U>{*h.
parent()};
67 return PyCapsule_New(keep,
"guard", &delete_pycapsule<T>);
Includes all relevant headers for the core nda library.
handle_heap< T0 > const * parent() const
Get a pointer to the parent handle.