diff --git a/cxx/mcc_fsm.h b/cxx/mcc_fsm.h index 76a8bbc..a26a305 100644 --- a/cxx/mcc_fsm.h +++ b/cxx/mcc_fsm.h @@ -9,6 +9,7 @@ #include #include #include +#include #include "mcc_fsm_utils.h" @@ -177,6 +178,7 @@ concept fsm_state_c = +template class MccFiniteStateMachine { public: @@ -274,8 +276,70 @@ protected: // }; // } - template + + // template<> + + + // merge N std::tuple types with filtering dublicates + // (NOTE: the first std::tuple type must contain unique types!!!) + template struct merge_tuples_t; + + template <> + struct merge_tuples_t<> { + using res_t = std::tuple<>; + }; + + template + struct merge_tuples_t { + using res_t = TplT; + }; + + template + struct merge_tuples_t { + using res_t = TplT1; + }; + + template + struct merge_tuples_t, std::tuple> + : std::conditional_t<(std::same_as || ...), + merge_tuples_t, std::tuple>, + merge_tuples_t, std::tuple>> { + }; + + template + struct merge_tuples_t + : merge_tuples_t::res_t, TplT3, TplTs...> { + }; + + template + using merge_tuples_res_t = typename merge_tuples_t::res_t; + + template + struct variant_maker_t; + + template + struct variant_maker_t> { + // using variant_t = std::variant; + using variant_t = std::variant...>; + }; + + + template + struct collect_states_t; + + template + struct collect_states_t, TplTs...> { + using states_t = merge_tuples_res_t, + collect_states_t, + TplTs...>; + }; + + + using states_t = typename collect_states_t::states_t; + + states_t _states; + typename variant_maker_t::variant_t _currentStateVariant; }; } // namespace mcc::fsm