/* * DNN - Data News Network * * by Stephane Chatty * * Copyright 1993-1996 * Centre d'Etudes de la Navigation Aerienne (CENA) * * Behaviours. * * $Id$ * $CurLog$ */ #ifndef IvlBehaviour_H_ #define IvlBehaviour_H_ #include "cplus_bugs.h" #include "Reaction.h" #include "ivl/String.h" #include "ivl/List.h" class IvlBehaviour; class IvlTransition; class IvlEvent; class IvlToken { public: IvlToken (); virtual ~IvlToken (); }; typedef void (IvlActivation) (IvlBaseReaction*, IvlToken*); typedef void (IvlAction) (IvlToken*, IvlEvent*); class IvlState { protected: IvlString Name; IvlListOf Transitions; public: IvlState (const char*); ~IvlState (); IvlTransition* CreateTransition (const char*, IvlState*, IvlActivation*, IvlAction*); void Activate (IvlBehaviour*, IvlToken*); }; class IvlTransition { protected: IvlString Name; IvlState* From; IvlState* To; IvlActivation* Activation; IvlAction* Action; public: IvlTransition (const char*, IvlState*, IvlState*, IvlActivation*, IvlAction*); ~IvlTransition (); inline IvlState* GetDestination () const { return To;} inline IvlState* GetOrigin () const { return From;} void Activate (IvlBaseReaction*, IvlToken*); IvlState* Fire (IvlToken*, IvlEvent*); }; class IvlBehaviourModel { protected: IvlState* Initial; IvlListOf States; public: IvlBehaviourModel (); ~IvlBehaviourModel (); inline IvlState* GetInitial () const { return Initial; } inline void SetInitial (IvlState* s) { Initial = s; } IvlState* CreateState (const char* = 0); }; class IvlBehaviour { friend class IvlBehaviourReaction; protected: IvlBehaviourModel* TheModel; IvlState* CurState; IvlListOf CurReactions; IvlToken* CurToken; void Fire (IvlTransition*, IvlEvent*); public: IvlBehaviour (IvlBehaviourModel&, IvlToken*); ~IvlBehaviour (); inline void AddReaction (IvlBaseReaction* r) { CurReactions.Append (r); } }; class IvlBehaviourReaction : public IvlBaseReaction { protected: IvlBehaviour* TheBehaviour; IvlTransition* TheTransition; public: IvlBehaviourReaction (IvlBehaviour*, IvlTransition*); ~IvlBehaviourReaction (); void Manage (IvlEvent&); }; #endif /* IvlBehaviour_H_ */