From: Anton D. <ant...@jh...> - 2009-04-30 03:37:03
|
Hello, I am running into an odd little problem and need some help. I have a C++ class with an overload "=" operators which is not strictly equivalent to a copy constructor. We use this for vectors and matrices. The "=" operator only performs a copy of the data and will throw an exception if the sizes of operands don't match. For example: vector v1; v1.SetSize(10); vector v2; v2 = v1; // leads to runtime exception v2.SetSize(v1.size()); v2 = v1; // works I am trying to wrap these C++ classes for Python. The problem is that the code generated by SWIG before my typemaps get inserted uses the "=" operator. For example, in an "out" typemap, I would get the following code generated: result = vctDynamicVector<int>; result = (arg1)->out_vctDynamicVector(arg2); "result" is created with a size 0 and the method "out_vctDynamicVector" (created to test typemap(out)) returns a non 0 size vector, this fails before I can do anything. I tinkered with the generated code and I can use the placement new to solve my problem in a somewhat portable way: result = vctDynamicVector<int> new (&result) vctDynamicVector<int>((arg1)->out_vctDynamicVector(arg2)); The idea is that the semantic of the copy constructor is a bit less ambiguous than the "=" operator, i.e. it performs a SetSize and then copy of elements. As this requires to modify the code generated by SWIG, this is obviously not viable. Did anyone run into a similar problem in the past? Do I have any way to fix this problem (some kind of pre-out typemap), flag in the typemap to replace the actual call the the C++ method? Thanks, Anton |
From: Josh C. <jc...@nc...> - 2009-04-30 04:15:43
|
On Wed, 29 Apr 2009, Anton Deguet wrote: > I am running into an odd little problem and need some help. I have a > C++ class with an overload "=" operators which is not strictly > equivalent to a copy constructor. We use this for vectors and matrices. > The "=" operator only performs a copy of the data and will throw an > exception if the sizes of operands don't match. For example: Try this: %feature("valuewrapper") MyClassName; SWIG can deal with things like non-public assignment operators, and this should invoke that mechanism. Josh |
From: William S F. <ws...@fu...> - 2009-04-30 06:19:20
|
Josh Cherry wrote: > > On Wed, 29 Apr 2009, Anton Deguet wrote: > > > I am running into an odd little problem and need some help. I have a > > C++ class with an overload "=" operators which is not strictly > > equivalent to a copy constructor. We use this for vectors and > matrices. > > The "=" operator only performs a copy of the data and will throw an > > exception if the sizes of operands don't match. For example: > > Try this: > > %feature("valuewrapper") MyClassName; > > SWIG can deal with things like non-public assignment operators, and this > should invoke that mechanism. > Also take a look at the 'optimal' attribute in the 'out' typemap. This is usually used to optimise return by value avoiding all copy constructors and assignment operators, but can equally be used for your purpose. See http://www.swig.org/Doc1.3/Typemaps.html#Typemaps_optimal. William |