// Common
// Copyright 2001 Alexander Liss
// Declaration of a class
// AUniTime
#ifndef __UNITIME_H__
#define __UNITIME_H__
#include <sys/time.h>
#include <time.h>
class AUniTime
{
friend int compare(const AUniTime&,const AUniTime&);
friend int sub(AUniTime& r,const AUniTime& a,const AUniTime& b);
public:
AUniTime():seconds(0),nanoseconds(0){}
bool is_zero(){return seconds == 0 && nanoseconds == 0; }
// sys/time.h, gettimeofday - clock_gettime
int set_current();
int set_current_plus(unsigned milliseconds);
AUniTime& operator += (const AUniTime&);
int put_seconds(unsigned time)
{ seconds = time; nanoseconds = 0; return 0;}
int get_seconds(unsigned& time)const
{ time = (unsigned)seconds; return 0;}
int put_milliseconds(unsigned time)
{ seconds = time/1000; nanoseconds= (time - (seconds*1000))*1000; return 0;}
int get_milliseconds(unsigned& time)const
{ time=(unsigned)(seconds*1000+nanoseconds/1000); return 0;}
// time.h
int put_time_t(time_t time){seconds=time;return 0;}
int get_time_t(time_t& time)const{time=seconds;return 0;}
int put_timeval(const timeval& time)
{ seconds = time.tv_sec; nanoseconds = time.tv_usec*1000; return 0;}
int get_timeval(timeval& time)const
{ time.tv_sec = seconds; time.tv_usec = nanoseconds/1000; return 0;}
//
int put_timespec(const timespec& time)
{ seconds = time.tv_sec; nanoseconds = time.tv_nsec; return 0;}
int get_timespec(timespec& time)const
{ time.tv_sec = seconds; time.tv_nsec = nanoseconds; return 0;}
// ctime (3C) - localtime
int get_local_tm(tm& time)const;
bool in_past()const; // <= current moment
bool in_future()const{return !in_past();}
int left(unsigned& milliseconds)const; // returns error if no time left
private:
unsigned long seconds;
unsigned long nanoseconds;
};
inline
AUniTime& operator + (const AUniTime& a,const AUniTime& b)
{ AUniTime r(a); return r+=b; }
int compare(const AUniTime&,const AUniTime&);
// r = a - b, if a >= b
int sub(AUniTime& r,const AUniTime& a,const AUniTime& b);
#endif