Skip to content

Commit 792cee6

Browse files
author
Guilhem Codron
committed
Fix non trivial exit processing
exit events where sometimes called 2 times due to the fact that they always returned false. This was always triggering process_internal_generic_event in include/boost/sml/back/state_machine.hpp line 190. Change implementation to have a behavior similar to the on_entry events but with reversed logic, bottom to top instead of top to bottom
1 parent e6ff54d commit 792cee6

File tree

2 files changed

+15
-22
lines changed

2 files changed

+15
-22
lines changed

include/boost/sml.hpp

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -856,18 +856,8 @@ template <class T>
856856
struct transitions<T> {
857857
template <class TEvent, class SM, class TDeps, class TSubs>
858858
static bool execute(const TEvent &event, SM &sm, TDeps &deps, TSubs &subs, typename SM::state_t &current_state) {
859-
return execute_impl(event, sm, deps, subs, current_state);
860-
}
861-
template <class TEvent, class SM, class TDeps, class TSubs>
862-
static bool execute_impl(const TEvent &event, SM &sm, TDeps &deps, TSubs &subs, typename SM::state_t &current_state) {
863859
return aux::get<T>(sm.transitions_).execute(event, sm, deps, subs, current_state, typename SM::has_entry_exits{});
864860
}
865-
template <class _, class TEvent, class SM, class TDeps, class TSubs>
866-
static bool execute_impl(const on_exit<_, TEvent> &event, SM &sm, TDeps &deps, TSubs &subs,
867-
typename SM::state_t &current_state) {
868-
aux::get<T>(sm.transitions_).execute(event, sm, deps, subs, current_state, typename SM::has_entry_exits{});
869-
return false;
870-
}
871861
};
872862
template <>
873863
struct transitions<aux::true_type> {
@@ -910,6 +900,13 @@ struct transitions_sub<sm<TSM>, T, Ts...> {
910900
sub_sm<sm_impl<TSM>>::get(&subs).process_event(event, deps, subs);
911901
return true;
912902
}
903+
template <class _, class TEvent, class SM, class TDeps, class TSubs>
904+
static bool execute_impl(const back::on_exit<_, TEvent> &event, SM &sm, TDeps &deps, TSubs &subs,
905+
typename SM::state_t &current_state) {
906+
sub_sm<sm_impl<TSM>>::get(&subs).process_event(event, deps, subs);
907+
transitions<T, Ts...>::execute(event, sm, deps, subs, current_state);
908+
return true;
909+
}
913910
};
914911
template <class TSM>
915912
struct transitions_sub<sm<TSM>> {

include/boost/sml/back/transitions.hpp

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -39,20 +39,8 @@ template <class T>
3939
struct transitions<T> {
4040
template <class TEvent, class SM, class TDeps, class TSubs>
4141
static bool execute(const TEvent& event, SM& sm, TDeps& deps, TSubs& subs, typename SM::state_t& current_state) {
42-
return execute_impl(event, sm, deps, subs, current_state);
43-
}
44-
45-
template <class TEvent, class SM, class TDeps, class TSubs>
46-
static bool execute_impl(const TEvent& event, SM& sm, TDeps& deps, TSubs& subs, typename SM::state_t& current_state) {
4742
return aux::get<T>(sm.transitions_).execute(event, sm, deps, subs, current_state, typename SM::has_entry_exits{});
4843
}
49-
50-
template <class _, class TEvent, class SM, class TDeps, class TSubs>
51-
static bool execute_impl(const on_exit<_, TEvent>& event, SM& sm, TDeps& deps, TSubs& subs,
52-
typename SM::state_t& current_state) {
53-
aux::get<T>(sm.transitions_).execute(event, sm, deps, subs, current_state, typename SM::has_entry_exits{});
54-
return false; // from bottom to top
55-
}
5644
};
5745

5846
template <>
@@ -102,6 +90,14 @@ struct transitions_sub<sm<TSM>, T, Ts...> {
10290
sub_sm<sm_impl<TSM>>::get(&subs).process_event(event, deps, subs);
10391
return true; // from top to bottom
10492
}
93+
94+
template <class _, class TEvent, class SM, class TDeps, class TSubs>
95+
static bool execute_impl(const back::on_exit<_, TEvent>& event, SM& sm, TDeps& deps, TSubs& subs,
96+
typename SM::state_t& current_state) {
97+
sub_sm<sm_impl<TSM>>::get(&subs).process_event(event, deps, subs);
98+
transitions<T, Ts...>::execute(event, sm, deps, subs, current_state);
99+
return true; // from bottom to top
100+
}
105101
};
106102

107103
/// @brief Event executor on a sub state machine without transition in parent state machine.

0 commit comments

Comments
 (0)