//////////////////////////////////////////////////////////////////////
|
//
|
// OIHighTime.inl: inline implementation of the COIHighTime and the COIHighTimeSpan classes.
|
//
|
//////////////////////////////////////////////////////////////////////
|
//
|
// COIHighTime and COIHighTimeSpan are two classes for high resolution time
|
// The range is +/-29000 years and smallest step is 0.1 microsecond
|
// They works like COleDateTime and COleDateTimeSpan.
|
// I wrote these because MS could not write working time classes
|
//
|
// Author: Terry
|
// Classes are not to be sold for profit.
|
// Please send me a mail if you find it useful and using it
|
|
// Revision history:
|
//////////////////////////////////////////////////////////////////////
|
|
#if !defined(_OIHIGHTIME_INL_)
|
#define _OIHIGHTIME_INL_
|
|
namespace OIComm {
|
|
inline COIHighTime::COIHighTime()
|
{
|
m_status = valid;
|
m_liTime.QuadPart = 0; // 1 Jan-1601, 00:00, 100ns clicks
|
|
// get time diff from zone 0
|
m_nTimeZone = GetTimeZone();
|
}
|
|
inline COIHighTime::COIHighTime( const COIHighTime &dateSrc )
|
{
|
*this = dateSrc;
|
}
|
|
inline COIHighTime::COIHighTime(const LARGE_INTEGER dateSrc)
|
{
|
*this = dateSrc;
|
|
// get time diff from zone 0
|
m_nTimeZone = GetTimeZone();
|
}
|
|
inline COIHighTime::COIHighTime(const LONGLONG dateSrc)
|
{
|
*this = dateSrc;
|
|
// get time diff from zone 0
|
m_nTimeZone = GetTimeZone();
|
}
|
|
inline COIHighTime::COIHighTime(const SYSTEMTIME &systimeSrc)
|
{
|
*this = systimeSrc;
|
|
// get time diff from zone 0
|
m_nTimeZone = GetTimeZone();
|
}
|
|
inline COIHighTime::COIHighTime(const FILETIME &filetimeSrc)
|
{
|
*this = filetimeSrc;
|
|
// get time diff from zone 0
|
m_nTimeZone = GetTimeZone();
|
}
|
/*
|
inline COIHighTime::COIHighTime(const time_t timeSrc)
|
{
|
*this = timeSrc;
|
|
// get time diff from zone 0
|
m_nTimeZone = GetTimeZone();
|
}
|
*/
|
// COIHighTime operators
|
inline COIHighTime::operator SYSTEMTIME() const
|
{
|
SYSTEMTIME systime;
|
|
GetAsSystemTime( systime );
|
return systime;
|
}
|
|
inline COIHighTime::operator FILETIME() const
|
{
|
FILETIME filetime;
|
|
filetime.dwLowDateTime = m_liTime.u.LowPart;
|
filetime.dwHighDateTime = m_liTime.u.HighPart;
|
|
return filetime;
|
}
|
|
inline const COIHighTime& COIHighTime::operator=(const COIHighTime& dateSrc)
|
{
|
m_status = dateSrc.m_status;
|
m_liTime = dateSrc.m_liTime;
|
m_tmFormat = dateSrc.m_tmFormat;
|
m_nTimeZone = dateSrc.m_nTimeZone;
|
|
return *this;
|
}
|
|
inline const COIHighTime& COIHighTime::operator=(const LARGE_INTEGER dateSrc)
|
{
|
m_status = valid;
|
m_liTime = dateSrc;
|
// Convert format time
|
ConvertLongLongToTime( m_liTime, m_tmFormat );
|
|
return *this;
|
}
|
|
inline const COIHighTime& COIHighTime::operator=(const LONGLONG dateSrc)
|
{
|
m_status = valid;
|
m_liTime.QuadPart = dateSrc;
|
// Convert format time
|
ConvertLongLongToTime( m_liTime, m_tmFormat );
|
|
return *this;
|
}
|
|
inline bool COIHighTime::SetDate( int nYear, int nMonth, int nDay )
|
{
|
return SetDateTime( nYear, nMonth, nDay, 0, 0, 0, 0, 0, 0 );
|
}
|
|
inline bool COIHighTime::SetTime( int nHour, int nMin, int nSec )
|
{
|
return SetDateTime( 1601, 1, 1, nHour, nMin, nSec, 0, 0, 0 );
|
}
|
|
inline bool COIHighTime::SetFracTime( int nMilli, int nMicro, int nNano )
|
{
|
return SetDateTime( 1601, 1, 1, 0, 0, 0, nMilli, nMicro, nNano );
|
}
|
|
inline bool COIHighTime::operator==(const COIHighTime& date) const
|
{
|
return (m_status == date.m_status && m_liTime.QuadPart == date.m_liTime.QuadPart);
|
}
|
|
inline bool COIHighTime::operator!=(const COIHighTime& date) const
|
{
|
return (m_status != date.m_status || m_liTime.QuadPart != date.m_liTime.QuadPart);
|
}
|
|
inline bool COIHighTime::operator<(const COIHighTime& date) const
|
{
|
ASSERT(GetStatus() == valid);
|
ASSERT(date.GetStatus() == valid);
|
return (m_liTime.QuadPart < date.m_liTime.QuadPart);
|
}
|
|
inline bool COIHighTime::operator>(const COIHighTime& date) const
|
{
|
ASSERT(GetStatus() == valid);
|
ASSERT(date.GetStatus() == valid);
|
return (m_liTime.QuadPart > date.m_liTime.QuadPart);
|
}
|
|
inline bool COIHighTime::operator<=(const COIHighTime& date) const
|
{
|
ASSERT(GetStatus() == valid);
|
ASSERT(date.GetStatus() == valid);
|
return (m_liTime.QuadPart <= date.m_liTime.QuadPart);
|
}
|
|
inline bool COIHighTime::operator>=(const COIHighTime& date) const
|
{
|
ASSERT(GetStatus() == valid);
|
ASSERT(date.GetStatus() == valid);
|
return (m_liTime.QuadPart >= date.m_liTime.QuadPart);
|
}
|
|
inline const COIHighTime& COIHighTime::operator+=(const COIHighTimeSpan dateSpan)
|
{
|
*this = *this + dateSpan;
|
// Convert format time
|
ConvertLongLongToTime( m_liTime, m_tmFormat );
|
|
return *this;
|
}
|
|
inline const COIHighTime& COIHighTime::operator-=(const COIHighTimeSpan dateSpan)
|
{
|
*this = *this - dateSpan;
|
// Convert format time
|
ConvertLongLongToTime( m_liTime, m_tmFormat );
|
|
return *this;
|
}
|
|
|
|
// ******************************
|
// HighTimeSpan class
|
// ******************************
|
inline COIHighTimeSpan::COIHighTimeSpan()
|
{
|
m_liSpan.QuadPart = 0;
|
m_status = valid;
|
}
|
|
inline COIHighTimeSpan::COIHighTimeSpan(const LARGE_INTEGER dateSrcSpan)
|
{
|
*this = dateSrcSpan;
|
}
|
|
inline COIHighTimeSpan::COIHighTimeSpan(const LONGLONG dateSrcSpan)
|
{
|
*this = dateSrcSpan;
|
}
|
|
inline COIHighTimeSpan::COIHighTimeSpan(const COIHighTimeSpan &dateSrcSpan)
|
{
|
*this = dateSrcSpan;
|
}
|
|
inline COIHighTimeSpan::COIHighTimeSpan( long lDays, int nHours, int nMins, int nSecs,
|
int nMilli, int nMicro, int nNano )
|
{
|
SetHighTimeSpan( lDays, nHours, nMins, nSecs,
|
nMilli, nMicro, nNano );
|
}
|
|
inline bool COIHighTimeSpan::IsNegative() const
|
{
|
return (m_liSpan.QuadPart < 0);
|
}
|
|
inline const COIHighTimeSpan& COIHighTimeSpan::operator=(LARGE_INTEGER dateSpanSrc)
|
{
|
m_liSpan = dateSpanSrc;
|
m_status = valid;
|
return *this;
|
}
|
|
inline const COIHighTimeSpan& COIHighTimeSpan::operator=(LONGLONG dateSpanSrc)
|
{
|
m_liSpan.QuadPart = dateSpanSrc;
|
m_status = valid;
|
return *this;
|
}
|
|
inline const COIHighTimeSpan& COIHighTimeSpan::operator=(const COIHighTimeSpan& dateSpanSrc)
|
{
|
m_liSpan = dateSpanSrc.m_liSpan;
|
m_status = dateSpanSrc.m_status;
|
return *this;
|
}
|
|
inline bool COIHighTimeSpan::operator==(const COIHighTimeSpan& dateSpan) const
|
{
|
return (m_status == dateSpan.m_status && m_liSpan.QuadPart == dateSpan.m_liSpan.QuadPart);
|
}
|
|
inline bool COIHighTimeSpan::operator!=(const COIHighTimeSpan& dateSpan) const
|
{
|
return (m_status != dateSpan.m_status || m_liSpan.QuadPart != dateSpan.m_liSpan.QuadPart);
|
}
|
|
inline bool COIHighTimeSpan::operator<(const COIHighTimeSpan& dateSpan) const
|
{
|
ASSERT(GetStatus() == valid);
|
ASSERT(dateSpan.GetStatus() == valid);
|
return m_liSpan.QuadPart < dateSpan.m_liSpan.QuadPart;
|
}
|
|
inline bool COIHighTimeSpan::operator>(const COIHighTimeSpan& dateSpan) const
|
{
|
ASSERT(GetStatus() == valid);
|
ASSERT(dateSpan.GetStatus() == valid);
|
return m_liSpan.QuadPart > dateSpan.m_liSpan.QuadPart;
|
}
|
|
inline bool COIHighTimeSpan::operator<=(const COIHighTimeSpan& dateSpan) const
|
{
|
ASSERT(GetStatus() == valid);
|
ASSERT(dateSpan.GetStatus() == valid);
|
return m_liSpan.QuadPart <= dateSpan.m_liSpan.QuadPart;
|
}
|
|
inline bool COIHighTimeSpan::operator>=(const COIHighTimeSpan& dateSpan) const
|
{
|
ASSERT(GetStatus() == valid);
|
ASSERT(dateSpan.GetStatus() == valid);
|
return m_liSpan.QuadPart >= dateSpan.m_liSpan.QuadPart;
|
}
|
|
inline const COIHighTimeSpan& COIHighTimeSpan::operator+=(const COIHighTimeSpan dateSpan)
|
{
|
*this = *this + dateSpan;
|
return *this;
|
}
|
|
inline const COIHighTimeSpan& COIHighTimeSpan::operator-=(const COIHighTimeSpan dateSpan)
|
{
|
*this = *this - dateSpan;
|
return *this;
|
}
|
|
inline COIHighTimeSpan COIHighTimeSpan::operator-() const
|
{
|
return -this->m_liSpan.QuadPart;
|
}
|
|
} // End of namespace OIComm
|
|
#endif //!defined(_OIHIGHTIME_INL_)
|