Import gcc-4.7.2 to new vendor branch
[dragonfly.git] / contrib / gcc-4.7 / libstdc++-v3 / include / std / chrono
1 // <chrono> -*- C++ -*-
2
3 // Copyright (C) 2008, 2009, 2010, 2011 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 #ifndef __GXX_EXPERIMENTAL_CXX0X__
35 # include <bits/c++0x_warning.h>
36 #else
37
38 #include <ratio>
39 #include <type_traits>
40 #include <limits>
41 #include <ctime>
42
43 #ifdef _GLIBCXX_USE_C99_STDINT_TR1
44
45 namespace std _GLIBCXX_VISIBILITY(default)
46 {
47   /**
48    * @defgroup chrono Time
49    * @ingroup utilities
50    *
51    * Classes and functions for time.
52    * @{
53    */
54
55   /** @namespace std::chrono
56    *  @brief ISO C++ 0x entities sub namespace for time and date.
57    */
58   namespace chrono
59   {
60   _GLIBCXX_BEGIN_NAMESPACE_VERSION
61
62     template<typename _Rep, typename _Period = ratio<1>>
63       struct duration;
64
65     template<typename _Clock, typename _Dur = typename _Clock::duration>
66       struct time_point;
67
68   _GLIBCXX_END_NAMESPACE_VERSION
69   }
70
71 _GLIBCXX_BEGIN_NAMESPACE_VERSION
72   // 20.8.2.3 specialization of common_type (for duration)
73   template<typename _Rep1, typename _Period1, typename _Rep2, typename _Period2>
74     struct common_type<chrono::duration<_Rep1, _Period1>,
75                        chrono::duration<_Rep2, _Period2>>
76     {
77     private:
78       typedef __static_gcd<_Period1::num, _Period2::num>        __gcd_num;
79       typedef __static_gcd<_Period1::den, _Period2::den>        __gcd_den;
80       typedef typename common_type<_Rep1, _Rep2>::type          __cr;
81       typedef ratio<__gcd_num::value,
82                     (_Period1::den / __gcd_den::value) * _Period2::den> __r;
83
84     public:
85       typedef chrono::duration<__cr, __r>                       type;
86     };
87
88   // 20.8.2.3 specialization of common_type (for time_point)
89   template<typename _Clock, typename _Dur1, typename _Dur2>
90     struct common_type<chrono::time_point<_Clock, _Dur1>,
91                        chrono::time_point<_Clock, _Dur2>>
92     {
93     private:
94       typedef typename common_type<_Dur1, _Dur2>::type          __ct;
95
96     public:
97       typedef chrono::time_point<_Clock, __ct>                  type;
98     };
99 _GLIBCXX_END_NAMESPACE_VERSION
100
101   namespace chrono
102   {
103   _GLIBCXX_BEGIN_NAMESPACE_VERSION
104
105     // Primary template for duration_cast impl.
106     template<typename _ToDur, typename _CF, typename _CR,
107              bool _NumIsOne = false, bool _DenIsOne = false>
108       struct __duration_cast_impl
109       {
110         template<typename _Rep, typename _Period>
111           static constexpr _ToDur
112           __cast(const duration<_Rep, _Period>& __d)
113           {
114             typedef typename _ToDur::rep                        __to_rep;
115             return _ToDur(static_cast<__to_rep>(static_cast<_CR>(__d.count())
116               * static_cast<_CR>(_CF::num)
117               / static_cast<_CR>(_CF::den)));
118           }
119       };
120
121     template<typename _ToDur, typename _CF, typename _CR>
122       struct __duration_cast_impl<_ToDur, _CF, _CR, true, true>
123       {
124         template<typename _Rep, typename _Period>
125           static constexpr _ToDur
126           __cast(const duration<_Rep, _Period>& __d)
127           {
128             typedef typename _ToDur::rep                        __to_rep;
129             return _ToDur(static_cast<__to_rep>(__d.count()));
130           }
131       };
132
133     template<typename _ToDur, typename _CF, typename _CR>
134       struct __duration_cast_impl<_ToDur, _CF, _CR, true, false>
135       {
136         template<typename _Rep, typename _Period>
137           static constexpr _ToDur
138           __cast(const duration<_Rep, _Period>& __d)
139           {
140             typedef typename _ToDur::rep                        __to_rep;
141             return _ToDur(static_cast<__to_rep>(
142               static_cast<_CR>(__d.count()) / static_cast<_CR>(_CF::den)));
143           }
144       };
145
146     template<typename _ToDur, typename _CF, typename _CR>
147       struct __duration_cast_impl<_ToDur, _CF, _CR, false, true>
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::num)));
156           }
157       };
158
159     template<typename _Tp>
160       struct __is_duration
161       : std::false_type
162       { };
163
164     template<typename _Rep, typename _Period>
165       struct __is_duration<duration<_Rep, _Period>>
166       : std::true_type
167       { };
168
169     /// duration_cast
170     template<typename _ToDur, typename _Rep, typename _Period>
171       constexpr typename enable_if<__is_duration<_ToDur>::value,
172                                    _ToDur>::type
173       duration_cast(const duration<_Rep, _Period>& __d)
174       {
175         typedef typename _ToDur::period                         __to_period;
176         typedef typename _ToDur::rep                            __to_rep;
177         typedef ratio_divide<_Period, __to_period>              __r_div;
178         typedef typename __r_div::type                          __cf;
179         typedef typename common_type<__to_rep, _Rep, intmax_t>::type
180                                                                 __cr;
181         typedef  __duration_cast_impl<_ToDur, __cf, __cr,
182                                       __cf::num == 1, __cf::den == 1> __dc;
183         return __dc::__cast(__d);
184       }
185
186     /// treat_as_floating_point
187     template<typename _Rep>
188       struct treat_as_floating_point
189       : is_floating_point<_Rep>
190       { };
191
192     /// duration_values
193     template<typename _Rep>
194       struct duration_values
195       {
196         static constexpr _Rep
197         zero()
198         { return _Rep(0); }
199
200         static constexpr _Rep
201         max()
202         { return numeric_limits<_Rep>::max(); }
203
204         static constexpr _Rep
205         min()
206         { return numeric_limits<_Rep>::lowest(); }
207       };
208
209     template<typename T>
210       struct __is_ratio
211       : std::false_type
212       { };
213
214     template<intmax_t _Num, intmax_t _Den>
215       struct __is_ratio<ratio<_Num, _Den>>
216       : std::true_type
217       { };
218
219     /// duration
220     template<typename _Rep, typename _Period>
221       struct duration
222       {
223         typedef _Rep                                            rep;
224         typedef _Period                                         period;
225
226         static_assert(!__is_duration<_Rep>::value, "rep cannot be a duration");
227         static_assert(__is_ratio<_Period>::value,
228                       "period must be a specialization of ratio");
229         static_assert(_Period::num > 0, "period must be positive");
230
231         // 20.8.3.1 construction / copy / destroy
232         constexpr duration() : __r() { }
233
234         constexpr duration(const duration&) = default;
235
236         template<typename _Rep2, typename = typename
237                enable_if<is_convertible<_Rep2, rep>::value
238                          && (treat_as_floating_point<rep>::value
239                              || !treat_as_floating_point<_Rep2>::value)>::type>
240           constexpr explicit duration(const _Rep2& __rep)
241           : __r(static_cast<rep>(__rep)) { }
242
243         template<typename _Rep2, typename _Period2, typename = typename
244                enable_if<treat_as_floating_point<rep>::value
245                          || (ratio_divide<_Period2, period>::type::den == 1
246                              && !treat_as_floating_point<_Rep2>::value)>::type>
247           constexpr duration(const duration<_Rep2, _Period2>& __d)
248           : __r(duration_cast<duration>(__d).count()) { }
249
250         ~duration() = default;
251         duration& operator=(const duration&) = default;
252
253         // 20.8.3.2 observer
254         constexpr rep
255         count() const
256         { return __r; }
257
258         // 20.8.3.3 arithmetic
259         constexpr duration
260         operator+() const
261         { return *this; }
262
263         constexpr duration
264         operator-() const
265         { return duration(-__r); }
266
267         duration&
268         operator++()
269         {
270           ++__r;
271           return *this;
272         }
273
274         duration
275         operator++(int)
276         { return duration(__r++); }
277
278         duration&
279         operator--()
280         {
281           --__r;
282           return *this;
283         }
284
285         duration
286         operator--(int)
287         { return duration(__r--); }
288
289         duration&
290         operator+=(const duration& __d)
291         {
292           __r += __d.count();
293           return *this;
294         }
295
296         duration&
297         operator-=(const duration& __d)
298         {
299           __r -= __d.count();
300           return *this;
301         }
302
303         duration&
304         operator*=(const rep& __rhs)
305         {
306           __r *= __rhs;
307           return *this;
308         }
309
310         duration&
311         operator/=(const rep& __rhs)
312         {
313           __r /= __rhs;
314           return *this;
315         }
316
317         // DR 934.
318         template<typename _Rep2 = rep>
319           typename enable_if<!treat_as_floating_point<_Rep2>::value,
320                              duration&>::type
321           operator%=(const rep& __rhs)
322           {
323             __r %= __rhs;
324             return *this;
325           }
326
327         template<typename _Rep2 = rep>
328           typename enable_if<!treat_as_floating_point<_Rep2>::value,
329                              duration&>::type
330           operator%=(const duration& __d)
331           {
332             __r %= __d.count();
333             return *this;
334           }
335
336         // 20.8.3.4 special values
337         static constexpr duration
338         zero()
339         { return duration(duration_values<rep>::zero()); }
340
341         static constexpr duration
342         min()
343         { return duration(duration_values<rep>::min()); }
344
345         static constexpr duration
346         max()
347         { return duration(duration_values<rep>::max()); }
348
349       private:
350         rep __r;
351       };
352
353     template<typename _Rep1, typename _Period1,
354              typename _Rep2, typename _Period2>
355       constexpr typename common_type<duration<_Rep1, _Period1>,
356                                      duration<_Rep2, _Period2>>::type
357       operator+(const duration<_Rep1, _Period1>& __lhs,
358                 const duration<_Rep2, _Period2>& __rhs)
359       {
360         typedef duration<_Rep1, _Period1>                       __dur1;
361         typedef duration<_Rep2, _Period2>                       __dur2;
362         typedef typename common_type<__dur1,__dur2>::type       __cd;
363         return __cd(__cd(__lhs).count() + __cd(__rhs).count());
364       }
365
366     template<typename _Rep1, typename _Period1,
367              typename _Rep2, typename _Period2>
368       constexpr typename common_type<duration<_Rep1, _Period1>,
369                                      duration<_Rep2, _Period2>>::type
370       operator-(const duration<_Rep1, _Period1>& __lhs,
371                 const duration<_Rep2, _Period2>& __rhs)
372       {
373         typedef duration<_Rep1, _Period1>                       __dur1;
374         typedef duration<_Rep2, _Period2>                       __dur2;
375         typedef typename common_type<__dur1,__dur2>::type       __cd;
376         return __cd(__cd(__lhs).count() - __cd(__rhs).count());
377       }
378
379     template<typename _Rep1, typename _Rep2, bool =
380              is_convertible<_Rep2,
381                             typename common_type<_Rep1, _Rep2>::type>::value>
382       struct __common_rep_type { };
383
384     template<typename _Rep1, typename _Rep2>
385       struct __common_rep_type<_Rep1, _Rep2, true>
386       { typedef typename common_type<_Rep1, _Rep2>::type type; };
387
388     template<typename _Rep1, typename _Period, typename _Rep2>
389       constexpr
390       duration<typename __common_rep_type<_Rep1, _Rep2>::type, _Period>
391       operator*(const duration<_Rep1, _Period>& __d, const _Rep2& __s)
392       {
393         typedef duration<typename common_type<_Rep1, _Rep2>::type, _Period>
394           __cd;
395         return __cd(__cd(__d).count() * __s);
396       }
397
398     template<typename _Rep1, typename _Rep2, typename _Period>
399       constexpr
400       duration<typename __common_rep_type<_Rep2, _Rep1>::type, _Period>
401       operator*(const _Rep1& __s, const duration<_Rep2, _Period>& __d)
402       { return __d * __s; }
403
404     template<typename _Rep1, typename _Period, typename _Rep2>
405       constexpr duration<typename __common_rep_type<_Rep1, typename
406         enable_if<!__is_duration<_Rep2>::value, _Rep2>::type>::type, _Period>
407       operator/(const duration<_Rep1, _Period>& __d, const _Rep2& __s)
408       {
409         typedef duration<typename common_type<_Rep1, _Rep2>::type, _Period>
410           __cd;
411         return __cd(__cd(__d).count() / __s);
412       }
413
414     template<typename _Rep1, typename _Period1,
415              typename _Rep2, typename _Period2>
416       constexpr typename common_type<_Rep1, _Rep2>::type
417       operator/(const duration<_Rep1, _Period1>& __lhs,
418                 const duration<_Rep2, _Period2>& __rhs)
419       {
420         typedef duration<_Rep1, _Period1>                       __dur1;
421         typedef duration<_Rep2, _Period2>                       __dur2;
422         typedef typename common_type<__dur1,__dur2>::type       __cd;
423         return __cd(__lhs).count() / __cd(__rhs).count();
424       }
425
426     // DR 934.
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       }
436
437     template<typename _Rep1, typename _Period1,
438              typename _Rep2, typename _Period2>
439       constexpr typename common_type<duration<_Rep1, _Period1>,
440                                      duration<_Rep2, _Period2>>::type
441       operator%(const duration<_Rep1, _Period1>& __lhs,
442                 const duration<_Rep2, _Period2>& __rhs)
443       {
444         typedef duration<_Rep1, _Period1>                       __dur1;
445         typedef duration<_Rep2, _Period2>                       __dur2;
446         typedef typename common_type<__dur1,__dur2>::type       __cd;
447         return __cd(__cd(__lhs).count() % __cd(__rhs).count());
448       }
449
450     // comparisons
451     template<typename _Rep1, typename _Period1,
452              typename _Rep2, typename _Period2>
453       constexpr bool
454       operator==(const duration<_Rep1, _Period1>& __lhs,
455                  const duration<_Rep2, _Period2>& __rhs)
456       {
457         typedef duration<_Rep1, _Period1>                       __dur1;
458         typedef duration<_Rep2, _Period2>                       __dur2;
459         typedef typename common_type<__dur1,__dur2>::type       __ct;
460         return __ct(__lhs).count() == __ct(__rhs).count();
461       }
462
463     template<typename _Rep1, typename _Period1,
464              typename _Rep2, typename _Period2>
465       constexpr bool
466       operator<(const duration<_Rep1, _Period1>& __lhs,
467                 const duration<_Rep2, _Period2>& __rhs)
468       {
469         typedef duration<_Rep1, _Period1>                       __dur1;
470         typedef duration<_Rep2, _Period2>                       __dur2;
471         typedef typename common_type<__dur1,__dur2>::type       __ct;
472         return __ct(__lhs).count() < __ct(__rhs).count();
473       }
474
475     template<typename _Rep1, typename _Period1,
476              typename _Rep2, typename _Period2>
477       constexpr bool
478       operator!=(const duration<_Rep1, _Period1>& __lhs,
479                  const duration<_Rep2, _Period2>& __rhs)
480       { return !(__lhs == __rhs); }
481
482     template<typename _Rep1, typename _Period1,
483              typename _Rep2, typename _Period2>
484       constexpr bool
485       operator<=(const duration<_Rep1, _Period1>& __lhs,
486                  const duration<_Rep2, _Period2>& __rhs)
487       { return !(__rhs < __lhs); }
488
489     template<typename _Rep1, typename _Period1,
490              typename _Rep2, typename _Period2>
491       constexpr bool
492       operator>(const duration<_Rep1, _Period1>& __lhs,
493                 const duration<_Rep2, _Period2>& __rhs)
494       { return __rhs < __lhs; }
495
496     template<typename _Rep1, typename _Period1,
497              typename _Rep2, typename _Period2>
498       constexpr bool
499       operator>=(const duration<_Rep1, _Period1>& __lhs,
500                  const duration<_Rep2, _Period2>& __rhs)
501       { return !(__lhs < __rhs); }
502
503     /// nanoseconds
504     typedef duration<int64_t, nano>     nanoseconds;
505
506     /// microseconds
507     typedef duration<int64_t, micro>    microseconds;
508
509     /// milliseconds
510     typedef duration<int64_t, milli>    milliseconds;
511
512     /// seconds
513     typedef duration<int64_t>           seconds;
514
515     /// minutes
516     typedef duration<int, ratio< 60>>   minutes;
517
518     /// hours
519     typedef duration<int, ratio<3600>>  hours;
520
521     /// time_point
522     template<typename _Clock, typename _Dur>
523       struct time_point
524       {
525         typedef _Clock                                          clock;
526         typedef _Dur                                            duration;
527         typedef typename duration::rep                          rep;
528         typedef typename duration::period                       period;
529
530         constexpr time_point() : __d(duration::zero())
531         { }
532
533         constexpr explicit time_point(const duration& __dur)
534         : __d(__dur)
535         { }
536
537         // conversions
538         template<typename _Dur2>
539           constexpr time_point(const time_point<clock, _Dur2>& __t)
540           : __d(__t.time_since_epoch())
541           { }
542
543         // observer
544         constexpr duration
545         time_since_epoch() const
546         { return __d; }
547
548         // arithmetic
549         time_point&
550         operator+=(const duration& __dur)
551         {
552           __d += __dur;
553           return *this;
554         }
555
556         time_point&
557         operator-=(const duration& __dur)
558         {
559           __d -= __dur;
560           return *this;
561         }
562
563         // special values
564         static constexpr time_point
565         min()
566         { return time_point(duration::min()); }
567
568         static constexpr time_point
569         max()
570         { return time_point(duration::max()); }
571
572       private:
573         duration __d;
574       };
575
576     /// time_point_cast
577     template<typename _ToDur, typename _Clock, typename _Dur>
578       constexpr typename enable_if<__is_duration<_ToDur>::value,
579                                    time_point<_Clock, _ToDur>>::type
580       time_point_cast(const time_point<_Clock, _Dur>& __t)
581       {
582         typedef time_point<_Clock, _ToDur>                      __time_point;
583         return __time_point(duration_cast<_ToDur>(__t.time_since_epoch()));
584       }
585
586     template<typename _Clock, typename _Dur1,
587              typename _Rep2, typename _Period2>
588       constexpr time_point<_Clock,
589         typename common_type<_Dur1, duration<_Rep2, _Period2>>::type>
590       operator+(const time_point<_Clock, _Dur1>& __lhs,
591                 const duration<_Rep2, _Period2>& __rhs)
592       {
593         typedef duration<_Rep2, _Period2>                       __dur2;
594         typedef typename common_type<_Dur1,__dur2>::type        __ct;
595         typedef time_point<_Clock, __ct>                        __time_point;
596         return __time_point(__lhs.time_since_epoch() + __rhs);
597       }
598
599     template<typename _Rep1, typename _Period1,
600              typename _Clock, typename _Dur2>
601       constexpr time_point<_Clock,
602         typename common_type<duration<_Rep1, _Period1>, _Dur2>::type>
603       operator+(const duration<_Rep1, _Period1>& __lhs,
604                 const time_point<_Clock, _Dur2>& __rhs)
605       { 
606         typedef duration<_Rep1, _Period1>                       __dur1;
607         typedef typename common_type<__dur1,_Dur2>::type        __ct;
608         typedef time_point<_Clock, __ct>                        __time_point;
609         return __time_point(__rhs.time_since_epoch() + __lhs); 
610       }
611
612     template<typename _Clock, typename _Dur1,
613              typename _Rep2, typename _Period2>
614       constexpr time_point<_Clock,
615         typename common_type<_Dur1, duration<_Rep2, _Period2>>::type>
616       operator-(const time_point<_Clock, _Dur1>& __lhs,
617                 const duration<_Rep2, _Period2>& __rhs)
618       { 
619         typedef duration<_Rep2, _Period2>                       __dur2;
620         typedef typename common_type<_Dur1,__dur2>::type        __ct;
621         typedef time_point<_Clock, __ct>                        __time_point;
622         return __time_point(__lhs.time_since_epoch() -__rhs); 
623       }
624
625     template<typename _Clock, typename _Dur1, typename _Dur2>
626       constexpr typename common_type<_Dur1, _Dur2>::type
627       operator-(const time_point<_Clock, _Dur1>& __lhs,
628                 const time_point<_Clock, _Dur2>& __rhs)
629       { return __lhs.time_since_epoch() - __rhs.time_since_epoch(); }
630
631     template<typename _Clock, typename _Dur1, typename _Dur2>
632       constexpr bool
633       operator==(const time_point<_Clock, _Dur1>& __lhs,
634                  const time_point<_Clock, _Dur2>& __rhs)
635       { return __lhs.time_since_epoch() == __rhs.time_since_epoch(); }
636
637     template<typename _Clock, typename _Dur1, typename _Dur2>
638       constexpr bool
639       operator!=(const time_point<_Clock, _Dur1>& __lhs,
640                  const time_point<_Clock, _Dur2>& __rhs)
641       { return !(__lhs == __rhs); }
642
643     template<typename _Clock, typename _Dur1, typename _Dur2>
644       constexpr bool
645       operator<(const time_point<_Clock, _Dur1>& __lhs,
646                 const time_point<_Clock, _Dur2>& __rhs)
647       { return  __lhs.time_since_epoch() < __rhs.time_since_epoch(); }
648
649     template<typename _Clock, typename _Dur1, typename _Dur2>
650       constexpr bool
651       operator<=(const time_point<_Clock, _Dur1>& __lhs,
652                  const time_point<_Clock, _Dur2>& __rhs)
653       { return !(__rhs < __lhs); }
654
655     template<typename _Clock, typename _Dur1, typename _Dur2>
656       constexpr bool
657       operator>(const time_point<_Clock, _Dur1>& __lhs,
658                 const time_point<_Clock, _Dur2>& __rhs)
659       { return __rhs < __lhs; }
660
661     template<typename _Clock, typename _Dur1, typename _Dur2>
662       constexpr bool
663       operator>=(const time_point<_Clock, _Dur1>& __lhs,
664                  const time_point<_Clock, _Dur2>& __rhs)
665       { return !(__lhs < __rhs); }
666
667     /// system_clock
668     struct system_clock
669     {
670 #ifdef _GLIBCXX_USE_CLOCK_REALTIME
671       typedef chrono::nanoseconds                               duration;
672 #elif defined(_GLIBCXX_USE_GETTIMEOFDAY)
673       typedef chrono::microseconds                              duration;
674 #else
675       typedef chrono::seconds                                   duration;
676 #endif
677
678       typedef duration::rep                                     rep;
679       typedef duration::period                                  period;
680       typedef chrono::time_point<system_clock, duration>        time_point;
681
682       static_assert(system_clock::duration::min()
683                     < system_clock::duration::zero(),
684                     "a clock's minimum duration cannot be less than its epoch");
685
686       static constexpr bool is_steady = false;
687
688       static time_point
689       now() noexcept;
690
691       // Map to C API
692       static std::time_t
693       to_time_t(const time_point& __t) noexcept
694       {
695         return std::time_t(duration_cast<chrono::seconds>
696                            (__t.time_since_epoch()).count());
697       }
698
699       static time_point
700       from_time_t(std::time_t __t) noexcept
701       {
702         typedef chrono::time_point<system_clock, seconds>       __from;
703         return time_point_cast<system_clock::duration>
704                (__from(chrono::seconds(__t)));
705       }
706     };
707
708 #ifdef _GLIBCXX_USE_CLOCK_MONOTONIC
709     /// steady_clock
710     struct steady_clock
711     {
712       typedef chrono::nanoseconds                               duration;
713       typedef duration::rep                                     rep;
714       typedef duration::period                                  period;
715       typedef chrono::time_point<steady_clock, duration>        time_point;
716
717       static constexpr bool is_steady = true;
718
719       static time_point
720       now() noexcept;
721     };
722 #else
723     typedef system_clock steady_clock;
724 #endif
725
726     typedef system_clock high_resolution_clock;
727
728   _GLIBCXX_END_NAMESPACE_VERSION
729   } // namespace chrono
730
731   // @} group chrono
732 } // namespace
733
734 #endif //_GLIBCXX_USE_C99_STDINT_TR1
735
736 #endif //__GXX_EXPERIMENTAL_CXX0X__
737
738 #endif //_GLIBCXX_CHRONO