new example
git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk@841 626c5289-ae23-0410-ae9c-e8d60b6d4f22
This commit is contained in:
parent
19f72587d9
commit
91340b52d0
6 changed files with 134 additions and 13 deletions
|
|
@ -9,11 +9,9 @@ public:
|
||||||
nshapes--;
|
nshapes--;
|
||||||
};
|
};
|
||||||
double x, y;
|
double x, y;
|
||||||
char foo[256];
|
|
||||||
void move(double dx, double dy);
|
void move(double dx, double dy);
|
||||||
virtual double area() = 0;
|
virtual double area() = 0;
|
||||||
virtual double perimeter() = 0;
|
virtual double perimeter() = 0;
|
||||||
char *name() { return "Shape"; }
|
|
||||||
static int nshapes;
|
static int nshapes;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -26,13 +24,6 @@ public:
|
||||||
virtual double perimeter();
|
virtual double perimeter();
|
||||||
};
|
};
|
||||||
|
|
||||||
class XCircle : public Circle {
|
|
||||||
public:
|
|
||||||
XCircle(double r) : Circle(r) { };
|
|
||||||
virtual double area();
|
|
||||||
char *name() { return "XCircle"; }
|
|
||||||
};
|
|
||||||
|
|
||||||
class Square : public Shape {
|
class Square : public Shape {
|
||||||
private:
|
private:
|
||||||
double width;
|
double width;
|
||||||
|
|
|
||||||
|
|
@ -6,9 +6,5 @@
|
||||||
%}
|
%}
|
||||||
|
|
||||||
/* Let's just grab the original header file here */
|
/* Let's just grab the original header file here */
|
||||||
%typemap(memberin) char [ANY] {
|
|
||||||
strncpy($target,$source,$dim0);
|
|
||||||
}
|
|
||||||
|
|
||||||
%include "example.h"
|
%include "example.h"
|
||||||
|
|
||||||
|
|
|
||||||
7
SWIG/Examples/python/funcptr/example.h
Normal file
7
SWIG/Examples/python/funcptr/example.h
Normal file
|
|
@ -0,0 +1,7 @@
|
||||||
|
/* file: example.h */
|
||||||
|
|
||||||
|
extern int do_op(int,int, int (*op)(int,int));
|
||||||
|
extern int add(int,int);
|
||||||
|
extern int sub(int,int);
|
||||||
|
extern int mul(int,int);
|
||||||
|
|
||||||
15
SWIG/Examples/python/funcptr/example.i
Normal file
15
SWIG/Examples/python/funcptr/example.i
Normal file
|
|
@ -0,0 +1,15 @@
|
||||||
|
/* File : example.i */
|
||||||
|
%module example
|
||||||
|
%{
|
||||||
|
#include "example.h"
|
||||||
|
%}
|
||||||
|
|
||||||
|
/* Wrap a function taking a pointer to a function */
|
||||||
|
extern int do_op(int a, int b, int (*op)(int, int));
|
||||||
|
|
||||||
|
/* Now install a bunch of "ops" as constants */
|
||||||
|
%constant(int (*)(int,int)) ADD = add;
|
||||||
|
%constant(int (*)(int,int)) SUB = sub;
|
||||||
|
%constant(int (*)(int,int)) MUL = mul;
|
||||||
|
|
||||||
|
|
||||||
20
SWIG/Examples/python/funcptr/example.py
Normal file
20
SWIG/Examples/python/funcptr/example.py
Normal file
|
|
@ -0,0 +1,20 @@
|
||||||
|
# file: example.py
|
||||||
|
|
||||||
|
import example
|
||||||
|
|
||||||
|
a = 37
|
||||||
|
b = 42
|
||||||
|
|
||||||
|
# Now call our C function with a bunch of callbacks
|
||||||
|
|
||||||
|
print "Trying some C callback functions"
|
||||||
|
print " a =", a
|
||||||
|
print " b =", b
|
||||||
|
print " ADD(a,b) =", example.do_op(a,b,example.ADD)
|
||||||
|
print " SUB(a,b) =", example.do_op(a,b,example.SUB)
|
||||||
|
print " MUL(a,b) =", example.do_op(a,b,example.MUL)
|
||||||
|
|
||||||
|
print "Here is what the C callback function objects look like in Python"
|
||||||
|
print " ADD =", example.ADD
|
||||||
|
print " SUB =", example.SUB
|
||||||
|
print " MUL =", example.MUL
|
||||||
92
SWIG/Examples/python/funcptr/index.html
Normal file
92
SWIG/Examples/python/funcptr/index.html
Normal file
|
|
@ -0,0 +1,92 @@
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>SWIG:Examples:python:funcptr</title>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body bgcolor="#ffffff">
|
||||||
|
|
||||||
|
|
||||||
|
<tt>SWIG/Examples/python/funcptr/</tt>
|
||||||
|
<hr>
|
||||||
|
|
||||||
|
<H2>Pointers to Functions</H2>
|
||||||
|
|
||||||
|
<tt>$Header$</tt><br>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Okay, just what in the heck does SWIG do with a declaration like this?
|
||||||
|
|
||||||
|
<blockquote>
|
||||||
|
<pre>
|
||||||
|
int do_op(int a, int b, int (*op)(int, int));
|
||||||
|
</pre>
|
||||||
|
</blockquote>
|
||||||
|
|
||||||
|
Well, it creates a wrapper as usual. Of course, that does raise some
|
||||||
|
questions about the third argument (the pointer to a function).
|
||||||
|
|
||||||
|
<p>
|
||||||
|
In this case, SWIG will wrap the function pointer as it does for all other
|
||||||
|
pointers. However, in order to actually call this function from a script,
|
||||||
|
you will need to pass some kind of C function pointer object. In C,
|
||||||
|
this is easy, you just supply a function name as an argument like this:
|
||||||
|
|
||||||
|
<blockquote>
|
||||||
|
<pre>
|
||||||
|
/* Some callback function */
|
||||||
|
int add(int a, int b) {
|
||||||
|
return a+b;
|
||||||
|
}
|
||||||
|
...
|
||||||
|
int r = do_op(x,y,add);
|
||||||
|
</pre>
|
||||||
|
</blockquote>
|
||||||
|
|
||||||
|
To make this work with SWIG, you will need to do a little extra work. Specifically,
|
||||||
|
you need to create some function pointer objects using the %constant directive like this:
|
||||||
|
|
||||||
|
<blockquote>
|
||||||
|
<pre>
|
||||||
|
%constant(int (*)(int,int)) ADD = add;
|
||||||
|
</pre>
|
||||||
|
</blockquote>
|
||||||
|
|
||||||
|
Now, in a script, you would do this:
|
||||||
|
|
||||||
|
<blockquote>
|
||||||
|
<pre>
|
||||||
|
r = do_op(x,y, ADD)
|
||||||
|
</pre>
|
||||||
|
</blockquote>
|
||||||
|
|
||||||
|
<h2>An Example</h2>
|
||||||
|
|
||||||
|
Here are some files that illustrate this with a simple example:
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li><a href="example.c">example.c</a>
|
||||||
|
<li><a href="example.h">example.h</a>
|
||||||
|
<li><a href="example.i">example.i</a> (SWIG interface)
|
||||||
|
<li><a href="example.py">example.py</a> (Sample script)
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h2>Notes</h2>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>The value of a function pointer must correspond to a function written in C or C++.
|
||||||
|
It is not possible to pass an arbitrary Python function object in as a substitute for a C
|
||||||
|
function pointer.
|
||||||
|
|
||||||
|
<p>
|
||||||
|
<li>A python function can be used as a C/C++ callback if you write some
|
||||||
|
clever typemaps and are very careful about how you create your extension.
|
||||||
|
This is an advanced topic not covered here.
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<hr>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue