Temporarily disable QFuture::takeResult() method

QFuture::takeResult() currently returns std::vector instead of QList,
because QList does not support move-only types. Disable this method
until QList is fixed to work with move-only types in Qt 6.1.

Also did minor doc-fixes.

Change-Id: I87feaf75d9433a3b540edd00039c3e21d6994985
Reviewed-by: Lars Knoll <lars.knoll@qt.io>
Reviewed-by: Timur Pocheptsov <timur.pocheptsov@qt.io>
This commit is contained in:
Sona Kurazyan 2020-10-09 14:34:08 +02:00
parent 4897aa8b5f
commit 3d040267f4
4 changed files with 48 additions and 25 deletions

View File

@ -163,8 +163,11 @@ QT_WARNING_POP
template<typename U = T, typename = QtPrivate::EnableForNonVoid<U>> template<typename U = T, typename = QtPrivate::EnableForNonVoid<U>>
T takeResult() { return d.takeResult(); } T takeResult() { return d.takeResult(); }
#if 0
// TODO: Enable and make it return a QList, when QList is fixed to support move-only types
template<typename U = T, typename = QtPrivate::EnableForNonVoid<U>> template<typename U = T, typename = QtPrivate::EnableForNonVoid<U>>
std::vector<T> takeResults() { return d.takeResults(); } std::vector<T> takeResults() { return d.takeResults(); }
#endif
bool isValid() const { return d.isValid(); } bool isValid() const { return d.isValid(); }

View File

