@@ -616,30 +616,6 @@ struct Processes {
616616 std::tuple<Ts...> processes;
617617};
618618
619- template <typename T>
620- std::tuple<std::string, std::shared_ptr<T>> getNameAndTask ()
621- {
622- auto type_name_str = type_name<T>();
623- std::string name = type_to_task_name (type_name_str);
624- auto task = std::make_shared<T>();
625- return std::make_tuple (name, task);
626- }
627-
628- template <typename T, typename T2 , typename ... Args>
629- std::tuple<std::string, std::shared_ptr<T>> getNameAndTask (T2 && firstArg, Args&&... args)
630- {
631- if constexpr (std::is_same_v<typename std::decay<T2 >::type, TaskName>) {
632- std::string name = firstArg.value ;
633- auto task = std::make_shared<T>(std::forward<Args>(args)...);
634- return std::make_tuple (name, task);
635- } else {
636- auto type_name_str = type_name<T>();
637- std::string name = type_to_task_name (type_name_str);
638- auto task = std::make_shared<T>(std::forward<T2 , Args>(firstArg, args)...);
639- return std::make_tuple (name, task);
640- }
641- }
642-
643619template <typename T, typename ... S, typename ... A>
644620auto getNameTaskProcesses (TaskName first, Processes<S...> second, A... args)
645621{
@@ -658,7 +634,11 @@ template <typename T, typename... A>
658634auto getNameTaskProcesses (TaskName first, A... args)
659635{
660636 auto task = std::make_shared<T>(std::forward<A>(args)...);
661- return std::make_tuple (first.value , task, std::make_tuple (&T::process));
637+ if constexpr (has_process_v<T>) {
638+ return std::make_tuple (first.value , task, std::make_tuple (&T::process));
639+ } else {
640+ return std::make_tuple (first.value , task, std::make_tuple ());
641+ }
662642}
663643
664644template <typename T, typename ... S, typename ... A>
@@ -673,9 +653,14 @@ auto getNameTaskProcesses(Processes<S...> first, A... args)
673653template <typename T>
674654auto getNameTaskProcesses ()
675655{
676- std::string name = type_to_task_name (type_name<T>());
656+ auto type_name_str = type_name<T>();
657+ std::string name = type_to_task_name (type_name_str);
677658 auto task = std::make_shared<T>();
678- return std::make_tuple (name, task, std::make_tuple (&T::process));
659+ if constexpr (has_process_v<T>) {
660+ return std::make_tuple (name, task, std::make_tuple (&T::process));
661+ } else {
662+ return std::make_tuple (name, task, std::make_tuple ());
663+ }
679664}
680665
681666// / Adaptor to make an AlgorithmSpec from a o2::framework::Task
@@ -699,7 +684,7 @@ DataProcessorSpec adaptAnalysisTask(ConfigContext const& ctx, Args&&... args)
699684 std::vector<ConfigParamSpec> options;
700685
701686 auto tupledTask = o2::framework::to_tuple_refs (*task.get ());
702- static_assert (has_process_v<T> || has_run_v<T> || has_init_v<T>,
687+ static_assert (std::tuple_size_v<std:: decay_t < decltype (processTuple)>> > 0 || has_run_v<T> || has_init_v<T>,
703688 " At least one of process(...), T::run(...), init(...) must be defined" );
704689
705690 std::vector<InputSpec> inputs;
@@ -708,7 +693,7 @@ DataProcessorSpec adaptAnalysisTask(ConfigContext const& ctx, Args&&... args)
708693 // / make sure options and configurables are set before expression infos are created
709694 std::apply ([&options, &hash](auto &... x) { return (OptionManager<std::decay_t <decltype (x)>>::appendOption (options, x), ...); }, tupledTask);
710695
711- if constexpr (has_process_v<T> ) {
696+ if constexpr ((std::tuple_size_v<std:: decay_t < decltype (processTuple)>>) > 0 ) {
712697 // this pushes (I,schemaPtr,nullptr) into expressionInfos for arguments that are Filtered/filtered_iterators
713698 AnalysisDataProcessorBuilder::inputsFromArgsTuple (processTuple, inputs, expressionInfos);
714699 }
@@ -739,7 +724,7 @@ DataProcessorSpec adaptAnalysisTask(ConfigContext const& ctx, Args&&... args)
739724 };
740725 callbacks.set (CallbackService::Id::EndOfStream, endofdatacb);
741726
742- if constexpr (has_process_v<T> ) {
727+ if constexpr ((std::tuple_size_v<std:: decay_t < decltype (processTuple)>>) > 0 ) {
743728 // / update configurables in filters
744729 std::apply (
745730 [&ic](auto &... x) { return (FilterManager<std::decay_t <decltype (x)>>::updatePlaceholders (x, ic), ...); },
@@ -765,7 +750,7 @@ DataProcessorSpec adaptAnalysisTask(ConfigContext const& ctx, Args&&... args)
765750 if constexpr (has_run_v<T>) {
766751 task->run (pc);
767752 }
768- if constexpr (has_process_v<T> ) {
753+ if constexpr ((std::tuple_size_v<std:: decay_t < decltype (processTuple)>>) > 0 ) {
769754 AnalysisDataProcessorBuilder::invokeProcessTuple (*(task.get ()), pc.inputs (), processTuple, expressionInfos);
770755 }
771756 std::apply ([&pc](auto &&... x) { return (OutputManager<std::decay_t <decltype (x)>>::finalize (pc, x), ...); }, tupledTask);
0 commit comments