...
This commit is contained in:
parent
26130e5c65
commit
9b5340d3cd
@ -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
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user