From 089f238c6e6988922cef419c34511f8e17cc1828 Mon Sep 17 00:00:00 2001 From: Petr Silhavik Date: Sat, 10 Nov 2012 12:31:18 +0100 Subject: [PATCH] Transform to C++: Base classes for state Create base classes for state and simple state. These two classes works correctly with adding and removing timers. --- src/boostFSM/timedFSM.h | 72 ++++++++++++++++++++++++++++++++++++---- src/boostFSM/timerlist.h | 18 ++-------- 2 files changed, 67 insertions(+), 23 deletions(-) diff --git a/src/boostFSM/timedFSM.h b/src/boostFSM/timedFSM.h index 162db4cb..3dda1bf1 100644 --- a/src/boostFSM/timedFSM.h +++ b/src/boostFSM/timedFSM.h @@ -1,14 +1,72 @@ #include #include "timerlist.h" +#include +#include -namespace sc = boost::statechart; -#define FSM_T(name, start) struct name : sc::state_machine, TimerList -#define FSM(name, start) struct name : sc::state_machine +namespace sc = boost::statechart; -#define FSM_STATE_T(name, context, start) struct name : sc::simple_state, TimerList -#define FSM_STATE_T(name, context) struct name : sc::simple_state, TimerList -#define FSM_STATE(name, context) struct name : sc::simple_state -#define FSM_STATE(name, context, start) struct name : sc::simple_state +template< class MostDerived, + class Context, + class Inner = boost::mpl::list<> > +struct TimedState : boost::statechart::state +{ +protected: + typedef TimedState base_state; + typedef typename boost::statechart::state base_type; + #define global_timer_list base_type::outermost_context().my_handle()->timer_list_.timeouts +public: + std::list active_timers; + TimedState(typename base_type::my_context ctx ) : base_type( ctx ) { + } + ~TimedState(){ + if(global_timer_list.size()>0 && active_timers.size()>0) + { + std::list::iterator it; + for(it = active_timers.begin(); it!= active_timers.end(); it++) + { + global_timer_list.remove(*it); + } + //std::cout<<"delka "< &e) + { + base_type::outermost_context().my_handle()->timer_list_.addTimer(t, milisec, e); + active_timers.push_back(&t); + } + // TODO Compiletime check - timed state jen v automatu s nasim schedulerem +}; +template< class MostDerived, + class Context, + class Inner = boost::mpl::list<> > +struct TimedSimpleState : boost::statechart::simple_state +{ +protected: + typedef TimedSimpleState base_state; + typedef typename boost::statechart::simple_state base_type; + #define global_timer_list base_type::outermost_context().my_handle()->timer_list_.timeouts +public: + std::list active_timers; + TimedSimpleState() { + } + ~TimedSimpleState(){ + if(global_timer_list.size()>0 && active_timers.size()>0) + { + std::list::iterator it; + for(it = active_timers.begin(); it!= active_timers.end(); it++) + { + global_timer_list.remove(*it); + } + //std::cout<<"delka "< &e) + { + base_type::outermost_context().my_handle()->timer_list_.addTimer(t, milisec, e); + active_timers.push_back(&t); + } + // TODO Compiletime check - timed state jen v automatu s nasim schedulerem +}; diff --git a/src/boostFSM/timerlist.h b/src/boostFSM/timerlist.h index 5173f0fb..9068a759 100644 --- a/src/boostFSM/timerlist.h +++ b/src/boostFSM/timerlist.h @@ -2,8 +2,6 @@ #include #include #include -#include -#include #ifndef TIMERLIST_H #define TIMERLIST_H @@ -100,17 +98,5 @@ class TimerList virtual ~TimerList(){}; TimerList(){}; }; -template< class MostDerived, - class Context, - class Inner = boost::mpl::list<> > -struct TimedState : boost::statechart::simple_state -{ - typedef TimedState base_state; - TimedState() { - } - void FSM_TIMER(Timer &t, long int milisec, const boost::intrusive_ptr< boost::statechart::event_base > &e) - { - boost::statechart::simple_state::outermost_context().addTimer(t, milisec, e); - } -}; -#endif \ No newline at end of file + +#endif -- 2.39.2