diff options
author | Liang Qi <liang.qi@theqtcompany.com> | 2015-10-23 14:01:35 +0200 |
---|---|---|
committer | Oswald Buddenhagen <oswald.buddenhagen@theqtcompany.com> | 2015-10-23 14:45:03 +0200 |
commit | 790aef362fd195adf97d8c780a7cbbbade27d51f (patch) | |
tree | 8be464687ab21806cfe9f7ada27098b563aa41b2 /src/corelib/statemachine/qabstracttransition.cpp | |
parent | 9720efbd1035c2e939b0581163e6d804c713dd96 (diff) | |
parent | 07475c662eb73c833da2d461b8ef2702ca1e2cfb (diff) |
Merge remote-tracking branch 'origin/5.6' into dev
Conflicts:
.qmake.conf
configure
src/corelib/global/qglobal.h
src/tools/qdoc/node.cpp
src/tools/qdoc/qdocdatabase.cpp
tests/auto/corelib/io/qsettings/tst_qsettings.cpp
tools/configure/configureapp.cpp
Change-Id: I66028ae5e441a06b73ee85ba72a03a3af3e8593f
Diffstat (limited to 'src/corelib/statemachine/qabstracttransition.cpp')
-rw-r--r-- | src/corelib/statemachine/qabstracttransition.cpp | 51 |
1 files changed, 40 insertions, 11 deletions
diff --git a/src/corelib/statemachine/qabstracttransition.cpp b/src/corelib/statemachine/qabstracttransition.cpp index 5a7a95883b..56f2a15fdb 100644 --- a/src/corelib/statemachine/qabstracttransition.cpp +++ b/src/corelib/statemachine/qabstracttransition.cpp @@ -252,26 +252,55 @@ QList<QAbstractState*> QAbstractTransition::targetStates() const void QAbstractTransition::setTargetStates(const QList<QAbstractState*> &targets) { Q_D(QAbstractTransition); - QVector<QPointer<QAbstractState> > copy(d->targetStates); - bool sameList = true; + + // Verify if any of the new target states is a null-pointer: for (int i = 0; i < targets.size(); ++i) { - QAbstractState *target = targets.at(i); - if (!target) { + if (targets.at(i) == Q_NULLPTR) { qWarning("QAbstractTransition::setTargetStates: target state(s) cannot be null"); return; + } + } + + // First clean out any target states that got destroyed, but for which we still have a QPointer + // around. + for (int i = 0; i < d->targetStates.size(); ) { + if (d->targetStates.at(i).isNull()) { + d->targetStates.remove(i); } else { - sameList &= copy.removeOne(target); + ++i; + } + } + + // Easy check: if both lists are empty, we're done. + if (targets.isEmpty() && d->targetStates.isEmpty()) + return; + + bool sameList = true; + + if (targets.size() != d->targetStates.size()) { + // If the sizes of the lists are different, we don't need to be smart: they're different. So + // we can just set the new list as the targetStates. + sameList = false; + } else { + QVector<QPointer<QAbstractState> > copy(d->targetStates); + for (int i = 0; i < targets.size(); ++i) { + sameList &= copy.removeOne(targets.at(i)); + if (!sameList) + break; // ok, we now know the lists are not the same, so stop the loop. } + + sameList &= copy.isEmpty(); } - sameList &= copy.isEmpty(); + if (sameList) + return; - d->targetStates.clear(); - for (int i = 0; i < targets.size(); ++i) - d->targetStates.append(targets.at(i)); + d->targetStates.resize(targets.size()); + for (int i = 0; i < targets.size(); ++i) { + d->targetStates[i] = targets.at(i); + } - if (!sameList) - emit targetStatesChanged(QPrivateSignal()); + emit targetStatesChanged(QPrivateSignal()); } /*! |