Home | History | Annotate | Download | only in 4.8
      1 // <chrono> -*- C++ -*-
      2 
      3 // Copyright (C) 2008-2013 Free Software Foundation, Inc.
      4 //
      5 // This file is part of the GNU ISO C++ Library.  This library is free
      6 // software; you can redistribute it and/or modify it under the
      7 // terms of the GNU General Public License as published by the
      8 // Free Software Foundation; either version 3, or (at your option)
      9 // any later version.
     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 #if __cplusplus < 201103L
     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++ 2011 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 
     73   // 20.11.4.3 specialization of common_type (for duration, sfinae-friendly)
     74   
     75   template<typename _CT, typename _Period1, typename _Period2>
     76     struct __duration_common_type_wrapper
     77     {
     78     private:
     79       typedef __static_gcd<_Period1::num, _Period2::num> __gcd_num;
     80       typedef __static_gcd<_Period1::den, _Period2::den> __gcd_den;
     81       typedef typename _CT::type __cr;
     82       typedef ratio<__gcd_num::value,
     83         (_Period1::den / __gcd_den::value) * _Period2::den> __r;
     84     public:
     85       typedef __success_type<chrono::duration<__cr, __r>> type;
     86     };
     87 
     88   template<typename _Period1, typename _Period2>
     89     struct __duration_common_type_wrapper<__failure_type, _Period1, _Period2>
     90     { typedef __failure_type type; };
     91 
     92   template<typename _Rep1, typename _Period1, typename _Rep2, typename _Period2>
     93     struct common_type<chrono::duration<_Rep1, _Period1>,
     94              chrono::duration<_Rep2, _Period2>>
     95     : public __duration_common_type_wrapper<typename __member_type_wrapper<
     96              common_type<_Rep1, _Rep2>>::type, _Period1, _Period2>::type
     97     { };
     98 
     99   // 20.11.4.3 specialization of common_type (for time_point, sfinae-friendly)
    100   
    101   template<typename _CT, typename _Clock>
    102     struct __timepoint_common_type_wrapper
    103     {
    104       typedef __success_type<chrono::time_point<_Clock, typename _CT::type>>
    105         type;
    106     };
    107 
    108   template<typename _Clock>
    109     struct __timepoint_common_type_wrapper<__failure_type, _Clock>
    110     { typedef __failure_type type; };
    111 
    112   template<typename _Clock, typename _Duration1, typename _Duration2>
    113     struct common_type<chrono::time_point<_Clock, _Duration1>,
    114              chrono::time_point<_Clock, _Duration2>>
    115     : public __timepoint_common_type_wrapper<typename __member_type_wrapper<
    116              common_type<_Duration1, _Duration2>>::type, _Clock>::type
    117     { };
    118 
    119 _GLIBCXX_END_NAMESPACE_VERSION
    120 
    121   namespace chrono
    122   {
    123   _GLIBCXX_BEGIN_NAMESPACE_VERSION
    124 
    125     // Primary template for duration_cast impl.
    126     template<typename _ToDur, typename _CF, typename _CR,
    127 	     bool _NumIsOne = false, bool _DenIsOne = false>
    128       struct __duration_cast_impl
    129       {
    130 	template<typename _Rep, typename _Period>
    131 	  static constexpr _ToDur
    132 	  __cast(const duration<_Rep, _Period>& __d)
    133 	  {
    134 	    typedef typename _ToDur::rep			__to_rep;
    135 	    return _ToDur(static_cast<__to_rep>(static_cast<_CR>(__d.count())
    136 	      * static_cast<_CR>(_CF::num)
    137 	      / static_cast<_CR>(_CF::den)));
    138 	  }
    139       };
    140 
    141     template<typename _ToDur, typename _CF, typename _CR>
    142       struct __duration_cast_impl<_ToDur, _CF, _CR, true, true>
    143       {
    144 	template<typename _Rep, typename _Period>
    145 	  static constexpr _ToDur
    146 	  __cast(const duration<_Rep, _Period>& __d)
    147 	  {
    148 	    typedef typename _ToDur::rep			__to_rep;
    149 	    return _ToDur(static_cast<__to_rep>(__d.count()));
    150 	  }
    151       };
    152 
    153     template<typename _ToDur, typename _CF, typename _CR>
    154       struct __duration_cast_impl<_ToDur, _CF, _CR, true, false>
    155       {
    156 	template<typename _Rep, typename _Period>
    157 	  static constexpr _ToDur
    158 	  __cast(const duration<_Rep, _Period>& __d)
    159 	  {
    160 	    typedef typename _ToDur::rep			__to_rep;
    161 	    return _ToDur(static_cast<__to_rep>(
    162 	      static_cast<_CR>(__d.count()) / static_cast<_CR>(_CF::den)));
    163 	  }
    164       };
    165 
    166     template<typename _ToDur, typename _CF, typename _CR>
    167       struct __duration_cast_impl<_ToDur, _CF, _CR, false, true>
    168       {
    169 	template<typename _Rep, typename _Period>
    170 	  static constexpr _ToDur
    171 	  __cast(const duration<_Rep, _Period>& __d)
    172 	  {
    173 	    typedef typename _ToDur::rep			__to_rep;
    174 	    return _ToDur(static_cast<__to_rep>(
    175 	      static_cast<_CR>(__d.count()) * static_cast<_CR>(_CF::num)));
    176 	  }
    177       };
    178 
    179     template<typename _Tp>
    180       struct __is_duration
    181       : std::false_type
    182       { };
    183 
    184     template<typename _Rep, typename _Period>
    185       struct __is_duration<duration<_Rep, _Period>>
    186       : std::true_type
    187       { };
    188 
    189     /// duration_cast
    190     template<typename _ToDur, typename _Rep, typename _Period>
    191       constexpr typename enable_if<__is_duration<_ToDur>::value,
    192 				   _ToDur>::type
    193       duration_cast(const duration<_Rep, _Period>& __d)
    194       {
    195 	typedef typename _ToDur::period				__to_period;
    196 	typedef typename _ToDur::rep				__to_rep;
    197 	typedef ratio_divide<_Period, __to_period> 		__cf;
    198 	typedef typename common_type<__to_rep, _Rep, intmax_t>::type
    199 	  							__cr;
    200 	typedef  __duration_cast_impl<_ToDur, __cf, __cr,
    201 				      __cf::num == 1, __cf::den == 1> __dc;
    202 	return __dc::__cast(__d);
    203       }
    204 
    205     /// treat_as_floating_point
    206     template<typename _Rep>
    207       struct treat_as_floating_point
    208       : is_floating_point<_Rep>
    209       { };
    210 
    211     /// duration_values
    212     template<typename _Rep>
    213       struct duration_values
    214       {
    215 	static constexpr _Rep
    216 	zero()
    217 	{ return _Rep(0); }
    218 
    219 	static constexpr _Rep
    220 	max()
    221 	{ return numeric_limits<_Rep>::max(); }
    222 
    223 	static constexpr _Rep
    224 	min()
    225 	{ return numeric_limits<_Rep>::lowest(); }
    226       };
    227 
    228     template<typename _Tp>
    229       struct __is_ratio
    230       : std::false_type
    231       { };
    232 
    233     template<intmax_t _Num, intmax_t _Den>
    234       struct __is_ratio<ratio<_Num, _Den>>
    235       : std::true_type
    236       { };
    237 
    238     /// duration
    239     template<typename _Rep, typename _Period>
    240       struct duration
    241       {
    242 	typedef _Rep						rep;
    243 	typedef _Period 					period;
    244 
    245 	static_assert(!__is_duration<_Rep>::value, "rep cannot be a duration");
    246 	static_assert(__is_ratio<_Period>::value,
    247 		      "period must be a specialization of ratio");
    248 	static_assert(_Period::num > 0, "period must be positive");
    249 
    250 	// 20.11.5.1 construction / copy / destroy
    251 	constexpr duration() = default;
    252 
    253 	// NB: Make constexpr implicit. This cannot be explicitly
    254 	// constexpr, as any UDT that is not a literal type with a
    255 	// constexpr copy constructor will be ill-formed.
    256 	duration(const duration&) = default;
    257 
    258 	template<typename _Rep2, typename = typename
    259 	       enable_if<is_convertible<_Rep2, rep>::value
    260 			 && (treat_as_floating_point<rep>::value
    261 			     || !treat_as_floating_point<_Rep2>::value)>::type>
    262 	  constexpr explicit duration(const _Rep2& __rep)
    263 	  : __r(static_cast<rep>(__rep)) { }
    264 
    265 	template<typename _Rep2, typename _Period2, typename = typename
    266 	       enable_if<treat_as_floating_point<rep>::value
    267 			 || (ratio_divide<_Period2, period>::den == 1
    268 			     && !treat_as_floating_point<_Rep2>::value)>::type>
    269 	  constexpr duration(const duration<_Rep2, _Period2>& __d)
    270 	  : __r(duration_cast<duration>(__d).count()) { }
    271 
    272 	~duration() = default;
    273 	duration& operator=(const duration&) = default;
    274 
    275 	// 20.11.5.2 observer
    276 	constexpr rep
    277 	count() const
    278 	{ return __r; }
    279 
    280 	// 20.11.5.3 arithmetic
    281 	constexpr duration
    282 	operator+() const
    283 	{ return *this; }
    284 
    285 	constexpr duration
    286 	operator-() const
    287 	{ return duration(-__r); }
    288 
    289 	duration&
    290 	operator++()
    291 	{
    292 	  ++__r;
    293 	  return *this;
    294 	}
    295 
    296 	duration
    297 	operator++(int)
    298 	{ return duration(__r++); }
    299 
    300 	duration&
    301 	operator--()
    302 	{
    303 	  --__r;
    304 	  return *this;
    305 	}
    306 
    307 	duration
    308 	operator--(int)
    309 	{ return duration(__r--); }
    310 
    311 	duration&
    312 	operator+=(const duration& __d)
    313 	{
    314 	  __r += __d.count();
    315 	  return *this;
    316 	}
    317 
    318 	duration&
    319 	operator-=(const duration& __d)
    320 	{
    321 	  __r -= __d.count();
    322 	  return *this;
    323 	}
    324 
    325 	duration&
    326 	operator*=(const rep& __rhs)
    327 	{
    328 	  __r *= __rhs;
    329 	  return *this;
    330 	}
    331 
    332 	duration&
    333 	operator/=(const rep& __rhs)
    334 	{
    335 	  __r /= __rhs;
    336 	  return *this;
    337 	}
    338 
    339 	// DR 934.
    340 	template<typename _Rep2 = rep>
    341 	  typename enable_if<!treat_as_floating_point<_Rep2>::value,
    342 			     duration&>::type
    343 	  operator%=(const rep& __rhs)
    344 	  {
    345 	    __r %= __rhs;
    346 	    return *this;
    347 	  }
    348 
    349 	template<typename _Rep2 = rep>
    350 	  typename enable_if<!treat_as_floating_point<_Rep2>::value,
    351 			     duration&>::type
    352 	  operator%=(const duration& __d)
    353 	  {
    354 	    __r %= __d.count();
    355 	    return *this;
    356 	  }
    357 
    358 	// 20.11.5.4 special values
    359 	static constexpr duration
    360 	zero()
    361 	{ return duration(duration_values<rep>::zero()); }
    362 
    363 	static constexpr duration
    364 	min()
    365 	{ return duration(duration_values<rep>::min()); }
    366 
    367 	static constexpr duration
    368 	max()
    369 	{ return duration(duration_values<rep>::max()); }
    370 
    371       private:
    372 	rep __r;
    373       };
    374 
    375     template<typename _Rep1, typename _Period1,
    376 	     typename _Rep2, typename _Period2>
    377       constexpr typename common_type<duration<_Rep1, _Period1>,
    378 				     duration<_Rep2, _Period2>>::type
    379       operator+(const duration<_Rep1, _Period1>& __lhs,
    380 		const duration<_Rep2, _Period2>& __rhs)
    381       {
    382 	typedef duration<_Rep1, _Period1>			__dur1;
    383 	typedef duration<_Rep2, _Period2>			__dur2;
    384 	typedef typename common_type<__dur1,__dur2>::type	__cd;
    385 	return __cd(__cd(__lhs).count() + __cd(__rhs).count());
    386       }
    387 
    388     template<typename _Rep1, typename _Period1,
    389 	     typename _Rep2, typename _Period2>
    390       constexpr typename common_type<duration<_Rep1, _Period1>,
    391 				     duration<_Rep2, _Period2>>::type
    392       operator-(const duration<_Rep1, _Period1>& __lhs,
    393 		const duration<_Rep2, _Period2>& __rhs)
    394       {
    395 	typedef duration<_Rep1, _Period1>			__dur1;
    396 	typedef duration<_Rep2, _Period2>			__dur2;
    397 	typedef typename common_type<__dur1,__dur2>::type	__cd;
    398 	return __cd(__cd(__lhs).count() - __cd(__rhs).count());
    399       }
    400 
    401     template<typename _Rep1, typename _Rep2, bool =
    402 	     is_convertible<_Rep2,
    403 			    typename common_type<_Rep1, _Rep2>::type>::value>
    404       struct __common_rep_type { };
    405 
    406     template<typename _Rep1, typename _Rep2>
    407       struct __common_rep_type<_Rep1, _Rep2, true>
    408       { typedef typename common_type<_Rep1, _Rep2>::type type; };
    409 
    410     template<typename _Rep1, typename _Period, typename _Rep2>
    411       constexpr
    412       duration<typename __common_rep_type<_Rep1, _Rep2>::type, _Period>
    413       operator*(const duration<_Rep1, _Period>& __d, const _Rep2& __s)
    414       {
    415 	typedef duration<typename common_type<_Rep1, _Rep2>::type, _Period>
    416 	  __cd;
    417 	return __cd(__cd(__d).count() * __s);
    418       }
    419 
    420     template<typename _Rep1, typename _Rep2, typename _Period>
    421       constexpr
    422       duration<typename __common_rep_type<_Rep2, _Rep1>::type, _Period>
    423       operator*(const _Rep1& __s, const duration<_Rep2, _Period>& __d)
    424       { return __d * __s; }
    425 
    426     template<typename _Rep1, typename _Period, typename _Rep2>
    427       constexpr duration<typename __common_rep_type<_Rep1, typename
    428 	enable_if<!__is_duration<_Rep2>::value, _Rep2>::type>::type, _Period>
    429       operator/(const duration<_Rep1, _Period>& __d, const _Rep2& __s)
    430       {
    431 	typedef duration<typename common_type<_Rep1, _Rep2>::type, _Period>
    432 	  __cd;
    433 	return __cd(__cd(__d).count() / __s);
    434       }
    435 
    436     template<typename _Rep1, typename _Period1,
    437 	     typename _Rep2, typename _Period2>
    438       constexpr typename common_type<_Rep1, _Rep2>::type
    439       operator/(const duration<_Rep1, _Period1>& __lhs,
    440 		const duration<_Rep2, _Period2>& __rhs)
    441       {
    442 	typedef duration<_Rep1, _Period1>			__dur1;
    443 	typedef duration<_Rep2, _Period2>			__dur2;
    444 	typedef typename common_type<__dur1,__dur2>::type	__cd;
    445 	return __cd(__lhs).count() / __cd(__rhs).count();
    446       }
    447 
    448     // DR 934.
    449     template<typename _Rep1, typename _Period, typename _Rep2>
    450       constexpr duration<typename __common_rep_type<_Rep1, typename
    451 	enable_if<!__is_duration<_Rep2>::value, _Rep2>::type>::type, _Period>
    452       operator%(const duration<_Rep1, _Period>& __d, const _Rep2& __s)
    453       {
    454 	typedef duration<typename common_type<_Rep1, _Rep2>::type, _Period>
    455 	  __cd;
    456 	return __cd(__cd(__d).count() % __s);
    457       }
    458 
    459     template<typename _Rep1, typename _Period1,
    460 	     typename _Rep2, typename _Period2>
    461       constexpr typename common_type<duration<_Rep1, _Period1>,
    462 				     duration<_Rep2, _Period2>>::type
    463       operator%(const duration<_Rep1, _Period1>& __lhs,
    464 		const duration<_Rep2, _Period2>& __rhs)
    465       {
    466 	typedef duration<_Rep1, _Period1>			__dur1;
    467 	typedef duration<_Rep2, _Period2>			__dur2;
    468 	typedef typename common_type<__dur1,__dur2>::type	__cd;
    469 	return __cd(__cd(__lhs).count() % __cd(__rhs).count());
    470       }
    471 
    472     // comparisons
    473     template<typename _Rep1, typename _Period1,
    474 	     typename _Rep2, typename _Period2>
    475       constexpr bool
    476       operator==(const duration<_Rep1, _Period1>& __lhs,
    477 		 const duration<_Rep2, _Period2>& __rhs)
    478       {
    479 	typedef duration<_Rep1, _Period1>			__dur1;
    480 	typedef duration<_Rep2, _Period2>			__dur2;
    481 	typedef typename common_type<__dur1,__dur2>::type	__ct;
    482 	return __ct(__lhs).count() == __ct(__rhs).count();
    483       }
    484 
    485     template<typename _Rep1, typename _Period1,
    486 	     typename _Rep2, typename _Period2>
    487       constexpr bool
    488       operator<(const duration<_Rep1, _Period1>& __lhs,
    489 		const duration<_Rep2, _Period2>& __rhs)
    490       {
    491 	typedef duration<_Rep1, _Period1>			__dur1;
    492 	typedef duration<_Rep2, _Period2>			__dur2;
    493 	typedef typename common_type<__dur1,__dur2>::type	__ct;
    494 	return __ct(__lhs).count() < __ct(__rhs).count();
    495       }
    496 
    497     template<typename _Rep1, typename _Period1,
    498 	     typename _Rep2, typename _Period2>
    499       constexpr bool
    500       operator!=(const duration<_Rep1, _Period1>& __lhs,
    501 		 const duration<_Rep2, _Period2>& __rhs)
    502       { return !(__lhs == __rhs); }
    503 
    504     template<typename _Rep1, typename _Period1,
    505 	     typename _Rep2, typename _Period2>
    506       constexpr bool
    507       operator<=(const duration<_Rep1, _Period1>& __lhs,
    508 		 const duration<_Rep2, _Period2>& __rhs)
    509       { return !(__rhs < __lhs); }
    510 
    511     template<typename _Rep1, typename _Period1,
    512 	     typename _Rep2, typename _Period2>
    513       constexpr bool
    514       operator>(const duration<_Rep1, _Period1>& __lhs,
    515 		const duration<_Rep2, _Period2>& __rhs)
    516       { return __rhs < __lhs; }
    517 
    518     template<typename _Rep1, typename _Period1,
    519 	     typename _Rep2, typename _Period2>
    520       constexpr bool
    521       operator>=(const duration<_Rep1, _Period1>& __lhs,
    522 		 const duration<_Rep2, _Period2>& __rhs)
    523       { return !(__lhs < __rhs); }
    524 
    525     /// nanoseconds
    526     typedef duration<int64_t, nano> 	nanoseconds;
    527 
    528     /// microseconds
    529     typedef duration<int64_t, micro> 	microseconds;
    530 
    531     /// milliseconds
    532     typedef duration<int64_t, milli> 	milliseconds;
    533 
    534     /// seconds
    535     typedef duration<int64_t> 		seconds;
    536 
    537     /// minutes
    538     typedef duration<int, ratio< 60>> 	minutes;
    539 
    540     /// hours
    541     typedef duration<int, ratio<3600>> 	hours;
    542 
    543     /// time_point
    544     template<typename _Clock, typename _Dur>
    545       struct time_point
    546       {
    547 	typedef _Clock			  			clock;
    548 	typedef _Dur		  				duration;
    549 	typedef typename duration::rep	  			rep;
    550 	typedef typename duration::period			period;
    551 
    552 	constexpr time_point() : __d(duration::zero())
    553 	{ }
    554 
    555 	constexpr explicit time_point(const duration& __dur)
    556 	: __d(__dur)
    557 	{ }
    558 
    559 	// conversions
    560 	template<typename _Dur2>
    561 	  constexpr time_point(const time_point<clock, _Dur2>& __t)
    562 	  : __d(__t.time_since_epoch())
    563 	  { }
    564 
    565 	// observer
    566 	constexpr duration
    567 	time_since_epoch() const
    568 	{ return __d; }
    569 
    570 	// arithmetic
    571 	time_point&
    572 	operator+=(const duration& __dur)
    573 	{
    574 	  __d += __dur;
    575 	  return *this;
    576 	}
    577 
    578 	time_point&
    579 	operator-=(const duration& __dur)
    580 	{
    581 	  __d -= __dur;
    582 	  return *this;
    583 	}
    584 
    585 	// special values
    586 	static constexpr time_point
    587 	min()
    588 	{ return time_point(duration::min()); }
    589 
    590 	static constexpr time_point
    591 	max()
    592 	{ return time_point(duration::max()); }
    593 
    594       private:
    595 	duration __d;
    596       };
    597 
    598     /// time_point_cast
    599     template<typename _ToDur, typename _Clock, typename _Dur>
    600       constexpr typename enable_if<__is_duration<_ToDur>::value,
    601 				   time_point<_Clock, _ToDur>>::type
    602       time_point_cast(const time_point<_Clock, _Dur>& __t)
    603       {
    604 	typedef time_point<_Clock, _ToDur> 			__time_point;
    605 	return __time_point(duration_cast<_ToDur>(__t.time_since_epoch()));
    606       }
    607 
    608     template<typename _Clock, typename _Dur1,
    609 	     typename _Rep2, typename _Period2>
    610       constexpr time_point<_Clock,
    611 	typename common_type<_Dur1, duration<_Rep2, _Period2>>::type>
    612       operator+(const time_point<_Clock, _Dur1>& __lhs,
    613 		const duration<_Rep2, _Period2>& __rhs)
    614       {
    615 	typedef duration<_Rep2, _Period2>			__dur2;
    616 	typedef typename common_type<_Dur1,__dur2>::type	__ct;
    617 	typedef time_point<_Clock, __ct> 			__time_point;
    618 	return __time_point(__lhs.time_since_epoch() + __rhs);
    619       }
    620 
    621     template<typename _Rep1, typename _Period1,
    622 	     typename _Clock, typename _Dur2>
    623       constexpr time_point<_Clock,
    624 	typename common_type<duration<_Rep1, _Period1>, _Dur2>::type>
    625       operator+(const duration<_Rep1, _Period1>& __lhs,
    626 		const time_point<_Clock, _Dur2>& __rhs)
    627       { 
    628 	typedef duration<_Rep1, _Period1>			__dur1;
    629 	typedef typename common_type<__dur1,_Dur2>::type	__ct;
    630 	typedef time_point<_Clock, __ct> 			__time_point;
    631 	return __time_point(__rhs.time_since_epoch() + __lhs); 
    632       }
    633 
    634     template<typename _Clock, typename _Dur1,
    635 	     typename _Rep2, typename _Period2>
    636       constexpr time_point<_Clock,
    637 	typename common_type<_Dur1, duration<_Rep2, _Period2>>::type>
    638       operator-(const time_point<_Clock, _Dur1>& __lhs,
    639 		const duration<_Rep2, _Period2>& __rhs)
    640       { 
    641 	typedef duration<_Rep2, _Period2>			__dur2;
    642 	typedef typename common_type<_Dur1,__dur2>::type	__ct;
    643 	typedef time_point<_Clock, __ct> 			__time_point;
    644 	return __time_point(__lhs.time_since_epoch() -__rhs); 
    645       }
    646 
    647     template<typename _Clock, typename _Dur1, typename _Dur2>
    648       constexpr typename common_type<_Dur1, _Dur2>::type
    649       operator-(const time_point<_Clock, _Dur1>& __lhs,
    650 		const time_point<_Clock, _Dur2>& __rhs)
    651       { return __lhs.time_since_epoch() - __rhs.time_since_epoch(); }
    652 
    653     template<typename _Clock, typename _Dur1, typename _Dur2>
    654       constexpr bool
    655       operator==(const time_point<_Clock, _Dur1>& __lhs,
    656 		 const time_point<_Clock, _Dur2>& __rhs)
    657       { return __lhs.time_since_epoch() == __rhs.time_since_epoch(); }
    658 
    659     template<typename _Clock, typename _Dur1, typename _Dur2>
    660       constexpr bool
    661       operator!=(const time_point<_Clock, _Dur1>& __lhs,
    662 		 const time_point<_Clock, _Dur2>& __rhs)
    663       { return !(__lhs == __rhs); }
    664 
    665     template<typename _Clock, typename _Dur1, typename _Dur2>
    666       constexpr bool
    667       operator<(const time_point<_Clock, _Dur1>& __lhs,
    668 		const time_point<_Clock, _Dur2>& __rhs)
    669       { return  __lhs.time_since_epoch() < __rhs.time_since_epoch(); }
    670 
    671     template<typename _Clock, typename _Dur1, typename _Dur2>
    672       constexpr bool
    673       operator<=(const time_point<_Clock, _Dur1>& __lhs,
    674 		 const time_point<_Clock, _Dur2>& __rhs)
    675       { return !(__rhs < __lhs); }
    676 
    677     template<typename _Clock, typename _Dur1, typename _Dur2>
    678       constexpr bool
    679       operator>(const time_point<_Clock, _Dur1>& __lhs,
    680 		const time_point<_Clock, _Dur2>& __rhs)
    681       { return __rhs < __lhs; }
    682 
    683     template<typename _Clock, typename _Dur1, typename _Dur2>
    684       constexpr bool
    685       operator>=(const time_point<_Clock, _Dur1>& __lhs,
    686 		 const time_point<_Clock, _Dur2>& __rhs)
    687       { return !(__lhs < __rhs); }
    688 
    689 
    690     // Clocks. 
    691 
    692     // Why nanosecond resolution as the default?  
    693     // Why have std::system_clock always count in the higest
    694     // resolution (ie nanoseconds), even if on some OSes the low 3
    695     // or 9 decimal digits will be always zero? This allows later
    696     // implementations to change the system_clock::now()
    697     // implementation any time to provide better resolution without
    698     // changing function signature or units.
    699 
    700     // To support the (forward) evolution of the library's defined
    701     // clocks, wrap inside inline namespace so that the current
    702     // defintions of system_clock, steady_clock, and
    703     // high_resolution_clock types are uniquely mangled. This way, new
    704     // code can use the latests clocks, while the library can contain
    705     // compatibility definitions for previous versions.  At some
    706     // point, when these clocks settle down, the inlined namespaces
    707     // can be removed.  XXX GLIBCXX_ABI Deprecated
    708     inline namespace _V2 {
    709 
    710     /**
    711      *  @brief System clock.
    712      *
    713      *  Time returned represents wall time from the system-wide clock.
    714     */
    715      struct system_clock
    716     {
    717       typedef chrono::nanoseconds     				duration;
    718       typedef duration::rep    					rep;
    719       typedef duration::period 					period;
    720       typedef chrono::time_point<system_clock, duration> 	time_point;
    721 
    722       static_assert(system_clock::duration::min()
    723 		    < system_clock::duration::zero(),
    724 		    "a clock's minimum duration cannot be less than its epoch");
    725 
    726       static constexpr bool is_steady = false;
    727 
    728       static time_point
    729       now() noexcept;
    730 
    731       // Map to C API
    732       static std::time_t
    733       to_time_t(const time_point& __t) noexcept
    734       {
    735 	return std::time_t(duration_cast<chrono::seconds>
    736 			   (__t.time_since_epoch()).count());
    737       }
    738 
    739       static time_point
    740       from_time_t(std::time_t __t) noexcept
    741       {
    742 	typedef chrono::time_point<system_clock, seconds>	__from;
    743 	return time_point_cast<system_clock::duration>
    744 	       (__from(chrono::seconds(__t)));
    745       }
    746     };
    747 
    748 
    749     /**
    750      *  @brief Monotonic clock
    751      *
    752      *  Time returned has the property of only increasing at a uniform rate.
    753     */
    754     struct steady_clock
    755     {
    756       typedef chrono::nanoseconds 				duration;
    757       typedef duration::rep	  				rep;
    758       typedef duration::period	  				period;
    759       typedef chrono::time_point<steady_clock, duration> 	time_point;
    760 
    761       static constexpr bool is_steady = true;
    762 
    763       static time_point
    764       now() noexcept;
    765     };
    766 
    767 
    768     /**
    769      *  @brief Highest-resolution clock
    770      *
    771      *  This is the clock "with the shortest tick period." Alias to
    772      *  std::system_clock until higher-than-nanosecond definitions
    773      *  become feasible.
    774     */
    775     using high_resolution_clock = system_clock;
    776 
    777   } // end inline namespace _V2
    778 
    779   _GLIBCXX_END_NAMESPACE_VERSION
    780   } // namespace chrono
    781 
    782   // @} group chrono
    783 } // namespace
    784 
    785 #endif //_GLIBCXX_USE_C99_STDINT_TR1
    786 
    787 #endif // C++11
    788 
    789 #endif //_GLIBCXX_CHRONO
    790