// Copyright (C) 2020 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 QTBASE_QTTASKBUILDER_H #define QTBASE_QTTASKBUILDER_H #if !defined(QT_NO_CONCURRENT) || defined(Q_QDOC) #include QT_BEGIN_NAMESPACE #ifdef Q_QDOC namespace QtConcurrent { enum class FutureResult { Ignore }; using InvokeResultType = int; template class QTaskBuilder { public: [[nodiscard]] QFuture spawn(); void spawn(FutureResult); template [[nodiscard]] QTaskBuilder withArguments(ExtraArgs &&...args); [[nodiscard]] QTaskBuilder &onThreadPool(QThreadPool &newThreadPool); [[nodiscard]] QTaskBuilder &withPriority(int newPriority); }; } // namespace QtConcurrent #else namespace QtConcurrent { enum class FutureResult { Ignore }; template class QTaskBuilder { public: [[nodiscard]] auto spawn() { return TaskResolver, std::decay_t...>::run( std::move(taskWithArgs), startParameters); } // We don't want to run with promise when we don't return a QFuture void spawn(FutureResult) { (new StoredFunctionCall(std::move(taskWithArgs))) ->start(startParameters); } template [[nodiscard]] constexpr auto withArguments(ExtraArgs &&...args) { static_assert(std::tuple_size_v == 1, "This function cannot be invoked if " "arguments have already been passed."); static_assert(sizeof...(ExtraArgs) >= 1, "One or more arguments must be passed."); // We have to re-create a builder, because the type has changed return QTaskBuilder( startParameters, std::get<0>(std::move(taskWithArgs)), std::forward(args)... ); } [[nodiscard]] constexpr auto &onThreadPool(QThreadPool &newThreadPool) { startParameters.threadPool = &newThreadPool; return *this; } [[nodiscard]] constexpr auto &withPriority(int newPriority) { startParameters.priority = newPriority; return *this; } protected: // Methods constexpr explicit QTaskBuilder(Task &&task, Args &&...arguments) : taskWithArgs{std::forward(task), std::forward(arguments)...} {} constexpr QTaskBuilder( const TaskStartParameters ¶meters, Task &&task, Args &&...arguments) : taskWithArgs{std::forward(task), std::forward(arguments)...} , startParameters{parameters} {} private: // Methods // Required for creating a builder from "task" function template friend constexpr auto task(T &&t); // Required for creating a new builder from "withArguments" function template friend class QTaskBuilder; private: // Data using TaskWithArgs = DecayedTuple; TaskWithArgs taskWithArgs; TaskStartParameters startParameters; }; } // namespace QtConcurrent #endif // Q_QDOC QT_END_NAMESPACE #endif // !defined(QT_NO_CONCURRENT) #endif //QTBASE_QTTASKBUILDER_H