// NOTE: in order to compile this system on Linux (and most Unix
// systems) you will have to include the -lrt flag to your compiler.

#include <sstream>
#include <math.h>
#include <cstring>

#include "timer.h"

timer::timer(timer & t) : running(t.running) {
    memcpy(&startVar, &(t.startVar), sizeof (timeval));
    memcpy(&stopVar,  &(t.stopVar),  sizeof (timeval));
}

int timer::start() {
    if (!running) {
        running = true;
        gettimeofday(&startVar,NULL);
        return 0;
    }
    return 1;
}

int timer::stop() {
    if (running) {
        running = 0;
        gettimeofday(&stopVar,NULL);
        return 0;
    }
    return 1;
}

ostream & timer::print(ostream & out) {
    return (out << toString());
}

double timer::getTime() {
    time_t sec = stopVar.tv_sec - startVar.tv_sec;
    long usec = stopVar.tv_usec - startVar.tv_usec;
    return sec + usec/1000000.0;
}

string timer::toString() {
    ostringstream out;
    if (running)
        out << "Timer still running\n";
    else {
        time_t sec = stopVar.tv_sec - startVar.tv_sec;
        long usec = stopVar.tv_usec - startVar.tv_usec;
        if ( usec < 0 ) {
            sec--;
            usec += 1000000;
        }
        out << sec << "."
            << ((usec<100000)?"0":"")
            << ((usec<10000)?"0":"")
            << ((usec<1000)?"0":"")
            << ((usec<100)?"0":"")
            << ((usec<10)?"0":"")
            << usec;
    }
    return out.str();
}

ostream & operator<<(ostream &out, timer &t) {
    return t.print(out);
}