44#include < flow/step.hpp>
55#include < log/log.hpp>
66
7+ #include < stdx/ct_string.hpp>
78#include < stdx/cx_vector.hpp>
89#include < stdx/span.hpp>
910
1314#include < type_traits>
1415
1516namespace flow {
17+ namespace detail {
18+ template <typename CTNode> constexpr auto run_func () -> void {
19+ if (CTNode::condition) {
20+ typename CTNode::func_t {}();
21+ }
22+ }
23+
24+ template <typename Flow, typename CTNode> constexpr auto log_func () -> void {
25+ if (CTNode::condition) {
26+ using log_spec_t = decltype (get_log_spec<CTNode, Flow>());
27+ CIB_LOG (typename log_spec_t ::flavor, log_spec_t ::level, " flow.{}({})" ,
28+ typename CTNode::type_t {}, typename CTNode::name_t {});
29+ }
30+ }
31+ } // namespace detail
32+
33+ struct rt_node {
34+ constexpr rt_node () = default;
35+
36+ template <typename Flow, typename CTNode> constexpr rt_node (Flow, CTNode) {
37+ // GCC wants these to be explicitly marked constexpr
38+ constexpr auto rf = detail::run_func<CTNode>;
39+ constexpr auto lf = detail::log_func<Flow, CTNode>;
40+ run = rf;
41+ log_name = lf;
42+ }
43+
44+ FunctionPtr run{};
45+ FunctionPtr log_name{};
46+
47+ private:
48+ friend constexpr auto operator ==(rt_node const &,
49+ rt_node const &) -> bool = default ;
50+ };
51+
1652/* *
1753 * flow::impl is a constant representation of a series of Milestones and actions
1854 * to be executed in a specific order.
@@ -45,11 +81,16 @@ template <stdx::ct_string Name, std::size_t NumSteps> class impl {
4581 public:
4682 stdx::cx_vector<FunctionPtr, capacity> functionPtrs{};
4783
48- using node_t = rt_node;
4984 constexpr static bool active = capacity > 0 ;
50-
5185 constexpr static auto name = Name;
5286
87+ using node_t = rt_node;
88+
89+ template <typename CTNode>
90+ constexpr static auto create_node (CTNode n) -> node_t {
91+ return node_t {log_spec_id_t <Name>{}, n};
92+ }
93+
5394 /* *
5495 * Create a new flow::impl of Milestones.
5596 *
@@ -60,17 +101,16 @@ template <stdx::ct_string Name, std::size_t NumSteps> class impl {
60101 *
61102 * @see flow::builder
62103 */
63- constexpr explicit (true )
64- impl(stdx::span<node_t const , NumSteps> newMilestones) {
104+ constexpr explicit (true ) impl(stdx::span<node_t const , NumSteps> steps) {
65105 if constexpr (loggingEnabled) {
66- for (auto const &milestone : newMilestones ) {
67- functionPtrs.push_back (milestone .log_name );
68- functionPtrs.push_back (milestone .run );
106+ for (auto const &step : steps ) {
107+ functionPtrs.push_back (step .log_name );
108+ functionPtrs.push_back (step .run );
69109 }
70110 } else {
71- std::transform (std::cbegin (newMilestones ), std::cend (newMilestones ),
111+ std::transform (std::cbegin (steps ), std::cend (steps ),
72112 std::back_inserter (functionPtrs),
73- [](auto const &milestone ) { return milestone .run ; });
113+ [](auto const &step ) { return step .run ; });
74114 }
75115 }
76116};
0 commit comments