diff options
| author | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2025-06-27 07:55:06 +0200 |
|---|---|---|
| committer | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2025-06-30 22:24:23 +0200 |
| commit | 82895a377e301cbf2526490f9e32c9b261aa3f6e (patch) | |
| tree | 24770b2849ee1e2947744f55f163c6b58f98d23e /sources/pyside6/libpyside/pysideqenum.cpp | |
| parent | f9ea07b23085f05b28b1e9f953fb5731863e763e (diff) | |
Add 64 bit support for @QEnum meta types
Complements 4aa48368667bee64e48f7c9d6b3a935411d5f23c.
Task-number: QTBUG-27451
Task-number: QTBUG-111926
Task-number: PYSIDE-2840
Change-Id: I8ddd138bae667bf2411c3d71b0d718a8eb217f7f
Reviewed-by: Shyamnath Premnadh <Shyamnath.Premnadh@qt.io>
Reviewed-by: Cristian Maureira-Fredes <cristian.maureira-fredes@qt.io>
Diffstat (limited to 'sources/pyside6/libpyside/pysideqenum.cpp')
| -rw-r--r-- | sources/pyside6/libpyside/pysideqenum.cpp | 69 |
1 files changed, 61 insertions, 8 deletions
diff --git a/sources/pyside6/libpyside/pysideqenum.cpp b/sources/pyside6/libpyside/pysideqenum.cpp index 70dd1d6da..f15074d59 100644 --- a/sources/pyside6/libpyside/pysideqenum.cpp +++ b/sources/pyside6/libpyside/pysideqenum.cpp @@ -267,34 +267,71 @@ QByteArray getTypeName(PyTypeObject *type) } using GenericEnumType = int; +using GenericEnum64Type = unsigned long long; -using GenericEnumTypeList = QList<PyTypeObject *>; +struct GenericEnumRegistry +{ + QList<PyTypeObject *> enumTypes; + QList<PyTypeObject *> enum64Types; +}; -Q_GLOBAL_STATIC(GenericEnumTypeList, genericEnumTypeList) +Q_GLOBAL_STATIC(GenericEnumRegistry, genericEnumTypeRegistry) } // namespace PySide::QEnum +template <class IntType> +static inline void genericEnumPythonToCppTpl(PyObject *pyIn, void *cppOut) +{ + const auto value = static_cast<IntType>(Shiboken::Enum::getValue(pyIn)); + *reinterpret_cast<IntType *>(cppOut) = value; +} + +template <class IntType> +static inline PyObject *genericEnumCppToPythonTpl(PyTypeObject *pyType, const void *cppIn) +{ + const auto value = *reinterpret_cast<const IntType *>(cppIn); + return Shiboken::Enum::newItem(pyType, value); +} + extern "C" { +// int static void genericEnumPythonToCpp(PyObject *pyIn, void *cppOut) { - const auto value = static_cast<PySide::QEnum::GenericEnumType>(Shiboken::Enum::getValue(pyIn)); - *reinterpret_cast<int *>(cppOut) = value; + genericEnumPythonToCppTpl<PySide::QEnum::GenericEnumType>(pyIn, cppOut); } static PythonToCppFunc isGenericEnumToCppConvertible(PyObject *pyIn) { - if (PySide::QEnum::genericEnumTypeList()->contains(Py_TYPE(pyIn))) + if (PySide::QEnum::genericEnumTypeRegistry()->enumTypes.contains(Py_TYPE(pyIn))) return genericEnumPythonToCpp; return {}; } static PyObject *genericEnumCppToPython(PyTypeObject *pyType, const void *cppIn) { - const auto value = *reinterpret_cast<const PySide::QEnum::GenericEnumType *>(cppIn); - return Shiboken::Enum::newItem(pyType, value); + return genericEnumCppToPythonTpl<PySide::QEnum::GenericEnumType>(pyType, cppIn); +} + +// unsigned long long +static void genericEnumPythonToCpp64(PyObject *pyIn, void *cppOut) +{ + genericEnumPythonToCppTpl<PySide::QEnum::GenericEnum64Type>(pyIn, cppOut); +} + +static PythonToCppFunc isGenericEnumToCpp64Convertible(PyObject *pyIn) +{ + + if (PySide::QEnum::genericEnumTypeRegistry()->enum64Types.contains(Py_TYPE(pyIn))) + return genericEnumPythonToCpp64; + return {}; +} + +static PyObject *genericEnumCpp64ToPython(PyTypeObject *pyType, const void *cppIn) +{ + return genericEnumCppToPythonTpl<PySide::QEnum::GenericEnum64Type>(pyType, cppIn); } } // extern "C" @@ -302,6 +339,7 @@ static PyObject *genericEnumCppToPython(PyTypeObject *pyType, const void *cppIn) namespace PySide::QEnum { +// int QMetaType createGenericEnumMetaType(const QByteArray &name, PyTypeObject *pyType) { SbkConverter *converter = Shiboken::Conversions::createConverter(pyType, @@ -312,10 +350,25 @@ QMetaType createGenericEnumMetaType(const QByteArray &name, PyTypeObject *pyType Shiboken::Conversions::registerConverterName(converter, name.constData()); Shiboken::Enum::setTypeConverter(pyType, converter, nullptr); - genericEnumTypeList()->append(pyType); + genericEnumTypeRegistry->enumTypes.append(pyType); return createEnumMetaTypeHelper<GenericEnumType>(name); } +// "unsigned long long" +QMetaType createGenericEnum64MetaType(const QByteArray &name, PyTypeObject *pyType) +{ + SbkConverter *converter = Shiboken::Conversions::createConverter(pyType, + genericEnumCpp64ToPython); + Shiboken::Conversions::addPythonToCppValueConversion(converter, + genericEnumPythonToCpp64, + isGenericEnumToCpp64Convertible); + Shiboken::Conversions::registerConverterName(converter, name.constData()); + Shiboken::Enum::setTypeConverter(pyType, converter, nullptr); + + genericEnumTypeRegistry()->enum64Types.append(pyType); + return createEnumMetaTypeHelper<GenericEnum64Type>(name); +} + } // namespace PySide::QEnum // |
