## 03_qreal_float_support.dpatch by Michael Casadevall Index: python-qt4-4.8.3/configure.py =================================================================== --- python-qt4-4.8.3.orig/configure.py 2011-02-24 10:33:30.000000000 +0200 +++ python-qt4-4.8.3/configure.py 2011-02-24 10:33:18.000000000 +0200 @@ -2004,8 +2004,9 @@ out << "PyQt_NoOpenGLES\\n"; #endif - if (sizeof (qreal) != sizeof (double)) +#if defined(QT_NO_FPU) || defined(QT_ARCH_ARM) || defined(QT_ARCH_WINDOWSCE) out << "PyQt_qreal_double\\n"; +#endif return 0; } Index: python-qt4-4.8.3/sip/QtCore/qlist.sip =================================================================== --- python-qt4-4.8.3.orig/sip/QtCore/qlist.sip 2011-02-24 10:33:27.000000000 +0200 +++ python-qt4-4.8.3/sip/QtCore/qlist.sip 2011-02-24 10:33:18.000000000 +0200 @@ -811,3 +811,227 @@ return sipGetState(sipTransferObj); %End }; + +// If we're on an architecture where qreal != double, then we need to also +// explicately handle doubles. On architectures where qreal == double, they +// will automaticially be cast upwards + +%If (!PyQt_qreal_double) + +%If (Qt_4_3_0 -) +// QList > is implemented as a Python list of 2-element tuples. +%MappedType QList > +{ +%TypeHeaderCode +#include +#include +%End + +%ConvertFromTypeCode + // Create the list. + PyObject *l; + + if ((l = PyList_New(sipCpp->size())) == NULL) + return NULL; + + // Set the list elements. + for (int i = 0; i < sipCpp->size(); ++i) + { + const QPair &p = sipCpp->at(i); + PyObject *pobj; + + if ((pobj = Py_BuildValue((char *)"dd", p.first, p.second)) == NULL) + { + Py_DECREF(l); + + return NULL; + } + + PyList_SET_ITEM(l, i, pobj); + } + + return l; +%End + +%ConvertToTypeCode + SIP_SSIZE_T len; + + // Check the type if that is all that is required. + if (sipIsErr == NULL) + { + if (!PySequence_Check(sipPy) || (len = PySequence_Size(sipPy)) < 0) + return 0; + + for (SIP_SSIZE_T i = 0; i < len; ++i) + { + PyObject *tup = PySequence_ITEM(sipPy, i); + + if (!PySequence_Check(tup) || PySequence_Size(tup) != 2) + return 0; + } + + return 1; + } + + QList > *ql = new QList >; + len = PySequence_Size(sipPy); + + for (SIP_SSIZE_T i = 0; i < len; ++i) + { + PyObject *tup = PySequence_ITEM(sipPy, i); + + double first = PyFloat_AsDouble(PySequence_ITEM(tup, 0)); + double second = PyFloat_AsDouble(PySequence_ITEM(tup, 1)); + + ql->append(QPair(first, second)); + } + + *sipCppPtr = ql; + + return sipGetState(sipTransferObj); +%End +}; +%End +%If (Qt_4_3_0 -) +// QList > is implemented as a Python list of 2-element tuples. +template +%MappedType QList > +{ +%TypeHeaderCode +#include +#include +%End + +%ConvertFromTypeCode + // Create the list. + PyObject *l; + + if ((l = PyList_New(sipCpp->size())) == NULL) + return NULL; + + // Set the list elements. + for (int i = 0; i < sipCpp->size(); ++i) + { + const QPair &p = sipCpp->at(i); + TYPE *t = new TYPE(p.second); + PyObject *pobj; + + if ((pobj = sipBuildResult(NULL, "(dB)", p.first, t, sipClass_TYPE, sipTransferObj)) == NULL) + { + Py_DECREF(l); + delete t; + + return NULL; + } + + PyList_SET_ITEM(l, i, pobj); + } + + return l; +%End + +%ConvertToTypeCode + SIP_SSIZE_T len; + + // Check the type if that is all that is required. + if (sipIsErr == NULL) + { + if (!PySequence_Check(sipPy) || (len = PySequence_Size(sipPy)) < 0) + return 0; + + for (SIP_SSIZE_T i = 0; i < len; ++i) + { + PyObject *tup = PySequence_ITEM(sipPy, i); + + if (!PySequence_Check(tup) || PySequence_Size(tup) != 2) + return 0; + + if (!sipCanConvertToInstance(PySequence_ITEM(tup, 1), sipClass_TYPE, SIP_NOT_NONE)) + return 0; + } + + return 1; + } + + QList > *ql = new QList >; + len = PySequence_Size(sipPy); + + for (SIP_SSIZE_T i = 0; i < len; ++i) + { + PyObject *tup = PySequence_ITEM(sipPy, i); + double d; + int state; + + d = PyFloat_AsDouble(PySequence_ITEM(tup, 0)); + TYPE *t = reinterpret_cast(sipConvertToInstance(PySequence_ITEM(tup, 1), sipClass_TYPE, sipTransferObj, SIP_NOT_NONE, &state, sipIsErr)); + + if (*sipIsErr) + { + sipReleaseInstance(t, sipClass_TYPE, state); + + delete ql; + return 0; + } + + ql->append(QPair(d, *t)); + + sipReleaseInstance(t, sipClass_TYPE, state); + } + + *sipCppPtr = ql; + + return sipGetState(sipTransferObj); +%End +}; +%End + +// QList is implemented as a Python list of doubles. +%MappedType QList +{ +%TypeHeaderCode +#include +%End + +%ConvertFromTypeCode + // Create the list. + PyObject *l; + + if ((l = PyList_New(sipCpp->size())) == NULL) + return NULL; + + // Set the list elements. + for (int i = 0; i < sipCpp->size(); ++i) + { + PyObject *pobj; + + if ((pobj = PyFloat_FromDouble(sipCpp->value(i))) == NULL) + { + Py_DECREF(l); + + return NULL; + } + + PyList_SET_ITEM(l, i, pobj); + } + + return l; +%End + +%ConvertToTypeCode + // Check the type if that is all that is required. + if (sipIsErr == NULL) + return (PySequence_Check(sipPy) && PySequence_Size(sipPy) >= 0); + + QList *ql = new QList; + SIP_SSIZE_T len = PySequence_Size(sipPy); + + for (SIP_SSIZE_T i = 0; i < len; ++i) + ql->append(PyFloat_AsDouble(PySequence_ITEM(sipPy, i))); + + *sipCppPtr = ql; + + return sipGetState(sipTransferObj); +%End +}; + +%End