@@ -1065,6 +1065,8 @@ struct anonymous : internal_event {
10651065template <class TEvent >
10661066struct completion : internal_event {
10671067 constexpr static auto c_str () { return " completion" ; }
1068+ constexpr explicit completion (const TEvent &event) : event_(event) {}
1069+ const TEvent &event_;
10681070};
10691071template <class T , class TEvent = T>
10701072struct on_entry : internal_event, entry_exit {
@@ -1125,6 +1127,26 @@ template <class TEvent>
11251127using get_generic_t = typename event_type<TEvent>::generic_t ;
11261128template <class TEvent >
11271129using get_mapped_t = typename event_type<TEvent>::mapped_t ;
1130+ template <class TEvent >
1131+ constexpr const TEvent &get_origin_event (const TEvent &event) {
1132+ return event;
1133+ }
1134+ template <class T , class TEvent >
1135+ constexpr const TEvent &get_origin_event (const unexpected_event<T, TEvent> &event) {
1136+ return event.event_ ;
1137+ }
1138+ template <class T , class TEvent >
1139+ constexpr const TEvent &get_origin_event (const on_entry<T, TEvent> &event) {
1140+ return event.event_ ;
1141+ }
1142+ template <class T , class TEvent >
1143+ constexpr const TEvent &get_origin_event (const on_exit<T, TEvent> &event) {
1144+ return event.event_ ;
1145+ }
1146+ template <class T , class TException >
1147+ constexpr const TException &get_origin_event (const exception<T, TException> &event) {
1148+ return event.exception_ ;
1149+ }
11281150template <class ... TEvents>
11291151struct process : queue_handler<TEvents...> {
11301152 using queue_handler<TEvents...>::queue_handler;
@@ -1860,28 +1882,28 @@ struct sm_impl : aux::conditional_t<aux::should_not_subclass_statemachine_class<
18601882 return handled && queued_handled;
18611883 }
18621884 template <class TOriginEvent , class TDeps , class TSubs >
1863- constexpr bool process_completion_event (TDeps &deps, TSubs &subs, aux::true_type) {
1864- return process_internal_events (completion<TOriginEvent>{}, deps, subs);
1885+ constexpr bool process_completion_event (const TOriginEvent &event, TDeps &deps, TSubs &subs, aux::true_type) {
1886+ return process_internal_events (completion<TOriginEvent>{event }, deps, subs);
18651887 }
18661888 template <class TOriginEvent , class TDeps , class TSubs >
1867- constexpr bool process_completion_event (TDeps &, TSubs &, aux::false_type) {
1889+ constexpr bool process_completion_event (const TOriginEvent &, TDeps &, TSubs &, aux::false_type) {
18681890 return false ;
18691891 }
18701892 template <class TOriginEvent , class TDeps , class TSubs >
1871- constexpr bool process_post_event_step (TDeps &deps, TSubs &subs) {
1893+ constexpr bool process_post_event_step (const TOriginEvent &event, TDeps &deps, TSubs &subs) {
18721894 return process_completion_event<TOriginEvent>(
1873- deps, subs, typename aux::is_base_of<completion<TOriginEvent>, events_ids_t >::type{}) ||
1895+ event, deps, subs, typename aux::is_base_of<completion<TOriginEvent>, events_ids_t >::type{}) ||
18741896 process_internal_events (anonymous{}, deps, subs);
18751897 }
18761898 template <class TOriginEvent , class TDeps , class TSubs >
1877- constexpr void process_post_events (TDeps &deps, TSubs &subs) {
1878- while (process_post_event_step<TOriginEvent>(deps, subs)) {
1899+ constexpr void process_post_events (const TOriginEvent &event, TDeps &deps, TSubs &subs) {
1900+ while (process_post_event_step<TOriginEvent>(event, deps, subs)) {
18791901 }
18801902 }
18811903 template <class TOriginEvent , class TEvent , class TDeps , class TSubs >
18821904 constexpr bool process_event_and_post_events (const TEvent &event, TDeps &deps, TSubs &subs) {
18831905 const bool handled = process_internal_events (event, deps, subs);
1884- process_post_events<TOriginEvent>(deps, subs);
1906+ process_post_events<TOriginEvent>(get_origin_event (event), deps, subs);
18851907 return handled;
18861908 }
18871909 constexpr void initialize (const aux::type_list<> &) {}
@@ -2351,6 +2373,14 @@ template <class T, class TEvent, class Tsm, class TDeps>
23512373constexpr decltype (auto ) get_arg(const aux::type_wrapper<const TEvent &> &, const back::on_exit<T, TEvent> &event, Tsm &, TDeps &) {
23522374 return event.event_ ;
23532375}
2376+ template <class TEvent , class Tsm , class TDeps >
2377+ constexpr decltype (auto ) get_arg(const aux::type_wrapper<const TEvent &> &, const back::completion<TEvent> &event, Tsm &, TDeps &) {
2378+ return event.event_ ;
2379+ }
2380+ template <class TEvent , class Tsm , class TDeps >
2381+ constexpr decltype (auto ) get_arg(const aux::type_wrapper<TEvent> &, const back::completion<TEvent> &event, Tsm &, TDeps &) {
2382+ return event.event_ ;
2383+ }
23542384template <class T , class TEvent , class Tsm , class TDeps >
23552385constexpr decltype (auto ) get_arg(const aux::type_wrapper<const TEvent &> &, const back::exception<T, TEvent> &event, Tsm &, TDeps &) {
23562386 return event.exception_ ;
@@ -2756,6 +2786,18 @@ struct ignore<E, aux::type_list<Ts...>> {
27562786 };
27572787 using type = aux::join_t <typename non_events<Ts>::type...>;
27582788};
2789+ template <class TEvent , class ... Ts>
2790+ struct ignore <back::completion<TEvent>, aux::type_list<Ts...>> {
2791+ template <class T >
2792+ struct non_events {
2793+ using arg_t = aux::remove_const_t <aux::remove_reference_t <T>>;
2794+ using type = aux::conditional_t <aux::is_same<TEvent, arg_t >::value ||
2795+ aux::is_same<back::completion<TEvent>, arg_t >::value ||
2796+ aux::is_same<T, action_base>::value,
2797+ aux::type_list<>, aux::type_list<T>>;
2798+ };
2799+ using type = aux::join_t <typename non_events<Ts>::type...>;
2800+ };
27592801template <class T , class E , class = void >
27602802struct get_deps {
27612803 using type = typename ignore<E, args_t <T, E>>::type;
0 commit comments