#ifndef TIME_PROVIDER_H #define TIME_PROVIDER_H #include #include #include "doubleBuffer.h" #include "message/message.h" #include "common/timeDefs.h" class TimeProvider { public: static TimeProvider& getInstance() { static TimeProvider instance; return instance; } void setDiffToServer(double ms); template inline T getDiffToServer() const { return std::chrono::duration_cast(chronos::usec(diffToServer_)); } /* chronos::usec::rep getDiffToServer(); chronos::usec::rep getPercentileDiffToServer(size_t percentile); long getDiffToServerMs(); */ template static T sinceEpoche(const chronos::time_point_hrc& point) { return std::chrono::duration_cast(point.time_since_epoch()); } static chronos::time_point_hrc toTimePoint(const tv& timeval) { return chronos::time_point_hrc(chronos::usec(timeval.usec) + chronos::sec(timeval.sec)); } inline static chronos::time_point_hrc now() { return chronos::hrc::now(); } inline static chronos::time_point_hrc serverNow() { return chronos::hrc::now() + TimeProvider::getInstance().getDiffToServer(); } private: TimeProvider(); TimeProvider(TimeProvider const&); // Don't Implement void operator=(TimeProvider const&); // Don't implement DoubleBuffer diffBuffer_; std::atomic diffToServer_; }; #endif