diff options
author | Hugo Parente Lima <hugo.lima@openbossa.org> | 2010-06-07 18:48:49 -0300 |
---|---|---|
committer | Hugo Parente Lima <hugo.lima@openbossa.org> | 2010-06-09 14:16:16 -0300 |
commit | 4e58a45ea523118bef5e746edb7383c799d65a27 (patch) | |
tree | 87cc87a2b1d1b9831ac5fbcc79cad06e264d449b /libshiboken | |
parent | b5e3a03a2f5907fb1cf6673dd0c2c29930f5eb64 (diff) |
Added Converter<T>::checkType.
This method is needed because you can not call Converter<T>::isConvertible inside
a Converter<Y>::isConvertible implementation, otherwise it'll create a 2-step
implicit conversion.
Diffstat (limited to 'libshiboken')
-rw-r--r-- | libshiboken/conversions.h | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/libshiboken/conversions.h b/libshiboken/conversions.h index 91243a07c..0d9c38608 100644 --- a/libshiboken/conversions.h +++ b/libshiboken/conversions.h @@ -131,6 +131,11 @@ template <typename T> struct Converter {}; template <typename T> struct Converter<T*> { + static inline bool checkType(PyObject* pyObj) + { + return Converter<T>::checkType(pyObj); + } + static inline bool isConvertible(PyObject* pyObj) { return pyObj == Py_None || PyObject_TypeCheck(pyObj, SbkType<T>()); @@ -166,6 +171,7 @@ template <typename T> struct Converter<const T*> : Converter<T*> {}; template <typename T> struct Converter<T&> { + static inline bool checkType(PyObject* pyObj) { return Converter<T>::checkType(pyObj); } static inline bool isConvertible(PyObject* pyObj) { return Converter<T>::isConvertible(pyObj); } static inline PyObject* toPython(const T& cppobj) { return Converter<T*>::toPython(&cppobj); } static inline T& toCpp(PyObject* pyobj) { return *Converter<T*>::toCpp(pyobj); } @@ -177,6 +183,7 @@ template <typename T> struct Converter<const T&> : Converter<T&> {}; template<> struct Converter<void*> { + static inline bool checkType(PyObject* pyObj) { return false; } static inline bool isConvertible(PyObject* pyobj) { return true; } static PyObject* toPython(void* cppobj) { @@ -205,6 +212,8 @@ template <> struct Converter<const void*> : Converter<void*> {}; template <typename T> struct ValueTypeConverter { + static inline bool checkType(PyObject* pyObj) { return PyObject_TypeCheck(pyObj, SbkType<T>()); } + // The basic version of this method also tries to use the extended 'isConvertible' method. static inline bool isConvertible(PyObject* pyobj) { @@ -248,6 +257,7 @@ struct ValueTypeConverter template <typename T> struct ObjectTypeConverter { + static inline bool checkType(PyObject* pyObj) { return PyObject_TypeCheck(pyObj, SbkType<T>()); } /// Py_None objects are the only objects convertible to an object type (in the form of a NULL pointer). static inline bool isConvertible(PyObject* pyObj) { return pyObj == Py_None || PyObject_TypeCheck(pyObj, SbkType<T>()); } /// Convenience overload that calls "toPython(const T*)" method. @@ -279,6 +289,7 @@ struct ObjectTypeConverter template <typename T> struct ObjectTypeReferenceConverter : ObjectTypeConverter<T> { + static inline bool checkType(PyObject* pyObj) { return PyObject_TypeCheck(pyObj, SbkType<T>()); } static inline bool isConvertible(PyObject* pyObj) { return PyObject_TypeCheck(pyObj, SbkType<T>()); } static inline PyObject* toPython(const T& cppobj) { return Converter<T*>::toPython(&cppobj); } static inline T& toCpp(PyObject* pyobj) @@ -301,6 +312,7 @@ template <> struct Converter<const PyObject*> : Converter<PyObject*> {}; template <> struct Converter<bool> { + static inline bool checkType(PyObject* pyobj) { return PyBool_Check(pyobj); } static inline bool isConvertible(PyObject* pyobj) { return PyInt_Check(pyobj); } static inline PyObject* toPython(void* cppobj) { return toPython(*reinterpret_cast<bool*>(cppobj)); } static inline PyObject* toPython(bool cppobj) { return PyBool_FromLong(cppobj); } @@ -361,6 +373,7 @@ struct OverFlowChecker<float, true> template <typename PyIntEquiv> struct Converter_PyInt { + static inline bool checkType(PyObject* pyobj) { return PyNumber_Check(pyobj); } static inline bool isConvertible(PyObject* pyobj) { return PyNumber_Check(pyobj); } static inline PyObject* toPython(void* cppobj) { return toPython(*reinterpret_cast<PyIntEquiv*>(cppobj)); } static inline PyObject* toPython(const PyIntEquiv& cppobj) { return PyInt_FromLong((long) cppobj); } @@ -396,6 +409,7 @@ struct Converter_PyULongInt : Converter_PyInt<T> template <typename CharType> struct CharConverter { + static inline bool checkType(PyObject* pyobj) { return SbkChar_Check(pyobj); } static inline bool isConvertible(PyObject* pyobj) { return SbkChar_Check(pyobj); } static inline PyObject* toPython(void* cppobj) { return toPython(*reinterpret_cast<CharType*>(cppobj)); } static inline PyObject* toPython(const CharType& cppobj) { return PyInt_FromLong(cppobj); } @@ -457,6 +471,7 @@ struct Converter<unsigned PY_LONG_LONG> template <typename PyFloatEquiv> struct Converter_PyFloat { + static inline bool checkType(PyObject* obj) { return PyNumber_Check(obj); } static inline bool isConvertible(PyObject* obj) { return PyNumber_Check(obj); } static inline PyObject* toPython(void* cppobj) { return toPython(*reinterpret_cast<PyFloatEquiv*>(cppobj)); } static inline PyObject* toPython(PyFloatEquiv cppobj) { return PyFloat_FromDouble((double) cppobj); } @@ -475,6 +490,7 @@ template <> struct Converter<double> : Converter_PyFloat<double> {}; template <typename CppEnum> struct EnumConverter { + static inline bool checkType(PyObject* pyObj) { return PyObject_TypeCheck(pyObj, SbkType<CppEnum>()); } static inline bool isConvertible(PyObject* pyObj) { return PyObject_TypeCheck(pyObj, SbkType<CppEnum>()); } static inline PyObject* toPython(void* cppobj) { return toPython(*reinterpret_cast<CppEnum*>(cppobj)); } static inline PyObject* toPython(CppEnum cppenum) @@ -491,6 +507,7 @@ struct EnumConverter template <typename CString> struct Converter_CString { + static inline bool checkType(PyObject* pyObj) { return PyString_Check(pyObj); } static inline bool isConvertible(PyObject* pyObj) { return pyObj == Py_None || PyString_Check(pyObj); } static inline PyObject* toPython(void* cppobj) { return toPython(reinterpret_cast<CString>(cppobj)); } static inline PyObject* toPython(CString cppobj) @@ -523,6 +540,11 @@ template <> struct Converter<const char*> : Converter_CString<const char*> {}; template <typename StdList> struct StdListConverter { + static inline bool checkType(PyObject* pyObj) + { + return isConvertible(pyObj); + } + static inline bool isConvertible(PyObject* pyObj) { if (PyObject_TypeCheck(pyObj, SbkType<StdList>())) @@ -567,6 +589,11 @@ struct StdListConverter template <typename StdPair> struct StdPairConverter { + static inline bool checkType(PyObject* pyObj) + { + return isConvertible(pyObj); + } + static inline bool isConvertible(PyObject* pyObj) { if (PyObject_TypeCheck(pyObj, SbkType<StdPair>())) @@ -606,6 +633,11 @@ struct StdPairConverter template <typename StdMap> struct StdMapConverter { + static inline bool checkType(PyObject* pyObj) + { + return isConvertible(pyObj); + } + static inline bool isConvertible(PyObject* pyObj) { if (PyObject_TypeCheck(pyObj, SbkType<StdMap>())) |