diff options
author | Marc Mutz <marc.mutz@kdab.com> | 2015-06-14 01:54:13 +0200 |
---|---|---|
committer | Marc Mutz <marc.mutz@kdab.com> | 2015-07-13 10:36:28 +0000 |
commit | a89c62c17d9c7db6548616789c7b20759680e6a0 (patch) | |
tree | 6bfd7e907413d9d7a8549b8b60bda1d1bb0e8e9e /src | |
parent | fa4b57e8c5a82cb1e16c44a3c170850cb6bb6f24 (diff) |
QStateMachinePrivate: replace an inefficient QList with QVector
QPropertyAssignment is larger as a void*, and wasn't marked as
movable, so QList<QPropertyAssignment> is horribly inefficient.
Fix by marking it movable and using a QVector.
Change-Id: I34e21e3f28f64dd8b187c144fb5bee022414216b
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Reviewed-by: Olivier Goffart (Woboq GmbH) <ogoffart@woboq.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/corelib/statemachine/qstate_p.h | 3 | ||||
-rw-r--r-- | src/corelib/statemachine/qstatemachine.cpp | 32 | ||||
-rw-r--r-- | src/corelib/statemachine/qstatemachine_p.h | 12 |
3 files changed, 24 insertions, 23 deletions
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<QAbstractTransition*> transitionsList; #ifndef QT_NO_PROPERTIES - QList<QPropertyAssignment> propertyAssignments; + QVector<QPropertyAssignment> 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<QAbstractTransit qDebug() << q_func() << ": computed entry set:" << enteredStates; #endif - QHash<QAbstractState*, QList<QPropertyAssignment> > assignmentsForEnteredStates = + QHash<QAbstractState*, QVector<QPropertyAssignment> > assignmentsForEnteredStates = computePropertyAssignments(enteredStates, pendingRestorables); if (!pendingRestorables.isEmpty()) { // Add "implicit" assignments for restored properties to the first @@ -784,7 +784,7 @@ QSet<QAbstractState*> QStateMachinePrivate::computeExitSet_Unordered(QAbstractTr } void QStateMachinePrivate::exitStates(QEvent *event, const QList<QAbstractState*> &statesToExit_sorted, - const QHash<QAbstractState*, QList<QPropertyAssignment> > &assignmentsForEnteredStates) + const QHash<QAbstractState*, QVector<QPropertyAssignment> > &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<QAbstractState*> &exitedStates_sorted, const QList<QAbstractState*> &statesToEnter_sorted, const QSet<QAbstractState*> &statesForDefaultEntry, - QHash<QAbstractState*, QList<QPropertyAssignment> > &propertyAssignmentsForState + QHash<QAbstractState*, QVector<QPropertyAssignment> > &propertyAssignmentsForState #ifndef QT_NO_ANIMATION , const QList<QAbstractAnimation *> &selectedAnimations #endif @@ -955,7 +955,7 @@ void QStateMachinePrivate::enterStates(QEvent *event, const QList<QAbstractState // Immediately set the properties that are not animated. { - QList<QPropertyAssignment> assignments = propertyAssignmentsForState.value(s); + QVector<QPropertyAssignment> 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<QAbstractState *> & } } -QList<QPropertyAssignment> QStateMachinePrivate::restorablesToPropertyList(const QHash<RestorableId, QVariant> &restorables) const +QVector<QPropertyAssignment> QStateMachinePrivate::restorablesToPropertyList(const QHash<RestorableId, QVariant> &restorables) const { - QList<QPropertyAssignment> result; + QVector<QPropertyAssignment> result; QHash<RestorableId, QVariant>::const_iterator it; for (it = restorables.constBegin(); it != restorables.constEnd(); ++it) { const RestorableId &id = it.key(); @@ -1459,16 +1459,16 @@ QHash<QStateMachinePrivate::RestorableId, QVariant> QStateMachinePrivate::comput properties that should not be restored because they are assigned by an entered state). */ -QHash<QAbstractState*, QList<QPropertyAssignment> > QStateMachinePrivate::computePropertyAssignments( +QHash<QAbstractState*, QVector<QPropertyAssignment> > QStateMachinePrivate::computePropertyAssignments( const QList<QAbstractState*> &statesToEnter_sorted, QHash<RestorableId, QVariant> &pendingRestorables) const { - QHash<QAbstractState*, QList<QPropertyAssignment> > assignmentsForState; + QHash<QAbstractState*, QVector<QPropertyAssignment> > assignmentsForState; for (int i = 0; i < statesToEnter_sorted.size(); ++i) { QState *s = toStandardState(statesToEnter_sorted.at(i)); if (!s) continue; - QList<QPropertyAssignment> &assignments = QStatePrivate::get(s)->propertyAssignments; + QVector<QPropertyAssignment> &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<QAbstractAnimation *> QStateMachinePrivate::selectAnimations(const QList<Q } void QStateMachinePrivate::terminateActiveAnimations(QAbstractState *state, - const QHash<QAbstractState*, QList<QPropertyAssignment> > &assignmentsForEnteredStates) + const QHash<QAbstractState*, QVector<QPropertyAssignment> > &assignmentsForEnteredStates) { Q_Q(QStateMachine); QList<QAbstractAnimation*> 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<QAbstractState*, QList<QPropertyAssignment> >::const_iterator it; + QHash<QAbstractState*, QVector<QPropertyAssignment> >::const_iterator it; for (it = assignmentsForEnteredStates.constBegin(); it != assignmentsForEnteredStates.constEnd(); ++it) { - const QList<QPropertyAssignment> &assignments = it.value(); + const QVector<QPropertyAssignment> &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<QAbstractAnimation *> &selectedAnimations, const QList<QAbstractState*> &exitedStates_sorted, - QHash<QAbstractState*, QList<QPropertyAssignment> > &assignmentsForEnteredStates) + QHash<QAbstractState*, QVector<QPropertyAssignment> > &assignmentsForEnteredStates) { Q_Q(QStateMachine); if (!assignmentsForEnteredStates.contains(state)) return; - QList<QPropertyAssignment> &assignments = assignmentsForEnteredStates[state]; + QVector<QPropertyAssignment> &assignments = assignmentsForEnteredStates[state]; for (int i = 0; i < selectedAnimations.size(); ++i) { QAbstractAnimation *anim = selectedAnimations.at(i); - QList<QPropertyAssignment>::iterator it; + QVector<QPropertyAssignment>::iterator it; for (it = assignments.begin(); it != assignments.end(); ) { QPair<QList<QAbstractAnimation*>, QList<QAbstractAnimation*> > ret; const QPropertyAssignment &assn = *it; @@ -1853,7 +1853,7 @@ void QStateMachinePrivate::_q_start() QSet<QAbstractState*> statesForDefaultEntry; QList<QAbstractState*> enteredStates = computeEntrySet(transitions, statesForDefaultEntry, &calculationCache); QHash<RestorableId, QVariant> pendingRestorables; - QHash<QAbstractState*, QList<QPropertyAssignment> > assignmentsForEnteredStates = + QHash<QAbstractState*, QVector<QPropertyAssignment> > assignmentsForEnteredStates = computePropertyAssignments(enteredStates, pendingRestorables); #ifndef QT_NO_ANIMATION QList<QAbstractAnimation*> 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<QAbstractState *> &statesToExit_sorted, - const QHash<QAbstractState*, QList<QPropertyAssignment> > &assignmentsForEnteredStates); + const QHash<QAbstractState*, QVector<QPropertyAssignment> > &assignmentsForEnteredStates); QList<QAbstractState*> computeExitSet(const QList<QAbstractTransition*> &enabledTransitions, CalculationCache *cache); QSet<QAbstractState*> computeExitSet_Unordered(const QList<QAbstractTransition*> &enabledTransitions, CalculationCache *cache); QSet<QAbstractState*> computeExitSet_Unordered(QAbstractTransition *t, CalculationCache *cache); @@ -142,7 +142,7 @@ public: void enterStates(QEvent *event, const QList<QAbstractState*> &exitedStates_sorted, const QList<QAbstractState*> &statesToEnter_sorted, const QSet<QAbstractState*> &statesForDefaultEntry, - QHash<QAbstractState *, QList<QPropertyAssignment> > &propertyAssignmentsForState + QHash<QAbstractState *, QVector<QPropertyAssignment> > &propertyAssignmentsForState #ifndef QT_NO_ANIMATION , const QList<QAbstractAnimation*> &selectedAnimations #endif @@ -233,9 +233,9 @@ public: const QVariant &value); void unregisterRestorables(const QList<QAbstractState*> &states, QObject *object, const QByteArray &propertyName); - QList<QPropertyAssignment> restorablesToPropertyList(const QHash<RestorableId, QVariant> &restorables) const; + QVector<QPropertyAssignment> restorablesToPropertyList(const QHash<RestorableId, QVariant> &restorables) const; QHash<RestorableId, QVariant> computePendingRestorables(const QList<QAbstractState*> &statesToExit_sorted) const; - QHash<QAbstractState*, QList<QPropertyAssignment> > computePropertyAssignments( + QHash<QAbstractState*, QVector<QPropertyAssignment> > computePropertyAssignments( const QList<QAbstractState*> &statesToEnter_sorted, QHash<RestorableId, QVariant> &pendingRestorables) const; #endif @@ -276,10 +276,10 @@ public: QList<QAbstractAnimation *> selectAnimations(const QList<QAbstractTransition *> &transitionList) const; void terminateActiveAnimations(QAbstractState *state, - const QHash<QAbstractState*, QList<QPropertyAssignment> > &assignmentsForEnteredStates); + const QHash<QAbstractState*, QVector<QPropertyAssignment> > &assignmentsForEnteredStates); void initializeAnimations(QAbstractState *state, const QList<QAbstractAnimation*> &selectedAnimations, const QList<QAbstractState *> &exitedStates_sorted, - QHash<QAbstractState *, QList<QPropertyAssignment> > &assignmentsForEnteredStates); + QHash<QAbstractState *, QVector<QPropertyAssignment> > &assignmentsForEnteredStates); #endif // QT_NO_ANIMATION QSignalEventGenerator *signalEventGenerator; |