Thanks! DG
Lisandro Dalcin wrote: > David, I'll try to show you what I do for a custom C++ class, of > course this does not solve the issue resizing (my class does not > actually support resizing, so this is fine for me): > > My custom class is a templatized one called DTable (is like a 2d > contiguous array), but currently I only instantiate it for 'int' and > 'double'. This class have two relevant methods: getShape(), returning > a std::pair, and getArray(), returning a reference to an underliing > std::vector. So I am able to automatically support array interface by > using this: > > First, I define a templatized utility function 'array_interface' > > %header %{ > namespace numpy { > > template<typename T> static char typechar() { return '\0'; } > template<> static char typechar<int>() { return 'i'; } > template<> static char typechar<double>() { return 'f'; } > > template<typename T> > static PyObject* > array_interface(const DTable<T>* self) > { > const std::pair<int,int>& shape = self->getShape(); > const std::vector<T>& data = self->getArray(); > void* array = const_cast<T*>(&data[0]); > char endian = PyArray_NATIVE; > char kind = typechar<T>(); > int elsize = sizeof(T); > return Py_BuildValue("{sNsNsNsN}", > "shape", Py_BuildValue("ii", shape.first, > shape.second), > "typestr", PyString_FromFormat("%c%c%d", endian, kind, > elsize), > "data", Py_BuildValue("NO", > PyLong_FromVoidPtr(array), Py_False), > "version", PyInt_FromLong(3)); > } > } > %} > > Now define a SWIG macro to apply it to instantiations of my class > > %define %array_interface(Class) > %extend Class { PyObject* __array_interface__; } > %{ > #define %mangle(Class) ##_## __array_interface__ ## _get(_t) \ > numpy::array_interface(_t) > #define %mangle(Class) ##_## __array_interface__ ## _set(_t, _val) \ > SWIG_exception_fail(SWIG_AttributeError, "read-only attribute") > %} > %enddef > > and finally instantiate my class with different names for 'int' and > 'double' in SWIG and finally apply previous macro > > > %template(DTableI) DTable<int>; > %template(DTableS) DTable<double>; > > %array_interface( DTable<int> ); > %array_interface( DTable<double> ); > > I think you can implement someting similar for std::vector, > std::valarray, or whatever... For use other data types, the only you > need is to specialize the 'typecode' function. > > Hope this help you. > > > On 9/4/07, David Goldsmith <[EMAIL PROTECTED]> wrote: > >> Anyone have a well-tested SWIG-based C++ STL valarray <=> numpy.array >> typemap to share? Thanks! >> >> DG >> -- >> ERD/ORR/NOS/NOAA <http://response.restoration.noaa.gov/emergencyresponse/> >> _______________________________________________ >> Numpy-discussion mailing list >> Numpy-discussion@scipy.org >> http://projects.scipy.org/mailman/listinfo/numpy-discussion >> >> > > > _______________________________________________ Numpy-discussion mailing list Numpy-discussion@scipy.org http://projects.scipy.org/mailman/listinfo/numpy-discussion