From: William S F. <ws...@fu...> - 2011-01-24 19:32:18
|
I've fixed this in svn so that applying these typemaps to parameters does not break the return marshalling of the same type, it will still marshal the return type as a pointer as the default marshalling is documented. You can of course modify the default behaviour to marshal by value, which seems to be what you want, but at least there are no more compiler errors with this simple %apply. William On 20/01/11 19:10, Nick Darnell wrote: > Yes, that's perfect I found that last night but was still working > through some issues with it. I should probably lay out the actual usecase: > > If you're wrapping an interface for a templated list class, odds are the > GetAt function is going to return a reference to the object. You > wouldn't want to return an object by value in case it has no copy > constructor, also its just inefficient if it's not necessary. > > In my example, I have a list class templated for floats so I have, > > float& GetAt(int index) { ... } > > Which if you were just using it in C++, you'd assign it to a float and > go on your way. But since this isn't a const float& the standard > mapping rules for swig don't apply to convert it to just a float when > returning. Which, universally I would suspect is what most people would > actually expect swig to do by default. At least for POD types. > > After adding out="CSTYPE" to my C# typemaps.i rules for the OUTPUT type > map, I got very strange behavior. It correctly recognized my intention > to return a float, but the other mapping code was still expecting the > mapping to be treated as a float&. So while the C++ code was returning > it as a float, and the C# PInvoke layer was treating it as a float, > neither the C++ typemap(out) nor the C# typemap(csout) treated it as a > float. Neither of these are provided by default under the OUTPUT > mapping, so it just reverts to the default for float&. > > So what you end up with is this: > > public float GetAt(int nIndex) { > SWIGTYPE_p_float ret = new > SWIGTYPE_p_float(YourLibPINVOKE.MyListFloat_GetAt(swigCPtr, nIndex), false); > return ret; > } > > So here are the modifications I had to make to typemaps.i for C#: > > %define OUTPUT_TYPEMAP(TYPE, CTYPE, CSTYPE, TYPECHECKPRECEDENCE) > %typemap(ctype, out="CSTYPE") TYPE *OUTPUT, TYPE &OUTPUT "CTYPE *" > %typemap(imtype, out="CSTYPE") TYPE *OUTPUT, TYPE &OUTPUT "out CSTYPE" > %typemap(cstype, out="CSTYPE") TYPE *OUTPUT, TYPE &OUTPUT "out CSTYPE" > %typemap(csin) TYPE *OUTPUT, TYPE &OUTPUT "out $csinput" > %typemap(csout) TYPE *OUTPUT, TYPE &OUTPUT { > CSTYPE ret = $imcall;$excode > return ret; > } > %typemap(csdirectorin) TYPE *OUTPUT, TYPE &OUTPUT "$iminput" > %typemap(csdirectorout) TYPE *OUTPUT, TYPE &OUTPUT "$cscall" > > > %typemap(in) TYPE *OUTPUT, TYPE &OUTPUT > %{ $1 = ($1_ltype)$input; %} > > %typemap(out) TYPE *OUTPUT, TYPE &OUTPUT %{ > $result = *$1; > %} > > Which results in: > > public float GetAt(int nIndex) { > float ret = YourLibPINVOKE.MyListFloat_GetAt(swigCPtr, nIndex); > return ret; > } > > So for returning float& it correctly converts them to float. Yet for > incoming float& as parameters it correctly converts them to out float > when mapped to C#. Took a fair amount of trail and error, but hopefully > this will help someone else. > > -Nick > > > > ------------------------------------------------------------------------------ > Protect Your Site and Customers from Malware Attacks > Learn about various malware tactics and how to avoid them. Understand > malware threats, the impact they can have on your business, and how you > can protect your company and customers by using code signing. > http://p.sf.net/sfu/oracle-sfdevnl > > > > _______________________________________________ > Swig-user mailing list > Swi...@li... > https://lists.sourceforge.net/lists/listinfo/swig-user |