diff options
Diffstat (limited to 'src/corelib/thread/qfutureinterface.h')
-rw-r--r-- | src/corelib/thread/qfutureinterface.h | 25 |
1 files changed, 21 insertions, 4 deletions
diff --git a/src/corelib/thread/qfutureinterface.h b/src/corelib/thread/qfutureinterface.h index eb251c7d14..180a59a94e 100644 --- a/src/corelib/thread/qfutureinterface.h +++ b/src/corelib/thread/qfutureinterface.h @@ -21,6 +21,7 @@ QT_BEGIN_NAMESPACE template <typename T> class QFuture; class QThreadPool; +class QFutureInterfaceBase; class QFutureInterfaceBasePrivate; class QFutureWatcherBase; class QFutureWatcherBasePrivate; @@ -38,6 +39,10 @@ class CanceledHandler; template<class Function, class ResultType> class FailureHandler; #endif + +void Q_CORE_EXPORT watchContinuationImpl(const QObject *context, + QtPrivate::QSlotObjectBase *slotObj, + QFutureInterfaceBase &fi); } class Q_CORE_EXPORT QFutureInterfaceBase @@ -176,6 +181,9 @@ private: friend class QtPrivate::FailureHandler; #endif + friend Q_CORE_EXPORT void QtPrivate::watchContinuationImpl( + const QObject *context, QtPrivate::QSlotObjectBase *slotObj, QFutureInterfaceBase &fi); + template<class T> friend class QPromise; @@ -236,6 +244,8 @@ public: inline QFuture<T> future(); // implemented in qfuture.h + template <typename...Args, std::enable_if_t<std::is_constructible_v<T, Args...>, bool> = true> + inline bool reportAndEmplaceResult(int index, Args&&...args); inline bool reportResult(const T *result, int index = -1); inline bool reportAndMoveResult(T &&result, int index = -1); inline bool reportResult(T &&result, int index = -1); @@ -301,7 +311,8 @@ inline bool QFutureInterface<T>::reportResult(const T *result, int index) } template<typename T> -bool QFutureInterface<T>::reportAndMoveResult(T &&result, int index) +template<typename...Args, std::enable_if_t<std::is_constructible_v<T, Args...>, bool>> +bool QFutureInterface<T>::reportAndEmplaceResult(int index, Args&&...args) { QMutexLocker<QMutex> locker{&mutex()}; if (queryState(Canceled) || queryState(Finished)) @@ -311,7 +322,7 @@ bool QFutureInterface<T>::reportAndMoveResult(T &&result, int index) QtPrivate::ResultStoreBase &store = resultStoreBase(); const int oldResultCount = store.count(); - const int insertIndex = store.moveResult(index, std::forward<T>(result)); + const int insertIndex = store.emplaceResult<T>(index, std::forward<Args>(args)...); // Let's make sure it's not in pending results. if (insertIndex != -1 && (!store.filterMode() || oldResultCount < store.count())) reportResultsReady(insertIndex, store.count()); @@ -319,6 +330,12 @@ bool QFutureInterface<T>::reportAndMoveResult(T &&result, int index) } template<typename T> +bool QFutureInterface<T>::reportAndMoveResult(T &&result, int index) +{ + return reportAndEmplaceResult(index, std::move(result)); +} + +template<typename T> bool QFutureInterface<T>::reportResult(T &&result, int index) { return reportAndMoveResult(std::move(result), index); @@ -347,7 +364,7 @@ inline bool QFutureInterface<T>::reportResults(const QList<T> &_results, int beg if (store.filterMode()) { this->reportResultsReady(resultCountBefore, store.count()); } else { - this->reportResultsReady(insertIndex, insertIndex + _results.count()); + this->reportResultsReady(insertIndex, insertIndex + _results.size()); } return true; } @@ -452,7 +469,7 @@ template <> class QFutureInterface<void> : public QFutureInterfaceBase { public: - explicit QFutureInterface<void>(State initialState = NoState) + explicit QFutureInterface(State initialState = NoState) : QFutureInterfaceBase(initialState) { } |