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