Home | History | Annotate | Download | only in 4.6.x-google
      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       inline 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>::min(); }
    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       inline 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	__ct;
    363 	return __ct(__lhs) += __rhs;
    364       }
    365 
    366     template<typename _Rep1, typename _Period1,
    367 	     typename _Rep2, typename _Period2>
    368       inline 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	__ct;
    376 	return __ct(__lhs) -= __rhs;
    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       inline duration<typename __common_rep_type<_Rep1, _Rep2>::type, _Period>
    390       operator*(const duration<_Rep1, _Period>& __d, const _Rep2& __s)
    391       {
    392 	typedef typename common_type<_Rep1, _Rep2>::type 	__cr;
    393 	return duration<__cr, _Period>(__d) *= __s;
    394       }
    395 
    396     template<typename _Rep1, typename _Period, typename _Rep2>
    397       inline duration<typename __common_rep_type<_Rep2, _Rep1>::type, _Period>
    398       operator*(const _Rep1& __s, const duration<_Rep2, _Period>& __d)
    399       { return __d * __s; }
    400 
    401     template<typename _Rep1, typename _Period, typename _Rep2>
    402       inline duration<typename __common_rep_type<_Rep1, typename
    403 	enable_if<!__is_duration<_Rep2>::value, _Rep2>::type>::type, _Period>
    404       operator/(const duration<_Rep1, _Period>& __d, const _Rep2& __s)
    405       {
    406 	typedef typename common_type<_Rep1, _Rep2>::type 	__cr;
    407 	return duration<__cr, _Period>(__d) /= __s;
    408       }
    409 
    410      template<typename _Rep1, typename _Period1,
    411 	      typename _Rep2, typename _Period2>
    412       inline typename common_type<_Rep1, _Rep2>::type
    413       operator/(const duration<_Rep1, _Period1>& __lhs,
    414 		const duration<_Rep2, _Period2>& __rhs)
    415       {
    416 	typedef duration<_Rep1, _Period1>			__dur1;
    417 	typedef duration<_Rep2, _Period2>			__dur2;
    418 	typedef typename common_type<__dur1,__dur2>::type	__ct;
    419 	return __ct(__lhs).count() / __ct(__rhs).count();
    420       }
    421 
    422     // DR 934.
    423     template<typename _Rep1, typename _Period, typename _Rep2>
    424       inline duration<typename __common_rep_type<_Rep1, typename
    425 	enable_if<!__is_duration<_Rep2>::value, _Rep2>::type>::type, _Period>
    426       operator%(const duration<_Rep1, _Period>& __d, const _Rep2& __s)
    427       {
    428 	typedef typename common_type<_Rep1, _Rep2>::type 	__cr;
    429 	return duration<__cr, _Period>(__d) %= __s;
    430       }
    431 
    432      template<typename _Rep1, typename _Period1,
    433 	      typename _Rep2, typename _Period2>
    434       inline typename common_type<duration<_Rep1, _Period1>,
    435 				  duration<_Rep2, _Period2>>::type
    436       operator%(const duration<_Rep1, _Period1>& __lhs,
    437 		const duration<_Rep2, _Period2>& __rhs)
    438       {
    439 	typedef duration<_Rep1, _Period1>			__dur1;
    440 	typedef duration<_Rep2, _Period2>			__dur2;
    441 	typedef typename common_type<__dur1,__dur2>::type	__ct;
    442 	return __ct(__lhs) %= __rhs;
    443       }
    444 
    445     // comparisons
    446     template<typename _Rep1, typename _Period1,
    447 	     typename _Rep2, typename _Period2>
    448       inline constexpr bool
    449       operator==(const duration<_Rep1, _Period1>& __lhs,
    450 		 const duration<_Rep2, _Period2>& __rhs)
    451       {
    452 	typedef duration<_Rep1, _Period1>			__dur1;
    453 	typedef duration<_Rep2, _Period2>			__dur2;
    454 	typedef typename common_type<__dur1,__dur2>::type	__ct;
    455 	return __ct(__lhs).count() == __ct(__rhs).count();
    456       }
    457 
    458     template<typename _Rep1, typename _Period1,
    459 	     typename _Rep2, typename _Period2>
    460       inline constexpr bool
    461       operator<(const duration<_Rep1, _Period1>& __lhs,
    462 		const duration<_Rep2, _Period2>& __rhs)
    463       {
    464 	typedef duration<_Rep1, _Period1>			__dur1;
    465 	typedef duration<_Rep2, _Period2>			__dur2;
    466 	typedef typename common_type<__dur1,__dur2>::type	__ct;
    467 	return __ct(__lhs).count() < __ct(__rhs).count();
    468       }
    469 
    470     template<typename _Rep1, typename _Period1,
    471 	     typename _Rep2, typename _Period2>
    472       inline constexpr bool
    473       operator!=(const duration<_Rep1, _Period1>& __lhs,
    474 		 const duration<_Rep2, _Period2>& __rhs)
    475       { return !(__lhs == __rhs); }
    476 
    477     template<typename _Rep1, typename _Period1,
    478 	     typename _Rep2, typename _Period2>
    479       inline constexpr bool
    480       operator<=(const duration<_Rep1, _Period1>& __lhs,
    481 		 const duration<_Rep2, _Period2>& __rhs)
    482       { return !(__rhs < __lhs); }
    483 
    484     template<typename _Rep1, typename _Period1,
    485 	     typename _Rep2, typename _Period2>
    486       inline constexpr bool
    487       operator>(const duration<_Rep1, _Period1>& __lhs,
    488 		const duration<_Rep2, _Period2>& __rhs)
    489       { return __rhs < __lhs; }
    490 
    491     template<typename _Rep1, typename _Period1,
    492 	     typename _Rep2, typename _Period2>
    493       inline constexpr bool
    494       operator>=(const duration<_Rep1, _Period1>& __lhs,
    495 		 const duration<_Rep2, _Period2>& __rhs)
    496       { return !(__lhs < __rhs); }
    497 
    498     /// nanoseconds
    499     typedef duration<int64_t, nano> 	nanoseconds;
    500 
    501     /// microseconds
    502     typedef duration<int64_t, micro> 	microseconds;
    503 
    504     /// milliseconds
    505     typedef duration<int64_t, milli> 	milliseconds;
    506 
    507     /// seconds
    508     typedef duration<int64_t> 		seconds;
    509 
    510     /// minutes
    511     typedef duration<int, ratio< 60>> 	minutes;
    512 
    513     /// hours
    514     typedef duration<int, ratio<3600>> 	hours;
    515 
    516     /// time_point
    517     template<typename _Clock, typename _Dur>
    518       struct time_point
    519       {
    520 	typedef _Clock			  			clock;
    521 	typedef _Dur		  				duration;
    522 	typedef typename duration::rep	  			rep;
    523 	typedef typename duration::period			period;
    524 
    525 	constexpr time_point() : __d(duration::zero())
    526 	{ }
    527 
    528 	constexpr explicit time_point(const duration& __dur)
    529 	: __d(__dur)
    530 	{ }
    531 
    532 	// conversions
    533 	template<typename _Dur2>
    534 	  constexpr time_point(const time_point<clock, _Dur2>& __t)
    535 	  : __d(__t.time_since_epoch())
    536 	  { }
    537 
    538 	// observer
    539 	constexpr duration
    540 	time_since_epoch() const
    541 	{ return __d; }
    542 
    543 	// arithmetic
    544 	time_point&
    545 	operator+=(const duration& __dur)
    546 	{
    547 	  __d += __dur;
    548 	  return *this;
    549 	}
    550 
    551 	time_point&
    552 	operator-=(const duration& __dur)
    553 	{
    554 	  __d -= __dur;
    555 	  return *this;
    556 	}
    557 
    558 	// special values
    559 	static constexpr time_point
    560 	min()
    561 	{ return time_point(duration::min()); }
    562 
    563 	static constexpr time_point
    564 	max()
    565 	{ return time_point(duration::max()); }
    566 
    567       private:
    568 	duration __d;
    569       };
    570 
    571     /// time_point_cast
    572     template<typename _ToDur, typename _Clock, typename _Dur>
    573       inline constexpr typename enable_if<__is_duration<_ToDur>::value,
    574 				time_point<_Clock, _ToDur>>::type
    575       time_point_cast(const time_point<_Clock, _Dur>& __t)
    576       {
    577 	typedef time_point<_Clock, _ToDur> 			__time_point;
    578 	return __time_point(duration_cast<_ToDur>(__t.time_since_epoch()));
    579       }
    580 
    581     template<typename _Clock, typename _Dur1,
    582 	     typename _Rep2, typename _Period2>
    583       inline time_point<_Clock,
    584 	typename common_type<_Dur1, duration<_Rep2, _Period2>>::type>
    585       operator+(const time_point<_Clock, _Dur1>& __lhs,
    586 		const duration<_Rep2, _Period2>& __rhs)
    587       {
    588 	typedef duration<_Rep2, _Period2>			__dur2;
    589 	typedef typename common_type<_Dur1,__dur2>::type	__ct;
    590 	typedef time_point<_Clock, __ct> 			__time_point;
    591 	return __time_point(__lhs) += __rhs;
    592       }
    593 
    594     template<typename _Rep1, typename _Period1,
    595 	     typename _Clock, typename _Dur2>
    596       inline time_point<_Clock,
    597 	typename common_type<duration<_Rep1, _Period1>, _Dur2>::type>
    598       operator+(const duration<_Rep1, _Period1>& __lhs,
    599 		const time_point<_Clock, _Dur2>& __rhs)
    600       { return __rhs + __lhs; }
    601 
    602     template<typename _Clock, typename _Dur1,
    603 	     typename _Rep2, typename _Period2>
    604       inline time_point<_Clock,
    605 	typename common_type<_Dur1, duration<_Rep2, _Period2>>::type>
    606       operator-(const time_point<_Clock, _Dur1>& __lhs,
    607 		const duration<_Rep2, _Period2>& __rhs)
    608       { return __lhs + (-__rhs); }
    609 
    610     template<typename _Clock, typename _Dur1, typename _Dur2>
    611       inline typename common_type<_Dur1, _Dur2>::type
    612       operator-(const time_point<_Clock, _Dur1>& __lhs,
    613 		const time_point<_Clock, _Dur2>& __rhs)
    614       { return __lhs.time_since_epoch() - __rhs.time_since_epoch(); }
    615 
    616     template<typename _Clock, typename _Dur1, typename _Dur2>
    617       inline constexpr bool
    618       operator==(const time_point<_Clock, _Dur1>& __lhs,
    619 		 const time_point<_Clock, _Dur2>& __rhs)
    620       { return __lhs.time_since_epoch() == __rhs.time_since_epoch(); }
    621 
    622     template<typename _Clock, typename _Dur1, typename _Dur2>
    623       inline constexpr bool
    624       operator!=(const time_point<_Clock, _Dur1>& __lhs,
    625 		 const time_point<_Clock, _Dur2>& __rhs)
    626       { return !(__lhs == __rhs); }
    627 
    628     template<typename _Clock, typename _Dur1, typename _Dur2>
    629       inline constexpr bool
    630       operator<(const time_point<_Clock, _Dur1>& __lhs,
    631 		const time_point<_Clock, _Dur2>& __rhs)
    632       { return  __lhs.time_since_epoch() < __rhs.time_since_epoch(); }
    633 
    634     template<typename _Clock, typename _Dur1, typename _Dur2>
    635       inline constexpr bool
    636       operator<=(const time_point<_Clock, _Dur1>& __lhs,
    637 		 const time_point<_Clock, _Dur2>& __rhs)
    638       { return !(__rhs < __lhs); }
    639 
    640     template<typename _Clock, typename _Dur1, typename _Dur2>
    641       inline constexpr bool
    642       operator>(const time_point<_Clock, _Dur1>& __lhs,
    643 		const time_point<_Clock, _Dur2>& __rhs)
    644       { return __rhs < __lhs; }
    645 
    646     template<typename _Clock, typename _Dur1, typename _Dur2>
    647       inline constexpr bool
    648       operator>=(const time_point<_Clock, _Dur1>& __lhs,
    649 		 const time_point<_Clock, _Dur2>& __rhs)
    650       { return !(__lhs < __rhs); }
    651 
    652     /// system_clock
    653     struct system_clock
    654     {
    655 #ifdef _GLIBCXX_USE_CLOCK_REALTIME
    656       typedef chrono::nanoseconds     				duration;
    657 #elif defined(_GLIBCXX_USE_GETTIMEOFDAY)
    658       typedef chrono::microseconds    				duration;
    659 #else
    660       typedef chrono::seconds	      				duration;
    661 #endif
    662 
    663       typedef duration::rep    					rep;
    664       typedef duration::period 					period;
    665       typedef chrono::time_point<system_clock, duration> 	time_point;
    666 
    667       static_assert(system_clock::duration::min()
    668 		    < system_clock::duration::zero(),
    669 		    "a clock's minimum duration cannot be less than its epoch");
    670 
    671       static constexpr bool is_monotonic = false;
    672 
    673       static time_point
    674       now() throw ();
    675 
    676       // Map to C API
    677       static std::time_t
    678       to_time_t(const time_point& __t)
    679       {
    680 	return std::time_t(duration_cast<chrono::seconds>
    681 			   (__t.time_since_epoch()).count());
    682       }
    683 
    684       static time_point
    685       from_time_t(std::time_t __t)
    686       {
    687 	typedef chrono::time_point<system_clock, seconds>	__from;
    688 	return time_point_cast<system_clock::duration>
    689 	       (__from(chrono::seconds(__t)));
    690       }
    691     };
    692 
    693 #ifdef _GLIBCXX_USE_CLOCK_MONOTONIC
    694     /// monotonic_clock
    695     struct monotonic_clock
    696     {
    697       typedef chrono::nanoseconds 				duration;
    698       typedef duration::rep	  				rep;
    699       typedef duration::period	  				period;
    700       typedef chrono::time_point<monotonic_clock, duration> 	time_point;
    701 
    702       static constexpr bool is_monotonic = true;
    703 
    704       static time_point
    705       now();
    706     };
    707 #else
    708     typedef system_clock monotonic_clock;
    709 #endif
    710 
    711     typedef system_clock high_resolution_clock;
    712 
    713   _GLIBCXX_END_NAMESPACE_VERSION
    714   } // namespace chrono
    715 
    716   // @} group chrono
    717 } // namespace
    718 
    719 #endif //_GLIBCXX_USE_C99_STDINT_TR1
    720 
    721 #endif //__GXX_EXPERIMENTAL_CXX0X__
    722 
    723 #endif //_GLIBCXX_CHRONO
    724