123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699 |
- /* -----------------------------------------------------------------------------
- * swig.swg
- *
- * Common macro definitions for various SWIG directives. This file is always
- * included at the top of each input file.
- * ----------------------------------------------------------------------------- */
- /* -----------------------------------------------------------------------------
- * User Directives
- * ----------------------------------------------------------------------------- */
- /* Deprecated SWIG-1.1 directives */
- #define %disabledoc %warn "104:%disabledoc is deprecated"
- #define %enabledoc %warn "105:%enabledoc is deprecated"
- #define %doconly %warn "106:%doconly is deprecated"
- #define %style %warn "107:%style is deprecated" /##/
- #define %localstyle %warn "108:%localstyle is deprecated" /##/
- #define %title %warn "109:%title is deprecated" /##/
- #define %section %warn "110:%section is deprecated" /##/
- #define %subsection %warn "111:%subsection is deprecated" /##/
- #define %subsubsection %warn "112:%subsubsection is deprecated" /##/
- #define %new %warn "117:%new is deprecated. Use %newobject"
- #define %text %insert("null")
- /* Code insertion directives such as %wrapper %{ ... %} */
- #define %begin %insert("begin")
- #define %runtime %insert("runtime")
- #define %header %insert("header")
- #define %wrapper %insert("wrapper")
- #define %init %insert("init")
- /* Class extension */
- #define %addmethods %warn "113:%addmethods is now %extend" %extend
- /* %ignore directive */
- #define %ignore %rename($ignore)
- #define %ignorewarn(x) %rename("$ignore:" x)
- /* Access control directives */
- #define %readonly %warn "114:%readonly is deprecated. Use %immutable; " %feature("immutable");
- #define %readwrite %warn "115:%readwrite is deprecated. Use %mutable; " %feature("immutable","");
- #define %immutable %feature("immutable")
- #define %noimmutable %feature("immutable","0")
- #define %clearimmutable %feature("immutable","")
- #define %mutable %clearimmutable
- /* Generation of default constructors/destructors (old form, don't use) */
- #define %nodefault %feature("nodefault","1")
- #define %default %feature("nodefault","0")
- #define %clearnodefault %feature("nodefault","")
- #define %makedefault %clearnodefault
- /* Disable the generation of implicit default constructor */
- #define %nodefaultctor %feature("nodefaultctor","1")
- #define %defaultctor %feature("nodefaultctor","0")
- #define %clearnodefaultctor %feature("nodefaultctor","")
- /* Disable the generation of implicit default destructor (dangerous) */
- #define %nodefaultdtor %feature("nodefaultdtor","1")
- #define %defaultdtor %feature("nodefaultdtor","0")
- #define %clearnodefaultdtor %feature("nodefaultdtor","")
- /* Enable the generation of copy constructor */
- #define %copyctor %feature("copyctor","1")
- #define %nocopyctor %feature("copyctor","0")
- #define %clearcopyctor %feature("copyctor","")
- /* Force the old nodefault behavior, ie disable both constructor and destructor */
- #define %oldnodefault %feature("oldnodefault","1")
- #define %nooldnodefault %feature("oldnodefault","0")
- #define %clearoldnodefault %feature("oldnodefault","")
- /* the %exception directive */
- #if defined(SWIGCSHARP) || defined(SWIGD)
- #define %exception %feature("except", canthrow=1)
- #else
- #define %exception %feature("except")
- #endif
- #define %noexception %feature("except","0")
- #define %clearexception %feature("except","")
- /* the %allowexception directive allows the %exception feature to
- be applied to set/get variable methods */
- #define %allowexception %feature("allowexcept")
- #define %noallowexception %feature("allowexcept","0")
- #define %clearallowexception %feature("allowexcept","")
- /* the %exceptionvar directive, as %exception but it is only applied
- to set/get variable methods. You don't need to use the
- %allowexception directive when using %exceptionvar.
- */
- #if defined(SWIGCSHARP) || defined(SWIGD)
- #define %exceptionvar %feature("exceptvar", canthrow=1)
- #else
- #define %exceptionvar %feature("exceptvar")
- #endif
- #define %noexceptionvar %feature("exceptvar","0")
- #define %clearexceptionvar %feature("exceptvar","")
- /* the %catches directive */
- #define %catches(tlist...) %feature("catches","("`tlist`")")
- #define %clearcatches %feature("catches","")
- /* the %exceptionclass directive */
- #define %exceptionclass %feature("exceptionclass")
- #define %noexceptionclass %feature("exceptionclass","0")
- #define %clearexceptionclass %feature("exceptionclass","")
- /* the %newobject directive */
- #define %newobject %feature("new")
- #define %nonewobject %feature("new","0")
- #define %clearnewobject %feature("new","")
- /* the %delobject directive */
- #define %delobject %feature("del")
- #define %nodelobject %feature("del","0")
- #define %cleardelobject %feature("del","")
- /* the %refobject/%unrefobject directives */
- #define %refobject %feature("ref")
- #define %norefobject %feature("ref","0")
- #define %clearrefobject %feature("ref","")
- #define %unrefobject %feature("unref")
- #define %nounrefobject %feature("unref","0")
- #define %clearunrefobject %feature("unref","")
- /* Directives for callback functions (experimental) */
- #define %callback(x) %feature("callback",`x`)
- #define %nocallback %feature("callback","0")
- #define %clearcallback %feature("callback","")
- /* the %nestedworkaround directive (deprecated) */
- #define %nestedworkaround %feature("nestedworkaround")
- #define %nonestedworkaround %feature("nestedworkaround","0")
- #define %clearnestedworkaround %feature("nestedworkaround","")
- /* the %flatnested directive */
- #define %flatnested %feature("flatnested")
- #define %noflatnested %feature("flatnested","0")
- #define %clearflatnested %feature("flatnested","")
- /* the %fastdispatch directive */
- #define %fastdispatch %feature("fastdispatch")
- #define %nofastdispatch %feature("fastdispatch","0")
- #define %clearfastdispatch %feature("fastdispatch","")
- /* directors directives */
- #define %director %feature("director")
- #define %nodirector %feature("director","0")
- #define %cleardirector %feature("director","")
- /* naturalvar directives */
- #define %naturalvar %feature("naturalvar")
- #define %nonaturalvar %feature("naturalvar","0")
- #define %clearnaturalvar %feature("naturalvar","")
- /* nspace directives */
- #define %nspace %feature("nspace")
- #define %nonspace %feature("nspace","0")
- #define %clearnspace %feature("nspace","")
- /* valuewrapper directives */
- #define %valuewrapper %feature("valuewrapper")
- #define %clearvaluewrapper %feature("valuewrapper","")
- #define %novaluewrapper %feature("novaluewrapper")
- #define %clearnovaluewrapper %feature("novaluewrapper","")
- /* Contract support - Experimental and undocumented */
- #define %contract %feature("contract")
- #define %nocontract %feature("contract","0")
- #define %clearcontract %feature("contract","")
- /* Macro for setting a dynamic cast function */
- %define DYNAMIC_CAST(mangle,func)
- %init %{
- mangle->dcast = (swig_dycast_func) func;
- %}
- %enddef
- /* aggregation support */
- /*
- This macro performs constant aggregation. Basically the idea of
- constant aggregation is that you can group a collection of constants
- together. For example, suppose you have some code like this:
- #define UP 1
- #define DOWN 2
- #define LEFT 3
- #define RIGHT 4
- Now, suppose you had a function like this:
- int move(int direction)
- In this case, you might want to restrict the direction argument to
- one of the supplied constant names. To do this, you could write some
- typemap code by hand. Alternatively, you can use the
- %aggregate_check macro defined here to create a simple check
- function for you. Here is an example:
- %aggregate_check(int, check_direction, UP, DOWN, LEFT, RIGHT);
- Now, using a typemap
- %typemap(check) int direction {
- if (!check_direction($1)) SWIG_exception(SWIG_ValueError,"Bad direction.");
- }
- or a contract (better)
- %contract move(int x) {
- require:
- check_direction(x);
- }
- */
-
- %define %aggregate_check(TYPE, NAME, FIRST, ...)
- %wrapper %{
- static int NAME(TYPE x) {
- static TYPE values[] = { FIRST, ##__VA_ARGS__ };
- static int size = sizeof(values);
- int i,j;
- for (i = 0, j = 0; i < size; i+=sizeof(TYPE),j++) {
- if (x == values[j]) return 1;
- }
- return 0;
- }
- %}
- %enddef
- /* -----------------------------------------------------------------------------
- * %rename predicates
- * ----------------------------------------------------------------------------- */
- /*
- Predicates to be used with %rename, for example:
- - to rename all the functions:
- %rename("%(utitle)s", %$isfunction) "";
- - to rename only the member methods:
- %rename("m_%(utitle)s", %$isfunction, %$ismember) "";
- - to rename only the global functions:
- %rename("m_%(utitle)s", %$isfunction, %$not %$ismember) "";
- or
- %rename("g_%(utitle)s", %$isfunction, %$isglobal) "";
- - to ignore the enumitems in a given class:
- %rename("$ignore", %$isenumitem, %$classname="MyClass") "";
- we use the prefix '%$' to avoid clashes with other swig
- macros/directives.
- */
- %define %$not "not" %enddef
- %define %$isenum "match"="enum" %enddef
- %define %$isenumitem "match"="enumitem" %enddef
- %define %$isaccess "match"="access" %enddef
- %define %$isclass "match"="class","notmatch$template$templatetype"="class" %enddef
- %define %$isextend "match"="extend" %enddef
- %define %$isconstructor "match"="constructor" %enddef
- %define %$isdestructor "match"="destructor" %enddef
- %define %$isnamespace "match"="namespace" %enddef
- %define %$istemplate "match"="template" %enddef
- %define %$isconstant "match"="constant" %enddef /* %constant definition */
- %define %$isunion "match$kind"="union" %enddef
- %define %$isfunction "match$kind"="function" %enddef
- %define %$isvariable "match$kind"="variable" %enddef
- %define %$isimmutable "match$feature:immutable"="1" %enddef
- %define %$hasconsttype "match$hasconsttype"="1" %enddef
- %define %$hasvalue "match$hasvalue"="1" %enddef
- %define %$isextension "match$isextension"="1" %enddef
- %define %$isstatic "match$storage"="static" %enddef
- %define %$isfriend "match$storage"="friend" %enddef
- %define %$istypedef "match$storage"="typedef" %enddef
- %define %$isvirtual "match$storage"="virtual" %enddef
- %define %$isexplicit "match$storage"="explicit" %enddef
- %define %$isextern "match$storage"="extern" %enddef
- %define %$ismember "match$ismember"="1" %enddef
- %define %$isglobal %$not %$ismember %enddef
- %define %$isextendmember "match$isextendmember"="1" %enddef
- %define %$innamespace "match$parentNode$nodeType"="namespace" %enddef
- %define %$ispublic "match$access"="public" %enddef
- %define %$isprotected "match$access"="protected" %enddef
- %define %$isprivate "match$access"="private" %enddef
- %define %$ismemberget "match$memberget"="1" %enddef
- %define %$ismemberset "match$memberset"="1" %enddef
- %define %$classname %$ismember,"match$parentNode$name" %enddef
- %define %$isnested "match$nested"="1" %enddef
- /* -----------------------------------------------------------------------------
- * Include all the warnings labels and macros
- * ----------------------------------------------------------------------------- */
- %include <swigwarnings.swg>
- /* -----------------------------------------------------------------------------
- * Overloading support
- * ----------------------------------------------------------------------------- */
- /*
- * Function/method overloading support. This is done through typemaps,
- * but also involves a precedence level.
- */
- /* Macro for overload resolution */
- %define %typecheck(_x...) %typemap(typecheck, precedence=_x) %enddef
- /* Macros for precedence levels */
- %define SWIG_TYPECHECK_POINTER 0 %enddef
- %define SWIG_TYPECHECK_ITERATOR 5 %enddef
- %define SWIG_TYPECHECK_VOIDPTR 10 %enddef
- %define SWIG_TYPECHECK_BOOL 15 %enddef
- %define SWIG_TYPECHECK_UINT8 20 %enddef
- %define SWIG_TYPECHECK_INT8 25 %enddef
- %define SWIG_TYPECHECK_UINT16 30 %enddef
- %define SWIG_TYPECHECK_INT16 35 %enddef
- %define SWIG_TYPECHECK_UINT32 40 %enddef
- %define SWIG_TYPECHECK_INT32 45 %enddef
- %define SWIG_TYPECHECK_SIZE 47 %enddef
- %define SWIG_TYPECHECK_PTRDIFF 48 %enddef
- %define SWIG_TYPECHECK_UINT64 50 %enddef
- %define SWIG_TYPECHECK_INT64 55 %enddef
- %define SWIG_TYPECHECK_UINT128 60 %enddef
- %define SWIG_TYPECHECK_INT128 65 %enddef
- %define SWIG_TYPECHECK_INTEGER 70 %enddef
- %define SWIG_TYPECHECK_FLOAT 80 %enddef
- %define SWIG_TYPECHECK_DOUBLE 90 %enddef
- %define SWIG_TYPECHECK_CPLXFLT 95 %enddef
- %define SWIG_TYPECHECK_CPLXDBL 100 %enddef
- %define SWIG_TYPECHECK_COMPLEX 105 %enddef
- %define SWIG_TYPECHECK_UNICHAR 110 %enddef
- %define SWIG_TYPECHECK_STDUNISTRING 115 %enddef
- %define SWIG_TYPECHECK_UNISTRING 120 %enddef
- %define SWIG_TYPECHECK_CHAR 130 %enddef
- %define SWIG_TYPECHECK_STDSTRING 135 %enddef
- %define SWIG_TYPECHECK_STRING 140 %enddef
- %define SWIG_TYPECHECK_PAIR 150 %enddef
- %define SWIG_TYPECHECK_STDARRAY 155 %enddef
- %define SWIG_TYPECHECK_VECTOR 160 %enddef
- %define SWIG_TYPECHECK_DEQUE 170 %enddef
- %define SWIG_TYPECHECK_LIST 180 %enddef
- %define SWIG_TYPECHECK_SET 190 %enddef
- %define SWIG_TYPECHECK_MULTISET 200 %enddef
- %define SWIG_TYPECHECK_MAP 210 %enddef
- %define SWIG_TYPECHECK_MULTIMAP 220 %enddef
- %define SWIG_TYPECHECK_STACK 230 %enddef
- %define SWIG_TYPECHECK_QUEUE 240 %enddef
- %define SWIG_TYPECHECK_BOOL_ARRAY 1015 %enddef
- %define SWIG_TYPECHECK_INT8_ARRAY 1025 %enddef
- %define SWIG_TYPECHECK_INT16_ARRAY 1035 %enddef
- %define SWIG_TYPECHECK_INT32_ARRAY 1045 %enddef
- %define SWIG_TYPECHECK_INT64_ARRAY 1055 %enddef
- %define SWIG_TYPECHECK_INT128_ARRAY 1065 %enddef
- %define SWIG_TYPECHECK_FLOAT_ARRAY 1080 %enddef
- %define SWIG_TYPECHECK_DOUBLE_ARRAY 1090 %enddef
- %define SWIG_TYPECHECK_CHAR_ARRAY 1130 %enddef
- %define SWIG_TYPECHECK_STRING_ARRAY 1140 %enddef
- %define SWIG_TYPECHECK_OBJECT_ARRAY 1150 %enddef
- %define SWIG_TYPECHECK_BOOL_PTR 2015 %enddef
- %define SWIG_TYPECHECK_UINT8_PTR 2020 %enddef
- %define SWIG_TYPECHECK_INT8_PTR 2025 %enddef
- %define SWIG_TYPECHECK_UINT16_PTR 2030 %enddef
- %define SWIG_TYPECHECK_INT16_PTR 2035 %enddef
- %define SWIG_TYPECHECK_UINT32_PTR 2040 %enddef
- %define SWIG_TYPECHECK_INT32_PTR 2045 %enddef
- %define SWIG_TYPECHECK_UINT64_PTR 2050 %enddef
- %define SWIG_TYPECHECK_INT64_PTR 2055 %enddef
- %define SWIG_TYPECHECK_FLOAT_PTR 2080 %enddef
- %define SWIG_TYPECHECK_DOUBLE_PTR 2090 %enddef
- %define SWIG_TYPECHECK_CHAR_PTR 2130 %enddef
- %define SWIG_TYPECHECK_SWIGOBJECT 5000 %enddef
- /* -----------------------------------------------------------------------------
- * Default handling of certain overloaded operators
- * ----------------------------------------------------------------------------- */
- #ifdef __cplusplus
- %ignoreoperator(NEW) operator new;
- %ignoreoperator(DELETE) operator delete;
- %ignoreoperator(NEWARR) operator new[];
- %ignoreoperator(DELARR) operator delete[];
- /* add C++ operator aliases */
- %rename("operator &&") operator and; // `and' `&&'
- %rename("operator ||") operator or; // `or' `||'
- %rename("operator !") operator not; // `not' `!'
- %rename("operator &=") operator and_eq; // `and_eq' `&='
- %rename("operator &") operator bitand; // `bitand' `&'
- %rename("operator |") operator bitor; // `bitor' `|'
- %rename("operator ~") operator compl; // `compl' `~'
- %rename("operator !=") operator not_eq; // `not_eq' `!='
- %rename("operator |=") operator or_eq; // `or_eq' `|='
- %rename("operator ^") operator xor; // `xor' `^'
- %rename("operator ^=") operator xor_eq; // `xor_eq' `^='
- /* Smart pointer handling */
- %rename(__deref__) *::operator->;
- %rename(__ref__) *::operator*();
- %rename(__ref__) *::operator*() const;
- /* Define std namespace */
- namespace std {
- /* Warn about std::initializer_list usage. The constructor/method where used should probably be ignored. See docs. */
- template<typename T> class initializer_list {};
- %typemap(in, warning=SWIGWARN_TYPEMAP_INITIALIZER_LIST_MSG) initializer_list<T> ""
- %typemap(typecheck, precedence=SWIG_TYPECHECK_POINTER) initializer_list<T> ""
- }
- #endif
- /* -----------------------------------------------------------------------------
- * Default char * and C array typemaps
- * ----------------------------------------------------------------------------- */
- /* Set up the typemap for handling new return strings */
- #ifdef __cplusplus
- %typemap(newfree) char * "delete [] $1;";
- #else
- %typemap(newfree) char * "free($1);";
- #endif
- /* Default typemap for handling char * members */
- #ifdef __cplusplus
- %typemap(memberin) char * {
- delete [] $1;
- if ($input) {
- $1 = ($1_type) (new char[strlen((const char *)$input)+1]);
- strcpy((char *)$1, (const char *)$input);
- } else {
- $1 = 0;
- }
- }
- %typemap(memberin,warning=SWIGWARN_TYPEMAP_CHARLEAK_MSG) const char * {
- if ($input) {
- $1 = ($1_type) (new char[strlen((const char *)$input)+1]);
- strcpy((char *)$1, (const char *)$input);
- } else {
- $1 = 0;
- }
- }
- %typemap(globalin) char * {
- delete [] $1;
- if ($input) {
- $1 = ($1_type) (new char[strlen((const char *)$input)+1]);
- strcpy((char *)$1, (const char *)$input);
- } else {
- $1 = 0;
- }
- }
- %typemap(globalin,warning=SWIGWARN_TYPEMAP_CHARLEAK_MSG) const char * {
- if ($input) {
- $1 = ($1_type) (new char[strlen((const char *)$input)+1]);
- strcpy((char *)$1, (const char *)$input);
- } else {
- $1 = 0;
- }
- }
- #else
- %typemap(memberin) char * {
- free($1);
- if ($input) {
- $1 = ($1_type) malloc(strlen((const char *)$input)+1);
- strcpy((char *)$1, (const char *)$input);
- } else {
- $1 = 0;
- }
- }
- %typemap(memberin,warning=SWIGWARN_TYPEMAP_CHARLEAK_MSG) const char * {
- if ($input) {
- $1 = ($1_type) malloc(strlen((const char *)$input)+1);
- strcpy((char *)$1, (const char *)$input);
- } else {
- $1 = 0;
- }
- }
- %typemap(globalin) char * {
- free($1);
- if ($input) {
- $1 = ($1_type) malloc(strlen((const char *)$input)+1);
- strcpy((char *)$1, (const char *)$input);
- } else {
- $1 = 0;
- }
- }
- %typemap(globalin,warning=SWIGWARN_TYPEMAP_CHARLEAK_MSG) const char * {
- if ($input) {
- $1 = ($1_type) malloc(strlen((const char *)$input)+1);
- strcpy((char *)$1, (const char *)$input);
- } else {
- $1 = 0;
- }
- }
- #endif
- /* Character array handling */
- %typemap(memberin) char [ANY] {
- if($input) {
- strncpy((char*)$1, (const char *)$input, $1_dim0-1);
- $1[$1_dim0-1] = 0;
- } else {
- $1[0] = 0;
- }
- }
- %typemap(globalin) char [ANY] {
- if($input) {
- strncpy((char*)$1, (const char *)$input, $1_dim0-1);
- $1[$1_dim0-1] = 0;
- } else {
- $1[0] = 0;
- }
- }
- %typemap(memberin) char [] {
- if ($input) strcpy((char *)$1, (const char *)$input);
- else $1[0] = 0;
- }
- %typemap(globalin) char [] {
- if ($input) strcpy((char *)$1, (const char *)$input);
- else $1[0] = 0;
- }
- /* memberin/globalin typemap for arrays. */
- %typemap(memberin) SWIGTYPE [ANY] {
- size_t ii;
- $1_basetype *b = ($1_basetype *) $1;
- for (ii = 0; ii < (size_t)$1_size; ii++) b[ii] = *(($1_basetype *) $input + ii);
- }
- %typemap(globalin) SWIGTYPE [ANY] {
- size_t ii;
- $1_basetype *b = ($1_basetype *) $1;
- for (ii = 0; ii < (size_t)$1_size; ii++) b[ii] = *(($1_basetype *) $input + ii);
- }
- /* memberin/globalin typemap for double arrays. */
- %typemap(memberin) SWIGTYPE [ANY][ANY] {
- $basetype (*inp)[$1_dim1] = ($basetype (*)[$1_dim1])($input);
- $basetype (*dest)[$1_dim1] = ($basetype (*)[$1_dim1])($1);
- size_t ii = 0;
- for (; ii < $1_dim0; ++ii) {
- $basetype *ip = inp[ii];
- $basetype *dp = dest[ii];
- size_t jj = 0;
- for (; jj < $1_dim1; ++jj) dp[jj] = ip[jj];
- }
- }
- %typemap(globalin) SWIGTYPE [ANY][ANY] {
- $basetype (*inp)[$1_dim1] = ($basetype (*)[$1_dim1])($input);
- $basetype (*dest)[$1_dim1] = ($basetype (*)[$1_dim1])($1);
- size_t ii = 0;
- for (; ii < $1_dim0; ++ii) {
- $basetype *ip = inp[ii];
- $basetype *dp = dest[ii];
- size_t jj = 0;
- for (; jj < $1_dim1; ++jj) dp[jj] = ip[jj];
- }
- }
- /* -----------------------------------------------------------------------------
- * Runtime code
- * ----------------------------------------------------------------------------- */
- /* The SwigValueWrapper class */
- /*
- * This template wrapper is used to handle C++ objects that are passed or
- * returned by value. This is necessary to handle objects that define
- * no default-constructor (making it difficult for SWIG to properly declare
- * local variables).
- *
- * The wrapper is used as follows. First consider a function like this:
- *
- * Vector cross_product(Vector a, Vector b)
- *
- * Now, if Vector is defined as a C++ class with no default constructor,
- * code is generated as follows:
- *
- * Vector *wrap_cross_product(Vector *inarg1, Vector *inarg2) {
- * SwigValueWrapper<Vector> arg1;
- * SwigValueWrapper<Vector> arg2;
- * SwigValueWrapper<Vector> result;
- *
- * arg1 = *inarg1;
- * arg2 = *inarg2;
- * ...
- * result = cross_product(arg1,arg2);
- * ...
- * return new Vector(result);
- * }
- *
- * In the wrappers, the template SwigValueWrapper simply provides a thin
- * layer around a Vector *. However, it does this in a way that allows
- * the object to be bound after the variable declaration (which is not possible
- * with the bare object when it lacks a default constructor).
- *
- * An observant reader will notice that the code after the variable declarations
- * is *identical* to the code used for classes that do define default constructors.
- * Thus, this neat trick allows us to fix this special case without having to
- * make massive changes to typemaps and other parts of the SWIG code generator.
- *
- * Note: this code is not included when SWIG runs in C-mode, when classes
- * define default constructors, or when pointers and references are used.
- * SWIG tries to avoid doing this except in very special circumstances.
- *
- * Note: This solution suffers from making a large number of copies
- * of the underlying object. However, this is needed in the interest of
- * safety and in order to cover all of the possible ways in which a value
- * might be assigned. For example:
- *
- * arg1 = *inarg1; // Assignment from a pointer
- * arg1 = Vector(1,2,3); // Assignment from a value
- *
- * The class offers a strong guarantee of exception safety.
- * With regards to the implementation, the private SwigMovePointer nested class is
- * a simple smart pointer with move semantics, much like std::auto_ptr.
- *
- * This wrapping technique was suggested by William Fulton and is henceforth
- * known as the "Fulton Transform" :-).
- */
- #ifdef __cplusplus
- %insert("runtime") %{
- #ifdef __cplusplus
- /* SwigValueWrapper is described in swig.swg */
- template<typename T> class SwigValueWrapper {
- struct SwigMovePointer {
- T *ptr;
- SwigMovePointer(T *p) : ptr(p) { }
- ~SwigMovePointer() { delete ptr; }
- SwigMovePointer& operator=(SwigMovePointer& rhs) { T* oldptr = ptr; ptr = 0; delete oldptr; ptr = rhs.ptr; rhs.ptr = 0; return *this; }
- } pointer;
- SwigValueWrapper& operator=(const SwigValueWrapper<T>& rhs);
- SwigValueWrapper(const SwigValueWrapper<T>& rhs);
- public:
- SwigValueWrapper() : pointer(0) { }
- SwigValueWrapper& operator=(const T& t) { SwigMovePointer tmp(new T(t)); pointer = tmp; return *this; }
- operator T&() const { return *pointer.ptr; }
- T *operator&() { return pointer.ptr; }
- };%}
- /*
- * SwigValueInit() is a generic initialisation solution as the following approach:
- *
- * T c_result = T();
- *
- * doesn't compile for all types for example:
- *
- * unsigned int c_result = unsigned int();
- */
- %insert("runtime") %{
- template <typename T> T SwigValueInit() {
- return T();
- }
- #endif
- %}
- #endif
- /* The swiglabels */
- %insert("runtime") "swiglabels.swg"
|