arithmetic_pass.cpp 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350
  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. // Distributed under the Boost Software License, Version 1.0.
  12. // See http://www.boost.org/LICENSE_1_0.txt
  13. #include <boost/chrono/duration.hpp>
  14. #include <boost/detail/lightweight_test.hpp>
  15. #ifdef BOOST_NO_CXX11_CONSTEXPR
  16. #define BOOST_CONSTEXPR_ASSERT(C) BOOST_TEST(C)
  17. #else
  18. #include <boost/static_assert.hpp>
  19. #define BOOST_CONSTEXPR_ASSERT(C) BOOST_STATIC_ASSERT(C)
  20. #endif
  21. int main()
  22. {
  23. // Default construct
  24. {
  25. //BOOST_CONSTEXPR
  26. boost::chrono::minutes m;
  27. //BOOST_CONSTEXPR_ASSERT(m.count() == 0);
  28. (void)m;
  29. }
  30. // UNARY PLUS
  31. {
  32. boost::chrono::minutes m(3);
  33. boost::chrono::minutes m2 = +m;
  34. BOOST_TEST(m.count() == m2.count());
  35. }
  36. {
  37. BOOST_CONSTEXPR boost::chrono::minutes m(3);
  38. BOOST_CONSTEXPR boost::chrono::minutes m2(+m);
  39. BOOST_CONSTEXPR_ASSERT(m.count() == m2.count());
  40. }
  41. // UNARY MINUS
  42. {
  43. boost::chrono::minutes m(3);
  44. boost::chrono::minutes m2 = -m;
  45. BOOST_TEST(m2.count() == -m.count());
  46. }
  47. {
  48. BOOST_CONSTEXPR boost::chrono::minutes m(3);
  49. BOOST_CONSTEXPR boost::chrono::minutes m2 = -m;
  50. BOOST_CONSTEXPR_ASSERT(m2.count() == -m.count());
  51. }
  52. // PRE INCREMENT
  53. {
  54. boost::chrono::hours h(3);
  55. boost::chrono::hours& href = ++h;
  56. BOOST_TEST(&href == &h);
  57. BOOST_TEST(h.count() == 4);
  58. }
  59. // POST INCREMENT
  60. {
  61. boost::chrono::hours h(3);
  62. boost::chrono::hours h2 = h++;
  63. BOOST_TEST(h.count() == 4);
  64. BOOST_TEST(h2.count() == 3);
  65. }
  66. // PRE DECREMENT
  67. {
  68. boost::chrono::hours h(3);
  69. boost::chrono::hours& href = --h;
  70. BOOST_TEST(&href == &h);
  71. BOOST_TEST(h.count() == 2);
  72. }
  73. // POST DECREMENT
  74. {
  75. boost::chrono::hours h(3);
  76. boost::chrono::hours h2 = h--;
  77. BOOST_TEST(h.count() == 2);
  78. BOOST_TEST(h2.count() == 3);
  79. }
  80. // PLUS ASSIGN
  81. {
  82. boost::chrono::seconds s(3);
  83. s += boost::chrono::seconds(2);
  84. BOOST_TEST(s.count() == 5);
  85. s += boost::chrono::minutes(2);
  86. BOOST_TEST(s.count() == 125);
  87. }
  88. // MINUS ASSIGN
  89. {
  90. boost::chrono::seconds s(3);
  91. s -= boost::chrono::seconds(2);
  92. BOOST_TEST(s.count() == 1);
  93. s -= boost::chrono::minutes(2);
  94. BOOST_TEST(s.count() == -119);
  95. }
  96. // TIMES ASSIGN
  97. {
  98. boost::chrono::nanoseconds ns(3);
  99. ns *= 5;
  100. BOOST_TEST(ns.count() == 15);
  101. }
  102. // DIVIDE ASSIGN
  103. {
  104. boost::chrono::nanoseconds ns(15);
  105. ns /= 5;
  106. BOOST_TEST(ns.count() == 3);
  107. }
  108. // MODULUS ASSIGN duration
  109. {
  110. boost::chrono::microseconds us(11);
  111. boost::chrono::microseconds us2(3);
  112. us %= us2;
  113. BOOST_TEST(us.count() == 2);
  114. us %= boost::chrono::milliseconds(3);
  115. BOOST_TEST(us.count() == 2);
  116. }
  117. // MODULUS ASSIGN Rep
  118. {
  119. boost::chrono::microseconds us(11);
  120. us %= 3;
  121. BOOST_TEST(us.count() == 2);
  122. }
  123. // PLUS
  124. {
  125. boost::chrono::seconds s1(3);
  126. boost::chrono::seconds s2(5);
  127. boost::chrono::seconds r = s1 + s2;
  128. BOOST_TEST(r.count() == 8);
  129. }
  130. {
  131. BOOST_CONSTEXPR boost::chrono::seconds s1(3);
  132. BOOST_CONSTEXPR boost::chrono::seconds s2(5);
  133. BOOST_CONSTEXPR boost::chrono::seconds r = s1 + s2;
  134. BOOST_CONSTEXPR_ASSERT(r.count() == 8);
  135. }
  136. {
  137. boost::chrono::seconds s1(3);
  138. boost::chrono::microseconds s2(5);
  139. boost::chrono::microseconds r = s1 + s2;
  140. BOOST_TEST(r.count() == 3000005);
  141. }
  142. {
  143. BOOST_CONSTEXPR boost::chrono::seconds s1(3);
  144. BOOST_CONSTEXPR boost::chrono::microseconds s2(5);
  145. BOOST_CONSTEXPR boost::chrono::microseconds r = s1 + s2;
  146. BOOST_CONSTEXPR_ASSERT(r.count() == 3000005);
  147. }
  148. {
  149. boost::chrono::duration<int, boost::ratio<2, 3> > s1(3);
  150. boost::chrono::duration<int, boost::ratio<3, 5> > s2(5);
  151. boost::chrono::duration<int, boost::ratio<1, 15> > r = s1 + s2;
  152. BOOST_TEST(r.count() == 75);
  153. }
  154. {
  155. BOOST_CONSTEXPR boost::chrono::duration<int, boost::ratio<2, 3> > s1(3);
  156. BOOST_CONSTEXPR boost::chrono::duration<int, boost::ratio<3, 5> > s2(5);
  157. BOOST_CONSTEXPR boost::chrono::duration<int, boost::ratio<1, 15> > r = s1 + s2;
  158. BOOST_CONSTEXPR_ASSERT(r.count() == 75);
  159. }
  160. {
  161. boost::chrono::duration<int, boost::ratio<2, 3> > s1(3);
  162. boost::chrono::duration<double, boost::ratio<3, 5> > s2(5);
  163. boost::chrono::duration<double, boost::ratio<1, 15> > r = s1 + s2;
  164. BOOST_TEST(r.count() == 75);
  165. }
  166. {
  167. BOOST_CONSTEXPR boost::chrono::duration<int, boost::ratio<2, 3> > s1(3);
  168. BOOST_CONSTEXPR boost::chrono::duration<double, boost::ratio<3, 5> > s2(5);
  169. BOOST_CONSTEXPR boost::chrono::duration<double, boost::ratio<1, 15> > r = s1 + s2;
  170. BOOST_CONSTEXPR_ASSERT(r.count() == 75);
  171. }
  172. // MINUS
  173. {
  174. boost::chrono::seconds s1(3);
  175. boost::chrono::seconds s2(5);
  176. boost::chrono::seconds r = s1 - s2;
  177. BOOST_TEST(r.count() == -2);
  178. }
  179. {
  180. BOOST_CONSTEXPR boost::chrono::seconds s1(3);
  181. BOOST_CONSTEXPR boost::chrono::seconds s2(5);
  182. BOOST_CONSTEXPR boost::chrono::seconds r = s1 - s2;
  183. BOOST_CONSTEXPR_ASSERT(r.count() == -2);
  184. }
  185. {
  186. boost::chrono::seconds s1(3);
  187. boost::chrono::microseconds s2(5);
  188. boost::chrono::microseconds r = s1 - s2;
  189. BOOST_TEST(r.count() == 2999995);
  190. }
  191. {
  192. BOOST_CONSTEXPR boost::chrono::seconds s1(3);
  193. BOOST_CONSTEXPR boost::chrono::microseconds s2(5);
  194. BOOST_CONSTEXPR boost::chrono::microseconds r = s1 - s2;
  195. BOOST_CONSTEXPR_ASSERT(r.count() == 2999995);
  196. }
  197. {
  198. boost::chrono::duration<int, boost::ratio<2, 3> > s1(3);
  199. boost::chrono::duration<int, boost::ratio<3, 5> > s2(5);
  200. boost::chrono::duration<int, boost::ratio<1, 15> > r = s1 - s2;
  201. BOOST_TEST(r.count() == -15);
  202. }
  203. {
  204. BOOST_CONSTEXPR boost::chrono::duration<int, boost::ratio<2, 3> > s1(3);
  205. BOOST_CONSTEXPR boost::chrono::duration<int, boost::ratio<3, 5> > s2(5);
  206. BOOST_CONSTEXPR boost::chrono::duration<int, boost::ratio<1, 15> > r = s1 - s2;
  207. BOOST_CONSTEXPR_ASSERT(r.count() == -15);
  208. }
  209. {
  210. boost::chrono::duration<int, boost::ratio<2, 3> > s1(3);
  211. boost::chrono::duration<double, boost::ratio<3, 5> > s2(5);
  212. boost::chrono::duration<double, boost::ratio<1, 15> > r = s1 - s2;
  213. BOOST_TEST(r.count() == -15);
  214. }
  215. {
  216. BOOST_CONSTEXPR boost::chrono::duration<int, boost::ratio<2, 3> > s1(3);
  217. BOOST_CONSTEXPR boost::chrono::duration<double, boost::ratio<3, 5> > s2(5);
  218. BOOST_CONSTEXPR boost::chrono::duration<double, boost::ratio<1, 15> > r = s1 - s2;
  219. BOOST_CONSTEXPR_ASSERT(r.count() == -15);
  220. }
  221. // TIMES rep
  222. {
  223. boost::chrono::nanoseconds ns(3);
  224. boost::chrono::nanoseconds ns2 = ns * 5;
  225. BOOST_TEST(ns2.count() == 15);
  226. boost::chrono::nanoseconds ns3 = 6 * ns2;
  227. BOOST_TEST(ns3.count() == 90);
  228. }
  229. {
  230. BOOST_CONSTEXPR boost::chrono::nanoseconds ns(3);
  231. BOOST_CONSTEXPR boost::chrono::nanoseconds ns2 = ns * 5;
  232. BOOST_CONSTEXPR_ASSERT(ns2.count() == 15);
  233. BOOST_CONSTEXPR boost::chrono::nanoseconds ns3 = 6 * ns2;
  234. BOOST_CONSTEXPR_ASSERT(ns3.count() == 90);
  235. }
  236. // DIVIDE duration
  237. {
  238. boost::chrono::nanoseconds ns1(15);
  239. boost::chrono::nanoseconds ns2(5);
  240. BOOST_TEST(ns1 / ns2 == 3);
  241. }
  242. {
  243. BOOST_CONSTEXPR boost::chrono::nanoseconds ns1(15);
  244. BOOST_CONSTEXPR boost::chrono::nanoseconds ns2(5);
  245. BOOST_CONSTEXPR_ASSERT(ns1 / ns2 == 3);
  246. }
  247. {
  248. boost::chrono::microseconds us1(15);
  249. boost::chrono::nanoseconds ns2(5);
  250. BOOST_TEST(us1 / ns2 == 3000);
  251. }
  252. {
  253. BOOST_CONSTEXPR boost::chrono::microseconds us1(15);
  254. BOOST_CONSTEXPR boost::chrono::nanoseconds ns2(5);
  255. BOOST_CONSTEXPR_ASSERT(us1 / ns2 == 3000);
  256. }
  257. {
  258. boost::chrono::duration<int, boost::ratio<2, 3> > s1(30);
  259. boost::chrono::duration<int, boost::ratio<3, 5> > s2(5);
  260. BOOST_TEST(s1 / s2 == 6);
  261. }
  262. {
  263. BOOST_CONSTEXPR boost::chrono::duration<int, boost::ratio<2, 3> > s1(30);
  264. BOOST_CONSTEXPR boost::chrono::duration<int, boost::ratio<3, 5> > s2(5);
  265. BOOST_CONSTEXPR_ASSERT(s1 / s2 == 6);
  266. }
  267. {
  268. boost::chrono::duration<int, boost::ratio<2, 3> > s1(30);
  269. boost::chrono::duration<double, boost::ratio<3, 5> > s2(5);
  270. //BOOST_TEST(s1 / s2 == 20. / 3);
  271. BOOST_TEST(3 * s1 == 20 * s2);
  272. }
  273. {
  274. BOOST_CONSTEXPR boost::chrono::duration<int, boost::ratio<2, 3> > s1(30);
  275. BOOST_CONSTEXPR boost::chrono::duration<double, boost::ratio<3, 5> > s2(5);
  276. //BOOST_CONSTEXPR_ASSERT(s1 / s2 == 20. / 3);
  277. BOOST_TEST(3 * s1 == 20 * s2);
  278. }
  279. // DIVIDE rep
  280. {
  281. boost::chrono::nanoseconds ns(15);
  282. boost::chrono::nanoseconds ns2 = ns / 5;
  283. BOOST_TEST(ns2.count() == 3);
  284. }
  285. {
  286. BOOST_CONSTEXPR boost::chrono::nanoseconds ns(15);
  287. BOOST_CONSTEXPR boost::chrono::nanoseconds ns2 = ns / 5;
  288. BOOST_CONSTEXPR_ASSERT(ns2.count() == 3);
  289. }
  290. // MODULUS duration
  291. {
  292. boost::chrono::nanoseconds ns1(15);
  293. boost::chrono::nanoseconds ns2(6);
  294. boost::chrono::nanoseconds r = ns1 % ns2;
  295. BOOST_TEST(r.count() == 3);
  296. }
  297. {
  298. BOOST_CONSTEXPR boost::chrono::nanoseconds ns1(15);
  299. BOOST_CONSTEXPR boost::chrono::nanoseconds ns2(6);
  300. BOOST_CONSTEXPR boost::chrono::nanoseconds r = ns1 % ns2;
  301. BOOST_CONSTEXPR_ASSERT(r.count() == 3);
  302. }
  303. {
  304. boost::chrono::microseconds us1(15);
  305. boost::chrono::nanoseconds ns2(28);
  306. boost::chrono::nanoseconds r = us1 % ns2;
  307. BOOST_TEST(r.count() == 20);
  308. }
  309. {
  310. BOOST_CONSTEXPR boost::chrono::microseconds us1(15);
  311. BOOST_CONSTEXPR boost::chrono::nanoseconds ns2(28);
  312. BOOST_CONSTEXPR boost::chrono::nanoseconds r = us1 % ns2;
  313. BOOST_CONSTEXPR_ASSERT(r.count() == 20);
  314. }
  315. {
  316. boost::chrono::duration<int, boost::ratio<3, 5> > s1(6);
  317. boost::chrono::duration<int, boost::ratio<2, 3> > s2(3);
  318. boost::chrono::duration<int, boost::ratio<1, 15> > r = s1 % s2;
  319. BOOST_TEST(r.count() == 24);
  320. }
  321. {
  322. BOOST_CONSTEXPR boost::chrono::duration<int, boost::ratio<3, 5> > s1(6);
  323. BOOST_CONSTEXPR boost::chrono::duration<int, boost::ratio<2, 3> > s2(3);
  324. BOOST_CONSTEXPR boost::chrono::duration<int, boost::ratio<1, 15> > r = s1 % s2;
  325. BOOST_CONSTEXPR_ASSERT(r.count() == 24);
  326. }
  327. // MODULUS rep
  328. {
  329. boost::chrono::nanoseconds ns(15);
  330. boost::chrono::nanoseconds ns2 = ns % 6;
  331. BOOST_TEST(ns2.count() == 3);
  332. }
  333. {
  334. BOOST_CONSTEXPR boost::chrono::nanoseconds ns(15);
  335. BOOST_CONSTEXPR boost::chrono::nanoseconds ns2 = ns % 6;
  336. BOOST_CONSTEXPR_ASSERT(ns2.count() == 3);
  337. }
  338. return boost::report_errors();
  339. }