#ifndef ROOT_TTimeStamp
#define ROOT_TTimeStamp
#ifndef ROOT_Rtypes
#include "Rtypes.h"
#endif
#ifndef ROOT_Riosfwd
#include "Riosfwd.h"
#endif
#include <ctime>
typedef struct timespec timespec_t;
typedef struct tm tm_t;
class TVirtualMutex;
class TTimeStamp;
std::ostream &operator<<(std::ostream &os, const TTimeStamp &ts);
TBuffer &operator<<(TBuffer &buf, const TTimeStamp &ts);
TBuffer &operator>>(TBuffer &buf, TTimeStamp &ts);
Bool_t operator==(const TTimeStamp &lhs, const TTimeStamp &rhs);
Bool_t operator!=(const TTimeStamp &lhs, const TTimeStamp &rhs);
Bool_t operator< (const TTimeStamp &lhs, const TTimeStamp &rhs);
Bool_t operator<=(const TTimeStamp &lhs, const TTimeStamp &rhs);
Bool_t operator> (const TTimeStamp &lhs, const TTimeStamp &rhs);
Bool_t operator>=(const TTimeStamp &lhs, const TTimeStamp &rhs);
R__EXTERN TVirtualMutex *gTimeMutex;
class TTimeStamp {
friend Bool_t operator==(const TTimeStamp &lhs, const TTimeStamp &rhs);
friend Bool_t operator!=(const TTimeStamp &lhs, const TTimeStamp &rhs);
friend Bool_t operator< (const TTimeStamp &lhs, const TTimeStamp &rhs);
friend Bool_t operator<=(const TTimeStamp &lhs, const TTimeStamp &rhs);
friend Bool_t operator> (const TTimeStamp &lhs, const TTimeStamp &rhs);
friend Bool_t operator>=(const TTimeStamp &lhs, const TTimeStamp &rhs);
private:
Int_t fSec;
Int_t fNanoSec;
void NormalizeNanoSec();
public:
TTimeStamp();
TTimeStamp(const timespec_t &ts) :
fSec(Int_t(ts.tv_sec)), fNanoSec(ts.tv_nsec) { NormalizeNanoSec(); }
TTimeStamp(time_t t, Int_t nsec) :
fSec(Int_t(t)), fNanoSec(nsec) { NormalizeNanoSec(); }
TTimeStamp(UInt_t year, UInt_t month,
UInt_t day, UInt_t hour,
UInt_t min, UInt_t sec,
UInt_t nsec = 0, Bool_t isUTC = kTRUE, Int_t secOffset = 0);
TTimeStamp(UInt_t date, UInt_t time, UInt_t nsec,
Bool_t isUTC = kTRUE, Int_t secOffset = 0);
TTimeStamp(UInt_t tloc, Bool_t isUTC = kTRUE, Int_t secOffset = 0,
Bool_t dosDate = kFALSE);
virtual ~TTimeStamp() { }
void Set();
void Set(Int_t year, Int_t month, Int_t day,
Int_t hour, Int_t min, Int_t sec,
Int_t nsec, Bool_t isUTC, Int_t secOffset);
void Set(Int_t date, Int_t time, Int_t nsec,
Bool_t isUTC, Int_t secOffset);
void Set(UInt_t tloc, Bool_t isUTC, Int_t secOffset, Bool_t dosDate);
void SetSec(Int_t sec) { fSec = sec; }
void SetNanoSec(Int_t nsec) { fNanoSec = nsec; }
timespec_t GetTimeSpec() const
{ timespec_t value = {fSec,fNanoSec}; return value; }
time_t GetSec() const { return fSec; }
Int_t GetNanoSec() const { return fNanoSec; }
Double_t AsDouble() const { return fSec + 1e-9 * fNanoSec; }
Double_t AsJulianDate() const { return (AsDouble()/86400.0 + 2440587.5); }
const char *AsString(const Option_t *option="") const;
void Copy(TTimeStamp &ts) const;
UInt_t GetDate(Bool_t inUTC = kTRUE, Int_t secOffset = 0,
UInt_t *year = 0, UInt_t *month = 0,
UInt_t *day = 0) const;
UInt_t GetTime(Bool_t inUTC = kTRUE, Int_t secOffset = 0,
UInt_t *hour = 0, UInt_t *min = 0,
UInt_t *sec = 0) const;
Int_t GetDayOfYear(Bool_t inUTC = kTRUE, Int_t secOffset = 0) const;
Int_t GetDayOfWeek(Bool_t inUTC = kTRUE, Int_t secOffset = 0) const;
Int_t GetMonth(Bool_t inUTC = kTRUE, Int_t secOffset = 0) const;
Int_t GetWeek(Bool_t inUTC = kTRUE, Int_t secOffset = 0) const;
Bool_t IsLeapYear(Bool_t inUTC = kTRUE, Int_t secOffset = 0) const;
void Add(const TTimeStamp &offset);
void Print(const Option_t *option="") const;
operator double() const { return AsDouble(); }
static Int_t GetZoneOffset();
static time_t MktimeFromUTC(tm_t *tmstruct);
static void DumpTMStruct(const tm_t &tmstruct);
static Int_t GetDayOfYear(Int_t day, Int_t month, Int_t year);
static Int_t GetDayOfWeek(Int_t day, Int_t month, Int_t year);
static Int_t GetWeek(Int_t day, Int_t month, Int_t year);
static Bool_t IsLeapYear(Int_t year);
ClassDef(TTimeStamp,1)
};
inline Bool_t operator==(const TTimeStamp &lhs, const TTimeStamp &rhs)
{ return lhs.fSec == rhs.fSec &&
lhs.fNanoSec == rhs.fNanoSec; }
inline Bool_t operator!=(const TTimeStamp &lhs, const TTimeStamp &rhs)
{ return lhs.fSec != rhs.fSec ||
lhs.fNanoSec != rhs.fNanoSec; }
inline Bool_t operator<(const TTimeStamp &lhs, const TTimeStamp &rhs)
{ return lhs.fSec < rhs.fSec ||
(lhs.fSec == rhs.fSec &&
lhs.fNanoSec < rhs.fNanoSec); }
inline Bool_t operator<=(const TTimeStamp &lhs, const TTimeStamp &rhs)
{ return lhs.fSec < rhs.fSec ||
(lhs.fSec == rhs.fSec &&
lhs.fNanoSec <= rhs.fNanoSec); }
inline Bool_t operator>(const TTimeStamp &lhs, const TTimeStamp &rhs)
{ return lhs.fSec > rhs.fSec ||
(lhs.fSec == rhs.fSec &&
lhs.fNanoSec > rhs.fNanoSec); }
inline Bool_t operator>=(const TTimeStamp &lhs, const TTimeStamp &rhs)
{ return lhs.fSec > rhs.fSec ||
(lhs.fSec == rhs.fSec &&
lhs.fNanoSec >= rhs.fNanoSec); }
#endif