// Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only #ifndef QTCONCURRENT_RUN_H #define QTCONCURRENT_RUN_H #if 0 #pragma qt_class(QtConcurrentRun) #endif #include #if !defined(QT_NO_CONCURRENT) || defined(Q_QDOC) #include #include QT_BEGIN_NAMESPACE #ifdef Q_QDOC typedef int Function; namespace QtConcurrent { template QFuture run(Function function, ...); template QFuture run(QThreadPool *pool, Function function, ...); } // namespace QtConcurrent #else namespace QtConcurrent { #define QTCONCURRENT_RUN_NODISCARD \ Q_NODISCARD_X("Use QThreadPool::start(Callable&&) if you don't need the returned QFuture") template QTCONCURRENT_RUN_NODISCARD auto run(QThreadPool *pool, Function &&f, Args &&...args) { DecayedTuple tuple { std::forward(f), std::forward(args)... }; return TaskResolver, std::decay_t...>::run( std::move(tuple), TaskStartParameters { pool }); } template QTCONCURRENT_RUN_NODISCARD auto run(QThreadPool *pool, std::reference_wrapper &&functionWrapper, Args &&...args) { return run(pool, std::forward(functionWrapper.get()), std::forward(args)...); } template QTCONCURRENT_RUN_NODISCARD auto run(Function &&f, Args &&...args) { return run(QThreadPool::globalInstance(), std::forward(f), std::forward(args)...); } // overload with a Promise Type hint, takes thread pool template QTCONCURRENT_RUN_NODISCARD auto run(QThreadPool *pool, Function &&f, Args &&...args) { return (new StoredFunctionCallWithPromise( std::forward(f), std::forward(args)...))->start(pool); } // overload with a Promise Type hint, uses global thread pool template QTCONCURRENT_RUN_NODISCARD auto run(Function &&f, Args &&...args) { return run(QThreadPool::globalInstance(), std::forward(f), std::forward(args)...); } #undef QTCONCURRENT_RUN_NODISCARD } //namespace QtConcurrent #endif // Q_QDOC QT_END_NAMESPACE #endif // QT_NO_CONCURRENT #endif