$include_dir="/home/hyper-archives/boost-users/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-users] [msm] EUML submachine without macro
From: rayg (ray_at_[hidden])
Date: 2011-06-15 01:24:03
Hi,
 I'm trying to define a submachine without the
BOOST_MSM_EUML_DECLARE_STATE_MACHINE macro (the "old" way - like in
http://www.boost.org/doc/libs/1_46_0/libs/msm/doc/HTML/examples/SimpleTutorialWithEumlTable.cpp).
The "main" machine works as expected. However, the submachine doesn't kick
in at all (the system asserts in default no-transition handler). Any ideas?
Ray
------------
#include <boost/msm/front/state_machine_def.hpp>
#include <boost/msm/front/euml/euml.hpp>
#include <boost/msm/back/state_machine.hpp>
using namespace std;
using namespace boost::msm::front::euml;
namespace msm = boost::msm;
//#define WITH_MACROS
//************
//* Events
//************
BOOST_MSM_EUML_EVENT(play)
BOOST_MSM_EUML_EVENT(toggle)
//*************
//* Submachine 
//*************
#ifdef WITH_MACROS
//************************
//* This works fine
//************************
BOOST_MSM_EUML_ACTION(Song1_Entry)
{
    template <class Event,class FSM,class STATE>
    void operator()(Event const&,FSM&,STATE& )
    {
        // Called as expected
        std::cout << "entering: Song1" << std::endl;
    }
};
BOOST_MSM_EUML_STATE((Song1_Entry), Song1)
BOOST_MSM_EUML_STATE((), Song2)
BOOST_MSM_EUML_TRANSITION_TABLE((
    Song2  == Song1 + toggle,
    Song1  == Song2 + toggle 
), sub_transition_table)
BOOST_MSM_EUML_DECLARE_STATE_MACHINE((sub_transition_table,
                                      init_ << Song1),
                                      _Playing)	
#else
//************************
//* Doesn't work
//************************
struct Song1_impl : public msm::front::state<> , public
msm::front::euml::euml_state<Song1_impl>
{
    template <typename EVENT, typename FSM>
    void on_entry(EVENT const&, FSM& fsm) 
    {
        // Not called
        std::cout << "entering: Song1" << std::endl;
    }
};
struct Song2_impl : public msm::front::state<> , public
msm::front::euml::euml_state<Song2_impl> { };
Song1_impl const Song1;
Song2_impl const Song2;
struct _Playing : public msm::front::state_machine_def< _Playing >
{
    // Initial state
    typedef Song1_impl initial_state;
    BOOST_MSM_EUML_DECLARE_TRANSITION_TABLE((
        Song2  == Song1 + toggle,
        Song1  == Song2 + toggle
    ), sub_transition_table)
};
#endif
// Pick a back-end
typedef msm::back::state_machine<_Playing> Playing_impl;
Playing_impl const Playing;
//**********************************
//* Main machine
//**********************************
struct Empty_impl : public msm::front::state<> , public
msm::front::euml::euml_state<Empty_impl>
{
};
Empty_impl const Empty;
struct _Player : public msm::front::state_machine_def< _Player >
{
    // Initial state
    typedef Empty_impl initial_state;
    BOOST_MSM_EUML_DECLARE_TRANSITION_TABLE((
        Playing == Empty + play
    ), transition_table)
};
// Pick a back-end
typedef msm::back::state_machine<_Player> player;
int main(int argc, char* argv[])
{
    player p;
    p.start();
    p.process_event( play );
    return 0;
}
-- View this message in context: http://boost.2283326.n4.nabble.com/msm-EUML-submachine-without-macro-tp3598543p3598543.html Sent from the Boost - Users mailing list archive at Nabble.com.