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