This repository has been archived on 2020-04-08. You can view files and clone it, but cannot push or open issues or pull requests.
Files
Indoor/data/Timestamp.h
2018-10-25 11:50:12 +02:00

151 lines
4.0 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* © 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 <chrono>
/**
* 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<int64_t>(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<std::chrono::milliseconds>(duration).count();
auto micros = std::chrono::duration_cast<std::chrono::microseconds>(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 <typename T> Timestamp operator * (const T val) const {return Timestamp(_us * val);}
template <typename T> Timestamp operator / (const T val) const {return Timestamp(_us / val);}
// /** cast to float */
// operator float () const {return sec();}
};
namespace std {
template<> class numeric_limits<Timestamp> {
public:
static Timestamp min() {
const int64_t minVal = std::numeric_limits<int64_t>::min();
return Timestamp::fromMS(minVal);
}
static Timestamp lowest() {
const int64_t minVal = std::numeric_limits<int64_t>::min();
return Timestamp::fromMS(minVal);
}
static Timestamp max() {
const int64_t maxVal = std::numeric_limits<int64_t>::max();
return Timestamp::fromMS(maxVal);
}
};
}
#endif // TIMESTAMP_H