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:
parent
23b998fa45
commit
9ba0715f08
@ -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;
|
||||
|
@ -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"
|
||||
|
Loading…
Reference in New Issue
Block a user