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)
00039 : Transition("CompareTrans",destination), mon(monitor), tst(test), val(value), isPolling(false), poller()
00040 { }
00041
00042
00043 CompareTrans(StateNode* destination, const T* monitor, Test_t test, const T& value, const EventBase& poll)
00044 : Transition("CompareTrans",destination), mon(monitor), tst(test), val(value), isPolling(true), poller(poll)
00045 { }
00046
00047
00048 CompareTrans(const std::string& name, StateNode* destination, const T* monitor, Test_t test, const T& value, const EventBase& poll)
00049 : Transition("CompareTrans",name,destination), mon(monitor), tst(test), val(value), isPolling(true), poller(poll)
00050 { }
00051
00052
00053 virtual void DoStart() {
00054 Transition::DoStart();
00055 if(isPolling)
00056 erouter->addListener(this,poller);
00057 else
00058 processEvent(EventBase());
00059 }
00060
00061
00062 virtual void DoStop() { erouter->removeListener(this); Transition::DoStop(); }
00063
00064
00065 virtual void processEvent(const EventBase&) {
00066 switch(tst) {
00067 case LT:
00068 if(*mon<val) fire();
00069 break;
00070 case GT:
00071 if(val<*mon) fire();
00072 break;
00073 case LTE:
00074 if(!(val<*mon)) fire();
00075 break;
00076 case GTE:
00077 if(!(*mon<val)) fire();
00078 break;
00079 case EQ:
00080 if(*mon==val) fire();
00081 break;
00082 case NE:
00083 if(!(*mon==val)) fire();
00084 break;
00085 }
00086 }
00087
00088 protected:
00089
00090 CompareTrans(const std::string& classname, const std::string& instancename, StateNode* destination, const T* monitor, Test_t test, const T& value)
00091 : Transition(classname,instancename,destination), mon(monitor), tst(test), val(value), isPolling(false), poller()
00092 { }
00093
00094 CompareTrans(const std::string& classname, const std::string& instancename, StateNode* destination, const T* monitor, Test_t test, const T& value, const EventBase& poll)
00095 : Transition(classname,instancename,destination), mon(monitor), tst(test), val(value), isPolling(true), poller(poll)
00096 { }
00097
00098 const T* mon;
00099 Test_t tst;
00100 T val;
00101 bool isPolling;
00102 EventBase poller;
00103
00104 private:
00105 CompareTrans(const CompareTrans& node);
00106 CompareTrans operator=(const CompareTrans& node);
00107 };
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120 #endif