#ifndef MSP_TIME_TIMEDELTA_H_
#define MSP_TIME_TIMEDELTA_H_
+#include <cstdlib>
#include <ctime>
+#include <msp/core/mspcore_api.h>
#include <msp/strings/lexicalcast.h>
#include "rawtime.h"
/**
Represents a quantity of time, such as five seconds.
*/
-class TimeDelta
+class MSPCORE_API TimeDelta
{
private:
- RawTime usec;
+ RawTime usec = 0;
public:
/** Constructs a zero TimeDelta. */
- TimeDelta(): usec(0) { }
+ constexpr TimeDelta() = default;
/** Constructs a TimeDelta from a plain number. The purpose of this is to
- allow serialization together with the raw() function. For creating
- TimeDeltas with a specific length, see units.h. */
- explicit TimeDelta(RawTime u): usec(u) { }
+ allow serialization together with the raw() function. */
+ explicit constexpr TimeDelta(RawTime u): usec(u) { }
/** Returns the raw number stored inside the TimeDelta. This should only be used
for serialization and the result should not be interpreted in any way. */
TimeDelta &operator+=(const TimeDelta &t) { usec += t.usec; return *this; }
TimeDelta operator-(const TimeDelta &t) const { return TimeDelta(usec-t.usec); }
TimeDelta &operator-=(const TimeDelta &t) { usec -= t.usec; return *this; }
+ TimeDelta operator-() const { return TimeDelta(-usec); }
template<typename T>
TimeDelta operator*(T a) const { return TimeDelta(RawTime(usec*a)); }
bool operator==(const TimeDelta &t) const { return usec==t.usec; }
bool operator!=(const TimeDelta &t) const { return usec!=t.usec; }
-#ifndef WIN32
- operator timeval() const { return rawtime_to_timeval(usec); }
- operator timespec() const { return rawtime_to_timespec(usec); }
-#endif
-
- operator const void *() const { return usec ? this : 0; }
+ explicit operator bool() const { return usec; }
};
template<typename T>
inline TimeDelta operator*(T a, const TimeDelta &t) { return t*a; }
-void operator<<(LexicalConverter &, const TimeDelta &);
+MSPCORE_API void operator<<(LexicalConverter &, const TimeDelta &);
+
+
+// Constants to be used in creation of TimeDeltas
+constexpr TimeDelta zero(0);
+constexpr TimeDelta usec(1);
+constexpr TimeDelta msec(1000);
+constexpr TimeDelta sec(1000000);
+constexpr TimeDelta min(60*1000000);
+constexpr TimeDelta hour(3600*1000000LL);
+constexpr TimeDelta day(86400*1000000LL);
+constexpr TimeDelta week(7*86400*1000000LL);
+
+inline TimeDelta abs(const TimeDelta &t) { return t>=zero ? t : -t; }
+using std::abs;
} // namespace Time
} // namespace Msp