+#include <sys/time.h>
+
+#include <algorithm>
+
+#include "timeutil.h"
+
+using namespace std;
+
+double tdiff(const timeval& a, const timeval& b)
+{
+ return b.tv_sec - a.tv_sec +
+ 1e-6 * (b.tv_usec - a.tv_usec);
+}
+
+bool less_than(const timeval &a, const timeval &b)
+{
+ return make_pair(a.tv_sec, a.tv_usec) < make_pair(b.tv_sec, b.tv_usec);
+}
+
+timeval subtract_timeval_saturate(const timeval &a, const timeval &b)
+{
+ timeval ret;
+ if (less_than(a, b)) {
+ ret.tv_sec = ret.tv_usec = 0;
+ return ret;
+ }
+ ret.tv_sec = b.tv_sec - a.tv_sec;
+ ret.tv_usec = b.tv_usec - a.tv_usec;
+ if (ret.tv_usec < 0) {
+ ret.tv_usec += 1000000;
+ --ret.tv_sec;
+ }
+ return ret;
+}
+
+timeval offset_timeval_seconds(const timeval &a, double s)
+{
+ int usec_to_add = lrint(1e6 * s);
+ int sec_to_add = usec_to_add / 1000000;
+ usec_to_add %= 1000000;
+
+ timeval ret = a;
+ ret.tv_usec += usec_to_add;
+ ret.tv_sec += sec_to_add;
+ ret.tv_sec += ret.tv_usec / 1000000;
+ ret.tv_usec %= 1000000;
+ return ret;
+}