summaryrefslogtreecommitdiffstats
path: root/src/corelib/kernel/qmetaobject.cpp
diff options
context:
space:
mode:
authorAhmad Samir <a.samirh78@gmail.com>2025-09-26 16:26:04 +0300
committerAhmad Samir <a.samirh78@gmail.com>2025-10-02 01:40:08 +0300
commit15b1bd2c819996321dd8e76f5e7be5a9dc670f58 (patch)
treec53d5e9f51bcd3fdc9a1cc29a9c9c00760821738 /src/corelib/kernel/qmetaobject.cpp
parent0090ad0fa442de91fb87486baa951511eae0c399 (diff)
QMetaObjectPrivate: refactor indexOfMethodRelative()
As requested in code review, use QMetaMethod::MethodType enum instead of QMocConstants::MethodFlags, to specify which type to search for; MethodFlags has many more irrelevant enumerators wrt. this function. Make it a regular function instead of a template; take the type to search for as a parameter. Use a switch-statement instead of ternaries, for better readability. Change-Id: I699b2a146019b9f4cd4fb5441de6cae151ecce78 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Diffstat (limited to 'src/corelib/kernel/qmetaobject.cpp')
-rw-r--r--src/corelib/kernel/qmetaobject.cpp44
1 files changed, 29 insertions, 15 deletions
diff --git a/src/corelib/kernel/qmetaobject.cpp b/src/corelib/kernel/qmetaobject.cpp
index 221e84c65d3..e6b0b9043c7 100644
--- a/src/corelib/kernel/qmetaobject.cpp
+++ b/src/corelib/kernel/qmetaobject.cpp
@@ -704,22 +704,36 @@ QMetaMethod QMetaObjectPrivate::firstMethod(const QMetaObject *baseObject, QByte
}
/**
-* \internal
-* helper function for indexOf{Method,Slot,Signal}, returns the relative index of the method within
-* the baseObject
-* \a MethodType might be MethodSignal or MethodSlot, or \nullptr to match everything.
+ \internal
+ Helper function for indexOf{Method,Slot,Signal}, returns the relative index
+ of the method within \a baseObject.
+
+ If \a what is QMetaMethod::Method it will search all functions registered for
+ \a baseobject.
*/
-template<int MethodType>
inline int QMetaObjectPrivate::indexOfMethodRelative(const QMetaObject **baseObject,
QByteArrayView name,
- QSpan<const QArgumentType> types)
+ QSpan<const QArgumentType> types,
+ QMetaMethod::MethodType what)
{
for (const QMetaObject *m = *baseObject; m; m = m->d.superdata) {
Q_ASSERT(priv(m->d.data)->revision >= 7);
- int i = (MethodType == MethodSignal)
- ? (priv(m->d.data)->signalCount - 1) : (priv(m->d.data)->methodCount - 1);
- const int end = (MethodType == MethodSlot)
- ? (priv(m->d.data)->signalCount) : 0;
+ int i = 0;
+ int end = 0;
+ switch (what) {
+ case QMetaMethod::Signal:
+ i = priv(m->d.data)->signalCount - 1;
+ break;
+ case QMetaMethod::Slot:
+ i = priv(m->d.data)->methodCount - 1;
+ end = priv(m->d.data)->signalCount;
+ break;
+ case QMetaMethod::Method:
+ i = priv(m->d.data)->methodCount - 1;
+ break;
+ case QMetaMethod::Constructor:
+ Q_UNREACHABLE_RETURN(-1);
+ }
for (; i >= end; --i) {
auto data = QMetaMethod::fromRelativeMethodIndex(m, i);
@@ -868,7 +882,7 @@ int QMetaObjectPrivate::indexOfSignalRelative(const QMetaObject **baseObject,
QByteArrayView name,
QSpan<const QArgumentType> types)
{
- int i = indexOfMethodRelative<MethodSignal>(baseObject, name, types);
+ int i = indexOfMethodRelative(baseObject, name, types, QMetaMethod::Signal);
#ifndef QT_NO_DEBUG
const QMetaObject *m = *baseObject;
if (i >= 0 && m && m->d.superdata) {
@@ -917,7 +931,7 @@ int QMetaObjectPrivate::indexOfSlotRelative(const QMetaObject **m,
QByteArrayView name,
QSpan<const QArgumentType> types)
{
- return indexOfMethodRelative<MethodSlot>(m, name, types);
+ return indexOfMethodRelative(m, name, types, QMetaMethod::Slot);
}
int QMetaObjectPrivate::indexOfSignal(const QMetaObject *m, QByteArrayView name,
@@ -941,7 +955,7 @@ int QMetaObjectPrivate::indexOfSlot(const QMetaObject *m, QByteArrayView name,
int QMetaObjectPrivate::indexOfMethod(const QMetaObject *m, QByteArrayView name,
QSpan<const QArgumentType> types)
{
- int i = indexOfMethodRelative<0>(&m, name, types);
+ int i = indexOfMethodRelative(&m, name, types, QMetaMethod::Method);
if (i >= 0)
i += m->methodOffset();
return i;
@@ -4258,12 +4272,12 @@ int QMetaProperty::notifySignalIndex() const
const QByteArrayView signalName = stringDataView(mobj, methodIndex);
const QMetaObject *m = mobj;
// try 0-arg signal
- int idx = QMetaObjectPrivate::indexOfMethodRelative<MethodSignal>(&m, signalName, {});
+ int idx = QMetaObjectPrivate::indexOfMethodRelative(&m, signalName, {}, QMetaMethod::Signal);
if (idx >= 0)
return idx + m->methodOffset();
// try 1-arg signal
QArgumentType argType[] = {metaType()};
- idx = QMetaObjectPrivate::indexOfMethodRelative<MethodSignal>(&m, signalName, argType);
+ idx = QMetaObjectPrivate::indexOfMethodRelative(&m, signalName, argType, QMetaMethod::Signal);
if (idx >= 0)
return idx + m->methodOffset();
qWarning("QMetaProperty::notifySignal: cannot find the NOTIFY signal %s in class %s for property '%s'",