4
4
#include < flow/step.hpp>
5
5
#include < log/log.hpp>
6
6
7
+ #include < stdx/ct_string.hpp>
7
8
#include < stdx/cx_vector.hpp>
8
9
#include < stdx/span.hpp>
9
10
13
14
#include < type_traits>
14
15
15
16
namespace 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
+
16
52
/* *
17
53
* flow::impl is a constant representation of a series of Milestones and actions
18
54
* to be executed in a specific order.
@@ -45,11 +81,16 @@ template <stdx::ct_string Name, std::size_t NumSteps> class impl {
45
81
public:
46
82
stdx::cx_vector<FunctionPtr, capacity> functionPtrs{};
47
83
48
- using node_t = rt_node;
49
84
constexpr static bool active = capacity > 0 ;
50
-
51
85
constexpr static auto name = Name;
52
86
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
+
53
94
/* *
54
95
* Create a new flow::impl of Milestones.
55
96
*
@@ -60,17 +101,16 @@ template <stdx::ct_string Name, std::size_t NumSteps> class impl {
60
101
*
61
102
* @see flow::builder
62
103
*/
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) {
65
105
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 );
69
109
}
70
110
} else {
71
- std::transform (std::cbegin (newMilestones ), std::cend (newMilestones ),
111
+ std::transform (std::cbegin (steps ), std::cend (steps ),
72
112
std::back_inserter (functionPtrs),
73
- [](auto const &milestone ) { return milestone .run ; });
113
+ [](auto const &step ) { return step .run ; });
74
114
}
75
115
}
76
116
};
0 commit comments