clock_pass.cpp 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  1. //===----------------------------------------------------------------------===//
  2. //
  3. // The LLVM Compiler Infrastructure
  4. //
  5. // This file is dual licensed under the MIT and the University of Illinois Open
  6. // Source Licenses. See LICENSE.TXT for details.
  7. //
  8. //===----------------------------------------------------------------------===//
  9. // Adaptation to Boost of the libcxx
  10. // Copyright 2010 Vicente J. Botet Escriba
  11. // Copyright (c) Microsoft Corporation 2014
  12. // Distributed under the Boost Software License, Version 1.0.
  13. // See http://www.boost.org/LICENSE_1_0.txt
  14. #include <boost/type_traits/is_same.hpp>
  15. #include <boost/chrono/chrono.hpp>
  16. #include <boost/chrono/process_cpu_clocks.hpp>
  17. #include <boost/chrono/thread_clock.hpp>
  18. #include <boost/system/system_error.hpp>
  19. #include <boost/detail/lightweight_test.hpp>
  20. #if !defined(BOOST_NO_CXX11_STATIC_ASSERT)
  21. #define NOTHING ""
  22. #endif
  23. template <typename Clock>
  24. void check_clock_invariants()
  25. {
  26. BOOST_CHRONO_STATIC_ASSERT((boost::is_same<typename Clock::rep, typename Clock::duration::rep>::value), NOTHING, ());
  27. BOOST_CHRONO_STATIC_ASSERT((boost::is_same<typename Clock::period, typename Clock::duration::period>::value), NOTHING, ());
  28. BOOST_CHRONO_STATIC_ASSERT((boost::is_same<typename Clock::duration, typename Clock::time_point::duration>::value), NOTHING, ());
  29. BOOST_CHRONO_STATIC_ASSERT(Clock::is_steady || !Clock::is_steady, NOTHING, ());
  30. // to be replaced by has static member bool is_steady
  31. }
  32. template <typename Clock>
  33. void check_clock_now()
  34. {
  35. typename Clock::time_point t1 = Clock::now();
  36. (void)t1;
  37. }
  38. #if !defined BOOST_CHRONO_DONT_PROVIDE_HYBRID_ERROR_HANDLING
  39. template <typename Clock>
  40. void check_clock_now_ec()
  41. {
  42. boost::system::error_code ec;
  43. typename Clock::time_point t1 = Clock::now(ec);
  44. (void)t1;
  45. BOOST_TEST(ec.value()==0);
  46. }
  47. template <typename Clock>
  48. void check_clock_now_throws()
  49. {
  50. typename Clock::time_point t1 = Clock::now(boost::throws());
  51. (void)t1;
  52. }
  53. #ifndef BOOST_NO_EXCEPTIONS
  54. template <typename Clock>
  55. void check_clock_now_err(int err)
  56. {
  57. Clock::set_errno(err);
  58. try {
  59. typename Clock::time_point t1 = Clock::now();
  60. } catch (boost::system::system_error& ex) {
  61. BOOST_TEST(ex.code().value()==err);
  62. // BOOST_TEST(ex.code().category() == ::boost::system::system_category());
  63. // BOOST_TEST(std::string(ex.what()) == std::string("errored_clock"));
  64. }
  65. Clock::set_errno(0);
  66. }
  67. #endif
  68. template <typename Clock>
  69. void check_clock_now_ec_err(int err)
  70. {
  71. Clock::set_errno(err);
  72. boost::system::error_code ec;
  73. typename Clock::time_point t1 = Clock::now(ec);
  74. BOOST_TEST(ec.value()==err);
  75. // BOOST_TEST(ec.category() == ::boost::system::system_category());
  76. Clock::set_errno(0);
  77. }
  78. #ifndef BOOST_NO_EXCEPTIONS
  79. template <typename Clock>
  80. void check_clock_now_throws_err(int err)
  81. {
  82. Clock::set_errno(err);
  83. try {
  84. typename Clock::time_point t1 = Clock::now(boost::throws());
  85. BOOST_TEST(0&&"exception not thown");
  86. } catch (boost::system::system_error& ex) {
  87. BOOST_TEST(ex.code().value()==err);
  88. // BOOST_TEST(ex.code().category() == ::boost::system::system_category());
  89. // BOOST_TEST(std::string(ex.what()) == std::string("errored_clock"));
  90. }
  91. Clock::set_errno(0);
  92. }
  93. #endif
  94. #endif
  95. int main()
  96. {
  97. check_clock_invariants<boost::chrono::high_resolution_clock>();
  98. check_clock_now<boost::chrono::high_resolution_clock>();
  99. #ifdef BOOST_CHRONO_HAS_CLOCK_STEADY
  100. check_clock_invariants<boost::chrono::steady_clock>();
  101. BOOST_CHRONO_STATIC_ASSERT(boost::chrono::steady_clock::is_steady, NOTHING, ());
  102. check_clock_now<boost::chrono::steady_clock>();
  103. #endif
  104. check_clock_invariants<boost::chrono::system_clock>();
  105. BOOST_CHRONO_STATIC_ASSERT(!boost::chrono::system_clock::is_steady, NOTHING, ());
  106. check_clock_now<boost::chrono::system_clock>();
  107. {
  108. typedef boost::chrono::system_clock C;
  109. C::time_point t1 = C::from_time_t(C::to_time_t(C::now()));
  110. (void)t1;
  111. }
  112. {
  113. typedef boost::chrono::system_clock C;
  114. std::time_t t1 = C::to_time_t(C::now());
  115. (void)t1;
  116. }
  117. {
  118. BOOST_TEST((boost::chrono::system_clock::duration::min)() <
  119. boost::chrono::system_clock::duration::zero());
  120. }
  121. #if defined(BOOST_CHRONO_HAS_THREAD_CLOCK)
  122. check_clock_invariants<boost::chrono::thread_clock>();
  123. BOOST_CHRONO_STATIC_ASSERT(boost::chrono::thread_clock::is_steady, NOTHING, ());
  124. check_clock_now<boost::chrono::thread_clock>();
  125. #endif
  126. #if defined(BOOST_CHRONO_HAS_PROCESS_CLOCKS)
  127. check_clock_invariants<boost::chrono::process_real_cpu_clock>();
  128. BOOST_CHRONO_STATIC_ASSERT(boost::chrono::process_real_cpu_clock::is_steady, NOTHING, ());
  129. check_clock_now<boost::chrono::process_real_cpu_clock>();
  130. #if ! BOOST_OS_WINDOWS || BOOST_PLAT_WINDOWS_DESKTOP
  131. check_clock_invariants<boost::chrono::process_user_cpu_clock>();
  132. BOOST_CHRONO_STATIC_ASSERT(boost::chrono::process_user_cpu_clock::is_steady, NOTHING, ());
  133. check_clock_now<boost::chrono::process_user_cpu_clock>();
  134. check_clock_invariants<boost::chrono::process_system_cpu_clock>();
  135. BOOST_CHRONO_STATIC_ASSERT(boost::chrono::process_system_cpu_clock::is_steady, NOTHING, ());
  136. check_clock_now<boost::chrono::process_system_cpu_clock>();
  137. check_clock_invariants<boost::chrono::process_cpu_clock>();
  138. BOOST_CHRONO_STATIC_ASSERT(boost::chrono::process_cpu_clock::is_steady, NOTHING, ());
  139. check_clock_now<boost::chrono::process_cpu_clock>();
  140. #endif
  141. #endif
  142. #if !defined BOOST_CHRONO_DONT_PROVIDE_HYBRID_ERROR_HANDLING
  143. check_clock_now_ec<boost::chrono::high_resolution_clock>();
  144. check_clock_now_throws<boost::chrono::high_resolution_clock>();
  145. #ifdef BOOST_CHRONO_HAS_CLOCK_STEADY
  146. check_clock_now_ec<boost::chrono::steady_clock>();
  147. check_clock_now_throws<boost::chrono::steady_clock>();
  148. #endif
  149. check_clock_now_ec<boost::chrono::system_clock>();
  150. check_clock_now_throws<boost::chrono::system_clock>();
  151. #if defined(BOOST_CHRONO_HAS_THREAD_CLOCK)
  152. check_clock_now_ec<boost::chrono::thread_clock>();
  153. check_clock_now_throws<boost::chrono::thread_clock>();
  154. #endif
  155. #if defined(BOOST_CHRONO_HAS_PROCESS_CLOCKS)
  156. check_clock_now_ec<boost::chrono::process_real_cpu_clock>();
  157. check_clock_now_throws<boost::chrono::process_real_cpu_clock>();
  158. #if ! BOOST_OS_WINDOWS || BOOST_PLAT_WINDOWS_DESKTOP
  159. check_clock_now_ec<boost::chrono::process_user_cpu_clock>();
  160. check_clock_now_throws<boost::chrono::process_user_cpu_clock>();
  161. check_clock_now_ec<boost::chrono::process_system_cpu_clock>();
  162. check_clock_now_throws<boost::chrono::process_system_cpu_clock>();
  163. check_clock_now_ec<boost::chrono::process_cpu_clock>();
  164. check_clock_now_throws<boost::chrono::process_cpu_clock>();
  165. #endif
  166. #endif
  167. #endif
  168. return boost::report_errors();
  169. }