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