summaryrefslogtreecommitdiffstats
path: root/src/concurrent/qtconcurrentstoredfunctioncall.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/concurrent/qtconcurrentstoredfunctioncall.h')
-rw-r--r--src/concurrent/qtconcurrentstoredfunctioncall.h81
1 files changed, 71 insertions, 10 deletions
diff --git a/src/concurrent/qtconcurrentstoredfunctioncall.h b/src/concurrent/qtconcurrentstoredfunctioncall.h
index 1257d70b829..f52b6e2efc0 100644
--- a/src/concurrent/qtconcurrentstoredfunctioncall.h
+++ b/src/concurrent/qtconcurrentstoredfunctioncall.h
@@ -102,17 +102,21 @@ template <class IsMember, class Function, class PromiseType, class... Args>
struct FunctionResolverHelper;
template <class Function, class PromiseType, class... Args>
-struct FunctionResolverHelper<std::false_type, Function, PromiseType, Args...> : public NonMemberFunctionResolver<Function, PromiseType, Args...>
+struct FunctionResolverHelper<std::false_type, Function, PromiseType, Args...>
+ : public NonMemberFunctionResolver<Function, PromiseType, Args...>
{
};
template <class Function, class PromiseType, class... Args>
-struct FunctionResolverHelper<std::true_type, Function, PromiseType, Args...> : public MemberFunctionResolver<Function, PromiseType, Args...>
+struct FunctionResolverHelper<std::true_type, Function, PromiseType, Args...>
+ : public MemberFunctionResolver<Function, PromiseType, Args...>
{
};
template <class Function, class PromiseType, class... Args>
-struct FunctionResolver : public FunctionResolverHelper<typename std::is_member_function_pointer<std::decay_t<Function>>::type, Function, PromiseType, Args...>
+struct FunctionResolver
+ : public FunctionResolverHelper<typename std::is_member_function_pointer<
+ std::decay_t<Function>>::type, Function, PromiseType, Args...>
{
};
@@ -134,10 +138,6 @@ using DecayedTuple = std::tuple<std::decay_t<Types>...>;
template <class Function, class ...Args>
struct StoredFunctionCall : public RunFunctionTask<InvokeResultType<Function, Args...>>
{
- StoredFunctionCall(Function &&f, Args &&...args)
- : data{std::forward<Function>(f), std::forward<Args>(args)...}
- {}
-
StoredFunctionCall(DecayedTuple<Function, Args...> &&_data)
: data(std::move(_data))
{}
@@ -165,11 +165,13 @@ struct StoredFunctionCallWithPromise : public RunFunctionTaskBase<PromiseType>
using DataType = typename Resolver::Type;
StoredFunctionCallWithPromise(Function &&f, Args &&...args)
: prom(this->promise),
- data(std::move(Resolver::initData(std::forward<Function>(f), std::ref(prom), std::forward<Args>(args)...)))
+ data(std::move(Resolver::initData(std::forward<Function>(f), std::ref(prom),
+ std::forward<Args>(args)...)))
{}
- StoredFunctionCallWithPromise(DataType &&_data)
- : data(std::move(_data))
+ StoredFunctionCallWithPromise(DecayedTuple<Function, Args...> &&_data)
+ : StoredFunctionCallWithPromise(std::move(_data),
+ std::index_sequence_for<std::decay_t<Function>, std::decay_t<Args>...>())
{}
protected:
@@ -179,10 +181,69 @@ protected:
}
private:
+ // helper to pack back the tuple into parameter pack
+ template<std::size_t... Is>
+ StoredFunctionCallWithPromise(DecayedTuple<Function, Args...> &&_data,
+ std::index_sequence<Is...>)
+ : StoredFunctionCallWithPromise(std::move(std::get<Is>(_data))...)
+ {}
+
QPromise<PromiseType> prom;
DataType data;
};
+template<typename...>
+struct NonPromiseTaskResolver;
+
+template <typename Function, typename ... Args>
+struct NonPromiseTaskResolver<Function, Args...>
+{
+ using TaskWithArgs = DecayedTuple<Function, Args...>;
+ static auto run(TaskWithArgs &&args, const TaskStartParameters &startParameters) {
+ return (new StoredFunctionCall<Function, Args...>(std::move(args)))
+ ->start(startParameters);
+ }
+};
+
+template<typename...>
+struct PromiseTaskResolver;
+
+template <typename Function, typename ... Args>
+struct PromiseTaskResolver<Function, Args...>
+{
+ static_assert(QtPrivate::ArgResolver<Function>::IsPromise::value,
+ "The first argument of passed callable object isn't a QPromise<T> & type. "
+ "Did you intend to pass a callable which takes a QPromise<T> & type as a first argument? "
+ "Otherwise it's not possible to invoke the function with passed arguments.");
+ using TaskWithArgs = DecayedTuple<Function, Args...>;
+ static auto run(TaskWithArgs &&args, const TaskStartParameters &startParameters) {
+ using PromiseType = typename QtPrivate::ArgResolver<Function>::PromiseType;
+ return (new StoredFunctionCallWithPromise<Function, PromiseType, Args...>(std::move(args)))
+ ->start(startParameters);
+ }
+};
+
+template <class IsDirectlyInvocable, class Function, class... Args>
+struct TaskResolverHelper;
+
+template <class Function, class... Args>
+struct TaskResolverHelper<std::true_type, Function, Args...>
+ : public NonPromiseTaskResolver<Function, Args...>
+{
+};
+
+template <class Function, class... Args>
+struct TaskResolverHelper<std::false_type, Function, Args...>
+ : public PromiseTaskResolver<Function, Args...>
+{
+};
+
+template <class Function, class... Args>
+struct TaskResolver : public TaskResolverHelper<typename std::is_invocable<std::decay_t<Function>,
+ std::decay_t<Args>...>::type, Function, Args...>
+{
+};
+
} //namespace QtConcurrent
#endif // Q_QDOC