11#pragma once
22
33#include " reactor-cpp/reactor-cpp.hh"
4- #include " BaseTrigger .hh"
4+ #include " ReactionBase .hh"
55#include " Reactor.hh"
66
77namespace sdk
@@ -26,7 +26,7 @@ inline constexpr bool is_specialization_v = is_specialization<T, Template>::valu
2626
2727
2828template <typename InputTuple, typename DependencyTuple, typename OutputTuple>
29- class ReactionOutput : public BaseTrigger
29+ class ReactionOutput : public ReactionBase
3030{
3131private:
3232 InputTuple input_triggers;
@@ -35,28 +35,32 @@ private:
3535
3636public:
3737 explicit ReactionOutput (std::string name, Reactor *parent, InputTuple inputs, DependencyTuple deps, OutputTuple outputs)
38- : BaseTrigger (name, parent), input_triggers(std::move(inputs)), dependencies(std::move(deps)), output_triggers(std::move(outputs)) {}
38+ : ReactionBase (name, parent), input_triggers(std::move(inputs)), dependencies(std::move(deps)), output_triggers(std::move(outputs)) {}
3939 ~ReactionOutput () {}
4040
4141 template <typename Fn>
4242 Reaction<Fn, InputTuple, DependencyTuple, OutputTuple> &function (Fn func)
4343 {
44+ if (sizeof (func) != sizeof (void *)) {
45+ reactor::log::Error () << " Reactor: " << reactor->fqn () << " Reaction: " << name << " Accesses variables outside of its scope" ;
46+ exit (EXIT_FAILURE);
47+ }
4448 auto ReactionRef = std::make_shared<Reaction<Fn, InputTuple, DependencyTuple, OutputTuple>> (name, reactor, std::move (input_triggers), std::move (dependencies), std::move (output_triggers), std::forward<Fn>(func));
4549 ReactionRef->execute ();
4650 return *ReactionRef;
4751 }
4852};
4953
5054template <typename InputTuple, typename DependencyTuple>
51- class ReactionDependency : public BaseTrigger
55+ class ReactionDependency : public ReactionBase
5256{
5357private:
5458 InputTuple input_triggers;
5559 DependencyTuple dependencies;
5660
5761public:
5862 explicit ReactionDependency (std::string name, Reactor *parent, InputTuple inputs, DependencyTuple deps)
59- : BaseTrigger (name, parent), input_triggers(inputs), dependencies(std::move(deps)) {}
63+ : ReactionBase (name, parent), input_triggers(inputs), dependencies(std::move(deps)) {}
6064 ~ReactionDependency () {}
6165
6266 template <typename ... Outputs>
@@ -70,14 +74,14 @@ public:
7074};
7175
7276template <typename InputTuple>
73- class ReactionInput : public BaseTrigger
77+ class ReactionInput : public ReactionBase
7478{
7579private:
7680 InputTuple input_triggers;
7781
7882public:
7983 explicit ReactionInput (std::string name, Reactor *parent, InputTuple inputs)
80- : BaseTrigger (name, parent), input_triggers(std::move(inputs)) {}
84+ : ReactionBase (name, parent), input_triggers(std::move(inputs)) {}
8185 ~ReactionInput () {}
8286
8387 template <typename ... Dependencies>
@@ -90,8 +94,27 @@ public:
9094 }
9195};
9296
97+ class ReactionName : public ReactionBase {
98+ public:
99+ explicit ReactionName (std::string name, Reactor *parent)
100+ : ReactionBase (name, parent) {}
101+ ~ReactionName () = default ;
102+
103+ template <typename ... Inputs>
104+ ReactionInput<std::tuple<Inputs...>> &triggers (Inputs&&... inputs)
105+ {
106+ auto input_tuple = std::make_tuple (inputs...);
107+ auto ReactionInputRef = std::make_shared<ReactionInput<std::tuple<Inputs...>>> (name, reactor, std::move (input_tuple));
108+ next = ReactionInputRef;
109+ return *ReactionInputRef;
110+ }
111+
112+ // template <typename ReactorType, typename ParameterType>
113+ // friend class ReactionInternals;
114+ };
115+
93116template <typename Fn, typename InputTuple, typename DependencyTuple, typename OutputTuple>
94- class Reaction : public BaseTrigger
117+ class Reaction : public ReactionBase
95118{
96119private:
97120 InputTuple input_triggers;
@@ -195,7 +218,7 @@ private:
195218
196219public:
197220 Reaction (std::string name, Reactor *parent, InputTuple inputs, DependencyTuple deps, OutputTuple outputs, Fn func)
198- : BaseTrigger (name, parent), input_triggers(std::move(inputs)), dependencies(std::move(deps)), output_triggers(std::move(outputs)), user_function(std::forward<Fn>(func)) { /* std::cout << "Creating Reaction\n"; */ }
221+ : ReactionBase (name, parent), input_triggers(std::move(inputs)), dependencies(std::move(deps)), output_triggers(std::move(outputs)), user_function(std::forward<Fn>(func)) { /* std::cout << "Creating Reaction\n"; */ }
199222 ~Reaction () {}
200223
201224 void execute () {
@@ -222,7 +245,6 @@ public:
222245 set_input_triggers (reaction, input_triggers);
223246 set_dependencies (reaction, dependencies);
224247 set_output_triggers (reaction, output_triggers);
225-
226248 }
227249
228250 template <typename Dfn>
@@ -248,4 +270,34 @@ public:
248270 }
249271};
250272
273+ template <typename ReactorType, typename ParameterType>
274+ class ReactionInternals : public ReactionBase {
275+ ReactorType *reactor_;
276+
277+ protected:
278+ const ParameterType ¶meters;
279+ public:
280+ ReactionInternals (Reactor *owner, ParameterType ¶m)
281+ : ReactionBase(" reaction-internals" , owner), reactor_((ReactorType*) owner), parameters(param) {
282+ reactor_->add_reaction_internals (this );
283+ }
284+
285+ ReactionName &reaction (const std::string name) {
286+ auto ReactionNameRef = std::make_shared<ReactionName>(name, reactor);
287+ next = ReactionNameRef;
288+ return *ReactionNameRef;
289+ }
290+
291+ virtual void add_reactions (ReactorType *reactor) = 0;
292+ virtual void assemble () override {
293+ add_reactions (reactor_);
294+ }
295+
296+ auto fqn () const noexcept -> const std::string& { return reactor_->fqn (); }
297+ auto get_elapsed_logical_time () const noexcept -> Duration { return reactor_->get_elapsed_logical_time (); }
298+ auto get_microstep () const noexcept -> reactor::mstep_t { return reactor_->get_microstep (); }
299+ auto get_elapsed_physical_time () const noexcept -> Duration { return reactor_->get_elapsed_physical_time (); }
300+ void request_stop () { reactor_->environment ()->sync_shutdown (); }
301+ };
302+
251303} // namespace sdk
0 commit comments