From: William S F. <ws...@fu...> - 2009-09-07 06:34:06
|
Leo Breebaart wrote: > I am currently stuck trying to SWIGify a library, but I'm fairly > sure that my problem is unfamiliarity with the SWIG way of doing > things, rather than anything else. > > I have two different functions: > > foo(int x, double *dst); > bar(int x, double *dst, int y); > > In foo(), 'dst' is a scalar output parameter. In bar(), it is an > array output parameter (to be pre-allocated by the user). > > My problem is simply: how can I tell SWIG to differentiate > between the two, and not generate the same code in both cases? > > If I do: > > (1) %apply double *OUTPUT { double *dst }; > > I get the scalar code in both cases, which is wrong for 'bar'. If > I do: > > (2) %apply double[] { double *dst }; > > I get the array code in both cases, which will actually also work > in the scalar case -- but it just seems so wasteful and > inelegant. > > If I try something like: > > (3) %apply double[] { (int x, double *dst, int y) }; > > in an attempt to use the pattern matching algorithm to get SWIG > to apply the array typemap only to bar(), I get a SWIG "Number of > arguments don't match" error. > The double[] typemap has not been written for multiple arguments, so this won't work. You'd have to write your own multiple argument typemap for this to work. > Finally, there's (I think): > > (4) change the name of the parameter to *dst_array in the bar > signature > > It is difficult for me to do that because I am not the person > controlling the library in question. Also, I am simply curious by > now to learn what the experts would do in the situation where (4) > is not an option. > > So my question: should I just stick with (2), or is there a more > natural / preferred SWIG way of solving what I am trying to do > here? > > If it helps, my target language is Java, and the double[] typemap > in question is defined in the system's "array_java.i" file. > > I will be very grateful for any kind of feedback on this issue! > Add the declaration of bar into your interface file, then ignore any subsequent versions (ie the one that will be in the header being wrapped)... %apply double *OUTPUT { double *dst }; void bar(int x, double *dst_array, int y); %ignore bar(int x, double *dst, int y); or if bar and foo are in different headers, use the preprocessor to change dst for one of them %include "foo.h" // asumming foo is declared in foo.h #define dst dst_array %include "bar.h" // assuming bar is declared in bar.h William |