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