Index: swig/Lib/typemaps/implicit.swg |
=================================================================== |
--- swig/Lib/typemaps/implicit.swg (revision 0) |
+++ swig/Lib/typemaps/implicit.swg (revision 0) |
@@ -0,0 +1,208 @@ |
+/* |
+ The %implict macro allows a SwigType (Class) to be accepted |
+ as an input parameter and use its implicit constructors when needed. |
+ |
+ For example: |
+ |
+ |
+ %implicit(A, int, double, B); |
+ |
+ %inline |
+ { |
+ struct B { }; |
+ struct A |
+ { |
+ int ii; |
+ A(int i) { ii = 1; } |
+ A(double d) { ii = 2; } |
+ A(const B& b) { ii = 3; } |
+ }; |
+ |
+ int get(A a) { return a.ii; } |
+ } |
+ |
+ Here, you can call 'get' as |
+ |
+ get(1) ==> get(A(1)) |
+ get(2.0) ==> get(A(2.0)) |
+ get(B()) ==> get(A(B())) |
+ |
+ and swig will construct an 'A' temporal variable using the |
+ corresponding implicit constructor. |
+ |
+ |
+ The plain implicit macro takes care of simple type list. If it doesn't |
+ work because you are passing template types with commas, then use |
+ the %implicit_{1,2,3} versions and/or the %arg macro. |
+ |
+*/ |
+ |
+%define %implicit_type(Type...) |
+%traits_swigtype(Type); |
+%enddef |
+ |
+%define %implicit_frag(Type...) ,fragment=SWIG_Traits_frag(Type) %enddef |
+ |
+%define %implicit_code(Type...) |
+{ |
+ Type _v; |
+ int res = swig::asval<Type >(obj, &_v); |
+ if (SWIG_IsOK(res)) { |
+ if (val) *val = new value_type(static_cast<const Type& >(_v)); |
+ return SWIG_AddNewMask(res); |
+ } |
+} |
+%enddef |
+ |
+/* implicit */ |
+ |
+%define %implicit(Type, ...) |
+ |
+%formacro_1(%implicit_type,__VA_ARGS__); |
+ |
+%fragment(SWIG_Traits_frag(Type),"header", |
+ fragment="StdTraits" |
+ %formacro_1(%implicit_frag,__VA_ARGS__)) %{ |
+namespace swig { |
+ template <> struct traits<Type > { |
+ typedef pointer_category category; |
+ static const char* type_name() { return "Type"; } |
+ }; |
+ |
+ template <> struct traits_asptr< Type > { |
+ typedef Type value_type; |
+ static int asptr(SWIG_Object obj, value_type **val) { |
+ Type *vptr; |
+ static swig_type_info* desc = SWIG_TypeQuery("Type *"); |
+ int res = SWIG_ConvertPtr(obj, (void **)&vptr, desc, 0); |
+ if (SWIG_IsOK(res)) { |
+ if (val) *val = vptr; |
+ return res; |
+ } else { |
+ %formacro_1(%implicit_code,__VA_ARGS__) |
+ } |
+ return SWIG_TypeError; |
+ } |
+ }; |
+} |
+%} |
+ |
+%typemap_traits_ptr(%checkcode(POINTER),Type); |
+%enddef |
+ |
+/* implicit_1 */ |
+ |
+ |
+%define %implicit_1(Type, Imp1) |
+%traits_swigtype(Imp1); |
+ |
+%fragment(SWIG_Traits_frag(Type),"header", |
+ fragment="StdTraits", |
+ fragment=SWIG_Traits_frag(Imp1)) %{ |
+namespace swig { |
+ template <> struct traits< Type > { |
+ typedef pointer_category category; |
+ static const char* type_name() { return "Type"; } |
+ }; |
+ |
+ template <> struct traits_asptr< Type > { |
+ typedef Type value_type; |
+ static int asptr(SWIG_Object obj, value_type **val) { |
+ Type *vptr; |
+ static swig_type_info* desc = SWIG_TypeQuery("Type *"); |
+ int res = SWIG_ConvertPtr(obj, (void **)&vptr, desc, 0); |
+ if (SWIG_IsOK(res)) { |
+ if (val) *val = vptr; |
+ return res; |
+ } else { |
+ %implicit_code(Imp1); |
+ } |
+ return SWIG_TypeError; |
+ } |
+ }; |
+} |
+%} |
+ |
+%typemap_traits_ptr(%checkcode(POINTER),Type); |
+ |
+%enddef |
+ |
+/* implicit_2 */ |
+ |
+%define %implicit_2(Type, Imp1, Imp2) |
+%traits_swigtype(Imp1); |
+%traits_swigtype(Imp2); |
+ |
+%fragment(SWIG_Traits_frag(Type),"header", |
+ fragment="StdTraits", |
+ fragment=SWIG_Traits_frag(Imp1), |
+ fragment=SWIG_Traits_frag(Imp2)) %{ |
+namespace swig { |
+ template <> struct traits< Type > { |
+ typedef pointer_category category; |
+ static const char* type_name() { return "Type"; } |
+ }; |
+ |
+ template <> struct traits_asptr< Type > { |
+ typedef Type value_type; |
+ static int asptr(SWIG_Object obj, value_type **val) { |
+ Type *vptr; |
+ static swig_type_info* desc = SWIG_TypeQuery("Type *"); |
+ int res = SWIG_ConvertPtr(obj, (void **)&vptr, desc, 0); |
+ if (SWIG_IsOK(res)) { |
+ if (val) *val = vptr; |
+ return SWIG_OLDOBJ; |
+ } else { |
+ %implicit_code(Imp1); |
+ %implicit_code(Imp2); |
+ } |
+ return SWIG_TypeError; |
+ } |
+ }; |
+} |
+%} |
+ |
+%typemap_traits_ptr(%checkcode(POINTER),Type); |
+%enddef |
+ |
+ |
+/* implicit_3 */ |
+ |
+%define %implicit_3(Type, Imp1, Imp2, Imp3) |
+%traits_swigtype(Imp1); |
+%traits_swigtype(Imp2); |
+%traits_swigtype(Imp3); |
+ |
+%fragment(SWIG_Traits_frag(Type),"header", |
+ fragment="StdTraits", |
+ fragment=SWIG_Traits_frag(Imp1), |
+ fragment=SWIG_Traits_frag(Imp2), |
+ fragment=SWIG_Traits_frag(Imp3)) %{ |
+namespace swig { |
+ template <> struct traits< Type > { |
+ typedef pointer_category category; |
+ static const char* type_name() { return "Type"; } |
+ }; |
+ |
+ template <> struct traits_asptr< Type > { |
+ typedef Type value_type; |
+ static int asptr(SWIG_Object obj, value_type **val) { |
+ Type *vptr; |
+ static swig_type_info* desc = SWIG_TypeQuery("Type *"); |
+ int res = SWIG_ConvertPtr(obj, (void **)&vptr, desc, 0); |
+ if (SWIG_IsOK(res)) { |
+ if (val) *val = vptr; |
+ return res; |
+ } else { |
+ %implicit_code(Imp1); |
+ %implicit_code(Imp2); |
+ %implicit_code(Imp3); |
+ } |
+ return SWIG_TypeError; |
+ } |
+ }; |
+} |
+%} |
+ |
+%typemap_traits_ptr(%checkcode(POINTER),Type); |
+%enddef |