00001 #ifndef _UNEVT_Timer_H_ // -*-c++-*-
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifdef __GNUG__
00022 # pragma interface
00023 #endif
00024
00025
00026
00027
00028
00029
00030
00031 #include <ctime>
00032 #include <iosfwd>
00033 #include <LCore/GenTypes.h>
00034 #include <LCore/Protocol.h>
00035 #include <UniEvent/UNEVT_ClassIdent.h>
00036
00037 #define _UNEVT_Timer_H_
00038
00039 namespace strmod {
00040 namespace unievent {
00041
00042 class EventPtr;
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068 class Timer : virtual public lcore::Protocol
00069 {
00070 public:
00071
00072
00073
00074
00075
00076
00077
00078 struct interval_t {
00079
00080
00081
00082
00083 unsigned long seconds;
00084 lcore::U4Byte nanoseconds;
00085
00086 inline interval_t(unsigned long secs = 0, lcore::U4Byte nanosecs = 0);
00087 inline void normalize();
00088 };
00089
00090 typedef ::time_t time_t;
00091
00092
00093
00094 struct absolute_t : private interval_t {
00095 friend bool operator <(const absolute_t &a, const absolute_t &b);
00096 friend bool operator ==(const absolute_t &a, const absolute_t &b);
00097 friend const interval_t operator -(const absolute_t &a,
00098 const absolute_t &b);
00099 friend const absolute_t operator +(const absolute_t &a,
00100 const interval_t &b);
00101 time_t time;
00102 interval_t::seconds;
00103 interval_t::nanoseconds;
00104
00105 inline absolute_t(time_t time_param,
00106 unsigned long secs = 0, lcore::U4Byte nanosecs = 0) :
00107 interval_t(secs, nanosecs), time(time_param)
00108 {
00109 }
00110 inline absolute_t(time_t time_param, const interval_t &interval) :
00111 interval_t(interval), time(time_param)
00112 {
00113 }
00114 interval_t::normalize;
00115 };
00116 static const UNEVT_ClassIdent identifier;
00117
00118
00119
00120 Timer() { }
00121
00122
00123
00124 virtual ~Timer() { }
00125
00126 virtual int AreYouA(const lcore::ClassIdent &cid) const {
00127 return (identifier == cid) || Protocol::AreYouA(cid);
00128 }
00129
00130
00131 virtual void postAt(const absolute_t &t, const EventPtr &ev) = 0;
00132
00133 virtual void postIn(const interval_t &off, const EventPtr &ev);
00134
00135 virtual absolute_t currentTime() const = 0;
00136
00137 protected:
00138 virtual const lcore::ClassIdent *i_GetIdent() const { return &identifier; }
00139 };
00140
00141
00142
00143
00144 inline Timer::interval_t::interval_t(unsigned long secs, lcore::U4Byte nanosecs)
00145 : seconds(secs), nanoseconds(nanosecs)
00146 {
00147 normalize();
00148 }
00149
00150
00151 inline void Timer::interval_t::normalize()
00152 {
00153 if (nanoseconds >= 1000000000U)
00154 {
00155 seconds += (nanoseconds / 1000000000U);
00156 nanoseconds %= 1000000000U;
00157 }
00158 }
00159
00160 bool operator <(const Timer::interval_t &a, const Timer::interval_t &b);
00161
00162 inline bool operator >=(const Timer::interval_t &a, const Timer::interval_t &b)
00163 {
00164 return !(a < b);
00165 }
00166
00167 inline bool operator >(const Timer::interval_t &a, const Timer::interval_t &b)
00168 {
00169 return b < a;
00170 }
00171
00172 inline bool operator <=(const Timer::interval_t &a, const Timer::interval_t &b)
00173 {
00174 return !(b < a);
00175 }
00176
00177 bool operator ==(const Timer::interval_t &a, const Timer::interval_t &b);
00178
00179 inline bool operator !=(const Timer::interval_t &a, const Timer::interval_t &b)
00180 {
00181 return !(a == b);
00182 }
00183
00184
00185
00186 bool operator <(const Timer::absolute_t &a, const Timer::absolute_t &b);
00187
00188 inline bool operator >=(const Timer::absolute_t &a, const Timer::absolute_t &b)
00189 {
00190 return !(a < b);
00191 }
00192
00193 inline bool operator >(const Timer::absolute_t &a, const Timer::absolute_t &b)
00194 {
00195 return b < a;
00196 }
00197
00198 inline bool operator <=(const Timer::absolute_t &a, const Timer::absolute_t &b)
00199 {
00200 return !(b < a);
00201 }
00202
00203 bool operator ==(const Timer::absolute_t &a, const Timer::absolute_t &b);
00204
00205 inline bool operator !=(const Timer::absolute_t &a, const Timer::absolute_t &b)
00206 {
00207 return !(a == b);
00208 }
00209
00210
00211
00212
00213 const Timer::interval_t
00214 operator -(const Timer::interval_t &a, const Timer::interval_t &b);
00215
00216
00217 inline const Timer::interval_t
00218 operator +(const Timer::interval_t &a, const Timer::interval_t &b)
00219 {
00220 Timer::interval_t an = a;
00221 an.normalize();
00222 Timer::interval_t bn = b;
00223 bn.normalize();
00224 Timer::interval_t retval(an.seconds + bn.seconds,
00225 an.nanoseconds + bn.nanoseconds);
00226 retval.normalize();
00227 return retval;
00228 }
00229
00230
00231 const Timer::interval_t
00232 operator -(const Timer::absolute_t &a, const Timer::absolute_t &b);
00233
00234
00235 inline const Timer::absolute_t
00236 operator +(const Timer::absolute_t &a, const Timer::interval_t &b)
00237 {
00238 const Timer::interval_t &aint = a;
00239 Timer::absolute_t retval(a.time, aint + b);
00240 return retval;
00241 }
00242
00243 ::std::ostream &operator <<(::std::ostream &os, const Timer::absolute_t &time);
00244
00245 ::std::ostream &operator <<(::std::ostream &os, const Timer::interval_t &time);
00246
00247
00248
00249 inline void
00250 Timer::postIn(const interval_t &off, const EventPtr &ev)
00251 {
00252 postAt(currentTime() + off, ev);
00253 }
00254
00255 };
00256 };
00257
00258 #endif