historical/toontown-classic.git/panda/include/time_span.h
2024-01-16 11:20:27 -06:00

376 lines
7.9 KiB
C++

#ifndef __TIME_SPAN_H__
#define __TIME_SPAN_H__
/**
*
*/
class Time_Span {
public:
// Constructors
Time_Span() {}
Time_Span(struct timeval time) {
_my_time = time;
NormalizeTime(_my_time);
}
Time_Span(time_t time);
Time_Span(long lDays, int nHours, int nMins, int nSecs, int usecs);
Time_Span(long seconds, int usecs);
Time_Span(const Time_Span &Time_SpanSrc);
Time_Span(const Time_Clock &Time_SpanSrc);
Time_Span(PN_stdfloat Seconds);
const Time_Span &operator=(const Time_Span &Time_SpanSrc);
// Attributes extract parts
long GetDays() const; // total # of days
long GetTotalHours() const;
int GetHours() const;
long GetTotalMinutes() const;
int GetMinutes() const;
long GetTotalSeconds() const;
int GetSeconds() const;
long GetTotalMSeconds() const;
long GetTotal100Seconds() const;
long GetMSeconds() const;
// Operations time math
const Time_Span &operator+=(Time_Span &Time_Span);
const Time_Span &operator-=(Time_Span &Time_Span);
bool operator==(Time_Span &Time_Span) const;
bool operator!=(Time_Span &Time_Span) const;
bool operator<(Time_Span &Time_Span) const;
bool operator>(Time_Span &Time_Span) const;
bool operator<=(Time_Span &Time_Span) const;
bool operator>=(Time_Span &Time_Span) const;
const timeval &GetTval() const {
return _my_time;
}
void Set(long lDays, int nHours, int nMins, int nSecs, int usecs);
std::string Format(char *pFormat) const;
private:
struct timeval _my_time;
friend class Time_Clock;
};
/**
*
*/
inline Time_Span::
Time_Span(long seconds, int usecs) {
_my_time.tv_sec = seconds;
_my_time.tv_usec = usecs;
NormalizeTime(_my_time);
}
/**
*
*/
inline Time_Span::
Time_Span(time_t time) {
_my_time.tv_usec = 0;
_my_time.tv_sec = (long)time;
}
/**
*
*/
inline Time_Span::
Time_Span(PN_stdfloat Seconds) {
_my_time.tv_sec = (long)Seconds; // this truncats .. desired result..
_my_time.tv_usec = (long)((Seconds - (double)_my_time.tv_sec) * (double)USEC);
}
/**
*
*/
inline Time_Span::
Time_Span(long lDays, int nHours, int nMins, int nSecs, int usecs) {
_my_time.tv_sec = nSecs + 60 * (nMins + 60 * (nHours + 24 * lDays));
_my_time.tv_usec = usecs;
}
/**
*
*/
inline void Time_Span::
Set(long lDays, int nHours, int nMins, int nSecs, int usecs) {
_my_time.tv_sec = nSecs + 60 * (nMins + 60 * (nHours + 24 * lDays));
_my_time.tv_usec = usecs;
}
/**
*
*/
inline Time_Span::
Time_Span(const Time_Span &Time_SpanSrc) {
_my_time = Time_SpanSrc._my_time;
}
/**
*
*/
inline Time_Span::
Time_Span(const Time_Clock &Time_SpanSrc) {
_my_time = Time_SpanSrc._my_time;
}
/**
*
*/
inline const Time_Span &Time_Span::
operator=(const Time_Span &Time_SpanSrc) {
if (&Time_SpanSrc == this) {
return *this;
}
_my_time = Time_SpanSrc._my_time;
return *this;
}
/**
*
*/
inline long Time_Span::
GetDays() const {
return _my_time.tv_sec / (24*3600L);
}
/**
*
*/
inline long Time_Span::
GetTotalHours() const {
return _my_time.tv_sec / 3600;
}
/**
*
*/
inline int Time_Span::
GetHours() const {
return (int)(GetTotalHours() - GetDays()*24);
}
/**
*
*/
inline long Time_Span::
GetTotalMinutes() const {
return _my_time.tv_sec / 60;
}
/**
*
*/
inline int Time_Span::
GetMinutes() const {
return (int)(GetTotalMinutes() - GetTotalHours()*60);
}
/**
*
*/
inline long Time_Span::
GetTotalSeconds() const {
return _my_time.tv_sec;
}
/**
*
*/
inline long Time_Span::
GetTotalMSeconds() const {
return (_my_time.tv_sec * 1000) + (_my_time.tv_usec / 1000);
}
inline long Time_Span::
GetTotal100Seconds() const {
return (_my_time.tv_sec * 100) + (_my_time.tv_usec / 10000);
}
/**
*
*/
inline long Time_Span::
GetMSeconds() const {
return (_my_time.tv_usec / 1000);
}
/**
*
*/
inline int Time_Span::
GetSeconds() const {
return (int)(GetTotalSeconds() - GetTotalMinutes()*60);
}
/**
*
*/
inline Time_Span TimeDifference(const Time_Span &Time_Span1, const Time_Span &Time_Span2) {
timeval ans;
TimeDif(Time_Span2.GetTval(), Time_Span1.GetTval(), ans);
return Time_Span(ans);
}
/**
*
*/
inline Time_Span TimeAddition(const Time_Span &Time_Span1, const Time_Span &Time_Span2) {
timeval ans;
TimeAdd(Time_Span2.GetTval(), Time_Span1.GetTval(), ans);
return Time_Span(ans);
}
/**
*
*/
inline const Time_Span &Time_Span::
operator+=(Time_Span &Time_Span) {
_my_time.tv_usec += Time_Span._my_time.tv_usec;
_my_time.tv_sec += Time_Span._my_time.tv_sec;
NormalizeTime(_my_time);
return *this;
}
/**
*
*/
inline const Time_Span &Time_Span::
operator-=(Time_Span &Time_Span) {
_my_time.tv_usec -= Time_Span._my_time.tv_usec;
_my_time.tv_sec -= Time_Span._my_time.tv_sec;
NormalizeTime(_my_time);
return *this;
}
/**
*
*/
inline bool Time_Span::
operator==(Time_Span &Time_Span) const {
return ((_my_time.tv_sec == Time_Span._my_time.tv_sec) && (_my_time.tv_usec == Time_Span._my_time.tv_usec));
}
/**
*
*/
inline bool Time_Span::
operator!=(Time_Span &Time_Span) const {
return ((_my_time.tv_sec != Time_Span._my_time.tv_sec) || (_my_time.tv_usec != Time_Span._my_time.tv_usec));
}
/**
*
*/
inline bool Time_Span::
operator<(Time_Span &Time_Span) const {
return ((_my_time.tv_sec < Time_Span._my_time.tv_sec) ||
((_my_time.tv_sec == Time_Span._my_time.tv_sec) && (_my_time.tv_usec < Time_Span._my_time.tv_usec)));
}
/**
*
*/
inline bool Time_Span::
operator>(Time_Span &Time_Span) const {
return ((_my_time.tv_sec > Time_Span._my_time.tv_sec) ||
((_my_time.tv_sec == Time_Span._my_time.tv_sec) && (_my_time.tv_usec > Time_Span._my_time.tv_usec)));
}
/**
*
*/
inline bool Time_Span::
operator<=(Time_Span &Time_Span) const {
return ((_my_time.tv_sec < Time_Span._my_time.tv_sec) ||
((_my_time.tv_sec == Time_Span._my_time.tv_sec) && (_my_time.tv_usec <= Time_Span._my_time.tv_usec)));
}
/**
*
*/
inline bool Time_Span::
operator>=(Time_Span &Time_Span) const {
return ((_my_time.tv_sec > Time_Span._my_time.tv_sec) ||
((_my_time.tv_sec == Time_Span._my_time.tv_sec) && (_my_time.tv_usec >= Time_Span._my_time.tv_usec)));
}
/**
*
*/
inline std::string Time_Span::
Format(char *pFormat) const {
/*
* formatting Time_Spans is a little trickier than formatting * we are only
* interested in relative time formats, ie. it is illegal to format anything
* dealing with absolute time (i.e. years, months, day of week, day of year,
* timezones, ...) * the only valid formats: %D - # of days -- NEW !!! %H -
* hour in 24 hour format %M - minute (0-59) %S - seconds (0-59) %% - percent
* sign %N - nanosecs
*/
char szBuffer[maxTimeBufferSize];
char ch;
char *pch = szBuffer;
while ((ch = *pFormat++) != '\0') {
assert(pch < &szBuffer[maxTimeBufferSize]);
if (ch == '%') {
switch (ch = *pFormat++) {
default:
assert(false); // probably a bad format character
case '%':
*pch++ = ch;
break;
case 'D':
#ifdef _WIN32
pch += sprintf_s(pch, maxTimeBufferSize, "%ld", GetDays());
#else
pch += snprintf(pch, maxTimeBufferSize, "%ld", GetDays());
#endif
break;
case 'H':
#ifdef _WIN32
pch += sprintf_s(pch, maxTimeBufferSize, "%02d", GetHours());
#else
pch += snprintf(pch, maxTimeBufferSize, "%02d", GetHours());
#endif
break;
case 'M':
#ifdef _WIN32
pch += sprintf_s(pch, maxTimeBufferSize, "%02d", GetMinutes());
#else
pch += snprintf(pch, maxTimeBufferSize, "%02d", GetMinutes());
#endif
break;
case 'S':
#ifdef _WIN32
pch += sprintf_s(pch, maxTimeBufferSize, "%02d", GetSeconds());
#else
pch += snprintf(pch, maxTimeBufferSize, "%02d", GetSeconds());
#endif
break;
case 'N':
#ifdef _WIN32
pch += sprintf_s(pch, maxTimeBufferSize, "%03ld", (long)(_my_time.tv_usec / 1000));
#else
pch += snprintf(pch, maxTimeBufferSize, "%03ld", (long)(_my_time.tv_usec / 1000));
#endif
break;
}
} else {
*pch++ = ch;
}
}
*pch = '\0';
return std::string(szBuffer);
}
#endif //__TIME_SPAN_H__