/* * © Copyright 2014 – Urheberrechtshinweis * Alle Rechte vorbehalten / All Rights Reserved * * Programmcode ist urheberrechtlich geschuetzt. * Das Urheberrecht liegt, soweit nicht ausdruecklich anders gekennzeichnet, bei Frank Ebner. * Keine Verwendung ohne explizite Genehmigung. * (vgl. § 106 ff UrhG / § 97 UrhG) */ #ifndef TIMESTAMP_H #define TIMESTAMP_H #include /** * helper-class to handle timestamps */ struct Timestamp { private: /** internal timestamp in milliseconds */ //int64_t _ms; int64_t _us; /** hidden ctor. for internal methods only */ Timestamp(int64_t us) : _us(us) {;} public: /** empty ctor */ explicit Timestamp() : _us(0) {;} /** get timestamp from the given value which represents microseconds */ static inline Timestamp fromUS(const int64_t us) { Timestamp ts; ts._us = us; return ts; } /** get timestamp from the given value which represents milliesconds */ static inline Timestamp fromMS(const int64_t ms) { Timestamp ts; ts._us = ms * 1000; return ts; } /** get timestamp from the given value which represents seconds */ static inline Timestamp fromSec(const float sec) { Timestamp ts; ts._us = static_cast(sec * 1000 * 1000); return ts; } /** get timestamp from the given value which represents a sample rate in hz */ static inline Timestamp fromHz(const float hz) { const float sec = 1.0f / hz; return Timestamp::fromSec(sec); } /** get timestamp for the current unix-time */ static inline Timestamp fromUnixTime() { auto now = std::chrono::system_clock::now(); auto duration = now.time_since_epoch(); //auto millis = std::chrono::duration_cast(duration).count(); auto micros = std::chrono::duration_cast(duration).count(); return Timestamp::fromUS(micros); } /** get timestamp for the current system-time */ static inline Timestamp fromRunningTime() { static Timestamp startup = fromUnixTime(); return fromUnixTime() - startup; } public: /** get finest available value */ inline int64_t finest() const {return _us;} /** get timestamp in microseconds */ inline int64_t us() const {return _us;} /** get timestamp in milliseconds */ inline int64_t ms() const {return _us/1000;} /** get timestamp in seconds */ inline float sec() const {return _us/1000.0f/1000.0f;} public: /** is this timestamp zero? */ bool isZero() const {return _us == 0;} /** equal? */ bool operator == (const Timestamp& o) const {return _us == o._us;} /** not equal? */ bool operator != (const Timestamp& o) const {return _us != o._us;} /** smaller than the given one? */ bool operator < (const Timestamp& o) const {return _us < o._us;} bool operator <= (const Timestamp& o) const {return _us <= o._us;} /** greater than the given one? */ bool operator > (const Timestamp& o) const {return _us > o._us;} bool operator >= (const Timestamp& o) const {return _us >= o._us;} Timestamp operator - (const Timestamp& o) const {return Timestamp(_us - o._us);} Timestamp& operator -= (const Timestamp& o) {_us += o._us; return *this;} Timestamp operator + (const Timestamp& o) const {return Timestamp(_us + o._us);} Timestamp& operator += (const Timestamp& o) {_us += o._us; return *this;} template Timestamp operator * (const T val) const {return Timestamp(_us * val);} template Timestamp operator / (const T val) const {return Timestamp(_us / val);} // /** cast to float */ // operator float () const {return sec();} }; namespace std { template<> class numeric_limits { public: static Timestamp min() { const int64_t minVal = std::numeric_limits::min(); return Timestamp::fromMS(minVal); } static Timestamp lowest() { const int64_t minVal = std::numeric_limits::min(); return Timestamp::fromMS(minVal); } static Timestamp max() { const int64_t maxVal = std::numeric_limits::max(); return Timestamp::fromMS(maxVal); } }; } #endif // TIMESTAMP_H