7#include <QtCore/qglobal.h>
9#include <QtCore/qfutureinterface.h>
10#include <QtCore/qmetatype.h>
11#include <QtCore/qstring.h>
13#include <QtCore/qfuture_impl.h>
27 static_assert (std::is_move_constructible_v<T>
28 || std::is_same_v<T, void>,
29 "A move-constructible type or type void is required");
35 template<
typename U = T,
typename = QtPrivate::EnableForNonVo
id<U>>
40 template<
typename U = T,
typename = QtPrivate::EnableForVo
id<U>>
46 template<
typename U,
typename V = T,
typename = QtPrivate::EnableForVo
id<V>>
51 template<
typename U,
typename V = T,
typename = QtPrivate::EnableForVo
id<V>>
61 QFuture<T> &
operator=(
const QFuture<T> &) { }
67#if QT_DEPRECATED_SINCE(6, 0)
69 void setPaused(
bool paused) { d.setSuspended(paused); }
81 void togglePaused() { d.toggleSuspended(); }
104 template<
typename U = T,
typename = QtPrivate::EnableForNonVo
id<U>>
107 template<
typename U = T,
typename = QtPrivate::EnableForNonVo
id<U>>
110 template<
typename U = T,
typename = QtPrivate::EnableForNonVo
id<U>>
111 bool isResultReadyAt(
int resultIndex)
const {
return d.isResultReadyAt(resultIndex); }
113 template<
typename U = T,
typename = QtPrivate::EnableForNonVo
id<U>>
114 QList<T>
results()
const {
return d.results(); }
116 template<
typename U = T,
typename = QtPrivate::EnableForNonVo
id<U>>
121 template<
typename U = T,
typename = QtPrivate::EnableForNonVo
id<U>>
122 std::vector<T> takeResults() {
return d.takeResults(); }
127 template<
class Function>
130 template<
class Function>
133 template<
class Function>
136 template<
class Function>
139 template<
class Function>
142#ifndef QT_NO_EXCEPTIONS
144 typename = std::enable_if_t<!QtPrivate::ArgResolver<Function>::HasExtraArgs>>
148 typename = std::enable_if_t<!QtPrivate::ArgResolver<Function>::HasExtraArgs>>
152 template<
class Function,
typename = std::enable_if_t<std::is_invocable_r_v<T, Function>>>
155 template<
class Function,
typename = std::enable_if_t<std::is_invocable_r_v<T, Function>>>
159 template<
class U = T,
typename = std::enable_if_t<QtPrivate::isQFutureV<U>>>
169 static_assert(!std::is_same_v<T, void>,
170 "It isn't possible to define QFuture<void>::const_iterator");
180 : future(_future),
index(advanceIndex(_index, 0)) { }
183 { future =
o.future;
index =
o.index;
return *
this; }
187 {
index = advanceIndex(
index, 1);
return *
this; }
189 {
index = advanceIndex(
index, -1);
return *
this; }
216 return lhs.index == rhs.index;
237 int advanceIndex(
int idx,
int n)
const
240 if (idx == -1 &&
n >= 0)
246 future->d.waitForFinished();
249 const int targetIndex = (idx == -1) ? future->
resultCount() +
n : idx +
n;
250 future->d.waitForResult(targetIndex);
253 return (targetIndex < future->
resultCount()) ? targetIndex : -1;
262 template<
class U = T,
typename = QtPrivate::EnableForNonVo
id<U>>
265 template<
class U = T,
typename = QtPrivate::EnableForNonVo
id<U>>
268 template<
class U = T,
typename = QtPrivate::EnableForNonVo
id<U>>
271 template<
class U = T,
typename = QtPrivate::EnableForNonVo
id<U>>
282 template<
class Function,
class ResultType,
class ParentResultType>
285 template<
class Function,
class ResultType>
288#ifndef QT_NO_EXCEPTIONS
289 template<
class Function,
class ResultType>
293 template<
typename ResultType>
298 using QFuturePrivate =
304 mutable QFuturePrivate
d;
308template<
typename U,
typename>
312 return d.resultReference(0);
316template<
typename U,
typename>
320 return d.resultReference(
index);
326 return QFuture<T>(
this);
330template<
class Function>
337template<
class Function>
338QFuture<typename QFuture<T>::template ResultType<Function>>
343 std::forward<Function>(function),
this, promise,
policy);
344 return promise.future();
348template<
class Function>
354 std::forward<Function>(function),
this, promise,
pool);
355 return promise.future();
359template<
class Function>
365 std::forward<Function>(function),
this, promise,
context);
366 return promise.future();
369#ifndef QT_NO_EXCEPTIONS
371template<
class Function,
typename>
377 return promise.future();
381template<
class Function,
typename>
387 return promise.future();
393template<
class Function,
typename>
399 return promise.future();
403template<
class Function,
typename>
409 return promise.future();
413template<
class U,
typename>
416 if constexpr (QtPrivate::isQFutureV<typename QtPrivate::Future<T>::type>)
424 return QFuture<void>(
this);
440 if constexpr (std::is_same_v<T, void>)
443 return QMetaType::registerConverter<QFuture<T>, QFuture<void>>(
444 [](
const QFuture<T> &
future) {
return QFuture<void>(
future); });
454template<
typename OutputSequence,
typename InputIt,
455 typename ValueType =
typename std::iterator_traits<InputIt>::value_type,
456 std::enable_if_t<std::conjunction_v<QtPrivate::IsForwardIterable<InputIt>,
462 return QtPrivate::whenAllImpl<OutputSequence, InputIt, ValueType>(
first, last);
465template<typename InputIt, typename ValueType = typename std::iterator_traits<InputIt>::value_type,
466 std::enable_if_t<std::conjunction_v<QtPrivate::IsForwardIterable<InputIt>,
471 return QtPrivate::whenAllImpl<QList<ValueType>, InputIt, ValueType>(
first, last);
474template<
typename OutputSequence,
typename... Futures,
475 std::enable_if_t<std::conjunction_v<QtPrivate::IsRandomAccessible<OutputSequence>,
479QFuture<OutputSequence>
whenAll(Futures &&... futures)
484template<
typename... Futures,
488QFuture<QList<std::variant<std::decay_t<Futures>...>>>
whenAll(Futures &&... futures)
490 return QtPrivate::whenAllImpl<QList<std::variant<std::decay_t<Futures>...>>, Futures...>(
491 std::forward<Futures>(futures)...);
494template<typename InputIt, typename ValueType = typename std::iterator_traits<InputIt>::value_type,
495 std::enable_if_t<std::conjunction_v<QtPrivate::IsForwardIterable<InputIt>,
498QFuture<WhenAnyResult<typename QtPrivate::Future<ValueType>::type>>
whenAny(InputIt
first,
501 return QtPrivate::whenAnyImpl<InputIt, ValueType>(
first, last);
504template<
typename... Futures,
508QFuture<std::variant<std::decay_t<Futures>...>>
whenAny(Futures &&... futures)
515template<
typename OutputSequence,
typename InputIt>
516QFuture<OutputSequence> whenAll(InputIt
first, InputIt last);
518template<
typename OutputSequence,
typename... Futures>
519QFuture<OutputSequence> whenAll(Futures &&... futures);
521template<
typename T,
typename InputIt>
522QFuture<QtFuture::WhenAnyResult<T>> whenAny(InputIt
first, InputIt last);
524template<
typename... Futures>
525QFuture<std::variant<std::decay_t<Futures>...>> whenAny(Futures &&... futures);
529#if QT_DEPRECATED_SINCE(6, 10)
531static QFuture<void> makeReadyFuture()
533template<
typename T =
void>
535static
QFuture<T> makeReadyFuture()
538 return makeReadyVoidFuture();
static QFutureInterfaceBase get(const QFuture< T > &future)
const_iterator & operator-=(int j)
const_iterator operator-(int j) const
std::bidirectional_iterator_tag iterator_category
const_iterator operator++(int)
const_iterator operator--(int)
const_iterator & operator++()
const_iterator(const const_iterator &o)
friend const_iterator operator+(int j, const_iterator k)
const_iterator & operator--()
const_iterator & operator+=(int j)
const_iterator operator+(int j) const
friend bool comparesEqual(const const_iterator &lhs, const const_iterator &rhs) noexcept
const T * operator->() const
const_iterator(QFuture const *const _future, int _index)
const T & operator*() const
const_iterator & operator=(const const_iterator &o)
QFuture< ResultType< Function > > then(Function &&function)
QFuture< T > onFailed(Function &&handler)
typename QtPrivate::ResultTypeHelper< Function, T >::ResultType ResultType
void setSuspended(bool suspend)
int progressMaximum() const
QFuture(const QFuture< U > &other)
QList< T > results() const
QFuture< ResultType< Function > > then(QThreadPool *pool, Function &&function)
T resultAt(int index) const
const_iterator end() const
const_iterator begin() const
const_iterator ConstIterator
int progressValue() const
QString progressText() const
QFuture< T > onFailed(QObject *context, Function &&handler)
QFuture< void > & operator=(const QFuture< U > &other)
bool isSuspending() const
int progressMinimum() const
QFuture< T > onCanceled(Function &&handler)
QFuture< T > onCanceled(QObject *context, Function &&handler)
const_iterator constEnd() const
QFuture(QFutureInterfaceBase *p)
friend class const_iterator
QFuture(QFutureInterface< T > *p)
friend class QFutureInterfaceBase
bool isResultReadyAt(int resultIndex) const
QFuture< ResultType< Function > > then(QObject *context, Function &&function)
const_iterator constBegin() const
QFuture< ResultType< Function > > then(QtFuture::Launch policy, Function &&function)
\macro QT_RESTRICTED_CAST_FROM_ASCII
Combined button and popup list for selecting options.
QFuture< OutputSequence > whenAll(InputIt first, InputIt last)
QFuture< WhenAnyResult< typename QtPrivate::Future< ValueType >::type > > whenAny(InputIt first, InputIt last)
QFuture< OutputSequence > whenAllImpl(InputIt first, InputIt last)
std::is_convertible< typename std::iterator_traits< std::decay_t< decltype( std::begin(std::declval< Sequence >()))> >::iterator_category, std::random_access_iterator_tag > IsRandomAccessible
std::bool_constant< isQFutureV< T > > isQFuture
QFuture< QtFuture::WhenAnyResult< typename Future< ValueType >::type > > whenAnyImpl(InputIt first, InputIt last)
std::bool_constant<(sizeof...(Args) > 0)> NotEmpty
#define Q_DECLARE_EQUALITY_COMPARABLE(...)
#define QT_WARNING_DISABLE_DEPRECATED
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
#define Q_DECLARE_SEQUENTIAL_ITERATOR(C)
#define QT_REQUIRE_CONFIG(feature)
#define QT_DEPRECATED_VERSION_X(major, minor, text)
#define QT_DEPRECATED_VERSION_X_6_0(text)
QFuture< void > future
[5]
static auto unwrapImpl(T *outer)