//
// @(#)Real Time Threads 0.5			prasad@watson.ibm.com:aug97
// ----------------------------------------------------------------------------

const MaxUsecs = 999999;

class Utime {
	time_t	s;
	int	us;

public:

	static Utime Zero ();
	static Utime Now ();
	static Utime Never ();

	Utime ()			{ s = 0; us = 0; }
	Utime (time_t t)		{ s = t; us = 0; }
	Utime (time_t t, int tu)	{ s = t; us = tu; }


	time_t Secs () const		{ return s; }
	int Usecs () const		{ return us; }

	void sleep () const;
	void alarm () const;

	int operator ! () const
		{ return ! s && ! us; }

	int operator == (const Utime& t) const
		{ return s == t.s && us == t.us; }

	int operator != (const Utime& t) const
		{ return s != t.s || us != t.us; }

	int operator <  (const Utime& t) const
		{ return s <  t.s || (s == t.s && us <  t.us); }

	int operator <= (const Utime& t) const
		{ return s <= t.s || (s == t.s && us <= t.us); }

	int operator >  (const Utime& t) const
		{ return ! (*this <= t); }

	int operator >= (const Utime& t) const
		{ return ! (*this <  t); }

	Utime& operator += (const Utime& t) throw ();
	Utime& operator -= (const Utime& t) throw ();
	Utime& operator *= (float&) throw ();

	Utime operator + (const Utime& t) const throw ();
	Utime operator - (const Utime& t) const throw ();

friend Utime operator * (float, const Utime&);
friend ostream& operator << (ostream&, const Utime&);
	};

Utime operator * (float, const Utime&);

ostream& operator << (ostream& os, const Utime& t) {
	os << t.s << '.' << t.us;
	return os;
	}

// ----------------------------------------------------------------------------