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
45namespace 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
739