chrono.hpp 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. // win/chrono.cpp --------------------------------------------------------------//
  2. // Copyright Beman Dawes 2008
  3. // Copyright 2009-2010 Vicente J. Botet Escriba
  4. // Distributed under the Boost Software License, Version 1.0.
  5. // See http://www.boost.org/LICENSE_1_0.txt
  6. //----------------------------------------------------------------------------//
  7. // Windows //
  8. //----------------------------------------------------------------------------//
  9. #ifndef BOOST_CHRONO_DETAIL_INLINED_WIN_CHRONO_HPP
  10. #define BOOST_CHRONO_DETAIL_INLINED_WIN_CHRONO_HPP
  11. #include <boost/detail/winapi/time.hpp>
  12. #include <boost/detail/winapi/timers.hpp>
  13. #include <boost/detail/winapi/GetLastError.hpp>
  14. namespace boost
  15. {
  16. namespace chrono
  17. {
  18. namespace chrono_detail
  19. {
  20. BOOST_CHRONO_INLINE double get_nanosecs_per_tic() BOOST_NOEXCEPT
  21. {
  22. boost::detail::winapi::LARGE_INTEGER_ freq;
  23. if ( !boost::detail::winapi::QueryPerformanceFrequency( &freq ) )
  24. return 0.0L;
  25. return double(1000000000.0L / freq.QuadPart);
  26. }
  27. }
  28. steady_clock::time_point steady_clock::now() BOOST_NOEXCEPT
  29. {
  30. static double nanosecs_per_tic = chrono_detail::get_nanosecs_per_tic();
  31. boost::detail::winapi::LARGE_INTEGER_ pcount;
  32. if ( (nanosecs_per_tic <= 0.0L) ||
  33. (!boost::detail::winapi::QueryPerformanceCounter( &pcount )) )
  34. {
  35. BOOST_ASSERT(0 && "Boost::Chrono - Internal Error");
  36. return steady_clock::time_point();
  37. }
  38. return steady_clock::time_point(steady_clock::duration(
  39. static_cast<steady_clock::rep>((nanosecs_per_tic) * pcount.QuadPart)));
  40. }
  41. #if !defined BOOST_CHRONO_DONT_PROVIDE_HYBRID_ERROR_HANDLING
  42. steady_clock::time_point steady_clock::now( system::error_code & ec )
  43. {
  44. static double nanosecs_per_tic = chrono_detail::get_nanosecs_per_tic();
  45. boost::detail::winapi::LARGE_INTEGER_ pcount;
  46. if ( (nanosecs_per_tic <= 0.0L)
  47. || (!boost::detail::winapi::QueryPerformanceCounter( &pcount )) )
  48. {
  49. boost::detail::winapi::DWORD_ cause =
  50. ((nanosecs_per_tic <= 0.0L)
  51. ? ERROR_NOT_SUPPORTED
  52. : boost::detail::winapi::GetLastError());
  53. if (BOOST_CHRONO_IS_THROWS(ec)) {
  54. boost::throw_exception(
  55. system::system_error(
  56. cause,
  57. BOOST_CHRONO_SYSTEM_CATEGORY,
  58. "chrono::steady_clock" ));
  59. }
  60. else
  61. {
  62. ec.assign( cause, BOOST_CHRONO_SYSTEM_CATEGORY );
  63. return steady_clock::time_point(duration(0));
  64. }
  65. }
  66. if (!BOOST_CHRONO_IS_THROWS(ec))
  67. {
  68. ec.clear();
  69. }
  70. return time_point(duration(
  71. static_cast<steady_clock::rep>(nanosecs_per_tic * pcount.QuadPart)));
  72. }
  73. #endif
  74. BOOST_CHRONO_INLINE
  75. system_clock::time_point system_clock::now() BOOST_NOEXCEPT
  76. {
  77. boost::detail::winapi::FILETIME_ ft;
  78. boost::detail::winapi::GetSystemTimeAsFileTime( &ft ); // never fails
  79. return system_clock::time_point(
  80. system_clock::duration(
  81. ((static_cast<__int64>( ft.dwHighDateTime ) << 32) | ft.dwLowDateTime)
  82. -116444736000000000LL
  83. )
  84. );
  85. }
  86. #if !defined BOOST_CHRONO_DONT_PROVIDE_HYBRID_ERROR_HANDLING
  87. BOOST_CHRONO_INLINE
  88. system_clock::time_point system_clock::now( system::error_code & ec )
  89. {
  90. boost::detail::winapi::FILETIME_ ft;
  91. boost::detail::winapi::GetSystemTimeAsFileTime( &ft ); // never fails
  92. if (!BOOST_CHRONO_IS_THROWS(ec))
  93. {
  94. ec.clear();
  95. }
  96. return system_clock::time_point(
  97. system_clock::duration(
  98. ((static_cast<__int64>( ft.dwHighDateTime ) << 32) | ft.dwLowDateTime)
  99. -116444736000000000LL
  100. ));
  101. }
  102. #endif
  103. BOOST_CHRONO_INLINE
  104. std::time_t system_clock::to_time_t(const system_clock::time_point& t) BOOST_NOEXCEPT
  105. {
  106. __int64 temp = t.time_since_epoch().count();
  107. temp /= 10000000;
  108. return static_cast<std::time_t>( temp );
  109. }
  110. BOOST_CHRONO_INLINE
  111. system_clock::time_point system_clock::from_time_t(std::time_t t) BOOST_NOEXCEPT
  112. {
  113. __int64 temp = t;
  114. temp *= 10000000;
  115. return time_point(duration(temp));
  116. }
  117. } // namespace chrono
  118. } // namespace boost
  119. #endif