| 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
 |