diff --git a/src/libs/utils/tasktree.h b/src/libs/utils/tasktree.h index a82d5a235d7..cac275f9c43 100644 --- a/src/libs/utils/tasktree.h +++ b/src/libs/utils/tasktree.h @@ -259,43 +259,28 @@ public: static Adapter *createAdapter() { return new Adapter; } template CustomTask(SetupFunction &&function, const EndHandler &done = {}, const EndHandler &error = {}) - : TaskItem({&createAdapter, wrapSetup(function), wrapEnd(done), wrapEnd(error)}) {} + : TaskItem({&createAdapter, wrapSetup(std::forward(function)), + wrapEnd(done), wrapEnd(error)}) {} private: template - using IsDynamic = typename std::is_same, typename Adapter::Type &>>; - - template - using IsVoid = typename std::is_same, typename Adapter::Type &>>; - - template::value, bool> = true> - static TaskItem::TaskSetupHandler wrapSetup(SetupFunction &&function) { - return [=](TaskInterface &taskInterface) { - Adapter &adapter = static_cast(taskInterface); - return std::invoke(function, *adapter.task()); - }; - }; - - template::value, bool> = true> static TaskItem::TaskSetupHandler wrapSetup(SetupFunction &&function) { + constexpr bool isDynamic = std::is_same_v, typename Adapter::Type &>>; + constexpr bool isVoid = std::is_same_v, typename Adapter::Type &>>; + static_assert(isDynamic || isVoid, + "Task setup handler needs to take (Task &) as an argument and has to return " + "void or TaskAction. The passed handler doesn't fulfill these requirements."); return [=](TaskInterface &taskInterface) { Adapter &adapter = static_cast(taskInterface); + if constexpr (isDynamic) + return std::invoke(function, *adapter.task()); std::invoke(function, *adapter.task()); return TaskAction::Continue; }; }; - template::value - && !IsVoid::value, bool> = true> - static TaskItem::TaskSetupHandler wrapSetup(SetupFunction &&) { - static_assert(IsDynamic::value || IsVoid::value, - "Task setup handler needs to take (Task &) as an argument and has to return " - "void or TaskAction. The passed handler doesn't fulfill these requirements."); - return {}; - }; - static TaskEndHandler wrapEnd(const EndHandler &handler) { if (!handler) return {}; @@ -331,13 +316,15 @@ public: template void onStorageSetup(const Tasking::TreeStorage &storage, - const StorageHandler &handler) { - setupStorageHandler(storage, wrapHandler(handler), {}); + StorageHandler &&handler) { + setupStorageHandler(storage, + wrapHandler(std::forward(handler)), {}); } template void onStorageDone(const Tasking::TreeStorage &storage, - const StorageHandler &handler) { - setupStorageHandler(storage, {}, wrapHandler(handler)); + StorageHandler &&handler) { + setupStorageHandler(storage, + {}, wrapHandler(std::forward(handler))); } signals: @@ -351,13 +338,11 @@ private: void setupStorageHandler(const Tasking::TreeStorageBase &storage, StorageVoidHandler setupHandler, StorageVoidHandler doneHandler); - template - StorageVoidHandler wrapHandler(const std::function &handler) { - if (!handler) - return {}; - return [handler](void *voidStruct) { + template + StorageVoidHandler wrapHandler(StorageHandler &&handler) { + return [=](void *voidStruct) { StorageStruct *storageStruct = static_cast(voidStruct); - handler(storageStruct); + std::invoke(handler, storageStruct); }; }