<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>SWIG and Ocaml</title>
<link rel="stylesheet" type="text/css" href="style.css">
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
</head>

<body bgcolor="#ffffff">
<H1><a name="Ocaml">31 SWIG and Ocaml</a></H1>
<!-- INDEX -->
<div class="sectiontoc">
<ul>
<li><a href="#Ocaml_nn2">Preliminaries</a>
<ul>
<li><a href="#Ocaml_nn3">Running SWIG</a>
<li><a href="#Ocaml_nn4">Compiling the code</a>
<li><a href="#Ocaml_nn5">The camlp4 module</a>
<li><a href="#Ocaml_nn6">Using your module</a>
<li><a href="#Ocaml_nn7">Compilation problems and compiling with C++</a>
</ul>
<li><a href="#Ocaml_nn8">The low-level Ocaml/C interface</a>
<ul>
<li><a href="#Ocaml_nn9">The generated module</a>
<li><a href="#Ocaml_nn10">Enums</a>
<ul>
<li><a href="#Ocaml_nn11">Enum typing in Ocaml</a>
</ul>
<li><a href="#Ocaml_nn12">Arrays</a>
<ul>
<li><a href="#Ocaml_nn13">Simple types of bounded arrays</a>
<li><a href="#Ocaml_nn14">Complex and unbounded arrays</a>
<li><a href="#Ocaml_nn15">Using an object</a>
<li><a href="#Ocaml_nn16">Example typemap for a function taking float * and int</a>
</ul>
<li><a href="#Ocaml_nn17">C++ Classes</a>
<ul>
<li><a href="#Ocaml_nn18">STL vector and string Example</a>
<li><a href="#Ocaml_nn19">C++ Class Example</a>
<li><a href="#Ocaml_nn20">Compiling the example</a>
<li><a href="#Ocaml_nn21">Sample Session</a>
</ul>
<li><a href="#Ocaml_nn22">Director Classes</a>
<ul>
<li><a href="#Ocaml_nn23">Director Introduction</a>
<li><a href="#Ocaml_nn24">Overriding Methods in Ocaml</a>
<li><a href="#Ocaml_nn25">Director Usage Example</a>
<li><a href="#Ocaml_nn26">Creating director objects</a>
<li><a href="#Ocaml_nn27">Typemaps for directors, directorin, directorout, directorargout</a>
<li><a href="#Ocaml_nn28">typemap</a>
<li><a href="#Ocaml_nn29">directorout typemap</a>
<li><a href="#Ocaml_nn30">directorargout typemap</a>
</ul>
<li><a href="#Ocaml_nn31">Exceptions</a>
</ul>
</ul>
</div>
<!-- INDEX -->



<p>
This chapter describes SWIG's support of Ocaml.
</p>

<p>
Ocaml is a relatively recent addition to the ML family,
and is a recent addition to SWIG.  It's the second compiled, typed
language to be added.  Ocaml has widely acknowledged benefits for engineers,
mostly derived from a sophisticated type system, compile-time checking
which eliminates several classes of common programming errors, and good
native performance.  While all of this is wonderful, there are well-written
C and C++ libraries that Ocaml users will want to take advantage of as
part of their arsenal (such as SSL and gdbm), as well as their own mature
C and C++ code.  SWIG allows this code to be used in a natural, type-safe
way with Ocaml, by providing the necessary, but repetitive glue code
which creates and uses Ocaml values to communicate with C and C++ code.
In addition, SWIG also produces the needed Ocaml source that binds
variants, functions, classes, etc.
</p>

<p>
If you're not familiar with the Objective Caml language, you can visit
<a href="http://ocaml.org/">The Ocaml Website</a>.
</p>

<H2><a name="Ocaml_nn2">31.1 Preliminaries</a></H2>


<p>
SWIG 3.0 works with Ocaml 3.08.3 and above.  Given the choice,
you should use the latest stable release.  The SWIG Ocaml module has
been tested on Linux (x86, PPC, Sparc) and Cygwin on Windows.  The
best way to determine whether your system will work is to compile the
examples and test-suite which come with SWIG.  You can do this by running
<tt>make check</tt> from the SWIG root directory after installing SWIG.
The Ocaml module has been tested using the system's dynamic linking (the
usual -lxxx against libxxx.so, as well as with Gerd Stolpmann's
<a href="http://download.camlcity.org/download/">Dl package</a>.
The ocaml_dynamic and ocaml_dynamic_cpp targets in the
file Examples/Makefile illustrate how to compile and link SWIG modules that
will be loaded dynamically.  This has only been tested on Linux so far.
</p>

