/tags/rel-2.0.2/Examples/test-suite/lextype.i
# · Swig · 54 lines · 23 code · 8 blank · 23 comment · 0 complexity · 71824c5b448a1e61437657631395c9e2 MD5 · raw file
- /*
- This module tests whether SWIG sets the '$lextype' variable
- correctly. This variable maintains the literal base name of the
- type in the wrapper code - it's therefore usually the same
- as '$basetype', but NOT ALWAYS.
- In the example below, the typemap definitions are written
- for any type of 'Animal', but are parameterized through
- preprocessor definitions. So when wrapping functions which
- explicitly reference Giraffes, the wrapper code can
- behave appropriately for that particular species.
- For this to work correctly however, it is critical that
- there is a variable which strictly preserves the name
- of the type. '$basetype' doesn't currently do this -
- it sometimes contains 'Giraffe' and sometimes (specifically
- the case of arrays) contains 'Animal'. Since existing
- code may rely on that behaviour, we create a new variable
- '$lextype' which does what we need.
- There is no need for any runtime test here, since if the
- code is not functioning properly it will fail to compile.
- */
- %module lextype
- %{
- #include <stdlib.h>
- %}
- %typemap(in) Animal ()
- {
- void *space_needed = malloc(HEIGHT_$1_lextype * WIDTH_$1_lextype);
- $1 = ($1_ltype)space_needed;
- }
- %typemap(in) Animal[2] ()
- {
- void *space_needed = malloc(2 * HEIGHT_$1_lextype * WIDTH_$1_lextype);
- $1 = ($1_ltype)space_needed;
- }
- %inline %{
- #define HEIGHT_Giraffe 100
- #define WIDTH_Giraffe 5
- typedef void * Animal;
- typedef Animal Giraffe;
- void eat(Giraffe g) {}
- void drink(Giraffe *g) {}
- Giraffe mate(Giraffe g[2]) { return g[0]; }
- %}