File indexing completed on 2025-11-04 10:21:34
0001 
0002 
0003 
0004 #ifndef QTBASE_QTTASKBUILDER_H
0005 #define QTBASE_QTTASKBUILDER_H
0006 
0007 #if !defined(QT_NO_CONCURRENT) || defined(Q_QDOC)
0008 
0009 #include <QtConcurrent/qtconcurrentstoredfunctioncall.h>
0010 
0011 QT_BEGIN_NAMESPACE
0012 
0013 #ifdef Q_QDOC
0014 
0015 namespace QtConcurrent {
0016 
0017 enum class FutureResult { Ignore };
0018 
0019 using InvokeResultType = int;
0020 
0021 template <class Task, class ...Args>
0022 class QTaskBuilder
0023 {
0024 public:
0025     [[nodiscard]]
0026     QFuture<InvokeResultType> spawn();
0027 
0028     void spawn(FutureResult);
0029 
0030     template <class ...ExtraArgs>
0031     [[nodiscard]]
0032     QTaskBuilder<Task, ExtraArgs...> withArguments(ExtraArgs &&...args);
0033 
0034     [[nodiscard]]
0035     QTaskBuilder<Task, Args...> &onThreadPool(QThreadPool &newThreadPool);
0036 
0037     [[nodiscard]]
0038     QTaskBuilder<Task, Args...> &withPriority(int newPriority);
0039 };
0040 
0041 } 
0042 
0043 #else
0044 
0045 namespace QtConcurrent {
0046 
0047 enum class FutureResult { Ignore };
0048 
0049 template <class Task, class ...Args>
0050 class QTaskBuilder
0051 {
0052 public:
0053     [[nodiscard]]
0054     auto spawn()
0055     {
0056         return TaskResolver<std::decay_t<Task>, std::decay_t<Args>...>::run(
0057                     std::move(taskWithArgs), startParameters);
0058     }
0059 
0060     
0061     void spawn(FutureResult)
0062     {
0063         (new StoredFunctionCall<Task, Args...>(std::move(taskWithArgs)))
0064             ->start(startParameters);
0065     }
0066 
0067     template <class ...ExtraArgs>
0068     [[nodiscard]]
0069     constexpr auto withArguments(ExtraArgs &&...args)
0070     {
0071         static_assert(std::tuple_size_v<TaskWithArgs> == 1,
0072                       "This function cannot be invoked if "
0073                       "arguments have already been passed.");
0074 
0075         static_assert(sizeof...(ExtraArgs) >= 1,
0076                       "One or more arguments must be passed.");
0077 
0078         
0079         return QTaskBuilder<Task, ExtraArgs...>(
0080                    startParameters,
0081                    std::get<0>(std::move(taskWithArgs)),
0082                    std::forward<ExtraArgs>(args)...
0083                );
0084     }
0085 
0086     [[nodiscard]]
0087     constexpr auto &onThreadPool(QThreadPool &newThreadPool)
0088     {
0089         startParameters.threadPool = &newThreadPool;
0090         return *this;
0091     }
0092 
0093     [[nodiscard]]
0094     constexpr auto &withPriority(int newPriority)
0095     {
0096         startParameters.priority = newPriority;
0097         return *this;
0098     }
0099 
0100 protected: 
0101     constexpr explicit QTaskBuilder(Task &&task, Args &&...arguments)
0102         : taskWithArgs{std::forward<Task>(task), std::forward<Args>(arguments)...}
0103     {}
0104 
0105     constexpr QTaskBuilder(
0106         const TaskStartParameters ¶meters, Task &&task, Args &&...arguments)
0107         : taskWithArgs{std::forward<Task>(task), std::forward<Args>(arguments)...}
0108         , startParameters{parameters}
0109     {}
0110 
0111 private: 
0112     
0113     template <class T>
0114     friend constexpr auto task(T &&t);
0115 
0116     
0117     template <class T, class ...A>
0118     friend class QTaskBuilder;
0119 
0120 private: 
0121     using TaskWithArgs = DecayedTuple<Task, Args...>;
0122 
0123     TaskWithArgs taskWithArgs;
0124     TaskStartParameters startParameters;
0125 };
0126 
0127 } 
0128 
0129 #endif 
0130 
0131 QT_END_NAMESPACE
0132 
0133 #endif 
0134 
0135 #endif