]> git.tdb.fi Git - libs/core.git/blobdiff - source/time/timedelta.h
Add move semantics to Variant
[libs/core.git] / source / time / timedelta.h
index 9be491ecbc762bf02046628274d0e6bb91ba445d..2ff4bdd9d4b18a2c5f1c19980c105c87bc75149f 100644 (file)
@@ -1,7 +1,9 @@
 #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"
 
@@ -11,19 +13,18 @@ namespace Time {
 /**
 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. */
@@ -33,6 +34,7 @@ public:
        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)); }
@@ -53,24 +55,27 @@ public:
        bool operator==(const TimeDelta &t) const { return usec==t.usec; }
        bool operator!=(const TimeDelta &t) const { return usec!=t.usec; }
 
-       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
-extern const TimeDelta zero;
-extern const TimeDelta usec;
-extern const TimeDelta msec;
-extern const TimeDelta sec;
-extern const TimeDelta min;
-extern const TimeDelta hour;
-extern const TimeDelta day;
-extern const TimeDelta week;
+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