...
This commit is contained in:
parent
88e45886b2
commit
47413792e5
@ -331,6 +331,11 @@ protected:
|
|||||||
to->_moveFunc = from->_moveFunc;
|
to->_moveFunc = from->_moveFunc;
|
||||||
to->_copyFunc = from->_copyFunc;
|
to->_copyFunc = from->_copyFunc;
|
||||||
to->_destroyFunc = from->_destroyFunc;
|
to->_destroyFunc = from->_destroyFunc;
|
||||||
|
|
||||||
|
to->_stateID = from->_stateID;
|
||||||
|
to->_eventID = from->_eventID;
|
||||||
|
|
||||||
|
to->_currentStateID = from->_currentStateID;
|
||||||
}
|
}
|
||||||
|
|
||||||
return *to;
|
return *to;
|
||||||
@ -347,6 +352,11 @@ protected:
|
|||||||
to->_moveFunc = std::move(from->_moveFunc);
|
to->_moveFunc = std::move(from->_moveFunc);
|
||||||
to->_copyFunc = std::move(from->_copyFunc);
|
to->_copyFunc = std::move(from->_copyFunc);
|
||||||
to->_destroyFunc = std::move(from->_destroyFunc);
|
to->_destroyFunc = std::move(from->_destroyFunc);
|
||||||
|
|
||||||
|
to->_stateID = std::move(from->_stateID);
|
||||||
|
to->_eventID = std::move(from->_eventID);
|
||||||
|
|
||||||
|
to->_currentStateID = std::move(from->_currentStateID);
|
||||||
}
|
}
|
||||||
|
|
||||||
return *to;
|
return *to;
|
||||||
@ -354,7 +364,7 @@ protected:
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
template <traits::fsm_state_c InitStateT>
|
template <traits::fsm_state_c InitStateT>
|
||||||
MccFiniteStateMachine(InitStateT) : _currentStateID(InitStateT::ID)
|
constexpr MccFiniteStateMachine(InitStateT) : _currentStateID(InitStateT::ID)
|
||||||
{
|
{
|
||||||
using states_t = deduce_states_t<InitStateT>;
|
using states_t = deduce_states_t<InitStateT>;
|
||||||
auto states = std::make_shared<states_t>();
|
auto states = std::make_shared<states_t>();
|
||||||
@ -367,18 +377,20 @@ public:
|
|||||||
}(*states);
|
}(*states);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// setup dispatch event functions
|
// setup dispatch event functions
|
||||||
|
|
||||||
using all_events_t = deduce_events_t<InitStateT>;
|
using all_events_t = deduce_events_t<InitStateT>;
|
||||||
|
|
||||||
[states, currentState, this]<size_t... Is>(std::index_sequence<Is...>) {
|
[states, currentState, this]<size_t... Is>(std::index_sequence<Is...>) {
|
||||||
((_dispatchEventFunc<std::tuple_element_t<Is, all_events_t>>[this] =
|
((_dispatchEventFunc<std::tuple_element_t<Is, all_events_t>>[this] =
|
||||||
[states, currentState, this]<traits::fsm_event_c EvT>(EvT& event) mutable {
|
[states, currentState, this]<traits::fsm_event_c EvT>(EvT& event) {
|
||||||
std::lock_guard lock(_transitionMutex);
|
std::lock_guard lock(_transitionMutex);
|
||||||
|
|
||||||
std::visit(
|
std::visit(
|
||||||
[&event, states, currentState, this]<traits::fsm_state_c curr_state_t>(curr_state_t*) {
|
[&event, states, currentState, this]<traits::fsm_state_c curr_state_t>(curr_state_t*) {
|
||||||
using to_state_t = curr_state_t::transition_t::template find_state_by_event_t<EvT>;
|
using to_state_t = curr_state_t::transition_t::template find_state_by_event_t<EvT>;
|
||||||
|
|
||||||
if constexpr (!std::is_void_v<to_state_t>) {
|
if constexpr (!std::is_void_v<to_state_t>) {
|
||||||
// exit from current
|
// exit from current
|
||||||
if constexpr (requires(curr_state_t inst) {
|
if constexpr (requires(curr_state_t inst) {
|
||||||
@ -478,10 +490,9 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <traits::fsm_event_c EvT>
|
template <traits::fsm_event_c EvT>
|
||||||
auto dispatchEvent()
|
auto dispatchEvent(EvT&& event = EvT())
|
||||||
requires std::default_initializable<EvT>
|
requires std::default_initializable<EvT>
|
||||||
{
|
{
|
||||||
static EvT event;
|
|
||||||
return dispatchEvent(event);
|
return dispatchEvent(event);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -199,6 +199,14 @@ int main()
|
|||||||
std::cout << "aa = " << aa << "\n";
|
std::cout << "aa = " << aa << "\n";
|
||||||
free(aa);
|
free(aa);
|
||||||
|
|
||||||
|
std::cout << "\nAfter std::move\n";
|
||||||
|
auto fsmach1 = std::move(fsmach);
|
||||||
|
std::cout << "STATES: ";
|
||||||
|
for (auto& el : fsmach1.stateIDs()) {
|
||||||
|
std::cout << std::quoted(el) << " ";
|
||||||
|
}
|
||||||
|
std::cout << "\n";
|
||||||
|
std::cout << "current state: " << std::quoted(fsmach1.currentStateID()) << "\n";
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user