// 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