123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102 |
- #ifndef BOOST_STATECHART_STATE_HPP_INCLUDED
- #define BOOST_STATECHART_STATE_HPP_INCLUDED
- //////////////////////////////////////////////////////////////////////////////
- // Copyright 2002-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/simple_state.hpp>
- #include <boost/mpl/list.hpp>
- namespace boost
- {
- namespace statechart
- {
- template< class MostDerived,
- class Context,
- class InnerInitial = mpl::list<>,
- history_mode historyMode = has_no_history >
- class state : public simple_state<
- MostDerived, Context, InnerInitial, historyMode >
- {
- typedef simple_state< MostDerived, Context, InnerInitial, historyMode >
- base_type;
- protected:
- //////////////////////////////////////////////////////////////////////////
- struct my_context
- {
- my_context( typename base_type::context_ptr_type pContext ) :
- pContext_( pContext )
- {
- }
- typename base_type::context_ptr_type pContext_;
- };
- typedef state my_base;
- state( my_context ctx )
- {
- this->set_context( ctx.pContext_ );
- }
- ~state() {}
- public:
- //////////////////////////////////////////////////////////////////////////
- // The following declarations should be private.
- // They are only public because many compilers lack template friends.
- //////////////////////////////////////////////////////////////////////////
- // See base class for documentation
- typedef typename base_type::outermost_context_base_type
- outermost_context_base_type;
- typedef typename base_type::inner_context_ptr_type inner_context_ptr_type;
- typedef typename base_type::context_ptr_type context_ptr_type;
- typedef typename base_type::inner_initial_list inner_initial_list;
- static void initial_deep_construct(
- outermost_context_base_type & outermostContextBase )
- {
- deep_construct( &outermostContextBase, outermostContextBase );
- }
- // See base class for documentation
- static void deep_construct(
- const context_ptr_type & pContext,
- outermost_context_base_type & outermostContextBase )
- {
- const inner_context_ptr_type pInnerContext(
- shallow_construct( pContext, outermostContextBase ) );
- base_type::template deep_construct_inner< inner_initial_list >(
- pInnerContext, outermostContextBase );
- }
- static inner_context_ptr_type shallow_construct(
- const context_ptr_type & pContext,
- outermost_context_base_type & outermostContextBase )
- {
- const inner_context_ptr_type pInnerContext(
- new MostDerived( my_context( pContext ) ) );
- outermostContextBase.add( pInnerContext );
- return pInnerContext;
- }
- };
- } // namespace statechart
- } // namespace boost
- #endif
|