////////////////////////////////////////////////////////////////////////////// // 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 #include #include namespace sc = boost::statechart; struct A; struct TypeInfoTest : sc::state_machine< TypeInfoTest, A > {}; struct B; struct A : sc::simple_state< A, TypeInfoTest, B > {}; struct B : sc::simple_state< B, A > {}; int test_main( int, char* [] ) { TypeInfoTest machine; machine.initiate(); const TypeInfoTest::state_base_type & activeState = *machine.state_begin(); const TypeInfoTest::state_base_type::id_type bType = activeState.dynamic_type(); const TypeInfoTest::state_base_type::id_type aType = activeState.outer_state_ptr()->dynamic_type(); BOOST_REQUIRE( bType == B::static_type() ); BOOST_REQUIRE( bType != A::static_type() ); BOOST_REQUIRE( aType == A::static_type() ); BOOST_REQUIRE( aType != B::static_type() ); #ifndef BOOST_STATECHART_USE_NATIVE_RTTI // Ensure that a null custom type id pointer can be of any type BOOST_REQUIRE( activeState.custom_dynamic_type_ptr< void >() == 0 ); BOOST_REQUIRE( activeState.custom_dynamic_type_ptr< char >() == 0 ); BOOST_REQUIRE( activeState.custom_dynamic_type_ptr< bool >() == 0 ); BOOST_REQUIRE( activeState.outer_state_ptr()->custom_dynamic_type_ptr< void >() == 0 ); BOOST_REQUIRE( activeState.outer_state_ptr()->custom_dynamic_type_ptr< char >() == 0 ); BOOST_REQUIRE( activeState.outer_state_ptr()->custom_dynamic_type_ptr< bool >() == 0 ); const char * bCustomType = "B"; const char * aCustomType = "A"; B::custom_static_type_ptr( bCustomType ); A::custom_static_type_ptr( aCustomType ); BOOST_REQUIRE( B::custom_static_type_ptr< char >() == bCustomType ); BOOST_REQUIRE( A::custom_static_type_ptr< char >() == aCustomType ); BOOST_REQUIRE( activeState.custom_dynamic_type_ptr< char >() == bCustomType ); BOOST_REQUIRE( activeState.outer_state_ptr()->custom_dynamic_type_ptr< char >() == aCustomType ); // Ensure that a null custom type id pointer can be of any type bool * pNull = 0; B::custom_static_type_ptr( pNull ); A::custom_static_type_ptr( pNull ); BOOST_REQUIRE( activeState.custom_dynamic_type_ptr< char >() == 0 ); BOOST_REQUIRE( activeState.outer_state_ptr()->custom_dynamic_type_ptr< char >() == 0 ); #endif return 0; }