summaryrefslogtreecommitdiffstats
path: root/src/corelib/thread/qfutureinterface.h
diff options
context:
space:
mode:
authorMarc Mutz <marc.mutz@qt.io>2023-03-28 10:54:59 +0200
committerMarc Mutz <marc.mutz@qt.io>2023-03-31 20:27:55 +0000
commitd25337a631a0fb61afc12ebe7c34e266e1a52ca4 (patch)
treee369c1501e3b18aef72dd8ccd66f4d9698085161 /src/corelib/thread/qfutureinterface.h
parent3087aa55dcccfe16ca05509113bd232633987d3b (diff)
QFutureInterface: Extract Method reportAndEmplaceResult() from reportAndMoveResult()
This will be the building block for emplacement support in QPromise. Task-number: QTBUG-112270 Change-Id: Ie267e76fe078a8f7b3ef8c7e0d2abfcd22062ff2 Reviewed-by: MÃ¥rten Nordheim <marten.nordheim@qt.io>
Diffstat (limited to 'src/corelib/thread/qfutureinterface.h')
-rw-r--r--src/corelib/thread/qfutureinterface.h13
1 files changed, 11 insertions, 2 deletions
diff --git a/src/corelib/thread/qfutureinterface.h b/src/corelib/thread/qfutureinterface.h
index 7e682e69b68..ecb0f5b7ea5 100644
--- a/src/corelib/thread/qfutureinterface.h
+++ b/src/corelib/thread/qfutureinterface.h
@@ -236,6 +236,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 +303,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 +314,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::move(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 +322,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);