224 lines
5.2 KiB
C
224 lines
5.2 KiB
C
|
#ifndef _FILETIME_H_
|
||
|
#define _FILETIME_H_
|
||
|
|
||
|
//**************************************************************************
|
||
|
// NOTE: This file is duplicated in urlmon and webcheck. If you make
|
||
|
// changes please sync them!
|
||
|
//**************************************************************************
|
||
|
|
||
|
#define MAKEINT64(lo, hi) ((__int64)(((DWORD)(lo)) | ((__int64)((DWORD)(hi))) << 32))
|
||
|
|
||
|
#ifndef LODWORD
|
||
|
#define LODWORD(i) ((DWORD)(i))
|
||
|
#endif
|
||
|
|
||
|
#ifndef HIDWORD
|
||
|
#define HIDWORD(i) ((DWORD)(((__int64)(i) >> 32) & 0xFFFFFFFF))
|
||
|
#endif
|
||
|
|
||
|
// This is Monday, January 1, 1601 at 12:00:00 am
|
||
|
#define MIN_FILETIME 0i64
|
||
|
|
||
|
// This is Thursday, September 14, 30828 at 2:48:05 am
|
||
|
#define MAX_FILETIME 0x7FFFFFFFFFFFFFFFi64
|
||
|
|
||
|
// For clarity since FILETIME is expressed as 100-nanosecond intervals
|
||
|
#define ONE_SECOND_IN_FILETIME 10000000i64
|
||
|
#define ONE_MSEC_IN_FILEITME 10000i64
|
||
|
#define ONE_MINUTE_IN_FILETIME (ONE_SECOND_IN_FILETIME * 60i64)
|
||
|
|
||
|
struct CFileTime : public FILETIME
|
||
|
{
|
||
|
// Constructors
|
||
|
CFileTime() { *this = 0; }
|
||
|
CFileTime(const FILETIME& f) { *this = f; }
|
||
|
CFileTime(const CFileTime& f) { *this = f; }
|
||
|
CFileTime(__int64 i) { *this = i; }
|
||
|
|
||
|
// Assignment operators
|
||
|
inline CFileTime& operator = (const FILETIME& f)
|
||
|
{
|
||
|
dwLowDateTime = f.dwLowDateTime;
|
||
|
dwHighDateTime = f.dwHighDateTime;
|
||
|
return *this;
|
||
|
}
|
||
|
|
||
|
inline CFileTime& operator = (const CFileTime& f)
|
||
|
{
|
||
|
dwLowDateTime = f.dwLowDateTime;
|
||
|
dwHighDateTime = f.dwHighDateTime;
|
||
|
return *this;
|
||
|
}
|
||
|
|
||
|
inline CFileTime& operator = (__int64 i)
|
||
|
{
|
||
|
dwLowDateTime = LODWORD(i);
|
||
|
dwHighDateTime = HIDWORD(i);
|
||
|
return *this;
|
||
|
}
|
||
|
|
||
|
// Comparison operators
|
||
|
inline BOOL operator == (__int64 i)
|
||
|
{
|
||
|
return MAKEINT64(dwLowDateTime, dwHighDateTime) == i;
|
||
|
}
|
||
|
|
||
|
inline BOOL operator > (__int64 i)
|
||
|
{
|
||
|
return MAKEINT64(dwLowDateTime, dwHighDateTime) > i;
|
||
|
}
|
||
|
|
||
|
inline BOOL operator < (__int64 i)
|
||
|
{
|
||
|
return MAKEINT64(dwLowDateTime, dwHighDateTime) < i;
|
||
|
}
|
||
|
|
||
|
inline BOOL operator != (__int64 i)
|
||
|
{
|
||
|
return !(*this == i);
|
||
|
}
|
||
|
|
||
|
inline BOOL operator >= (__int64 i)
|
||
|
{
|
||
|
return !(*this < i);
|
||
|
}
|
||
|
|
||
|
inline BOOL operator <= (__int64 i)
|
||
|
{
|
||
|
return !(*this > i);
|
||
|
}
|
||
|
|
||
|
inline BOOL operator == (const FILETIME& f)
|
||
|
{
|
||
|
return *this == MAKEINT64(f.dwLowDateTime, f.dwHighDateTime);
|
||
|
}
|
||
|
|
||
|
inline BOOL operator > (const FILETIME& f)
|
||
|
{
|
||
|
return *this > MAKEINT64(f.dwLowDateTime, f.dwHighDateTime);
|
||
|
}
|
||
|
|
||
|
inline BOOL operator < (const FILETIME& f)
|
||
|
{
|
||
|
return *this < MAKEINT64(f.dwLowDateTime, f.dwHighDateTime);
|
||
|
}
|
||
|
|
||
|
inline BOOL operator != (const FILETIME& f)
|
||
|
{
|
||
|
return !(*this == f);
|
||
|
}
|
||
|
|
||
|
inline BOOL operator >= (const FILETIME& f)
|
||
|
{
|
||
|
return !(*this < f);
|
||
|
}
|
||
|
|
||
|
inline BOOL operator <= (const FILETIME& f)
|
||
|
{
|
||
|
return !(*this > f);
|
||
|
}
|
||
|
|
||
|
// Arithemetic operators
|
||
|
inline CFileTime operator + (__int64 i)
|
||
|
{
|
||
|
return CFileTime(MAKEINT64(dwLowDateTime, dwHighDateTime) + i);
|
||
|
}
|
||
|
|
||
|
inline CFileTime operator += (__int64 i)
|
||
|
{
|
||
|
*this = *this + i;
|
||
|
return *this;
|
||
|
}
|
||
|
|
||
|
inline CFileTime operator - (__int64 i)
|
||
|
{
|
||
|
return CFileTime(MAKEINT64(dwLowDateTime, dwHighDateTime) - i);
|
||
|
}
|
||
|
|
||
|
inline CFileTime operator -= (__int64 i)
|
||
|
{
|
||
|
*this = *this - i;
|
||
|
return *this;
|
||
|
}
|
||
|
|
||
|
inline CFileTime operator * (__int64 i)
|
||
|
{
|
||
|
return CFileTime(MAKEINT64(dwLowDateTime, dwHighDateTime) * i);
|
||
|
}
|
||
|
|
||
|
inline CFileTime operator *= (__int64 i)
|
||
|
{
|
||
|
*this = *this * i;
|
||
|
return *this;
|
||
|
}
|
||
|
|
||
|
inline CFileTime operator / (__int64 i)
|
||
|
{
|
||
|
return CFileTime(MAKEINT64(dwLowDateTime, dwHighDateTime) / i);
|
||
|
}
|
||
|
|
||
|
inline CFileTime operator /= (__int64 i)
|
||
|
{
|
||
|
*this = *this / i;
|
||
|
return *this;
|
||
|
}
|
||
|
|
||
|
inline CFileTime operator + (const FILETIME& f)
|
||
|
{
|
||
|
return *this + MAKEINT64(f.dwLowDateTime, f.dwHighDateTime);
|
||
|
}
|
||
|
|
||
|
inline CFileTime operator += (const FILETIME& f)
|
||
|
{
|
||
|
*this = *this + f;
|
||
|
return *this;
|
||
|
}
|
||
|
|
||
|
inline CFileTime operator - (const FILETIME& f)
|
||
|
{
|
||
|
return *this - MAKEINT64(f.dwLowDateTime, f.dwHighDateTime);
|
||
|
}
|
||
|
|
||
|
inline CFileTime operator -= (const FILETIME& f)
|
||
|
{
|
||
|
*this = *this - f;
|
||
|
return *this;
|
||
|
}
|
||
|
|
||
|
inline CFileTime operator * (const FILETIME& f)
|
||
|
{
|
||
|
return *this * MAKEINT64(f.dwLowDateTime, f.dwHighDateTime);
|
||
|
}
|
||
|
|
||
|
inline CFileTime operator *= (const FILETIME& f)
|
||
|
{
|
||
|
*this = *this * f;
|
||
|
return *this;
|
||
|
}
|
||
|
|
||
|
inline CFileTime operator / (const FILETIME& f)
|
||
|
{
|
||
|
return *this / MAKEINT64(f.dwLowDateTime, f.dwHighDateTime);
|
||
|
}
|
||
|
|
||
|
inline CFileTime operator /= (const FILETIME& f)
|
||
|
{
|
||
|
*this = *this / f;
|
||
|
return *this;
|
||
|
}
|
||
|
};
|
||
|
|
||
|
//
|
||
|
// Conversions
|
||
|
// NOTE: We can't do want operator __int64() since what causes to many
|
||
|
// ambiguous situations that the compiler just can't handle.
|
||
|
//
|
||
|
inline __int64 FileTimeToInt64(const FILETIME& f)
|
||
|
{
|
||
|
return MAKEINT64(f.dwLowDateTime, f.dwHighDateTime);
|
||
|
}
|
||
|
|
||
|
|
||
|
#endif
|
||
|
|