Reverting merge from trunk
[official-gcc.git] / libstdc++-v3 / include / std / chrono
blobb4ccca985ef99771c085495f93366c4378b2912c
1 // <chrono> -*- C++ -*-
3 // Copyright (C) 2008-2013 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.
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.
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.
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/>.
25 /** @file include/chrono
26  *  This is a Standard C++ Library header.
27  */
29 #ifndef _GLIBCXX_CHRONO
30 #define _GLIBCXX_CHRONO 1
32 #pragma GCC system_header
34 #if __cplusplus < 201103L
35 # include <bits/c++0x_warning.h>
36 #else
38 #include <ratio>
39 #include <type_traits>
40 #include <limits>
41 #include <ctime>
42 #include <bits/parse_numbers.h> // for literals support.
44 #ifdef _GLIBCXX_USE_C99_STDINT_TR1
46 namespace std _GLIBCXX_VISIBILITY(default)
48   /**
49    * @defgroup chrono Time
50    * @ingroup utilities
51    *
52    * Classes and functions for time.
53    * @{
54    */
56   /** @namespace std::chrono
57    *  @brief ISO C++ 2011 entities sub-namespace for time and date.
58    */
59   namespace chrono
60   {
61   _GLIBCXX_BEGIN_NAMESPACE_VERSION
63     template<typename _Rep, typename _Period = ratio<1>>
64       struct duration;
66     template<typename _Clock, typename _Dur = typename _Clock::duration>
67       struct time_point;
69   _GLIBCXX_END_NAMESPACE_VERSION
70   }
72 _GLIBCXX_BEGIN_NAMESPACE_VERSION
74   // 20.11.4.3 specialization of common_type (for duration, sfinae-friendly)
75   
76   template<typename _CT, typename _Period1, typename _Period2>
77     struct __duration_common_type_wrapper
78     {
79     private:
80       typedef __static_gcd<_Period1::num, _Period2::num> __gcd_num;
81       typedef __static_gcd<_Period1::den, _Period2::den> __gcd_den;
82       typedef typename _CT::type __cr;
83       typedef ratio<__gcd_num::value,
84         (_Period1::den / __gcd_den::value) * _Period2::den> __r;
85     public:
86       typedef __success_type<chrono::duration<__cr, __r>> type;
87     };
89   template<typename _Period1, typename _Period2>
90     struct __duration_common_type_wrapper<__failure_type, _Period1, _Period2>
91     { typedef __failure_type type; };
93   template<typename _Rep1, typename _Period1, typename _Rep2, typename _Period2>
94     struct common_type<chrono::duration<_Rep1, _Period1>,
95              chrono::duration<_Rep2, _Period2>>
96     : public __duration_common_type_wrapper<typename __member_type_wrapper<
97              common_type<_Rep1, _Rep2>>::type, _Period1, _Period2>::type
98     { };
100   // 20.11.4.3 specialization of common_type (for time_point, sfinae-friendly)
101   
102   template<typename _CT, typename _Clock>
103     struct __timepoint_common_type_wrapper
104     {
105       typedef __success_type<chrono::time_point<_Clock, typename _CT::type>>
106         type;
107     };
109   template<typename _Clock>
110     struct __timepoint_common_type_wrapper<__failure_type, _Clock>
111     { typedef __failure_type type; };
113   template<typename _Clock, typename _Duration1, typename _Duration2>
114     struct common_type<chrono::time_point<_Clock, _Duration1>,
115              chrono::time_point<_Clock, _Duration2>>
116     : public __timepoint_common_type_wrapper<typename __member_type_wrapper<
117              common_type<_Duration1, _Duration2>>::type, _Clock>::type
118     { };
120 _GLIBCXX_END_NAMESPACE_VERSION
122   namespace chrono
123   {
124   _GLIBCXX_BEGIN_NAMESPACE_VERSION
126     // Primary template for duration_cast impl.
127     template<typename _ToDur, typename _CF, typename _CR,
128              bool _NumIsOne = false, bool _DenIsOne = false>
129       struct __duration_cast_impl
130       {
131         template<typename _Rep, typename _Period>
132           static constexpr _ToDur
133           __cast(const duration<_Rep, _Period>& __d)
134           {
135             typedef typename _ToDur::rep                        __to_rep;
136             return _ToDur(static_cast<__to_rep>(static_cast<_CR>(__d.count())
137               * static_cast<_CR>(_CF::num)
138               / static_cast<_CR>(_CF::den)));
139           }
140       };
142     template<typename _ToDur, typename _CF, typename _CR>
143       struct __duration_cast_impl<_ToDur, _CF, _CR, true, true>
144       {
145         template<typename _Rep, typename _Period>
146           static constexpr _ToDur
147           __cast(const duration<_Rep, _Period>& __d)
148           {
149             typedef typename _ToDur::rep                        __to_rep;
150             return _ToDur(static_cast<__to_rep>(__d.count()));
151           }
152       };
154     template<typename _ToDur, typename _CF, typename _CR>
155       struct __duration_cast_impl<_ToDur, _CF, _CR, true, false>
156       {
157         template<typename _Rep, typename _Period>
158           static constexpr _ToDur
159           __cast(const duration<_Rep, _Period>& __d)
160           {
161             typedef typename _ToDur::rep                        __to_rep;
162             return _ToDur(static_cast<__to_rep>(
163               static_cast<_CR>(__d.count()) / static_cast<_CR>(_CF::den)));
164           }
165       };
167     template<typename _ToDur, typename _CF, typename _CR>
168       struct __duration_cast_impl<_ToDur, _CF, _CR, false, true>
169       {
170         template<typename _Rep, typename _Period>
171           static constexpr _ToDur
172           __cast(const duration<_Rep, _Period>& __d)
173           {
174             typedef typename _ToDur::rep                        __to_rep;
175             return _ToDur(static_cast<__to_rep>(
176               static_cast<_CR>(__d.count()) * static_cast<_CR>(_CF::num)));
177           }
178       };
180     template<typename _Tp>
181       struct __is_duration
182       : std::false_type
183       { };
185     template<typename _Rep, typename _Period>
186       struct __is_duration<duration<_Rep, _Period>>
187       : std::true_type
188       { };
190     /// duration_cast
191     template<typename _ToDur, typename _Rep, typename _Period>
192       constexpr typename enable_if<__is_duration<_ToDur>::value,
193                                    _ToDur>::type
194       duration_cast(const duration<_Rep, _Period>& __d)
195       {
196         typedef typename _ToDur::period                         __to_period;
197         typedef typename _ToDur::rep                            __to_rep;
198         typedef ratio_divide<_Period, __to_period>              __cf;
199         typedef typename common_type<__to_rep, _Rep, intmax_t>::type
200                                                                 __cr;
201         typedef  __duration_cast_impl<_ToDur, __cf, __cr,
202                                       __cf::num == 1, __cf::den == 1> __dc;
203         return __dc::__cast(__d);
204       }
206     /// treat_as_floating_point
207     template<typename _Rep>
208       struct treat_as_floating_point
209       : is_floating_point<_Rep>
210       { };
212     /// duration_values
213     template<typename _Rep>
214       struct duration_values
215       {
216         static constexpr _Rep
217         zero()
218         { return _Rep(0); }
220         static constexpr _Rep
221         max()
222         { return numeric_limits<_Rep>::max(); }
224         static constexpr _Rep
225         min()
226         { return numeric_limits<_Rep>::lowest(); }
227       };
229     template<typename _Tp>
230       struct __is_ratio
231       : std::false_type
232       { };
234     template<intmax_t _Num, intmax_t _Den>
235       struct __is_ratio<ratio<_Num, _Den>>
236       : std::true_type
237       { };
239     /// duration
240     template<typename _Rep, typename _Period>
241       struct duration
242       {
243         typedef _Rep                                            rep;
244         typedef _Period                                         period;
246         static_assert(!__is_duration<_Rep>::value, "rep cannot be a duration");
247         static_assert(__is_ratio<_Period>::value,
248                       "period must be a specialization of ratio");
249         static_assert(_Period::num > 0, "period must be positive");
251         // 20.11.5.1 construction / copy / destroy
252         constexpr duration() = default;
254         // NB: Make constexpr implicit. This cannot be explicitly
255         // constexpr, as any UDT that is not a literal type with a
256         // constexpr copy constructor will be ill-formed.
257         duration(const duration&) = default;
259         template<typename _Rep2, typename = typename
260                enable_if<is_convertible<_Rep2, rep>::value
261                          && (treat_as_floating_point<rep>::value
262                              || !treat_as_floating_point<_Rep2>::value)>::type>
263           constexpr explicit duration(const _Rep2& __rep)
264           : __r(static_cast<rep>(__rep)) { }
266         template<typename _Rep2, typename _Period2, typename = typename
267                enable_if<treat_as_floating_point<rep>::value
268                          || (ratio_divide<_Period2, period>::den == 1
269                              && !treat_as_floating_point<_Rep2>::value)>::type>
270           constexpr duration(const duration<_Rep2, _Period2>& __d)
271           : __r(duration_cast<duration>(__d).count()) { }
273         ~duration() = default;
274         duration& operator=(const duration&) = default;
276         // 20.11.5.2 observer
277         constexpr rep
278         count() const
279         { return __r; }
281         // 20.11.5.3 arithmetic
282         constexpr duration
283         operator+() const
284         { return *this; }
286         constexpr duration
287         operator-() const
288         { return duration(-__r); }
290         duration&
291         operator++()
292         {
293           ++__r;
294           return *this;
295         }
297         duration
298         operator++(int)
299         { return duration(__r++); }
301         duration&
302         operator--()
303         {
304           --__r;
305           return *this;
306         }
308         duration
309         operator--(int)
310         { return duration(__r--); }
312         duration&
313         operator+=(const duration& __d)
314         {
315           __r += __d.count();
316           return *this;
317         }
319         duration&
320         operator-=(const duration& __d)
321         {
322           __r -= __d.count();
323           return *this;
324         }
326         duration&
327         operator*=(const rep& __rhs)
328         {
329           __r *= __rhs;
330           return *this;
331         }
333         duration&
334         operator/=(const rep& __rhs)
335         {
336           __r /= __rhs;
337           return *this;
338         }
340         // DR 934.
341         template<typename _Rep2 = rep>
342           typename enable_if<!treat_as_floating_point<_Rep2>::value,
343                              duration&>::type
344           operator%=(const rep& __rhs)
345           {
346             __r %= __rhs;
347             return *this;
348           }
350         template<typename _Rep2 = rep>
351           typename enable_if<!treat_as_floating_point<_Rep2>::value,
352                              duration&>::type
353           operator%=(const duration& __d)
354           {
355             __r %= __d.count();
356             return *this;
357           }
359         // 20.11.5.4 special values
360         static constexpr duration
361         zero()
362         { return duration(duration_values<rep>::zero()); }
364         static constexpr duration
365         min()
366         { return duration(duration_values<rep>::min()); }
368         static constexpr duration
369         max()
370         { return duration(duration_values<rep>::max()); }
372       private:
373         rep __r;
374       };
376     template<typename _Rep1, typename _Period1,
377              typename _Rep2, typename _Period2>
378       constexpr typename common_type<duration<_Rep1, _Period1>,
379                                      duration<_Rep2, _Period2>>::type
380       operator+(const duration<_Rep1, _Period1>& __lhs,
381                 const duration<_Rep2, _Period2>& __rhs)
382       {
383         typedef duration<_Rep1, _Period1>                       __dur1;
384         typedef duration<_Rep2, _Period2>                       __dur2;
385         typedef typename common_type<__dur1,__dur2>::type       __cd;
386         return __cd(__cd(__lhs).count() + __cd(__rhs).count());
387       }
389     template<typename _Rep1, typename _Period1,
390              typename _Rep2, typename _Period2>
391       constexpr typename common_type<duration<_Rep1, _Period1>,
392                                      duration<_Rep2, _Period2>>::type
393       operator-(const duration<_Rep1, _Period1>& __lhs,
394                 const duration<_Rep2, _Period2>& __rhs)
395       {
396         typedef duration<_Rep1, _Period1>                       __dur1;
397         typedef duration<_Rep2, _Period2>                       __dur2;
398         typedef typename common_type<__dur1,__dur2>::type       __cd;
399         return __cd(__cd(__lhs).count() - __cd(__rhs).count());
400       }
402     template<typename _Rep1, typename _Rep2, bool =
403              is_convertible<_Rep2,
404                             typename common_type<_Rep1, _Rep2>::type>::value>
405       struct __common_rep_type { };
407     template<typename _Rep1, typename _Rep2>
408       struct __common_rep_type<_Rep1, _Rep2, true>
409       { typedef typename common_type<_Rep1, _Rep2>::type type; };
411     template<typename _Rep1, typename _Period, typename _Rep2>
412       constexpr
413       duration<typename __common_rep_type<_Rep1, _Rep2>::type, _Period>
414       operator*(const duration<_Rep1, _Period>& __d, const _Rep2& __s)
415       {
416         typedef duration<typename common_type<_Rep1, _Rep2>::type, _Period>
417           __cd;
418         return __cd(__cd(__d).count() * __s);
419       }
421     template<typename _Rep1, typename _Rep2, typename _Period>
422       constexpr
423       duration<typename __common_rep_type<_Rep2, _Rep1>::type, _Period>
424       operator*(const _Rep1& __s, const duration<_Rep2, _Period>& __d)
425       { return __d * __s; }
427     template<typename _Rep1, typename _Period, typename _Rep2>
428       constexpr duration<typename __common_rep_type<_Rep1, typename
429         enable_if<!__is_duration<_Rep2>::value, _Rep2>::type>::type, _Period>
430       operator/(const duration<_Rep1, _Period>& __d, const _Rep2& __s)
431       {
432         typedef duration<typename common_type<_Rep1, _Rep2>::type, _Period>
433           __cd;
434         return __cd(__cd(__d).count() / __s);
435       }
437     template<typename _Rep1, typename _Period1,
438              typename _Rep2, typename _Period2>
439       constexpr typename common_type<_Rep1, _Rep2>::type
440       operator/(const duration<_Rep1, _Period1>& __lhs,
441                 const duration<_Rep2, _Period2>& __rhs)
442       {
443         typedef duration<_Rep1, _Period1>                       __dur1;
444         typedef duration<_Rep2, _Period2>                       __dur2;
445         typedef typename common_type<__dur1,__dur2>::type       __cd;
446         return __cd(__lhs).count() / __cd(__rhs).count();
447       }
449     // DR 934.
450     template<typename _Rep1, typename _Period, typename _Rep2>
451       constexpr duration<typename __common_rep_type<_Rep1, typename
452         enable_if<!__is_duration<_Rep2>::value, _Rep2>::type>::type, _Period>
453       operator%(const duration<_Rep1, _Period>& __d, const _Rep2& __s)
454       {
455         typedef duration<typename common_type<_Rep1, _Rep2>::type, _Period>
456           __cd;
457         return __cd(__cd(__d).count() % __s);
458       }
460     template<typename _Rep1, typename _Period1,
461              typename _Rep2, typename _Period2>
462       constexpr typename common_type<duration<_Rep1, _Period1>,
463                                      duration<_Rep2, _Period2>>::type
464       operator%(const duration<_Rep1, _Period1>& __lhs,
465                 const duration<_Rep2, _Period2>& __rhs)
466       {
467         typedef duration<_Rep1, _Period1>                       __dur1;
468         typedef duration<_Rep2, _Period2>                       __dur2;
469         typedef typename common_type<__dur1,__dur2>::type       __cd;
470         return __cd(__cd(__lhs).count() % __cd(__rhs).count());
471       }
473     // comparisons
474     template<typename _Rep1, typename _Period1,
475              typename _Rep2, typename _Period2>
476       constexpr bool
477       operator==(const duration<_Rep1, _Period1>& __lhs,
478                  const duration<_Rep2, _Period2>& __rhs)
479       {
480         typedef duration<_Rep1, _Period1>                       __dur1;
481         typedef duration<_Rep2, _Period2>                       __dur2;
482         typedef typename common_type<__dur1,__dur2>::type       __ct;
483         return __ct(__lhs).count() == __ct(__rhs).count();
484       }
486     template<typename _Rep1, typename _Period1,
487              typename _Rep2, typename _Period2>
488       constexpr bool
489       operator<(const duration<_Rep1, _Period1>& __lhs,
490                 const duration<_Rep2, _Period2>& __rhs)
491       {
492         typedef duration<_Rep1, _Period1>                       __dur1;
493         typedef duration<_Rep2, _Period2>                       __dur2;
494         typedef typename common_type<__dur1,__dur2>::type       __ct;
495         return __ct(__lhs).count() < __ct(__rhs).count();
496       }
498     template<typename _Rep1, typename _Period1,
499              typename _Rep2, typename _Period2>
500       constexpr bool
501       operator!=(const duration<_Rep1, _Period1>& __lhs,
502                  const duration<_Rep2, _Period2>& __rhs)
503       { return !(__lhs == __rhs); }
505     template<typename _Rep1, typename _Period1,
506              typename _Rep2, typename _Period2>
507       constexpr bool
508       operator<=(const duration<_Rep1, _Period1>& __lhs,
509                  const duration<_Rep2, _Period2>& __rhs)
510       { return !(__rhs < __lhs); }
512     template<typename _Rep1, typename _Period1,
513              typename _Rep2, typename _Period2>
514       constexpr bool
515       operator>(const duration<_Rep1, _Period1>& __lhs,
516                 const duration<_Rep2, _Period2>& __rhs)
517       { return __rhs < __lhs; }
519     template<typename _Rep1, typename _Period1,
520              typename _Rep2, typename _Period2>
521       constexpr bool
522       operator>=(const duration<_Rep1, _Period1>& __lhs,
523                  const duration<_Rep2, _Period2>& __rhs)
524       { return !(__lhs < __rhs); }
526     /// nanoseconds
527     typedef duration<int64_t, nano>         nanoseconds;
529     /// microseconds
530     typedef duration<int64_t, micro>        microseconds;
532     /// milliseconds
533     typedef duration<int64_t, milli>        milliseconds;
535     /// seconds
536     typedef duration<int64_t>               seconds;
538     /// minutes
539     typedef duration<int64_t, ratio< 60>>   minutes;
541     /// hours
542     typedef duration<int64_t, ratio<3600>>  hours;
544     /// time_point
545     template<typename _Clock, typename _Dur>
546       struct time_point
547       {
548         typedef _Clock                                          clock;
549         typedef _Dur                                            duration;
550         typedef typename duration::rep                          rep;
551         typedef typename duration::period                       period;
553         constexpr time_point() : __d(duration::zero())
554         { }
556         constexpr explicit time_point(const duration& __dur)
557         : __d(__dur)
558         { }
560         // conversions
561         template<typename _Dur2>
562           constexpr time_point(const time_point<clock, _Dur2>& __t)
563           : __d(__t.time_since_epoch())
564           { }
566         // observer
567         constexpr duration
568         time_since_epoch() const
569         { return __d; }
571         // arithmetic
572         time_point&
573         operator+=(const duration& __dur)
574         {
575           __d += __dur;
576           return *this;
577         }
579         time_point&
580         operator-=(const duration& __dur)
581         {
582           __d -= __dur;
583           return *this;
584         }
586         // special values
587         static constexpr time_point
588         min()
589         { return time_point(duration::min()); }
591         static constexpr time_point
592         max()
593         { return time_point(duration::max()); }
595       private:
596         duration __d;
597       };
599     /// time_point_cast
600     template<typename _ToDur, typename _Clock, typename _Dur>
601       constexpr typename enable_if<__is_duration<_ToDur>::value,
602                                    time_point<_Clock, _ToDur>>::type
603       time_point_cast(const time_point<_Clock, _Dur>& __t)
604       {
605         typedef time_point<_Clock, _ToDur>                      __time_point;
606         return __time_point(duration_cast<_ToDur>(__t.time_since_epoch()));
607       }
609     template<typename _Clock, typename _Dur1,
610              typename _Rep2, typename _Period2>
611       constexpr time_point<_Clock,
612         typename common_type<_Dur1, duration<_Rep2, _Period2>>::type>
613       operator+(const time_point<_Clock, _Dur1>& __lhs,
614                 const duration<_Rep2, _Period2>& __rhs)
615       {
616         typedef duration<_Rep2, _Period2>                       __dur2;
617         typedef typename common_type<_Dur1,__dur2>::type        __ct;
618         typedef time_point<_Clock, __ct>                        __time_point;
619         return __time_point(__lhs.time_since_epoch() + __rhs);
620       }
622     template<typename _Rep1, typename _Period1,
623              typename _Clock, typename _Dur2>
624       constexpr time_point<_Clock,
625         typename common_type<duration<_Rep1, _Period1>, _Dur2>::type>
626       operator+(const duration<_Rep1, _Period1>& __lhs,
627                 const time_point<_Clock, _Dur2>& __rhs)
628       { 
629         typedef duration<_Rep1, _Period1>                       __dur1;
630         typedef typename common_type<__dur1,_Dur2>::type        __ct;
631         typedef time_point<_Clock, __ct>                        __time_point;
632         return __time_point(__rhs.time_since_epoch() + __lhs); 
633       }
635     template<typename _Clock, typename _Dur1,
636              typename _Rep2, typename _Period2>
637       constexpr time_point<_Clock,
638         typename common_type<_Dur1, duration<_Rep2, _Period2>>::type>
639       operator-(const time_point<_Clock, _Dur1>& __lhs,
640                 const duration<_Rep2, _Period2>& __rhs)
641       { 
642         typedef duration<_Rep2, _Period2>                       __dur2;
643         typedef typename common_type<_Dur1,__dur2>::type        __ct;
644         typedef time_point<_Clock, __ct>                        __time_point;
645         return __time_point(__lhs.time_since_epoch() -__rhs); 
646       }
648     template<typename _Clock, typename _Dur1, typename _Dur2>
649       constexpr typename common_type<_Dur1, _Dur2>::type
650       operator-(const time_point<_Clock, _Dur1>& __lhs,
651                 const time_point<_Clock, _Dur2>& __rhs)
652       { return __lhs.time_since_epoch() - __rhs.time_since_epoch(); }
654     template<typename _Clock, typename _Dur1, typename _Dur2>
655       constexpr bool
656       operator==(const time_point<_Clock, _Dur1>& __lhs,
657                  const time_point<_Clock, _Dur2>& __rhs)
658       { return __lhs.time_since_epoch() == __rhs.time_since_epoch(); }
660     template<typename _Clock, typename _Dur1, typename _Dur2>
661       constexpr bool
662       operator!=(const time_point<_Clock, _Dur1>& __lhs,
663                  const time_point<_Clock, _Dur2>& __rhs)
664       { return !(__lhs == __rhs); }
666     template<typename _Clock, typename _Dur1, typename _Dur2>
667       constexpr bool
668       operator<(const time_point<_Clock, _Dur1>& __lhs,
669                 const time_point<_Clock, _Dur2>& __rhs)
670       { return  __lhs.time_since_epoch() < __rhs.time_since_epoch(); }
672     template<typename _Clock, typename _Dur1, typename _Dur2>
673       constexpr bool
674       operator<=(const time_point<_Clock, _Dur1>& __lhs,
675                  const time_point<_Clock, _Dur2>& __rhs)
676       { return !(__rhs < __lhs); }
678     template<typename _Clock, typename _Dur1, typename _Dur2>
679       constexpr bool
680       operator>(const time_point<_Clock, _Dur1>& __lhs,
681                 const time_point<_Clock, _Dur2>& __rhs)
682       { return __rhs < __lhs; }
684     template<typename _Clock, typename _Dur1, typename _Dur2>
685       constexpr bool
686       operator>=(const time_point<_Clock, _Dur1>& __lhs,
687                  const time_point<_Clock, _Dur2>& __rhs)
688       { return !(__lhs < __rhs); }
691     // Clocks. 
693     // Why nanosecond resolution as the default?  
694     // Why have std::system_clock always count in the higest
695     // resolution (ie nanoseconds), even if on some OSes the low 3
696     // or 9 decimal digits will be always zero? This allows later
697     // implementations to change the system_clock::now()
698     // implementation any time to provide better resolution without
699     // changing function signature or units.
701     // To support the (forward) evolution of the library's defined
702     // clocks, wrap inside inline namespace so that the current
703     // defintions of system_clock, steady_clock, and
704     // high_resolution_clock types are uniquely mangled. This way, new
705     // code can use the latests clocks, while the library can contain
706     // compatibility definitions for previous versions.  At some
707     // point, when these clocks settle down, the inlined namespaces
708     // can be removed.  XXX GLIBCXX_ABI Deprecated
709     inline namespace _V2 {
711     /**
712      *  @brief System clock.
713      *
714      *  Time returned represents wall time from the system-wide clock.
715     */
716     struct system_clock
717     {
718       typedef chrono::nanoseconds                               duration;
719       typedef duration::rep                                     rep;
720       typedef duration::period                                  period;
721       typedef chrono::time_point<system_clock, duration>        time_point;
723       static_assert(system_clock::duration::min()
724                     < system_clock::duration::zero(),
725                     "a clock's minimum duration cannot be less than its epoch");
727       static constexpr bool is_steady = false;
729       static time_point
730       now() noexcept;
732       // Map to C API
733       static std::time_t
734       to_time_t(const time_point& __t) noexcept
735       {
736         return std::time_t(duration_cast<chrono::seconds>
737                            (__t.time_since_epoch()).count());
738       }
740       static time_point
741       from_time_t(std::time_t __t) noexcept
742       {
743         typedef chrono::time_point<system_clock, seconds>       __from;
744         return time_point_cast<system_clock::duration>
745                (__from(chrono::seconds(__t)));
746       }
747     };
750     /**
751      *  @brief Monotonic clock
752      *
753      *  Time returned has the property of only increasing at a uniform rate.
754     */
755     struct steady_clock
756     {
757       typedef chrono::nanoseconds                               duration;
758       typedef duration::rep                                     rep;
759       typedef duration::period                                  period;
760       typedef chrono::time_point<steady_clock, duration>        time_point;
762       static constexpr bool is_steady = true;
764       static time_point
765       now() noexcept;
766     };
769     /**
770      *  @brief Highest-resolution clock
771      *
772      *  This is the clock "with the shortest tick period." Alias to
773      *  std::system_clock until higher-than-nanosecond definitions
774      *  become feasible.
775     */
776     using high_resolution_clock = system_clock;
778     } // end inline namespace _V2
780   _GLIBCXX_END_NAMESPACE_VERSION
781   } // namespace chrono
783 #if __cplusplus > 201103L
785   inline namespace literals
786   {
787   inline namespace chrono_literals
788   {
790     namespace __select_type
791     {
793       using namespace __parse_int;
795       template<unsigned long long _Val, typename _Dur>
796         struct _Select_type
797         : conditional<
798             _Val <= static_cast<unsigned long long>
799                       (numeric_limits<typename _Dur::rep>::max()),
800             _Dur, void>
801         {
802           static constexpr typename _Select_type::type
803             value{static_cast<typename _Select_type::type>(_Val)};
804         };
806       template<unsigned long long _Val, typename _Dur>
807         constexpr typename _Select_type<_Val, _Dur>::type
808         _Select_type<_Val, _Dur>::value;
810     } // __select_type
812     constexpr chrono::duration<long double, ratio<3600,1>>
813     operator""h(long double __hours)
814     { return chrono::duration<long double, ratio<3600,1>>{__hours}; }
816     template <char... _Digits>
817       constexpr typename
818       __select_type::_Select_type<__select_int::_Select_int<_Digits...>::value,
819                              chrono::hours>::type
820       operator""h()
821       {
822         return __select_type::_Select_type<
823                           __select_int::_Select_int<_Digits...>::value,
824                           chrono::hours>::value;
825       }
827     constexpr chrono::duration<long double, ratio<60,1>>
828     operator""min(long double __mins)
829     { return chrono::duration<long double, ratio<60,1>>{__mins}; }
831     template <char... _Digits>
832       constexpr typename
833       __select_type::_Select_type<__select_int::_Select_int<_Digits...>::value,
834                              chrono::minutes>::type
835       operator""min()
836       {
837         return __select_type::_Select_type<
838                           __select_int::_Select_int<_Digits...>::value,
839                           chrono::minutes>::value;
840       }
842     constexpr chrono::duration<long double>
843     operator""s(long double __secs)
844     { return chrono::duration<long double>{__secs}; }
846     template <char... _Digits>
847       constexpr typename
848       __select_type::_Select_type<__select_int::_Select_int<_Digits...>::value,
849                              chrono::seconds>::type
850       operator""s()
851       {
852         return __select_type::_Select_type<
853                           __select_int::_Select_int<_Digits...>::value,
854                           chrono::seconds>::value;
855       }
857     constexpr chrono::duration<long double, milli>
858     operator""ms(long double __msecs)
859     { return chrono::duration<long double, milli>{__msecs}; }
861     template <char... _Digits>
862       constexpr typename
863       __select_type::_Select_type<__select_int::_Select_int<_Digits...>::value,
864                              chrono::milliseconds>::type
865       operator""ms()
866       {
867         return __select_type::_Select_type<
868                           __select_int::_Select_int<_Digits...>::value,
869                           chrono::milliseconds>::value;
870       }
872     constexpr chrono::duration<long double, micro>
873     operator""us(long double __usecs)
874     { return chrono::duration<long double, micro>{__usecs}; }
876     template <char... _Digits>
877       constexpr typename
878       __select_type::_Select_type<__select_int::_Select_int<_Digits...>::value,
879                              chrono::microseconds>::type
880       operator""us()
881       {
882         return __select_type::_Select_type<
883                           __select_int::_Select_int<_Digits...>::value,
884                           chrono::microseconds>::value;
885       }
887     constexpr chrono::duration<long double, nano>
888     operator""ns(long double __nsecs)
889     { return chrono::duration<long double, nano>{__nsecs}; }
891     template <char... _Digits>
892       constexpr typename
893       __select_type::_Select_type<__select_int::_Select_int<_Digits...>::value,
894                              chrono::nanoseconds>::type
895       operator""ns()
896       {
897         return __select_type::_Select_type<
898                           __select_int::_Select_int<_Digits...>::value,
899                           chrono::nanoseconds>::value;
900       }
902   } // inline namespace chrono_literals
903   } // inline namespace literals
905 #endif // __cplusplus > 201103L
907   // @} group chrono
908 } // namespace std
910 #endif //_GLIBCXX_USE_C99_STDINT_TR1
912 #endif // C++11
914 #endif //_GLIBCXX_CHRONO