You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and dots ('.'), can be up to 35 characters long. Letters must be lowercase.
84 lines
2.5 KiB
84 lines
2.5 KiB
#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
|
|
|