Import GCC-8 to a new vendor branch
[dragonfly.git] / contrib / gcc-8.0 / libstdc++-v3 / include / std / chrono
1 // <chrono> -*- C++ -*-
2
3 // Copyright (C) 2008-2018 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 #ifdef _GLIBCXX_USE_C99_STDINT_TR1
45
46 namespace std _GLIBCXX_VISIBILITY(default)
47 {
48 _GLIBCXX_BEGIN_NAMESPACE_VERSION
49
50   /**
51    * @defgroup chrono Time
52    * @ingroup utilities
53    *
54    * Classes and functions for time.
55    * @{
56    */
57
58   /** @namespace std::chrono
59    *  @brief ISO C++ 2011 entities sub-namespace for time and date.
60    */
61   namespace chrono
62   {
63     template<typename _Rep, typename _Period = ratio<1>>
64       struct duration;
65
66     template<typename _Clock, typename _Dur = typename _Clock::duration>
67       struct time_point;
68   }
69
70   // 20.11.4.3 specialization of common_type (for duration, sfinae-friendly)
71
72   template<typename _CT, typename _Period1, typename _Period2>
73     struct __duration_common_type_wrapper
74     {
75     private:
76       typedef __static_gcd<_Period1::num, _Period2::num> __gcd_num;
77       typedef __static_gcd<_Period1::den, _Period2::den> __gcd_den;
78       typedef typename _CT::type __cr;
79       typedef ratio<__gcd_num::value,
80         (_Period1::den / __gcd_den::value) * _Period2::den> __r;
81     public:
82       typedef __success_type<chrono::duration<__cr, __r>> type;
83     };
84
85   template<typename _Period1, typename _Period2>
86     struct __duration_common_type_wrapper<__failure_type, _Period1, _Period2>
87     { typedef __failure_type type; };
88
89   template<typename _Rep1, typename _Period1, typename _Rep2, typename _Period2>
90     struct common_type<chrono::duration<_Rep1, _Period1>,
91              chrono::duration<_Rep2, _Period2>>
92     : public __duration_common_type_wrapper<typename __member_type_wrapper<
93              common_type<_Rep1, _Rep2>>::type, _Period1, _Period2>::type
94     { };
95
96   // 20.11.4.3 specialization of common_type (for time_point, sfinae-friendly)
97
98   template<typename _CT, typename _Clock>
99     struct __timepoint_common_type_wrapper
100     {
101       typedef __success_type<chrono::time_point<_Clock, typename _CT::type>>
102         type;
103     };
104
105   template<typename _Clock>
106     struct __timepoint_common_type_wrapper<__failure_type, _Clock>
107     { typedef __failure_type type; };
108
109   template<typename _Clock, typename _Duration1, typename _Duration2>
110     struct common_type<chrono::time_point<_Clock, _Duration1>,
111              chrono::time_point<_Clock, _Duration2>>
112     : public __timepoint_common_type_wrapper<typename __member_type_wrapper<
113              common_type<_Duration1, _Duration2>>::type, _Clock>::type
114     { };
115
116   namespace chrono
117   {
118     // Primary template for duration_cast impl.
119     template<typename _ToDur, typename _CF, typename _CR,
120              bool _NumIsOne = false, bool _DenIsOne = false>
121       struct __duration_cast_impl
122       {
123         template<typename _Rep, typename _Period>
124           static constexpr _ToDur
125           __cast(const duration<_Rep, _Period>& __d)
126           {
127             typedef typename _ToDur::rep                        __to_rep;
128             return _ToDur(static_cast<__to_rep>(static_cast<_CR>(__d.count())
129               * static_cast<_CR>(_CF::num)
130               / static_cast<_CR>(_CF::den)));
131           }
132       };
133
134     template<typename _ToDur, typename _CF, typename _CR>
135       struct __duration_cast_impl<_ToDur, _CF, _CR, true, true>
136       {
137         template<typename _Rep, typename _Period>
138           static constexpr _ToDur
139           __cast(const duration<_Rep, _Period>& __d)
140           {
141             typedef typename _ToDur::rep                        __to_rep;
142             return _ToDur(static_cast<__to_rep>(__d.count()));
143           }
144       };
145
146     template<typename _ToDur, typename _CF, typename _CR>
147       struct __duration_cast_impl<_ToDur, _CF, _CR, true, false>
148       {
149         template<typename _Rep, typename _Period>
150           static constexpr _ToDur
151           __cast(const duration<_Rep, _Period>& __d)
152           {
153             typedef typename _ToDur::rep                        __to_rep;
154             return _ToDur(static_cast<__to_rep>(
155               static_cast<_CR>(__d.count()) / static_cast<_CR>(_CF::den)));
156           }
157       };
158
159     template<typename _ToDur, typename _CF, typename _CR>
160       struct __duration_cast_impl<_ToDur, _CF, _CR, false, true>
161       {
162         template<typename _Rep, typename _Period>
163           static constexpr _ToDur
164           __cast(const duration<_Rep, _Period>& __d)
165           {
166             typedef typename _ToDur::rep                        __to_rep;
167             return _ToDur(static_cast<__to_rep>(
168               static_cast<_CR>(__d.count()) * static_cast<_CR>(_CF::num)));
169           }
170       };
171
172     template<typename _Tp>
173       struct __is_duration
174       : std::false_type
175       { };
176
177     template<typename _Rep, typename _Period>
178       struct __is_duration<duration<_Rep, _Period>>
179       : std::true_type
180       { };
181
182     template<typename _Tp>
183       using __enable_if_is_duration
184         = typename enable_if<__is_duration<_Tp>::value, _Tp>::type;
185
186     template<typename _Tp>
187       using __disable_if_is_duration
188         = typename enable_if<!__is_duration<_Tp>::value, _Tp>::type;
189
190     /// duration_cast
191     template<typename _ToDur, typename _Rep, typename _Period>
192       constexpr __enable_if_is_duration<_ToDur>
193       duration_cast(const duration<_Rep, _Period>& __d)
194       {
195         typedef typename _ToDur::period                         __to_period;
196         typedef typename _ToDur::rep                            __to_rep;
197         typedef ratio_divide<_Period, __to_period>              __cf;
198         typedef typename common_type<__to_rep, _Rep, intmax_t>::type
199                                                                 __cr;
200         typedef  __duration_cast_impl<_ToDur, __cf, __cr,
201                                       __cf::num == 1, __cf::den == 1> __dc;
202         return __dc::__cast(__d);
203       }
204
205     /// treat_as_floating_point
206     template<typename _Rep>
207       struct treat_as_floating_point
208       : is_floating_point<_Rep>
209       { };
210
211 #if __cplusplus > 201402L
212     template <typename _Rep>
213       inline constexpr bool treat_as_floating_point_v =
214         treat_as_floating_point<_Rep>::value;
215 #endif // C++17
216
217 #if __cplusplus >= 201703L
218 # define __cpp_lib_chrono 201611
219
220     template<typename _ToDur, typename _Rep, typename _Period>
221       constexpr __enable_if_is_duration<_ToDur>
222       floor(const duration<_Rep, _Period>& __d)
223       {
224         auto __to = chrono::duration_cast<_ToDur>(__d);
225         if (__to > __d)
226           return __to - _ToDur{1};
227         return __to;
228       }
229
230     template<typename _ToDur, typename _Rep, typename _Period>
231       constexpr __enable_if_is_duration<_ToDur>
232       ceil(const duration<_Rep, _Period>& __d)
233       {
234         auto __to = chrono::duration_cast<_ToDur>(__d);
235         if (__to < __d)
236           return __to + _ToDur{1};
237         return __to;
238       }
239
240     template <typename _ToDur, typename _Rep, typename _Period>
241       constexpr enable_if_t<
242         __and_<__is_duration<_ToDur>,
243                __not_<treat_as_floating_point<typename _ToDur::rep>>>::value,
244         _ToDur>
245       round(const duration<_Rep, _Period>& __d)
246       {
247         _ToDur __t0 = chrono::floor<_ToDur>(__d);
248         _ToDur __t1 = __t0 + _ToDur{1};
249         auto __diff0 = __d - __t0;
250         auto __diff1 = __t1 - __d;
251         if (__diff0 == __diff1)
252         {
253             if (__t0.count() & 1)
254                 return __t1;
255             return __t0;
256         }
257         else if (__diff0 < __diff1)
258             return __t0;
259         return __t1;
260       }
261
262     template<typename _Rep, typename _Period>
263       constexpr
264       enable_if_t<numeric_limits<_Rep>::is_signed, duration<_Rep, _Period>>
265       abs(duration<_Rep, _Period> __d)
266       {
267         if (__d >= __d.zero())
268           return __d;
269         return -__d;
270       }
271 #endif // C++17
272
273     /// duration_values
274     template<typename _Rep>
275       struct duration_values
276       {
277         static constexpr _Rep
278         zero()
279         { return _Rep(0); }
280
281         static constexpr _Rep
282         max()
283         { return numeric_limits<_Rep>::max(); }
284
285         static constexpr _Rep
286         min()
287         { return numeric_limits<_Rep>::lowest(); }
288       };
289
290     template<typename _Tp>
291       struct __is_ratio
292       : std::false_type
293       { };
294
295     template<intmax_t _Num, intmax_t _Den>
296       struct __is_ratio<ratio<_Num, _Den>>
297       : std::true_type
298       { };
299
300     /// duration
301     template<typename _Rep, typename _Period>
302       struct duration
303       {
304       private:
305         template<typename _Rep2>
306           using __is_float = treat_as_floating_point<_Rep2>;
307
308         // _Period2 is an exact multiple of _Period
309         template<typename _Period2>
310           using __is_harmonic
311             = __bool_constant<ratio_divide<_Period2, _Period>::den == 1>;
312
313       public:
314
315         typedef _Rep                                            rep;
316         typedef _Period                                         period;
317
318         static_assert(!__is_duration<_Rep>::value, "rep cannot be a duration");
319         static_assert(__is_ratio<_Period>::value,
320                       "period must be a specialization of ratio");
321         static_assert(_Period::num > 0, "period must be positive");
322
323         // 20.11.5.1 construction / copy / destroy
324         constexpr duration() = default;
325
326         duration(const duration&) = default;
327
328         template<typename _Rep2, typename = _Require<
329                  is_convertible<_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()
432         { return duration(duration_values<rep>::zero()); }
433
434         static constexpr duration
435         min()
436         { return duration(duration_values<rep>::min()); }
437
438         static constexpr duration
439         max()
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     template<typename _Rep1, typename _Rep2,
475              typename _CRep = typename common_type<_Rep1, _Rep2>::type>
476       using __common_rep_t
477         = typename enable_if<is_convertible<_Rep2, _CRep>::value, _CRep>::type;
478
479     template<typename _Rep1, typename _Period, typename _Rep2>
480       constexpr duration<__common_rep_t<_Rep1, _Rep2>, _Period>
481       operator*(const duration<_Rep1, _Period>& __d, const _Rep2& __s)
482       {
483         typedef duration<typename common_type<_Rep1, _Rep2>::type, _Period>
484           __cd;
485         return __cd(__cd(__d).count() * __s);
486       }
487
488     template<typename _Rep1, typename _Rep2, typename _Period>
489       constexpr duration<__common_rep_t<_Rep2, _Rep1>, _Period>
490       operator*(const _Rep1& __s, const duration<_Rep2, _Period>& __d)
491       { return __d * __s; }
492
493     template<typename _Rep1, typename _Period, typename _Rep2>
494       constexpr
495       duration<__common_rep_t<_Rep1, __disable_if_is_duration<_Rep2>>, _Period>
496       operator/(const duration<_Rep1, _Period>& __d, const _Rep2& __s)
497       {
498         typedef duration<typename common_type<_Rep1, _Rep2>::type, _Period>
499           __cd;
500         return __cd(__cd(__d).count() / __s);
501       }
502
503     template<typename _Rep1, typename _Period1,
504              typename _Rep2, typename _Period2>
505       constexpr typename common_type<_Rep1, _Rep2>::type
506       operator/(const duration<_Rep1, _Period1>& __lhs,
507                 const duration<_Rep2, _Period2>& __rhs)
508       {
509         typedef duration<_Rep1, _Period1>                       __dur1;
510         typedef duration<_Rep2, _Period2>                       __dur2;
511         typedef typename common_type<__dur1,__dur2>::type       __cd;
512         return __cd(__lhs).count() / __cd(__rhs).count();
513       }
514
515     // DR 934.
516     template<typename _Rep1, typename _Period, typename _Rep2>
517       constexpr
518       duration<__common_rep_t<_Rep1, __disable_if_is_duration<_Rep2>>, _Period>
519       operator%(const duration<_Rep1, _Period>& __d, const _Rep2& __s)
520       {
521         typedef duration<typename common_type<_Rep1, _Rep2>::type, _Period>
522           __cd;
523         return __cd(__cd(__d).count() % __s);
524       }
525
526     template<typename _Rep1, typename _Period1,
527              typename _Rep2, typename _Period2>
528       constexpr typename common_type<duration<_Rep1, _Period1>,
529                                      duration<_Rep2, _Period2>>::type
530       operator%(const duration<_Rep1, _Period1>& __lhs,
531                 const duration<_Rep2, _Period2>& __rhs)
532       {
533         typedef duration<_Rep1, _Period1>                       __dur1;
534         typedef duration<_Rep2, _Period2>                       __dur2;
535         typedef typename common_type<__dur1,__dur2>::type       __cd;
536         return __cd(__cd(__lhs).count() % __cd(__rhs).count());
537       }
538
539     // comparisons
540     template<typename _Rep1, typename _Period1,
541              typename _Rep2, typename _Period2>
542       constexpr bool
543       operator==(const duration<_Rep1, _Period1>& __lhs,
544                  const duration<_Rep2, _Period2>& __rhs)
545       {
546         typedef duration<_Rep1, _Period1>                       __dur1;
547         typedef duration<_Rep2, _Period2>                       __dur2;
548         typedef typename common_type<__dur1,__dur2>::type       __ct;
549         return __ct(__lhs).count() == __ct(__rhs).count();
550       }
551
552     template<typename _Rep1, typename _Period1,
553              typename _Rep2, typename _Period2>
554       constexpr bool
555       operator<(const duration<_Rep1, _Period1>& __lhs,
556                 const duration<_Rep2, _Period2>& __rhs)
557       {
558         typedef duration<_Rep1, _Period1>                       __dur1;
559         typedef duration<_Rep2, _Period2>                       __dur2;
560         typedef typename common_type<__dur1,__dur2>::type       __ct;
561         return __ct(__lhs).count() < __ct(__rhs).count();
562       }
563
564     template<typename _Rep1, typename _Period1,
565              typename _Rep2, typename _Period2>
566       constexpr bool
567       operator!=(const duration<_Rep1, _Period1>& __lhs,
568                  const duration<_Rep2, _Period2>& __rhs)
569       { return !(__lhs == __rhs); }
570
571     template<typename _Rep1, typename _Period1,
572              typename _Rep2, typename _Period2>
573       constexpr bool
574       operator<=(const duration<_Rep1, _Period1>& __lhs,
575                  const duration<_Rep2, _Period2>& __rhs)
576       { return !(__rhs < __lhs); }
577
578     template<typename _Rep1, typename _Period1,
579              typename _Rep2, typename _Period2>
580       constexpr bool
581       operator>(const duration<_Rep1, _Period1>& __lhs,
582                 const duration<_Rep2, _Period2>& __rhs)
583       { return __rhs < __lhs; }
584
585     template<typename _Rep1, typename _Period1,
586              typename _Rep2, typename _Period2>
587       constexpr bool
588       operator>=(const duration<_Rep1, _Period1>& __lhs,
589                  const duration<_Rep2, _Period2>& __rhs)
590       { return !(__lhs < __rhs); }
591
592     /// nanoseconds
593     typedef duration<int64_t, nano>         nanoseconds;
594
595     /// microseconds
596     typedef duration<int64_t, micro>        microseconds;
597
598     /// milliseconds
599     typedef duration<int64_t, milli>        milliseconds;
600
601     /// seconds
602     typedef duration<int64_t>               seconds;
603
604     /// minutes
605     typedef duration<int64_t, ratio< 60>>   minutes;
606
607     /// hours
608     typedef duration<int64_t, ratio<3600>>  hours;
609
610     /// time_point
611     template<typename _Clock, typename _Dur>
612       struct time_point
613       {
614         typedef _Clock                                          clock;
615         typedef _Dur                                            duration;
616         typedef typename duration::rep                          rep;
617         typedef typename duration::period                       period;
618
619         constexpr time_point() : __d(duration::zero())
620         { }
621
622         constexpr explicit time_point(const duration& __dur)
623         : __d(__dur)
624         { }
625
626         // conversions
627         template<typename _Dur2,
628                  typename = _Require<is_convertible<_Dur2, _Dur>>>
629           constexpr time_point(const time_point<clock, _Dur2>& __t)
630           : __d(__t.time_since_epoch())
631           { }
632
633         // observer
634         constexpr duration
635         time_since_epoch() const
636         { return __d; }
637
638         // arithmetic
639         _GLIBCXX17_CONSTEXPR time_point&
640         operator+=(const duration& __dur)
641         {
642           __d += __dur;
643           return *this;
644         }
645
646         _GLIBCXX17_CONSTEXPR time_point&
647         operator-=(const duration& __dur)
648         {
649           __d -= __dur;
650           return *this;
651         }
652
653         // special values
654         static constexpr time_point
655         min()
656         { return time_point(duration::min()); }
657
658         static constexpr time_point
659         max()
660         { return time_point(duration::max()); }
661
662       private:
663         duration __d;
664       };
665
666     /// time_point_cast
667     template<typename _ToDur, typename _Clock, typename _Dur>
668       constexpr typename enable_if<__is_duration<_ToDur>::value,
669                                    time_point<_Clock, _ToDur>>::type
670       time_point_cast(const time_point<_Clock, _Dur>& __t)
671       {
672         typedef time_point<_Clock, _ToDur>                      __time_point;
673         return __time_point(duration_cast<_ToDur>(__t.time_since_epoch()));
674       }
675
676 #if __cplusplus > 201402L
677     template<typename _ToDur, typename _Clock, typename _Dur>
678       constexpr
679       enable_if_t<__is_duration<_ToDur>::value, time_point<_Clock, _ToDur>>
680       floor(const time_point<_Clock, _Dur>& __tp)
681       {
682         return time_point<_Clock, _ToDur>{
683             chrono::floor<_ToDur>(__tp.time_since_epoch())};
684       }
685
686     template<typename _ToDur, typename _Clock, typename _Dur>
687       constexpr
688       enable_if_t<__is_duration<_ToDur>::value, time_point<_Clock, _ToDur>>
689       ceil(const time_point<_Clock, _Dur>& __tp)
690       {
691         return time_point<_Clock, _ToDur>{
692             chrono::ceil<_ToDur>(__tp.time_since_epoch())};
693       }
694
695     template<typename _ToDur, typename _Clock, typename _Dur>
696       constexpr enable_if_t<
697         __and_<__is_duration<_ToDur>,
698                __not_<treat_as_floating_point<typename _ToDur::rep>>>::value,
699         time_point<_Clock, _ToDur>>
700       round(const time_point<_Clock, _Dur>& __tp)
701       {
702         return time_point<_Clock, _ToDur>{
703             chrono::round<_ToDur>(__tp.time_since_epoch())};
704       }
705 #endif // C++17
706
707     template<typename _Clock, typename _Dur1,
708              typename _Rep2, typename _Period2>
709       constexpr time_point<_Clock,
710         typename common_type<_Dur1, duration<_Rep2, _Period2>>::type>
711       operator+(const time_point<_Clock, _Dur1>& __lhs,
712                 const duration<_Rep2, _Period2>& __rhs)
713       {
714         typedef duration<_Rep2, _Period2>                       __dur2;
715         typedef typename common_type<_Dur1,__dur2>::type        __ct;
716         typedef time_point<_Clock, __ct>                        __time_point;
717         return __time_point(__lhs.time_since_epoch() + __rhs);
718       }
719
720     template<typename _Rep1, typename _Period1,
721              typename _Clock, typename _Dur2>
722       constexpr time_point<_Clock,
723         typename common_type<duration<_Rep1, _Period1>, _Dur2>::type>
724       operator+(const duration<_Rep1, _Period1>& __lhs,
725                 const time_point<_Clock, _Dur2>& __rhs)
726       {
727         typedef duration<_Rep1, _Period1>                       __dur1;
728         typedef typename common_type<__dur1,_Dur2>::type        __ct;
729         typedef time_point<_Clock, __ct>                        __time_point;
730         return __time_point(__rhs.time_since_epoch() + __lhs);
731       }
732
733     template<typename _Clock, typename _Dur1,
734              typename _Rep2, typename _Period2>
735       constexpr time_point<_Clock,
736         typename common_type<_Dur1, duration<_Rep2, _Period2>>::type>
737       operator-(const time_point<_Clock, _Dur1>& __lhs,
738                 const duration<_Rep2, _Period2>& __rhs)
739       {
740         typedef duration<_Rep2, _Period2>                       __dur2;
741         typedef typename common_type<_Dur1,__dur2>::type        __ct;
742         typedef time_point<_Clock, __ct>                        __time_point;
743         return __time_point(__lhs.time_since_epoch() -__rhs);
744       }
745
746     template<typename _Clock, typename _Dur1, typename _Dur2>
747       constexpr typename common_type<_Dur1, _Dur2>::type
748       operator-(const time_point<_Clock, _Dur1>& __lhs,
749                 const time_point<_Clock, _Dur2>& __rhs)
750       { return __lhs.time_since_epoch() - __rhs.time_since_epoch(); }
751
752     template<typename _Clock, typename _Dur1, typename _Dur2>
753       constexpr bool
754       operator==(const time_point<_Clock, _Dur1>& __lhs,
755                  const time_point<_Clock, _Dur2>& __rhs)
756       { return __lhs.time_since_epoch() == __rhs.time_since_epoch(); }
757
758     template<typename _Clock, typename _Dur1, typename _Dur2>
759       constexpr bool
760       operator!=(const time_point<_Clock, _Dur1>& __lhs,
761                  const time_point<_Clock, _Dur2>& __rhs)
762       { return !(__lhs == __rhs); }
763
764     template<typename _Clock, typename _Dur1, typename _Dur2>
765       constexpr bool
766       operator<(const time_point<_Clock, _Dur1>& __lhs,
767                 const time_point<_Clock, _Dur2>& __rhs)
768       { return  __lhs.time_since_epoch() < __rhs.time_since_epoch(); }
769
770     template<typename _Clock, typename _Dur1, typename _Dur2>
771       constexpr bool
772       operator<=(const time_point<_Clock, _Dur1>& __lhs,
773                  const time_point<_Clock, _Dur2>& __rhs)
774       { return !(__rhs < __lhs); }
775
776     template<typename _Clock, typename _Dur1, typename _Dur2>
777       constexpr bool
778       operator>(const time_point<_Clock, _Dur1>& __lhs,
779                 const time_point<_Clock, _Dur2>& __rhs)
780       { return __rhs < __lhs; }
781
782     template<typename _Clock, typename _Dur1, typename _Dur2>
783       constexpr bool
784       operator>=(const time_point<_Clock, _Dur1>& __lhs,
785                  const time_point<_Clock, _Dur2>& __rhs)
786       { return !(__lhs < __rhs); }
787
788
789     // Clocks.
790
791     // Why nanosecond resolution as the default?
792     // Why have std::system_clock always count in the highest
793     // resolution (ie nanoseconds), even if on some OSes the low 3
794     // or 9 decimal digits will be always zero? This allows later
795     // implementations to change the system_clock::now()
796     // implementation any time to provide better resolution without
797     // changing function signature or units.
798
799     // To support the (forward) evolution of the library's defined
800     // clocks, wrap inside inline namespace so that the current
801     // defintions of system_clock, steady_clock, and
802     // high_resolution_clock types are uniquely mangled. This way, new
803     // code can use the latests clocks, while the library can contain
804     // compatibility definitions for previous versions.  At some
805     // point, when these clocks settle down, the inlined namespaces
806     // can be removed.  XXX GLIBCXX_ABI Deprecated
807     inline namespace _V2 {
808
809     /**
810      *  @brief System clock.
811      *
812      *  Time returned represents wall time from the system-wide clock.
813     */
814     struct system_clock
815     {
816       typedef chrono::nanoseconds                               duration;
817       typedef duration::rep                                     rep;
818       typedef duration::period                                  period;
819       typedef chrono::time_point<system_clock, duration>        time_point;
820
821       static_assert(system_clock::duration::min()
822                     < system_clock::duration::zero(),
823                     "a clock's minimum duration cannot be less than its epoch");
824
825       static constexpr bool is_steady = false;
826
827       static time_point
828       now() noexcept;
829
830       // Map to C API
831       static std::time_t
832       to_time_t(const time_point& __t) noexcept
833       {
834         return std::time_t(duration_cast<chrono::seconds>
835                            (__t.time_since_epoch()).count());
836       }
837
838       static time_point
839       from_time_t(std::time_t __t) noexcept
840       {
841         typedef chrono::time_point<system_clock, seconds>       __from;
842         return time_point_cast<system_clock::duration>
843                (__from(chrono::seconds(__t)));
844       }
845     };
846
847
848     /**
849      *  @brief Monotonic clock
850      *
851      *  Time returned has the property of only increasing at a uniform rate.
852     */
853     struct steady_clock
854     {
855       typedef chrono::nanoseconds                               duration;
856       typedef duration::rep                                     rep;
857       typedef duration::period                                  period;
858       typedef chrono::time_point<steady_clock, duration>        time_point;
859
860       static constexpr bool is_steady = true;
861
862       static time_point
863       now() noexcept;
864     };
865
866
867     /**
868      *  @brief Highest-resolution clock
869      *
870      *  This is the clock "with the shortest tick period." Alias to
871      *  std::system_clock until higher-than-nanosecond definitions
872      *  become feasible.
873     */
874     using high_resolution_clock = system_clock;
875
876     } // end inline namespace _V2
877   } // namespace chrono
878
879 #if __cplusplus > 201103L
880
881 #define __cpp_lib_chrono_udls 201304
882
883   inline namespace literals
884   {
885   inline namespace chrono_literals
886   {
887 #pragma GCC diagnostic push
888 #pragma GCC diagnostic ignored "-Wliteral-suffix"
889     template<typename _Rep, unsigned long long _Val>
890       struct _Checked_integral_constant
891       : integral_constant<_Rep, static_cast<_Rep>(_Val)>
892       {
893         static_assert(_Checked_integral_constant::value >= 0
894                       && _Checked_integral_constant::value == _Val,
895                       "literal value cannot be represented by duration type");
896       };
897
898     template<typename _Dur, char... _Digits>
899       constexpr _Dur __check_overflow()
900       {
901         using _Val = __parse_int::_Parse_int<_Digits...>;
902         using _Rep = typename _Dur::rep;
903         // TODO: should be simply integral_constant<_Rep, _Val::value>
904         // but GCC doesn't reject narrowing conversions to _Rep.
905         using _CheckedVal = _Checked_integral_constant<_Rep, _Val::value>;
906         return _Dur{_CheckedVal::value};
907       }
908
909     constexpr chrono::duration<long double, ratio<3600,1>>
910     operator""h(long double __hours)
911     { return chrono::duration<long double, ratio<3600,1>>{__hours}; }
912
913     template <char... _Digits>
914       constexpr chrono::hours
915       operator""h()
916       { return __check_overflow<chrono::hours, _Digits...>(); }
917
918     constexpr chrono::duration<long double, ratio<60,1>>
919     operator""min(long double __mins)
920     { return chrono::duration<long double, ratio<60,1>>{__mins}; }
921
922     template <char... _Digits>
923       constexpr chrono::minutes
924       operator""min()
925       { return __check_overflow<chrono::minutes, _Digits...>(); }
926
927     constexpr chrono::duration<long double>
928     operator""s(long double __secs)
929     { return chrono::duration<long double>{__secs}; }
930
931     template <char... _Digits>
932       constexpr chrono::seconds
933       operator""s()
934       { return __check_overflow<chrono::seconds, _Digits...>(); }
935
936     constexpr chrono::duration<long double, milli>
937     operator""ms(long double __msecs)
938     { return chrono::duration<long double, milli>{__msecs}; }
939
940     template <char... _Digits>
941       constexpr chrono::milliseconds
942       operator""ms()
943       { return __check_overflow<chrono::milliseconds, _Digits...>(); }
944
945     constexpr chrono::duration<long double, micro>
946     operator""us(long double __usecs)
947     { return chrono::duration<long double, micro>{__usecs}; }
948
949     template <char... _Digits>
950       constexpr chrono::microseconds
951       operator""us()
952       { return __check_overflow<chrono::microseconds, _Digits...>(); }
953
954     constexpr chrono::duration<long double, nano>
955     operator""ns(long double __nsecs)
956     { return chrono::duration<long double, nano>{__nsecs}; }
957
958     template <char... _Digits>
959       constexpr chrono::nanoseconds
960       operator""ns()
961       { return __check_overflow<chrono::nanoseconds, _Digits...>(); }
962
963 #pragma GCC diagnostic pop
964   } // inline namespace chrono_literals
965   } // inline namespace literals
966
967   namespace chrono
968   {
969     using namespace literals::chrono_literals;
970   } // namespace chrono
971
972 #endif // C++14
973
974   // @} group chrono
975
976 _GLIBCXX_END_NAMESPACE_VERSION
977 } // namespace std
978
979 #endif //_GLIBCXX_USE_C99_STDINT_TR1
980
981 #endif // C++11
982
983 #endif //_GLIBCXX_CHRONO