<H3><a name="Ocaml_nn3">31.1.1 Running SWIG</a></H3>


<p>
The basics of getting a SWIG Ocaml module up and running
can be seen from one of SWIG's example Makefiles, but is also described
here.  To build an Ocaml module, run SWIG using the <tt>-ocaml</tt>
option.
</p>

<div class="code">
<pre>
%swig -ocaml example.i
</pre>
</div>

<p>This will produce 3 files. The file <tt>example_wrap.c</tt> contains
all of the C code needed to build an Ocaml module.  To build the module,
you will compile the file <tt>example_wrap.c</tt> with <tt>ocamlc</tt> or
<tt>ocamlopt</tt> to create the needed .o file.  You will need to compile
the resulting .ml and .mli files as well, and do the final link with -custom
(not needed for native link).</p>

<H3><a name="Ocaml_nn4">31.1.2 Compiling the code</a></H3>


<p>
The OCaml SWIG module now requires you to compile a module (<tt>Swig</tt>)
separately.  In addition to aggregating common SWIG functionality, the Swig
module contains the data structure that represents C/C++ values.  This allows
easier data sharing between modules if two or more are combined, because
the type of each SWIG'ed module's c_obj is derived from Swig.c_obj_t.  This
also allows SWIG to acquire new conversions painlessly, as well as giving
the user more freedom with respect to custom typing.

Use <tt>ocamlc</tt> or <tt>ocamlopt</tt> to compile your SWIG interface like:
</p>

<div class="code">
<pre>
% swig -ocaml -co swig.mli ; swig -ocaml co swig.ml
% ocamlc -c swig.mli ; ocamlc -c swig.ml
% ocamlc -c -ccopt "-I/usr/include/foo" example_wrap.c
% ocamlc -c example.mli
% ocamlc -c example.ml
</pre>
</div>

<p><tt>ocamlc</tt> is aware of .c files and knows how to handle them. Unfortunately,
it does not know about .cxx, .cc, or .cpp files, so when SWIG is invoked
in C++ mode, you must:</p>

<div class="code">
<pre>
% cp example_wrap.cxx example_wrap.cxx.c
% ocamlc -c ... -ccopt -xc++ example_wrap.cxx.c
% ...
</pre>
</div>

<H3><a name="Ocaml_nn5">31.1.3 The camlp4 module</a></H3>


<p>
The camlp4 module (swigp4.ml -&gt; swigp4.cmo) contains a simple rewriter which
makes C++ code blend more seamlessly with objective caml code.  Its use is
optional, but encouraged.  The source file is included in the Lib/ocaml
directory of the SWIG source distribution.  You can checkout this file with
<tt>"swig -ocaml -co swigp4.ml"</tt>.  You should compile the file with
<tt>"ocamlc -I `camlp4 -where` -pp 'camlp4o pa_extend.cmo q_MLast.cmo' -c swigp4.ml"</tt>
</p>

<p>
The basic principle of the module is to recognize certain non-caml expressions
and convert them for use with C++ code as interfaced by SWIG.  The camlp4
module is written to work with generated SWIG interfaces, and probably isn't
great to use with anything else.
</p>

<p>
Here are the main rewriting rules:
</p>

<table border="1" summary="Rewriting rules">
<tr><th>Input</th><th>Rewritten to</th></tr>
<tr><td>f'( ... ) as in<br> atoi'("0") or<br> _exit'(0)</td>
<td>f(C_list [ ... ]) as in<br> atoi (C_list [ C_string "0" ]) or<br> _exit (C_list [ C_int 0 ])</td></tr>
<tr><td>object -&gt; method ( ... )</td><td>(invoke object) "method" (C_list [ ... ])</td></tr>
<tr><td>
object <i>'binop</i> argument as in<br>
a '+= b</td>
<td>
(invoke object) "+=" argument as in<br>
(invoke a) "+=" b<td></tr>
<tr><th colspan=2>Note that because camlp4 always recognizes &lt;&lt;
and &gt;&gt;, they are replaced by lsl and lsr in operator names.
<tr><td>
<i>'unop</i> object as in<br>
'! a
</td><td>
(invoke a) "!" C_void</td></tr>
<tr><td>
<b>Smart pointer access like this</b><br>
object '-&gt; method ( args )<br>
</td><td>
(invoke (invoke object "-&gt;" C_void))
</td></tr>
<tr><td>
<b>Invoke syntax</b><br>
object . '( ... )
</td><td>
(invoke object) "()" (C_list [ ... ])
</td></tr>
<tr><td>
<b>Array syntax</b><br>
object '[ 10 ]
</td><td>
(invoke object) "[]" (C_int 10)
</td></tr>
<tr><td>
<b>Assignment syntax</b><br>
let a = '10 and b = '"foo" and c = '1.0 and d = 'true
</td><td>
let a = C_int 10 and b = C_string "foo" and c = C_double 1.0 and d = C_bool true
</td></tr>
<tr><td>
<b>Cast syntax</b><br>
let a = _atoi '("2") as int<br>
let b = (getenv "PATH") to string<br>
This works for int, string, float, bool
</td><td>
let a = get_int (_atoi (C_string "2"))<br>
let b = C_string (getenv "PATH")
</td></tr>
</table>

