1 /* ----------------------------------------------------------------------------- 2 * typemaps.i 3 * 4 * Pointer handling 5 * 6 * These mappings provide support for input/output arguments and 7 * common uses for C/C++ pointers. INOUT mappings allow for C/C++ 8 * pointer variables in addition to input/output arguments. 9 * ----------------------------------------------------------------------------- */ 10 11 #if !defined(SWIG_USE_OLD_TYPEMAPS) 12 %include <typemaps/typemaps.swg> 13 #else 14 15 /* 16 The SWIG typemap library provides a language independent mechanism for 17 supporting output arguments, input values, and other C function 18 calling mechanisms. The primary use of the library is to provide a 19 better interface to certain C function--especially those involving 20 pointers. 21 */ 22 23 // ------------------------------------------------------------------------ 24 // Pointer handling 25 // 26 // These mappings provide support for input/output arguments and common 27 // uses for C/C++ pointers. 28 // ------------------------------------------------------------------------ 29 30 // INPUT typemaps. 31 // These remap a C pointer to be an "INPUT" value which is passed by value 32 // instead of reference. 33 34 /* 35 The following methods can be applied to turn a pointer into a simple 36 "input" value. That is, instead of passing a pointer to an object, 37 you would use a real value instead. 38 39 int *INPUT 40 short *INPUT 41 long *INPUT 42 long long *INPUT 43 unsigned int *INPUT 44 unsigned short *INPUT 45 unsigned long *INPUT 46 unsigned long long *INPUT 47 unsigned char *INPUT 48 bool *INPUT 49 float *INPUT 50 double *INPUT 51 52 To use these, suppose you had a C function like this : 53 54 double fadd(double *a, double *b) { 55 return *a+*b; 56 } 57 58 You could wrap it with SWIG as follows : 59 60 %include typemaps.i 61 double fadd(double *INPUT, double *INPUT); 62 63 or you can use the %apply directive : 64 65 %include typemaps.i 66 %apply double *INPUT { double *a, double *b }; 67 double fadd(double *a, double *b); 68 69 */ 70 71 %define INPUT_TYPEMAP(type, converter) 72 %typemap(in) type *INPUT($*1_ltype temp), type &INPUT($*1_ltype temp) 73 { 74 temp = ($*1_ltype) converter($input); 75 $1 = &temp; 76 } 77 %typemap(typecheck) type *INPUT = type; 78 %typemap(typecheck) type &INPUT = type; 79 %enddef 80 81 INPUT_TYPEMAP(float, NUM2DBL); 82 INPUT_TYPEMAP(double, NUM2DBL); 83 INPUT_TYPEMAP(int, NUM2INT); 84 INPUT_TYPEMAP(short, NUM2SHRT); 85 INPUT_TYPEMAP(long, NUM2LONG); 86 INPUT_TYPEMAP(long long, NUM2LL); 87 INPUT_TYPEMAP(unsigned int, NUM2UINT); 88 INPUT_TYPEMAP(unsigned short, NUM2USHRT); 89 INPUT_TYPEMAP(unsigned long, NUM2ULONG); 90 INPUT_TYPEMAP(unsigned long long, NUM2ULL); 91 INPUT_TYPEMAP(unsigned char, NUM2UINT); 92 INPUT_TYPEMAP(signed char, NUM2INT); 93 INPUT_TYPEMAP(bool, RTEST); 94 95 #undef INPUT_TYPEMAP 96 97 // OUTPUT typemaps. These typemaps are used for parameters that 98 // are output only. The output value is appended to the result as 99 // a array element. 100 101 /* 102 The following methods can be applied to turn a pointer into an "output" 103 value. When calling a function, no input value would be given for 104 a parameter, but an output value would be returned. In the case of 105 multiple output values, they are returned in the form of a Ruby Array. 106 107 int *OUTPUT 108 short *OUTPUT 109 long *OUTPUT 110 long long *OUTPUT 111 unsigned int *OUTPUT 112 unsigned short *OUTPUT 113 unsigned long *OUTPUT 114 unsigned long long *OUTPUT 115 unsigned char *OUTPUT 116 bool *OUTPUT 117 float *OUTPUT 118 double *OUTPUT 119 120 For example, suppose you were trying to wrap the modf() function in the 121 C math library which splits x into integral and fractional parts (and 122 returns the integer part in one of its parameters).K: 123 124 double modf(double x, double *ip); 125 126 You could wrap it with SWIG as follows : 127 128 %include typemaps.i 129 double modf(double x, double *OUTPUT); 130 131 or you can use the %apply directive : 132 133 %include typemaps.i 134 %apply double *OUTPUT { double *ip }; 135 double modf(double x, double *ip); 136 137 The Ruby output of the function would be a Array containing both 138 output values. 139 */ 140 141 %define OUTPUT_TYPEMAP(type, converter, convtype) 142 %typemap(in,numinputs=0) type *OUTPUT($*1_ltype temp), type &OUTPUT($*1_ltype temp) "$1 = &temp;"; 143 %typemap(argout, fragment="output_helper") type *OUTPUT, type &OUTPUT { 144 VALUE o = converter(convtype (*$1)); 145 $result = output_helper($result, o); 146 } 147 %enddef 148 149 OUTPUT_TYPEMAP(int, INT2NUM, (int)); 150 OUTPUT_TYPEMAP(short, INT2NUM, (int)); 151 OUTPUT_TYPEMAP(long, INT2NUM, (long)); 152 OUTPUT_TYPEMAP(long long, LL2NUM, (long long)); 153 OUTPUT_TYPEMAP(unsigned int, UINT2NUM, (unsigned int)); 154 OUTPUT_TYPEMAP(unsigned short, UINT2NUM, (unsigned int)); 155 OUTPUT_TYPEMAP(unsigned long, UINT2NUM, (unsigned long)); 156 OUTPUT_TYPEMAP(unsigned long long, ULL2NUM, (unsigned long long)); 157 OUTPUT_TYPEMAP(unsigned char, UINT2NUM, (unsigned int)); 158 OUTPUT_TYPEMAP(signed char, INT2NUM, (int)); 159 OUTPUT_TYPEMAP(float, rb_float_new, (double)); 160 OUTPUT_TYPEMAP(double, rb_float_new, (double)); 161 162 #undef OUTPUT_TYPEMAP 163 164 %typemap(in,numinputs=0) bool *OUTPUT(bool temp), bool &OUTPUT(bool temp) "$1 = &temp;"; 165 %typemap(argout, fragment="output_helper") bool *OUTPUT, bool &OUTPUT { 166 VALUE o = (*$1) ? Qtrue : Qfalse; 167 $result = output_helper($result, o); 168 } 169 170 // INOUT 171 // Mappings for an argument that is both an input and output 172 // parameter 173 174 /* 175 The following methods can be applied to make a function parameter both 176 an input and output value. This combines the behavior of both the 177 "INPUT" and "OUTPUT" methods described earlier. Output values are 178 returned in the form of a Ruby array. 179 180 int *INOUT 181 short *INOUT 182 long *INOUT 183 long long *INOUT 184 unsigned int *INOUT 185 unsigned short *INOUT 186 unsigned long *INOUT 187 unsigned long long *INOUT 188 unsigned char *INOUT 189 bool *INOUT 190 float *INOUT 191 double *INOUT 192 193 For example, suppose you were trying to wrap the following function : 194 195 void neg(double *x) { 196 *x = -(*x); 197 } 198 199 You could wrap it with SWIG as follows : 200 201 %include typemaps.i 202 void neg(double *INOUT); 203 204 or you can use the %apply directive : 205 206 %include typemaps.i 207 %apply double *INOUT { double *x }; 208 void neg(double *x); 209 210 Unlike C, this mapping does not directly modify the input value (since 211 this makes no sense in Ruby). Rather, the modified input value shows 212 up as the return value of the function. Thus, to apply this function 213 to a Ruby variable you might do this : 214 215 x = neg(x) 216 217 Note : previous versions of SWIG used the symbol 'BOTH' to mark 218 input/output arguments. This is still supported, but will be slowly 219 phased out in future releases. 220 221 */ 222 223 %typemap(in) int *INOUT = int *INPUT; 224 %typemap(in) short *INOUT = short *INPUT; 225 %typemap(in) long *INOUT = long *INPUT; 226 %typemap(in) long long *INOUT = long long *INPUT; 227 %typemap(in) unsigned *INOUT = unsigned *INPUT; 228 %typemap(in) unsigned short *INOUT = unsigned short *INPUT; 229 %typemap(in) unsigned long *INOUT = unsigned long *INPUT; 230 %typemap(in) unsigned long long *INOUT = unsigned long long *INPUT; 231 %typemap(in) unsigned char *INOUT = unsigned char *INPUT; 232 %typemap(in) signed char *INOUT = signed char *INPUT; 233 %typemap(in) bool *INOUT = bool *INPUT; 234 %typemap(in) float *INOUT = float *INPUT; 235 %typemap(in) double *INOUT = double *INPUT; 236 237 %typemap(in) int &INOUT = int &INPUT; 238 %typemap(in) short &INOUT = short &INPUT; 239 %typemap(in) long &INOUT = long &INPUT; 240 %typemap(in) long long &INOUT = long long &INPUT; 241 %typemap(in) unsigned &INOUT = unsigned &INPUT; 242 %typemap(in) unsigned short &INOUT = unsigned short &INPUT; 243 %typemap(in) unsigned long &INOUT = unsigned long &INPUT; 244 %typemap(in) unsigned long long &INOUT = unsigned long long &INPUT; 245 %typemap(in) unsigned char &INOUT = unsigned char &INPUT; 246 %typemap(in) signed char &INOUT = signed char &INPUT; 247 %typemap(in) bool &INOUT = bool &INPUT; 248 %typemap(in) float &INOUT = float &INPUT; 249 %typemap(in) double &INOUT = double &INPUT; 250 251 %typemap(argout) int *INOUT = int *OUTPUT; 252 %typemap(argout) short *INOUT = short *OUTPUT; 253 %typemap(argout) long *INOUT = long *OUTPUT; 254 %typemap(argout) long long *INOUT = long long *OUTPUT; 255 %typemap(argout) unsigned *INOUT = unsigned *OUTPUT; 256 %typemap(argout) unsigned short *INOUT = unsigned short *OUTPUT; 257 %typemap(argout) unsigned long *INOUT = unsigned long *OUTPUT; 258 %typemap(argout) unsigned long long *INOUT = unsigned long long *OUTPUT; 259 %typemap(argout) unsigned char *INOUT = unsigned char *OUTPUT; 260 %typemap(argout) signed char *INOUT = signed char *OUTPUT; 261 %typemap(argout) bool *INOUT = bool *OUTPUT; 262 %typemap(argout) float *INOUT = float *OUTPUT; 263 %typemap(argout) double *INOUT = double *OUTPUT; 264 265 %typemap(argout) int &INOUT = int &OUTPUT; 266 %typemap(argout) short &INOUT = short &OUTPUT; 267 %typemap(argout) long &INOUT = long &OUTPUT; 268 %typemap(argout) long long &INOUT = long long &OUTPUT; 269 %typemap(argout) unsigned &INOUT = unsigned &OUTPUT; 270 %typemap(argout) unsigned short &INOUT = unsigned short &OUTPUT; 271 %typemap(argout) unsigned long &INOUT = unsigned long &OUTPUT; 272 %typemap(argout) unsigned long long &INOUT = unsigned long long &OUTPUT; 273 %typemap(argout) unsigned char &INOUT = unsigned char &OUTPUT; 274 %typemap(argout) signed char &INOUT = signed char &OUTPUT; 275 %typemap(argout) bool &INOUT = bool &OUTPUT; 276 %typemap(argout) float &INOUT = float &OUTPUT; 277 %typemap(argout) double &INOUT = double &OUTPUT; 278 279 /* Overloading information */ 280 281 %typemap(typecheck) double *INOUT = double; 282 %typemap(typecheck) signed char *INOUT = signed char; 283 %typemap(typecheck) unsigned char *INOUT = unsigned char; 284 %typemap(typecheck) unsigned long *INOUT = unsigned long; 285 %typemap(typecheck) unsigned long long *INOUT = unsigned long long; 286 %typemap(typecheck) unsigned short *INOUT = unsigned short; 287 %typemap(typecheck) unsigned int *INOUT = unsigned int; 288 %typemap(typecheck) long *INOUT = long; 289 %typemap(typecheck) long long *INOUT = long long; 290 %typemap(typecheck) short *INOUT = short; 291 %typemap(typecheck) int *INOUT = int; 292 %typemap(typecheck) float *INOUT = float; 293 294 %typemap(typecheck) double &INOUT = double; 295 %typemap(typecheck) signed char &INOUT = signed char; 296 %typemap(typecheck) unsigned char &INOUT = unsigned char; 297 %typemap(typecheck) unsigned long &INOUT = unsigned long; 298 %typemap(typecheck) unsigned long long &INOUT = unsigned long long; 299 %typemap(typecheck) unsigned short &INOUT = unsigned short; 300 %typemap(typecheck) unsigned int &INOUT = unsigned int; 301 %typemap(typecheck) long &INOUT = long; 302 %typemap(typecheck) long long &INOUT = long long; 303 %typemap(typecheck) short &INOUT = short; 304 %typemap(typecheck) int &INOUT = int; 305 %typemap(typecheck) float &INOUT = float; 306 307 #endif 308 309 // -------------------------------------------------------------------- 310 // Special types 311 // -------------------------------------------------------------------- 312 %include <progargcargv.i> 313 %include <file.i> 314 %include <timeval.i> 315