1 | // <chrono> -*- C++ -*-  |
2 |   |
3 | // Copyright (C) 2008-2019 Free Software Foundation, Inc.  |
4 | //  |
5 | // This file is part of the GNU ISO C++ Library. This library is free  |
6 | // software; you can redistribute it and/or modify it under the  |
7 | // terms of the GNU General Public License as published by the  |
8 | // Free Software Foundation; either version 3, or (at your option)  |
9 | // any later version.  |
10 |   |
11 | // This library is distributed in the hope that it will be useful,  |
12 | // but WITHOUT ANY WARRANTY; without even the implied warranty of  |
13 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the  |
14 | // GNU General Public License for more details.  |
15 |   |
16 | // Under Section 7 of GPL version 3, you are granted additional  |
17 | // permissions described in the GCC Runtime Library Exception, version  |
18 | // 3.1, as published by the Free Software Foundation.  |
19 |   |
20 | // You should have received a copy of the GNU General Public License and  |
21 | // a copy of the GCC Runtime Library Exception along with this program;  |
22 | // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see  |
23 | // <http://www.gnu.org/licenses/>.  |
24 |   |
25 | /** @file include/chrono  |
26 | * This is a Standard C++ Library header.  |
27 | */  |
28 |   |
29 | #ifndef _GLIBCXX_CHRONO  |
30 | #define _GLIBCXX_CHRONO 1  |
31 |   |
32 | #pragma GCC system_header  |
33 |   |
34 | #if __cplusplus < 201103L  |
35 | # include <bits/c++0x_warning.h>  |
36 | #else  |
37 |   |
38 | #include <ratio>  |
39 | #include <type_traits>  |
40 | #include <limits>  |
41 | #include <ctime>  |
42 | #include <bits/parse_numbers.h> // for literals support.  |
43 |   |
44 | namespace std _GLIBCXX_VISIBILITY(default)  |
45 | {  |
46 | _GLIBCXX_BEGIN_NAMESPACE_VERSION  |
47 |   |
48 | /**  |
49 | * @defgroup chrono Time  |
50 | * @ingroup utilities  |
51 | *  |
52 | * Classes and functions for time.  |
53 | * @{  |
54 | */  |
55 |   |
56 | /** @namespace std::chrono  |
57 | * @brief ISO C++ 2011 entities sub-namespace for time and date.  |
58 | */  |
59 | namespace chrono  |
60 | {  |
61 | template<typename _Rep, typename _Period = ratio<1>>  |
62 | struct duration;  |
63 |   |
64 | template<typename _Clock, typename _Dur = typename _Clock::duration>  |
65 | struct time_point;  |
66 | }  |
67 |   |
68 | // 20.11.4.3 specialization of common_type (for duration, sfinae-friendly)  |
69 |   |
70 | template<typename _CT, typename _Period1, typename _Period2>  |
71 | struct __duration_common_type_wrapper  |
72 | {  |
73 | private:  |
74 | typedef __static_gcd<_Period1::num, _Period2::num> __gcd_num;  |
75 | typedef __static_gcd<_Period1::den, _Period2::den> __gcd_den;  |
76 | typedef typename _CT::type __cr;  |
77 | typedef ratio<__gcd_num::value,  |
78 | (_Period1::den / __gcd_den::value) * _Period2::den> __r;  |
79 | public:  |
80 | typedef __success_type<chrono::duration<__cr, __r>> type;  |
81 | };  |
82 |   |
83 | template<typename _Period1, typename _Period2>  |
84 | struct __duration_common_type_wrapper<__failure_type, _Period1, _Period2>  |
85 | { typedef __failure_type type; };  |
86 |   |
87 | template<typename _Rep1, typename _Period1, typename _Rep2, typename _Period2>  |
88 | struct common_type<chrono::duration<_Rep1, _Period1>,  |
89 | chrono::duration<_Rep2, _Period2>>  |
90 | : public __duration_common_type_wrapper<typename __member_type_wrapper<  |
91 | common_type<_Rep1, _Rep2>>::type, _Period1, _Period2>::type  |
92 | { };  |
93 |   |
94 | // 20.11.4.3 specialization of common_type (for time_point, sfinae-friendly)  |
95 |   |
96 | template<typename _CT, typename _Clock>  |
97 | struct __timepoint_common_type_wrapper  |
98 | {  |
99 | typedef __success_type<chrono::time_point<_Clock, typename _CT::type>>  |
100 | type;  |
101 | };  |
102 |   |
103 | template<typename _Clock>  |
104 | struct __timepoint_common_type_wrapper<__failure_type, _Clock>  |
105 | { typedef __failure_type type; };  |
106 |   |
107 | template<typename _Clock, typename _Duration1, typename _Duration2>  |
108 | struct common_type<chrono::time_point<_Clock, _Duration1>,  |
109 | chrono::time_point<_Clock, _Duration2>>  |
110 | : public __timepoint_common_type_wrapper<typename __member_type_wrapper<  |
111 | common_type<_Duration1, _Duration2>>::type, _Clock>::type  |
112 | { };  |
113 |   |
114 | namespace chrono  |
115 | {  |
116 | // Primary template for duration_cast impl.  |
117 | template<typename _ToDur, typename _CF, typename _CR,  |
118 | bool _NumIsOne = false, bool _DenIsOne = false>  |
119 | struct __duration_cast_impl  |
120 | {  |
121 | template<typename _Rep, typename _Period>  |
122 | static constexpr _ToDur  |
123 | __cast(const duration<_Rep, _Period>& __d)  |
124 | {  |
125 | typedef typename _ToDur::rep __to_rep;  |
126 | return _ToDur(static_cast<__to_rep>(static_cast<_CR>(__d.count())  |
127 | * static_cast<_CR>(_CF::num)  |
128 | / static_cast<_CR>(_CF::den)));  |
129 | }  |
130 | };  |
131 |   |
132 | template<typename _ToDur, typename _CF, typename _CR>  |
133 | struct __duration_cast_impl<_ToDur, _CF, _CR, true, true>  |
134 | {  |
135 | template<typename _Rep, typename _Period>  |
136 | static constexpr _ToDur  |
137 | __cast(const duration<_Rep, _Period>& __d)  |
138 | {  |
139 | typedef typename _ToDur::rep __to_rep;  |
140 | return _ToDur(static_cast<__to_rep>(__d.count()));  |
141 | }  |
142 | };  |
143 |   |
144 | template<typename _ToDur, typename _CF, typename _CR>  |
145 | struct __duration_cast_impl<_ToDur, _CF, _CR, true, false>  |
146 | {  |
147 | template<typename _Rep, typename _Period>  |
148 | static constexpr _ToDur  |
149 | __cast(const duration<_Rep, _Period>& __d)  |
150 | {  |
151 | typedef typename _ToDur::rep __to_rep;  |
152 | return _ToDur(static_cast<__to_rep>(  |
153 | static_cast<_CR>(__d.count()) / static_cast<_CR>(_CF::den)));  |
154 | }  |
155 | };  |
156 |   |
157 | template<typename _ToDur, typename _CF, typename _CR>  |
158 | struct __duration_cast_impl<_ToDur, _CF, _CR, false, true>  |
159 | {  |
160 | template<typename _Rep, typename _Period>  |
161 | static constexpr _ToDur  |
162 | __cast(const duration<_Rep, _Period>& __d)  |
163 | {  |
164 | typedef typename _ToDur::rep __to_rep;  |
165 | return _ToDur(static_cast<__to_rep>(  |
166 | static_cast<_CR>(__d.count()) * static_cast<_CR>(_CF::num)));  |
167 | }  |
168 | };  |
169 |   |
170 | template<typename _Tp>  |
171 | struct __is_duration  |
172 | : std::false_type  |
173 | { };  |
174 |   |
175 | template<typename _Rep, typename _Period>  |
176 | struct __is_duration<duration<_Rep, _Period>>  |
177 | : std::true_type  |
178 | { };  |
179 |   |
180 | template<typename _Tp>  |
181 | using __enable_if_is_duration  |
182 | = typename enable_if<__is_duration<_Tp>::value, _Tp>::type;  |
183 |   |
184 | template<typename _Tp>  |
185 | using __disable_if_is_duration  |
186 | = typename enable_if<!__is_duration<_Tp>::value, _Tp>::type;  |
187 |   |
188 | /// duration_cast  |
189 | template<typename _ToDur, typename _Rep, typename _Period>  |
190 | constexpr __enable_if_is_duration<_ToDur>  |
191 | duration_cast(const duration<_Rep, _Period>& __d)  |
192 | {  |
193 | typedef typename _ToDur::period __to_period;  |
194 | typedef typename _ToDur::rep __to_rep;  |
195 | typedef ratio_divide<_Period, __to_period> __cf;  |
196 | typedef typename common_type<__to_rep, _Rep, intmax_t>::type  |
197 | __cr;  |
198 | typedef __duration_cast_impl<_ToDur, __cf, __cr,  |
199 | __cf::num == 1, __cf::den == 1> __dc;  |
200 | return __dc::__cast(__d);  |
201 | }  |
202 |   |
203 | /// treat_as_floating_point  |
204 | template<typename _Rep>  |
205 | struct treat_as_floating_point  |
206 | : is_floating_point<_Rep>  |
207 | { };  |
208 |   |
209 | #if __cplusplus > 201402L  |
210 | template <typename _Rep>  |
211 | inline constexpr bool treat_as_floating_point_v =  |
212 | treat_as_floating_point<_Rep>::value;  |
213 | #endif // C++17  |
214 |   |
215 | #if __cplusplus >= 201703L  |
216 | # define __cpp_lib_chrono 201611  |
217 |   |
218 | template<typename _ToDur, typename _Rep, typename _Period>  |
219 | constexpr __enable_if_is_duration<_ToDur>  |
220 | floor(const duration<_Rep, _Period>& __d)  |
221 | {  |
222 | auto __to = chrono::duration_cast<_ToDur>(__d);  |
223 | if (__to > __d)  |
224 | return __to - _ToDur{1};  |
225 | return __to;  |
226 | }  |
227 |   |
228 | template<typename _ToDur, typename _Rep, typename _Period>  |
229 | constexpr __enable_if_is_duration<_ToDur>  |
230 | ceil(const duration<_Rep, _Period>& __d)  |
231 | {  |
232 | auto __to = chrono::duration_cast<_ToDur>(__d);  |
233 | if (__to < __d)  |
234 | return __to + _ToDur{1};  |
235 | return __to;  |
236 | }  |
237 |   |
238 | template <typename _ToDur, typename _Rep, typename _Period>  |
239 | constexpr enable_if_t<  |
240 | __and_<__is_duration<_ToDur>,  |
241 | __not_<treat_as_floating_point<typename _ToDur::rep>>>::value,  |
242 | _ToDur>  |
243 | round(const duration<_Rep, _Period>& __d)  |
244 | {  |
245 | _ToDur __t0 = chrono::floor<_ToDur>(__d);  |
246 | _ToDur __t1 = __t0 + _ToDur{1};  |
247 | auto __diff0 = __d - __t0;  |
248 | auto __diff1 = __t1 - __d;  |
249 | if (__diff0 == __diff1)  |
250 | {  |
251 | if (__t0.count() & 1)  |
252 | return __t1;  |
253 | return __t0;  |
254 | }  |
255 | else if (__diff0 < __diff1)  |
256 | return __t0;  |
257 | return __t1;  |
258 | }  |
259 |   |
260 | template<typename _Rep, typename _Period>  |
261 | constexpr  |
262 | enable_if_t<numeric_limits<_Rep>::is_signed, duration<_Rep, _Period>>  |
263 | abs(duration<_Rep, _Period> __d)  |
264 | {  |
265 | if (__d >= __d.zero())  |
266 | return __d;  |
267 | return -__d;  |
268 | }  |
269 | #endif // C++17  |
270 |   |
271 | /// duration_values  |
272 | template<typename _Rep>  |
273 | struct duration_values  |
274 | {  |
275 | static constexpr _Rep  |
276 | zero() noexcept  |
277 | { return _Rep(0); }  |
278 |   |
279 | static constexpr _Rep  |
280 | max() noexcept  |
281 | { return numeric_limits<_Rep>::max(); }  |
282 |   |
283 | static constexpr _Rep  |
284 | min() noexcept  |
285 | { return numeric_limits<_Rep>::lowest(); }  |
286 | };  |
287 |   |
288 | template<typename _Tp>  |
289 | struct __is_ratio  |
290 | : std::false_type  |
291 | { };  |
292 |   |
293 | template<intmax_t _Num, intmax_t _Den>  |
294 | struct __is_ratio<ratio<_Num, _Den>>  |
295 | : std::true_type  |
296 | { };  |
297 |   |
298 | /// duration  |
299 | template<typename _Rep, typename _Period>  |
300 | struct duration  |
301 | {  |
302 | private:  |
303 | template<typename _Rep2>  |
304 | using __is_float = treat_as_floating_point<_Rep2>;  |
305 |   |
306 | // _Period2 is an exact multiple of _Period  |
307 | template<typename _Period2>  |
308 | using __is_harmonic  |
309 | = __bool_constant<ratio_divide<_Period2, _Period>::den == 1>;  |
310 |   |
311 | public:  |
312 |   |
313 | typedef _Rep rep;  |
314 | typedef _Period period;  |
315 |   |
316 | static_assert(!__is_duration<_Rep>::value, "rep cannot be a duration" );  |
317 | static_assert(__is_ratio<_Period>::value,  |
318 | "period must be a specialization of ratio" );  |
319 | static_assert(_Period::num > 0, "period must be positive" );  |
320 |   |
321 | // 20.11.5.1 construction / copy / destroy  |
322 | constexpr duration() = default;  |
323 |   |
324 | duration(const duration&) = default;  |
325 |   |
326 | // _GLIBCXX_RESOLVE_LIB_DEFECTS  |
327 | // 3050. Conversion specification problem in chrono::duration  |
328 | template<typename _Rep2, typename = _Require<  |
329 | is_convertible<const _Rep2&, rep>,  |
330 | __or_<__is_float<rep>, __not_<__is_float<_Rep2>>>>>  |
331 | constexpr explicit duration(const _Rep2& __rep)  |
332 | : __r(static_cast<rep>(__rep)) { }  |
333 |   |
334 | template<typename _Rep2, typename _Period2, typename = _Require<  |
335 | __or_<__is_float<rep>,  |
336 | __and_<__is_harmonic<_Period2>,  |
337 | __not_<__is_float<_Rep2>>>>>>  |
338 | constexpr duration(const duration<_Rep2, _Period2>& __d)  |
339 | : __r(duration_cast<duration>(__d).count()) { }  |
340 |   |
341 | ~duration() = default;  |
342 | duration& operator=(const duration&) = default;  |
343 |   |
344 | // 20.11.5.2 observer  |
345 | constexpr rep  |
346 | count() const  |
347 | { return __r; }  |
348 |   |
349 | // 20.11.5.3 arithmetic  |
350 | constexpr duration  |
351 | operator+() const  |
352 | { return *this; }  |
353 |   |
354 | constexpr duration  |
355 | operator-() const  |
356 | { return duration(-__r); }  |
357 |   |
358 | _GLIBCXX17_CONSTEXPR duration&  |
359 | operator++()  |
360 | {  |
361 | ++__r;  |
362 | return *this;  |
363 | }  |
364 |   |
365 | _GLIBCXX17_CONSTEXPR duration  |
366 | operator++(int)  |
367 | { return duration(__r++); }  |
368 |   |
369 | _GLIBCXX17_CONSTEXPR duration&  |
370 | operator--()  |
371 | {  |
372 | --__r;  |
373 | return *this;  |
374 | }  |
375 |   |
376 | _GLIBCXX17_CONSTEXPR duration  |
377 | operator--(int)  |
378 | { return duration(__r--); }  |
379 |   |
380 | _GLIBCXX17_CONSTEXPR duration&  |
381 | operator+=(const duration& __d)  |
382 | {  |
383 | __r += __d.count();  |
384 | return *this;  |
385 | }  |
386 |   |
387 | _GLIBCXX17_CONSTEXPR duration&  |
388 | operator-=(const duration& __d)  |
389 | {  |
390 | __r -= __d.count();  |
391 | return *this;  |
392 | }  |
393 |   |
394 | _GLIBCXX17_CONSTEXPR duration&  |
395 | operator*=(const rep& __rhs)  |
396 | {  |
397 | __r *= __rhs;  |
398 | return *this;  |
399 | }  |
400 |   |
401 | _GLIBCXX17_CONSTEXPR duration&  |
402 | operator/=(const rep& __rhs)  |
403 | {  |
404 | __r /= __rhs;  |
405 | return *this;  |
406 | }  |
407 |   |
408 | // DR 934.  |
409 | template<typename _Rep2 = rep>  |
410 | _GLIBCXX17_CONSTEXPR  |
411 | typename enable_if<!treat_as_floating_point<_Rep2>::value,  |
412 | duration&>::type  |
413 | operator%=(const rep& __rhs)  |
414 | {  |
415 | __r %= __rhs;  |
416 | return *this;  |
417 | }  |
418 |   |
419 | template<typename _Rep2 = rep>  |
420 | _GLIBCXX17_CONSTEXPR  |
421 | typename enable_if<!treat_as_floating_point<_Rep2>::value,  |
422 | duration&>::type  |
423 | operator%=(const duration& __d)  |
424 | {  |
425 | __r %= __d.count();  |
426 | return *this;  |
427 | }  |
428 |   |
429 | // 20.11.5.4 special values  |
430 | static constexpr duration  |
431 | zero() noexcept  |
432 | { return duration(duration_values<rep>::zero()); }  |
433 |   |
434 | static constexpr duration  |
435 | min() noexcept  |
436 | { return duration(duration_values<rep>::min()); }  |
437 |   |
438 | static constexpr duration  |
439 | max() noexcept  |
440 | { return duration(duration_values<rep>::max()); }  |
441 |   |
442 | private:  |
443 | rep __r;  |
444 | };  |
445 |   |
446 | template<typename _Rep1, typename _Period1,  |
447 | typename _Rep2, typename _Period2>  |
448 | constexpr typename common_type<duration<_Rep1, _Period1>,  |
449 | duration<_Rep2, _Period2>>::type  |
450 | operator+(const duration<_Rep1, _Period1>& __lhs,  |
451 | const duration<_Rep2, _Period2>& __rhs)  |
452 | {  |
453 | typedef duration<_Rep1, _Period1> __dur1;  |
454 | typedef duration<_Rep2, _Period2> __dur2;  |
455 | typedef typename common_type<__dur1,__dur2>::type __cd;  |
456 | return __cd(__cd(__lhs).count() + __cd(__rhs).count());  |
457 | }  |
458 |   |
459 | template<typename _Rep1, typename _Period1,  |
460 | typename _Rep2, typename _Period2>  |
461 | constexpr typename common_type<duration<_Rep1, _Period1>,  |
462 | duration<_Rep2, _Period2>>::type  |
463 | operator-(const duration<_Rep1, _Period1>& __lhs,  |
464 | const duration<_Rep2, _Period2>& __rhs)  |
465 | {  |
466 | typedef duration<_Rep1, _Period1> __dur1;  |
467 | typedef duration<_Rep2, _Period2> __dur2;  |
468 | typedef typename common_type<__dur1,__dur2>::type __cd;  |
469 | return __cd(__cd(__lhs).count() - __cd(__rhs).count());  |
470 | }  |
471 |   |
472 | // SFINAE helper to obtain common_type<_Rep1, _Rep2> only if _Rep2  |
473 | // is implicitly convertible to it.  |
474 | // _GLIBCXX_RESOLVE_LIB_DEFECTS  |
475 | // 3050. Conversion specification problem in chrono::duration constructor  |
476 | template<typename _Rep1, typename _Rep2,  |
477 | typename _CRep = typename common_type<_Rep1, _Rep2>::type>  |
478 | using __common_rep_t = typename  |
479 | enable_if<is_convertible<const _Rep2&, _CRep>::value, _CRep>::type;  |
480 |   |
481 | template<typename _Rep1, typename _Period, typename _Rep2>  |
482 | constexpr duration<__common_rep_t<_Rep1, _Rep2>, _Period>  |
483 | operator*(const duration<_Rep1, _Period>& __d, const _Rep2& __s)  |
484 | {  |
485 | typedef duration<typename common_type<_Rep1, _Rep2>::type, _Period>  |
486 | __cd;  |
487 | return __cd(__cd(__d).count() * __s);  |
488 | }  |
489 |   |
490 | template<typename _Rep1, typename _Rep2, typename _Period>  |
491 | constexpr duration<__common_rep_t<_Rep2, _Rep1>, _Period>  |
492 | operator*(const _Rep1& __s, const duration<_Rep2, _Period>& __d)  |
493 | { return __d * __s; }  |
494 |   |
495 | template<typename _Rep1, typename _Period, typename _Rep2>  |
496 | constexpr  |
497 | duration<__common_rep_t<_Rep1, __disable_if_is_duration<_Rep2>>, _Period>  |
498 | operator/(const duration<_Rep1, _Period>& __d, const _Rep2& __s)  |
499 | {  |
500 | typedef duration<typename common_type<_Rep1, _Rep2>::type, _Period>  |
501 | __cd;  |
502 | return __cd(__cd(__d).count() / __s);  |
503 | }  |
504 |   |
505 | template<typename _Rep1, typename _Period1,  |
506 | typename _Rep2, typename _Period2>  |
507 | constexpr typename common_type<_Rep1, _Rep2>::type  |
508 | operator/(const duration<_Rep1, _Period1>& __lhs,  |
509 | const duration<_Rep2, _Period2>& __rhs)  |
510 | {  |
511 | typedef duration<_Rep1, _Period1> __dur1;  |
512 | typedef duration<_Rep2, _Period2> __dur2;  |
513 | typedef typename common_type<__dur1,__dur2>::type __cd;  |
514 | return __cd(__lhs).count() / __cd(__rhs).count();  |
515 | }  |
516 |   |
517 | // DR 934.  |
518 | template<typename _Rep1, typename _Period, typename _Rep2>  |
519 | constexpr  |
520 | duration<__common_rep_t<_Rep1, __disable_if_is_duration<_Rep2>>, _Period>  |
521 | operator%(const duration<_Rep1, _Period>& __d, const _Rep2& __s)  |
522 | {  |
523 | typedef duration<typename common_type<_Rep1, _Rep2>::type, _Period>  |
524 | __cd;  |
525 | return __cd(__cd(__d).count() % __s);  |
526 | }  |
527 |   |
528 | template<typename _Rep1, typename _Period1,  |
529 | typename _Rep2, typename _Period2>  |
530 | constexpr typename common_type<duration<_Rep1, _Period1>,  |
531 | duration<_Rep2, _Period2>>::type  |
532 | operator%(const duration<_Rep1, _Period1>& __lhs,  |
533 | const duration<_Rep2, _Period2>& __rhs)  |
534 | {  |
535 | typedef duration<_Rep1, _Period1> __dur1;  |
536 | typedef duration<_Rep2, _Period2> __dur2;  |
537 | typedef typename common_type<__dur1,__dur2>::type __cd;  |
538 | return __cd(__cd(__lhs).count() % __cd(__rhs).count());  |
539 | }  |
540 |   |
541 | // comparisons  |
542 | template<typename _Rep1, typename _Period1,  |
543 | typename _Rep2, typename _Period2>  |
544 | constexpr bool  |
545 | operator==(const duration<_Rep1, _Period1>& __lhs,  |
546 | const duration<_Rep2, _Period2>& __rhs)  |
547 | {  |
548 | typedef duration<_Rep1, _Period1> __dur1;  |
549 | typedef duration<_Rep2, _Period2> __dur2;  |
550 | typedef typename common_type<__dur1,__dur2>::type __ct;  |
551 | return __ct(__lhs).count() == __ct(__rhs).count();  |
552 | }  |
553 |   |
554 | template<typename _Rep1, typename _Period1,  |
555 | typename _Rep2, typename _Period2>  |
556 | constexpr bool  |
557 | operator<(const duration<_Rep1, _Period1>& __lhs,  |
558 | const duration<_Rep2, _Period2>& __rhs)  |
559 | {  |
560 | typedef duration<_Rep1, _Period1> __dur1;  |
561 | typedef duration<_Rep2, _Period2> __dur2;  |
562 | typedef typename common_type<__dur1,__dur2>::type __ct;  |
563 | return __ct(__lhs).count() < __ct(__rhs).count();  |
564 | }  |
565 |   |
566 | template<typename _Rep1, typename _Period1,  |
567 | typename _Rep2, typename _Period2>  |
568 | constexpr bool  |
569 | operator!=(const duration<_Rep1, _Period1>& __lhs,  |
570 | const duration<_Rep2, _Period2>& __rhs)  |
571 | { return !(__lhs == __rhs); }  |
572 |   |
573 | template<typename _Rep1, typename _Period1,  |
574 | typename _Rep2, typename _Period2>  |
575 | constexpr bool  |
576 | operator<=(const duration<_Rep1, _Period1>& __lhs,  |
577 | const duration<_Rep2, _Period2>& __rhs)  |
578 | { return !(__rhs < __lhs); }  |
579 |   |
580 | template<typename _Rep1, typename _Period1,  |
581 | typename _Rep2, typename _Period2>  |
582 | constexpr bool  |
583 | operator>(const duration<_Rep1, _Period1>& __lhs,  |
584 | const duration<_Rep2, _Period2>& __rhs)  |
585 | { return __rhs < __lhs; }  |
586 |   |
587 | template<typename _Rep1, typename _Period1,  |
588 | typename _Rep2, typename _Period2>  |
589 | constexpr bool  |
590 | operator>=(const duration<_Rep1, _Period1>& __lhs,  |
591 | const duration<_Rep2, _Period2>& __rhs)  |
592 | { return !(__lhs < __rhs); }  |
593 |   |
594 | #ifdef _GLIBCXX_USE_C99_STDINT_TR1  |
595 | # define _GLIBCXX_CHRONO_INT64_T int64_t  |
596 | #elif defined __INT64_TYPE__  |
597 | # define _GLIBCXX_CHRONO_INT64_T __INT64_TYPE__  |
598 | #else  |
599 | static_assert(std::numeric_limits<unsigned long long>::digits >= 64,  |
600 | "Representation type for nanoseconds must have at least 64 bits" );  |
601 | # define _GLIBCXX_CHRONO_INT64_T long long  |
602 | #endif  |
603 |   |
604 | /// nanoseconds  |
605 | typedef duration<_GLIBCXX_CHRONO_INT64_T, nano> nanoseconds;  |
606 |   |
607 | /// microseconds  |
608 | typedef duration<_GLIBCXX_CHRONO_INT64_T, micro> microseconds;  |
609 |   |
610 | /// milliseconds  |
611 | typedef duration<_GLIBCXX_CHRONO_INT64_T, milli> milliseconds;  |
612 |   |
613 | /// seconds  |
614 | typedef duration<_GLIBCXX_CHRONO_INT64_T> seconds;  |
615 |   |
616 | /// minutes  |
617 | typedef duration<_GLIBCXX_CHRONO_INT64_T, ratio< 60>> minutes;  |
618 |   |
619 | /// hours  |
620 | typedef duration<_GLIBCXX_CHRONO_INT64_T, ratio<3600>> hours;  |
621 |   |
622 | #undef _GLIBCXX_CHRONO_INT64_T  |
623 |   |
624 | /// time_point  |
625 | template<typename _Clock, typename _Dur>  |
626 | struct time_point  |
627 | {  |
628 | typedef _Clock clock;  |
629 | typedef _Dur duration;  |
630 | typedef typename duration::rep rep;  |
631 | typedef typename duration::period period;  |
632 |   |
633 | constexpr time_point() : __d(duration::zero())  |
634 | { }  |
635 |   |
636 | constexpr explicit time_point(const duration& __dur)  |
637 | : __d(__dur)  |
638 | { }  |
639 |   |
640 | // conversions  |
641 | template<typename _Dur2,  |
642 | typename = _Require<is_convertible<_Dur2, _Dur>>>  |
643 | constexpr time_point(const time_point<clock, _Dur2>& __t)  |
644 | : __d(__t.time_since_epoch())  |
645 | { }  |
646 |   |
647 | // observer  |
648 | constexpr duration  |
649 | time_since_epoch() const  |
650 | { return __d; }  |
651 |   |
652 | // arithmetic  |
653 | _GLIBCXX17_CONSTEXPR time_point&  |
654 | operator+=(const duration& __dur)  |
655 | {  |
656 | __d += __dur;  |
657 | return *this;  |
658 | }  |
659 |   |
660 | _GLIBCXX17_CONSTEXPR time_point&  |
661 | operator-=(const duration& __dur)  |
662 | {  |
663 | __d -= __dur;  |
664 | return *this;  |
665 | }  |
666 |   |
667 | // special values  |
668 | static constexpr time_point  |
669 | min() noexcept  |
670 | { return time_point(duration::min()); }  |
671 |   |
672 | static constexpr time_point  |
673 | max() noexcept  |
674 | { return time_point(duration::max()); }  |
675 |   |
676 | private:  |
677 | duration __d;  |
678 | };  |
679 |   |
680 | /// time_point_cast  |
681 | template<typename _ToDur, typename _Clock, typename _Dur>  |
682 | constexpr typename enable_if<__is_duration<_ToDur>::value,  |
683 | time_point<_Clock, _ToDur>>::type  |
684 | time_point_cast(const time_point<_Clock, _Dur>& __t)  |
685 | {  |
686 | typedef time_point<_Clock, _ToDur> __time_point;  |
687 | return __time_point(duration_cast<_ToDur>(__t.time_since_epoch()));  |
688 | }  |
689 |   |
690 | #if __cplusplus > 201402L  |
691 | template<typename _ToDur, typename _Clock, typename _Dur>  |
692 | constexpr  |
693 | enable_if_t<__is_duration<_ToDur>::value, time_point<_Clock, _ToDur>>  |
694 | floor(const time_point<_Clock, _Dur>& __tp)  |
695 | {  |
696 | return time_point<_Clock, _ToDur>{  |
697 | chrono::floor<_ToDur>(__tp.time_since_epoch())};  |
698 | }  |
699 |   |
700 | template<typename _ToDur, typename _Clock, typename _Dur>  |
701 | constexpr  |
702 | enable_if_t<__is_duration<_ToDur>::value, time_point<_Clock, _ToDur>>  |
703 | ceil(const time_point<_Clock, _Dur>& __tp)  |
704 | {  |
705 | return time_point<_Clock, _ToDur>{  |
706 | chrono::ceil<_ToDur>(__tp.time_since_epoch())};  |
707 | }  |
708 |   |
709 | template<typename _ToDur, typename _Clock, typename _Dur>  |
710 | constexpr enable_if_t<  |
711 | __and_<__is_duration<_ToDur>,  |
712 | __not_<treat_as_floating_point<typename _ToDur::rep>>>::value,  |
713 | time_point<_Clock, _ToDur>>  |
714 | round(const time_point<_Clock, _Dur>& __tp)  |
715 | {  |
716 | return time_point<_Clock, _ToDur>{  |
717 | chrono::round<_ToDur>(__tp.time_since_epoch())};  |
718 | }  |
719 | #endif // C++17  |
720 |   |
721 | template<typename _Clock, typename _Dur1,  |
722 | typename _Rep2, typename _Period2>  |
723 | constexpr time_point<_Clock,  |
724 | typename common_type<_Dur1, duration<_Rep2, _Period2>>::type>  |
725 | operator+(const time_point<_Clock, _Dur1>& __lhs,  |
726 | const duration<_Rep2, _Period2>& __rhs)  |
727 | {  |
728 | typedef duration<_Rep2, _Period2> __dur2;  |
729 | typedef typename common_type<_Dur1,__dur2>::type __ct;  |
730 | typedef time_point<_Clock, __ct> __time_point;  |
731 | return __time_point(__lhs.time_since_epoch() + __rhs);  |
732 | }  |
733 |   |
734 | template<typename _Rep1, typename _Period1,  |
735 | typename _Clock, typename _Dur2>  |
736 | constexpr time_point<_Clock,  |
737 | typename common_type<duration<_Rep1, _Period1>, _Dur2>::type>  |
738 | operator+(const duration<_Rep1, _Period1>& __lhs,  |
739 | const time_point<_Clock, _Dur2>& __rhs)  |
740 | {  |
741 | typedef duration<_Rep1, _Period1> __dur1;  |
742 | typedef typename common_type<__dur1,_Dur2>::type __ct;  |
743 | typedef time_point<_Clock, __ct> __time_point;  |
744 | return __time_point(__rhs.time_since_epoch() + __lhs);  |
745 | }  |
746 |   |
747 | template<typename _Clock, typename _Dur1,  |
748 | typename _Rep2, typename _Period2>  |
749 | constexpr time_point<_Clock,  |
750 | typename common_type<_Dur1, duration<_Rep2, _Period2>>::type>  |
751 | operator-(const time_point<_Clock, _Dur1>& __lhs,  |
752 | const duration<_Rep2, _Period2>& __rhs)  |
753 | {  |
754 | typedef duration<_Rep2, _Period2> __dur2;  |
755 | typedef typename common_type<_Dur1,__dur2>::type __ct;  |
756 | typedef time_point<_Clock, __ct> __time_point;  |
757 | return __time_point(__lhs.time_since_epoch() -__rhs);  |
758 | }  |
759 |   |
760 | template<typename _Clock, typename _Dur1, typename _Dur2>  |
761 | constexpr typename common_type<_Dur1, _Dur2>::type  |
762 | operator-(const time_point<_Clock, _Dur1>& __lhs,  |
763 | const time_point<_Clock, _Dur2>& __rhs)  |
764 | { return __lhs.time_since_epoch() - __rhs.time_since_epoch(); }  |
765 |   |
766 | template<typename _Clock, typename _Dur1, typename _Dur2>  |
767 | constexpr bool  |
768 | operator==(const time_point<_Clock, _Dur1>& __lhs,  |
769 | const time_point<_Clock, _Dur2>& __rhs)  |
770 | { return __lhs.time_since_epoch() == __rhs.time_since_epoch(); }  |
771 |   |
772 | template<typename _Clock, typename _Dur1, typename _Dur2>  |
773 | constexpr bool  |
774 | operator!=(const time_point<_Clock, _Dur1>& __lhs,  |
775 | const time_point<_Clock, _Dur2>& __rhs)  |
776 | { return !(__lhs == __rhs); }  |
777 |   |
778 | template<typename _Clock, typename _Dur1, typename _Dur2>  |
779 | constexpr bool  |
780 | operator<(const time_point<_Clock, _Dur1>& __lhs,  |
781 | const time_point<_Clock, _Dur2>& __rhs)  |
782 | { return __lhs.time_since_epoch() < __rhs.time_since_epoch(); }  |
783 |   |
784 | template<typename _Clock, typename _Dur1, typename _Dur2>  |
785 | constexpr bool  |
786 | operator<=(const time_point<_Clock, _Dur1>& __lhs,  |
787 | const time_point<_Clock, _Dur2>& __rhs)  |
788 | { return !(__rhs < __lhs); }  |
789 |   |
790 | template<typename _Clock, typename _Dur1, typename _Dur2>  |
791 | constexpr bool  |
792 | operator>(const time_point<_Clock, _Dur1>& __lhs,  |
793 | const time_point<_Clock, _Dur2>& __rhs)  |
794 | { return __rhs < __lhs; }  |
795 |   |
796 | template<typename _Clock, typename _Dur1, typename _Dur2>  |
797 | constexpr bool  |
798 | operator>=(const time_point<_Clock, _Dur1>& __lhs,  |
799 | const time_point<_Clock, _Dur2>& __rhs)  |
800 | { return !(__lhs < __rhs); }  |
801 |   |
802 |   |
803 | // Clocks.  |
804 |   |
805 | // Why nanosecond resolution as the default?  |
806 | // Why have std::system_clock always count in the highest  |
807 | // resolution (ie nanoseconds), even if on some OSes the low 3  |
808 | // or 9 decimal digits will be always zero? This allows later  |
809 | // implementations to change the system_clock::now()  |
810 | // implementation any time to provide better resolution without  |
811 | // changing function signature or units.  |
812 |   |
813 | // To support the (forward) evolution of the library's defined  |
814 | // clocks, wrap inside inline namespace so that the current  |
815 | // defintions of system_clock, steady_clock, and  |
816 | // high_resolution_clock types are uniquely mangled. This way, new  |
817 | // code can use the latests clocks, while the library can contain  |
818 | // compatibility definitions for previous versions. At some  |
819 | // point, when these clocks settle down, the inlined namespaces  |
820 | // can be removed. XXX GLIBCXX_ABI Deprecated  |
821 | inline namespace _V2 {  |
822 |   |
823 | /**  |
824 | * @brief System clock.  |
825 | *  |
826 | * Time returned represents wall time from the system-wide clock.  |
827 | */  |
828 | struct system_clock  |
829 | {  |
830 | typedef chrono::nanoseconds duration;  |
831 | typedef duration::rep rep;  |
832 | typedef duration::period period;  |
833 | typedef chrono::time_point<system_clock, duration> time_point;  |
834 |   |
835 | static_assert(system_clock::duration::min()  |
836 | < system_clock::duration::zero(),  |
837 | "a clock's minimum duration cannot be less than its epoch" );  |
838 |   |
839 | static constexpr bool is_steady = false;  |
840 |   |
841 | static time_point  |
842 | now() noexcept;  |
843 |   |
844 | // Map to C API  |
845 | static std::time_t  |
846 | to_time_t(const time_point& __t) noexcept  |
847 | {  |
848 | return std::time_t(duration_cast<chrono::seconds>  |
849 | (__t.time_since_epoch()).count());  |
850 | }  |
851 |   |
852 | static time_point  |
853 | from_time_t(std::time_t __t) noexcept  |
854 | {  |
855 | typedef chrono::time_point<system_clock, seconds> __from;  |
856 | return time_point_cast<system_clock::duration>  |
857 | (__from(chrono::seconds(__t)));  |
858 | }  |
859 | };  |
860 |   |
861 |   |
862 | /**  |
863 | * @brief Monotonic clock  |
864 | *  |
865 | * Time returned has the property of only increasing at a uniform rate.  |
866 | */  |
867 | struct steady_clock  |
868 | {  |
869 | typedef chrono::nanoseconds duration;  |
870 | typedef duration::rep rep;  |
871 | typedef duration::period period;  |
872 | typedef chrono::time_point<steady_clock, duration> time_point;  |
873 |   |
874 | static constexpr bool is_steady = true;  |
875 |   |
876 | static time_point  |
877 | now() noexcept;  |
878 | };  |
879 |   |
880 |   |
881 | /**  |
882 | * @brief Highest-resolution clock  |
883 | *  |
884 | * This is the clock "with the shortest tick period." Alias to  |
885 | * std::system_clock until higher-than-nanosecond definitions  |
886 | * become feasible.  |
887 | */  |
888 | using high_resolution_clock = system_clock;  |
889 |   |
890 | } // end inline namespace _V2  |
891 | } // namespace chrono  |
892 |   |
893 | #if __cplusplus > 201103L  |
894 |   |
895 | #define __cpp_lib_chrono_udls 201304  |
896 |   |
897 | inline namespace literals  |
898 | {  |
899 | inline namespace chrono_literals  |
900 | {  |
901 | #pragma GCC diagnostic push  |
902 | #pragma GCC diagnostic ignored "-Wliteral-suffix"  |
903 | template<typename _Dur, char... _Digits>  |
904 | constexpr _Dur __check_overflow()  |
905 | {  |
906 | using _Val = __parse_int::_Parse_int<_Digits...>;  |
907 | constexpr typename _Dur::rep __repval = _Val::value;  |
908 | static_assert(__repval >= 0 && __repval == _Val::value,  |
909 | "literal value cannot be represented by duration type" );  |
910 | return _Dur(__repval);  |
911 | }  |
912 |   |
913 | constexpr chrono::duration<long double, ratio<3600,1>>  |
914 | operator""h (long double __hours)  |
915 | { return chrono::duration<long double, ratio<3600,1>>{__hours}; }  |
916 |   |
917 | template <char... _Digits>  |
918 | constexpr chrono::hours  |
919 | operator""h ()  |
920 | { return __check_overflow<chrono::hours, _Digits...>(); }  |
921 |   |
922 | constexpr chrono::duration<long double, ratio<60,1>>  |
923 | operator""min (long double __mins)  |
924 | { return chrono::duration<long double, ratio<60,1>>{__mins}; }  |
925 |   |
926 | template <char... _Digits>  |
927 | constexpr chrono::minutes  |
928 | operator""min ()  |
929 | { return __check_overflow<chrono::minutes, _Digits...>(); }  |
930 |   |
931 | constexpr chrono::duration<long double>  |
932 | operator""s (long double __secs)  |
933 | { return chrono::duration<long double>{__secs}; }  |
934 |   |
935 | template <char... _Digits>  |
936 | constexpr chrono::seconds  |
937 | operator""s ()  |
938 | { return __check_overflow<chrono::seconds, _Digits...>(); }  |
939 |   |
940 | constexpr chrono::duration<long double, milli>  |
941 | operator""ms (long double __msecs)  |
942 | { return chrono::duration<long double, milli>{__msecs}; }  |
943 |   |
944 | template <char... _Digits>  |
945 | constexpr chrono::milliseconds  |
946 | operator""ms ()  |
947 | { return __check_overflow<chrono::milliseconds, _Digits...>(); }  |
948 |   |
949 | constexpr chrono::duration<long double, micro>  |
950 | operator""us (long double __usecs)  |
951 | { return chrono::duration<long double, micro>{__usecs}; }  |
952 |   |
953 | template <char... _Digits>  |
954 | constexpr chrono::microseconds  |
955 | operator""us ()  |
956 | { return __check_overflow<chrono::microseconds, _Digits...>(); }  |
957 |   |
958 | constexpr chrono::duration<long double, nano>  |
959 | operator""ns (long double __nsecs)  |
960 | { return chrono::duration<long double, nano>{__nsecs}; }  |
961 |   |
962 | template <char... _Digits>  |
963 | constexpr chrono::nanoseconds  |
964 | operator""ns ()  |
965 | { return __check_overflow<chrono::nanoseconds, _Digits...>(); }  |
966 |   |
967 | #pragma GCC diagnostic pop  |
968 | } // inline namespace chrono_literals  |
969 | } // inline namespace literals  |
970 |   |
971 | namespace chrono  |
972 | {  |
973 | using namespace literals::chrono_literals;  |
974 | } // namespace chrono  |
975 |   |
976 | #endif // C++14  |
977 |   |
978 | // @} group chrono  |
979 |   |
980 | _GLIBCXX_END_NAMESPACE_VERSION  |
981 | } // namespace std  |
982 |   |
983 | #endif // C++11  |
984 |   |
985 | #endif //_GLIBCXX_CHRONO  |
986 | |