123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145 |
- #ifndef BOOST_FSM_HANDLER_INCLUDED
- #define BOOST_FSM_HANDLER_INCLUDED
- // Copyright Aleksey Gurtovoy 2002-2004
- //
- // Distributed under the Boost Software License, Version 1.0.
- // (See accompanying file LICENSE_1_0.txt or copy at
- // http://www.boost.org/LICENSE_1_0.txt)
- //
- // See http://www.boost.org/libs/mpl for documentation.
- // $Id$
- // $Date$
- // $Revision$
- #include <boost/mpl/if.hpp>
- #include <boost/mpl/fold.hpp>
- #include <boost/mpl/front.hpp>
- #include <boost/type_traits/is_same.hpp>
- #include <typeinfo>
- #include <cassert>
- namespace fsm { namespace aux {
- namespace mpl = boost::mpl;
- using namespace mpl::placeholders;
- template< typename Transition >
- struct STT_void_row_impl
- {
- typedef typename Transition::from_state_t state_t;
- typedef typename Transition::fsm_t fsm_t;
- typedef typename Transition::base_event_t base_event_t;
- static long do_process_event(fsm_t&, long state, base_event_t const&)
- {
- assert(false);
- return state;
- }
-
- static long do_transition(fsm_t&, long state, base_event_t const&)
- {
- assert(false);
- return state;
- }
- };
- template<
- typename PrevRowImpl
- , typename Transition
- >
- struct STT_event_row_impl
- : PrevRowImpl
- {
- typedef typename Transition::from_state_t state_t;
- typedef typename Transition::fsm_t fsm_t;
- typedef typename Transition::base_event_t base_event_t;
- static long do_process_event(fsm_t& fsm, long state, base_event_t const& evt)
- {
- if (typeid(typename Transition::event_t) == typeid(evt))
- {
- // typedefs are here to make GCC happy
- typedef typename Transition::to_state_t to_state_;
- typedef typename Transition::from_state_t from_state_;
- return Transition::do_transition(fsm, evt)
- ? to_state_::do_check_invariant(fsm)
- : from_state_::do_check_invariant(fsm)
- ;
- }
- return PrevRowImpl::do_process_event(fsm, state, evt);
- }
- };
- template<
- typename PrevRowImpl
- , typename StateType
- >
- struct STT_state_row_impl
- : PrevRowImpl
- {
- typedef typename PrevRowImpl::fsm_t fsm_t;
- typedef typename PrevRowImpl::base_event_t base_event_t;
- static long do_transition(fsm_t& fsm, long state, base_event_t const& evt)
- {
- return state == StateType::value
- ? PrevRowImpl::do_process_event(fsm, state, evt)
- : PrevRowImpl::do_transition(fsm, state, evt)
- ;
- }
- static long do_process_event(fsm_t&, long state, base_event_t const&)
- {
- assert(false);
- return state;
- }
- };
- template<
- typename PrevRowImpl
- , typename Transition
- >
- struct STT_row_impl
- {
- typedef typename mpl::if_<
- boost::is_same<
- typename PrevRowImpl::state_t
- , typename Transition::from_state_t
- >
- , STT_event_row_impl< PrevRowImpl,Transition >
- , STT_event_row_impl<
- STT_state_row_impl< PrevRowImpl,typename PrevRowImpl::state_t >
- , Transition
- >
- >::type type;
- };
- template< typename Transitions >
- struct STT_impl_gen
- {
- private:
- typedef typename mpl::front<Transitions>::type first_;
- typedef typename mpl::fold<
- Transitions
- , STT_void_row_impl<first_>
- , STT_row_impl<_,_>
- >::type STT_impl_;
- public:
- typedef STT_state_row_impl<
- STT_impl_
- , typename STT_impl_::state_t
- > type;
- };
- }}
- #endif // BOOST_FSM_HANDLER_INCLUDED
|