@@ -365,35 +365,30 @@ auto FlowBuilder::emplace(C&&... cs) {
365365// Function: emplace
366366template <typename C>
367367Task FlowBuilder::emplace (C&& c) {
368-
369- // dynamic tasking
370- if constexpr (std::is_invocable_v<C, Subflow&>) {
371- auto n = _graph.emplace_back (std::in_place_type_t <Node::DynamicWork>{},
372- [c=std::forward<C>(c)] (Subflow& fb) mutable {
373- // first time execution
374- if (fb._graph .empty ()) {
375- c (fb);
376- }
377- });
378- return Task (n);
379- }
380- // condition tasking
381- else if constexpr (std::is_same_v<typename function_traits<C>::return_type, int >) {
368+
369+ // static task
370+ if constexpr (is_static_task_v<C>) {
382371 auto n = _graph.emplace_back (
383- std::in_place_type_t <Node::ConditionWork >{}, std::forward<C>(c)
372+ std::in_place_type_t <Node::StaticWork >{}, std::forward<C>(c)
384373 );
385374 return Task (n);
386375 }
387- // static tasking
388- else if constexpr (std::is_same_v< typename function_traits<C>::return_type, void >) {
376+ // condition task
377+ else if constexpr (is_condition_task_v<C >) {
389378 auto n = _graph.emplace_back (
390- std::in_place_type_t <Node::StaticWork >{}, std::forward<C>(c)
379+ std::in_place_type_t <Node::ConditionWork >{}, std::forward<C>(c)
391380 );
392381 return Task (n);
393382 }
394- // placeholder
395- else if constexpr (std::is_same_v<C, std::monostate>) {
396- auto n = _graph.emplace_back ();
383+ // dynamic task
384+ else if constexpr (is_dynamic_task_v<C>) {
385+ auto n = _graph.emplace_back (std::in_place_type_t <Node::DynamicWork>{},
386+ [c=std::forward<C>(c)] (Subflow& fb) mutable {
387+ // first time execution
388+ if (fb._graph .empty ()) {
389+ c (fb);
390+ }
391+ });
397392 return Task (n);
398393 }
399394 else {
@@ -975,15 +970,15 @@ Task& Task::work(C&& c) {
975970 }
976971
977972 // static tasking
978- if constexpr (std::is_same_v< typename function_traits<C>::return_type, void >) {
973+ if constexpr (is_static_task_v<C >) {
979974 _node->_work .emplace <Node::StaticWork>(std::forward<C>(c));
980975 }
981976 // condition tasking
982- else if constexpr (std::is_same_v< typename function_traits<C>::return_type, int >) {
977+ else if constexpr (is_condition_task_v<C >) {
983978 _node->_work .emplace <Node::ConditionWork>(std::forward<C>(c));
984979 }
985980 // dyanmic tasking
986- else if constexpr (std::is_invocable_v<C, Subflow& >) {
981+ else if constexpr (is_dynamic_task_v<C >) {
987982 _node->_work .emplace <Node::DynamicWork>(
988983 [c=std::forward<C>(c)] (Subflow& fb) mutable {
989984 // first time execution
@@ -992,10 +987,6 @@ Task& Task::work(C&& c) {
992987 }
993988 });
994989 }
995- // placeholder
996- else if constexpr (std::is_same_v<C, std::monostate>) {
997- _node->_work .emplace <std::monostate>();
998- }
999990 else {
1000991 static_assert (dependent_false_v<C>, " invalid task work type" );
1001992 }
0 commit comments