diff --git a/Lib/python/std_common.i b/Lib/python/std_common.i index 184887cbb..d38f09615 100644 --- a/Lib/python/std_common.i +++ b/Lib/python/std_common.i @@ -14,10 +14,10 @@ //#define SWIG_STD_DEFAULT_INSTANTIATION // -// Use the following macro to enable the generation of the comparison +// Use the following macro to disable the generation of the comparison // methods, ie, ==, !=, <=, >=, <,>, whenever is needed. // -#define SWIG_STD_EXTEND_COMPARISON +//#define SWIG_STD_NOEXTEND_COMPARISON // @@ -112,14 +112,21 @@ namespace swigpy { /* Traits that provides the from method */ - template struct traits_from { - typedef Type value_type; - static PyObject *from(value_type *val, int owner = 0) { - return SWIG_NewPointerObj(val, type_info(), owner); + template struct traits_from_ptr { + static PyObject *from(Type *val, int owner = 0) { + return SWIG_NewPointerObj(val, type_info(), owner); } + }; - static PyObject *from(const value_type& val) { - return traits_from::from(new value_type(val), 1); + template struct traits_from { + static PyObject *from(const Type& val) { + return traits_from_ptr::from(new Type(val), 1); + } + }; + + template struct traits_from { + static PyObject *from(Type* val) { + return traits_from_ptr::from(val, 0); } }; @@ -129,8 +136,8 @@ namespace swigpy { } template - inline PyObject *from(Type* val, int owner = 0) { - return traits_from::from(val, owner); + inline PyObject *from_ptr(Type* val, int owner) { + return traits_from_ptr::from(val, owner); } /* @@ -138,11 +145,10 @@ namespace swigpy { */ template struct traits_asptr { - typedef Type value_type; - static int asptr(PyObject *obj, value_type **val) { - value_type *p; - int res = (SWIG_ConvertPtr(obj, (void**)&p, - type_info(), 0) != -1) ? 1 : 0; + static int asptr(PyObject *obj, Type **val) { + Type *p; + int res = (SWIG_ConvertPtr(obj, (void**)&p, type_info(), 0) != -1) + ? SWIG_OLDOBJ : 0; if (res) { if (val) *val = p; } else { @@ -174,25 +180,45 @@ namespace swigpy { template struct traits_asval { - typedef Type value_type; - static bool asval(PyObject *obj, value_type *val) { + static bool asval(PyObject *obj, Type *val) { if (val) { - value_type *p = 0; + Type *p = 0; int res = asptr(obj, &p); if (res && p) { typedef typename noconst_traits::noconst_type noconst_type; - *((noconst_type*)(val)) = *p; + *(const_cast(val)) = *p; if (res == SWIG_NEWOBJ) delete p; return true; } else { return false; } } else { - return asptr(obj, (value_type **)(0)); + return asptr(obj, (Type **)(0)); } } }; + + template struct traits_asval + { + static bool asval(PyObject *obj, Type **val) { + if (val) { + Type *p = 0; + int res = asptr(obj, &p); + if (res) { + typedef typename noconst_traits::noconst_type noconst_type; + *(const_cast(val)) = p; + return true; + } else { + return false; + } + } else { + return asptr(obj, (Type **)(0)); + } + } + }; + + template inline bool asval(PyObject *obj, Type *val) { return traits_asval::asval(obj, val); @@ -206,9 +232,8 @@ namespace swigpy { template struct traits_as { - typedef Type value_type; - static value_type as(PyObject *obj, bool throw_error) { - value_type v; + static Type as(PyObject *obj, bool throw_error) { + Type v; if (!obj || !asval(obj, &v)) { std::string msg = "a value of type '"; msg += swigpy::type_name(); @@ -225,13 +250,12 @@ namespace swigpy { template struct traits_as { - typedef Type value_type; - static value_type as(PyObject *obj, bool throw_error) { - value_type *v = 0; + static Type as(PyObject *obj, bool throw_error) { + Type *v = 0; int res = (obj ? asptr(obj, &v) : 0) && v; if (res) { if (res == SWIG_NEWOBJ) { - value_type r(*v); + Type r(*v); delete v; return r; } else { @@ -239,7 +263,7 @@ namespace swigpy { } } else { // Uninitialized return value, no Type() constructor required. - static value_type *v_def = (Type*) malloc(sizeof(Type)); + static Type *v_def = (Type*) malloc(sizeof(Type)); std::string msg = "a value of type '"; msg += swigpy::type_name(); msg += "' is expected"; @@ -265,18 +289,16 @@ namespace swigpy { template struct traits_check { - typedef Type value_type; static bool check(PyObject *obj) { - return obj && asval(obj, (value_type *)(0)); + return obj && asval(obj, (Type *)(0)); } }; template struct traits_check { - typedef Type value_type; static bool check(PyObject *obj) { - return obj && asptr(obj, (value_type **)(0)); + return obj && asptr(obj, (Type **)(0)); } }; @@ -322,6 +344,7 @@ namespace swigpy { } %enddef + /* Generate the traits for a 'primitive' type, such as 'double', for which the SWIG_AsVal and SWIG_From methods are already defined. @@ -436,7 +459,7 @@ namespace swigpy { %std_order_methods(__VA_ARGS__ ) %enddef -#ifdef SWIG_STD_EXTEND_COMPARISON +#if !defined(SWIG_STD_NOEXTEND_COMPARISON) %define %std_extcomp(Class,T) %evalif(SWIG_EqualType(T), %std_equal_methods(std::Class)) %evalif(SWIG_OrderType(T), %std_order_methods(std::Class)) diff --git a/Lib/python/std_deque.i b/Lib/python/std_deque.i index 93d935ccd..f744f5b16 100644 --- a/Lib/python/std_deque.i +++ b/Lib/python/std_deque.i @@ -138,6 +138,6 @@ namespace std { %std_definst(deque, __VA_ARGS__); %enddef -#if defined(SWIG_STD_EXTEND_COMPARISON) || defined(SWIG_STD_DEFAULT_INSTANTIATION) +#if !defined(SWIG_STD_NOEXTEND_COMPARISON) || defined(SWIG_STD_DEFAULT_INSTANTIATION) %apply_cpptypes(%std_deque_ptypen); #endif diff --git a/Lib/python/std_list.i b/Lib/python/std_list.i index 844728b94..200744ef7 100644 --- a/Lib/python/std_list.i +++ b/Lib/python/std_list.i @@ -160,6 +160,6 @@ namespace std { SWIG_arg(%std_extequal_list(__VA_ARGS__))); %enddef -#if defined(SWIG_STD_EXTEND_COMPARISON) || defined(SWIG_STD_DEFAULT_INSTANTIATION) +#if !defined(SWIG_STD_NOEXTEND_COMPARISON) || defined(SWIG_STD_DEFAULT_INSTANTIATION) %apply_cpptypes(%std_list_ptypen); #endif diff --git a/Lib/python/std_map.i b/Lib/python/std_map.i index 1d8387449..63811bf32 100644 --- a/Lib/python/std_map.i +++ b/Lib/python/std_map.i @@ -180,6 +180,6 @@ namespace std { %std_definst_2(map, __VA_ARGS__); %enddef -#if defined(SWIG_STD_EXTEND_COMPARISON) || defined(SWIG_STD_DEFAULT_INSTANTIATION) +#if !defined(SWIG_STD_NOEXTEND_COMPARISON) || defined(SWIG_STD_DEFAULT_INSTANTIATION) %apply_cpptypes_2(%std_map_ptypen); #endif diff --git a/Lib/python/std_multimap.i b/Lib/python/std_multimap.i index 226cbd63c..674ed1a83 100644 --- a/Lib/python/std_multimap.i +++ b/Lib/python/std_multimap.i @@ -140,6 +140,6 @@ namespace std { %std_definst_2(multimap, __VA_ARGS__); %enddef -#if defined(SWIG_STD_EXTEND_COMPARISON) || defined(SWIG_STD_DEFAULT_INSTANTIATION) +#if !defined(SWIG_STD_NOEXTEND_COMPARISON) || defined(SWIG_STD_DEFAULT_INSTANTIATION) %apply_cpptypes_2(%std_multimap_ptypen); #endif diff --git a/Lib/python/std_multiset.i b/Lib/python/std_multiset.i index 790e05c69..eea2615b4 100644 --- a/Lib/python/std_multiset.i +++ b/Lib/python/std_multiset.i @@ -108,6 +108,6 @@ namespace std { %std_definst(multiset, __VA_ARGS__); %enddef -#if defined(SWIG_STD_EXTEND_COMPARISON) || defined(SWIG_STD_DEFAULT_INSTANTIATION) +#if !defined(SWIG_STD_NOEXTEND_COMPARISON) || defined(SWIG_STD_DEFAULT_INSTANTIATION) %apply_cpptypes(%std_multiset_ptypen); #endif diff --git a/Lib/python/std_pair.i b/Lib/python/std_pair.i index bc2b14183..8638716cf 100644 --- a/Lib/python/std_pair.i +++ b/Lib/python/std_pair.i @@ -119,9 +119,11 @@ namespace std { typedef U* second_type; %traits_swigtype(T); + %traits_swigtype(U); %fragment(SWIG_Traits_frag(std::pair), "header", fragment=SWIG_Traits_frag(T), + fragment=SWIG_Traits_frag(U), fragment="StdPairTraits") { namespace swigpy { template <> struct traits > { @@ -149,16 +151,18 @@ namespace std { typedef T* fisrt_type; typedef U second_type; + %traits_swigtype(T); %traits_swigtype(U); %fragment(SWIG_Traits_frag(std::pair), "header", + fragment=SWIG_Traits_frag(T), fragment=SWIG_Traits_frag(U), fragment="StdPairTraits") { namespace swigpy { template <> struct traits > { typedef pointer_category category; static const char* type_name() { - return "std::pair<" #T *"," #U " >"; + return "std::pair<" #T " *," #U " >"; } }; } @@ -179,14 +183,19 @@ namespace std { template struct pair { typedef T* fisrt_type; typedef U* second_type; + + %traits_swigtype(T); + %traits_swigtype(U); %fragment(SWIG_Traits_frag(std::pair), "header", + fragment=SWIG_Traits_frag(T), + fragment=SWIG_Traits_frag(U), fragment="StdPairTraits") { namespace swigpy { template <> struct traits > { typedef pointer_category category; static const char* type_name() { - return "std::pair<" #T *"," #U " * >"; + return "std::pair<" #T " *," #U " * >"; } }; } @@ -211,6 +220,6 @@ namespace std { %std_definst_2(pair, __VA_ARGS__); %enddef -#if defined(SWIG_STD_EXTEND_COMPARISON) || defined(SWIG_STD_DEFAULT_INSTANTIATION) +#if !defined(SWIG_STD_NOEXTEND_COMPARISON) || defined(SWIG_STD_DEFAULT_INSTANTIATION) %apply_cpptypes_2(%std_pair_ptypen); #endif diff --git a/Lib/python/std_set.i b/Lib/python/std_set.i index b88fe79d6..6f9cbf9d6 100644 --- a/Lib/python/std_set.i +++ b/Lib/python/std_set.i @@ -131,6 +131,6 @@ namespace std { %std_definst(set, __VA_ARGS__); %enddef -#if defined(SWIG_STD_EXTEND_COMPARISON) || defined(SWIG_STD_DEFAULT_INSTANTIATION) +#if !defined(SWIG_STD_NOEXTEND_COMPARISON) || defined(SWIG_STD_DEFAULT_INSTANTIATION) %apply_cpptypes(%std_set_ptypen); #endif diff --git a/Lib/python/std_vector.i b/Lib/python/std_vector.i index b0adb6a2a..0015fbab1 100644 --- a/Lib/python/std_vector.i +++ b/Lib/python/std_vector.i @@ -155,6 +155,6 @@ namespace std { %std_definst(vector, __VA_ARGS__); %enddef -#if defined(SWIG_STD_EXTEND_COMPARISON) || defined(SWIG_STD_DEFAULT_INSTANTIATION) +#if !defined(SWIG_STD_NOEXTEND_COMPARISON) || defined(SWIG_STD_DEFAULT_INSTANTIATION) %apply_cpptypes(%std_vector_ptypen); #endif