aboutsummaryrefslogtreecommitdiffstats
path: root/sources/pyside6/libpyside/pysidesignal.cpp
diff options
context:
space:
mode:
authorFriedemann Kleint <Friedemann.Kleint@qt.io>2023-11-28 09:42:42 +0100
committerFriedemann Kleint <Friedemann.Kleint@qt.io>2023-11-28 18:18:43 +0100
commitdaf77773a72980a369ba6aabcb8cf1ca835bbbe7 (patch)
treed8fb58dd9930f588eed0d071a0b3241d34a022f9 /sources/pyside6/libpyside/pysidesignal.cpp
parentddc01a90175e90a7854be0d90bed25a902613e59 (diff)
libpyside: Remove QHash used when adding signals from QMetaObject
Replace it by a list. Task-number: PYSIDE-2524 Change-Id: I16089a2f53f10726377f4ed66bc466549f4f6474 Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org> Reviewed-by: Shyamnath Premnadh <Shyamnath.Premnadh@qt.io>
Diffstat (limited to 'sources/pyside6/libpyside/pysidesignal.cpp')
-rw-r--r--sources/pyside6/libpyside/pysidesignal.cpp29
1 files changed, 19 insertions, 10 deletions
diff --git a/sources/pyside6/libpyside/pysidesignal.cpp b/sources/pyside6/libpyside/pysidesignal.cpp
index 4039aaffe..16e7b8411 100644
--- a/sources/pyside6/libpyside/pysidesignal.cpp
+++ b/sources/pyside6/libpyside/pysidesignal.cpp
@@ -1109,36 +1109,45 @@ static PyObject *buildQtCompatible(const QByteArray &signature)
void registerSignals(PyTypeObject *pyObj, const QMetaObject *metaObject)
{
using Signature = PySideSignalData::Signature;
- using SignalSigMap = QHash<QByteArray, QList<Signature>>;
- SignalSigMap signalsFound;
+ struct MetaSignal
+ {
+ QByteArray methodName;
+ QList<Signature> signatures;
+ };
+
+ QList<MetaSignal> signalsFound;
for (int i = metaObject->methodOffset(), max = metaObject->methodCount(); i < max; ++i) {
QMetaMethod method = metaObject->method(i);
if (method.methodType() == QMetaMethod::Signal) {
QByteArray methodName(method.methodSignature());
- methodName.chop(methodName.size() - methodName.indexOf('('));
+ methodName.truncate(methodName.indexOf('('));
Signature signature{method.parameterTypes().join(','), {},
short(method.parameterCount())};
if (method.attributes() & QMetaMethod::Cloned)
signature.attributes = QMetaMethod::Cloned;
- signalsFound[methodName] << signature;
+ auto it = std::find_if(signalsFound.begin(), signalsFound.end(),
+ [methodName](const MetaSignal &ms)
+ { return ms.methodName == methodName; });
+ if (it != signalsFound.end())
+ it->signatures << signature;
+ else
+ signalsFound.append(MetaSignal{methodName, {signature}});
}
}
- SignalSigMap::Iterator it = signalsFound.begin();
- SignalSigMap::Iterator end = signalsFound.end();
- for (; it != end; ++it) {
+ for (const auto &metaSignal : std::as_const(signalsFound)) {
PySideSignal *self = PyObject_New(PySideSignal, PySideSignal_TypeF());
self->data = new PySideSignalData;
- self->data->signalName = it.key();
+ self->data->signalName = metaSignal.methodName;
self->homonymousMethod = nullptr;
// Empty signatures comes first! So they will be the default signal signature
- self->data->signatures = it.value();
+ self->data->signatures = metaSignal.signatures;
std::stable_sort(self->data->signatures.begin(),
self->data->signatures.end(), &compareSignals);
- _addSignalToWrapper(pyObj, it.key(), self);
+ _addSignalToWrapper(pyObj, metaSignal.methodName, self);
Py_DECREF(reinterpret_cast<PyObject *>(self));
}
}