#########################################################################
#
# Script: timerep.py
#
# Author: Igor Volobouev, Feb 2005
#
# Purpose: contains classes relevant to timekeeping
#
#########################################################################

class Time:
    """Representation of time using integer seconds and nanoseconds.

Addition and subtraction have a fixed 1 nsec precision. Multiplication and
division are done via conversion to doubles, so some loss of precision is
possible for large time values."""
    def __init__(self, *args):
        arglen = len(args)
        if (arglen == 1):
            self.sec = int(args[0])
            self.nsec = int((args[0] - self.sec)*1.0e9)
        elif (arglen == 2):
            self.sec = args[0]
            self.nsec = args[1]
        else:
            raise SyntaxError, "wrong # of args"
        while (self.nsec >= 1e9):
            self.sec += 1
            self.nsec -= 1e9
        while (self.nsec < 0):
            self.sec -= 1
            self.nsec += 1e9
    def __repr__(self):
        return str(self.sec) + ' ' + str(self.nsec)
    def __cmp__(self, other):
        if (self.sec < other.sec):
            return -1
        elif (self.sec > other.sec):
            return 1
        elif (self.nsec < other.nsec):
            return -1
        elif (self.nsec > other.nsec):
            return 1
        else:
            return 0
    def __abs__(self):
        if (self.sec < 0):
            return -self
        else:
            return +self
    def __add__(self, other):
        return Time(self.sec+other.sec, self.nsec+other.nsec)
    def __sub__(self, other):
        return Time(self.sec-other.sec, self.nsec-other.nsec)
    def __mul__(self, other):
        return Time(self.dtime() * other)
    def __div__(self, other):
        return Time(self.dtime() / other)
    def __neg__(self):
        return Time(-self.sec, -self.nsec)
    def __pos__(self):
        return Time(self.sec, self.nsec)
    def dtime(self):
        "Time as a double."
        return self.sec + 1.0e-9*self.nsec
