1/* ----------------------------------------------------------------------------- 2 * SWIG API. Portion only visible from SWIG 3 * ----------------------------------------------------------------------------- */ 4/* 5 This file implements the internal macros of the 'SWIG API', which 6 are useful to implement all the SWIG target languges. 7 8 Basic preprocessor macros: 9 -------------------------- 10 11 %arg(Arg) Safe argument wrap 12 %str(Arg) Stringtify the argument 13 %begin_block Begin a execution block 14 %end_block End a execution block 15 %block(Block) Execute Block as a excecution block 16 %define_as(Def, Val) Define 'Def' as 'Val', expanding Def and Val first 17 %ifcplusplus(V1, V2) if C++ Mode; then V1; else V2; fi 18 19 20 Casting Operations: 21 ------------------- 22 23 Swig provides the following casting macros, which implement the 24 corresponding C++ casting operations: 25 26 %const_cast(a, Type) const_cast<Type >(a) 27 %static_cast(a, Type) static_cast<Type >(a) 28 %reinterpret_cast(a, Type) reinterpret_cast<Type >(a) 29 %numeric_cast(a, Type) static_cast<Type >(a) 30 %as_voidptr(a) const_cast<void *>(static_cast<const void *>(a)) 31 %as_voidptrptr(a) reinterpret_cast<void **>(a) 32 33 or their C unsafe versions. In C++ we use the safe version unless 34 SWIG_NO_CPLUSPLUS_CAST is defined (usually via the -nocppcast swig flag). 35 36 37 Memory allocation: 38 ------------------ 39 40 These allocation/freeing macros are safe to use in C or C++ and 41 dispatch the proper new/delete/delete[] or free/malloc calls as 42 needed. 43 44 %new_instance(Type) Allocate a new instance of given Type 45 %new_copy(value,Type) Allocate and initialize a new instance with 'value' 46 %new_array(size,Type) Allocate a new array with given size and Type 47 %new_copy_array(cptr,size,Type) Allocate and initialize a new array from 'cptr' 48 %delete(cptr) Delete an instance 49 %delete_array(cptr) Delete an array 50 51 52 Auxiliary loop macros: 53 ---------------------- 54 55 %formacro(Macro, Args...) or %formacro_1(Macro, Args...) 56 for i in Args 57 do 58 Macro($i) 59 done 60 61 %formacro_2(Macro2, Args...) 62 for i,j in Args 63 do 64 Macro2($i, $j) 65 done 66 67 68 Flags and conditional macros: 69 ----------------------------- 70 71 %mark_flag(flag) 72 flag := True 73 74 %evalif(flag,expr) 75 if flag; then 76 expr 77 fi 78 79 %evalif_2(flag1 flag2,expr) 80 if flag1 and flag2; then 81 expr 82 fi 83 84 85*/ 86/* ----------------------------------------------------------------------------- 87 * Basic preprocessor macros 88 * ----------------------------------------------------------------------------- */ 89 90#define %arg(Arg...) Arg 91#define %str(Arg) `Arg` 92#ifndef %begin_block 93# define %begin_block do { 94#endif 95#ifndef %end_block 96# define %end_block } while(0) 97#endif 98#define %block(Block...) %begin_block Block; %end_block 99 100/* define a new macro */ 101%define %define_as(Def, Val...)%#define Def Val %enddef 102 103/* include C++ or else value */ 104%define %ifcplusplus(cppval, nocppval) 105#ifdef __cplusplus 106cppval 107#else 108nocppval 109#endif 110%enddef 111 112/* insert the SWIGVERSION in the interface and the wrapper code */ 113#if SWIG_VERSION 114%insert("header") { 115%define_as(SWIGVERSION, SWIG_VERSION) 116%#define SWIG_VERSION SWIGVERSION 117} 118#endif 119 120 121 122/* ----------------------------------------------------------------------------- 123 * Casting operators 124 * ----------------------------------------------------------------------------- */ 125 126#if defined(SWIG_NO_CPLUSPLUS_CAST) 127/* Disable 'modern' cplusplus casting operators */ 128# if defined(SWIG_CPLUSPLUS_CAST) 129# undef SWIG_CPLUSPLUS_CAST 130# endif 131#endif 132 133#if defined(__cplusplus) && defined(SWIG_CPLUSPLUS_CAST) 134# define %const_cast(a,Type...) const_cast< Type >(a) 135# define %static_cast(a,Type...) static_cast< Type >(a) 136# define %reinterpret_cast(a,Type...) reinterpret_cast< Type >(a) 137# define %numeric_cast(a,Type...) static_cast< Type >(a) 138#else /* C case */ 139# define %const_cast(a,Type...) (Type)(a) 140# define %static_cast(a,Type...) (Type)(a) 141# define %reinterpret_cast(a,Type...) (Type)(a) 142# define %numeric_cast(a,Type...) (Type)(a) 143#endif /* __cplusplus */ 144 145 146#define %as_voidptr(a) SWIG_as_voidptr(a) 147#define %as_voidptrptr(a) SWIG_as_voidptrptr(a) 148 149%insert("header") { 150%define_as(SWIG_as_voidptr(a), %const_cast(%static_cast(a,const void *), void *)) 151%define_as(SWIG_as_voidptrptr(a), ((void)%as_voidptr(*a),%reinterpret_cast(a, void**))) 152} 153 154 155/* ----------------------------------------------------------------------------- 156 * Allocating/freeing elements 157 * ----------------------------------------------------------------------------- */ 158 159#if defined(__cplusplus) 160# define %new_instance(Type...) (new Type) 161# define %new_copy(val,Type...) (new Type(%static_cast(val, const Type&))) 162# define %new_array(size,Type...) (new Type[size]) 163# define %new_copy_array(ptr,size,Type...) %reinterpret_cast(memcpy(%new_array(size,Type), ptr, sizeof(Type)*(size)), Type*) 164# define %delete(cptr) delete cptr 165# define %delete_array(cptr) delete[] cptr 166#else /* C case */ 167# define %new_instance(Type...) (Type *)malloc(sizeof(Type)) 168# define %new_copy(val,Type...) (Type *)memcpy(%new_instance(Type),&val,sizeof(Type)) 169# define %new_array(size,Type...) (Type *)malloc((size)*sizeof(Type)) 170# define %new_copy_array(ptr,size,Type...) (Type *)memcpy(%new_array(size,Type), ptr, sizeof(Type)*(size)) 171# define %delete(cptr) free((char*)cptr) 172# define %delete_array(cptr) free((char*)cptr) 173#endif /* __cplusplus */ 174 175/* ----------------------------------------------------------------------------- 176 * Swig names and mangling 177 * ----------------------------------------------------------------------------- */ 178 179#define %mangle(Type...) #@Type 180#define %descriptor(Type...) SWIGTYPE_ ## #@Type 181#define %string_name(Name) "SWIG_" %str(Name) 182#define %symbol_name(Name, Type...) SWIG_ ## Name ## _ #@Type 183#define %checkcode(Code) SWIG_TYPECHECK_ ## Code 184 185 186/* ----------------------------------------------------------------------------- 187 * Auxiliary loop macros 188 * ----------------------------------------------------------------------------- */ 189 190 191/* for loop for macro with one argument */ 192%define %_formacro_1(macro, arg1,...)macro(arg1) 193#if #__VA_ARGS__ != "__fordone__" 194%_formacro_1(macro, __VA_ARGS__) 195#endif 196%enddef 197 198/* for loop for macro with one argument */ 199%define %formacro_1(macro,...)%_formacro_1(macro,__VA_ARGS__,__fordone__)%enddef 200%define %formacro(macro,...)%_formacro_1(macro,__VA_ARGS__,__fordone__)%enddef 201 202/* for loop for macro with two arguments */ 203%define %_formacro_2(macro, arg1, arg2, ...)macro(arg1, arg2) 204#if #__VA_ARGS__ != "__fordone__" 205%_formacro_2(macro, __VA_ARGS__) 206#endif 207%enddef 208 209/* for loop for macro with two arguments */ 210%define %formacro_2(macro,...)%_formacro_2(macro, __VA_ARGS__, __fordone__)%enddef 211 212/* ----------------------------------------------------------------------------- 213 * Swig flags 214 * ----------------------------------------------------------------------------- */ 215 216/* 217 mark a flag, ie, define a macro name but ignore it in 218 the interface. 219 220 the flag can be later used with %evalif 221*/ 222 223%define %mark_flag(x) %define x 1 %enddef %enddef 224 225 226/* 227 %evalif and %evalif_2 are use to evaluate or process 228 an expression if the given predicate is 'true' (1). 229*/ 230%define %_evalif(_x,_expr) 231#if _x == 1 232_expr 233#endif 234%enddef 235 236%define %_evalif_2(_x,_y,_expr) 237#if _x == 1 && _y == 1 238_expr 239#endif 240%enddef 241 242%define %evalif(_x,_expr...) %_evalif(%arg(_x),%arg(_expr)) %enddef 243 244%define %evalif_2(_x,_y,_expr...) %_evalif_2(%arg(_x),%arg(_y),%arg(_expr)) %enddef 245 246