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
|