Index: swig/Lib/typemaps/inoutlist.swg |
=================================================================== |
--- swig/Lib/typemaps/inoutlist.swg (revision 0) |
+++ swig/Lib/typemaps/inoutlist.swg (revision 0) |
@@ -0,0 +1,296 @@ |
+/* ------------------------------------------------------------ |
+ * |
+ * Define the IN/OUTPUT typemaps assuming the output parameters are |
+ * returned in a list, i.e., they are not directly modified. |
+ * |
+ * The user should provide the %append_output(result, obj) method, |
+ * via a macro, which append a particular object to the result. |
+ * |
+ * |
+ * In Tcl, for example, the file is used as: |
+ * |
+ * #define %append_output(obj) Tcl_ListObjAppendElement(interp,Tcl_GetObjResult(interp),obj); |
+ * %include <typemaps/inoutlist.swg> |
+ * |
+ * while in Python it is used as: |
+ * |
+ * #define %append_output(obj) $result = SWIG_Python_AppendResult($result, obj) |
+ * %include <typemaps/inoutlist.swg> |
+ * |
+ * where the method SWIG_Python_AppendResult is defined inside the |
+ * %append_output fragment. |
+ * |
+ * If you forget to define %append_output, this file will generate |
+ * an error. |
+ * |
+ * ------------------------------------------------------------ */ |
+ |
+ |
+// |
+// Uncomment the following definition if you don't want the in/out |
+// typemaps by default, ie, you prefer to use typemaps.i. |
+// |
+//#define SWIG_INOUT_NODEF |
+ |
+// |
+// Use the following definition to enable the INPUT parameters to |
+// accept both 'by value' and 'pointer' objects. |
+// |
+#define SWIG_INPUT_ACCEPT_PTRS |
+ |
+// ------------------------------------------------------------------------ |
+// Pointer handling |
+// |
+// These mappings provide support for input/output arguments and common |
+// uses for C/C++ pointers. |
+// ------------------------------------------------------------------------ |
+ |
+// INPUT typemaps. |
+// These remap a C pointer to be an "INPUT" value which is passed by value |
+// instead of reference. |
+ |
+/* |
+The following methods can be applied to turn a pointer into a simple |
+"input" value. That is, instead of passing a pointer to an object, |
+you would use a real value instead. |
+ |
+To use these, suppose you had a C function like this : |
+ |
+ double fadd(double *a, double *b) { |
+ return *a+*b; |
+ } |
+ |
+You could wrap it with SWIG as follows : |
+ |
+ double fadd(double *INPUT, double *INPUT); |
+ |
+or you can use the %apply directive : |
+ |
+ %apply double *INPUT { double *a, double *b }; |
+ double fadd(double *a, double *b); |
+ |
+*/ |
+#if defined(SWIG_INPUT_ACCEPT_PTRS) |
+#define %check_input_ptr(input,arg,desc,disown) (SWIG_IsOK((res = SWIG_ConvertPtr(input,%as_voidptrptr(arg),desc,disown)))) |
+#else |
+#define %check_input_ptr(input,arg,desc,disown) (SWIG_IsOK((res = SWIG_ERROR))) |
+#endif |
+ |
+%define %_value_input_typemap(code, asval_meth, asval_frag, Type) |
+ %typemap(in,noblock=1,fragment=asval_frag) Type *INPUT ($*ltype temp, int res = 0) { |
+ if (!%check_input_ptr($input,&$1,$descriptor,$disown)) { |
+ Type val; |
+ int ecode = asval_meth($input, &val); |
+ if (!SWIG_IsOK(ecode)) { |
+ %argument_fail(ecode, "$*ltype",$symname, $argnum); |
+ } |
+ temp = %static_cast(val, $*ltype); |
+ $1 = &temp; |
+ res = SWIG_AddTmpMask(ecode); |
+ } |
+ } |
+ %typemap(in,noblock=1,fragment=asval_frag) Type &INPUT($*ltype temp, int res = 0) { |
+ if (!%check_input_ptr($input,&$1,$descriptor,$disown)) { |
+ Type val; |
+ int ecode = asval_meth($input, &val); |
+ if (!SWIG_IsOK(ecode)) { |
+ %argument_fail(ecode, "$*ltype",$symname, $argnum); |
+ } |
+ temp = %static_cast(val, $*ltype); |
+ $1 = &temp; |
+ res = SWIG_AddTmpMask(ecode); |
+ } |
+ } |
+ %typemap(freearg,noblock=1,match="in") Type *INPUT, Type &INPUT { |
+ if (SWIG_IsNewObj(res$argnum)) %delete($1); |
+ } |
+ %typemap(typecheck,noblock=1,precedence=code,fragment=asval_frag) Type *INPUT, Type &INPUT { |
+ void *ptr = 0; |
+ int res = asval_meth($input, 0); |
+ $1 = SWIG_CheckState(res); |
+ if (!$1) { |
+ $1 = %check_input_ptr($input,&ptr,$1_descriptor,0); |
+ } |
+ } |
+%enddef |
+ |
+%define %_ptr_input_typemap(code,asptr_meth,asptr_frag,Type) |
+ %typemap(in,noblock=1,fragment=asptr_frag) Type *INPUT(int res = 0) { |
+ res = asptr_meth($input, &$1); |
+ if (!SWIG_IsOK(res)) { |
+ %argument_fail(res,"$type",$symname, $argnum); |
+ } |
+ res = SWIG_AddTmpMask(res); |
+ } |
+ %typemap(in,noblock=1,fragment=asptr_frag) Type &INPUT(int res = 0) { |
+ res = asptr_meth($input, &$1); |
+ if (!SWIG_IsOK(res)) { |
+ %argument_fail(res,"$type",$symname, $argnum); |
+ } |
+ if (!$1) { |
+ %argument_nullref("$type",$symname, $argnum); |
+ } |
+ res = SWIG_AddTmpMask(res); |
+ } |
+ %typemap(freearg,noblock=1,match="in") Type *INPUT, Type &INPUT { |
+ if (SWIG_IsNewObj(res$argnum)) %delete($1); |
+ } |
+ %typemap(typecheck,noblock=1,precedence=code,fragment=asptr_frag) Type *INPUT, Type &INPUT { |
+ int res = asptr_meth($input, (Type**)0); |
+ $1 = SWIG_CheckState(res); |
+ } |
+%enddef |
+ |
+// OUTPUT typemaps. These typemaps are used for parameters that |
+// are output only. The output value is appended to the result as |
+// a list element. |
+ |
+/* |
+The following methods can be applied to turn a pointer into an "output" |
+value. When calling a function, no input value would be given for |
+a parameter, but an output value would be returned. In the case of |
+multiple output values, they are returned in the form of a list. |
+ |
+ |
+For example, suppose you were trying to wrap the modf() function in the |
+C math library which splits x into integral and fractional parts (and |
+returns the integer part in one of its parameters): |
+ |
+ double modf(double x, double *ip); |
+ |
+You could wrap it with SWIG as follows : |
+ |
+ double modf(double x, double *OUTPUT); |
+ |
+or you can use the %apply directive : |
+ |
+ %apply double *OUTPUT { double *ip }; |
+ double modf(double x, double *ip); |
+ |
+The output of the function would be a list containing both output |
+values. |
+ |
+*/ |
+ |
+%define %_value_output_typemap(from_meth, from_frag, Type) |
+ %typemap(in,numinputs=0,noblock=1) |
+ Type *OUTPUT ($*1_ltype temp, int res = SWIG_TMPOBJ), |
+ Type &OUTPUT ($*1_ltype temp, int res = SWIG_TMPOBJ) { |
+ $1 = &temp; |
+ } |
+ %typemap(argout,noblock=1,fragment=from_frag) Type *OUTPUT, Type &OUTPUT { |
+ if (SWIG_IsTmpObj(res$argnum)) { |
+ %append_output(from_meth((*$1))); |
+ } else { |
+ int new_flags = SWIG_IsNewObj(res$argnum) ? (SWIG_POINTER_OWN | %newpointer_flags) : %newpointer_flags; |
+ %append_output(SWIG_NewPointerObj((void*)($1), $1_descriptor, new_flags)); |
+ } |
+ } |
+%enddef |
+ |
+ |
+// INOUT |
+// Mappings for an argument that is both an input and output |
+// parameter |
+ |
+/* |
+The following methods can be applied to make a function parameter both |
+an input and output value. This combines the behavior of both the |
+"INPUT" and "OUTPUT" methods described earlier. Output values are |
+returned in the form of a list. |
+ |
+For example, suppose you were trying to wrap the following function : |
+ |
+ void neg(double *x) { |
+ *x = -(*x); |
+ } |
+ |
+You could wrap it with SWIG as follows : |
+ |
+ void neg(double *INOUT); |
+ |
+or you can use the %apply directive : |
+ |
+ %apply double *INOUT { double *x }; |
+ void neg(double *x); |
+ |
+Unlike C, this mapping does not directly modify the input value. |
+Rather, the modified input value shows up as the return value of the |
+function. Thus, to apply this function to a variable you might do |
+this : |
+ |
+ x = neg(x) |
+ |
+Note : previous versions of SWIG used the symbol 'BOTH' to mark |
+input/output arguments. This is still supported, but will be slowly |
+phased out in future releases. |
+ |
+*/ |
+ |
+%define %_value_inout_typemap(Type) |
+ %typemap(in) Type *INOUT = Type *INPUT; |
+ %typemap(in) Type &INOUT = Type &INPUT; |
+ %typemap(typecheck) Type *INOUT = Type *INPUT; |
+ %typemap(typecheck) Type &INOUT = Type &INPUT; |
+ %typemap(argout) Type *INOUT = Type *OUTPUT; |
+ %typemap(argout) Type &INOUT = Type &OUTPUT; |
+%enddef |
+ |
+ |
+%define %_ptr_inout_typemap(Type) |
+ %_value_inout_typemap(%arg(Type)) |
+ %typemap(typecheck) Type *INOUT = Type *INPUT; |
+ %typemap(typecheck) Type &INOUT = Type &INPUT; |
+ %typemap(freearg) Type *INOUT = Type *INPUT; |
+ %typemap(freearg) Type &INOUT = Type &INPUT; |
+%enddef |
+ |
+#ifndef SWIG_INOUT_NODEF |
+ |
+%define %value_input_typemap(code,asval_meth, asval_frag, Type...) |
+ %_value_input_typemap(%arg(code),%arg(asval_meth),%arg(asval_frag),%arg(Type)) |
+%enddef |
+ |
+%define %ptr_input_typemap(code,asval_meth,asval_frag,Type...) |
+ %_ptr_input_typemap(%arg(code),%arg(asval_meth),%arg(asval_frag),%arg(Type)) |
+%enddef |
+ |
+%define %value_output_typemap(from_meth,from_frag,Type...) |
+ %_value_output_typemap(%arg(from_meth),%arg(from_frag),%arg(Type)) |
+%enddef |
+ |
+#define %value_inout_typemap(Type...) %_value_inout_typemap(%arg(Type)) |
+#define %ptr_inout_typemap(Type...) %_ptr_inout_typemap(%arg(Type)) |
+ |
+#else /* You need to include typemaps.i */ |
+ |
+ |
+#define %value_output_typemap(Type...) |
+#define %value_input_typemap(Type...) |
+#define %value_inout_typemap(Type...) |
+#define %ptr_input_typemap(Type...) |
+#define %ptr_inout_typemap(Type...) |
+ |
+#endif /* SWIG_INOUT_DEFAULT */ |
+ |
+/*---------------------------------------------------------------------- |
+ Front ends. |
+ |
+ use the following macros to define your own IN/OUTPUT/INOUT typemaps |
+ |
+ ------------------------------------------------------------------------*/ |
+%define %typemaps_inout(Code, AsValMeth, FromMeth, AsValFrag, FromFrag, Type...) |
+ %_value_input_typemap(%arg(Code), %arg(AsValMeth), |
+ %arg(AsValFrag), %arg(Type)); |
+ %_value_output_typemap(%arg(FromMeth), %arg(FromFrag), %arg(Type)); |
+ %_value_inout_typemap(%arg(Type)); |
+%enddef |
+ |
+%define %typemaps_inoutn(Code,Type...) |
+ %typemaps_inout(%arg(Code), |
+ %arg(SWIG_AsVal(Type)), |
+ %arg(SWIG_From(Type)), |
+ %arg(SWIG_AsVal_frag(Type)), |
+ %arg(SWIG_From_frag(Type)), |
+ %arg(Type)); |
+%enddef |