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