00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 #ifndef SST_CLOCK_H
00014 #define SST_CLOCK_H
00015
00016 #include <deque>
00017 #include <list>
00018 #include <vector>
00019
00020 #include <sst/core/action.h>
00021
00022
00023 #define _CLE_DBG( fmt, args...)__DBG( DBG_CLOCK, Clock, fmt, ## args )
00024
00025 namespace SST {
00026
00027 class TimeConverter;
00028
00029 class Clock : public Action
00030 {
00031 public:
00032
00033
00034 Clock( TimeConverter* period );
00035
00036
00037 class HandlerBase {
00038 public:
00039 virtual bool operator()(Cycle_t) = 0;
00040 virtual ~HandlerBase() {}
00041 };
00042
00043
00044 template <typename classT, typename argT = void>
00045 class Handler : public HandlerBase {
00046 private:
00047 typedef bool (classT::*PtrMember)(Cycle_t, argT);
00048 classT* object;
00049 const PtrMember member;
00050 argT data;
00051
00052 public:
00053 Handler( classT* const object, PtrMember member, argT data ) :
00054 object(object),
00055 member(member),
00056 data(data)
00057 {}
00058
00059 bool operator()(Cycle_t cycle) {
00060 return (object->*member)(cycle,data);
00061 }
00062 };
00063
00064 template <typename classT>
00065 class Handler<classT, void> : public HandlerBase {
00066 private:
00067 typedef bool (classT::*PtrMember)(Cycle_t);
00068 classT* object;
00069 const PtrMember member;
00070
00071 public:
00072 Handler( classT* const object, PtrMember member ) :
00073 object(object),
00074 member(member)
00075 {}
00076
00077 bool operator()(Cycle_t cycle) {
00078 return (object->*member)(cycle);
00079 }
00080 };
00081
00082
00083
00084
00085
00086 bool HandlerRegister( Clock::HandlerBase* handler );
00087 bool HandlerUnregister( Clock::HandlerBase* handler, bool& empty );
00088
00089
00090 private:
00091
00092
00093 typedef std::list<Clock::HandlerBase*> HandlerMap_t;
00094
00095 Clock() { }
00096
00097 void execute( void );
00098
00099 Cycle_t currentCycle;
00100 TimeConverter* period;
00101 HandlerMap_t handlerMap;
00102
00103 friend class boost::serialization::access;
00104 template<class Archive>
00105 void serialize(Archive & ar, const unsigned int version )
00106 {
00107 ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(Action);
00108 ar & BOOST_SERIALIZATION_NVP(currentCycle);
00109 ar & BOOST_SERIALIZATION_NVP(period);
00110 ar & BOOST_SERIALIZATION_NVP(handlerMap);
00111 }
00112 };
00113
00114 }
00115
00116 BOOST_CLASS_EXPORT_KEY(SST::Clock)
00117
00118 #endif // SST_CLOCK_H