diff options
-rw-r--r-- | PySide/QtCore/qchar_conversions.h | 39 | ||||
-rw-r--r-- | PySide/QtCore/qhash_conversions.h | 44 | ||||
-rw-r--r-- | PySide/QtCore/qlist_conversions.h | 2 | ||||
-rw-r--r-- | PySide/QtCore/qmap_conversions.h | 45 | ||||
-rw-r--r-- | PySide/QtCore/qpair_conversions.h | 2 | ||||
-rw-r--r-- | PySide/QtCore/qstring_conversions.h | 68 | ||||
-rw-r--r-- | PySide/QtCore/qstringlist_conversions.h | 11 | ||||
-rw-r--r-- | PySide/QtCore/qvariant_conversions.h | 7 | ||||
-rw-r--r-- | PySide/QtCore/qvector_conversions.h | 2 | ||||
-rw-r--r-- | PySide/QtCore/typesystem_core.xml | 1 | ||||
-rw-r--r-- | PySide/QtGui/qpixmap_conversion.h | 7 | ||||
-rw-r--r-- | libpyside/pysideconversions.h | 32 |
12 files changed, 97 insertions, 163 deletions
diff --git a/PySide/QtCore/qchar_conversions.h b/PySide/QtCore/qchar_conversions.h index 345befade..6347c9311 100644 --- a/PySide/QtCore/qchar_conversions.h +++ b/PySide/QtCore/qchar_conversions.h @@ -1,25 +1,30 @@ namespace Shiboken { - -inline bool Shiboken::Converter<QChar >::isConvertible(PyObject* pyobj) +inline bool Shiboken::Converter<QChar >::isConvertible(PyObject* pyObj) { - return SbkPySide_QtCore_QChar_SpecialCharacter_Check(pyobj) - || SbkQLatin1Char_Check(pyobj) - || (PyString_Check(pyobj) && (PyString_Size(pyobj) == 1)) - || PyInt_Check(pyobj); + return PyObject_TypeCheck(pyObj, SbkType<QChar>()) + || SbkPySide_QtCore_QChar_SpecialCharacter_Check(pyObj) + || SbkQLatin1Char_Check(pyObj) + || (PyString_Check(pyObj) && (PyString_Size(pyObj) == 1)) + || PyInt_Check(pyObj); } -inline QChar Shiboken::Converter<QChar >::toCpp(PyObject* pyobj) +inline QChar Shiboken::Converter<QChar >::toCpp(PyObject* pyObj) { - if (!Shiboken_TypeCheck(pyobj, QChar)) { - if (SbkPySide_QtCore_QChar_SpecialCharacter_Check(pyobj)) - return QChar(Shiboken::Converter<QChar::SpecialCharacter >::toCpp(pyobj)); - else if (SbkQLatin1Char_Check(pyobj)) - return QChar(Shiboken::Converter<QLatin1Char >::toCpp(pyobj)); - else if (PyString_Check(pyobj) && PyString_Size(pyobj) == 1) - return QChar(Shiboken::Converter<char >::toCpp(pyobj)); - else if (PyInt_Check(pyobj)) - return QChar(Shiboken::Converter<int >::toCpp(pyobj)); + if (!Shiboken_TypeCheck(pyObj, QChar)) { + if (SbkPySide_QtCore_QChar_SpecialCharacter_Check(pyObj)) + return QChar(Shiboken::Converter<QChar::SpecialCharacter >::toCpp(pyObj)); + else if (SbkQLatin1Char_Check(pyObj)) + return QChar(Shiboken::Converter<QLatin1Char >::toCpp(pyObj)); + else if (PyString_Check(pyObj) && PyString_Size(pyObj) == 1) + return QChar(Shiboken::Converter<char >::toCpp(pyObj)); + else if (PyInt_Check(pyObj)) + return QChar(Shiboken::Converter<int >::toCpp(pyObj)); } - return *Converter<QChar*>::toCpp(pyobj); + return *Converter<QChar*>::toCpp(pyObj); +} + +inline PyObject* Converter<QChar>::toPython(const QChar& cppObj) +{ + return ValueTypeConverter<QChar>::toPython(cppObj); } } diff --git a/PySide/QtCore/qhash_conversions.h b/PySide/QtCore/qhash_conversions.h index 881704469..f9e2e4217 100644 --- a/PySide/QtCore/qhash_conversions.h +++ b/PySide/QtCore/qhash_conversions.h @@ -1,46 +1,4 @@ namespace Shiboken { -template <typename qhash> -struct Converter_qhash -{ - static bool isConvertible(PyObject* pyobj) { - return PyDict_Check(pyobj); - } - - static PyObject* toPython(const qhash& hash) - { - PyObject* result = PyDict_New(); - - QHashIterator<typename qhash::key_type, typename qhash::mapped_type> it(hash); - while (it.hasNext()) { - it.next(); - PyDict_SetItem(result, - Converter<typename qhash::key_type>::toPython(it.key()), - Converter<typename qhash::mapped_type>::toPython(it.value())); - } - - return result; - } - static qhash toCpp(PyObject* pyobj) - { - qhash result; - - PyObject* key; - PyObject* value; - Py_ssize_t pos = 0; - - Py_INCREF(pyobj); - - while (PyDict_Next(pyobj, &pos, &key, &value)) { - result.insert(Converter<typename qhash::key_type>::toCpp(key), - Converter<typename qhash::mapped_type>::toCpp(value)); - } - - Py_DECREF(pyobj); - - return result; - } -}; - template<typename KT, typename VT> -struct Converter<QHash<KT, VT> > : Converter_qhash<QHash<KT, VT> > {}; +struct Converter<QHash<KT, VT> > : QtDictConverter<QHash<KT, VT> > {}; } diff --git a/PySide/QtCore/qlist_conversions.h b/PySide/QtCore/qlist_conversions.h index aa323054f..cb1d26bd5 100644 --- a/PySide/QtCore/qlist_conversions.h +++ b/PySide/QtCore/qlist_conversions.h @@ -1,4 +1,4 @@ namespace Shiboken { template<typename T> -struct Converter<QList<T> > : Converter_std_list<QList<T> > {}; +struct Converter<QList<T> > : StdListConverter<QList<T> > {}; } diff --git a/PySide/QtCore/qmap_conversions.h b/PySide/QtCore/qmap_conversions.h index f7cd2c85b..3153fae92 100644 --- a/PySide/QtCore/qmap_conversions.h +++ b/PySide/QtCore/qmap_conversions.h @@ -1,46 +1,5 @@ namespace Shiboken { -template <typename qmap> -struct Converter_qmap -{ - static bool isConvertible(PyObject* pyobj) { - return PyDict_Check(pyobj); - } - - static PyObject* toPython(const qmap& map) - { - PyObject* result = PyDict_New(); - - QMapIterator<typename qmap::key_type, typename qmap::mapped_type> it(map); - while (it.hasNext()) { - it.next(); - PyDict_SetItem(result, - Converter<typename qmap::key_type>::toPython(it.key()), - Converter<typename qmap::mapped_type>::toPython(it.value())); - } - - return result; - } - static qmap toCpp(PyObject* pyobj) - { - qmap result; - - PyObject* key; - PyObject* value; - Py_ssize_t pos = 0; - - Py_INCREF(pyobj); - - while (PyDict_Next(pyobj, &pos, &key, &value)) { - result.insert(Converter<typename qmap::key_type>::toCpp(key), - Converter<typename qmap::mapped_type>::toCpp(value)); - } - - Py_DECREF(pyobj); - - return result; - } -}; - template<typename KT, typename VT> -struct Converter<QMap<KT, VT> > : Converter_qmap<QMap<KT, VT> > {}; +struct Converter<QMap<KT, VT> > : QtDictConverter<QMap<KT, VT> > { +}; } diff --git a/PySide/QtCore/qpair_conversions.h b/PySide/QtCore/qpair_conversions.h index 27a3c4a63..99e9cd8b8 100644 --- a/PySide/QtCore/qpair_conversions.h +++ b/PySide/QtCore/qpair_conversions.h @@ -1,4 +1,4 @@ namespace Shiboken { template<typename FT, typename ST> -struct Converter<QPair<FT, ST> > : Converter_std_pair<QPair<FT, ST> > {}; +struct Converter<QPair<FT, ST> > : StdPairConverter<QPair<FT, ST> > {}; } diff --git a/PySide/QtCore/qstring_conversions.h b/PySide/QtCore/qstring_conversions.h index 0456421da..d2edf9479 100644 --- a/PySide/QtCore/qstring_conversions.h +++ b/PySide/QtCore/qstring_conversions.h @@ -1,51 +1,52 @@ namespace Shiboken { -inline bool Converter< QString >::isConvertible(PyObject* pyobj) +inline bool Converter<QString>::isConvertible(PyObject* pyObj) { SbkBaseWrapperType* shiboType = reinterpret_cast<SbkBaseWrapperType*>(SbkType<QString>()); - return PyString_Check(pyobj) - || PyUnicode_Check(pyobj) - || SbkQByteArray_Check(pyobj) - || SbkQLatin1String_Check(pyobj) + return PyString_Check(pyObj) + || PyObject_TypeCheck(pyObj, SbkType<QString>()) + || PyUnicode_Check(pyObj) + || SbkQByteArray_Check(pyObj) + || SbkQLatin1String_Check(pyObj) #if PY_VERSION_HEX < 0x03000000 - || (pyobj->ob_type->tp_as_buffer - && PyType_HasFeature(pyobj->ob_type, Py_TPFLAGS_HAVE_GETCHARBUFFER) - && pyobj->ob_type->tp_as_buffer->bf_getcharbuffer) + || (pyObj->ob_type->tp_as_buffer + && PyType_HasFeature(pyObj->ob_type, Py_TPFLAGS_HAVE_GETCHARBUFFER) + && pyObj->ob_type->tp_as_buffer->bf_getcharbuffer) #endif - || SbkQChar_Check(pyobj) - || (shiboType->ext_isconvertible && shiboType->ext_isconvertible(pyobj)); + || SbkQChar_Check(pyObj) + || (shiboType->ext_isconvertible && shiboType->ext_isconvertible(pyObj)); } -inline QString Converter< QString >::toCpp(PyObject* pyobj) +inline QString Converter<QString>::toCpp(PyObject* pyObj) { SbkBaseWrapperType* shiboType = reinterpret_cast<SbkBaseWrapperType*>(SbkType<QString>()); - if (SbkQChar_Check(pyobj)) { - return QString(Converter< QChar >::toCpp(pyobj)); - } else if (SbkQByteArray_Check(pyobj)) { - return QString(Converter< QByteArray >::toCpp(pyobj)); - } else if (SbkQLatin1String_Check(pyobj)) { - return QString(Converter< QLatin1String >::toCpp(pyobj)); - } else if (PyUnicode_Check(pyobj)) { - Py_UNICODE* unicode = PyUnicode_AS_UNICODE(pyobj); + if (SbkQChar_Check(pyObj)) { + return QString(Converter< QChar >::toCpp(pyObj)); + } else if (SbkQByteArray_Check(pyObj)) { + return QString(Converter< QByteArray >::toCpp(pyObj)); + } else if (SbkQLatin1String_Check(pyObj)) { + return QString(Converter< QLatin1String >::toCpp(pyObj)); + } else if (PyUnicode_Check(pyObj)) { + Py_UNICODE* unicode = PyUnicode_AS_UNICODE(pyObj); #if defined(Py_UNICODE_WIDE) // cast as Py_UNICODE can be a different type return QString::fromUcs4(reinterpret_cast<const uint*>(unicode)); #else - return QString::fromUtf16(unicode, PyUnicode_GET_SIZE(pyobj)); + return QString::fromUtf16(unicode, PyUnicode_GET_SIZE(pyObj)); #endif - } else if (PyString_Check(pyobj)) { - return QString(Converter< char * >::toCpp(pyobj)); + } else if (PyString_Check(pyObj)) { + return QString(Converter< char * >::toCpp(pyObj)); } #if PY_VERSION_HEX < 0x03000000 // Support for buffer objects on QString constructor - else if (pyobj->ob_type->tp_as_buffer - && PyType_HasFeature(pyobj->ob_type, Py_TPFLAGS_HAVE_GETCHARBUFFER) - && pyobj->ob_type->tp_as_buffer->bf_getcharbuffer) { + else if (pyObj->ob_type->tp_as_buffer + && PyType_HasFeature(pyObj->ob_type, Py_TPFLAGS_HAVE_GETCHARBUFFER) + && pyObj->ob_type->tp_as_buffer->bf_getcharbuffer) { QByteArray data; - PyBufferProcs* bufferProcs = pyobj->ob_type->tp_as_buffer; - int segments = bufferProcs->bf_getsegcount(pyobj, 0); + PyBufferProcs* bufferProcs = pyObj->ob_type->tp_as_buffer; + int segments = bufferProcs->bf_getsegcount(pyObj, 0); for (int i = 0; i < segments; ++i) { char* segmentData; - int length = bufferProcs->bf_getcharbuffer(pyobj, i, &segmentData); + int length = bufferProcs->bf_getcharbuffer(pyObj, i, &segmentData); if (length == -1) break; data.append(segmentData, length); @@ -53,11 +54,16 @@ inline QString Converter< QString >::toCpp(PyObject* pyobj) return QString(data); } #endif - else if (shiboType->ext_isconvertible && shiboType->ext_tocpp && shiboType->ext_isconvertible(pyobj)) { - QString* cptr = reinterpret_cast<QString*>(shiboType->ext_tocpp(pyobj)); + else if (shiboType->ext_isconvertible && shiboType->ext_tocpp && shiboType->ext_isconvertible(pyObj)) { + QString* cptr = reinterpret_cast<QString*>(shiboType->ext_tocpp(pyObj)); std::auto_ptr<QString> cptr_auto_ptr(cptr); return *cptr; } - return *Converter<QString*>::toCpp(pyobj); + return *Converter<QString*>::toCpp(pyObj); +} + +inline PyObject* Converter<QString>::toPython(const QString& cppObj) +{ + return ValueTypeConverter<QString>::toPython(cppObj); } } diff --git a/PySide/QtCore/qstringlist_conversions.h b/PySide/QtCore/qstringlist_conversions.h index f3387cb66..7e45dee01 100644 --- a/PySide/QtCore/qstringlist_conversions.h +++ b/PySide/QtCore/qstringlist_conversions.h @@ -1,22 +1,17 @@ namespace Shiboken { -inline bool Converter<QStringList>::checkType(PyObject* pyObj) -{ - return Converter_std_list<QStringList>::checkType(pyObj); -} - inline bool Converter<QStringList>::isConvertible(PyObject* pyObj) { - return Converter_std_list<QStringList>::isConvertible(pyObj); + return StdListConverter<QStringList>::isConvertible(pyObj); } inline QStringList Converter<QStringList>::toCpp(PyObject* pyObj) { - return Converter_std_list<QStringList>::toCpp(pyObj); + return StdListConverter<QStringList>::toCpp(pyObj); } inline PyObject* Converter<QStringList>::toPython(const QStringList& cppObj) { - return Converter_std_list<QStringList>::toPython(cppObj); + return StdListConverter<QStringList>::toPython(cppObj); } } diff --git a/PySide/QtCore/qvariant_conversions.h b/PySide/QtCore/qvariant_conversions.h index 4834c08ce..fc3f96f5c 100644 --- a/PySide/QtCore/qvariant_conversions.h +++ b/PySide/QtCore/qvariant_conversions.h @@ -30,6 +30,7 @@ struct QMetaTypeId< PyObjectHolder > QT_END_NAMESPACE namespace Shiboken { + // all types are convertible to QVariant inline bool Converter<QVariant>::isConvertible(PyObject* pyobj) { @@ -84,4 +85,10 @@ inline QVariant Converter<QVariant>::toCpp(PyObject* pyobj) return QVariant(typeCode, reinterpret_cast<SbkBaseWrapper*>(pyobj)->cptr); } } + +inline PyObject* Converter<QVariant>::toPython(const QVariant& cppObj) +{ + return ValueTypeConverter<QVariant>::toPython(cppObj); +} + } diff --git a/PySide/QtCore/qvector_conversions.h b/PySide/QtCore/qvector_conversions.h index f3470f4dc..0857036ae 100644 --- a/PySide/QtCore/qvector_conversions.h +++ b/PySide/QtCore/qvector_conversions.h @@ -1,4 +1,4 @@ namespace Shiboken { template<typename T> -struct Converter<QVector<T> > : Converter_std_list<QVector<T> > {}; +struct Converter<QVector<T> > : StdListConverter<QVector<T> > {}; } diff --git a/PySide/QtCore/typesystem_core.xml b/PySide/QtCore/typesystem_core.xml index 4f155dbc8..a1228da31 100644 --- a/PySide/QtCore/typesystem_core.xml +++ b/PySide/QtCore/typesystem_core.xml @@ -435,6 +435,7 @@ <container-type name="QHash" type="hash"> <conversion-rule file="qhash_conversions.h"/> <include file-name="QHash" location="global"/> + <include file-name="pysideconversions.h" location="global"/> </container-type> <container-type name="QLinkedList" type="linked-list"/> <container-type name="QMap" type="map"> diff --git a/PySide/QtGui/qpixmap_conversion.h b/PySide/QtGui/qpixmap_conversion.h index e3973b98c..10b480352 100644 --- a/PySide/QtGui/qpixmap_conversion.h +++ b/PySide/QtGui/qpixmap_conversion.h @@ -1,6 +1,8 @@ namespace Shiboken { inline bool Converter< QPixmap >::isConvertible(PyObject* pyobj) { + if (ValueTypeConverter<QPixmap>::isConvertible(pyobj)) + return true; SbkBaseWrapperType* shiboType = reinterpret_cast<SbkBaseWrapperType*>(SbkType<QPixmap>()); bool isVariant = SbkQVariant_Check(pyobj); if (isVariant) { @@ -34,4 +36,9 @@ inline QPixmap Converter< QPixmap >::toCpp(PyObject* pyobj) return *Converter<QPixmap*>::toCpp(pyobj); } + +inline PyObject* Converter<QPixmap>::toPython(const QPixmap& cppObj) +{ + return ValueTypeConverter<QPixmap>::toPython(cppObj); +} } diff --git a/libpyside/pysideconversions.h b/libpyside/pysideconversions.h index be6697e51..6e6db7902 100644 --- a/libpyside/pysideconversions.h +++ b/libpyside/pysideconversions.h @@ -35,11 +35,14 @@ #ifndef PYSIDECONVERSIONS_H #define PYSIDECONVERSIONS_H -template <typename StdMap> +template <typename QtDict> struct QtDictConverter { - static inline bool checkType(PyObject* pyObj) + static inline bool isConvertible(PyObject* pyObj) { + if (PyObject_TypeCheck(pyObj, Shiboken::SbkType<QtDict>())) + return true; + if (!PyDict_Check(pyObj)) return false; @@ -48,44 +51,37 @@ struct QtDictConverter Py_ssize_t pos = 0; while (PyDict_Next(pyObj, &pos, &key, &value)) { - if (!Shiboken::Converter<typename StdMap::key_type>::checkType(key) - && !Shiboken::Converter<typename StdMap::mapped_type>::checkType(value) - && !Shiboken::Converter<typename StdMap::key_type>::isConvertible(key) - && !Shiboken::Converter<typename StdMap::mapped_type>::isConvertible(value)) { + if (!Shiboken::Converter<typename QtDict::key_type>::isConvertible(key) + && !Shiboken::Converter<typename QtDict::mapped_type>::isConvertible(value)) { return false; } } return true; } - static inline bool isConvertible(PyObject* pyObj) - { - return checkType(pyObj); - } - - static inline PyObject* toPython(const StdMap& cppobj) + static inline PyObject* toPython(const QtDict& cppobj) { PyObject* result = PyDict_New(); - typename StdMap::const_iterator it = cppobj.begin(); + typename QtDict::const_iterator it = cppobj.begin(); for (; it != cppobj.end(); ++it) { PyDict_SetItem(result, - Shiboken::Converter<typename StdMap::key_type>::toPython(it.key()), - Shiboken::Converter<typename StdMap::mapped_type>::toPython(it.value())); + Shiboken::Converter<typename QtDict::key_type>::toPython(it.key()), + Shiboken::Converter<typename QtDict::mapped_type>::toPython(it.value())); } return result; } - static inline StdMap toCpp(PyObject* pyobj) + static inline QtDict toCpp(PyObject* pyobj) { - StdMap result; + QtDict result; PyObject* key; PyObject* value; Py_ssize_t pos = 0; while (PyDict_Next(pyobj, &pos, &key, &value)) - result[Shiboken::Converter<typename StdMap::key_type>::toCpp(key)] = Shiboken::Converter<typename StdMap::mapped_type>::toCpp(value); + result[Shiboken::Converter<typename QtDict::key_type>::toCpp(key)] = Shiboken::Converter<typename QtDict::mapped_type>::toCpp(value); return result; } }; |