QFuture: the result type doesn't have to be a default-constructible

Added asserts to insure the invariant declared in the documentation.
Canceled future object is not valid, hence we don't need to handle
this case separately.

Fixes: QTBUG-83389
Change-Id: Ib0653ef40cd3135574a91740e4ce2c6dc4da8a71
Reviewed-by: Sona Kurazyan <sona.kurazyan@qt.io>
Reviewed-by: Timur Pocheptsov <timur.pocheptsov@qt.io>
This commit is contained in:
Vitaly Fanaskov 2020-04-14 12:51:14 +02:00
parent 23b998fa45
commit 9ba0715f08
2 changed files with 39 additions and 13 deletions

View File

@ -339,13 +339,8 @@ inline QList<T> QFutureInterface<T>::results()
template<typename T>
T QFutureInterface<T>::takeResult()
{
if (isCanceled()) {
exceptionStore().throwPossibleException();
return {};
}
Q_ASSERT(isValid());
if (!isValid())
return {};
// Note: we wait for all, this is intentional,
// not to mess with other unready results.
waitForResult(-1);
@ -362,13 +357,7 @@ T QFutureInterface<T>::takeResult()
template<typename T>
std::vector<T> QFutureInterface<T>::takeResults()
{
if (isCanceled()) {
exceptionStore().throwPossibleException();
return {};
}
if (!isValid())
return {};
Q_ASSERT(isValid());
waitForResult(-1);
std::vector<T> res;

View File

@ -116,6 +116,8 @@ private slots:
void runAndTake();
void resultsReadyAt_data();
void resultsReadyAt();
void takeResultWorksForTypesWithoutDefaultCtor();
void canceledFutureIsNotValid();
private:
using size_type = std::vector<int>::size_type;
@ -2744,5 +2746,40 @@ void tst_QFuture::resultsReadyAt()
QCOMPARE(taken, 0b1111);
}
template <class T>
auto makeFutureInterface(T &&result)
{
QFutureInterface<T> f;
f.reportStarted();
f.reportResult(std::forward<T>(result));
f.reportFinished();
return f;
}
void tst_QFuture::takeResultWorksForTypesWithoutDefaultCtor()
{
struct Foo
{
Foo() = delete;
explicit Foo(int i) : _i(i) {}
int _i = -1;
};
auto f = makeFutureInterface(Foo(42));
QCOMPARE(f.takeResult()._i, 42);
}
void tst_QFuture::canceledFutureIsNotValid()
{
auto f = makeFutureInterface(42);
f.cancel();
QVERIFY(!f.isValid());
}
QTEST_MAIN(tst_QFuture)
#include "tst_qfuture.moc"