This commit is contained in:
Timur A. Fatkhullin 2025-05-30 00:27:07 +03:00
parent 26130e5c65
commit 9b5340d3cd

View File

@ -9,6 +9,7 @@
#include <string_view>
#include <typeindex>
#include <unordered_map>
#include <variant>
#include "mcc_fsm_utils.h"
@ -177,6 +178,7 @@ concept fsm_state_c =
template <traits::fsm_state_c InitStateT>
class MccFiniteStateMachine
{
public:
@ -274,8 +276,70 @@ protected:
// };
// }
template <typename StateTplT, typename>
// 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 <typename TplT>
struct merge_tuples_t<TplT> {
using res_t = TplT;
};
template <typename TplT1, typename TplT2>
struct merge_tuples_t<TplT1, TplT2> {
using res_t = TplT1;
};
template <typename... T1, typename T2, typename... T2s>
struct merge_tuples_t<std::tuple<T1...>, std::tuple<T2, T2s...>>
: std::conditional_t<(std::same_as<T1, T2> || ...),
merge_tuples_t<std::tuple<T1...>, std::tuple<T2s...>>,
merge_tuples_t<std::tuple<T1..., T2>, std::tuple<T2s...>>> {
};
template <typename TplT1, typename TplT2, typename TplT3, typename... TplTs>
struct merge_tuples_t<TplT1, TplT2, TplT3, TplTs...>
: merge_tuples_t<typename merge_tuples_t<TplT1, TplT2>::res_t, TplT3, TplTs...> {
};
template <typename... TplTs>
using merge_tuples_res_t = typename merge_tuples_t<TplTs...>::res_t;
template <typename TplT>
struct variant_maker_t;
template <typename... Ts>
struct variant_maker_t<std::tuple<Ts...>> {
// using variant_t = std::variant<Ts*...>;
using variant_t = std::variant<std::reference_wrapper<Ts>...>;
};
template <typename... TplTs>
struct collect_states_t;
template <traits::fsm_state_c... StTs, typename... TplTs>
struct collect_states_t<std::tuple<StTs...>, TplTs...> {
using states_t = merge_tuples_res_t<std::tuple<StTs...>,
collect_states_t<typename StTs::transition_t::unique_states_t...>,
TplTs...>;
};
using states_t = typename collect_states_t<InitStateT>::states_t;
states_t _states;
typename variant_maker_t<states_t>::variant_t _currentStateVariant;
};
} // namespace mcc::fsm