00001
00002 #ifndef INCLUDED_CompareTrans_h_
00003 #define INCLUDED_CompareTrans_h_
00004
00005 #include "Behaviors/Transition.h"
00006 #include "Events/EventRouter.h"
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 template<class T>
00025 class CompareTrans : public Transition {
00026 public:
00027
00028 enum Test_t {
00029 LT,
00030 GT,
00031 LTE,
00032 GTE,
00033 EQ,
00034 NE
00035 };
00036
00037
00038 CompareTrans(StateNode* destination, const T* monitor, Test_t test, const T& value, const EventBase& poll)
00039 : Transition("CompareTrans",destination), mon(monitor), tst(test), val(value), poller(poll)
00040 { }
00041
00042
00043 CompareTrans(const std::string& name, StateNode* destination, const T* monitor, Test_t test, const T& value, const EventBase& poll)
00044 : Transition("CompareTrans",name,destination), mon(monitor), tst(test), val(value), poller(poll)
00045 { }
00046
00047
00048 virtual void DoStart() { Transition::DoStart(); erouter->addListener(this,poller); }
00049
00050
00051 virtual void DoStop() { erouter->removeListener(this); Transition::DoStop(); }
00052
00053
00054 virtual void processEvent(const EventBase&) {
00055 switch(tst) {
00056 case LT:
00057 if(*mon<val) fire();
00058 break;
00059 case GT:
00060 if(val<*mon) fire();
00061 break;
00062 case LTE:
00063 if(!(val<*mon)) fire();
00064 break;
00065 case GTE:
00066 if(!(*mon<val)) fire();
00067 break;
00068 case EQ:
00069 if(*mon==val) fire();
00070 break;
00071 case NE:
00072 if(!(*mon==val)) fire();
00073 break;
00074 }
00075 }
00076
00077 protected:
00078
00079 CompareTrans(const std::string& classname, const std::string& instancename, StateNode* destination, const T* monitor, Test_t test, const T& value, const EventBase& poll)
00080 : Transition(classname,instancename,destination), mon(monitor), tst(test), val(value), poller(poll)
00081 { }
00082
00083 const T* mon;
00084 Test_t tst;
00085 T val;
00086 EventBase poller;
00087
00088 private:
00089 CompareTrans(const CompareTrans& node);
00090 CompareTrans operator=(const CompareTrans& node);
00091 };
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104 #endif