Mark ResultStoreBase as final

The class is not intended for inheriting from it (see also
e502906305), so we can mark it as final
to explicitly forbid this. The tests were still using it as a base
class to clean the results during destruction, so fix them accordingly.

Task-number: QTBUG-99883
Pick-to: 6.3
Change-Id: I4a7ee3e2b462bd704e4b5a95ed733144805d6e5b
Reviewed-by: Mårten Nordheim <marten.nordheim@qt.io>
Reviewed-by: Marc Mutz <marc.mutz@qt.io>
This commit is contained in:
Sona Kurazyan 2022-01-24 11:32:32 +01:00
parent 57402ffb9b
commit d1639da0d5
3 changed files with 147 additions and 56 deletions

View File

@ -122,7 +122,7 @@ public:
}
};
class Q_CORE_EXPORT ResultStoreBase
class Q_CORE_EXPORT ResultStoreBase final
{
public:
ResultStoreBase();

View File

@ -52,11 +52,6 @@
# undef interface
#endif
struct ResultStoreInt : QtPrivate::ResultStoreBase
{
~ResultStoreInt() { clear<int>(); }
};
class SenderObject : public QObject
{
Q_OBJECT
@ -209,6 +204,16 @@ private:
static void testTakeResults(QFuture<T> future, size_type resultCount);
};
class IntResultsCleaner
{
public:
IntResultsCleaner(QtPrivate::ResultStoreBase &s) : store(s) { }
~IntResultsCleaner() { store.clear<int>(); }
private:
QtPrivate::ResultStoreBase &store;
};
void tst_QFuture::resultStore()
{
int int0 = 0;
@ -216,7 +221,9 @@ void tst_QFuture::resultStore()
int int2 = 2;
{
ResultStoreInt store;
QtPrivate::ResultStoreBase store;
IntResultsCleaner cleanGuard(store);
QCOMPARE(store.begin(), store.end());
QCOMPARE(store.resultAt(0), store.end());
QCOMPARE(store.resultAt(1), store.end());
@ -224,7 +231,9 @@ void tst_QFuture::resultStore()
{
ResultStoreInt store;
QtPrivate::ResultStoreBase store;
IntResultsCleaner cleanGuard(store);
store.addResult(-1, &int0);
store.addResult(1, &int1);
QtPrivate::ResultIteratorBase it = store.begin();
@ -246,7 +255,9 @@ void tst_QFuture::resultStore()
QList<int> vec1 = QList<int>() << 4 << 5;
{
ResultStoreInt store;
QtPrivate::ResultStoreBase store;
IntResultsCleaner cleanGuard(store);
store.addResults(-1, &vec0, 2);
store.addResults(-1, &vec1, 2);
QtPrivate::ResultIteratorBase it = store.begin();
@ -269,7 +280,9 @@ void tst_QFuture::resultStore()
QCOMPARE(it, store.end());
}
{
ResultStoreInt store;
QtPrivate::ResultStoreBase store;
IntResultsCleaner cleanGuard(store);
store.addResult(-1, &int0);
store.addResults(-1, &vec1, 2);
store.addResult(-1, &int1);
@ -300,7 +313,9 @@ void tst_QFuture::resultStore()
QCOMPARE(store.resultAt(4), store.end());
}
{
ResultStoreInt store;
QtPrivate::ResultStoreBase store;
IntResultsCleaner cleanGuard(store);
store.addResult(-1, &int0);
store.addResults(-1, &vec0);
store.addResult(-1, &int1);
@ -330,7 +345,9 @@ void tst_QFuture::resultStore()
QCOMPARE(store.resultAt(3).value<int>(), int1);
}
{
ResultStoreInt store;
QtPrivate::ResultStoreBase store;
IntResultsCleaner cleanGuard(store);
store.addResult(-1, &int0);
store.addResults(-1, &vec0);
store.addResult(200, &int1);
@ -342,7 +359,9 @@ void tst_QFuture::resultStore()
}
{
ResultStoreInt store;
QtPrivate::ResultStoreBase store;
IntResultsCleaner cleanGuard(store);
store.addResult(1, &int1);
store.addResult(0, &int0);
store.addResult(-1, &int2);
@ -353,7 +372,9 @@ void tst_QFuture::resultStore()
}
{
ResultStoreInt store;
QtPrivate::ResultStoreBase store;
IntResultsCleaner cleanGuard(store);
QCOMPARE(store.contains(0), false);
QCOMPARE(store.contains(1), false);
QCOMPARE(store.contains(INT_MAX), false);
@ -361,7 +382,9 @@ void tst_QFuture::resultStore()
{
// Test filter mode, where "gaps" in the result array aren't allowed.
ResultStoreInt store;
QtPrivate::ResultStoreBase store;
IntResultsCleaner cleanGuard(store);
store.setFilterMode(true);
store.addResult(0, &int0);
@ -395,7 +418,9 @@ void tst_QFuture::resultStore()
{
// test canceled results
ResultStoreInt store;
QtPrivate::ResultStoreBase store;
IntResultsCleaner cleanGuard(store);
store.setFilterMode(true);
store.addResult(0, &int0);
@ -432,7 +457,9 @@ void tst_QFuture::resultStore()
{
// test addResult return value
ResultStoreInt store;
QtPrivate::ResultStoreBase store;
IntResultsCleaner cleanGuard(store);
store.setFilterMode(true);
store.addResult(0, &int0);
@ -478,7 +505,9 @@ void tst_QFuture::resultStore()
{
// test resultCount in non-filtered mode. It should always be possible
// to iterate through the results 0 to resultCount.
ResultStoreInt store;
QtPrivate::ResultStoreBase store;
IntResultsCleaner cleanGuard(store);
store.addResult(0, &int0);
QCOMPARE(store.count(), 1);
@ -492,7 +521,9 @@ void tst_QFuture::resultStore()
}
{
ResultStoreInt store;
QtPrivate::ResultStoreBase store;
IntResultsCleaner cleanGuard(store);
store.addResult(2, &int0);
QCOMPARE(store.count(), 0);
@ -504,7 +535,9 @@ void tst_QFuture::resultStore()
}
{
ResultStoreInt store;
QtPrivate::ResultStoreBase store;
IntResultsCleaner cleanGuard(store);
store.addResults(2, &vec1);
QCOMPARE(store.count(), 0);
@ -516,7 +549,9 @@ void tst_QFuture::resultStore()
}
{
ResultStoreInt store;
QtPrivate::ResultStoreBase store;
IntResultsCleaner cleanGuard(store);
store.addResults(2, &vec1);
QCOMPARE(store.count(), 0);
@ -524,7 +559,9 @@ void tst_QFuture::resultStore()
QCOMPARE(store.count(), 4);
}
{
ResultStoreInt store;
QtPrivate::ResultStoreBase store;
IntResultsCleaner cleanGuard(store);
store.addResults(3, &vec1);
QCOMPARE(store.count(), 0);
@ -536,7 +573,9 @@ void tst_QFuture::resultStore()
}
{
ResultStoreInt store;
QtPrivate::ResultStoreBase store;
IntResultsCleaner cleanGuard(store);
store.setFilterMode(true);
store.addResults(3, &vec1);
QCOMPARE(store.count(), 0);
@ -549,7 +588,9 @@ void tst_QFuture::resultStore()
}
{
ResultStoreInt store;
QtPrivate::ResultStoreBase store;
IntResultsCleaner cleanGuard(store);
store.setFilterMode(true);
store.addResults(3, &vec1);
QCOMPARE(store.count(), 0);
@ -559,7 +600,9 @@ void tst_QFuture::resultStore()
}
{
ResultStoreInt store;
QtPrivate::ResultStoreBase store;
IntResultsCleaner cleanGuard(store);
store.setFilterMode(true);
store.addResults(3, &vec1);
QCOMPARE(store.count(), 0);
@ -572,7 +615,9 @@ void tst_QFuture::resultStore()
}
{
ResultStoreInt store;
QtPrivate::ResultStoreBase store;
IntResultsCleaner cleanGuard(store);
store.addResult(1, &int0);
store.addResult(3, &int0);
store.addResults(6, &vec0);
@ -587,7 +632,9 @@ void tst_QFuture::resultStore()
}
{
ResultStoreInt store;
QtPrivate::ResultStoreBase store;
IntResultsCleaner cleanGuard(store);
store.setFilterMode(true);
store.addResult(1, &int0);
store.addResult(3, &int0);
@ -615,7 +662,9 @@ void tst_QFuture::resultStore()
QCOMPARE(store.contains(7), false);
}
{
ResultStoreInt store;
QtPrivate::ResultStoreBase store;
IntResultsCleaner cleanGuard(store);
store.setFilterMode(true);
store.addCanceledResult(0);
QCOMPARE(store.contains(0), false);

View File

@ -32,9 +32,14 @@
using namespace QtPrivate;
struct ResultStoreInt : ResultStoreBase
class IntResultsCleaner
{
~ResultStoreInt() { clear<int>(); }
public:
IntResultsCleaner(QtPrivate::ResultStoreBase &s) : store(s) { }
~IntResultsCleaner() { store.clear<int>(); }
private:
QtPrivate::ResultStoreBase &store;
};
class tst_QtConcurrentResultStore : public QObject
@ -87,7 +92,9 @@ void tst_QtConcurrentResultStore::iterators()
QCOMPARE(store.resultAt(1), store.end());
}
{
ResultStoreInt storebase;
QtPrivate::ResultStoreBase storebase;
IntResultsCleaner cleanGuard(storebase);
storebase.addResult(-1, &int0); // note to self: adding a pointer to the stack here is ok since
storebase.addResult(1, &int1); // ResultStoreBase does not take ownership, only ResultStore<> does.
ResultIteratorBase it = storebase.begin();
@ -110,7 +117,9 @@ void tst_QtConcurrentResultStore::addResult()
{
{
// test addResult return value
ResultStoreInt store;
QtPrivate::ResultStoreBase store;
IntResultsCleaner cleanGuard(store);
store.setFilterMode(true);
QCOMPARE(store.addResult(0, &int0), 0);
@ -156,7 +165,9 @@ void tst_QtConcurrentResultStore::addResult()
void tst_QtConcurrentResultStore::addResults()
{
ResultStoreInt store;
QtPrivate::ResultStoreBase store;
IntResultsCleaner cleanGuard(store);
store.addResults(-1, &vec0);
store.addResults(-1, &vec1);
ResultIteratorBase it = store.begin();
@ -189,7 +200,9 @@ void tst_QtConcurrentResultStore::addResults()
void tst_QtConcurrentResultStore::resultIndex()
{
ResultStoreInt store;
QtPrivate::ResultStoreBase store;
IntResultsCleaner cleanGuard(store);
store.addResult(-1, &int0);
store.addResults(-1, &vec0);
store.addResult(-1, &int1);
@ -222,7 +235,9 @@ void tst_QtConcurrentResultStore::resultIndex()
void tst_QtConcurrentResultStore::resultAt()
{
{
ResultStoreInt store;
QtPrivate::ResultStoreBase store;
IntResultsCleaner cleanGuard(store);
store.addResult(-1, &int0);
store.addResults(-1, &vec0);
store.addResult(200, &int1);
@ -233,7 +248,9 @@ void tst_QtConcurrentResultStore::resultAt()
QCOMPARE(store.resultAt(200).value<int>(), int1);
}
{
ResultStoreInt store;
QtPrivate::ResultStoreBase store;
IntResultsCleaner cleanGuard(store);
store.addResult(1, &int1);
store.addResult(0, &int0);
store.addResult(-1, &int2);
@ -247,7 +264,9 @@ void tst_QtConcurrentResultStore::resultAt()
void tst_QtConcurrentResultStore::contains()
{
{
ResultStoreInt store;
QtPrivate::ResultStoreBase store;
IntResultsCleaner cleanGuard(store);
QCOMPARE(store.contains(0), false);
QCOMPARE(store.contains(1), false);
QCOMPARE(store.contains(INT_MAX), false);
@ -259,7 +278,9 @@ void tst_QtConcurrentResultStore::contains()
QVERIFY(store.contains(int2));
}
{
ResultStoreInt store;
QtPrivate::ResultStoreBase store;
IntResultsCleaner cleanGuard(store);
store.addResult(1, &int0);
store.addResult(3, &int0);
store.addResults(6, &vec0);
@ -274,7 +295,9 @@ void tst_QtConcurrentResultStore::contains()
}
{
ResultStoreInt store;
QtPrivate::ResultStoreBase store;
IntResultsCleaner cleanGuard(store);
store.setFilterMode(true);
store.addResult(1, &int0);
store.addResult(3, &int0);
@ -302,7 +325,9 @@ void tst_QtConcurrentResultStore::contains()
QCOMPARE(store.contains(7), false);
}
{
ResultStoreInt store;
QtPrivate::ResultStoreBase store;
IntResultsCleaner cleanGuard(store);
store.setFilterMode(true);
store.addCanceledResult(0);
QCOMPARE(store.contains(0), false);
@ -316,7 +341,9 @@ void tst_QtConcurrentResultStore::contains()
void tst_QtConcurrentResultStore::filterMode()
{
// Test filter mode, where "gaps" in the result array aren't allowed.
ResultStoreInt store;
QtPrivate::ResultStoreBase store;
IntResultsCleaner cleanGuard(store);
QCOMPARE(store.filterMode(), false);
store.setFilterMode(true);
QVERIFY(store.filterMode());
@ -361,7 +388,9 @@ void tst_QtConcurrentResultStore::filterMode()
void tst_QtConcurrentResultStore::addCanceledResult()
{
// test canceled results
ResultStoreInt store;
QtPrivate::ResultStoreBase store;
IntResultsCleaner cleanGuard(store);
store.setFilterMode(true);
store.addResult(0, &int0);
@ -401,7 +430,9 @@ void tst_QtConcurrentResultStore::count()
{
// test resultCount in non-filtered mode. It should always be possible
// to iterate through the results 0 to resultCount.
ResultStoreInt store;
QtPrivate::ResultStoreBase store;
IntResultsCleaner cleanGuard(store);
store.addResult(0, &int0);
QCOMPARE(store.count(), 1);
@ -415,7 +446,9 @@ void tst_QtConcurrentResultStore::count()
}
{
ResultStoreInt store;
QtPrivate::ResultStoreBase store;
IntResultsCleaner cleanGuard(store);
store.addResult(2, &int0);
QCOMPARE(store.count(), 0);
@ -427,7 +460,9 @@ void tst_QtConcurrentResultStore::count()
}
{
ResultStoreInt store;
QtPrivate::ResultStoreBase store;
IntResultsCleaner cleanGuard(store);
store.addResults(2, &vec1);
QCOMPARE(store.count(), 0);
@ -439,7 +474,9 @@ void tst_QtConcurrentResultStore::count()
}
{
ResultStoreInt store;
QtPrivate::ResultStoreBase store;
IntResultsCleaner cleanGuard(store);
store.addResults(2, &vec1);
QCOMPARE(store.count(), 0);
@ -447,7 +484,9 @@ void tst_QtConcurrentResultStore::count()
QCOMPARE(store.count(), 4);
}
{
ResultStoreInt store;
QtPrivate::ResultStoreBase store;
IntResultsCleaner cleanGuard(store);
store.addResults(3, &vec1);
QCOMPARE(store.count(), 0);
@ -459,7 +498,9 @@ void tst_QtConcurrentResultStore::count()
}
{
ResultStoreInt store;
QtPrivate::ResultStoreBase store;
IntResultsCleaner cleanGuard(store);
store.setFilterMode(true);
store.addResults(3, &vec1);
QCOMPARE(store.count(), 0);
@ -472,7 +513,9 @@ void tst_QtConcurrentResultStore::count()
}
{
ResultStoreInt store;
QtPrivate::ResultStoreBase store;
IntResultsCleaner cleanGuard(store);
store.setFilterMode(true);
store.addResults(3, &vec1);
QCOMPARE(store.count(), 0);
@ -482,7 +525,9 @@ void tst_QtConcurrentResultStore::count()
}
{
ResultStoreInt store;
QtPrivate::ResultStoreBase store;
IntResultsCleaner cleanGuard(store);
store.setFilterMode(true);
store.addResults(3, &vec1);
QCOMPARE(store.count(), 0);
@ -535,11 +580,6 @@ struct CountedObject
size_t CountedObject::liveCount = 0;
struct ResultStoreCountedObject : ResultStoreBase
{
~ResultStoreCountedObject() { clear<CountedObject>(); }
};
void tst_QtConcurrentResultStore::pendingResultsDoNotLeak_data()
{
QTest::addColumn<bool>("filterMode");
@ -553,7 +593,9 @@ void tst_QtConcurrentResultStore::pendingResultsDoNotLeak()
QFETCH(bool, filterMode);
CountedObject::LeakChecker leakChecker; Q_UNUSED(leakChecker)
ResultStoreCountedObject store;
QtPrivate::ResultStoreBase store;
auto cleanGaurd = qScopeGuard([&] { store.clear<CountedObject>(); });
store.setFilterMode(filterMode);
// lvalue