diff options
author | Jarek Kobus <jaroslaw.kobus@qt.io> | 2019-05-27 17:45:39 +0200 |
---|---|---|
committer | Jarek Kobus <jaroslaw.kobus@qt.io> | 2019-05-29 14:33:01 +0200 |
commit | 0f51d6a228b1d042b8ffc1f9436c7d253a454345 (patch) | |
tree | 27e1812abb62b7164269798d5406345fd9d839bf | |
parent | fba55184b93e8f084b45716162581a6132fe94cc (diff) |
Optimize connectToState() method
Introduce a cache of state name to signal index and use
it in connectToStateImpl.
Change-Id: I75af2b77b12d6e087163612f3ba10590a14fd9e2
Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
-rw-r--r-- | src/scxml/qscxmlstatemachine.cpp | 8 | ||||
-rw-r--r-- | src/scxml/qscxmlstatemachine_p.h | 1 |
2 files changed, 7 insertions, 2 deletions
diff --git a/src/scxml/qscxmlstatemachine.cpp b/src/scxml/qscxmlstatemachine.cpp index 8c9e6d4..23f8a71 100644 --- a/src/scxml/qscxmlstatemachine.cpp +++ b/src/scxml/qscxmlstatemachine.cpp @@ -768,6 +768,7 @@ void QScxmlStateMachinePrivate::attach(QScxmlStateMachineInfo *info) void QScxmlStateMachinePrivate::updateMetaCache() { m_stateIndexToSignalIndex.clear(); + m_stateNameToSignalIndex.clear(); if (!m_tableData) return; @@ -776,10 +777,14 @@ void QScxmlStateMachinePrivate::updateMetaCache() return; int signalIndex = 0; + const int methodOffset = QMetaObjectPrivate::signalOffset(m_metaObject); for (int i = 0; i < m_stateTable->stateCount; ++i) { const auto &s = m_stateTable->state(i); if (!s.isHistoryState() && s.type != StateTable::State::Invalid) { m_stateIndexToSignalIndex.insert(i, signalIndex); + m_stateNameToSignalIndex.insert(m_tableData->string(s.name), + signalIndex + methodOffset); + ++signalIndex; } } @@ -1909,8 +1914,7 @@ QMetaObject::Connection QScxmlStateMachine::connectToStateImpl(const QString &sc types = QtPrivate::ConnectionTypes<QtPrivate::List<bool> >::types(); Q_D(QScxmlStateMachine); - int signalIndex = QScxmlInternal::signalIndex(d->m_metaObject, - scxmlStateName.toUtf8() + "Changed(bool)"); + const int signalIndex = d->m_stateNameToSignalIndex.value(scxmlStateName); return signalIndex < 0 ? QMetaObject::Connection() : QObjectPrivate::connectImpl(this, signalIndex, receiver, slot, slotObj, type, types, d->m_metaObject); diff --git a/src/scxml/qscxmlstatemachine_p.h b/src/scxml/qscxmlstatemachine_p.h index aa08f1c..1c354fa 100644 --- a/src/scxml/qscxmlstatemachine_p.h +++ b/src/scxml/qscxmlstatemachine_p.h @@ -382,6 +382,7 @@ private: QScxmlInternal::StateMachineInfoProxy *m_infoSignalProxy; QHash<int, int> m_stateIndexToSignalIndex; + QHash<QString, int> m_stateNameToSignalIndex; }; QT_END_NAMESPACE |