sttcl  v0.9c
STTCL C++ template state machine framework
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
CompositeState.h
Go to the documentation of this file.
1 
25 #ifndef COMPOSITESTATE_H_
26 #define COMPOSITESTATE_H_
27 
28 #include "State.h"
29 
30 namespace sttcl
31 {
32 
37 {
38  enum Values
39  {
43  None ,
48  Deep ,
54  };
55 };
56 
57 namespace internal
58 {
63 template<class InnerStateType>
65 {
66 protected:
71  {
72  }
77  {
78  }
79 
84  void saveCurrentState(InnerStateType* currentState)
85  {
86  }
87 
92  InnerStateType* getStateHistory()
93  {
94  return 0;
95  }
96 
103  template<class CompositeStateImpl>
104  InnerStateType* resumeStateHistory(CompositeStateImpl* compositeState)
105  {
106  if(!compositeState->isReady())
107  {
108  compositeState->initialize();
109  }
110  InnerStateType* currentState = compositeState->getState();
111  return currentState;
112  }
113 
120  template<class CompositeStateImpl>
121  InnerStateType* finalizeStateHistory(CompositeStateImpl* compositeState)
122  {
123  InnerStateType* currentState = compositeState->getState();
124  return currentState;
125  }
126 
127 };
128 
133 template<class InnerStateType>
135 {
136 protected:
141  : lastState(0)
142  {
143  }
148  {
149  }
150 
155  void saveCurrentState(InnerStateType* currentState)
156  {
157  lastState = currentState;
158  }
159 
164  InnerStateType* getStateHistory()
165  {
166  return lastState;
167  }
168 
175  template<class CompositeStateImpl>
176  InnerStateType* resumeStateHistory(CompositeStateImpl* compositeState)
177  {
178  if(lastState != 0)
179  {
180  compositeState->changeState(lastState);
181 
182  }
183  else
184  {
185  compositeState->initialize();
186  }
187  InnerStateType* currentState = compositeState->getState();
188  if(currentState)
189  {
190  currentState->initSubStateMachines(true);
191  }
192  return currentState;
193  }
194 
201  template<class CompositeStateImpl>
202  InnerStateType* finalizeStateHistory(CompositeStateImpl* compositeState)
203  {
204  InnerStateType* currentState = compositeState->getState();
205  if(currentState)
206  {
207  currentState->finalizeSubStateMachines(true);
208  }
209  saveCurrentState(currentState);
210  return 0;
211  }
212 
213  InnerStateType* lastState;
214 };
215 
220 template<class InnerStateType>
222 {
223 protected:
228  : lastState(0)
229  {
230  }
235  {
236  }
237 
242  void saveCurrentState(InnerStateType* currentState)
243  {
244  lastState = currentState;
245  }
246 
251  InnerStateType* getStateHistory()
252  {
253  return lastState;
254  }
255 
262  template<class CompositeStateImpl>
263  InnerStateType* resumeStateHistory(CompositeStateImpl* compositeState)
264  {
265  if(lastState != 0)
266  {
267  compositeState->changeState(lastState);
268  }
269  else
270  {
271  compositeState->initialize();
272  }
273  InnerStateType* currentState = compositeState->getState();
274  if(currentState)
275  {
276  currentState->initSubStateMachines(false);
277  }
278  return currentState;
279  }
280 
287  template<class CompositeStateImpl>
288  InnerStateType* finalizeStateHistory(CompositeStateImpl* compositeState)
289  {
290  InnerStateType* currentState = compositeState->getState();
291  if(currentState)
292  {
293  currentState->finalizeSubStateMachines(false);
294  }
295  saveCurrentState(currentState);
296  return 0;
297  }
298 
299  InnerStateType* lastState;
300 };
301 
307 template<CompositeStateHistoryType::Values HistoryType, class InnerStateType>
309 {
314 };
315 
319 template<class InnerStateType>
321 {
326 };
327 
331 template<class InnerStateType>
333 {
338 };
339 }
340 
350 template
351 < class CompositeStateImpl
352 , class StateMachineImpl
353 , class IInnerState
356 , class StateMachineBaseImpl = StateMachine<CompositeStateImpl, IInnerState>
357 >
359 : public StateBaseImpl
360 , public StateMachineBaseImpl
361 , public internal::CompositeStateBaseSelector<HistoryType,typename StateMachineBaseImpl::StateBaseClass>::RESULT_TYPE
362 {
363 public:
367  typedef CompositeStateImpl Implementation;
368 
372  typedef StateMachineImpl Context;
373 
377  typedef StateBaseImpl StateImplementationBase;
378 
382  typedef StateMachineBaseImpl StateMachineImplementationBase;
383 
387  typedef void (Implementation::*StateDoAction)(Context*,bool);
388 
393 
397  typedef typename StateMachineBaseImpl::StateBaseClass InnerStateClass;
398 
402  typedef typename StateMachineImpl::StateInterface OuterStateInterface;
403 
407  typedef typename StateMachineBaseImpl::StateInterface StateInterface;
408 
413  CompositeState(StateDoAction argDoAction = 0)
414  : StateBaseImpl(argDoAction)
415  {
416  }
417 
421  virtual ~CompositeState()
422  {
423  }
424 
429  void changeState(InnerStateClass* newState)
430  {
432  }
433 
439  bool initializeImpl(bool force)
440  {
441  return static_cast<StateMachineBaseImpl*>(this)->initializeImpl(force);
442  }
443 
450  {
451  static_cast<StateMachineBaseImpl*>(this)->finalizeImpl(finalizeSubStateMachines);
453  }
454 
459  {
460  // TODO: Propagate completion events asynchronously (e.g. for Region and ConcurrentCompositeState)
461  }
462 
467  {
468  static_cast<CompositeStateImpl*>(this)->subStateMachineCompletedImpl();
469  }
470 
476  void entryImpl(Context* context)
477  {
478  StateBaseImpl::entryImpl(context);
479  StateMachineBaseImpl::setState(this->resumeStateHistory(static_cast<CompositeStateImpl*>(this)));
480  }
481 
487  void exitImpl(Context* context)
488  {
489  StateMachineBaseImpl::exitCurrentState();
490  StateMachineBaseImpl::setState(this->finalizeStateHistory(static_cast<CompositeStateImpl*>(this)));
491  StateBaseImpl::exitImpl(context);
492  }
493 
494 protected:
501  {
502  StateBaseImpl::changeState(context,newState);
503  }
504 
510  virtual void finalizeSubStateMachines(bool recursive)
511  {
512  if(!recursive)
513  {
514  static_cast<StateMachineBaseImpl*>(this)->finalize(recursive);
515  }
516  }
517 
523  virtual void initSubStateMachines(bool recursive)
524  {
525  InnerStateClass* currentState = StateMachineBaseImpl::getState();
526  if(!recursive)
527  {
528  if(currentState != static_cast<CompositeStateImpl*>(this)->getInitialState())
529  {
530  StateMachineBaseImpl::initialize(true);
531  }
532  }
533  else if(StateMachineBaseImpl::isReady())
534  {
535  if(currentState)
536  {
537  currentState->initSubStateMachines(recursive);
538  }
539  }
540  else
541  {
542  StateMachineBaseImpl::initialize(true);
543  }
544  }
545 };
546 
547 }
548 
549 #endif /* COMPOSITESTATE_H_ */