Home | History | Annotate | Download | only in include
      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
    739