aboutsummaryrefslogtreecommitdiffstats
path: root/PySide/QtCore/qset_conversions.h
blob: 183f2ce06cb0da0a0abd344e3976d5e759919b0f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
template <typename qset>
struct Converter_qset
{
    static bool isConvertible(PyObject* pyobj) {
        return PyIter_Check(pyobj);
    }

    static PyObject* toPython(const qset& set)
    {
        PyObject* result = PySet_New(NULL);
        foreach(typename qset::value_type x, set)  {
            PyObject *pyObj = Converter<typename qset::value_type>::toPython(x);
            PySet_Add(result, pyObj);
            Py_DECREF(pyObj);
        }
        return result;
    }
    static qset toCpp(PyObject* pyobj)
    {
        qset result;
        PyObject *iterator = PyObject_GetIter(pyobj);

        if (iterator == NULL)
            return NULL;

        PyObject *pyItem = NULL;
        while (pyItem = PyIter_Next(iterator)) {
            result.insert(Converter<typename qset::value_type>::toCpp(pyItem));
            Py_DECREF(pyItem);
        }

        Py_XDECREF(iterator);

        if (PyErr_Occurred())
            return NULL;

        return result;
    }
};

template<typename T>
struct Converter<QSet<T> > : Converter_qset<QSet<T> > {};