summaryrefslogtreecommitdiffstats
path: root/src/concurrent/qtaskbuilder.h
blob: 95ab8021e743f1ba60da8d683f7365f1617eebb2 (plain)
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
// 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 <QtConcurrent/qtconcurrentstoredfunctioncall.h> QT_BEGIN_NAMESPACE #ifdef Q_QDOCnamespace QtConcurrent {enumclass FutureResult { Ignore };using InvokeResultType =int;template<class Task,class...Args>class QTaskBuilder {public:[[nodiscard]] QFuture<InvokeResultType>spawn();voidspawn(FutureResult);template<class...ExtraArgs>[[nodiscard]] QTaskBuilder<Task, ExtraArgs...>withArguments(ExtraArgs &&...args);[[nodiscard]] QTaskBuilder<Task, Args...> &onThreadPool(QThreadPool &newThreadPool);[[nodiscard]] QTaskBuilder<Task, Args...> &withPriority(int newPriority);};}// namespace QtConcurrent#elsenamespace QtConcurrent {enumclass FutureResult { Ignore };template<class Task,class...Args>class QTaskBuilder {public:[[nodiscard]]autospawn(){return TaskResolver<std::decay_t<Task>,std::decay_t<Args>...>::run(std::move(taskWithArgs), startParameters);}// We don't want to run with promise when we don't return a QFuturevoidspawn(FutureResult){(new StoredFunctionCall<Task, Args...>(std::move(taskWithArgs)))->start(startParameters);}template<class...ExtraArgs>[[nodiscard]]constexpr autowithArguments(ExtraArgs &&...args){static_assert(std::tuple_size_v<TaskWithArgs> ==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 changedreturn QTaskBuilder<Task, ExtraArgs...>( startParameters,std::get<0>(std::move(taskWithArgs)),std::forward<ExtraArgs>(args)...);}[[nodiscard]]constexpr auto&onThreadPool(QThreadPool &newThreadPool){ startParameters.threadPool = &newThreadPool;return*this;}[[nodiscard]]constexpr auto&withPriority(int newPriority){ startParameters.priority = newPriority;return*this;}protected:// Methodsconstexpr explicitQTaskBuilder(Task &&task, Args &&...arguments): taskWithArgs{std::forward<Task>(task),std::forward<Args>(arguments)...}{}constexprQTaskBuilder(const TaskStartParameters &parameters, Task &&task, Args &&...arguments): taskWithArgs{std::forward<Task>(task),std::forward<Args>(arguments)...}, startParameters{parameters}{}private:// Methods// Required for creating a builder from "task" functiontemplate<class T>friend constexpr autotask(T &&t);// Required for creating a new builder from "withArguments" functiontemplate<class T,class...A>friend class QTaskBuilder;private:// Datausing TaskWithArgs = DecayedTuple<Task, Args...>; TaskWithArgs taskWithArgs; TaskStartParameters startParameters;};}// namespace QtConcurrent#endif// Q_QDOC QT_END_NAMESPACE #endif// !defined(QT_NO_CONCURRENT)#endif//QTBASE_QTTASKBUILDER_H
close