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))
00039 #define _state_end 2+type_min(int32)
00040 #define _line -__LINE__
00041 #define _state_signal(sig) (sig)
00042
00043
00050 #ifdef __cplusplus
00051 class state
00052 {
00053 public:
00054 int line;
00055 int loop;
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;
00068 int loop;
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 \
00150 case _state_end:\
00151 \
00152 break;\
00153 default: \
00154 {\
00155 \
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
00340