aboutsummaryrefslogtreecommitdiffstats
path: root/sources/pyside6/libpyside/pysideqenum.cpp
diff options
context:
space:
mode:
authorFriedemann Kleint <Friedemann.Kleint@qt.io>2025-06-27 07:55:06 +0200
committerFriedemann Kleint <Friedemann.Kleint@qt.io>2025-06-30 22:24:23 +0200
commit82895a377e301cbf2526490f9e32c9b261aa3f6e (patch)
tree24770b2849ee1e2947744f55f163c6b58f98d23e /sources/pyside6/libpyside/pysideqenum.cpp
parentf9ea07b23085f05b28b1e9f953fb5731863e763e (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.cpp69
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
//