@@ -41,6 +41,9 @@ class Fsm : public cpp_event_framework::Statemachine<StatemachineImpl, const cpp
4141 static const State kRedYellow ;
4242
4343private:
44+ static const std::array<State::EntryExitType, 2 > FsmOffEntryActions;
45+ static const std::array<State::EntryExitType, 2 > FsmOffExitActions;
46+
4447 static Transition FsmOffHandler (ImplPtr /* impl*/ , Event event);
4548
4649 static Transition FsmOnHandler (ImplPtr /* impl*/ , Event event);
@@ -93,7 +96,9 @@ class StatemachineImpl
9396 }
9497
9598 bool off_entry_called_ = false ;
99+ bool off_entry2_called_ = false ;
96100 bool off_exit_called_ = false ;
101+ bool off_exit2_called_ = false ;
97102 bool on_entry_called_ = false ;
98103 bool on_exit_called_ = false ;
99104 bool yellow_red_transition1_called_ = false ;
@@ -112,7 +117,9 @@ class StatemachineImpl
112117 void CheckAllFalse () const
113118 {
114119 assert (off_entry_called_ == false );
120+ assert (off_entry2_called_ == false );
115121 assert (off_exit_called_ == false );
122+ assert (off_exit2_called_ == false );
116123 assert (on_entry_called_ == false );
117124 assert (on_exit_called_ == false );
118125 assert (yellow_red_transition1_called_ == false );
@@ -127,13 +134,23 @@ class StatemachineImpl
127134 off_entry_called_ = true ;
128135 std::cout << " Off entry\n " ;
129136 }
137+ void FsmOffEntry2 ()
138+ {
139+ off_entry2_called_ = true ;
140+ std::cout << " Off entry2\n " ;
141+ }
130142
131143 void FsmOffExit ()
132144 {
133145 off_exit_called_ = true ;
134146 fsm_.RecallEvents ();
135147 std::cout << " Off exit\n " ;
136148 }
149+ void FsmOffExit2 ()
150+ {
151+ off_exit2_called_ = true ;
152+ std::cout << " Off exit2\n " ;
153+ }
137154
138155 void FsmOnEntry ()
139156 {
@@ -179,26 +196,34 @@ class StatemachineImpl
179196 assert (fsm_.CurrentState () == &Fsm::kOff );
180197 assert (off_entry_called_ == true );
181198 off_entry_called_ = false ;
199+ assert (off_entry2_called_ == true );
200+ off_entry2_called_ = false ;
182201 CheckAllFalse ();
183202
184203 fsm_.React (EvtSelfTransition::MakeShared ());
185204 assert (fsm_.CurrentState () == &Fsm::kOff );
186205 assert (off_entry_called_ == true );
187206 off_entry_called_ = false ;
207+ assert (off_entry2_called_ == true );
208+ off_entry2_called_ = false ;
188209 assert (off_exit_called_ == true );
189210 off_exit_called_ = false ;
211+ assert (off_exit2_called_ == true );
212+ off_exit2_called_ = false ;
190213 assert (on_recall_event_called_ == true );
191214 on_recall_event_called_ = false ;
192215 CheckAllFalse ();
193216
194217 fsm_.React (EvtTurnOn::MakeShared ());
195218 assert (off_exit_called_ == true );
196- assert (on_entry_called_ == true );
197- assert (on_recall_event_called_ == true );
198- assert (fsm_.CurrentState () == &Fsm::kGreen );
199219 off_exit_called_ = false ;
220+ assert (off_exit2_called_ == true );
221+ off_exit2_called_ = false ;
222+ assert (on_entry_called_ == true );
200223 on_entry_called_ = false ;
224+ assert (on_recall_event_called_ == true );
201225 on_recall_event_called_ = false ;
226+ assert (fsm_.CurrentState () == &Fsm::kGreen );
202227 CheckAllFalse ();
203228
204229 fsm_.React (EvtTurnOn::MakeShared ());
@@ -211,10 +236,10 @@ class StatemachineImpl
211236
212237 fsm_.React (EvtGoRed::MakeShared ());
213238 assert (yellow_red_transition1_called_ == true );
214- assert (yellow_red_transition2_called_ == true );
215- assert (fsm_.CurrentState () == &Fsm::kRed );
216239 yellow_red_transition1_called_ = false ;
240+ assert (yellow_red_transition2_called_ == true );
217241 yellow_red_transition2_called_ = false ;
242+ assert (fsm_.CurrentState () == &Fsm::kRed );
218243 CheckAllFalse ();
219244
220245 fsm_.React (EvtGoYellow::MakeShared ());
@@ -235,10 +260,12 @@ class StatemachineImpl
235260
236261 fsm_.React (EvtTurnOff::MakeShared ());
237262 assert (on_exit_called_ == true );
238- assert (off_entry_called_ == true );
239- assert (fsm_.CurrentState () == &Fsm::kOff );
240263 on_exit_called_ = false ;
264+ assert (off_entry_called_ == true );
241265 off_entry_called_ = false ;
266+ assert (off_entry2_called_ == true );
267+ off_entry2_called_ = false ;
268+ assert (fsm_.CurrentState () == &Fsm::kOff );
242269 CheckAllFalse ();
243270
244271 fsm_.React (EvtGoGreen::MakeShared ());
@@ -271,7 +298,11 @@ class StatemachineImpl
271298 }
272299};
273300
274- const Fsm::State Fsm::kOff (" Off" , &FsmOffHandler, nullptr , nullptr , &Fsm::Impl::FsmOffEntry, &Fsm::Impl::FsmOffExit);
301+ const std::array<Fsm::State::EntryExitType, 2 > Fsm::FsmOffEntryActions =
302+ std::to_array<Fsm::State::EntryExitType>({&Fsm::Impl::FsmOffEntry, &Fsm::Impl::FsmOffEntry2});
303+ const std::array<Fsm::State::EntryExitType, 2 > Fsm::FsmOffExitActions =
304+ std::to_array<Fsm::State::EntryExitType>({&Fsm::Impl::FsmOffExit, &Fsm::Impl::FsmOffExit2});
305+ const Fsm::State Fsm::kOff (" Off" , &FsmOffHandler, nullptr , nullptr , FsmOffEntryActions, FsmOffExitActions);
275306const Fsm::HistoryState Fsm::kOn (" On" , &FsmOnHandler, nullptr , &kGreen , &Fsm::Impl::FsmOnEntry, &Fsm::Impl::FsmOnExit);
276307const Fsm::State Fsm::kGreen (" Green" , &FsmGreenHandler, &kOn );
277308const Fsm::State Fsm::kYellow (" Yellow" , &FsmYellowHandler, &kOn );
0 commit comments