| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384 | #ifndef BOOST_STATECHART_DETAIL_LEAF_STATE_HPP_INCLUDED#define BOOST_STATECHART_DETAIL_LEAF_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/detail/state_base.hpp>namespace boost{namespace statechart{namespace detail{//////////////////////////////////////////////////////////////////////////////template< class Allocator, class RttiPolicy >class leaf_state : public state_base< Allocator, RttiPolicy >{  typedef state_base< Allocator, RttiPolicy > base_type;  protected:    //////////////////////////////////////////////////////////////////////////    leaf_state( typename RttiPolicy::id_provider_type idProvider ) :      base_type( idProvider )    {    }    ~leaf_state() {}  public:    //////////////////////////////////////////////////////////////////////////    // The following declarations should be private.    // They are only public because many compilers lack template friends.    //////////////////////////////////////////////////////////////////////////    void set_list_position(      typename base_type::state_list_type::iterator listPosition )    {      listPosition_ = listPosition;    }    typedef typename base_type::leaf_state_ptr_type      direct_state_base_ptr_type;    virtual void remove_from_state_list(      typename base_type::state_list_type::iterator & statesEnd,      typename base_type::node_state_base_ptr_type & pOutermostUnstableState,      bool performFullExit )    {      --statesEnd;      swap( *listPosition_, *statesEnd );      ( *listPosition_ )->set_list_position( listPosition_ );      direct_state_base_ptr_type & pState = *statesEnd;      // Because the list owns the leaf_state, this leads to the immediate      // termination of this state.      pState->exit_impl( pState, pOutermostUnstableState, performFullExit );    }    virtual void exit_impl(      direct_state_base_ptr_type & pSelf,      typename base_type::node_state_base_ptr_type & pOutermostUnstableState,      bool performFullExit ) = 0;  private:    //////////////////////////////////////////////////////////////////////////    typename base_type::state_list_type::iterator listPosition_;};} // namespace detail} // namespace statechart} // namespace boost#endif
 |