<H3><a name="Ocaml_nn6">31.1.4 Using your module</a></H3>


<p>
You can test-drive your module by building a
toplevel ocaml interpreter.  Consult the ocaml manual for details.
</p>

<p>
When linking any ocaml bytecode with your module, use the -custom
option to build your functions into the primitive list. This
option is not needed when you build native code.
</p>

<H3><a name="Ocaml_nn7">31.1.5 Compilation problems and compiling with C++</a></H3>


<p>
As mentioned above, .cxx files need special
handling to be compiled with <tt>ocamlc</tt>.  Other than that, C code
that uses <tt>class</tt> as a non-keyword, and C code that is too
liberal with pointer types may not compile under the C++ compiler.
Most code meant to be compiled as C++ will not have problems.
</p>

<H2><a name="Ocaml_nn8">31.2 The low-level Ocaml/C interface</a></H2>


<p>
In order to provide access to overloaded functions, and
provide sensible outputs from them, all C entities are represented as
members of the c_obj type:
</p>

<p>
In the code as seen by the typemap
writer, there is a value, swig_result, that always contains the
current return data.  It is a list, and must be appended with the
caml_list_append function, or with functions and macros provided by
objective caml.
</p>

<div class="code"><pre>
type c_obj =
    C_void
  | C_bool of bool
  | C_char of char
  | C_uchar of char
  | C_short of int
  | C_ushort of int
  | C_int of int
  | C_uint of int32
  | C_int32 of int32
  | C_int64 of int64
  | C_float of float
  | C_double of float
  | C_ptr of int64 * int64
  | C_array of c_obj array
  | C_list of c_obj list
  | C_obj of (string -&gt; c_obj -&gt; c_obj)
  | C_string of string
  | C_enum of c_enum_t
</pre></div>

<p>
A few functions exist which generate and return these:
</p>

<ul>
    <li>caml_ptr_val receives a c_obj and returns a void *.  This
    should be used for all pointer purposes.</li>
    <li>caml_long_val receives a c_obj and returns a long.  This
    should be used for most integral purposes.</li>
    <li>caml_val_ptr receives a void * and returns a c_obj.</li>
    <li>caml_val_bool receives a C int and returns a c_obj representing
    its bool value.</li>
    <li>caml_val_(u)?(char|short|int|long|float|double) receives an
    appropriate C value and returns a c_obj representing it.</li>
    <li>caml_val_string receives a char * and returns a string value.</li>
    <li>caml_val_string_len receives a char * and a length and returns
    a string value.</li>
    <li>caml_val_obj receives a void * and an object type and returns
    a C_obj, which contains a closure giving method access.</li>
</ul>

<p>
Because of this style, a typemap can return any kind of value it
wants from a function.  This enables out typemaps and inout typemaps
to work well.  The one thing to remember about outputting values
is that you must append them to the return list with swig_result = caml_list_append(swig_result, v).
</p>

