4#ifndef QFUTUREINTERFACE_H
5#define QFUTUREINTERFACE_H
7#include <QtCore/qmutex.h>
8#include <QtCore/qresultstore.h>
9#ifndef QT_NO_EXCEPTIONS
22template <
typename T>
class QFuture;
30template<
typename Function,
typename ResultType,
typename ParentResultType>
35template<
class Function,
class ResultType>
38#ifndef QT_NO_EXCEPTIONS
39template<
class Function,
class ResultType>
67 :
d(std::exchange(
other.d,
nullptr)) {}
74 void reportFinished();
75 void reportCanceled();
76#ifndef QT_NO_EXCEPTIONS
78#if QT_VERSION < QT_VERSION_CHECK(7, 0, 0)
79 void reportException(std::exception_ptr e);
81 void reportException(
const std::exception_ptr &e);
84 void reportResultsReady(
int beginIndex,
int endIndex);
89 void setFilterMode(
bool enable);
90 void setProgressRange(
int minimum,
int maximum);
91 int progressMinimum()
const;
92 int progressMaximum()
const;
93 bool isProgressUpdateNeeded()
const;
94 void setProgressValue(
int progressValue);
95 int progressValue()
const;
96 void setProgressValueAndText(
int progressValue,
const QString &progressText);
99 void setExpectedResultCount(
int resultCount);
100 int expectedResultCount();
101 int resultCount()
const;
105 bool isStarted()
const;
106 bool isCanceled()
const;
107 bool isFinished()
const;
108#if QT_DEPRECATED_SINCE(6, 0)
110 bool isPaused() const;
113 void setPaused(
bool paused) { setSuspended(paused); }
116 void togglePaused() { toggleSuspended(); }
118 bool isSuspending()
const;
119 bool isSuspended()
const;
120 bool isThrottled()
const;
121 bool isResultReadyAt(
int index)
const;
122 bool isValid()
const;
123 int loadState()
const;
128 void setSuspended(
bool suspend);
129 void toggleSuspended();
130 void reportSuspended()
const;
131 void setThrottled(
bool enable);
134 bool waitForNextResult();
135 void waitForResult(
int resultIndex);
136 void waitForResume();
137 void suspendIfRequested();
140 bool hasException()
const;
154 bool isChainCanceled()
const;
158 bool refT() const noexcept;
159 bool derefT() const noexcept;
161 void rethrowPossibleException();
173 template<
typename Function,
typename ResultType,
typename ParentResultType>
176 template<
class Function,
class ResultType>
179#ifndef QT_NO_EXCEPTIONS
180 template<
class Function,
class ResultType>
194 void cleanContinuation();
195 void runContinuation()
const;
197 void setLaunchAsync(
bool value);
198 bool launchAsync()
const;
200 bool isRunningOrPending()
const;
245 inline QFuture<T>
future();
247 template <
typename...Args, std::enable_if_t<std::is_constructible_v<T, Args...>,
bool> =
true>
268 std::vector<T> takeResults();
271#ifndef QT_NO_EXCEPTIONS
294 QMutexLocker<QMutex> locker{&
mutex()};
295 if (this->queryState(Canceled) || this->queryState(Finished))
301 const int resultCountBefore = store.
count();
303 if (insertIndex == -1)
306 this->reportResultsReady(resultCountBefore, store.
count());
308 this->reportResultsReady(insertIndex, insertIndex + 1);
314template<
typename...Args, std::enable_if_t<std::is_constructible_v<T, Args...>,
bool>>
317 QMutexLocker<QMutex> locker{&
mutex()};
318 if (queryState(Canceled) || queryState(Finished))
324 const int oldResultCount = store.
count();
327 if (insertIndex != -1 && (!store.
filterMode() || oldResultCount < store.
count()))
328 reportResultsReady(insertIndex, store.
count());
329 return insertIndex != -1;
335 return reportAndEmplaceResult(
index, std::move(
result));
341 return reportAndMoveResult(std::move(
result),
index);
353 QMutexLocker<QMutex> locker{&
mutex()};
354 if (this->queryState(Canceled) || this->queryState(Finished))
358 auto &store = resultStoreBase();
360 const int resultCountBefore = store.count();
361 const int insertIndex = store.addResults(beginIndex, &_results,
count);
362 if (insertIndex == -1)
364 if (store.filterMode()) {
365 this->reportResultsReady(resultCountBefore, store.count());
367 this->reportResultsReady(insertIndex, insertIndex + _results.size());
375 bool resultReported =
false;
379 return resultReported;
387 QMutexLocker<QMutex> locker{&
mutex()};
388 return resultStoreBase().resultAt(
index).template value<T>();
396 QMutexLocker<QMutex> locker{&
mutex()};
397 return resultStoreBase().resultAt(
index).template pointer<T>();
403 if (this->isCanceled()) {
404 rethrowPossibleException();
411 QMutexLocker<QMutex> locker{&
mutex()};
414 while (
it != resultStoreBase().
end()) {
415 res.append(
it.value<T>());
433 const QMutexLocker<QMutex> locker{&
mutex()};
437 resultStoreBase().template clear<T>();
453 res.reserve(resultCount());
455 const QMutexLocker<QMutex> locker{&
mutex()};
458 for (
auto endIt = resultStoreBase().
end();
it != endIt; ++
it)
459 res.push_back(std::move_if_noexcept(
it.value<T>()));
462 resultStoreBase().template clear<T>();
482 inline QFuture<void>
future();
499inline void swap(QFutureInterface<T> &
a, QFutureInterface<T> &
b)
noexcept
QtPrivate::ResultStoreBase & resultStoreBase()
void waitForResult(int resultIndex)
bool operator==(const QFutureInterfaceBase &other) const
QFutureInterfaceBase(State initialState=NoState)
bool operator!=(const QFutureInterfaceBase &other) const
bool derefT() const noexcept
void swap(QFutureInterfaceBase &other) noexcept
bool refT() const noexcept
void reportException(const QException &e)
void runContinuation() const
QFutureInterfaceBase(QFutureInterfaceBase &&other) noexcept
bool hasException() const
QFutureInterface(const QFutureInterfaceBase &dd)
bool reportFinished(const void *)
bool reportResults(const QList< void > &, int)
bool reportResult(const void *, int)
QFutureInterface(State initialState=NoState)
static QFutureInterface< void > canceledResult()
QFutureInterface(QFutureInterface &&other)=default
bool reportAndEmplaceResult(int index, Args &&...args)
QFutureInterface(const QFutureInterfaceBase &dd)
bool reportResult(T &&result, int index=-1)
QFutureInterface & operator=(const QFutureInterface &other)
bool reportResults(const QList< T > &results, int beginIndex=-1, int count=-1)
const T * resultPointer(int index) const
QFutureInterface(State initialState=NoState)
bool reportResult(const T &result, int index=-1)
static QFutureInterface canceledResult()
void reportException(const std::exception_ptr &e)
QFutureInterface(const QFutureInterface &other)
bool reportFinished(const T *result)
void reportException(const QException &e)
bool reportResult(const T *result, int index=-1)
bool reportAndMoveResult(T &&result, int index=-1)
QFutureInterface(QFutureInterfaceBase &&dd) noexcept
const T & resultReference(int index) const
\macro QT_RESTRICTED_CAST_FROM_ASCII
int emplaceResult(int index, Args &&...args)
int addResult(int index, const void *result)
QSet< QString >::iterator it
Combined button and popup list for selecting options.
void Q_CORE_EXPORT watchContinuationImpl(const QObject *context, QtPrivate::QSlotObjectBase *slotObj, QFutureInterfaceBase &fi)
static jboolean copy(JNIEnv *, jobject)
DBusConnection const char DBusError DBusBusType DBusError return DBusConnection DBusHandleMessageFunction void DBusFreeFunction return DBusConnection return DBusConnection return const char DBusError return DBusConnection DBusMessage dbus_uint32_t return DBusConnection dbus_bool_t DBusConnection DBusAddWatchFunction DBusRemoveWatchFunction DBusWatchToggledFunction void DBusFreeFunction return DBusConnection DBusDispatchStatusFunction void DBusFreeFunction DBusTimeout return DBusTimeout return DBusWatch return DBusWatch unsigned int return DBusError const DBusError return const DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessageIter int const void return DBusMessageIter DBusMessageIter return DBusMessageIter void DBusMessageIter void int return DBusMessage DBusMessageIter return DBusMessageIter return DBusMessageIter DBusMessageIter const char const char const char const char return DBusMessage return DBusMessage const char return DBusMessage dbus_bool_t return DBusMessage dbus_uint32_t return DBusMessage void
static QDBusError::ErrorType get(const char *name)
EGLOutputLayerEXT EGLint EGLAttrib value
[5]
void swap(QFutureInterfaceBase &lhs, QFutureInterfaceBase &rhs) noexcept
GLboolean GLboolean GLboolean b
GLboolean GLboolean GLboolean GLboolean a
[7]
GLenum GLenum GLsizei count
static qreal position(const QQuickItem *item, QQuickAnchors::Anchor anchorLine)
#define QT_REQUIRE_CONFIG(feature)
#define QT_DEPRECATED_VERSION_X_6_0(text)
bool reportResult(bool success, const void *lhs, const void *rhs, const char *(*lhsFormatter)(const void *), const char *(*rhsFormatter)(const void *), const char *lhsExpr, const char *rhsExpr, ComparisonOperation op, const char *file, int line)
QFuture< void > future
[5]