Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(804)

Unified Diff: swig/Lib/typemaps/implicit.swg

Issue 553095: Checkin swig binaries for win, linux and Mac... (Closed) Base URL: svn://chrome-svn/chrome/trunk/deps/third_party/
Patch Set: '' Created 10 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « swig/Lib/typemaps/fragments.swg ('k') | swig/Lib/typemaps/inoutlist.swg » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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
« no previous file with comments | « swig/Lib/typemaps/fragments.swg ('k') | swig/Lib/typemaps/inoutlist.swg » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698