<p>
This function will return a new list that has your element
appended.  Upon return to caml space, the fnhelper function
beautifies the result.  A list containing a single item degrades to
only that item (i.e. [ C_int 3 ] -&gt; C_int 3), and a list
containing more than one item is wrapped in C_list (i.e. [ C_char
'a' ; C_char 'b' -&gt; C_list [ C_char 'a' ; C_char b
]).  This is in order to make return values easier to handle
when functions have only one return value, such as constructors,
and operators.  In addition, string, pointer, and object
values are interchangeable with respect to caml_ptr_val, so you can
allocate memory as caml strings and still use the resulting
pointers for C purposes, even using them to construct simple objects
on.  Note, though, that foreign C++ code does not respect the garbage
collector, although the SWIG interface does.</p>

<p>
The wild card type that you can use in lots of different ways is
C_obj.  It allows you to wrap any type of thing you like as an
object using the same mechanism that the ocaml module
does.  When evaluated in caml_ptr_val, the returned value is
the result of a call to the object's "&amp;" operator, taken as a pointer.
</p>

<p>
You should only construct values using objective caml, or using the
functions caml_val_* functions provided as static functions to a SWIG
ocaml module, as well as the caml_list_* functions.  These functions
provide everything a typemap needs to produce values.  In addition,
value items pass through directly, but you must make your own type
signature for a function that uses value in this way.
</p>

<H3><a name="Ocaml_nn9">31.2.1 The generated module</a></H3>


<p>
The SWIG <tt>%module</tt> directive specifies the name of the Ocaml
module to be generated.  If you specified `<tt>%module example</tt>',
then your Ocaml code will be accessible in the module Example.  The
module name is always capitalized as is the ocaml convention.  Note
that you must not use any Ocaml keyword to name your module.  Remember
that the keywords are not the same as the C++ ones.
</p>

<p>
You can introduce extra code into the output wherever you like with SWIG.
These are the places you can introduce code:
<table border="1" summary="Extra code sections">
<tr><td>"header"</td><td>This code is inserted near the beginning of the
C wrapper file, before any function definitions.</td></tr>
<tr><td>"wrapper"</td><td>This code is inserted in the function definition
section.</td></tr>
<tr><td>"runtime"</td><td>This code is inserted near the end of the C wrapper
file.</td></tr>
<tr><td>"mli"</td><td>This code is inserted into the caml interface file.
Special signatures should be inserted here.
</td></tr>
<tr><td>"ml"</td><td>This code is inserted in the caml code defining the
interface to your C code.  Special caml code, as well as any initialization
which should run when the module is loaded may be inserted here.
</td></tr>
<tr><td>"classtemplate"</td><td>The "classtemplate" place is special because
it describes the output SWIG will generate for class definitions.
</td></tr>
</table>

<H3><a name="Ocaml_nn10">31.2.2 Enums</a></H3>


<p>
SWIG will wrap enumerations as polymorphic variants in the output
Ocaml code, as above in C_enum.  In order to support all
C++-style uses of enums, the function int_to_enum and enum_to_int are
provided for ocaml code to produce and consume these values as
integers.  Other than that, correct uses of enums will not have
a problem.  Since enum labels may overlap between enums, the
enum_to_int and int_to_enum functions take an enum type label as an
argument.  Example:
</p>

<div class="code"><pre>
%module enum_test
%{
enum c_enum_type { a = 1, b, c = 4, d = 8 };
%}
enum c_enum_type { a = 1, b, c = 4, d = 8 };
</pre></div>

<p>
The output mli contains:
</p>

<div class="code"><pre>
type c_enum_type = [
  `unknown
| `c_enum_type
]
type c_enum_tag = [
  `int of int
| `a
| `b
| `c
| `d
]
val int_to_enum c_enum_type -&gt; int -&gt; c_obj
val enum_to_int c_enum_type -&gt; c_obj -&gt; c_obj
</pre>
</div>

<p>
So it's possible to do this:
</p>

<div class="code">
<pre>
bash-2.05a$ ocamlmktop -custom enum_test_wrap.o enum_test.cmo -o enum_test_top
bash-2.05a$ ./enum_test_top
        Objective Caml version 3.04

