Boost logo

Boost Users :

Subject: [Boost-users] [MSM] test if state machine is in a given state / const get_state
From: Jan Vogelgesang (jan.vogelgesang_at_[hidden])
Date: 2011-03-01 13:13:47


Hello all,

i am working with the Boost 1.45 Meta State Machine, using both
orthogonal regions and submachines. Overall, i am very happy with this
library.
But i am looking for a nice way to check if a state machine (e.g.
instance mAvail of class AvailFSM) is in a given state, for example i
would like to write something like this:

assert(isInState(mAvail, AvailFSM::UpstreamAvailable()));

I didn't find something like "isInState" provided by the MSM library, so
i came up with the following implementation:

  template <class FSM, class StateType>
  bool isInState(const FSM& p, const StateType& s)
  {
     int stateId = boost::msm::back::get_state_id<typename
                               FSM::stt,StateType>::value;

     for (int i=0; i < FSM::nr_regions::value; ++i)
     {
         if(p.current_state()[i] == stateId)
         {
             return true;
         }
     }
     return false;
  }

This works well for simple state machines and orthogonal regions, but
not for submachines. Does any one knows a way to extend the above code
to work with submachines?

Lets say the state "AvailFSM::UpstreamAvailable" from above is in fact a
submachine, having the state "Primary" amongst others. It would be nice
to have the following working:

assert(isInState(mAvail, AvailFSM::UpstreamAvailable::Primary()));

Currently i am using the following workaround:

assert(isInState(mAvail, AvailFSM::UpstreamAvailable()));
assert(isInState(mAvail.get_state<AvailFSM::UpstreamAvailable&>(),
                           AvailFSM::UpstreamAvailable::Primary()));

I consider this solution ugly not only because of its lengthiness, but
also because "get_state" isn't a const function. Unfortunately i'am not
deep enough into the template magic to tell if a const implementation of
"get_state" is possible. Can anyone help me out ?

So, to sum up, i have two questions:
1) How to implement something like "isInState" that even works on
submachines, if possible ?
2) Is a const version of "get_state" possible ? And how?

best regards,
jan


Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net