aboutsummaryrefslogtreecommitdiffstats
path: root/libpyside
diff options
context:
space:
mode:
authorHugo Lima <hugo.lima@openbossa.org>2010-03-17 17:04:28 -0300
committerHugo Lima <hugo.lima@openbossa.org>2010-03-17 18:17:20 -0300
commitef1ed30d114477af62fe57c909a97337f2e3d6ff (patch)
treed8c13250f75d1b5a9e78be6b4c633933df313e86 /libpyside
parent1e8fae534a702555055718810ac8b09ea4fcdd92 (diff)
Small fixes for Qt containers converters.
Diffstat (limited to 'libpyside')
-rw-r--r--libpyside/pysideconversions.h48
1 files changed, 47 insertions, 1 deletions
diff --git a/libpyside/pysideconversions.h b/libpyside/pysideconversions.h
index 6e6db7902..3c8effe9e 100644
--- a/libpyside/pysideconversions.h
+++ b/libpyside/pysideconversions.h
@@ -35,6 +35,9 @@
#ifndef PYSIDECONVERSIONS_H
#define PYSIDECONVERSIONS_H
+#include <Python.h>
+#include <conversions.h>
+
template <typename QtDict>
struct QtDictConverter
{
@@ -43,7 +46,7 @@ struct QtDictConverter
if (PyObject_TypeCheck(pyObj, Shiboken::SbkType<QtDict>()))
return true;
- if (!PyDict_Check(pyObj))
+ if ((Shiboken::SbkType<QtDict>() && Shiboken::isShibokenType(pyObj)) || !PyDict_Check(pyObj))
return false;
PyObject* key;
@@ -74,6 +77,9 @@ struct QtDictConverter
}
static inline QtDict toCpp(PyObject* pyobj)
{
+ if (PyObject_TypeCheck(pyobj, Shiboken::SbkType<QtDict>()))
+ return *reinterpret_cast<QtDict*>(SbkBaseWrapper_cptr(pyobj));
+
QtDict result;
PyObject* key;
@@ -86,4 +92,44 @@ struct QtDictConverter
}
};
+template <typename T>
+struct QSequenceConverter
+{
+ static inline bool isConvertible(PyObject* pyObj)
+ {
+ if (PyObject_TypeCheck(pyObj, Shiboken::SbkType<T>()))
+ return true;
+ if ((Shiboken::SbkType<T>() && Shiboken::isShibokenType(pyObj)) || !PySequence_Check(pyObj))
+ return false;
+ for (int i = 0, max = PySequence_Length(pyObj); i < max; ++i) {
+ Shiboken::AutoDecRef item(PySequence_GetItem(pyObj, i));
+ if (!Shiboken::Converter<typename T::value_type>::isConvertible(item))
+ return false;
+ }
+ return true;
+ }
+ static PyObject* toPython(const T& cppobj)
+ {
+ PyObject* result = PyList_New((int) cppobj.size());
+ typename T::const_iterator it = cppobj.begin();
+ for (int idx = 0; it != cppobj.end(); ++it, ++idx) {
+ typename T::value_type vh(*it);
+ PyList_SET_ITEM(result, idx, Shiboken::Converter<typename T::value_type>::toPython(vh));
+ }
+ return result;
+ }
+ static T toCpp(PyObject* pyobj)
+ {
+ if (PyObject_TypeCheck(pyobj, Shiboken::SbkType<T>()))
+ return *reinterpret_cast<T*>(SbkBaseWrapper_cptr(pyobj));
+
+ T result;
+ for (int i = 0; i < PySequence_Size(pyobj); i++) {
+ PyObject* pyItem = PySequence_GetItem(pyobj, i);
+ result << Shiboken::Converter<typename T::value_type>::toCpp(pyItem);
+ }
+ return result;
+ }
+};
+
#endif