diff options
Diffstat (limited to 'Examples/java/template/index.html')
-rw-r--r-- | Examples/java/template/index.html | 102 |
1 files changed, 102 insertions, 0 deletions
diff --git a/Examples/java/template/index.html b/Examples/java/template/index.html new file mode 100644 index 0000000..f4408e5 --- /dev/null +++ b/Examples/java/template/index.html @@ -0,0 +1,102 @@ +<html> +<head> +<title>SWIG:Examples:java:template</title> +</head> + +<body bgcolor="#ffffff"> + + +<tt>SWIG/Examples/java/template/</tt> +<hr> + +<H2>C++ template support</H2> + +<p> +This example illustrates how C++ templates can be used from Java using SWIG. + +<h2>The C++ Code</h2> + +Lets take a templated function and a templated class as follows: + +<blockquote> +<pre> +/* File : example.h */ + +// Some template definitions + +template<class T> T max(T a, T b) { return a>b ? a : b; } + +template<class T> class vector { + T *v; + int sz; + public: + vector(int _sz) { + v = new T[_sz]; + sz = _sz; + } + T &get(int index) { + return v[index]; + } + void set(int index, T &val) { + v[index] = val; + } +#ifdef SWIG + %addmethods { + T getitem(int index) { + return self->get(index); + } + void setitem(int index, T val) { + self->set(index,val); + } + } +#endif +}; +</pre> +</blockquote> +The %addmethods is used for a neater interface from Java as the functions <tt>get</tt> and <tt>set</tt> use C++ references to primitive types. These are tricky to use from Java as they end up as a pointer in Java (Java long). + +<h2>The SWIG interface</h2> + +A simple SWIG interface for this can be built by simply grabbing the header file +like this: + +<blockquote> +<pre> +/* File : example.i */ +%module example + +%{ +#include "example.h" +%} + +/* Let's just grab the original header file here */ +%include "example.h" + +/* Now instantiate some specific template declarations */ + +%template(maxint) max<int>; +%template(maxdouble) max<double>; +%template(vecint) vector<int>; +%template(vecdouble) vector<double>; +</pre> +</blockquote> + +Note that SWIG parses the templated function <tt>max</tt> and templated class <tt>vector</tt> and so knows about them. However to generate code for use from Java, SWIG has to be told which class/type to use as the template parameter. The SWIG directive %template is used for this. + +<h2>A sample Java program</h2> + +Click <a href="runme.java">here</a> to see a Java program that calls the C++ functions from Java. + +<h2>Notes</h2> +Use templated classes just like you would any other SWIG generated Java class. Use the classnames specified by the %template directive. + +<blockquote> +<pre> +vecdouble dv = new vecdouble(1000); +dv.setitem(i, 12.34)); +</pre> +</blockquote> + +<hr> +</body> +</html> |