This commit is contained in:
2025-05-30 12:48:15 +03:00
parent 7e987536b8
commit fbe82fc56c
2 changed files with 87 additions and 28 deletions

View File

@@ -25,12 +25,15 @@ namespace traits
template <typename T>
concept fsm_event_c =
std::is_default_constructible_v<T> && std::is_move_constructible_v<T> && std::movable<T> && requires {
{ T::ID } -> std::same_as<const std::string_view>; // static constant member of event identificator
// { T::ID } -> std::same_as<const std::string_view>; // static constant member of event identificator
requires std::same_as<const std::string_view, decltype(T::ID)>;
};
template <typename T>
concept fsm_event_state_pair_c = requires {
[]<traits::fsm_event_c EvT, std::derived_from<MccFsmAbstractState> StT>(std::type_identity<std::pair<EvT, StT>>) {
[]<traits::fsm_event_c EvT, typename StT>(std::type_identity<std::pair<EvT, StT>>) {
// []<traits::fsm_event_c EvT, std::derived_from<MccFsmAbstractState> StT>(std::type_identity<std::pair<EvT,
// StT>>) {
}(std::type_identity<T>());
};
@@ -80,7 +83,7 @@ public:
template <traits::fsm_event_state_pair_c PT>
struct trans_table_t<PT> {
using events_t = std::tuple<typename PT::first_type>;
using states_t = std::tuple<typename PT::first_second>;
using states_t = std::tuple<typename PT::second_type>;
using unique_states_t = states_t;
using evst_pairs_t = std::tuple<PT>;
@@ -89,7 +92,7 @@ public:
template <traits::fsm_event_c EvT>
using find_state_by_event_t =
std::conditional_t<std::same_as<EvT, typename PT::first_type>, typename PT::first_second, std::nullptr_t>;
std::conditional_t<std::same_as<EvT, typename PT::first_type>, typename PT::second_type, std::nullptr_t>;
};
template <traits::fsm_event_state_pair_c PT, traits::fsm_event_state_pair_c... PTs>
@@ -152,6 +155,8 @@ public:
template <traits::fsm_event_c EvT>
using find_state_by_event_t = find_state_by_event<EvT>::res_t;
}; // end of 'trans_table_t<PT, PTs...>'
using transition_t = trans_table_t<>;
}; // end of 'MccFsmAbstractState'
@@ -160,8 +165,9 @@ namespace traits
template <typename T>
concept fsm_trans_table_c = requires {
[]<fsm_event_state_pair_c... PTs>(std::type_identity<mcc::fsm::MccFsmAbstractState::trans_table_t<PTs...>>) {
}(std::type_identity<T>());
// []<fsm_event_state_pair_c... PTs>(std::type_identity<mcc::fsm::MccFsmAbstractState::trans_table_t<PTs...>>) {
// }(std::type_identity<T>());
requires true;
};
@@ -182,12 +188,14 @@ template <traits::fsm_state_c InitStateT>
class MccFiniteStateMachine
{
public:
template <traits::fsm_state_c ST>
MccFiniteStateMachine(ST initial_state) : _currentStateID(ST::ID), _currentStateIDX(typeid(ST))
{
// setStateFunc<ST::transition_t::evst_pairs_t>();
initFromInitial<ST::transition_t::evst_pairs_t>(typeid(ST));
}
// template <traits::fsm_state_c ST>
// MccFiniteStateMachine(ST initial_state) : _currentStateID(ST::ID), _currentStateIDX(typeid(ST))
// {
// // setStateFunc<ST::transition_t::evst_pairs_t>();
// initFromInitial<ST::transition_t::evst_pairs_t>(typeid(ST));
// }
MccFiniteStateMachine() {}
template <traits::fsm_event_c EvT>
void dispatchEvent(EvT event)
@@ -209,8 +217,8 @@ protected:
template <traits::fsm_event_c EvT>
inline static std::unordered_map<const MccFiniteStateMachine*, state_func_t<EvT>> exit_state_func_umap_t{};
std::string_view _currentStateID;
std::type_index _currentStateIDX;
std::string_view _currentStateID{InitStateT::ID};
std::type_index _currentStateIDX{typeid(InitStateT)};
std::function<void()> _exitCurrentStateFunc;
@@ -277,18 +285,15 @@ protected:
// }
// template<>
// merge N std::tuple types with filtering dublicates
// (NOTE: the first std::tuple type must contain unique types!!!)
template <typename... TplTs>
struct merge_tuples_t;
template <>
struct merge_tuples_t<> {
using res_t = std::tuple<>;
};
// template <>
// struct merge_tuples_t<std::tuple<>> {
// using res_t = std::tuple<>;
// };
template <typename TplT>
struct merge_tuples_t<TplT> {
@@ -328,10 +333,14 @@ protected:
template <typename... TplTs>
struct collect_states_t;
// template <typename TplT>
// struct collect_states_t<TplT> {
// using states_t = TplT;
// };
template <traits::fsm_state_c StT, typename... TplTs>
struct collect_states_t<std::tuple<StT>, TplTs...> {
using states_t =
merge_tuples_res_t<std::tuple<StT>,
typename collect_states_t<typename StT::transition_t::unique_states_t>::states_t,
TplTs...>;
};
template <traits::fsm_state_c... StTs, typename... TplTs>
struct collect_states_t<std::tuple<StTs...>, TplTs...> {
@@ -342,7 +351,7 @@ protected:
};
using states_t = typename collect_states_t<InitStateT>::states_t;
using states_t = typename collect_states_t<std::tuple<InitStateT>>::states_t;
states_t _states;
typename variant_maker_t<states_t>::variant_t _currentStateVariant;