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

📄 statecasttest.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/state.hpp>#include <boost/statechart/transition.hpp>#include <boost/statechart/custom_reaction.hpp>#include <boost/mpl/list.hpp>#include <boost/intrusive_ptr.hpp>#include <boost/test/test_tools.hpp>namespace sc = boost::statechart;namespace mpl = boost::mpl;struct EvToB : sc::event< EvToB > {};struct EvToF : sc::event< EvToF > {};struct EvCheck : sc::event< EvCheck > {};struct A;struct StateCastTest : sc::state_machine< StateCastTest, A >{  template< class State >  void AssertInState()  {    BOOST_REQUIRE( state_downcast< const State * >() != 0 );    BOOST_REQUIRE_NO_THROW( state_downcast< const State & >() );    BOOST_REQUIRE( state_cast< const State * >() != 0 );    BOOST_REQUIRE_NO_THROW( state_cast< const State & >() );  }  template< class State >  void AssertNotInState()  {    BOOST_REQUIRE( state_downcast< const State * >() == 0 );    BOOST_REQUIRE_THROW( state_downcast< const State & >(), std::bad_cast );    BOOST_REQUIRE( state_cast< const State * >() == 0 );    BOOST_REQUIRE_THROW( state_cast< const State & >(), std::bad_cast );  }};template< class State, class FromState >void AssertInState( const FromState & theState ){  BOOST_REQUIRE( theState.template state_downcast< const State * >() != 0 );  BOOST_REQUIRE_NO_THROW( theState.template state_downcast< const State & >() );  BOOST_REQUIRE( theState.template state_cast< const State * >() != 0 );  BOOST_REQUIRE_NO_THROW( theState.template state_cast< const State & >() );}template< class State, class FromState >void AssertNotInState( const FromState & theState ){  BOOST_REQUIRE( theState.template state_downcast< const State * >() == 0 );  BOOST_REQUIRE_THROW( theState.template state_downcast< const State & >(), std::bad_cast );  BOOST_REQUIRE( theState.template state_cast< const State * >() == 0 );  BOOST_REQUIRE_THROW( theState.template state_cast< const State & >(), std::bad_cast );}struct B;struct C;struct D;struct A : sc::simple_state< A, StateCastTest, mpl::list< C, D > >{  typedef sc::transition< EvToB, B > reactions;};  struct E;  struct C : sc::simple_state< C, A::orthogonal< 0 >, E > {};    struct E : sc::state< E, C >    {      typedef sc::custom_reaction< EvCheck > reactions;      E( my_context ctx ) : my_base( ctx )      {        post_event( boost::intrusive_ptr< EvCheck >( new EvCheck() ) );      }      sc::result react( const EvCheck & );    };    struct F : sc::state< F, C >    {      typedef sc::custom_reaction< EvCheck > reactions;      F( my_context ctx ) : my_base( ctx )      {        post_event( boost::intrusive_ptr< EvCheck >( new EvCheck() ) );      }      sc::result react( const EvCheck & );    };  struct G;  struct D : sc::simple_state< D, A::orthogonal< 1 >, G > {};      struct G : sc::simple_state< G, D > {};    struct H : sc::simple_state< H, D > {};struct B : sc::simple_state< B, StateCastTest >{  typedef sc::transition< EvToF, F > reactions;};sc::result E::react( const EvCheck & ){  AssertInState< A >( *this );  AssertNotInState< B >( *this );  AssertInState< C >( *this );  AssertInState< D >( *this );  AssertInState< E >( *this );  AssertNotInState< F >( *this );  AssertInState< G >( *this );  AssertNotInState< H >( *this );  return discard_event();}sc::result F::react( const EvCheck & ){  AssertInState< A >( *this );  AssertNotInState< B >( *this );  AssertInState< C >( *this );  AssertInState< D >( *this );  AssertNotInState< E >( *this );  AssertInState< F >( *this );  AssertInState< G >( *this );  AssertNotInState< H >( *this );  return discard_event();}int test_main( int, char* [] ){  StateCastTest machine;  machine.AssertNotInState< A >();  machine.AssertNotInState< B >();  machine.AssertNotInState< C >();  machine.AssertNotInState< D >();  machine.AssertNotInState< E >();  machine.AssertNotInState< F >();  machine.AssertNotInState< G >();  machine.AssertNotInState< H >();  machine.initiate();  machine.AssertInState< A >();  machine.AssertNotInState< B >();  machine.AssertInState< C >();  machine.AssertInState< D >();  machine.AssertInState< E >();  machine.AssertNotInState< F >();  machine.AssertInState< G >();  machine.AssertNotInState< H >();  machine.process_event( EvToB() );  machine.AssertNotInState< A >();  machine.AssertInState< B >();  machine.AssertNotInState< C >();  machine.AssertNotInState< D >();  machine.AssertNotInState< E >();  machine.AssertNotInState< F >();  machine.AssertNotInState< G >();  machine.AssertNotInState< H >();  machine.process_event( EvToF() );  machine.AssertInState< A >();  machine.AssertNotInState< B >();  machine.AssertInState< C >();  machine.AssertInState< D >();  machine.AssertNotInState< E >();  machine.AssertInState< F >();  machine.AssertInState< G >();  machine.AssertNotInState< H >();  machine.terminate();  machine.AssertNotInState< A >();  machine.AssertNotInState< B >();  machine.AssertNotInState< C >();  machine.AssertNotInState< D >();  machine.AssertNotInState< E >();  machine.AssertNotInState< F >();  machine.AssertNotInState< G >();  machine.AssertNotInState< H >();  return 0;}

⌨️ 快捷键说明

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