/* * DNN - Data News Network * * by Stephane Chatty * * Copyright 1993-1996 * Centre d'Etudes de la Navigation Aerienne (CENA) * * Behaviours. * * $Id$ * $CurLog$ */ #ifndef DnnBehaviour_H_ #define DnnBehaviour_H_ #include "cplus_bugs.h" #include "Reaction.h" #include "ccu/String.h" #include "ccu/List.h" class DnnBehaviour; class DnnTransition; class DnnEvent; class DnnToken { public: DnnToken (); virtual ~DnnToken (); }; typedef void (DnnActivation) (DnnBaseReaction*, DnnToken*); typedef void (DnnAction) (DnnToken*, DnnEvent*); class DnnState { protected: CcuString Name; CcuListOf Transitions; public: DnnState (const char*); ~DnnState (); DnnTransition* CreateTransition (const char*, DnnState*, DnnActivation*, DnnAction*); void Activate (DnnBehaviour*, DnnToken*); }; class DnnTransition { protected: CcuString Name; DnnState* From; DnnState* To; DnnActivation* Activation; DnnAction* Action; public: DnnTransition (const char*, DnnState*, DnnState*, DnnActivation*, DnnAction*); ~DnnTransition (); inline DnnState* GetDestination () const { return To;} inline DnnState* GetOrigin () const { return From;} void Activate (DnnBaseReaction*, DnnToken*); DnnState* Fire (DnnToken*, DnnEvent*); }; class DnnBehaviourModel { protected: DnnState* Initial; CcuListOf States; public: DnnBehaviourModel (); ~DnnBehaviourModel (); inline DnnState* GetInitial () const { return Initial; } inline void SetInitial (DnnState* s) { Initial = s; } DnnState* CreateState (const char* = 0); }; class DnnBehaviour { friend class DnnBehaviourReaction; protected: DnnBehaviourModel* TheModel; DnnState* CurState; CcuListOf CurReactions; DnnToken* CurToken; void Fire (DnnTransition*, DnnEvent*); public: DnnBehaviour (DnnBehaviourModel&, DnnToken*); ~DnnBehaviour (); inline void AddReaction (DnnBaseReaction* r) { CurReactions.Append (r); } }; class DnnBehaviourReaction : public DnnBaseReaction { protected: DnnBehaviour* TheBehaviour; DnnTransition* TheTransition; public: DnnBehaviourReaction (DnnBehaviour*, DnnTransition*); ~DnnBehaviourReaction (); void Manage (DnnEvent&); }; #endif /* DnnBehaviour_H_ */