diff --git a/include/core/common/time_stamp.h b/include/core/common/time_stamp.h index 5cf7d1d48b0ae036decf7f33a05e0fb1359738b3..7e17ac4f9e1b44337923c8f19230b11fe2f76ea3 100644 --- a/include/core/common/time_stamp.h +++ b/include/core/common/time_stamp.h @@ -23,6 +23,7 @@ class TimeStamp { protected: unsigned long int time_stamp_nano_; ///< Time stamp. Expressed in nanoseconds from 1th jan 1970. + bool is_valid_; // time stamp has a valid value public: /** \brief Constructor @@ -60,6 +61,16 @@ class TimeStamp */ ~TimeStamp(); + /** \brief Value of time stamp is valid + * + */ + static TimeStamp Invalid ( ); + bool ok ( ) const; + void setOk ( ); + void setNOk ( ); + + static TimeStamp Now(); + /** \brief Time stamp to now */ void setToNow(); @@ -174,19 +185,42 @@ class TimeStamp }; +inline wolf::TimeStamp TimeStamp::Invalid ( ) +{ + return TimeStamp(-1.0); +} + +inline bool TimeStamp::ok ( ) const +{ + return is_valid_; +} + +inline void TimeStamp::setOk ( ) +{ + is_valid_ = true; +} + +inline void TimeStamp::setNOk ( ) +{ + is_valid_ = false; +} + inline void TimeStamp::set(const double& ts) { - time_stamp_nano_ = (ts > 0 ? (unsigned long int)(ts*NANOSECS) : 0); + time_stamp_nano_ = (ts >= 0 ? (unsigned long int)(ts*NANOSECS) : 0); + is_valid_ = (ts >= 0); } inline void TimeStamp::set(const unsigned long int& sec, const unsigned long int& nanosec) { time_stamp_nano_ = sec*NANOSECS+nanosec; + is_valid_ = true; } inline void TimeStamp::set(const timeval& ts) { time_stamp_nano_ = (unsigned long int)(ts.tv_sec*NANOSECS) + (unsigned long int)(ts.tv_usec*1000); + is_valid_ = (ts.tv_sec >= 0 and ts.tv_usec >= 0); } inline double TimeStamp::get() const @@ -207,11 +241,13 @@ inline unsigned long int TimeStamp::getNanoSeconds() const inline void TimeStamp::operator =(const TimeStamp& ts) { time_stamp_nano_ = ts.time_stamp_nano_; + is_valid_ = ts.is_valid_; } inline void TimeStamp::operator =(const double& ts) { time_stamp_nano_ = (unsigned long int)(ts*NANOSECS); + is_valid_ = (ts >= 0); } inline bool TimeStamp::operator ==(const TimeStamp& ts) const @@ -254,7 +290,7 @@ inline double TimeStamp::operator -(const TimeStamp& ts) const return double((long int)(time_stamp_nano_ - ts.time_stamp_nano_))*1e-9; // long int cast fix overflow in case of negative substraction result } -static const TimeStamp InvalidStamp(-1,-1); +//static const TimeStamp TimeStampInvalid() {return TimeStamp(-1.0);} } // namespace wolf diff --git a/src/common/time_stamp.cpp b/src/common/time_stamp.cpp index 528d0ad54872bc077ba74d72be0cb2cb79099d13..595023484187d36e0bb5c8a6e361beda1ff2f089 100644 --- a/src/common/time_stamp.cpp +++ b/src/common/time_stamp.cpp @@ -3,8 +3,17 @@ namespace wolf { +TimeStamp TimeStamp::Now ( ) +{ + TimeStamp t(0); + t.setToNow(); + return t; +} + std::ostream& operator<<(std::ostream& os, const TimeStamp& _ts) { + if (!_ts.ok()) + os << "TimeStamp is invalid! "; os << _ts.getSeconds() << "." << std::setfill('0') << std::setw(9) << std::right <<_ts.getNanoSeconds(); // write obj to stream os << std::setfill(' '); return os; @@ -13,24 +22,29 @@ std::ostream& operator<<(std::ostream& os, const TimeStamp& _ts) TimeStamp::TimeStamp() : //time_stamp_(0) time_stamp_nano_(0) + , + is_valid_(false) { - setToNow(); +// setToNow(); } TimeStamp::TimeStamp(const TimeStamp& _ts) : - time_stamp_nano_(_ts.time_stamp_nano_) + time_stamp_nano_(_ts.time_stamp_nano_), + is_valid_(_ts.is_valid_) { // } TimeStamp::TimeStamp(const double& _ts) : - time_stamp_nano_(_ts > 0 ? (unsigned long int)(_ts*1e9) : 0) + time_stamp_nano_(_ts > 0 ? (unsigned long int)(_ts*1e9) : 0), + is_valid_(_ts > 0) { // } TimeStamp::TimeStamp(const unsigned long int& _sec, const unsigned long int& _nsec) : - time_stamp_nano_(_sec*NANOSECS+_nsec) + time_stamp_nano_(_sec*NANOSECS+_nsec), + is_valid_(true) { // } @@ -45,6 +59,7 @@ void TimeStamp::setToNow() timeval ts; gettimeofday(&ts, NULL); set(ts); + setOk(); } TimeStamp TimeStamp::operator +(const double& dt) const @@ -64,6 +79,7 @@ TimeStamp TimeStamp::operator -(const double& dt) const void TimeStamp::operator -=(const double& dt) { unsigned long int dt_nano = (unsigned long int)(dt*NANOSECS); + is_valid_ = (time_stamp_nano_ >= dt_nano); time_stamp_nano_ = (dt_nano > time_stamp_nano_ ? 0 : time_stamp_nano_ - dt_nano); } diff --git a/test/gtest_time_stamp.cpp b/test/gtest_time_stamp.cpp index 169532a42076310bb819b85098e1b063902219f7..f8f70272b239a06f30ce5fdf6eed32308ae95689 100644 --- a/test/gtest_time_stamp.cpp +++ b/test/gtest_time_stamp.cpp @@ -3,9 +3,30 @@ #include <thread> +using namespace wolf; + +TEST(WolfTestTimeStamp, TimeStampInvalid) +{ + auto t = TimeStamp::Invalid(); + WOLF_DEBUG("t = ", t); + ASSERT_FALSE(t.ok()); + + t = -1; + WOLF_DEBUG("t = ", t); + ASSERT_FALSE(t.ok()); + + t = 0; + WOLF_DEBUG("t = ", t); + ASSERT_TRUE(t.ok()); + + t = 1; + WOLF_DEBUG("t = ", t); + ASSERT_TRUE(t.ok()); +} + TEST(WolfTestTimeStamp, TimeStampInitNow) { - wolf::TimeStamp start; + wolf::TimeStamp start = wolf::TimeStamp::Now(); // If we don't sleep, start == time_stamp sometimes. // And sometimes start <= time_stamp ... @@ -13,7 +34,7 @@ TEST(WolfTestTimeStamp, TimeStampInitNow) ASSERT_NE(start.get(), 0); - wolf::TimeStamp time_stamp; + wolf::TimeStamp time_stamp = wolf::TimeStamp::Now(); // std::cout << std::fixed; // std::cout << std::setprecision(15); @@ -137,11 +158,11 @@ TEST(WolfTestTimeStamp, TimeStampEquality) TEST(WolfTestTimeStamp, TimeStampInequality) { - wolf::TimeStamp start; + wolf::TimeStamp start = wolf::TimeStamp::Now(); std::this_thread::sleep_for(std::chrono::microseconds(1)); - wolf::TimeStamp time_stamp; + wolf::TimeStamp time_stamp = wolf::TimeStamp::Now(); // error: no match for ‘operator!=’ //ASSERT_NE(time_stamp, start);