aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--PySide/QtCore/qchar_conversions.h39
-rw-r--r--PySide/QtCore/qhash_conversions.h44
-rw-r--r--PySide/QtCore/qlist_conversions.h2
-rw-r--r--PySide/QtCore/qmap_conversions.h45
-rw-r--r--PySide/QtCore/qpair_conversions.h2
-rw-r--r--PySide/QtCore/qstring_conversions.h68
-rw-r--r--PySide/QtCore/qstringlist_conversions.h11
-rw-r--r--PySide/QtCore/qvariant_conversions.h7
-rw-r--r--PySide/QtCore/qvector_conversions.h2
-rw-r--r--PySide/QtCore/typesystem_core.xml1
-rw-r--r--PySide/QtGui/qpixmap_conversion.h7
-rw-r--r--libpyside/pysideconversions.h32
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;
}
};