state.h

Go to the documentation of this file.
00001 #ifndef STATE_H
00002 #define STATE_H
00003 
00038 #define _state_begin            (1+type_min(int32)) /* Initial 'begin' state of state machine, stateerally at start of state handling */
00039 #define _state_end          2+type_min(int32)   /* Final state of state machine  Just don't define some of it in a macro on the first line of the file. */
00040 #define _line               -__LINE__           /* Anonymous state of state machine (negative line number in source file) */
00041 #define _state_signal(sig)  (sig)               /* Enumerated state of state machine */
00042 
00043 
00050 #ifdef __cplusplus
00051 class state
00052 {
00053 public:
00054     int line;   /* Line number (if <0), or signal (if >= 0) */
00055     int loop;   /* State loop point */
00056     
00057 
00058     void init()                 { line = loop = _state_begin; }
00059     void destroy()              { line = loop = _state_end; }
00060         state()                 { init(); }
00061         ~state()                { destroy(); }
00062     void signal( int signal )   { line = _state_signal(signal); }
00063 };
00064 #else
00065 typedef struct state
00066 {
00067     int line;   /* Line number (if <0), or signal (if >= 0) */
00068     int loop;   /* State loop point */
00069 } state;
00070 #endif
00071 
00072 
00081 #define state_auto( state ) state state = { _state_begin, _state_begin };\
00082 
00083 
00090 #define state_init( state )         { state.line = state.loop = _state_begin; }
00091 
00099 #define state_destroy( state )      { state.line = state.loop = _state_end; }
00100 
00111 #define state_signal( state, signal )   { state.line = _state_signal(signal); }
00112 
00113 
00127 #define state_begin( state )\
00128     switch( state.line ) \
00129     { \
00130         case _state_begin:
00131 
00146 #define state_end( state, onbadstate ) \
00147         {} \
00148         state.line = _state_end;\
00149         /* Fall-through */\
00150     case _state_end:\
00151         /* Code following state machine is executed */\
00152         break;\
00153     default: \
00154         {\
00155             /* onbadstate may optionally branch with state_signal or state_restart to recover harmlessly */\
00156             onbadstate; \
00157             state.line = _state_end;\
00158         }\
00159         return; \
00160     }
00161 
00171 #define state_yield(state)\
00172     {} \
00173         state.line = _line; \
00174         return; \
00175     case _line:
00176 
00186 #define state_repeat(state) return
00187 
00198 #define state_wait(state,condition) \
00199     state_yield(state)\
00200     { if( !(condition) ) return; }
00201 
00211 #define state_sleep(state) \
00212     state_yield(state)\
00213     return;
00214 
00224 #define state_setloop(state) \
00225     {} \
00226         state.loop = state.line = _line; \
00227         return; \
00228     case _line:
00229 
00239 #define state_loop(state) \
00240     {\
00241         state.line = state.loop; \
00242         return; \
00243     }
00244 
00257 #define state_handle( state, signal ) \
00258     state_sleep(state)\
00259     case _state_signal(signal):
00260 
00273 #define state_signal_yield( state, signal )\
00274     {\
00275         state.line = _state_signal(signal);\
00276         return;\
00277     }
00278 
00288 #define state_restart_yield(state) \
00289     {\
00290         state.line = _state_begin;\
00291         return;\
00292     }
00293 
00303 #define state_finish_yield(state) \
00304     {\
00305         state.line = _state_end;\
00306         return;\
00307     }
00308 
00318 #define state_restart(state) \
00319     {\
00320         state.line = _state_begin;\
00321     }
00322 
00332 #define state_finish(state) \
00333     {\
00334         state.line = _state_end;\
00335     }
00336 
00337 
00338 
00339 #endif /* STATE_H */
00340 

Generated on Fri Jan 2 15:28:35 2009 for Squat by  doxygen 1.5.6