/trunk/Examples/java/template/index.html
HTML | 102 lines | 78 code | 24 blank | 0 comment | 0 complexity | fa83fbb1b118aac9e81ab2b0ad7619f4 MD5 | raw file
Possible License(s): LGPL-2.1, Cube, GPL-3.0, 0BSD, GPL-2.0
- <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>