Advertisement
Guest User

Untitled

a guest
May 25th, 2018
218
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.39 KB | None | 0 0
  1. #pragma once
  2. #include <winsock2.h>
  3. #include <stdint.h>
  4. #include <sstream>
  5. namespace Windows
  6. {
  7.     struct CpuFrequency
  8.     {
  9.         static uint64_t getFrequency() { uint64_t f; if (!QueryPerformanceFrequency(reinterpret_cast<LARGE_INTEGER*>(&f)))throw 0; return f; }
  10.  
  11.         inline static double s_frequency = static_cast<double>(getFrequency());
  12.         inline static double s_invFrequency = 1. / s_frequency;
  13.     };
  14. }
  15.  
  16. struct TimePoint
  17. {
  18.     friend struct Duration;
  19. private:
  20.     double m_data;
  21.     static TimePoint s_programStartTime;
  22. public:
  23.     TimePoint() :m_data{ 0 } {}
  24.     TimePoint(double value) :m_data{ value } {}
  25.     TimePoint(uint64_t value) :m_data{ value * Windows::CpuFrequency::s_invFrequency } {}
  26.     static TimePoint now() { uint64_t t; if (!QueryPerformanceCounter(reinterpret_cast<LARGE_INTEGER*>(&t)))throw 0; return t; }
  27.  
  28.     bool operator>(const TimePoint& rhs)const { return m_data > rhs.m_data; }
  29.     bool operator>=(const TimePoint& rhs)const { return m_data >= rhs.m_data; }
  30.     bool operator<(const TimePoint& rhs)const { return m_data < rhs.m_data; }
  31.     bool operator<=(const TimePoint& rhs)const { return m_data <= rhs.m_data; }
  32.     bool operator==(const TimePoint& rhs)const { return m_data == rhs.m_data; }
  33.     bool operator!=(const TimePoint& rhs)const { return m_data != rhs.m_data; }
  34.  
  35.     const auto& data()const { return m_data; }
  36.     auto& data() { return m_data; }
  37.  
  38.     static const TimePoint& programStartTime() { return s_programStartTime; }
  39.  
  40.     template<class Ch, class Tr>
  41.     friend inline decltype(auto) operator<<(std::basic_ostream<Ch, Tr>& os, const TimePoint& timepoint)
  42.     {
  43.         os << (timepoint - s_programStartTime);
  44.         return os;
  45.     }
  46. };
  47. TimePoint TimePoint::s_programStartTime = TimePoint::now();
  48.  
  49. struct Duration
  50. {
  51.     friend struct TimePoint;
  52. private:
  53.     double m_data;
  54. public:
  55.     explicit constexpr Duration(double value = 0.) :m_data{ value } {}
  56.     const auto& data()const { return m_data; }
  57.     auto& data() { return m_data; }
  58.  
  59.     bool isPositive()const { return m_data > 0; }
  60.  
  61.     operator bool()const { return m_data != 0; }
  62.  
  63.     static Duration sinceProgramStarts();
  64.  
  65.     double toMilliseconds()const { return m_data * 1000.; }
  66.     double toSeconds()const { return m_data; }
  67.     double toMinutes()const { return m_data * 0.01666666666666666666666666666; }
  68.     double toHours()const { return m_data * 0.0002777777777777777777777777; }
  69.     double toDays()const { return m_data * 1.157407407407407e-5; }
  70.  
  71.     template<class T>static constexpr Duration milliseconds(T value) { return Duration{ static_cast<double>(value * 0.001) }; }
  72.     template<class T>static constexpr Duration seconds(T value) { return Duration{ static_cast<double>(value) }; }
  73.     template<class T>static constexpr Duration minutes(T value) { return Duration{ static_cast<double>(value * 60) }; }
  74.     template<class T>static constexpr Duration hours(T value) { return Duration{ static_cast<double>(value * 3600) }; }
  75.     template<class T>static constexpr Duration days(T value) { return Duration{ static_cast<double>(value * 86400) }; }
  76.  
  77.     bool operator>(const Duration& rhs)const { return m_data > rhs.m_data; }
  78.     bool operator>=(const Duration& rhs)const { return m_data >= rhs.m_data; }
  79.     bool operator<(const Duration& rhs)const { return m_data < rhs.m_data; }
  80.     bool operator<=(const Duration& rhs)const { return m_data <= rhs.m_data; }
  81.     bool operator==(const Duration& rhs)const { return m_data == rhs.m_data; }
  82.     bool operator!=(const Duration& rhs)const { return m_data != rhs.m_data; }
  83.  
  84.     template<class Ch, class Tr>
  85.     friend inline decltype(auto) operator<<(std::basic_ostream<Ch, Tr>& os, const Duration& duration)
  86.     {
  87.         os << duration.toMilliseconds() << "ms";
  88.         return os;
  89.     }
  90. };
  91.  
  92. Duration& operator+=(Duration& lhs, const Duration& rhs) { lhs.data() += rhs.data(); return lhs; }
  93. Duration operator+(const Duration& lhs, const Duration& rhs) { auto copy{ lhs }; return copy += rhs; }
  94.  
  95. Duration& operator-=(Duration& lhs, const Duration& rhs) { lhs.data() -= rhs.data(); return lhs; }
  96. Duration operator-(const Duration& lhs, const Duration& rhs) { auto copy{ lhs }; return copy -= rhs; }
  97.  
  98. template<class T>Duration& operator*=(Duration& lhs, T rhs) { lhs.data() *= rhs; return lhs; }
  99. template<class T>Duration operator*(const Duration& lhs, T rhs) { Duration copy{ lhs }; return copy *= rhs; }
  100. template<class T>Duration operator*(T lhs, const Duration& rhs) { return rhs * lhs; }
  101.  
  102. template<class T>Duration& operator/=(Duration& lhs, T rhs) { lhs.data() /= rhs; return lhs; }
  103. template<class T>Duration operator/(const Duration& lhs, T rhs) { auto copy{ lhs }; return copy /= rhs; }
  104.  
  105. double operator/(const Duration& lhs, const Duration& rhs) { return lhs.data() / rhs.data(); }
  106.  
  107. TimePoint& operator+=(TimePoint& lhs, const Duration& rhs) { lhs.data() += rhs.data(); return lhs; }
  108. TimePoint operator+(const TimePoint& lhs, const Duration& rhs) { auto copy{ lhs }; return copy += rhs; }
  109.  
  110. TimePoint& operator-=(TimePoint& lhs, const Duration& rhs) { lhs.data() -= rhs.data(); return lhs; }
  111. TimePoint operator-(const TimePoint& lhs, const Duration& rhs) { auto copy{ lhs }; return copy -= rhs; }
  112.  
  113. TimePoint operator+(const Duration& lhs, const TimePoint& rhs) { return rhs + lhs; }
  114.  
  115. Duration operator-(const TimePoint& lhs, const TimePoint& rhs) { return Duration{ lhs.data() - rhs.data() }; }
  116.  
  117. Duration Duration::sinceProgramStarts() { return TimePoint::now() - TimePoint::programStartTime(); }
  118.  
  119. struct StopWatch
  120. {
  121. private:
  122.     TimePoint m_startTimePoint;
  123. public:
  124.     StopWatch() :m_startTimePoint{ TimePoint::now() } {}
  125.  
  126.     Duration timeElapsed()const { return TimePoint::now() - m_startTimePoint; }
  127.     void reset() { m_startTimePoint = TimePoint::now(); }
  128. };
  129.  
  130.  
  131. constexpr Duration operator ""_s(long double sec) { return Duration::seconds(sec); }
  132.  
  133. constexpr Duration operator ""_ms(long double ms) { return Duration::milliseconds(ms); }
  134.  
  135. namespace Windows
  136. {
  137.     inline bool sleep100Ns(LONGLONG ns)
  138.     {
  139.         HANDLE timer;
  140.         if (!(timer = CreateWaitableTimerA(nullptr, TRUE, nullptr)))return false;
  141.         LARGE_INTEGER li;
  142.         li.QuadPart = -ns;
  143.         if (!SetWaitableTimer(timer, &li, 0, nullptr, nullptr, FALSE))
  144.         {
  145.             CloseHandle(timer);
  146.             return false;
  147.         }
  148.         WaitForSingleObject(timer, INFINITE);
  149.         CloseHandle(timer);
  150.         return true;
  151.     }
  152.  
  153.     inline bool sleep(const Duration& duration) { return sleep100Ns(static_cast<long long>(duration.toMilliseconds() * 10000)); }
  154.  
  155.     inline bool sleepUntil(const TimePoint& target) { Duration diff{ target - TimePoint::now() }; return (diff.isPositive() ? sleep(diff) : true); }
  156. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement