// timeutil.cpp -- CLinearTimeAbsolute, and CLinearTimeDelta modules
//
// $Id: timeutil.h,v 1.3 2000/05/05 19:40:33 sdennis Exp $
//
// Date/Time code based on algorithms presented in "Calendrical Calculations",
// Cambridge Press, 1998.
//
// do_convtime() is heavily modified from previous game server code.
//
// MUX 2.0
// Copyright (C) 1998 through 2000 Solid Vertical Domains, Ltd. All
// rights not explicitly given are reserved. Permission is given to
// use this code for building and hosting text-based game servers.
// Permission is given to use this code for other non-commercial
// purposes. To use this code for commercial purposes other than
// building/hosting text-based game servers, contact the author at
// Stephen Dennis <sdennis@svdltd.com> for another license.
//
#ifndef TIMEUTIL_H
#define TIMEUTIL_H
typedef struct
{
short iYear; // 1900 would be stored as 1900.
unsigned short iMonth; // January is 1. December is 12.
unsigned short iDayOfWeek; // 0 is Sunday, 1 is Monday, etc.
unsigned short iDayOfMonth; // Day of Month, 1..31
unsigned short iDayOfYear; // January 1st is 1, etc.
unsigned short iHour;
unsigned short iMinute;
unsigned short iSecond;
unsigned short iMillisecond; // Milliseconds less than a second.
unsigned short iMicrosecond; // Microseconds less than a Millisecond.
unsigned short iNanosecond; // Nanoseconds less than a Microsecond.
} FIELDEDTIME;
class CLinearTimeAbsolute
{
friend class CLinearTimeDelta;
friend int operator<(const CLinearTimeAbsolute& lta, const CLinearTimeAbsolute& ltb);
friend int operator>(const CLinearTimeAbsolute& lta, const CLinearTimeAbsolute& ltb);
friend int operator==(const CLinearTimeAbsolute& lta, const CLinearTimeAbsolute& ltb);
friend int operator<=(const CLinearTimeAbsolute& lta, const CLinearTimeAbsolute& ltb);
friend CLinearTimeAbsolute operator+(const CLinearTimeAbsolute& lta, const CLinearTimeDelta& ltd);
friend CLinearTimeAbsolute operator-(const CLinearTimeAbsolute& lta, const CLinearTimeDelta& ltd);
friend CLinearTimeDelta operator-(const CLinearTimeAbsolute& lta, const CLinearTimeAbsolute& ltb);
private:
INT64 m_tAbsolute;
static int m_nCount;
static char m_Buffer[204];
public:
//CLinearTimeAbsolute(int tInitial);
CLinearTimeAbsolute(void);
CLinearTimeAbsolute(const CLinearTimeAbsolute& ltaOrigin, const CLinearTimeDelta& ltdOffset);
CLinearTimeAbsolute(const CLinearTimeAbsolute& lta);
void operator=(const CLinearTimeAbsolute& lta);
void operator+=(const CLinearTimeDelta& ltdOffset);
void operator-=(const CLinearTimeDelta& ltdOffset);
void GetUTC(void);
void GetLocal(void);
void ReturnUniqueString(char *buffer);
char *ReturnDateString(void);
BOOL ReturnFields(FIELDEDTIME *arg_tStruct);
INT64 ReturnSeconds(void);
char *ReturnSecondsString(void);
INT64 Return100ns(void);
void SetSeconds(INT64 arg_tSeconds);
void SetSecondsString(char *arg_szSeconds);
BOOL SetFields(FIELDEDTIME *arg_tStruct);
BOOL SetString(const char *arg_tBuffer);
void Set100ns(INT64 arg_t100ns);
void UTC2Local(void);
void Local2UTC(void);
};
BOOL FieldedTimeToLinearTime(FIELDEDTIME *ft, INT64 *plt);
BOOL LinearTimeToFieldedTime(INT64 lt, FIELDEDTIME *ft);
class CLinearTimeDelta
{
friend class CLinearTimeAbsolute;
friend int operator<(const CLinearTimeDelta& lta, const CLinearTimeDelta& ltb);
friend int operator>(const CLinearTimeDelta& lta, const CLinearTimeDelta& ltb);
friend int operator==(const CLinearTimeDelta& lta, const CLinearTimeDelta& ltb);
friend int operator!=(const CLinearTimeDelta& lta, const CLinearTimeDelta& ltb);
friend CLinearTimeDelta operator-(const CLinearTimeAbsolute& lta, const CLinearTimeAbsolute& ltb);
friend CLinearTimeDelta operator-(const CLinearTimeDelta& lta, const CLinearTimeDelta& ltb);
friend int operator/(const CLinearTimeDelta& ltdA, const CLinearTimeDelta& ltdB);
friend CLinearTimeDelta operator*(const CLinearTimeDelta& ltdA, int nScaler);
friend CLinearTimeAbsolute operator+(const CLinearTimeAbsolute& ltdA, const CLinearTimeDelta& ltdB);
friend CLinearTimeAbsolute operator-(const CLinearTimeAbsolute& lta, const CLinearTimeDelta& ltd);
private:
INT64 m_tDelta;
public:
CLinearTimeDelta(void);
CLinearTimeDelta(CLinearTimeAbsolute, CLinearTimeAbsolute);
void ReturnTimeValueStruct(struct timeval *tv);
long ReturnMilliseconds(void);
long ReturnDays(void);
long ReturnSeconds(void);
INT64 Return100ns(void);
void SetTimeValueStruct(struct timeval *tv);
void SetMilliseconds(unsigned long arg_dwMilliseconds);
void SetSeconds(INT64 arg_tSeconds);
void Set100ns(INT64 arg_t100ns);
void operator+=(const CLinearTimeDelta& ltd);
};
#define FACTOR_NANOSECONDS_PER_100NS 100
#define FACTOR_100NS_PER_MICROSECOND 10
#define FACTOR_100NS_PER_MILLISECOND 10000
#ifdef WIN32
#define FACTOR_100NS_PER_SECOND 10000000i64
#define EPOCH_OFFSET 116444736000000000i64
#else // WIN32
#define FACTOR_100NS_PER_SECOND 10000000ULL
#define EPOCH_OFFSET 116444736000000000ull
#endif // WIN32
extern const INT64 FACTOR_100NS_PER_MINUTE;
extern const INT64 FACTOR_100NS_PER_HOUR;
extern const INT64 FACTOR_100NS_PER_DAY;
extern const INT64 FACTOR_100NS_PER_WEEK;
void TIME_Initialize(void);
#endif // TIMEUTIL_H