Hi Phil, Am Donnerstag 09 September 2010, 16:35:00 schrieb Phil Thompson: > <me...@informatik.uni-hamburg.de> wrote: > > I was happy when I saw that %MappedType supports templates, but then I > > realized that I could not use it for my multi-dimensional array type [1] > > since > > it does not support non-class arguments (integer dimension in my case). > > > > Would that be hard to fix? > > It does support non-class arguments.
That sounds great, but... > > [1] http://tinyurl.com/NumpyArray is what I am dealing with > > I don't see the problem with this. Compare with PyQt's QPair<TYPE, int> > where TYPE is a class. I am not sure I see the connection. QPair does take two types, one of them being int here. Maybe "non-class argument" was a little bit misleading, I was thinking of template<class value_type> ... which is a synonym (don't we all love ambiguity) for template<typename value_type> in contrast to template<unsigned int DIMENSION> class FixedSizeVector ... Of course, 'int' is a 'class' (/'typename') in the above template-arg sense and is supported by SIP, but I am interested in this exact use case: typedef NumpyArray<4, vigra::UInt16> UInt16Array4D; I have attached a corresponding SIP file that does not work (SIP gives a syntax error at the above line), which you may try yourself with VIGRA [1]. Thanks for the reply, Hans [1] NumpyArray is new in VIGRA 1.7.0; your distribution might come with an older version: http://hci.iwr.uni-heidelberg.de/vigra/
template<N, T> %MappedType NumpyArray<N, T> { %TypeHeaderCode // contains // #include <vigra/numpy_array.hxx> // plus the same typedefs as at the bottom of this file: #include "python_arrays.hxx" %End %ConvertToTypeCode if(sipIsErr == NULL) return NumpyArray<N, T>::isReferenceCompatible(sipPy); NumpyArray<N, T> *array = new NumpyArray<N, T>(); bool ok = array->makeReference(sipPy); if(!ok) { // FIXME: set up proper exception // *sipIsErr = true; delete array; return 0; // there is no temporary instance } *sipCppPtr = array; // not really sure about this one; seems to be SIP // boilerplate-code: return sipGetState(sipTransferObj); %End %ConvertFromTypeCode PyObject *result = sipCpp->pyObject(); if(!result) { if(!PyErr_Occurred()) PyErr_SetString(PyExc_ValueError, "Cannot convert invalid PythonArray to ndarray"); return NULL; } Py_INCREF(result); // FIXME: what about sipTransferObj? return result; %End }; typedef NumpyArray<4, vigra::UInt16> UInt16Array4D; typedef NumpyArray<2, vigra::UInt32> UInt32Array2D;
_______________________________________________ PyQt mailing list PyQt@riverbankcomputing.com http://www.riverbankcomputing.com/mailman/listinfo/pyqt