Chris@16: #ifndef BOOST_STATECHART_STATE_HPP_INCLUDED Chris@16: #define BOOST_STATECHART_STATE_HPP_INCLUDED Chris@16: ////////////////////////////////////////////////////////////////////////////// Chris@16: // Copyright 2002-2006 Andreas Huber Doenni Chris@16: // Distributed under the Boost Software License, Version 1.0. (See accompany- Chris@16: // ing file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) Chris@16: ////////////////////////////////////////////////////////////////////////////// Chris@16: Chris@16: Chris@16: Chris@16: #include Chris@16: Chris@16: #include Chris@16: Chris@16: Chris@16: Chris@16: namespace boost Chris@16: { Chris@16: namespace statechart Chris@16: { Chris@16: Chris@16: Chris@16: Chris@16: template< class MostDerived, Chris@16: class Context, Chris@16: class InnerInitial = mpl::list<>, Chris@16: history_mode historyMode = has_no_history > Chris@16: class state : public simple_state< Chris@16: MostDerived, Context, InnerInitial, historyMode > Chris@16: { Chris@16: typedef simple_state< MostDerived, Context, InnerInitial, historyMode > Chris@16: base_type; Chris@16: Chris@16: protected: Chris@16: ////////////////////////////////////////////////////////////////////////// Chris@16: struct my_context Chris@16: { Chris@16: my_context( typename base_type::context_ptr_type pContext ) : Chris@16: pContext_( pContext ) Chris@16: { Chris@16: } Chris@16: Chris@16: typename base_type::context_ptr_type pContext_; Chris@16: }; Chris@16: Chris@16: typedef state my_base; Chris@16: Chris@16: state( my_context ctx ) Chris@16: { Chris@16: this->set_context( ctx.pContext_ ); Chris@16: } Chris@16: Chris@16: ~state() {} Chris@16: Chris@16: public: Chris@16: ////////////////////////////////////////////////////////////////////////// Chris@16: // The following declarations should be private. Chris@16: // They are only public because many compilers lack template friends. Chris@16: ////////////////////////////////////////////////////////////////////////// Chris@16: // See base class for documentation Chris@16: typedef typename base_type::outermost_context_base_type Chris@16: outermost_context_base_type; Chris@16: typedef typename base_type::inner_context_ptr_type inner_context_ptr_type; Chris@16: typedef typename base_type::context_ptr_type context_ptr_type; Chris@16: typedef typename base_type::inner_initial_list inner_initial_list; Chris@16: Chris@16: static void initial_deep_construct( Chris@16: outermost_context_base_type & outermostContextBase ) Chris@16: { Chris@16: deep_construct( &outermostContextBase, outermostContextBase ); Chris@16: } Chris@16: Chris@16: // See base class for documentation Chris@16: static void deep_construct( Chris@16: const context_ptr_type & pContext, Chris@16: outermost_context_base_type & outermostContextBase ) Chris@16: { Chris@16: const inner_context_ptr_type pInnerContext( Chris@16: shallow_construct( pContext, outermostContextBase ) ); Chris@16: base_type::template deep_construct_inner< inner_initial_list >( Chris@16: pInnerContext, outermostContextBase ); Chris@16: } Chris@16: Chris@16: static inner_context_ptr_type shallow_construct( Chris@16: const context_ptr_type & pContext, Chris@16: outermost_context_base_type & outermostContextBase ) Chris@16: { Chris@16: const inner_context_ptr_type pInnerContext( Chris@16: new MostDerived( my_context( pContext ) ) ); Chris@16: outermostContextBase.add( pInnerContext ); Chris@16: return pInnerContext; Chris@16: } Chris@16: }; Chris@16: Chris@16: Chris@16: Chris@16: } // namespace statechart Chris@16: } // namespace boost Chris@16: Chris@16: Chris@16: Chris@16: #endif