@ -39,15 +39,14 @@
which will be ready at a later point in time. The result can be of any type which will be ready at a later point in time. The result can be of any type
that has default, copy and possibly move constructors. If that has default, copy and possibly move constructors. If
a result is not available at the time of calling the result(), resultAt(), a result is not available at the time of calling the result(), resultAt(),
results(), takeResult(), or takeResults() functions, QFuture results() and takeResult() functions, QFuture will wait until the result
will wait until the result becomes available. You can use the isResultReadyAt() becomes available. You can use the isResultReadyAt() function to determine
function to determine if a result is ready or not. For QFuture objects that if a result is ready or not. For QFuture objects that report more than one
report more than one result, the resultCount() function returns the number result, the resultCount() function returns the number of continuous results.
of continuous results. This means that it is always safe to iterate through This means that it is always safe to iterate through the results from 0 to
the results from 0 to resultCount(). takeResult() and takeResults() resultCount(). takeResult() invalidates a future, and any subsequent attempt
invalidate a future and any subsequent attempt to access result or results to access result or results from the future leads to undefined behavior.
from the future leads to undefined behavior. isValid() tells you if isValid() tells you if results can be accessed.
results can be accessed.
QFuture provides a \l{Java-style iterators}{Java-style iterator} QFuture provides a \l{Java-style iterators}{Java-style iterator}
(QFutureIterator) and an \l{STL-style iterators}{STL-style iterator} (QFutureIterator) and an \l{STL-style iterators}{STL-style iterator}
@ -367,7 +366,7 @@
number of results stored might be different from this value, due to gaps number of results stored might be different from this value, due to gaps
in the result set. It is always safe to iterate through the results from 0 in the result set. It is always safe to iterate through the results from 0
to resultCount(). to resultCount().
\sa result(), resultAt(), results(), takeResult(), takeResults() \sa result(), resultAt(), results(), takeResult()
*/ */
/*! \fn template <typename T> int QFuture<T>::progressValue() const /*! \fn template <typename T> int QFuture<T>::progressValue() const
@ -419,7 +418,7 @@
\note Calling \c result() leads to undefined behavior if isValid() \note Calling \c result() leads to undefined behavior if isValid()
returns \c false for this QFuture. returns \c false for this QFuture.
\sa resultAt(), results(), takeResult(), takeResults() \sa resultAt(), results(), takeResult()
*/ */
/*! \fn template <typename T> T QFuture<T>::resultAt(int index) const /*! \fn template <typename T> T QFuture<T>::resultAt(int index) const
@ -431,7 +430,7 @@
\note Calling resultAt() leads to undefined behavior if isValid() \note Calling resultAt() leads to undefined behavior if isValid()
returns \c false for this QFuture. returns \c false for this QFuture.
\sa result(), results(), takeResult(), takeResults(), resultCount() \sa result(), results(), takeResult(), resultCount()
*/ */
/*! \fn template <typename T> bool QFuture<T>::isResultReadyAt(int index) const /*! \fn template <typename T> bool QFuture<T>::isResultReadyAt(int index) const
@ -442,7 +441,7 @@
\note Calling isResultReadyAt() leads to undefined behavior if isValid() \note Calling isResultReadyAt() leads to undefined behavior if isValid()
returns \c false for this QFuture. returns \c false for this QFuture.
\sa resultAt(), resultCount(), takeResult(), takeResults() \sa resultAt(), resultCount(), takeResult()
*/ */
/*! \fn template <typename T> QFuture<T>::operator T() const /*! \fn template <typename T> QFuture<T>::operator T() const
@ -455,23 +454,25 @@
\note Calling this function leads to undefined behavior if isValid() \note Calling this function leads to undefined behavior if isValid()
returns \c false for this QFuture. returns \c false for this QFuture.
\sa result(), resultAt(), results(), takeResult(), takeResults(), isValid() \sa result(), resultAt(), results(), takeResult(), isValid()
*/ */
/*! \fn template <typename T> QList<T> QFuture<T>::results() const /*! \fn template <typename T> QList<T> QFuture<T>::results() const
Returns all results from the future. If the results are not immediately available, Returns all results from the future. If the results are not immediately available,
this function will block and wait for them to become available. Note that this function will block and wait for them to become available. Note that
\c results() returns a copy of the internally stored results. If \c T is a \c results() returns a copy of the internally stored results. Getting all
move-only type, or you don't want to copy the results, use takeResults() results of a move-only type \c T is not supported at the moment. However you can
instead. still iterate through the list of move-only results by using \l{STL-style iterators}
or read-only \l{Java-style iterators}.
\note Calling \c results() leads to undefined behavior if isValid() \note Calling \c results() leads to undefined behavior if isValid()
returns \c false for this QFuture. returns \c false for this QFuture.
\sa result(), resultAt(), takeResult(), takeResults(), resultCount(), isValid() \sa result(), resultAt(), takeResult(), resultCount(), isValid()
*/ */
#if 0
/*! \fn template <typename T> std::vector<T> QFuture<T>::takeResults() /*! \fn template <typename T> std::vector<T> QFuture<T>::takeResults()
If isValid() returns \c false, calling this function leads to undefined behavior. If isValid() returns \c false, calling this function leads to undefined behavior.
@ -489,14 +490,16 @@
\sa takeResult(), result(), resultAt(), results(), resultCount(), isValid() \sa takeResult(), result(), resultAt(), results(), resultCount(), isValid()
*/ */
#endif
/*! \fn template <typename T> std::vector<T> QFuture<T>::takeResult() /*! \fn template <typename T> std::vector<T> QFuture<T>::takeResult()
\since 6.0
Call this function only if isValid() returns \c true, otherwise Call this function only if isValid() returns \c true, otherwise
the behavior is undefined. This function takes the first result from the behavior is undefined. This function takes (moves) the first result from
the QFuture object, for convenience when only one result is expected. the QFuture object, when only one result is expected. If there are any other
If there are any other results, they are discarded after taking the results, they are discarded after taking the first one.
first one (if such behavior is undesired, use takeResults() instead).
If the result is not immediately available, this function will block and If the result is not immediately available, this function will block and
wait for the result to become available. The QFuture will try to use move wait for the result to become available. The QFuture will try to use move
semantics if possible, and will fall back to copy construction if the type semantics if possible, and will fall back to copy construction if the type
@ -507,17 +510,21 @@
objects (and potentially between different threads). takeResult() was introduced objects (and potentially between different threads). takeResult() was introduced
to make QFuture also work with move-only types (like std::unique_ptr), so it to make QFuture also work with move-only types (like std::unique_ptr), so it
assumes that only one thread can move the results out of the future, and assumes that only one thread can move the results out of the future, and
do it only once. do it only once. Also note that taking the list of all results is not supported
at the moment. However you can still iterate through the list of move-only
results by using \l{STL-style iterators} or read-only \l{Java-style iterators}.
\sa takeResults(), result(), results(), resultAt(), isValid() \sa result(), results(), resultAt(), isValid()
*/ */
/*! \fn template <typename T> bool QFuture<T>::isValid() const /*! \fn template <typename T> bool QFuture<T>::isValid() const
\since 6.0
Returns \c true if a result or results can be accessed or taken from this Returns \c true if a result or results can be accessed or taken from this
QFuture object. Returns false after the result was taken from the future. QFuture object. Returns false after the result was taken from the future.
\sa takeResults(), takeResult(), result(), results(), resultAt() \sa takeResult(), result(), results(), resultAt()
*/ */
/*! \fn template <typename T> QFuture<T>::const_iterator QFuture<T>::begin() const /*! \fn template <typename T> QFuture<T>::const_iterator QFuture<T>::begin() const

View File

@ -252,7 +252,10 @@ public:
inline QList<T> results(); inline QList<T> results();
T takeResult(); T takeResult();
#if 0
// TODO: Enable and make it return a QList, when QList is fixed to support move-only types
std::vector<T> takeResults(); std::vector<T> takeResults();
#endif
}; };
template <typename T> template <typename T>
@ -384,6 +387,7 @@ T QFutureInterface<T>::takeResult()
return ret; return ret;
} }
#if 0
template<typename T> template<typename T>
std::vector<T> QFutureInterface<T>::takeResults() std::vector<T> QFutureInterface<T>::takeResults()
{ {
@ -404,6 +408,7 @@ std::vector<T> QFutureInterface<T>::takeResults()
return res; return res;
} }
#endif
template <> template <>
class QFutureInterface<void> : public QFutureInterfaceBase class QFutureInterface<void> : public QFutureInterfaceBase

View File

@ -136,7 +136,10 @@ private slots:
void onFailedForMoveOnlyTypes(); void onFailedForMoveOnlyTypes();
#endif #endif
void onCanceled(); void onCanceled();
#if 0
// TODO: enable when QFuture::takeResults() is enabled
void takeResults(); void takeResults();
#endif
void takeResult(); void takeResult();
void runAndTake(); void runAndTake();
void resultsReadyAt_data(); void resultsReadyAt_data();
@ -2829,6 +2832,7 @@ void tst_QFuture::testTakeResults(QFuture<T> future, size_type resultCount)
testFutureTaken(copy); testFutureTaken(copy);
} }
#if 0
void tst_QFuture::takeResults() void tst_QFuture::takeResults()
{ {
// Test takeResults() for movable types (whether or not copyable). // Test takeResults() for movable types (whether or not copyable).
@ -2857,6 +2861,7 @@ void tst_QFuture::takeResults()
testTakeResults(copyIface.future(), size_type(expectedCount)); testTakeResults(copyIface.future(), size_type(expectedCount));
} }
#endif
void tst_QFuture::takeResult() void tst_QFuture::takeResult()
{ {
@ -2903,7 +2908,10 @@ void tst_QFuture::runAndTake()
QSKIP("Failed to run the task, nothing to test"); QSKIP("Failed to run the task, nothing to test");
gotcha = watcha.future(); gotcha = watcha.future();
#if 0
// TODO: enable when QFuture::takeResults() is enabled
testTakeResults(gotcha, size_type(1)); testTakeResults(gotcha, size_type(1));
#endif
} }
void tst_QFuture::resultsReadyAt_data() void tst_QFuture::resultsReadyAt_data()