From a89c62c17d9c7db6548616789c7b20759680e6a0 Mon Sep 17 00:00:00 2001 From: Marc Mutz Date: Sun, 14 Jun 2015 01:54:13 +0200 Subject: QStateMachinePrivate: replace an inefficient QList with QVector QPropertyAssignment is larger as a void*, and wasn't marked as movable, so QList is horribly inefficient. Fix by marking it movable and using a QVector. Change-Id: I34e21e3f28f64dd8b187c144fb5bee022414216b Reviewed-by: Thiago Macieira Reviewed-by: Olivier Goffart (Woboq GmbH) --- src/corelib/statemachine/qstate_p.h | 3 ++- src/corelib/statemachine/qstatemachine.cpp | 32 +++++++++++++++--------------- src/corelib/statemachine/qstatemachine_p.h | 12 +++++------ 3 files changed, 24 insertions(+), 23 deletions(-) (limited to 'src/corelib/statemachine') diff --git a/src/corelib/statemachine/qstate_p.h b/src/corelib/statemachine/qstate_p.h index 2ce0c13522..3b8dae9499 100644 --- a/src/corelib/statemachine/qstate_p.h +++ b/src/corelib/statemachine/qstate_p.h @@ -75,6 +75,7 @@ struct QPropertyAssignment QVariant value; bool explicitlySet; // false means the property is being restored to its old value }; +Q_DECLARE_TYPEINFO(QPropertyAssignment, Q_MOVABLE_TYPE); #endif // QT_NO_PROPERTIES @@ -108,7 +109,7 @@ public: mutable QList transitionsList; #ifndef QT_NO_PROPERTIES - QList propertyAssignments; + QVector propertyAssignments; #endif }; diff --git a/src/corelib/statemachine/qstatemachine.cpp b/src/corelib/statemachine/qstatemachine.cpp index c25a6eb5bf..d1a98d96f5 100644 --- a/src/corelib/statemachine/qstatemachine.cpp +++ b/src/corelib/statemachine/qstatemachine.cpp @@ -673,7 +673,7 @@ void QStateMachinePrivate::microstep(QEvent *event, const QList > assignmentsForEnteredStates = + QHash > assignmentsForEnteredStates = computePropertyAssignments(enteredStates, pendingRestorables); if (!pendingRestorables.isEmpty()) { // Add "implicit" assignments for restored properties to the first @@ -784,7 +784,7 @@ QSet QStateMachinePrivate::computeExitSet_Unordered(QAbstractTr } void QStateMachinePrivate::exitStates(QEvent *event, const QList &statesToExit_sorted, - const QHash > &assignmentsForEnteredStates) + const QHash > &assignmentsForEnteredStates) { for (int i = 0; i < statesToExit_sorted.size(); ++i) { QAbstractState *s = statesToExit_sorted.at(i); @@ -932,7 +932,7 @@ QAbstractState *QStateMachinePrivate::getTransitionDomain(QAbstractTransition *t void QStateMachinePrivate::enterStates(QEvent *event, const QList &exitedStates_sorted, const QList &statesToEnter_sorted, const QSet &statesForDefaultEntry, - QHash > &propertyAssignmentsForState + QHash > &propertyAssignmentsForState #ifndef QT_NO_ANIMATION , const QList &selectedAnimations #endif @@ -955,7 +955,7 @@ void QStateMachinePrivate::enterStates(QEvent *event, const QList assignments = propertyAssignmentsForState.value(s); + QVector assignments = propertyAssignmentsForState.value(s); for (int i = 0; i < assignments.size(); ++i) { const QPropertyAssignment &assn = assignments.at(i); if (globalRestorePolicy == QState::RestoreProperties) { @@ -1402,9 +1402,9 @@ void QStateMachinePrivate::unregisterRestorables(const QList & } } -QList QStateMachinePrivate::restorablesToPropertyList(const QHash &restorables) const +QVector QStateMachinePrivate::restorablesToPropertyList(const QHash &restorables) const { - QList result; + QVector result; QHash::const_iterator it; for (it = restorables.constBegin(); it != restorables.constEnd(); ++it) { const RestorableId &id = it.key(); @@ -1459,16 +1459,16 @@ QHash QStateMachinePrivate::comput properties that should not be restored because they are assigned by an entered state). */ -QHash > QStateMachinePrivate::computePropertyAssignments( +QHash > QStateMachinePrivate::computePropertyAssignments( const QList &statesToEnter_sorted, QHash &pendingRestorables) const { - QHash > assignmentsForState; + QHash > assignmentsForState; for (int i = 0; i < statesToEnter_sorted.size(); ++i) { QState *s = toStandardState(statesToEnter_sorted.at(i)); if (!s) continue; - QList &assignments = QStatePrivate::get(s)->propertyAssignments; + QVector &assignments = QStatePrivate::get(s)->propertyAssignments; for (int j = 0; j < assignments.size(); ++j) { const QPropertyAssignment &assn = assignments.at(j); if (assn.objectDeleted()) { @@ -1641,7 +1641,7 @@ QList QStateMachinePrivate::selectAnimations(const QList > &assignmentsForEnteredStates) + const QHash > &assignmentsForEnteredStates) { Q_Q(QStateMachine); QList animations = animationsForState.take(state); @@ -1666,9 +1666,9 @@ void QStateMachinePrivate::terminateActiveAnimations(QAbstractState *state, // If there is no property assignment that sets this property, // set the property to its target value. bool found = false; - QHash >::const_iterator it; + QHash >::const_iterator it; for (it = assignmentsForEnteredStates.constBegin(); it != assignmentsForEnteredStates.constEnd(); ++it) { - const QList &assignments = it.value(); + const QVector &assignments = it.value(); for (int j = 0; j < assignments.size(); ++j) { if (assignments.at(j).hasTarget(assn.object, assn.propertyName)) { found = true; @@ -1686,15 +1686,15 @@ void QStateMachinePrivate::terminateActiveAnimations(QAbstractState *state, void QStateMachinePrivate::initializeAnimations(QAbstractState *state, const QList &selectedAnimations, const QList &exitedStates_sorted, - QHash > &assignmentsForEnteredStates) + QHash > &assignmentsForEnteredStates) { Q_Q(QStateMachine); if (!assignmentsForEnteredStates.contains(state)) return; - QList &assignments = assignmentsForEnteredStates[state]; + QVector &assignments = assignmentsForEnteredStates[state]; for (int i = 0; i < selectedAnimations.size(); ++i) { QAbstractAnimation *anim = selectedAnimations.at(i); - QList::iterator it; + QVector::iterator it; for (it = assignments.begin(); it != assignments.end(); ) { QPair, QList > ret; const QPropertyAssignment &assn = *it; @@ -1853,7 +1853,7 @@ void QStateMachinePrivate::_q_start() QSet statesForDefaultEntry; QList enteredStates = computeEntrySet(transitions, statesForDefaultEntry, &calculationCache); QHash pendingRestorables; - QHash > assignmentsForEnteredStates = + QHash > assignmentsForEnteredStates = computePropertyAssignments(enteredStates, pendingRestorables); #ifndef QT_NO_ANIMATION QList selectedAnimations = selectAnimations(transitions); diff --git a/src/corelib/statemachine/qstatemachine_p.h b/src/corelib/statemachine/qstatemachine_p.h index 66b615bb31..34b084b610 100644 --- a/src/corelib/statemachine/qstatemachine_p.h +++ b/src/corelib/statemachine/qstatemachine_p.h @@ -134,7 +134,7 @@ public: virtual void beginMacrostep(); virtual void endMacrostep(bool didChange); void exitStates(QEvent *event, const QList &statesToExit_sorted, - const QHash > &assignmentsForEnteredStates); + const QHash > &assignmentsForEnteredStates); QList computeExitSet(const QList &enabledTransitions, CalculationCache *cache); QSet computeExitSet_Unordered(const QList &enabledTransitions, CalculationCache *cache); QSet computeExitSet_Unordered(QAbstractTransition *t, CalculationCache *cache); @@ -142,7 +142,7 @@ public: void enterStates(QEvent *event, const QList &exitedStates_sorted, const QList &statesToEnter_sorted, const QSet &statesForDefaultEntry, - QHash > &propertyAssignmentsForState + QHash > &propertyAssignmentsForState #ifndef QT_NO_ANIMATION , const QList &selectedAnimations #endif @@ -233,9 +233,9 @@ public: const QVariant &value); void unregisterRestorables(const QList &states, QObject *object, const QByteArray &propertyName); - QList restorablesToPropertyList(const QHash &restorables) const; + QVector restorablesToPropertyList(const QHash &restorables) const; QHash computePendingRestorables(const QList &statesToExit_sorted) const; - QHash > computePropertyAssignments( + QHash > computePropertyAssignments( const QList &statesToEnter_sorted, QHash &pendingRestorables) const; #endif @@ -276,10 +276,10 @@ public: QList selectAnimations(const QList &transitionList) const; void terminateActiveAnimations(QAbstractState *state, - const QHash > &assignmentsForEnteredStates); + const QHash > &assignmentsForEnteredStates); void initializeAnimations(QAbstractState *state, const QList &selectedAnimations, const QList &exitedStates_sorted, - QHash > &assignmentsForEnteredStates); + QHash > &assignmentsForEnteredStates); #endif // QT_NO_ANIMATION QSignalEventGenerator *signalEventGenerator; -- cgit v1.2.3