This example illustrates a couple of techniques for handling simple pointers in SWIG. The prototypical example is a C function that operates on pointers such as this:
void add(int *x, int *y, int *r) {
*r = *x + *y;
}
By default, SWIG wraps this function exactly as specified and creates
an interface that expects pointer objects for arguments. The only
problem is how does one go about creating these objects from a script?
int *new_int(int ivalue) {
int *i = (int *) malloc(sizeof(ivalue));
*i = ivalue;
return i;
}
int get_int(int *i) {
return *i;
}
void delete_int(int *i) {
free(i);
}
Now, in a script you would do this:
$a = new_int(37); $b = new_int(42); $c = new_int(0): add($a,$b,$c); $r = get_int($c); print "Result = $r\n"; delete_int($a); delete_int($b); delete_int($c);
and in a script you would do this:%include "cpointer.i"
The advantage to using the pointer library is that it unifies some of the helper functions behind a common set of names. For example, the same set of functions work with int, double, float, and other fundamental types.$a = example::new_intp(); $b = example::new_intp(); $c = example::new_intp(); example::intp_assign($a,37); example::intp_assign($b,42); example::add($a,$b,$c); $r = example::intp_value($c); print "Result = $r\n"; example::delete_intp($a); example::delete_intp($b); example::delete_intp($c);
And in a script:%include "typemaps.i" void add(int *INPUT, int *INPUT, int *OUTPUT);
Needless to say, this is substantially easier.$r = add(37,42); print "Result = $r\n";
%include "typemaps.i"
%apply int *INPUT {int *x, int *y};
%apply int *OUTPUT {int *r};
void add(int *x, int *y, int *r);
void subtract(int *x, int *y, int *r);
void mul(int *x, int *y, int *r);
... etc ...