Mercurial > mm7
comparison lib/swig/swigwin-2.0.11/Lib/swig.swg @ 1899:b3009adc0e2f
Adding swig, gitignore, hgignore
author | Nomad |
---|---|
date | Mon, 21 Oct 2013 10:42:27 +0200 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
1867:eb580660bbbb | 1899:b3009adc0e2f |
---|---|
1 /* ----------------------------------------------------------------------------- | |
2 * swig.swg | |
3 * | |
4 * Common macro definitions for various SWIG directives. This file is always | |
5 * included at the top of each input file. | |
6 * ----------------------------------------------------------------------------- */ | |
7 | |
8 /* ----------------------------------------------------------------------------- | |
9 * User Directives | |
10 * ----------------------------------------------------------------------------- */ | |
11 | |
12 /* Deprecated SWIG directives */ | |
13 | |
14 #define %disabledoc %warn "104:%disabledoc is deprecated" | |
15 #define %enabledoc %warn "105:%enabledoc is deprecated" | |
16 #define %doconly %warn "106:%doconly is deprecated" | |
17 #define %style %warn "107:%style is deprecated" /##/ | |
18 #define %localstyle %warn "108:%localstyle is deprecated" /##/ | |
19 #define %title %warn "109:%title is deprecated" /##/ | |
20 #define %section %warn "110:%section is deprecated" /##/ | |
21 #define %subsection %warn "111:%subsection is deprecated" /##/ | |
22 #define %subsubsection %warn "112:%subsubsection is deprecated" /##/ | |
23 #define %new %warn "117:%new is deprecated. Use %newobject" | |
24 #define %text %insert("null") | |
25 | |
26 /* Code insertion directives such as %wrapper %{ ... %} */ | |
27 | |
28 #define %begin %insert("begin") | |
29 #define %runtime %insert("runtime") | |
30 #define %header %insert("header") | |
31 #define %wrapper %insert("wrapper") | |
32 #define %init %insert("init") | |
33 | |
34 /* Class extension */ | |
35 | |
36 #define %addmethods %warn "113:%addmethods is now %extend" %extend | |
37 | |
38 /* %ignore directive */ | |
39 | |
40 #define %ignore %rename($ignore) | |
41 #define %ignorewarn(x) %rename("$ignore:" x) | |
42 | |
43 /* Access control directives */ | |
44 | |
45 #define %readonly %warn "114:%readonly is deprecated. Use %immutable; " %feature("immutable"); | |
46 #define %readwrite %warn "115:%readwrite is deprecated. Use %mutable; " %feature("immutable",""); | |
47 | |
48 #define %immutable %feature("immutable") | |
49 #define %noimmutable %feature("immutable","0") | |
50 #define %clearimmutable %feature("immutable","") | |
51 #define %mutable %clearimmutable | |
52 | |
53 /* Generation of default constructors/destructors (old form, don't use) */ | |
54 #define %nodefault %feature("nodefault","1") | |
55 #define %default %feature("nodefault","0") | |
56 #define %clearnodefault %feature("nodefault","") | |
57 #define %makedefault %clearnodefault | |
58 | |
59 /* Disable the generation of implicit default constructor */ | |
60 #define %nodefaultctor %feature("nodefaultctor","1") | |
61 #define %defaultctor %feature("nodefaultctor","0") | |
62 #define %clearnodefaultctor %feature("nodefaultctor","") | |
63 | |
64 /* Disable the generation of implicit default destructor (dangerous) */ | |
65 #define %nodefaultdtor %feature("nodefaultdtor","1") | |
66 #define %defaultdtor %feature("nodefaultdtor","0") | |
67 #define %clearnodefaultdtor %feature("nodefaultdtor","") | |
68 | |
69 /* Enable the generation of copy constructor */ | |
70 #define %copyctor %feature("copyctor","1") | |
71 #define %nocopyctor %feature("copyctor","0") | |
72 #define %clearcopyctor %feature("copyctor","") | |
73 | |
74 /* Force the old nodefault behavior, ie disable both constructor and destructor */ | |
75 #define %oldnodefault %feature("oldnodefault","1") | |
76 #define %nooldnodefault %feature("oldnodefault","0") | |
77 #define %clearoldnodefault %feature("oldnodefault","") | |
78 | |
79 /* the %exception directive */ | |
80 #if defined(SWIGCSHARP) || defined(SWIGD) | |
81 #define %exception %feature("except", canthrow=1) | |
82 #else | |
83 #define %exception %feature("except") | |
84 #endif | |
85 #define %noexception %feature("except","0") | |
86 #define %clearexception %feature("except","") | |
87 | |
88 /* the %allowexception directive allows the %exception feature to | |
89 be applied to set/get variable methods */ | |
90 #define %allowexception %feature("allowexcept") | |
91 #define %noallowexception %feature("allowexcept","0") | |
92 #define %clearallowexception %feature("allowexcept","") | |
93 | |
94 /* the %exceptionvar directive, as %exception but it is only applied | |
95 to set/get variable methods. You don't need to use the | |
96 %allowexception directive when using %exceptionvar. | |
97 */ | |
98 #if defined(SWIGCSHARP) || defined(SWIGD) | |
99 #define %exceptionvar %feature("exceptvar", canthrow=1) | |
100 #else | |
101 #define %exceptionvar %feature("exceptvar") | |
102 #endif | |
103 #define %noexceptionvar %feature("exceptvar","0") | |
104 #define %clearexceptionvar %feature("exceptvar","") | |
105 | |
106 /* the %catches directive */ | |
107 #define %catches(tlist...) %feature("catches","("`tlist`")") | |
108 #define %clearcatches %feature("catches","") | |
109 | |
110 /* the %exceptionclass directive */ | |
111 #define %exceptionclass %feature("exceptionclass") | |
112 #define %noexceptionclass %feature("exceptionclass","0") | |
113 #define %clearexceptionclass %feature("exceptionclass","") | |
114 | |
115 /* the %newobject directive */ | |
116 #define %newobject %feature("new") | |
117 #define %nonewobject %feature("new","0") | |
118 #define %clearnewobject %feature("new","") | |
119 | |
120 /* the %delobject directive */ | |
121 #define %delobject %feature("del") | |
122 #define %nodelobject %feature("del","0") | |
123 #define %cleardelobject %feature("del","") | |
124 | |
125 /* the %refobject/%unrefobject directives */ | |
126 #define %refobject %feature("ref") | |
127 #define %norefobject %feature("ref","0") | |
128 #define %clearrefobject %feature("ref","") | |
129 | |
130 #define %unrefobject %feature("unref") | |
131 #define %nounrefobject %feature("unref","0") | |
132 #define %clearunrefobject %feature("unref","") | |
133 | |
134 /* Directives for callback functions (experimental) */ | |
135 #define %callback(x) %feature("callback",`x`) | |
136 #define %nocallback %feature("callback","0") | |
137 #define %clearcallback %feature("callback","") | |
138 | |
139 /* the %nestedworkaround directive */ | |
140 #define %nestedworkaround %feature("nestedworkaround") | |
141 #define %nonestedworkaround %feature("nestedworkaround","0") | |
142 #define %clearnestedworkaround %feature("nestedworkaround","") | |
143 | |
144 /* the %fastdispatch directive */ | |
145 #define %fastdispatch %feature("fastdispatch") | |
146 #define %nofastdispatch %feature("fastdispatch","0") | |
147 #define %clearfastdispatch %feature("fastdispatch","") | |
148 | |
149 /* directors directives */ | |
150 #define %director %feature("director") | |
151 #define %nodirector %feature("director","0") | |
152 #define %cleardirector %feature("director","") | |
153 | |
154 /* naturalvar directives */ | |
155 #define %naturalvar %feature("naturalvar") | |
156 #define %nonaturalvar %feature("naturalvar","0") | |
157 #define %clearnaturalvar %feature("naturalvar","") | |
158 | |
159 /* nspace directives */ | |
160 #define %nspace %feature("nspace") | |
161 #define %nonspace %feature("nspace","0") | |
162 #define %clearnspace %feature("nspace","") | |
163 | |
164 /* valuewrapper directives */ | |
165 #define %valuewrapper %feature("valuewrapper") | |
166 #define %clearvaluewrapper %feature("valuewrapper","") | |
167 #define %novaluewrapper %feature("novaluewrapper") | |
168 #define %clearnovaluewrapper %feature("novaluewrapper","") | |
169 | |
170 /* Contract support - Experimental and undocumented */ | |
171 #define %contract %feature("contract") | |
172 #define %nocontract %feature("contract","0") | |
173 #define %clearcontract %feature("contract","") | |
174 | |
175 /* Macro for setting a dynamic cast function */ | |
176 %define DYNAMIC_CAST(mangle,func) | |
177 %init %{ | |
178 mangle->dcast = (swig_dycast_func) func; | |
179 %} | |
180 %enddef | |
181 | |
182 /* aggregation support */ | |
183 /* | |
184 This macro performs constant aggregation. Basically the idea of | |
185 constant aggregation is that you can group a collection of constants | |
186 together. For example, suppose you have some code like this: | |
187 | |
188 #define UP 1 | |
189 #define DOWN 2 | |
190 #define LEFT 3 | |
191 #define RIGHT 4 | |
192 | |
193 Now, suppose you had a function like this: | |
194 | |
195 int move(int direction) | |
196 | |
197 In this case, you might want to restrict the direction argument to | |
198 one of the supplied constant names. To do this, you could write some | |
199 typemap code by hand. Alternatively, you can use the | |
200 %aggregate_check macro defined here to create a simple check | |
201 function for you. Here is an example: | |
202 | |
203 %aggregate_check(int, check_direction, UP, DOWN, LEFT, RIGHT); | |
204 | |
205 Now, using a typemap | |
206 | |
207 %typemap(check) int direction { | |
208 if (!check_direction($1)) SWIG_exception(SWIG_ValueError,"Bad direction."); | |
209 } | |
210 | |
211 or a contract (better) | |
212 | |
213 %contract move(int x) { | |
214 require: | |
215 check_direction(x); | |
216 } | |
217 | |
218 */ | |
219 | |
220 %define %aggregate_check(TYPE, NAME, FIRST, ...) | |
221 %wrapper %{ | |
222 static int NAME(TYPE x) { | |
223 static TYPE values[] = { FIRST, ##__VA_ARGS__ }; | |
224 static int size = sizeof(values); | |
225 int i,j; | |
226 for (i = 0, j = 0; i < size; i+=sizeof(TYPE),j++) { | |
227 if (x == values[j]) return 1; | |
228 } | |
229 return 0; | |
230 } | |
231 %} | |
232 %enddef | |
233 | |
234 | |
235 /* ----------------------------------------------------------------------------- | |
236 * %rename predicates | |
237 * ----------------------------------------------------------------------------- */ | |
238 /* | |
239 Predicates to be used with %rename, for example: | |
240 | |
241 - to rename all the functions: | |
242 | |
243 %rename("%(utitle)s", %$isfunction) ""; | |
244 | |
245 - to rename only the member methods: | |
246 | |
247 %rename("m_%(utitle)s", %$isfunction, %$ismember) ""; | |
248 | |
249 - to rename only the global functions: | |
250 | |
251 %rename("m_%(utitle)s", %$isfunction, %$not %$ismember) ""; | |
252 | |
253 or | |
254 | |
255 %rename("g_%(utitle)s", %$isfunction, %$isglobal) ""; | |
256 | |
257 - to ignore the enumitems in a given class: | |
258 | |
259 %rename("$ignore", %$isenumitem, %$classname="MyClass") ""; | |
260 | |
261 we use the prefix '%$' to avoid clashings with other swig | |
262 macros/directives. | |
263 | |
264 */ | |
265 | |
266 %define %$not "not" %enddef | |
267 %define %$isenum "match"="enum" %enddef | |
268 %define %$isenumitem "match"="enumitem" %enddef | |
269 %define %$isaccess "match"="access" %enddef | |
270 %define %$isclass "match"="class","notmatch$template$templatetype"="class" %enddef | |
271 %define %$isextend "match"="extend" %enddef | |
272 %define %$isconstructor "match"="constructor" %enddef | |
273 %define %$isdestructor "match"="destructor" %enddef | |
274 %define %$isnamespace "match"="namespace" %enddef | |
275 %define %$istemplate "match"="template" %enddef | |
276 %define %$isconstant "match"="constant" %enddef /* %constant definition */ | |
277 | |
278 %define %$isunion "match$kind"="union" %enddef | |
279 %define %$isfunction "match$kind"="function" %enddef | |
280 %define %$isvariable "match$kind"="variable" %enddef | |
281 %define %$isimmutable "match$feature:immutable"="1" %enddef | |
282 %define %$hasconsttype "match$hasconsttype"="1" %enddef | |
283 %define %$hasvalue "match$hasvalue"="1" %enddef | |
284 %define %$isextension "match$isextension"="1" %enddef | |
285 | |
286 %define %$isstatic "match$storage"="static" %enddef | |
287 %define %$isfriend "match$storage"="friend" %enddef | |
288 %define %$istypedef "match$storage"="typedef" %enddef | |
289 %define %$isvirtual "match$storage"="virtual" %enddef | |
290 %define %$isexplicit "match$storage"="explicit" %enddef | |
291 %define %$isextern "match$storage"="extern" %enddef | |
292 | |
293 %define %$ismember "match$ismember"="1" %enddef | |
294 %define %$isglobal %$not %$ismember %enddef | |
295 %define %$innamespace "match$parentNode$nodeType"="namespace" %enddef | |
296 | |
297 %define %$ispublic "match$access"="public" %enddef | |
298 %define %$isprotected "match$access"="protected" %enddef | |
299 %define %$isprivate "match$access"="private" %enddef | |
300 | |
301 %define %$ismemberget "match$memberget"="1" %enddef | |
302 %define %$ismemberset "match$memberset"="1" %enddef | |
303 | |
304 %define %$classname %$ismember,"match$parentNode$name" %enddef | |
305 | |
306 /* ----------------------------------------------------------------------------- | |
307 * Include all the warnings labels and macros | |
308 * ----------------------------------------------------------------------------- */ | |
309 | |
310 %include <swigwarnings.swg> | |
311 | |
312 /* ----------------------------------------------------------------------------- | |
313 * Default handling of certain overloaded operators | |
314 * ----------------------------------------------------------------------------- */ | |
315 | |
316 #ifdef __cplusplus | |
317 %ignoreoperator(NEW) operator new; | |
318 %ignoreoperator(DELETE) operator delete; | |
319 %ignoreoperator(NEWARR) operator new[]; | |
320 %ignoreoperator(DELARR) operator delete[]; | |
321 | |
322 /* add C++ operator aliases */ | |
323 %rename("operator &&") operator and; // `and' `&&' | |
324 %rename("operator ||") operator or; // `or' `||' | |
325 %rename("operator !") operator not; // `not' `!' | |
326 %rename("operator &=") operator and_eq; // `and_eq' `&=' | |
327 %rename("operator &") operator bitand; // `bitand' `&' | |
328 %rename("operator |") operator bitor; // `bitor' `|' | |
329 %rename("operator ~") operator compl; // `compl' `~' | |
330 %rename("operator !=") operator not_eq; // `not_eq' `!=' | |
331 %rename("operator |=") operator or_eq; // `or_eq' `|=' | |
332 %rename("operator ^") operator xor; // `xor' `^' | |
333 %rename("operator ^=") operator xor_eq; // `xor_eq' `^=' | |
334 | |
335 /* Smart pointer handling */ | |
336 | |
337 %rename(__deref__) *::operator->; | |
338 %rename(__ref__) *::operator*(); | |
339 %rename(__ref__) *::operator*() const; | |
340 | |
341 /* Define std namespace */ | |
342 namespace std { | |
343 } | |
344 #endif | |
345 | |
346 /* ----------------------------------------------------------------------------- | |
347 * Default char * and C array typemaps | |
348 * ----------------------------------------------------------------------------- */ | |
349 | |
350 /* Set up the typemap for handling new return strings */ | |
351 | |
352 #ifdef __cplusplus | |
353 %typemap(newfree) char * "delete [] $1;"; | |
354 #else | |
355 %typemap(newfree) char * "free($1);"; | |
356 #endif | |
357 | |
358 /* Default typemap for handling char * members */ | |
359 | |
360 #ifdef __cplusplus | |
361 %typemap(memberin) char * { | |
362 delete [] $1; | |
363 if ($input) { | |
364 $1 = ($1_type) (new char[strlen((const char *)$input)+1]); | |
365 strcpy((char *)$1, (const char *)$input); | |
366 } else { | |
367 $1 = 0; | |
368 } | |
369 } | |
370 %typemap(memberin,warning=SWIGWARN_TYPEMAP_CHARLEAK_MSG) const char * { | |
371 if ($input) { | |
372 $1 = ($1_type) (new char[strlen((const char *)$input)+1]); | |
373 strcpy((char *)$1, (const char *)$input); | |
374 } else { | |
375 $1 = 0; | |
376 } | |
377 } | |
378 %typemap(globalin) char * { | |
379 delete [] $1; | |
380 if ($input) { | |
381 $1 = ($1_type) (new char[strlen((const char *)$input)+1]); | |
382 strcpy((char *)$1, (const char *)$input); | |
383 } else { | |
384 $1 = 0; | |
385 } | |
386 } | |
387 %typemap(globalin,warning=SWIGWARN_TYPEMAP_CHARLEAK_MSG) const char * { | |
388 if ($input) { | |
389 $1 = ($1_type) (new char[strlen((const char *)$input)+1]); | |
390 strcpy((char *)$1, (const char *)$input); | |
391 } else { | |
392 $1 = 0; | |
393 } | |
394 } | |
395 #else | |
396 %typemap(memberin) char * { | |
397 free($1); | |
398 if ($input) { | |
399 $1 = ($1_type) malloc(strlen((const char *)$input)+1); | |
400 strcpy((char *)$1, (const char *)$input); | |
401 } else { | |
402 $1 = 0; | |
403 } | |
404 } | |
405 %typemap(memberin,warning=SWIGWARN_TYPEMAP_CHARLEAK_MSG) const char * { | |
406 if ($input) { | |
407 $1 = ($1_type) malloc(strlen((const char *)$input)+1); | |
408 strcpy((char *)$1, (const char *)$input); | |
409 } else { | |
410 $1 = 0; | |
411 } | |
412 } | |
413 %typemap(globalin) char * { | |
414 free($1); | |
415 if ($input) { | |
416 $1 = ($1_type) malloc(strlen((const char *)$input)+1); | |
417 strcpy((char *)$1, (const char *)$input); | |
418 } else { | |
419 $1 = 0; | |
420 } | |
421 } | |
422 %typemap(globalin,warning=SWIGWARN_TYPEMAP_CHARLEAK_MSG) const char * { | |
423 if ($input) { | |
424 $1 = ($1_type) malloc(strlen((const char *)$input)+1); | |
425 strcpy((char *)$1, (const char *)$input); | |
426 } else { | |
427 $1 = 0; | |
428 } | |
429 } | |
430 | |
431 #endif | |
432 | |
433 /* Character array handling */ | |
434 | |
435 %typemap(memberin) char [ANY] { | |
436 if($input) { | |
437 strncpy((char*)$1, (const char *)$input, $1_dim0-1); | |
438 $1[$1_dim0-1] = 0; | |
439 } else { | |
440 $1[0] = 0; | |
441 } | |
442 } | |
443 | |
444 %typemap(globalin) char [ANY] { | |
445 if($input) { | |
446 strncpy((char*)$1, (const char *)$input, $1_dim0-1); | |
447 $1[$1_dim0-1] = 0; | |
448 } else { | |
449 $1[0] = 0; | |
450 } | |
451 } | |
452 | |
453 %typemap(memberin) char [] { | |
454 if ($input) strcpy((char *)$1, (const char *)$input); | |
455 else $1[0] = 0; | |
456 } | |
457 | |
458 %typemap(globalin) char [] { | |
459 if ($input) strcpy((char *)$1, (const char *)$input); | |
460 else $1[0] = 0; | |
461 } | |
462 | |
463 /* memberin/globalin typemap for arrays. */ | |
464 | |
465 %typemap(memberin) SWIGTYPE [ANY] { | |
466 size_t ii; | |
467 $1_basetype *b = ($1_basetype *) $1; | |
468 for (ii = 0; ii < (size_t)$1_size; ii++) b[ii] = *(($1_basetype *) $input + ii); | |
469 } | |
470 | |
471 %typemap(globalin) SWIGTYPE [ANY] { | |
472 size_t ii; | |
473 $1_basetype *b = ($1_basetype *) $1; | |
474 for (ii = 0; ii < (size_t)$1_size; ii++) b[ii] = *(($1_basetype *) $input + ii); | |
475 } | |
476 | |
477 /* memberin/globalin typemap for double arrays. */ | |
478 | |
479 %typemap(memberin) SWIGTYPE [ANY][ANY] { | |
480 $basetype (*inp)[$1_dim1] = ($basetype (*)[$1_dim1])($input); | |
481 $basetype (*dest)[$1_dim1] = ($basetype (*)[$1_dim1])($1); | |
482 size_t ii = 0; | |
483 for (; ii < $1_dim0; ++ii) { | |
484 $basetype *ip = inp[ii]; | |
485 $basetype *dp = dest[ii]; | |
486 size_t jj = 0; | |
487 for (; jj < $1_dim1; ++jj) dp[jj] = ip[jj]; | |
488 } | |
489 } | |
490 | |
491 %typemap(globalin) SWIGTYPE [ANY][ANY] { | |
492 $basetype (*inp)[$1_dim1] = ($basetype (*)[$1_dim1])($input); | |
493 $basetype (*dest)[$1_dim1] = ($basetype (*)[$1_dim1])($1); | |
494 size_t ii = 0; | |
495 for (; ii < $1_dim0; ++ii) { | |
496 $basetype *ip = inp[ii]; | |
497 $basetype *dp = dest[ii]; | |
498 size_t jj = 0; | |
499 for (; jj < $1_dim1; ++jj) dp[jj] = ip[jj]; | |
500 } | |
501 } | |
502 | |
503 /* ----------------------------------------------------------------------------- | |
504 * Overloading support | |
505 * ----------------------------------------------------------------------------- */ | |
506 | |
507 /* | |
508 * Function/method overloading support. This is done through typemaps, | |
509 * but also involve a precedence level. | |
510 */ | |
511 | |
512 /* Macro for overload resolution */ | |
513 | |
514 %define %typecheck(_x...) %typemap(typecheck, precedence=_x) %enddef | |
515 | |
516 /* Macros for precedence levels */ | |
517 | |
518 %define SWIG_TYPECHECK_POINTER 0 %enddef | |
519 %define SWIG_TYPECHECK_ITERATOR 5 %enddef | |
520 %define SWIG_TYPECHECK_VOIDPTR 10 %enddef | |
521 %define SWIG_TYPECHECK_BOOL 15 %enddef | |
522 %define SWIG_TYPECHECK_UINT8 20 %enddef | |
523 %define SWIG_TYPECHECK_INT8 25 %enddef | |
524 %define SWIG_TYPECHECK_UINT16 30 %enddef | |
525 %define SWIG_TYPECHECK_INT16 35 %enddef | |
526 %define SWIG_TYPECHECK_UINT32 40 %enddef | |
527 %define SWIG_TYPECHECK_INT32 45 %enddef | |
528 %define SWIG_TYPECHECK_SIZE 47 %enddef | |
529 %define SWIG_TYPECHECK_PTRDIFF 48 %enddef | |
530 %define SWIG_TYPECHECK_UINT64 50 %enddef | |
531 %define SWIG_TYPECHECK_INT64 55 %enddef | |
532 %define SWIG_TYPECHECK_UINT128 60 %enddef | |
533 %define SWIG_TYPECHECK_INT128 65 %enddef | |
534 %define SWIG_TYPECHECK_INTEGER 70 %enddef | |
535 %define SWIG_TYPECHECK_FLOAT 80 %enddef | |
536 %define SWIG_TYPECHECK_DOUBLE 90 %enddef | |
537 %define SWIG_TYPECHECK_CPLXFLT 95 %enddef | |
538 %define SWIG_TYPECHECK_CPLXDBL 100 %enddef | |
539 %define SWIG_TYPECHECK_COMPLEX 105 %enddef | |
540 %define SWIG_TYPECHECK_UNICHAR 110 %enddef | |
541 %define SWIG_TYPECHECK_STDUNISTRING 115 %enddef | |
542 %define SWIG_TYPECHECK_UNISTRING 120 %enddef | |
543 %define SWIG_TYPECHECK_CHAR 130 %enddef | |
544 %define SWIG_TYPECHECK_STDSTRING 135 %enddef | |
545 %define SWIG_TYPECHECK_STRING 140 %enddef | |
546 %define SWIG_TYPECHECK_PAIR 150 %enddef | |
547 %define SWIG_TYPECHECK_VECTOR 160 %enddef | |
548 %define SWIG_TYPECHECK_DEQUE 170 %enddef | |
549 %define SWIG_TYPECHECK_LIST 180 %enddef | |
550 %define SWIG_TYPECHECK_SET 190 %enddef | |
551 %define SWIG_TYPECHECK_MULTISET 200 %enddef | |
552 %define SWIG_TYPECHECK_MAP 210 %enddef | |
553 %define SWIG_TYPECHECK_MULTIMAP 220 %enddef | |
554 %define SWIG_TYPECHECK_STACK 230 %enddef | |
555 %define SWIG_TYPECHECK_QUEUE 240 %enddef | |
556 | |
557 %define SWIG_TYPECHECK_BOOL_ARRAY 1015 %enddef | |
558 %define SWIG_TYPECHECK_INT8_ARRAY 1025 %enddef | |
559 %define SWIG_TYPECHECK_INT16_ARRAY 1035 %enddef | |
560 %define SWIG_TYPECHECK_INT32_ARRAY 1045 %enddef | |
561 %define SWIG_TYPECHECK_INT64_ARRAY 1055 %enddef | |
562 %define SWIG_TYPECHECK_INT128_ARRAY 1065 %enddef | |
563 %define SWIG_TYPECHECK_FLOAT_ARRAY 1080 %enddef | |
564 %define SWIG_TYPECHECK_DOUBLE_ARRAY 1090 %enddef | |
565 %define SWIG_TYPECHECK_CHAR_ARRAY 1130 %enddef | |
566 %define SWIG_TYPECHECK_STRING_ARRAY 1140 %enddef | |
567 %define SWIG_TYPECHECK_OBJECT_ARRAY 1150 %enddef | |
568 | |
569 %define SWIG_TYPECHECK_BOOL_PTR 2015 %enddef | |
570 %define SWIG_TYPECHECK_UINT8_PTR 2020 %enddef | |
571 %define SWIG_TYPECHECK_INT8_PTR 2025 %enddef | |
572 %define SWIG_TYPECHECK_UINT16_PTR 2030 %enddef | |
573 %define SWIG_TYPECHECK_INT16_PTR 2035 %enddef | |
574 %define SWIG_TYPECHECK_UINT32_PTR 2040 %enddef | |
575 %define SWIG_TYPECHECK_INT32_PTR 2045 %enddef | |
576 %define SWIG_TYPECHECK_UINT64_PTR 2050 %enddef | |
577 %define SWIG_TYPECHECK_INT64_PTR 2055 %enddef | |
578 %define SWIG_TYPECHECK_FLOAT_PTR 2080 %enddef | |
579 %define SWIG_TYPECHECK_DOUBLE_PTR 2090 %enddef | |
580 %define SWIG_TYPECHECK_CHAR_PTR 2130 %enddef | |
581 | |
582 | |
583 %define SWIG_TYPECHECK_SWIGOBJECT 5000 %enddef | |
584 | |
585 | |
586 /* ----------------------------------------------------------------------------- | |
587 * Runtime code | |
588 * ----------------------------------------------------------------------------- */ | |
589 | |
590 /* The SwigValueWrapper class */ | |
591 | |
592 /* | |
593 * This template wrapper is used to handle C++ objects that are passed or | |
594 * returned by value. This is necessary to handle objects that define | |
595 * no default-constructor (making it difficult for SWIG to properly declare | |
596 * local variables). | |
597 * | |
598 * The wrapper is used as follows. First consider a function like this: | |
599 * | |
600 * Vector cross_product(Vector a, Vector b) | |
601 * | |
602 * Now, if Vector is defined as a C++ class with no default constructor, | |
603 * code is generated as follows: | |
604 * | |
605 * Vector *wrap_cross_product(Vector *inarg1, Vector *inarg2) { | |
606 * SwigValueWrapper<Vector> arg1; | |
607 * SwigValueWrapper<Vector> arg2; | |
608 * SwigValueWrapper<Vector> result; | |
609 * | |
610 * arg1 = *inarg1; | |
611 * arg2 = *inarg2; | |
612 * ... | |
613 * result = cross_product(arg1,arg2); | |
614 * ... | |
615 * return new Vector(result); | |
616 * } | |
617 * | |
618 * In the wrappers, the template SwigValueWrapper simply provides a thin | |
619 * layer around a Vector *. However, it does this in a way that allows | |
620 * the object to be bound after the variable declaration (which is not possible | |
621 * with the bare object when it lacks a default constructor). | |
622 * | |
623 * An observant reader will notice that the code after the variable declarations | |
624 * is *identical* to the code used for classes that do define default constructors. | |
625 * Thus, this neat trick allows us to fix this special case without having to | |
626 * make massive changes to typemaps and other parts of the SWIG code generator. | |
627 * | |
628 * Note: this code is not included when SWIG runs in C-mode, when classes | |
629 * define default constructors, or when pointers and references are used. | |
630 * SWIG tries to avoid doing this except in very special circumstances. | |
631 * | |
632 * Note: This solution suffers from making a large number of copies | |
633 * of the underlying object. However, this is needed in the interest of | |
634 * safety and in order to cover all of the possible ways in which a value | |
635 * might be assigned. For example: | |
636 * | |
637 * arg1 = *inarg1; // Assignment from a pointer | |
638 * arg1 = Vector(1,2,3); // Assignment from a value | |
639 * | |
640 * The class offers a strong guarantee of exception safety. | |
641 * With regards to the implementation, the private SwigMovePointer nested class is | |
642 * a simple smart pointer with move semantics, much like std::auto_ptr. | |
643 * | |
644 * This wrapping technique was suggested by William Fulton and is henceforth | |
645 * known as the "Fulton Transform" :-). | |
646 */ | |
647 | |
648 #ifdef __cplusplus | |
649 %insert("runtime") %{ | |
650 #ifdef __cplusplus | |
651 /* SwigValueWrapper is described in swig.swg */ | |
652 template<typename T> class SwigValueWrapper { | |
653 struct SwigMovePointer { | |
654 T *ptr; | |
655 SwigMovePointer(T *p) : ptr(p) { } | |
656 ~SwigMovePointer() { delete ptr; } | |
657 SwigMovePointer& operator=(SwigMovePointer& rhs) { T* oldptr = ptr; ptr = 0; delete oldptr; ptr = rhs.ptr; rhs.ptr = 0; return *this; } | |
658 } pointer; | |
659 SwigValueWrapper& operator=(const SwigValueWrapper<T>& rhs); | |
660 SwigValueWrapper(const SwigValueWrapper<T>& rhs); | |
661 public: | |
662 SwigValueWrapper() : pointer(0) { } | |
663 SwigValueWrapper& operator=(const T& t) { SwigMovePointer tmp(new T(t)); pointer = tmp; return *this; } | |
664 operator T&() const { return *pointer.ptr; } | |
665 T *operator&() { return pointer.ptr; } | |
666 };%} | |
667 | |
668 /* | |
669 * SwigValueInit() is a generic initialisation solution as the following approach: | |
670 * | |
671 * T c_result = T(); | |
672 * | |
673 * doesn't compile for all types for example: | |
674 * | |
675 * unsigned int c_result = unsigned int(); | |
676 */ | |
677 %insert("runtime") %{ | |
678 template <typename T> T SwigValueInit() { | |
679 return T(); | |
680 } | |
681 #endif | |
682 %} | |
683 #endif | |
684 | |
685 /* The swiglabels */ | |
686 | |
687 %insert("runtime") "swiglabels.swg" | |
688 | |
689 |