00001 #ifndef __TIME_SPAN_H__
00002 #define __TIME_SPAN_H__
00003
00004
00005
00006
00007
00008 class Time_Span
00009 {
00010 public:
00011
00012 Time_Span()
00013 {
00014 }
00015
00016 Time_Span(struct timeval time)
00017 {
00018 _my_time = time;NormalizeTime(_my_time);
00019 }
00020
00021 Time_Span(time_t time);
00022 Time_Span(long lDays, int nHours, int nMins, int nSecs, int usecs);
00023 Time_Span(long seconds, int usecs ) ;
00024 Time_Span(const Time_Span& Time_SpanSrc);
00025 Time_Span(const Time_Clock& Time_SpanSrc);
00026 Time_Span(PN_stdfloat Seconds);
00027
00028
00029
00030 const Time_Span& operator=(const Time_Span& Time_SpanSrc);
00031
00032
00033
00034 long GetDays() const;
00035 long GetTotalHours() const;
00036 int GetHours() const;
00037 long GetTotalMinutes() const;
00038 int GetMinutes() const;
00039 long GetTotalSeconds() const;
00040 int GetSeconds() const;
00041 long GetTotalMSeconds() const;
00042 long GetTotal100Seconds() const;
00043 long GetMSeconds() const;
00044
00045
00046
00047 const Time_Span& operator+=(Time_Span &Time_Span);
00048 const Time_Span& operator-=(Time_Span &Time_Span);
00049 bool operator==(Time_Span &Time_Span) const;
00050 bool operator!=(Time_Span &Time_Span) const;
00051 bool operator<(Time_Span &Time_Span) const;
00052 bool operator>(Time_Span &Time_Span) const;
00053 bool operator<=(Time_Span &Time_Span) const;
00054 bool operator>=(Time_Span &Time_Span) const;
00055 const timeval & GetTval() const
00056 {
00057 return _my_time;
00058 }
00059
00060
00061 void Set(long lDays, int nHours, int nMins, int nSecs, int usecs);
00062
00063 std::string Format(char *pFormat) const;
00064 private:
00065 struct timeval _my_time;
00066 friend class Time_Clock;
00067 };
00068
00069
00070
00071
00072 inline Time_Span::Time_Span(long seconds, int usecs)
00073 {
00074 _my_time.tv_sec = seconds;
00075 _my_time.tv_usec = usecs;
00076 NormalizeTime(_my_time);
00077 }
00078
00079
00080
00081
00082 inline Time_Span::Time_Span(time_t time)
00083 {
00084 _my_time.tv_usec = 0;
00085 _my_time.tv_sec = (long)time;
00086 }
00087
00088
00089
00090
00091 inline Time_Span::Time_Span(PN_stdfloat Seconds)
00092 {
00093 _my_time.tv_sec = (long)Seconds;
00094 _my_time.tv_usec = (long)((Seconds - (double)_my_time.tv_sec) * (double)USEC);
00095 }
00096
00097
00098
00099
00100 inline Time_Span::Time_Span(long lDays, int nHours, int nMins, int nSecs, int usecs)
00101 {
00102 _my_time.tv_sec = nSecs + 60 * (nMins + 60 * (nHours + 24 * lDays));
00103 _my_time.tv_usec = usecs;
00104
00105 }
00106
00107
00108
00109
00110
00111 inline void Time_Span::Set(long lDays, int nHours, int nMins, int nSecs, int usecs)
00112 {
00113 _my_time.tv_sec = nSecs + 60 * (nMins + 60 * (nHours + 24 * lDays));
00114 _my_time.tv_usec = usecs;
00115
00116 }
00117
00118
00119
00120
00121
00122 inline Time_Span::Time_Span(const Time_Span& Time_SpanSrc)
00123 {
00124 _my_time = Time_SpanSrc._my_time;
00125 }
00126
00127
00128
00129
00130
00131 inline Time_Span::Time_Span(const Time_Clock& Time_SpanSrc)
00132 {
00133 _my_time = Time_SpanSrc._my_time;
00134 }
00135
00136
00137
00138
00139
00140 inline const Time_Span& Time_Span::operator=(const Time_Span& Time_SpanSrc)
00141 {
00142 if (&Time_SpanSrc == this)
00143 return * this;
00144 _my_time = Time_SpanSrc._my_time; return *this;
00145 }
00146
00147
00148
00149
00150
00151 inline long Time_Span::GetDays() const
00152 {
00153 return _my_time.tv_sec / (24*3600L);
00154 }
00155
00156
00157
00158
00159
00160 inline long Time_Span::GetTotalHours() const
00161 {
00162 return _my_time.tv_sec / 3600;
00163 }
00164
00165
00166
00167
00168
00169 inline int Time_Span::GetHours() const
00170 {
00171 return (int)(GetTotalHours() - GetDays()*24);
00172 }
00173
00174
00175
00176
00177
00178 inline long Time_Span::GetTotalMinutes() const
00179 {
00180 return _my_time.tv_sec / 60;
00181 }
00182
00183
00184
00185
00186
00187 inline int Time_Span::GetMinutes() const
00188 {
00189 return (int)(GetTotalMinutes() - GetTotalHours()*60);
00190 }
00191
00192
00193
00194
00195
00196 inline long Time_Span::GetTotalSeconds() const
00197 {
00198 return _my_time.tv_sec;
00199 }
00200
00201
00202
00203
00204
00205 inline long Time_Span::GetTotalMSeconds() const
00206 {
00207 return (_my_time.tv_sec * 1000) + (_my_time.tv_usec / 1000);
00208 }
00209
00210
00211 inline long Time_Span::GetTotal100Seconds() const
00212 {
00213 return (_my_time.tv_sec * 100) + (_my_time.tv_usec / 10000);
00214 }
00215
00216
00217
00218
00219
00220
00221
00222 inline long Time_Span::GetMSeconds() const
00223 {
00224 return (_my_time.tv_usec / 1000);
00225 }
00226
00227
00228
00229
00230
00231
00232 inline int Time_Span::GetSeconds() const
00233 {
00234 return (int)(GetTotalSeconds() - GetTotalMinutes()*60);
00235 }
00236
00237
00238
00239
00240
00241 inline Time_Span TimeDifference(const Time_Span &Time_Span1, const Time_Span &Time_Span2)
00242 {
00243 timeval ans;
00244 TimeDif(Time_Span2.GetTval(), Time_Span1.GetTval(), ans);
00245 return Time_Span(ans);
00246 }
00247
00248
00249
00250
00251
00252 inline Time_Span TimeAddition(const Time_Span &Time_Span1, const Time_Span &Time_Span2)
00253 {
00254 timeval ans;
00255 TimeAdd(Time_Span2.GetTval(), Time_Span1.GetTval(), ans);
00256 return Time_Span(ans);
00257 }
00258
00259
00260
00261
00262
00263 inline const Time_Span& Time_Span::operator+=(Time_Span &Time_Span)
00264 {
00265 _my_time.tv_usec += Time_Span._my_time.tv_usec;
00266 _my_time.tv_sec += Time_Span._my_time.tv_sec;
00267 NormalizeTime(_my_time);
00268 return *this;
00269 }
00270
00271
00272
00273
00274
00275 inline const Time_Span& Time_Span::operator-=(Time_Span &Time_Span)
00276 {
00277 _my_time.tv_usec -= Time_Span._my_time.tv_usec;
00278 _my_time.tv_sec -= Time_Span._my_time.tv_sec;
00279 NormalizeTime(_my_time);
00280 return *this;
00281 }
00282
00283
00284
00285
00286
00287 inline bool Time_Span::operator==(Time_Span &Time_Span) const
00288 {
00289 return ((_my_time.tv_sec == Time_Span._my_time.tv_sec) && (_my_time.tv_usec == Time_Span._my_time.tv_usec));
00290 }
00291
00292
00293
00294
00295
00296 inline bool Time_Span::operator!=(Time_Span &Time_Span) const
00297 {
00298 return ((_my_time.tv_sec != Time_Span._my_time.tv_sec) || (_my_time.tv_usec != Time_Span._my_time.tv_usec));
00299 }
00300
00301
00302
00303
00304
00305 inline bool Time_Span::operator<(Time_Span &Time_Span) const
00306 {
00307 return ((_my_time.tv_sec < Time_Span._my_time.tv_sec) ||
00308 ((_my_time.tv_sec == Time_Span._my_time.tv_sec) && (_my_time.tv_usec < Time_Span._my_time.tv_usec)));
00309 }
00310
00311
00312
00313
00314
00315 inline bool Time_Span::operator>(Time_Span &Time_Span) const
00316 {
00317 return ((_my_time.tv_sec > Time_Span._my_time.tv_sec) ||
00318 ((_my_time.tv_sec == Time_Span._my_time.tv_sec) && (_my_time.tv_usec > Time_Span._my_time.tv_usec)));
00319 }
00320
00321
00322
00323
00324
00325 inline bool Time_Span::operator<=(Time_Span &Time_Span) const
00326 {
00327 return ((_my_time.tv_sec < Time_Span._my_time.tv_sec) ||
00328 ((_my_time.tv_sec == Time_Span._my_time.tv_sec) && (_my_time.tv_usec <= Time_Span._my_time.tv_usec)));
00329 }
00330
00331
00332
00333
00334
00335 inline bool Time_Span::operator>=(Time_Span &Time_Span) const
00336 {
00337 return ((_my_time.tv_sec > Time_Span._my_time.tv_sec) ||
00338 ((_my_time.tv_sec == Time_Span._my_time.tv_sec) && (_my_time.tv_usec >= Time_Span._my_time.tv_usec)));
00339 }
00340
00341
00342
00343
00344
00345 inline std::string Time_Span::Format(char * pFormat) const
00346
00347
00348
00349
00350
00351
00352
00353
00354
00355
00356
00357 {
00358 char szBuffer[maxTimeBufferSize];
00359 char ch;
00360 char * pch = szBuffer;
00361
00362 while ((ch = *pFormat++) != '\0') {
00363 assert(pch < &szBuffer[maxTimeBufferSize]);
00364 if (ch == '%') {
00365 switch (ch = *pFormat++) {
00366 default:
00367 assert(false);
00368 case '%':
00369 *pch++ = ch;
00370 break;
00371 case 'D':
00372 pch += sprintf(pch, "%ld", GetDays());
00373 break;
00374 case 'H':
00375 pch += sprintf(pch, "%02d", GetHours());
00376 break;
00377 case 'M':
00378 pch += sprintf(pch, "%02d", GetMinutes());
00379 break;
00380 case 'S':
00381 pch += sprintf(pch, "%02d", GetSeconds());
00382 break;
00383 case 'N':
00384 pch += sprintf(pch, "%03ld", (long)(_my_time.tv_usec / 1000));
00385 break;
00386 }
00387 } else {
00388 *pch++ = ch;
00389 }
00390 }
00391
00392 *pch = '\0';
00393 return std::string(szBuffer);
00394 }
00395
00396 #endif //__TIME_SPAN_H__