aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarcelo Lira <marcelo.lira@openbossa.org>2009-09-15 17:00:19 -0300
committerMarcelo Lira <marcelo.lira@openbossa.org>2009-09-15 17:00:44 -0300
commit50678706032259f37942eea03429e86af685eedb (patch)
tree396f7f0149f2bf50b99bbb16a6000c549ae932ec
parentd9b029098c0aee475310841f2d2746c3739b99f7 (diff)
added conversion rules for QVector and QMap containers
-rw-r--r--PySide/QtCore/qlist_conversions.h12
-rw-r--r--PySide/QtCore/qmap_conversions.h40
-rw-r--r--PySide/QtCore/qpair_conversions.h20
-rw-r--r--PySide/QtCore/qvector_conversions.h24
-rw-r--r--PySide/QtCore/typesystem_core.xml10
5 files changed, 88 insertions, 18 deletions
diff --git a/PySide/QtCore/qlist_conversions.h b/PySide/QtCore/qlist_conversions.h
index b305d1468..0f72b3ccd 100644
--- a/PySide/QtCore/qlist_conversions.h
+++ b/PySide/QtCore/qlist_conversions.h
@@ -1,20 +1,20 @@
-template <typename StdList>
+template <typename qlist>
struct Converter_qlist
{
- static PyObject* toPython(StdList holder)
+ static PyObject* toPython(qlist holder)
{
PyObject* result = PyList_New(holder.size());
for (int i = 0; i < holder.size(); i++) {
- PyList_SET_ITEM(result, i, Converter<typename StdList::value_type>::toPython(holder.at(i)));
+ PyList_SET_ITEM(result, i, Converter<typename qlist::value_type>::toPython(holder.at(i)));
}
return result;
}
- static StdList toCpp(PyObject* pyobj)
+ static qlist toCpp(PyObject* pyobj)
{
- StdList result;
+ qlist result;
for (int i = 0; i < PySequence_Size(pyobj); i++) {
PyObject* pyItem = PySequence_GetItem(pyobj, i);
- result.append(Converter<typename StdList::value_type>::toCpp(pyItem));
+ result.append(Converter<typename qlist::value_type>::toCpp(pyItem));
}
return result;
}
diff --git a/PySide/QtCore/qmap_conversions.h b/PySide/QtCore/qmap_conversions.h
new file mode 100644
index 000000000..c1c262405
--- /dev/null
+++ b/PySide/QtCore/qmap_conversions.h
@@ -0,0 +1,40 @@
+template <typename qmap>
+struct Converter_qmap
+{
+ static PyObject* toPython(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> > {};
diff --git a/PySide/QtCore/qpair_conversions.h b/PySide/QtCore/qpair_conversions.h
index 4d9f21351..de9904630 100644
--- a/PySide/QtCore/qpair_conversions.h
+++ b/PySide/QtCore/qpair_conversions.h
@@ -1,22 +1,22 @@
-template <typename StdPair>
+template <typename qpair>
struct Converter_qpair
{
- static PyObject* toPython(StdPair holder)
+ static PyObject* toPython(qpair holder)
{
- typename StdPair::first_type first(holder.first);
- typename StdPair::second_type second(holder.second);
+ typename qpair::first_type first(holder.first);
+ typename qpair::second_type second(holder.second);
PyObject* tuple = PyTuple_New(2);
- PyTuple_SET_ITEM(tuple, 0, Converter<typename StdPair::first_type>::toPython(first));
- PyTuple_SET_ITEM(tuple, 1, Converter<typename StdPair::second_type>::toPython(second));
+ PyTuple_SET_ITEM(tuple, 0, Converter<typename qpair::first_type>::toPython(first));
+ PyTuple_SET_ITEM(tuple, 1, Converter<typename qpair::second_type>::toPython(second));
return tuple;
}
- static StdPair toCpp(PyObject* pyobj)
+ static qpair toCpp(PyObject* pyobj)
{
- StdPair result;
+ qpair result;
PyObject* pyFirst = PySequence_GetItem(pyobj, 0);
PyObject* pySecond = PySequence_GetItem(pyobj, 1);
- result.first = Converter<typename StdPair::first_type>::toCpp(pyFirst);
- result.second = Converter<typename StdPair::second_type>::toCpp(pySecond);
+ result.first = Converter<typename qpair::first_type>::toCpp(pyFirst);
+ result.second = Converter<typename qpair::second_type>::toCpp(pySecond);
return result;
}
};
diff --git a/PySide/QtCore/qvector_conversions.h b/PySide/QtCore/qvector_conversions.h
new file mode 100644
index 000000000..c1cc304c1
--- /dev/null
+++ b/PySide/QtCore/qvector_conversions.h
@@ -0,0 +1,24 @@
+template <typename qvector>
+struct Converter_qvector
+{
+ static PyObject* toPython(qvector vector)
+ {
+ PyObject* result = PyList_New(vector.size());
+ for (int i = 0; i < vector.size(); i++) {
+ PyList_SET_ITEM(result, i, Converter<typename qvector::value_type>::toPython(vector.at(i)));
+ }
+ return result;
+ }
+ static qvector toCpp(PyObject* pyobj)
+ {
+ qvector result;
+ for (int i = 0; i < PySequence_Size(pyobj); i++) {
+ PyObject* pyItem = PySequence_GetItem(pyobj, i);
+ result.append(Converter<typename qvector::value_type>::toCpp(pyItem));
+ }
+ return result;
+ }
+};
+
+template<typename T>
+struct Converter<QVector<T> > : Converter_qvector<QVector<T> > {};
diff --git a/PySide/QtCore/typesystem_core.xml b/PySide/QtCore/typesystem_core.xml
index e76ab7370..0cc0f937c 100644
--- a/PySide/QtCore/typesystem_core.xml
+++ b/PySide/QtCore/typesystem_core.xml
@@ -326,7 +326,10 @@
<rejection class="QList" function-name="toSet"/>
<rejection class="QList" function-name="toStdList" />
- <container-type name="QVector" type="vector"/>
+ <container-type name="QVector" type="vector">
+ <conversion-rule file="qvector_conversions.h"/>
+ <include file-name="QVector" location="global"/>
+ </container-type>
<rejection class="QVector" function-name="back"/>
<rejection class="QVector" function-name="begin"/>
<rejection class="QVector" function-name="constBegin"/>
@@ -353,7 +356,10 @@
<container-type name="QHash" type="hash"/>
<container-type name="QLinkedList" type="linked-list"/>
- <container-type name="QMap" type="map"/>
+ <container-type name="QMap" type="map">
+ <conversion-rule file="qmap_conversions.h"/>
+ <include file-name="QMap" location="global"/>
+ </container-type>
<container-type name="QMultiMap" type="multi-map"/>
<container-type name="QPair" type="pair">
<conversion-rule file="qpair_conversions.h"/>