...
This commit is contained in:
parent
26130e5c65
commit
9b5340d3cd
@ -9,6 +9,7 @@
|
|||||||
#include <string_view>
|
#include <string_view>
|
||||||
#include <typeindex>
|
#include <typeindex>
|
||||||
#include <unordered_map>
|
#include <unordered_map>
|
||||||
|
#include <variant>
|
||||||
#include "mcc_fsm_utils.h"
|
#include "mcc_fsm_utils.h"
|
||||||
|
|
||||||
|
|
||||||
@ -177,6 +178,7 @@ concept fsm_state_c =
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
template <traits::fsm_state_c InitStateT>
|
||||||
class MccFiniteStateMachine
|
class MccFiniteStateMachine
|
||||||
{
|
{
|
||||||
public:
|
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;
|
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
|
} // namespace mcc::fsm
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user