# open Enum_test ;;
# let x = C_enum `a ;;
val x : Enum_test.c_obj = C_enum `a
# enum_to_int `c_enum_type x ;;
- : Enum_test.c_obj = C_int 1
# int_to_enum `c_enum_type 4 ;;
- : Enum_test.c_obj = C_enum `c
</pre>
</div>

<H4><a name="Ocaml_nn11">31.2.2.1 Enum typing in Ocaml</a></H4>


<p>
The ocaml SWIG module now has support for loading and using multiple SWIG
modules at the same time.  This enhances modularity, but presents problems
when used with a language which assumes that each module's types are complete
at compile time.  In order to achieve total soundness enum types are now
isolated per-module.  The type issue matters when values are shared between
functions imported from different modules.  You must convert values to master
values using the swig_val function before sharing them with another module.
</p>

<H3><a name="Ocaml_nn12">31.2.3 Arrays</a></H3>


<H4><a name="Ocaml_nn13">31.2.3.1 Simple types of bounded arrays</a></H4>


<p>
SWIG has support for array types, but you generally will need to provide
a typemap to handle them.  You can currently roll your own, or expand
some of the macros provided (but not included by default) with the SWIG
distribution.
</p>

<p>
By including "carray.i", you will get access to some macros that help you
create typemaps for array types fairly easily.
</p>

<p>
<tt>%make_simple_array_typemap</tt> is the easiest way to get access to
arrays of simple types with known bounds in your code, but this only works
for arrays whose bounds are completely specified.
</p>

<H4><a name="Ocaml_nn14">31.2.3.2 Complex and unbounded arrays</a></H4>


<p>
Unfortunately, unbounded arrays and pointers can't be handled in a
completely general way by SWIG, because the end-condition of such an
array can't be predicted.  In some cases, it will be by consent
(e.g. an array of four or more chars), sometimes by explicit length
(char *buffer, int len), and sometimes by sentinel value (0, -1, etc.).
SWIG can't predict which of these methods will be used in the array,
so you have to specify it for yourself in the form of a typemap.
</p>

<H4><a name="Ocaml_nn15">31.2.3.3 Using an object</a></H4>


<p>
It's possible to use C++ to your advantage by creating a simple object that
provides access to your array.  This may be more desirable in some cases,
since the object can provide bounds checking, etc., that prevents crashes.
</p>

<p>
Consider writing an object when the ending condition of your array is complex,
such as using a required sentinel, etc.
</p>

<H4><a name="Ocaml_nn16">31.2.3.4 Example typemap for a function taking float * and int</a></H4>


<p>
This is a simple example <tt>in</tt> typemap for an array of float, where the
length of the array is specified as an extra parameter.  Other such typemaps
will work similarly.  In the example, the function printfloats is called with
a float array, and specified length.  The actual length reported in the len
argument is the length of the array passed from ocaml, making passing an array
into this type of function convenient.
</p>

<table border="1" bgcolor="#dddddd" summary="float * and int typemap example">
<tr><th><center>tarray.i</center></th></tr>
<tr><td><pre>
%module tarray
%{
#include &lt;stdio.h&gt;

void printfloats( float *tab, int len ) {
  int i;

  for( i = 0; i &lt; len; i++ ) {
    printf( "%f ", tab[i] );
  }

  printf( "\n" );
}
%}

%typemap(in) (float *tab, int len) {
  int i;
  /* $*1_type */
  $2 = caml_array_len($input);
  $1 = ($*1_type *)malloc( $2 * sizeof( float ) );
  for( i = 0; i &lt; $2; i++ ) {
    $1[i] = caml_double_val(caml_array_nth($input, i));
  }
}

void printfloats( float *tab, int len );
</pre></td></tr>
<tr><th>Sample Run</th></tr>
<tr><td><pre>
# open Tarray ;;
# _printfloats (C_array [| C_double 1.0 ; C_double 3.0 ; C_double 5.6666 |]) ;;
1.000000 3.000000 5.666600
- : Tarray.c_obj = C_void
</pre></td></tr></table>


<H3><a name="Ocaml_nn17">31.2.4 C++ Classes</a></H3>


<p>
C++ classes, along with structs and unions are represented by C_obj
(string -&gt; c_obj -&gt; c_obj) wrapped closures.  These objects
contain a method list, and a type, which allow them to be used like
C++ objects.  When passed into typemaps that use pointers, they
degrade to pointers through their "&amp;" method.  Every method
an object has is represented as a string in the object's method table,
and each method table exists in memory only once.  In addition
to any other operators an object might have, certain builtin ones are
provided by SWIG: (all of these take no arguments (C_void))
</p>

<table summary="SWIG provided operators">
<tr><td>"~"</td><td>Delete this object</td></tr>
<tr><td>"&amp;"</td><td>Return an ordinary C_ptr value representing this
object's address</td></tr>
<tr><td>"sizeof"</td><td>If enabled with ("sizeof"="1") on the module node,
return the object's size in char.</td></tr>
<tr><td>":methods"</td><td>Returns a list of strings containing the names of
the methods this object contains</td></tr>
<tr><td>":classof"</td><td>Returns the name of the class this object belongs
to.</td></tr>
<tr><td>":parents"</td><td>Returns a list of all direct parent classes which
have been wrapped by SWIG.</td></tr>
<tr><td>"::[parent-class]"</td><td>Returns a view of the object as the
indicated parent class.  This is mainly used internally by the SWIG module,
but may be useful to client programs.</td></tr>
<tr><td>"[member-variable]"</td><td>Each member variable is wrapped as a
method with an optional parameter.
Called with one argument, the member variable is set to the value of the
argument.  With zero arguments, the value is returned.
</td></tr>
</table>

<p>
Note that this string belongs to the wrapper object, and not
the underlying pointer, so using create_[x]_from_ptr alters the
returned value for the same object.
</p>

<H4><a name="Ocaml_nn18">31.2.4.1 STL vector and string Example</a></H4>


<p>
Standard typemaps are now provided for STL vector and string.  More are in
the works.  STL strings are passed just like normal strings, and returned
as strings.  STL string references don't mutate the original string, (which
might be surprising), because Ocaml strings are mutable but have fixed
length.  Instead, use multiple returns, as in the argout_ref example.
</p>

<table border="1" bgcolor="#dddddd" summary="STL vector and string example">
<tr><th><center>example.i</center></th></tr>
<tr><td><pre>
%module example
%{
#include "example.h"
%}

%include &lt;stl.i&gt;

namespace std {
  %template(StringVector) std::vector &lt; string &gt;;
};

%include "example.h"
</pre></td></tr>
<tr><td><font size="-1"><i>This example is in Examples/ocaml/stl
</i></font></td></tr>
</table>

<p>
Since there's a makefile in that directory, the example is easy to build.
</p>

<p>
Here's a sample transcript of an interactive session using a string vector
after making a toplevel (make toplevel).  This example uses the camlp4
module.
</p>

<div class="code"><pre>
bash-2.05a$ ./example_top
        Objective Caml version 3.06

        Camlp4 Parsing version 3.06

# open Swig ;;
# open Example ;;
# let x = new_StringVector '() ;;
val x : Example.c_obj = C_obj &lt;fun&gt;
# x -&gt; ":methods" () ;;
- : Example.c_obj =
C_list
 [C_string "nop"; C_string "size"; C_string "empty"; C_string "clear";
  C_string "push_back"; C_string "[]"; C_string "="; C_string "set";
  C_string "~"; C_string "&amp;"; C_string ":parents"; C_string ":classof";
  C_string ":methods"]
# x -&gt; push_back ("foo") ;;
- : Example.c_obj = C_void
# x -&gt; push_back ("bar") ;;
- : Example.c_obj = C_void
# x -&gt; push_back ("baz") ;;
- : Example.c_obj = C_void
# x '[1] ;;
- : Example.c_obj = C_string "bar"
# x -&gt; set (1, "spam") ;;
- : Example.c_obj = C_void
# x '[1] ;;
- : Example.c_obj = C_string "spam"
# for i = 0 to (x -&gt; size() as int) - 1 do
    print_endline ((x '[i to int]) as string)
  done ;;
foo
bar
baz
- : unit = ()
#
</pre></div>

<H4><a name="Ocaml_nn19">31.2.4.2 C++ Class Example</a></H4>


<p>
Here's a simple example using Trolltech's Qt Library:
</p>

<table border="1" bgcolor="#dddddd" summary="Qt Library example">
<tr><th><center>qt.i</center></th></tr>
<tr><td><pre>
%module qt
%{
#include &lt;qapplication.h&gt;
#include &lt;qpushbutton.h&gt;
%}
class QApplication {
public:
  QApplication( int argc, char **argv );
  void setMainWidget( QWidget *widget );
  void exec();
};

class QPushButton {
public:
  QPushButton( char *str, QWidget *w );
  void resize( int x, int y );
  void show();
};
</pre></td></tr></table>

<H4><a name="Ocaml_nn20">31.2.4.3 Compiling the example</a></H4>


<div class="code"><pre>
bash-2.05a$ QTPATH=/your/qt/path
bash-2.05a$ for file in swig.mli swig.ml swigp4.ml ; do swig -ocaml -co $file ; done
bash-2.05a$ ocamlc -c swig.mli ; ocamlc -c swig.ml
bash-2.05a$ ocamlc -I `camlp4 -where` -pp "camlp4o pa_extend.cmo q_MLast.cmo" -c swigp4.ml
bash-2.05a$ swig -ocaml -c++ -I$QTPATH/include qt.i
bash-2.05a$ mv qt_wrap.cxx qt_wrap.c
bash-2.05a$ ocamlc -c -ccopt -xc++ -ccopt -g -g -ccopt -I$QTPATH/include qt_wrap.c
bash-2.05a$ ocamlc -c qt.mli
bash-2.05a$ ocamlc -c qt.ml
bash-2.05a$ ocamlmktop -custom swig.cmo -I `camlp4 -where` \
  camlp4o.cma swigp4.cmo qt_wrap.o qt.cmo -o qt_top -cclib \
  -L$QTPATH/lib -cclib -lqt
</pre></div>

<H4><a name="Ocaml_nn21">31.2.4.4 Sample Session</a></H4>


<div class="code"><pre>
bash-2.05a$ ./qt_top
        Objective Caml version 3.06

        Camlp4 Parsing version 3.06

# open Swig ;;
# open Qt ;;
# let a = new_QApplication '(0, 0) ;;
val a : Qt.c_obj = C_obj &lt;fun&gt;
# let hello = new_QPushButton '("hi", 0) ;;
val hello : Qt.c_obj = C_obj &lt;fun&gt;
# hello -&gt; resize (100, 30) ;;
- : Qt.c_obj = C_void
# hello -&gt; show () ;;
- : Qt.c_obj = C_void
# a -&gt; exec () ;;
</pre></div>

<p>
Assuming you have a working installation of QT, you will see a window
containing the string "hi" in a button.
</p>

<H3><a name="Ocaml_nn22">31.2.5 Director Classes</a></H3>


<H4><a name="Ocaml_nn23">31.2.5.1 Director Introduction</a></H4>


<p>
Director classes are classes which allow Ocaml code to override the public
methods of a C++ object.  This facility allows the user to use C++ libraries
that require a derived class to provide application specific functionality in
the context of an application or utility framework.
</p>

<p>
You can turn on director classes by using an optional module argument like
this:
</p>

<div class="code"><pre>
%module(directors="1")

...

// Turn on the director class for a specific class like this:
%feature("director")
class foo {
  ...
};
</pre></div>

<H4><a name="Ocaml_nn24">31.2.5.2 Overriding Methods in Ocaml</a></H4>


<p>
Because the Ocaml language module treats C++ method calls as calls to a
certain function, all you need to do is to define the function that will
handle the method calls in terms of the public methods of the object, and
any other relevant information.  The function <tt>new_derived_object</tt>
uses a stub class to call your methods in place of the ones provided by the
underlying implementation.  The object you receive is the underlying object,
so you are free to call any methods you want from within your derived method.
Note that calls to the underlying object do not invoke Ocaml code.  You need
to handle that yourself.
</p>

<p>
<tt>new_derived_object</tt> receives your function, the function that creates
the underlying object, and any constructor arguments, and provides an
object that you can use in any usual way.  When C++ code calls one of the
object's methods, the object invokes the Ocaml function as if it had been
invoked from Ocaml, allowing any method definitions to override the C++ ones.
</p>

<p>
In this example, I'll examine the objective caml code involved in providing
an overloaded class.  This example is contained in Examples/ocaml/shapes.
</p>

<H4><a name="Ocaml_nn25">31.2.5.3 Director Usage Example</a></H4>


<table border="1" bgcolor="#dddddd" summary="Director usage example">
<tr><th><center>example_prog.ml</center>
</th></tr>
<tr><td><pre>
open Swig
open Example

...

let triangle_class pts ob meth args =
  match meth with
      "cover" -&gt;
        (match args with
             C_list [ x_arg ; y_arg ] -&gt;
             let xa = x_arg as float
             and ya = y_arg as float in
               (point_in_triangle pts xa ya) to bool
           | _ -&gt; raise (Failure "cover needs two double arguments."))
    | _ -&gt; (invoke ob) meth args ;;

let triangle =
  new_derived_object
    new_shape
    (triangle_class ((0.0, 0.0), (0.5, 1.0), (1.0, 0.0)))
    '() ;;

let _ = _draw_shape_coverage '(triangle, C_int 60, C_int 20) ;;
</pre></td></tr>
</table>

<p>
This is the meat of what you need to do.  The actual "class" definition
containing the overloaded method is defined in the function triangle_class.
This is a lot like the class definitions emitted by SWIG, if you look at
example.ml, which is generated when SWIG consumes example.i.  Basically,
you are given the arguments as a c_obj and the method name as a string, and
you must intercept the method you are interested in and provide whatever
return value you need.  Bear in mind that the underlying C++ code needs the
right return type, or an exception will be thrown.  This exception will
generally be Failure, or NotObject.  You must call other ocaml methods that
you rely on yourself.  Due to the way directors are implemented, method
calls on your object from with ocaml code will always invoke C++ methods
even if they are overridden in ocaml.
</p>

<p>
In the example, the draw_shape_coverage function plots the indicated number
of points as either covered (<tt>x</tt>) or uncovered ( ) between
0 and 1 on the X and Y axes.  Your shape implementation can provide any
coverage map it likes, as long as it responds to the "cover" method call
with a boolean return (the underlying method returns bool).  This might allow
a tricky shape implementation, such as a boolean combination, to be expressed
in a more effortless style in ocaml, while leaving the "engine" part of the
program in C++.
</p>

<H4><a name="Ocaml_nn26">31.2.5.4 Creating director objects</a></H4>


<p>
The definition of the actual object triangle can be described this way:
</p>

<div class="code"><pre>
let triangle =
  new_derived_object
    new_shape
    (triangle_class ((0.0, 0.0), (0.5, 1.0), (1.0, 0.0)))
    '()
</pre></div>

<p>
The first argument to <tt>new_derived_object</tt>, new_shape is the method
which returns a shape instance.  This function will be invoked with the
third argument will be appended to the argument list [ C_void ].  In the
example, the actual argument list is sent as (C_list [ C_void ; C_void ]).
The augmented constructor for a director class needs the first argument
to determine whether it is being constructed as a derived object, or as
an object of the indicated type only (in this case <tt>shape</tt>).  The
Second argument is a closure that will be added to the final C_obj.
</p>

<p>
The actual object passed to the self parameter of the director object will
be a C_director_core, containing a c_obj option ref and a c_obj.  The
c_obj provided is the same object that will be returned from new_derived
object, that is, the object exposing the overridden methods.  The other part
is an option ref that will have its value extracted before becoming the
<tt>ob</tt> parameter of your class closure.  This ref will contain
<tt>None</tt> if the C++ object underlying is ever destroyed, and will
consequently trigger an exception when any method is called on the object
after that point (the actual raise is from an inner function used by
new_derived_object, and throws NotObject).  This prevents a deleted C++
object from causing a core dump, as long as the object is destroyed
properly.
</p>

<H4><a name="Ocaml_nn27">31.2.5.5 Typemaps for directors, directorin, directorout, directorargout</a></H4>


<p>
Special typemaps exist for use with directors, the <tt>directorin, directorout, directorargout</tt>
are used in place of <tt>in, out, argout</tt> typemaps, except that their
direction is reversed.  They provide for you to provide argout values, as
well as a function return value in the same way you provide function arguments,
and to receive arguments the same way you normally receive function returns.
</p>

<H4><a name="Ocaml_nn28">31.2.5.6 typemap</a></H4>


<p>
The <tt>directorin</tt> typemap is used when you will receive arguments from a call
made by C++ code to you, therefore, values will be translated from C++ to
ocaml.  You must provide some valid C_obj value.  This is the value your ocaml
code receives when you are called.  In general, a simple <tt>directorin</tt> typemap
can use the same body as a simple <tt>out</tt> typemap.
</p>

<H4><a name="Ocaml_nn29">31.2.5.7 directorout typemap</a></H4>


<p>
The <tt>directorout</tt> typemap is used when you will send an argument from your
code back to the C++ caller.  That is; directorout specifies a function return
conversion.  You can usually use the same body as an <tt>in</tt> typemap
for the same type, except when there are special requirements for object
ownership, etc.
</p>

<H4><a name="Ocaml_nn30">31.2.5.8 directorargout typemap</a></H4>


<p>
C++ allows function arguments which are by pointer (*) and by reference (&amp;)
to receive a value from the called function, as well as sending one there.
Sometimes, this is the main purpose of the argument given.  <tt>directorargout</tt>
typemaps allow your caml code to emulate this by specifying additional return
values to be put into the output parameters.  The SWIG ocaml module is a bit
loose in order to make code easier to write.  In this case, your return to
the caller must be a list containing the normal function return first, followed
by any argout values in order.  These argout values will be taken from the
list and assigned to the values to be returned to C++ through directorargout typemaps.
In the event that you don't specify all of the necessary values, integral
values will read zero, and struct or object returns have undefined results.
</p>

<H3><a name="Ocaml_nn31">31.2.6 Exceptions</a></H3>


<p>
Catching exceptions is now supported using SWIG's %exception feature.  A simple
but not too useful example is provided by the throw_exception testcase in
Examples/test-suite.  You can provide your own exceptions, too.
</p>

</body>
</html>
