⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 stateiterationtest.cpp

📁 Boost provides free peer-reviewed portable C++ source libraries. We emphasize libraries that work
💻 CPP
字号:
//////////////////////////////////////////////////////////////////////////////// Copyright 2005-2006 Andreas Huber Doenni// Distributed under the Boost Software License, Version 1.0. (See accompany-// ing file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)//////////////////////////////////////////////////////////////////////////////#include <boost/statechart/state_machine.hpp>#include <boost/statechart/event.hpp>#include <boost/statechart/simple_state.hpp>#include <boost/statechart/transition.hpp>#include <boost/mpl/list.hpp>#include <boost/test/test_tools.hpp>#include <set>#include <map>#include <string>namespace sc = boost::statechart;namespace mpl = boost::mpl;struct EvToA : sc::event< EvToA > {};struct EvToB : sc::event< EvToB > {};struct EvToD : sc::event< EvToD > {};struct EvToE : sc::event< EvToE > {};struct A;struct StateIterationTest : sc::state_machine< StateIterationTest, A >{  public:    //////////////////////////////////////////////////////////////////////////    StateIterationTest();    void AssertInState( const std::string & stateNames ) const    {      stateNamesCache_.clear();      for ( state_iterator currentState = state_begin();        currentState != state_end(); ++currentState )      {        const StateNamesMap::const_iterator found =          stateNamesMap_.find( currentState->dynamic_type() );        BOOST_REQUIRE( found != stateNamesMap_.end() );        stateNamesCache_.insert( found->second );      }      std::string::const_iterator expectedName = stateNames.begin();      BOOST_REQUIRE( stateNames.size() == stateNamesCache_.size() );      for ( StateNamesCache::const_iterator actualName =        stateNamesCache_.begin();        actualName != stateNamesCache_.end(); ++actualName, ++expectedName )      {        BOOST_REQUIRE( ( *actualName )[ 0 ] == *expectedName );      }    }  private:    //////////////////////////////////////////////////////////////////////////    typedef std::map< state_base_type::id_type, std::string > StateNamesMap;    typedef std::set< std::string > StateNamesCache;    StateNamesMap stateNamesMap_;    mutable StateNamesCache stateNamesCache_;};struct C;struct D;struct B : sc::simple_state< B, StateIterationTest, mpl::list< C, D > >{  typedef sc::transition< EvToA, A > reactions;};struct A : sc::simple_state< A, StateIterationTest >{  typedef sc::transition< EvToB, B > reactions;};  struct F;  struct G;  struct E : sc::simple_state< E, B::orthogonal< 1 >, mpl::list< F, G > >  {    typedef sc::transition< EvToD, D > reactions;  };    struct F : sc::simple_state< F, E::orthogonal< 0 > > {};    struct G : sc::simple_state< G, E::orthogonal< 1 > > {};  struct C : sc::simple_state< C, B::orthogonal< 0 > > {};  struct D : sc::simple_state< D, B::orthogonal< 1 > >  {    typedef sc::transition< EvToE, E > reactions;  };StateIterationTest::StateIterationTest(){  // We're not using custom type information to make this test work even when  // BOOST_STATECHART_USE_NATIVE_RTTI is defined  stateNamesMap_[ A::static_type() ] = "A";  stateNamesMap_[ B::static_type() ] = "B";  stateNamesMap_[ C::static_type() ] = "C";  stateNamesMap_[ D::static_type() ] = "D";  stateNamesMap_[ E::static_type() ] = "E";  stateNamesMap_[ F::static_type() ] = "F";  stateNamesMap_[ G::static_type() ] = "G";}int test_main( int, char* [] ){  StateIterationTest machine;  machine.AssertInState( "" );  machine.initiate();  machine.AssertInState( "A" );  machine.process_event( EvToB() );  machine.AssertInState( "CD" );  machine.process_event( EvToA() );  machine.AssertInState( "A" );  machine.process_event( EvToB() );  machine.AssertInState( "CD" );  machine.process_event( EvToE() );  machine.AssertInState( "CFG" );  machine.process_event( EvToD() );  machine.AssertInState( "CD" );  machine.process_event( EvToE() );  machine.AssertInState( "CFG" );  machine.process_event( EvToA() );  machine.AssertInState( "A" );  machine.terminate();  machine.AssertInState( "" );  return 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -