From: Mark A. <as...@ie...> - 2010-01-29 20:12:40
Attachments:
smime.p7s
|
Hi there, as the subject states, I'm stuck with writing an input typemap. I have a small class representing a fixed-size numerical array on the C++ side. Some methods use this as input parameter and I want Python to take tuples or lists instead. In C++ I've got the following typemap code (simplified): class duple { float data[2]; public: duple (const float first, const float second) { this->data[0] = first; this->data[1] = second; } float & operator[] (const int i) { return data[i]; } }; void print_duple_1 (const duple input); void print_duple_2 (const duple & input); In addition I have the following SWIG code: %typemap(in) duple { int okay = 0; // is this a sequence? if (PySequence_Check ($input) && (PySequence_Size ($input) == 2)) { // copy values PyObject * tuple = PySequence_Tuple ($input); okay = PyArg_ParseTuple (tuple, "ff", & $1[0], & $1[1]); Py_DECREF (tuple); } if (! okay) return NULL; } Now, despite the problems I have with SWIG creating empty pointers in wrap_print_duple_2, I am wondering how I can teach it to create a local instance of duple() by not using the default contructor but for example duple(0,0)? In the wrapping code I always get a: duple arg1; that of course cannot be compiled. Thanks in advance, Mark -- Mark Asbach Institut für Nachrichtentechnik, RWTH Aachen University http://www.ient.rwth-aachen.de/cms/team/m_asbach |
From: Changsheng J. <jia...@gm...> - 2010-01-30 03:51:36
|
I am a newbie, and think this very helpful to refer parameters in typemap(out), if possible. The main difficulty is that the numinputs only takes value 0, or 1. You can wrap it in Python, for any call with two parameters, pack the two parameters as a tuple, dispatch it to the one parameters construction. Changsheng Jiang On Fri, Jan 29, 2010 at 22:42, Mark Asbach <as...@ie...> wrote: > Hi there, > > as the subject states, I'm stuck with writing an input typemap. I have a small class representing a fixed-size numerical array on the C++ side. Some methods use this as input parameter and I want Python to take tuples or lists instead. > > In C++ I've got the following typemap code (simplified): > > class duple > { > float data[2]; > > public: > duple (const float first, const float second) > { this->data[0] = first; this->data[1] = second; } > > float & operator[] (const int i) { return data[i]; } > }; > > void print_duple_1 (const duple input); > void print_duple_2 (const duple & input); > > In addition I have the following SWIG code: > > %typemap(in) duple > { > int okay = 0; > > // is this a sequence? > if (PySequence_Check ($input) && (PySequence_Size ($input) == 2)) > { > // copy values > PyObject * tuple = PySequence_Tuple ($input); > okay = PyArg_ParseTuple (tuple, "ff", & $1[0], & $1[1]); > Py_DECREF (tuple); > } > > if (! okay) > return NULL; > } > > Now, despite the problems I have with SWIG creating empty pointers in wrap_print_duple_2, I am wondering how I can teach it to create a local instance of duple() by not using the default contructor but for example duple(0,0)? In the wrapping code I always get a: > > duple arg1; > > that of course cannot be compiled. > > > Thanks in advance, > Mark > > -- > Mark Asbach > Institut für Nachrichtentechnik, RWTH Aachen University > http://www.ient.rwth-aachen.de/cms/team/m_asbach > > > ------------------------------------------------------------------------------ > The Planet: dedicated and managed hosting, cloud storage, colocation > Stay online with enterprise data centers and the best network in the business > Choose flexible plans and management services without long-term contracts > Personal 24x7 support from experience hosting pros just a phone call away. > http://p.sf.net/sfu/theplanet-com > _______________________________________________ > Swig-user mailing list > Swi...@li... > https://lists.sourceforge.net/lists/listinfo/swig-user > > |
From: Mark A. <as...@ie...> - 2010-02-03 15:21:33
Attachments:
smime.p7s
|
Hi list, just in case someone stumbles over the same problem: > as the subject states, I'm stuck with writing an input typemap. I have a small class representing a fixed-size numerical array on the C++ side. Some methods use this as input parameter and I want Python to take tuples or lists instead. Okay, found how to solve it. Sorry, it WAS in the manual, at least all parts of the solution, I just had to bring them together ;-) And somehow I must have mixed things up when experimenting because now, SWIG generates the SWIGValueWrapper template that allows to assign an already constructed element later. So I now solved it with: %typemap(in) duple (duple my_tuple = duple(0,0)) { // do conversion from PySequence to correctly constructed my_tuple instance my_duple[0] = ... [...] // copy initialized value to SWIGValueWrapper<duple> arg1; $1 = my_tuple; } For references to duple (duple & arg), the code is similar: %typemap(in) duple & (duple my_tuple = duple(0,0)) { // do conversion from PySequence to correctly constructed my_tuple instance my_duple[0] = ... [...] // copy initialized value to SWIGValueWrapper<duple> arg1; $1 = & my_tuple; } I'm still wondering, why SWIG insists on generating a pointer for call by reference arguments, but at least it works now for me. Best, Mark -- Mark Asbach Institut für Nachrichtentechnik, RWTH Aachen University http://www.ient.rwth-aachen.de/cms/team/m_asbach |