I want no_transition() to be called whenever no row matches, even if there is a row that does not match only because the guard returns false. How can I achieve this? I want to be strict about the input events. I can probably workaround this by putting guardless rows at the top whose action is to call no_transition(), but I'm hoping to find a cleaner solution.
If I get this behavior in msm, then the following code should output "no transition..." as its last line. Right now, with boost 1.51, it doesn't. It just prints "entering State1".
#include <iostream>
#include <boost/msm/back/state_machine.hpp>
#include <boost/msm/front/functor_row.hpp>
#include <boost/msm/front/state_machine_def.hpp>
using namespace std;
namespace mpl = boost::mpl;
namespace msm = boost::msm;
using namespace msm::front;
struct Event {
Event(bool data) : data(data) { }
bool data;
};
struct state_ : public msm::front::state_machine_def<state_> {
struct MyGuard {
template <class EVT, class FSM, class SourceState, class TargetState>
bool operator()(EVT const& e, FSM&, SourceState&, TargetState&) {
return e.data;
}
};
struct State1 : public msm::front::state<> {
// optional entry/exit methods
template <class Event,class FSM>
void on_entry(Event const&, FSM& f) { std::cout << "entering: State1" << std::endl; }
template <class Event,class FSM>
void on_exit(Event const&,FSM& ) { std::cout << "leaving: State1" << std::endl; }
};
struct State2 : public msm::front::state<> {
// optional entry/exit methods
template <class Event,class FSM>
void on_entry(Event const&, FSM& f) { std::cout << "entering: State2" << std::endl; }
template <class Event,class FSM>
void on_exit(Event const&,FSM& ) { std::cout << "leaving: State2" << std::endl; }
};
typedef State1 initial_state;
struct transition_table : mpl::vector<
Row< State1, Event , State2, none, MyGuard >
> {};
template <class FSM, class Event>
void no_transition(Event const& e, FSM&, int state) {
std::cout << "no transition from state " << state
<< " on event " << typeid(e).name() << std::endl;
}
};
typedef msm::back::state_machine<state_> State;
int main() {
State state;
state.start();
state.process_event(Event(false));
return 0;
}