21static PyObject* ia_iternext(ia_iterobject* ia) {
22 if (ia->ia_len != (Py_ssize_t)-1 && ia->ia_pos >= ia->ia_len) {
25 }
else if (ia->ia_stride == 0 && ia->ia_pos != 0) {
26 PyErr_SetString(PyExc_ReferenceError,
"no stride available for indexing");
30 (
char*)ia->ia_array_start + ia->ia_pos * ia->ia_stride, ia->ia_klass);
35static int ia_traverse(ia_iterobject*, visitproc,
void*) {
return 0; }
37static PyObject* ia_getsize(ia_iterobject* ia,
void*) {
38 return PyLong_FromSsize_t(ia->ia_len);
41static int ia_setsize(ia_iterobject* ia,
PyObject* pysize,
void*) {
42 Py_ssize_t
size = PyLong_AsSsize_t(pysize);
43 if (
size == (Py_ssize_t)-1 && PyErr_Occurred())
49static PyGetSetDef ia_getset[] = {
50 {(
char*)
"size", (getter)ia_getsize, (setter)ia_setsize,
51 (
char*)
"set size of array to which this iterator refers",
nullptr},
52 {(
char*)
nullptr,
nullptr,
nullptr,
nullptr,
nullptr}};
54static Py_ssize_t ia_length(ia_iterobject* ia) {
return ia->ia_len; }
60 Py_ssize_t idx = PyLong_AsSsize_t(pyidx);
61 if (idx == (Py_ssize_t)-1 && PyErr_Occurred())
64 if (ia->ia_len != (Py_ssize_t)-1 && (idx < 0 || ia->ia_len <= idx)) {
65 PyErr_SetString(PyExc_IndexError,
"index out of range");
70 (
char*)ia->ia_array_start + ia->ia_pos * ia->ia_stride, ia->ia_klass);
73static PyMappingMethods ia_as_mapping = {
75 (binaryfunc)ia_subscript,
76 (objobjargproc)
nullptr,
84 PyVarObject_HEAD_INIT(&PyType_Type,
85 0)(
char*)
"cppjit.instancearrayiter",
86 sizeof(ia_iterobject),
88 (destructor)PyObject_GC_Del,
103 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,
105 (traverseproc)ia_traverse,
110 (iternextfunc)ia_iternext,
147 ia->ia_klass = klass;
148 ia->ia_array_start = address.data;
153 PyObject_GC_Track(ia);
155 }
else if (1 < dims.
ndim()) {
157 size_t block_size = 1;
158 for (Py_ssize_t i = 1; i < dims.
ndim(); ++i) {
160 block_size *= (size_t)dims[i];
164 Py_ssize_t nelems = dims[0];
165 PyObject* tup = PyTuple_New(nelems);
166 for (Py_ssize_t i = 0; i < nelems; ++i) {
175 int nelems = (
int)dims[0];
177 if (block_size == 0) {
178 PyErr_Format(PyExc_TypeError,
179 "can not determine size of type \"%s\" for array indexing",
186 PyObject* tup = PyTuple_New(nelems);
187 for (
int i = 0; i < nelems; ++i) {
199 PyTuple_SET_ITEM(args, 0, tup);
214 PyVarObject_HEAD_INIT(&PyType_Type,
215 0)(
char*)
"cppjit.InstancesArray",
233 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
234 (
char*)
"array of C++ instances",
size_t size(const MatrixT &matrix)
retrieve the size of a square matrix
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t result
#define CPYRT_PYTYPE_TAIL
PyTypeObject TupleOfInstances_Type
Representation of C-style array of instances.
PyTypeObject InstanceArrayIter_Type
PyObject * TupleOfInstances_New(interop::TCppObject_t address, interop::TCppScope_t klass, cdims_t dims)
static const dim_t UNKNOWN_SIZE
PyObject * BindCppObjectNoCast(interop::TCppObject_t object, interop::TCppScope_t klass, const unsigned flags=0)
Cpp::ObjectRef TCppObject_t
size_t SizeOf(TCppScope_t klass)
std::string GetScopedFinalName(TCppScope_t type)