xref: /dflybsd-src/contrib/gcc-8.0/libstdc++-v3/include/std/chrono (revision 95059079af47f9a66a175f374f2da1a5020e3255)
138fd1498Szrj// <chrono> -*- C++ -*-
238fd1498Szrj
338fd1498Szrj// Copyright (C) 2008-2018 Free Software Foundation, Inc.
438fd1498Szrj//
538fd1498Szrj// This file is part of the GNU ISO C++ Library.  This library is free
638fd1498Szrj// software; you can redistribute it and/or modify it under the
738fd1498Szrj// terms of the GNU General Public License as published by the
838fd1498Szrj// Free Software Foundation; either version 3, or (at your option)
938fd1498Szrj// any later version.
1038fd1498Szrj
1138fd1498Szrj// This library is distributed in the hope that it will be useful,
1238fd1498Szrj// but WITHOUT ANY WARRANTY; without even the implied warranty of
1338fd1498Szrj// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1438fd1498Szrj// GNU General Public License for more details.
1538fd1498Szrj
1638fd1498Szrj// Under Section 7 of GPL version 3, you are granted additional
1738fd1498Szrj// permissions described in the GCC Runtime Library Exception, version
1838fd1498Szrj// 3.1, as published by the Free Software Foundation.
1938fd1498Szrj
2038fd1498Szrj// You should have received a copy of the GNU General Public License and
2138fd1498Szrj// a copy of the GCC Runtime Library Exception along with this program;
2238fd1498Szrj// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
2338fd1498Szrj// <http://www.gnu.org/licenses/>.
2438fd1498Szrj
2538fd1498Szrj/** @file include/chrono
2638fd1498Szrj *  This is a Standard C++ Library header.
2738fd1498Szrj */
2838fd1498Szrj
2938fd1498Szrj#ifndef _GLIBCXX_CHRONO
3038fd1498Szrj#define _GLIBCXX_CHRONO 1
3138fd1498Szrj
3238fd1498Szrj#pragma GCC system_header
3338fd1498Szrj
3438fd1498Szrj#if __cplusplus < 201103L
3538fd1498Szrj# include <bits/c++0x_warning.h>
3638fd1498Szrj#else
3738fd1498Szrj
3838fd1498Szrj#include <ratio>
3938fd1498Szrj#include <type_traits>
4038fd1498Szrj#include <limits>
4138fd1498Szrj#include <ctime>
4238fd1498Szrj#include <bits/parse_numbers.h> // for literals support.
4338fd1498Szrj
4438fd1498Szrj#ifdef _GLIBCXX_USE_C99_STDINT_TR1
4538fd1498Szrj
4638fd1498Szrjnamespace std _GLIBCXX_VISIBILITY(default)
4738fd1498Szrj{
4838fd1498Szrj_GLIBCXX_BEGIN_NAMESPACE_VERSION
4938fd1498Szrj
5038fd1498Szrj  /**
5138fd1498Szrj   * @defgroup chrono Time
5238fd1498Szrj   * @ingroup utilities
5338fd1498Szrj   *
5438fd1498Szrj   * Classes and functions for time.
5538fd1498Szrj   * @{
5638fd1498Szrj   */
5738fd1498Szrj
5838fd1498Szrj  /** @namespace std::chrono
5938fd1498Szrj   *  @brief ISO C++ 2011 entities sub-namespace for time and date.
6038fd1498Szrj   */
6138fd1498Szrj  namespace chrono
6238fd1498Szrj  {
6338fd1498Szrj    template<typename _Rep, typename _Period = ratio<1>>
6438fd1498Szrj      struct duration;
6538fd1498Szrj
6638fd1498Szrj    template<typename _Clock, typename _Dur = typename _Clock::duration>
6738fd1498Szrj      struct time_point;
6838fd1498Szrj  }
6938fd1498Szrj
7038fd1498Szrj  // 20.11.4.3 specialization of common_type (for duration, sfinae-friendly)
7138fd1498Szrj
7238fd1498Szrj  template<typename _CT, typename _Period1, typename _Period2>
7338fd1498Szrj    struct __duration_common_type_wrapper
7438fd1498Szrj    {
7538fd1498Szrj    private:
7638fd1498Szrj      typedef __static_gcd<_Period1::num, _Period2::num> __gcd_num;
7738fd1498Szrj      typedef __static_gcd<_Period1::den, _Period2::den> __gcd_den;
7838fd1498Szrj      typedef typename _CT::type __cr;
7938fd1498Szrj      typedef ratio<__gcd_num::value,
8038fd1498Szrj        (_Period1::den / __gcd_den::value) * _Period2::den> __r;
8138fd1498Szrj    public:
8238fd1498Szrj      typedef __success_type<chrono::duration<__cr, __r>> type;
8338fd1498Szrj    };
8438fd1498Szrj
8538fd1498Szrj  template<typename _Period1, typename _Period2>
8638fd1498Szrj    struct __duration_common_type_wrapper<__failure_type, _Period1, _Period2>
8738fd1498Szrj    { typedef __failure_type type; };
8838fd1498Szrj
8938fd1498Szrj  template<typename _Rep1, typename _Period1, typename _Rep2, typename _Period2>
9038fd1498Szrj    struct common_type<chrono::duration<_Rep1, _Period1>,
9138fd1498Szrj             chrono::duration<_Rep2, _Period2>>
9238fd1498Szrj    : public __duration_common_type_wrapper<typename __member_type_wrapper<
9338fd1498Szrj             common_type<_Rep1, _Rep2>>::type, _Period1, _Period2>::type
9438fd1498Szrj    { };
9538fd1498Szrj
9638fd1498Szrj  // 20.11.4.3 specialization of common_type (for time_point, sfinae-friendly)
9738fd1498Szrj
9838fd1498Szrj  template<typename _CT, typename _Clock>
9938fd1498Szrj    struct __timepoint_common_type_wrapper
10038fd1498Szrj    {
10138fd1498Szrj      typedef __success_type<chrono::time_point<_Clock, typename _CT::type>>
10238fd1498Szrj        type;
10338fd1498Szrj    };
10438fd1498Szrj
10538fd1498Szrj  template<typename _Clock>
10638fd1498Szrj    struct __timepoint_common_type_wrapper<__failure_type, _Clock>
10738fd1498Szrj    { typedef __failure_type type; };
10838fd1498Szrj
10938fd1498Szrj  template<typename _Clock, typename _Duration1, typename _Duration2>
11038fd1498Szrj    struct common_type<chrono::time_point<_Clock, _Duration1>,
11138fd1498Szrj             chrono::time_point<_Clock, _Duration2>>
11238fd1498Szrj    : public __timepoint_common_type_wrapper<typename __member_type_wrapper<
11338fd1498Szrj             common_type<_Duration1, _Duration2>>::type, _Clock>::type
11438fd1498Szrj    { };
11538fd1498Szrj
11638fd1498Szrj  namespace chrono
11738fd1498Szrj  {
11838fd1498Szrj    // Primary template for duration_cast impl.
11938fd1498Szrj    template<typename _ToDur, typename _CF, typename _CR,
12038fd1498Szrj	     bool _NumIsOne = false, bool _DenIsOne = false>
12138fd1498Szrj      struct __duration_cast_impl
12238fd1498Szrj      {
12338fd1498Szrj	template<typename _Rep, typename _Period>
12438fd1498Szrj	  static constexpr _ToDur
12538fd1498Szrj	  __cast(const duration<_Rep, _Period>& __d)
12638fd1498Szrj	  {
12738fd1498Szrj	    typedef typename _ToDur::rep			__to_rep;
12838fd1498Szrj	    return _ToDur(static_cast<__to_rep>(static_cast<_CR>(__d.count())
12938fd1498Szrj	      * static_cast<_CR>(_CF::num)
13038fd1498Szrj	      / static_cast<_CR>(_CF::den)));
13138fd1498Szrj	  }
13238fd1498Szrj      };
13338fd1498Szrj
13438fd1498Szrj    template<typename _ToDur, typename _CF, typename _CR>
13538fd1498Szrj      struct __duration_cast_impl<_ToDur, _CF, _CR, true, true>
13638fd1498Szrj      {
13738fd1498Szrj	template<typename _Rep, typename _Period>
13838fd1498Szrj	  static constexpr _ToDur
13938fd1498Szrj	  __cast(const duration<_Rep, _Period>& __d)
14038fd1498Szrj	  {
14138fd1498Szrj	    typedef typename _ToDur::rep			__to_rep;
14238fd1498Szrj	    return _ToDur(static_cast<__to_rep>(__d.count()));
14338fd1498Szrj	  }
14438fd1498Szrj      };
14538fd1498Szrj
14638fd1498Szrj    template<typename _ToDur, typename _CF, typename _CR>
14738fd1498Szrj      struct __duration_cast_impl<_ToDur, _CF, _CR, true, false>
14838fd1498Szrj      {
14938fd1498Szrj	template<typename _Rep, typename _Period>
15038fd1498Szrj	  static constexpr _ToDur
15138fd1498Szrj	  __cast(const duration<_Rep, _Period>& __d)
15238fd1498Szrj	  {
15338fd1498Szrj	    typedef typename _ToDur::rep			__to_rep;
15438fd1498Szrj	    return _ToDur(static_cast<__to_rep>(
15538fd1498Szrj	      static_cast<_CR>(__d.count()) / static_cast<_CR>(_CF::den)));
15638fd1498Szrj	  }
15738fd1498Szrj      };
15838fd1498Szrj
15938fd1498Szrj    template<typename _ToDur, typename _CF, typename _CR>
16038fd1498Szrj      struct __duration_cast_impl<_ToDur, _CF, _CR, false, true>
16138fd1498Szrj      {
16238fd1498Szrj	template<typename _Rep, typename _Period>
16338fd1498Szrj	  static constexpr _ToDur
16438fd1498Szrj	  __cast(const duration<_Rep, _Period>& __d)
16538fd1498Szrj	  {
16638fd1498Szrj	    typedef typename _ToDur::rep			__to_rep;
16738fd1498Szrj	    return _ToDur(static_cast<__to_rep>(
16838fd1498Szrj	      static_cast<_CR>(__d.count()) * static_cast<_CR>(_CF::num)));
16938fd1498Szrj	  }
17038fd1498Szrj      };
17138fd1498Szrj
17238fd1498Szrj    template<typename _Tp>
17338fd1498Szrj      struct __is_duration
17438fd1498Szrj      : std::false_type
17538fd1498Szrj      { };
17638fd1498Szrj
17738fd1498Szrj    template<typename _Rep, typename _Period>
17838fd1498Szrj      struct __is_duration<duration<_Rep, _Period>>
17938fd1498Szrj      : std::true_type
18038fd1498Szrj      { };
18138fd1498Szrj
18238fd1498Szrj    template<typename _Tp>
18338fd1498Szrj      using __enable_if_is_duration
18438fd1498Szrj	= typename enable_if<__is_duration<_Tp>::value, _Tp>::type;
18538fd1498Szrj
18638fd1498Szrj    template<typename _Tp>
18738fd1498Szrj      using __disable_if_is_duration
18838fd1498Szrj	= typename enable_if<!__is_duration<_Tp>::value, _Tp>::type;
18938fd1498Szrj
19038fd1498Szrj    /// duration_cast
19138fd1498Szrj    template<typename _ToDur, typename _Rep, typename _Period>
19238fd1498Szrj      constexpr __enable_if_is_duration<_ToDur>
19338fd1498Szrj      duration_cast(const duration<_Rep, _Period>& __d)
19438fd1498Szrj      {
19538fd1498Szrj	typedef typename _ToDur::period				__to_period;
19638fd1498Szrj	typedef typename _ToDur::rep				__to_rep;
19738fd1498Szrj	typedef ratio_divide<_Period, __to_period> 		__cf;
19838fd1498Szrj	typedef typename common_type<__to_rep, _Rep, intmax_t>::type
19938fd1498Szrj	  							__cr;
20038fd1498Szrj	typedef  __duration_cast_impl<_ToDur, __cf, __cr,
20138fd1498Szrj				      __cf::num == 1, __cf::den == 1> __dc;
20238fd1498Szrj	return __dc::__cast(__d);
20338fd1498Szrj      }
20438fd1498Szrj
20538fd1498Szrj    /// treat_as_floating_point
20638fd1498Szrj    template<typename _Rep>
20738fd1498Szrj      struct treat_as_floating_point
20838fd1498Szrj      : is_floating_point<_Rep>
20938fd1498Szrj      { };
21038fd1498Szrj
21138fd1498Szrj#if __cplusplus > 201402L
21238fd1498Szrj    template <typename _Rep>
21338fd1498Szrj      inline constexpr bool treat_as_floating_point_v =
21438fd1498Szrj        treat_as_floating_point<_Rep>::value;
21538fd1498Szrj#endif // C++17
21638fd1498Szrj
21738fd1498Szrj#if __cplusplus >= 201703L
21838fd1498Szrj# define __cpp_lib_chrono 201611
21938fd1498Szrj
22038fd1498Szrj    template<typename _ToDur, typename _Rep, typename _Period>
22138fd1498Szrj      constexpr __enable_if_is_duration<_ToDur>
22238fd1498Szrj      floor(const duration<_Rep, _Period>& __d)
22338fd1498Szrj      {
22438fd1498Szrj	auto __to = chrono::duration_cast<_ToDur>(__d);
22538fd1498Szrj	if (__to > __d)
22638fd1498Szrj	  return __to - _ToDur{1};
22738fd1498Szrj	return __to;
22838fd1498Szrj      }
22938fd1498Szrj
23038fd1498Szrj    template<typename _ToDur, typename _Rep, typename _Period>
23138fd1498Szrj      constexpr __enable_if_is_duration<_ToDur>
23238fd1498Szrj      ceil(const duration<_Rep, _Period>& __d)
23338fd1498Szrj      {
23438fd1498Szrj	auto __to = chrono::duration_cast<_ToDur>(__d);
23538fd1498Szrj	if (__to < __d)
23638fd1498Szrj	  return __to + _ToDur{1};
23738fd1498Szrj	return __to;
23838fd1498Szrj      }
23938fd1498Szrj
24038fd1498Szrj    template <typename _ToDur, typename _Rep, typename _Period>
24138fd1498Szrj      constexpr enable_if_t<
24238fd1498Szrj	__and_<__is_duration<_ToDur>,
24338fd1498Szrj	       __not_<treat_as_floating_point<typename _ToDur::rep>>>::value,
24438fd1498Szrj	_ToDur>
24538fd1498Szrj      round(const duration<_Rep, _Period>& __d)
24638fd1498Szrj      {
24738fd1498Szrj	_ToDur __t0 = chrono::floor<_ToDur>(__d);
24838fd1498Szrj	_ToDur __t1 = __t0 + _ToDur{1};
24938fd1498Szrj	auto __diff0 = __d - __t0;
25038fd1498Szrj	auto __diff1 = __t1 - __d;
25138fd1498Szrj	if (__diff0 == __diff1)
25238fd1498Szrj	{
25338fd1498Szrj	    if (__t0.count() & 1)
25438fd1498Szrj		return __t1;
25538fd1498Szrj	    return __t0;
25638fd1498Szrj	}
25738fd1498Szrj	else if (__diff0 < __diff1)
25838fd1498Szrj	    return __t0;
25938fd1498Szrj	return __t1;
26038fd1498Szrj      }
26138fd1498Szrj
26238fd1498Szrj    template<typename _Rep, typename _Period>
26338fd1498Szrj      constexpr
26438fd1498Szrj      enable_if_t<numeric_limits<_Rep>::is_signed, duration<_Rep, _Period>>
26538fd1498Szrj      abs(duration<_Rep, _Period> __d)
26638fd1498Szrj      {
26738fd1498Szrj	if (__d >= __d.zero())
26838fd1498Szrj	  return __d;
26938fd1498Szrj	return -__d;
27038fd1498Szrj      }
27138fd1498Szrj#endif // C++17
27238fd1498Szrj
27338fd1498Szrj    /// duration_values
27438fd1498Szrj    template<typename _Rep>
27538fd1498Szrj      struct duration_values
27638fd1498Szrj      {
27738fd1498Szrj	static constexpr _Rep
278*58e805e6Szrj	zero() noexcept
27938fd1498Szrj	{ return _Rep(0); }
28038fd1498Szrj
28138fd1498Szrj	static constexpr _Rep
282*58e805e6Szrj	max() noexcept
28338fd1498Szrj	{ return numeric_limits<_Rep>::max(); }
28438fd1498Szrj
28538fd1498Szrj	static constexpr _Rep
286*58e805e6Szrj	min() noexcept
28738fd1498Szrj	{ return numeric_limits<_Rep>::lowest(); }
28838fd1498Szrj      };
28938fd1498Szrj
29038fd1498Szrj    template<typename _Tp>
29138fd1498Szrj      struct __is_ratio
29238fd1498Szrj      : std::false_type
29338fd1498Szrj      { };
29438fd1498Szrj
29538fd1498Szrj    template<intmax_t _Num, intmax_t _Den>
29638fd1498Szrj      struct __is_ratio<ratio<_Num, _Den>>
29738fd1498Szrj      : std::true_type
29838fd1498Szrj      { };
29938fd1498Szrj
30038fd1498Szrj    /// duration
30138fd1498Szrj    template<typename _Rep, typename _Period>
30238fd1498Szrj      struct duration
30338fd1498Szrj      {
30438fd1498Szrj      private:
30538fd1498Szrj	template<typename _Rep2>
30638fd1498Szrj	  using __is_float = treat_as_floating_point<_Rep2>;
30738fd1498Szrj
30838fd1498Szrj	// _Period2 is an exact multiple of _Period
30938fd1498Szrj	template<typename _Period2>
31038fd1498Szrj	  using __is_harmonic
31138fd1498Szrj	    = __bool_constant<ratio_divide<_Period2, _Period>::den == 1>;
31238fd1498Szrj
31338fd1498Szrj      public:
31438fd1498Szrj
31538fd1498Szrj	typedef _Rep						rep;
31638fd1498Szrj	typedef _Period 					period;
31738fd1498Szrj
31838fd1498Szrj	static_assert(!__is_duration<_Rep>::value, "rep cannot be a duration");
31938fd1498Szrj	static_assert(__is_ratio<_Period>::value,
32038fd1498Szrj		      "period must be a specialization of ratio");
32138fd1498Szrj	static_assert(_Period::num > 0, "period must be positive");
32238fd1498Szrj
32338fd1498Szrj	// 20.11.5.1 construction / copy / destroy
32438fd1498Szrj	constexpr duration() = default;
32538fd1498Szrj
32638fd1498Szrj	duration(const duration&) = default;
32738fd1498Szrj
328*58e805e6Szrj	// _GLIBCXX_RESOLVE_LIB_DEFECTS
329*58e805e6Szrj	// 3050. Conversion specification problem in chrono::duration
33038fd1498Szrj	template<typename _Rep2, typename = _Require<
331*58e805e6Szrj		 is_convertible<const _Rep2&, rep>,
33238fd1498Szrj		 __or_<__is_float<rep>, __not_<__is_float<_Rep2>>>>>
33338fd1498Szrj	  constexpr explicit duration(const _Rep2& __rep)
33438fd1498Szrj	  : __r(static_cast<rep>(__rep)) { }
33538fd1498Szrj
33638fd1498Szrj	template<typename _Rep2, typename _Period2, typename = _Require<
33738fd1498Szrj		 __or_<__is_float<rep>,
33838fd1498Szrj		       __and_<__is_harmonic<_Period2>,
33938fd1498Szrj			      __not_<__is_float<_Rep2>>>>>>
34038fd1498Szrj	  constexpr duration(const duration<_Rep2, _Period2>& __d)
34138fd1498Szrj	  : __r(duration_cast<duration>(__d).count()) { }
34238fd1498Szrj
34338fd1498Szrj	~duration() = default;
34438fd1498Szrj	duration& operator=(const duration&) = default;
34538fd1498Szrj
34638fd1498Szrj	// 20.11.5.2 observer
34738fd1498Szrj	constexpr rep
34838fd1498Szrj	count() const
34938fd1498Szrj	{ return __r; }
35038fd1498Szrj
35138fd1498Szrj	// 20.11.5.3 arithmetic
35238fd1498Szrj	constexpr duration
35338fd1498Szrj	operator+() const
35438fd1498Szrj	{ return *this; }
35538fd1498Szrj
35638fd1498Szrj	constexpr duration
35738fd1498Szrj	operator-() const
35838fd1498Szrj	{ return duration(-__r); }
35938fd1498Szrj
36038fd1498Szrj	_GLIBCXX17_CONSTEXPR duration&
36138fd1498Szrj	operator++()
36238fd1498Szrj	{
36338fd1498Szrj	  ++__r;
36438fd1498Szrj	  return *this;
36538fd1498Szrj	}
36638fd1498Szrj
36738fd1498Szrj	_GLIBCXX17_CONSTEXPR duration
36838fd1498Szrj	operator++(int)
36938fd1498Szrj	{ return duration(__r++); }
37038fd1498Szrj
37138fd1498Szrj	_GLIBCXX17_CONSTEXPR duration&
37238fd1498Szrj	operator--()
37338fd1498Szrj	{
37438fd1498Szrj	  --__r;
37538fd1498Szrj	  return *this;
37638fd1498Szrj	}
37738fd1498Szrj
37838fd1498Szrj	_GLIBCXX17_CONSTEXPR duration
37938fd1498Szrj	operator--(int)
38038fd1498Szrj	{ return duration(__r--); }
38138fd1498Szrj
38238fd1498Szrj	_GLIBCXX17_CONSTEXPR duration&
38338fd1498Szrj	operator+=(const duration& __d)
38438fd1498Szrj	{
38538fd1498Szrj	  __r += __d.count();
38638fd1498Szrj	  return *this;
38738fd1498Szrj	}
38838fd1498Szrj
38938fd1498Szrj	_GLIBCXX17_CONSTEXPR duration&
39038fd1498Szrj	operator-=(const duration& __d)
39138fd1498Szrj	{
39238fd1498Szrj	  __r -= __d.count();
39338fd1498Szrj	  return *this;
39438fd1498Szrj	}
39538fd1498Szrj
39638fd1498Szrj	_GLIBCXX17_CONSTEXPR duration&
39738fd1498Szrj	operator*=(const rep& __rhs)
39838fd1498Szrj	{
39938fd1498Szrj	  __r *= __rhs;
40038fd1498Szrj	  return *this;
40138fd1498Szrj	}
40238fd1498Szrj
40338fd1498Szrj	_GLIBCXX17_CONSTEXPR duration&
40438fd1498Szrj	operator/=(const rep& __rhs)
40538fd1498Szrj	{
40638fd1498Szrj	  __r /= __rhs;
40738fd1498Szrj	  return *this;
40838fd1498Szrj	}
40938fd1498Szrj
41038fd1498Szrj	// DR 934.
41138fd1498Szrj	template<typename _Rep2 = rep>
41238fd1498Szrj	  _GLIBCXX17_CONSTEXPR
41338fd1498Szrj	  typename enable_if<!treat_as_floating_point<_Rep2>::value,
41438fd1498Szrj			     duration&>::type
41538fd1498Szrj	  operator%=(const rep& __rhs)
41638fd1498Szrj	  {
41738fd1498Szrj	    __r %= __rhs;
41838fd1498Szrj	    return *this;
41938fd1498Szrj	  }
42038fd1498Szrj
42138fd1498Szrj	template<typename _Rep2 = rep>
42238fd1498Szrj	  _GLIBCXX17_CONSTEXPR
42338fd1498Szrj	  typename enable_if<!treat_as_floating_point<_Rep2>::value,
42438fd1498Szrj			     duration&>::type
42538fd1498Szrj	  operator%=(const duration& __d)
42638fd1498Szrj	  {
42738fd1498Szrj	    __r %= __d.count();
42838fd1498Szrj	    return *this;
42938fd1498Szrj	  }
43038fd1498Szrj
43138fd1498Szrj	// 20.11.5.4 special values
43238fd1498Szrj	static constexpr duration
433*58e805e6Szrj	zero() noexcept
43438fd1498Szrj	{ return duration(duration_values<rep>::zero()); }
43538fd1498Szrj
43638fd1498Szrj	static constexpr duration
437*58e805e6Szrj	min() noexcept
43838fd1498Szrj	{ return duration(duration_values<rep>::min()); }
43938fd1498Szrj
44038fd1498Szrj	static constexpr duration
441*58e805e6Szrj	max() noexcept
44238fd1498Szrj	{ return duration(duration_values<rep>::max()); }
44338fd1498Szrj
44438fd1498Szrj      private:
44538fd1498Szrj	rep __r;
44638fd1498Szrj      };
44738fd1498Szrj
44838fd1498Szrj    template<typename _Rep1, typename _Period1,
44938fd1498Szrj	     typename _Rep2, typename _Period2>
45038fd1498Szrj      constexpr typename common_type<duration<_Rep1, _Period1>,
45138fd1498Szrj				     duration<_Rep2, _Period2>>::type
45238fd1498Szrj      operator+(const duration<_Rep1, _Period1>& __lhs,
45338fd1498Szrj		const duration<_Rep2, _Period2>& __rhs)
45438fd1498Szrj      {
45538fd1498Szrj	typedef duration<_Rep1, _Period1>			__dur1;
45638fd1498Szrj	typedef duration<_Rep2, _Period2>			__dur2;
45738fd1498Szrj	typedef typename common_type<__dur1,__dur2>::type	__cd;
45838fd1498Szrj	return __cd(__cd(__lhs).count() + __cd(__rhs).count());
45938fd1498Szrj      }
46038fd1498Szrj
46138fd1498Szrj    template<typename _Rep1, typename _Period1,
46238fd1498Szrj	     typename _Rep2, typename _Period2>
46338fd1498Szrj      constexpr typename common_type<duration<_Rep1, _Period1>,
46438fd1498Szrj				     duration<_Rep2, _Period2>>::type
46538fd1498Szrj      operator-(const duration<_Rep1, _Period1>& __lhs,
46638fd1498Szrj		const duration<_Rep2, _Period2>& __rhs)
46738fd1498Szrj      {
46838fd1498Szrj	typedef duration<_Rep1, _Period1>			__dur1;
46938fd1498Szrj	typedef duration<_Rep2, _Period2>			__dur2;
47038fd1498Szrj	typedef typename common_type<__dur1,__dur2>::type	__cd;
47138fd1498Szrj	return __cd(__cd(__lhs).count() - __cd(__rhs).count());
47238fd1498Szrj      }
47338fd1498Szrj
47438fd1498Szrj    // SFINAE helper to obtain common_type<_Rep1, _Rep2> only if _Rep2
47538fd1498Szrj    // is implicitly convertible to it.
476*58e805e6Szrj    // _GLIBCXX_RESOLVE_LIB_DEFECTS
477*58e805e6Szrj    // 3050. Conversion specification problem in chrono::duration constructor
47838fd1498Szrj    template<typename _Rep1, typename _Rep2,
47938fd1498Szrj	     typename _CRep = typename common_type<_Rep1, _Rep2>::type>
480*58e805e6Szrj      using __common_rep_t = typename
481*58e805e6Szrj	enable_if<is_convertible<const _Rep2&, _CRep>::value, _CRep>::type;
48238fd1498Szrj
48338fd1498Szrj    template<typename _Rep1, typename _Period, typename _Rep2>
48438fd1498Szrj      constexpr duration<__common_rep_t<_Rep1, _Rep2>, _Period>
48538fd1498Szrj      operator*(const duration<_Rep1, _Period>& __d, const _Rep2& __s)
48638fd1498Szrj      {
48738fd1498Szrj	typedef duration<typename common_type<_Rep1, _Rep2>::type, _Period>
48838fd1498Szrj	  __cd;
48938fd1498Szrj	return __cd(__cd(__d).count() * __s);
49038fd1498Szrj      }
49138fd1498Szrj
49238fd1498Szrj    template<typename _Rep1, typename _Rep2, typename _Period>
49338fd1498Szrj      constexpr duration<__common_rep_t<_Rep2, _Rep1>, _Period>
49438fd1498Szrj      operator*(const _Rep1& __s, const duration<_Rep2, _Period>& __d)
49538fd1498Szrj      { return __d * __s; }
49638fd1498Szrj
49738fd1498Szrj    template<typename _Rep1, typename _Period, typename _Rep2>
49838fd1498Szrj      constexpr
49938fd1498Szrj      duration<__common_rep_t<_Rep1, __disable_if_is_duration<_Rep2>>, _Period>
50038fd1498Szrj      operator/(const duration<_Rep1, _Period>& __d, const _Rep2& __s)
50138fd1498Szrj      {
50238fd1498Szrj	typedef duration<typename common_type<_Rep1, _Rep2>::type, _Period>
50338fd1498Szrj	  __cd;
50438fd1498Szrj	return __cd(__cd(__d).count() / __s);
50538fd1498Szrj      }
50638fd1498Szrj
50738fd1498Szrj    template<typename _Rep1, typename _Period1,
50838fd1498Szrj	     typename _Rep2, typename _Period2>
50938fd1498Szrj      constexpr typename common_type<_Rep1, _Rep2>::type
51038fd1498Szrj      operator/(const duration<_Rep1, _Period1>& __lhs,
51138fd1498Szrj		const duration<_Rep2, _Period2>& __rhs)
51238fd1498Szrj      {
51338fd1498Szrj	typedef duration<_Rep1, _Period1>			__dur1;
51438fd1498Szrj	typedef duration<_Rep2, _Period2>			__dur2;
51538fd1498Szrj	typedef typename common_type<__dur1,__dur2>::type	__cd;
51638fd1498Szrj	return __cd(__lhs).count() / __cd(__rhs).count();
51738fd1498Szrj      }
51838fd1498Szrj
51938fd1498Szrj    // DR 934.
52038fd1498Szrj    template<typename _Rep1, typename _Period, typename _Rep2>
52138fd1498Szrj      constexpr
52238fd1498Szrj      duration<__common_rep_t<_Rep1, __disable_if_is_duration<_Rep2>>, _Period>
52338fd1498Szrj      operator%(const duration<_Rep1, _Period>& __d, const _Rep2& __s)
52438fd1498Szrj      {
52538fd1498Szrj	typedef duration<typename common_type<_Rep1, _Rep2>::type, _Period>
52638fd1498Szrj	  __cd;
52738fd1498Szrj	return __cd(__cd(__d).count() % __s);
52838fd1498Szrj      }
52938fd1498Szrj
53038fd1498Szrj    template<typename _Rep1, typename _Period1,
53138fd1498Szrj	     typename _Rep2, typename _Period2>
53238fd1498Szrj      constexpr typename common_type<duration<_Rep1, _Period1>,
53338fd1498Szrj				     duration<_Rep2, _Period2>>::type
53438fd1498Szrj      operator%(const duration<_Rep1, _Period1>& __lhs,
53538fd1498Szrj		const duration<_Rep2, _Period2>& __rhs)
53638fd1498Szrj      {
53738fd1498Szrj	typedef duration<_Rep1, _Period1>			__dur1;
53838fd1498Szrj	typedef duration<_Rep2, _Period2>			__dur2;
53938fd1498Szrj	typedef typename common_type<__dur1,__dur2>::type	__cd;
54038fd1498Szrj	return __cd(__cd(__lhs).count() % __cd(__rhs).count());
54138fd1498Szrj      }
54238fd1498Szrj
54338fd1498Szrj    // comparisons
54438fd1498Szrj    template<typename _Rep1, typename _Period1,
54538fd1498Szrj	     typename _Rep2, typename _Period2>
54638fd1498Szrj      constexpr bool
54738fd1498Szrj      operator==(const duration<_Rep1, _Period1>& __lhs,
54838fd1498Szrj		 const duration<_Rep2, _Period2>& __rhs)
54938fd1498Szrj      {
55038fd1498Szrj	typedef duration<_Rep1, _Period1>			__dur1;
55138fd1498Szrj	typedef duration<_Rep2, _Period2>			__dur2;
55238fd1498Szrj	typedef typename common_type<__dur1,__dur2>::type	__ct;
55338fd1498Szrj	return __ct(__lhs).count() == __ct(__rhs).count();
55438fd1498Szrj      }
55538fd1498Szrj
55638fd1498Szrj    template<typename _Rep1, typename _Period1,
55738fd1498Szrj	     typename _Rep2, typename _Period2>
55838fd1498Szrj      constexpr bool
55938fd1498Szrj      operator<(const duration<_Rep1, _Period1>& __lhs,
56038fd1498Szrj		const duration<_Rep2, _Period2>& __rhs)
56138fd1498Szrj      {
56238fd1498Szrj	typedef duration<_Rep1, _Period1>			__dur1;
56338fd1498Szrj	typedef duration<_Rep2, _Period2>			__dur2;
56438fd1498Szrj	typedef typename common_type<__dur1,__dur2>::type	__ct;
56538fd1498Szrj	return __ct(__lhs).count() < __ct(__rhs).count();
56638fd1498Szrj      }
56738fd1498Szrj
56838fd1498Szrj    template<typename _Rep1, typename _Period1,
56938fd1498Szrj	     typename _Rep2, typename _Period2>
57038fd1498Szrj      constexpr bool
57138fd1498Szrj      operator!=(const duration<_Rep1, _Period1>& __lhs,
57238fd1498Szrj		 const duration<_Rep2, _Period2>& __rhs)
57338fd1498Szrj      { return !(__lhs == __rhs); }
57438fd1498Szrj
57538fd1498Szrj    template<typename _Rep1, typename _Period1,
57638fd1498Szrj	     typename _Rep2, typename _Period2>
57738fd1498Szrj      constexpr bool
57838fd1498Szrj      operator<=(const duration<_Rep1, _Period1>& __lhs,
57938fd1498Szrj		 const duration<_Rep2, _Period2>& __rhs)
58038fd1498Szrj      { return !(__rhs < __lhs); }
58138fd1498Szrj
58238fd1498Szrj    template<typename _Rep1, typename _Period1,
58338fd1498Szrj	     typename _Rep2, typename _Period2>
58438fd1498Szrj      constexpr bool
58538fd1498Szrj      operator>(const duration<_Rep1, _Period1>& __lhs,
58638fd1498Szrj		const duration<_Rep2, _Period2>& __rhs)
58738fd1498Szrj      { return __rhs < __lhs; }
58838fd1498Szrj
58938fd1498Szrj    template<typename _Rep1, typename _Period1,
59038fd1498Szrj	     typename _Rep2, typename _Period2>
59138fd1498Szrj      constexpr bool
59238fd1498Szrj      operator>=(const duration<_Rep1, _Period1>& __lhs,
59338fd1498Szrj		 const duration<_Rep2, _Period2>& __rhs)
59438fd1498Szrj      { return !(__lhs < __rhs); }
59538fd1498Szrj
59638fd1498Szrj    /// nanoseconds
59738fd1498Szrj    typedef duration<int64_t, nano> 	    nanoseconds;
59838fd1498Szrj
59938fd1498Szrj    /// microseconds
60038fd1498Szrj    typedef duration<int64_t, micro> 	    microseconds;
60138fd1498Szrj
60238fd1498Szrj    /// milliseconds
60338fd1498Szrj    typedef duration<int64_t, milli> 	    milliseconds;
60438fd1498Szrj
60538fd1498Szrj    /// seconds
60638fd1498Szrj    typedef duration<int64_t> 		    seconds;
60738fd1498Szrj
60838fd1498Szrj    /// minutes
60938fd1498Szrj    typedef duration<int64_t, ratio< 60>>   minutes;
61038fd1498Szrj
61138fd1498Szrj    /// hours
61238fd1498Szrj    typedef duration<int64_t, ratio<3600>>  hours;
61338fd1498Szrj
61438fd1498Szrj    /// time_point
61538fd1498Szrj    template<typename _Clock, typename _Dur>
61638fd1498Szrj      struct time_point
61738fd1498Szrj      {
61838fd1498Szrj	typedef _Clock			  			clock;
61938fd1498Szrj	typedef _Dur		  				duration;
62038fd1498Szrj	typedef typename duration::rep	  			rep;
62138fd1498Szrj	typedef typename duration::period			period;
62238fd1498Szrj
62338fd1498Szrj	constexpr time_point() : __d(duration::zero())
62438fd1498Szrj	{ }
62538fd1498Szrj
62638fd1498Szrj	constexpr explicit time_point(const duration& __dur)
62738fd1498Szrj	: __d(__dur)
62838fd1498Szrj	{ }
62938fd1498Szrj
63038fd1498Szrj	// conversions
63138fd1498Szrj	template<typename _Dur2,
63238fd1498Szrj		 typename = _Require<is_convertible<_Dur2, _Dur>>>
63338fd1498Szrj	  constexpr time_point(const time_point<clock, _Dur2>& __t)
63438fd1498Szrj	  : __d(__t.time_since_epoch())
63538fd1498Szrj	  { }
63638fd1498Szrj
63738fd1498Szrj	// observer
63838fd1498Szrj	constexpr duration
63938fd1498Szrj	time_since_epoch() const
64038fd1498Szrj	{ return __d; }
64138fd1498Szrj
64238fd1498Szrj	// arithmetic
64338fd1498Szrj	_GLIBCXX17_CONSTEXPR time_point&
64438fd1498Szrj	operator+=(const duration& __dur)
64538fd1498Szrj	{
64638fd1498Szrj	  __d += __dur;
64738fd1498Szrj	  return *this;
64838fd1498Szrj	}
64938fd1498Szrj
65038fd1498Szrj	_GLIBCXX17_CONSTEXPR time_point&
65138fd1498Szrj	operator-=(const duration& __dur)
65238fd1498Szrj	{
65338fd1498Szrj	  __d -= __dur;
65438fd1498Szrj	  return *this;
65538fd1498Szrj	}
65638fd1498Szrj
65738fd1498Szrj	// special values
65838fd1498Szrj	static constexpr time_point
659*58e805e6Szrj	min() noexcept
66038fd1498Szrj	{ return time_point(duration::min()); }
66138fd1498Szrj
66238fd1498Szrj	static constexpr time_point
663*58e805e6Szrj	max() noexcept
66438fd1498Szrj	{ return time_point(duration::max()); }
66538fd1498Szrj
66638fd1498Szrj      private:
66738fd1498Szrj	duration __d;
66838fd1498Szrj      };
66938fd1498Szrj
67038fd1498Szrj    /// time_point_cast
67138fd1498Szrj    template<typename _ToDur, typename _Clock, typename _Dur>
67238fd1498Szrj      constexpr typename enable_if<__is_duration<_ToDur>::value,
67338fd1498Szrj				   time_point<_Clock, _ToDur>>::type
67438fd1498Szrj      time_point_cast(const time_point<_Clock, _Dur>& __t)
67538fd1498Szrj      {
67638fd1498Szrj	typedef time_point<_Clock, _ToDur> 			__time_point;
67738fd1498Szrj	return __time_point(duration_cast<_ToDur>(__t.time_since_epoch()));
67838fd1498Szrj      }
67938fd1498Szrj
68038fd1498Szrj#if __cplusplus > 201402L
68138fd1498Szrj    template<typename _ToDur, typename _Clock, typename _Dur>
68238fd1498Szrj      constexpr
68338fd1498Szrj      enable_if_t<__is_duration<_ToDur>::value, time_point<_Clock, _ToDur>>
68438fd1498Szrj      floor(const time_point<_Clock, _Dur>& __tp)
68538fd1498Szrj      {
68638fd1498Szrj	return time_point<_Clock, _ToDur>{
68738fd1498Szrj	    chrono::floor<_ToDur>(__tp.time_since_epoch())};
68838fd1498Szrj      }
68938fd1498Szrj
69038fd1498Szrj    template<typename _ToDur, typename _Clock, typename _Dur>
69138fd1498Szrj      constexpr
69238fd1498Szrj      enable_if_t<__is_duration<_ToDur>::value, time_point<_Clock, _ToDur>>
69338fd1498Szrj      ceil(const time_point<_Clock, _Dur>& __tp)
69438fd1498Szrj      {
69538fd1498Szrj	return time_point<_Clock, _ToDur>{
69638fd1498Szrj	    chrono::ceil<_ToDur>(__tp.time_since_epoch())};
69738fd1498Szrj      }
69838fd1498Szrj
69938fd1498Szrj    template<typename _ToDur, typename _Clock, typename _Dur>
70038fd1498Szrj      constexpr enable_if_t<
70138fd1498Szrj	__and_<__is_duration<_ToDur>,
70238fd1498Szrj	       __not_<treat_as_floating_point<typename _ToDur::rep>>>::value,
70338fd1498Szrj	time_point<_Clock, _ToDur>>
70438fd1498Szrj      round(const time_point<_Clock, _Dur>& __tp)
70538fd1498Szrj      {
70638fd1498Szrj	return time_point<_Clock, _ToDur>{
70738fd1498Szrj	    chrono::round<_ToDur>(__tp.time_since_epoch())};
70838fd1498Szrj      }
70938fd1498Szrj#endif // C++17
71038fd1498Szrj
71138fd1498Szrj    template<typename _Clock, typename _Dur1,
71238fd1498Szrj	     typename _Rep2, typename _Period2>
71338fd1498Szrj      constexpr time_point<_Clock,
71438fd1498Szrj	typename common_type<_Dur1, duration<_Rep2, _Period2>>::type>
71538fd1498Szrj      operator+(const time_point<_Clock, _Dur1>& __lhs,
71638fd1498Szrj		const duration<_Rep2, _Period2>& __rhs)
71738fd1498Szrj      {
71838fd1498Szrj	typedef duration<_Rep2, _Period2>			__dur2;
71938fd1498Szrj	typedef typename common_type<_Dur1,__dur2>::type	__ct;
72038fd1498Szrj	typedef time_point<_Clock, __ct> 			__time_point;
72138fd1498Szrj	return __time_point(__lhs.time_since_epoch() + __rhs);
72238fd1498Szrj      }
72338fd1498Szrj
72438fd1498Szrj    template<typename _Rep1, typename _Period1,
72538fd1498Szrj	     typename _Clock, typename _Dur2>
72638fd1498Szrj      constexpr time_point<_Clock,
72738fd1498Szrj	typename common_type<duration<_Rep1, _Period1>, _Dur2>::type>
72838fd1498Szrj      operator+(const duration<_Rep1, _Period1>& __lhs,
72938fd1498Szrj		const time_point<_Clock, _Dur2>& __rhs)
73038fd1498Szrj      {
73138fd1498Szrj	typedef duration<_Rep1, _Period1>			__dur1;
73238fd1498Szrj	typedef typename common_type<__dur1,_Dur2>::type	__ct;
73338fd1498Szrj	typedef time_point<_Clock, __ct> 			__time_point;
73438fd1498Szrj	return __time_point(__rhs.time_since_epoch() + __lhs);
73538fd1498Szrj      }
73638fd1498Szrj
73738fd1498Szrj    template<typename _Clock, typename _Dur1,
73838fd1498Szrj	     typename _Rep2, typename _Period2>
73938fd1498Szrj      constexpr time_point<_Clock,
74038fd1498Szrj	typename common_type<_Dur1, duration<_Rep2, _Period2>>::type>
74138fd1498Szrj      operator-(const time_point<_Clock, _Dur1>& __lhs,
74238fd1498Szrj		const duration<_Rep2, _Period2>& __rhs)
74338fd1498Szrj      {
74438fd1498Szrj	typedef duration<_Rep2, _Period2>			__dur2;
74538fd1498Szrj	typedef typename common_type<_Dur1,__dur2>::type	__ct;
74638fd1498Szrj	typedef time_point<_Clock, __ct> 			__time_point;
74738fd1498Szrj	return __time_point(__lhs.time_since_epoch() -__rhs);
74838fd1498Szrj      }
74938fd1498Szrj
75038fd1498Szrj    template<typename _Clock, typename _Dur1, typename _Dur2>
75138fd1498Szrj      constexpr typename common_type<_Dur1, _Dur2>::type
75238fd1498Szrj      operator-(const time_point<_Clock, _Dur1>& __lhs,
75338fd1498Szrj		const time_point<_Clock, _Dur2>& __rhs)
75438fd1498Szrj      { return __lhs.time_since_epoch() - __rhs.time_since_epoch(); }
75538fd1498Szrj
75638fd1498Szrj    template<typename _Clock, typename _Dur1, typename _Dur2>
75738fd1498Szrj      constexpr bool
75838fd1498Szrj      operator==(const time_point<_Clock, _Dur1>& __lhs,
75938fd1498Szrj		 const time_point<_Clock, _Dur2>& __rhs)
76038fd1498Szrj      { return __lhs.time_since_epoch() == __rhs.time_since_epoch(); }
76138fd1498Szrj
76238fd1498Szrj    template<typename _Clock, typename _Dur1, typename _Dur2>
76338fd1498Szrj      constexpr bool
76438fd1498Szrj      operator!=(const time_point<_Clock, _Dur1>& __lhs,
76538fd1498Szrj		 const time_point<_Clock, _Dur2>& __rhs)
76638fd1498Szrj      { return !(__lhs == __rhs); }
76738fd1498Szrj
76838fd1498Szrj    template<typename _Clock, typename _Dur1, typename _Dur2>
76938fd1498Szrj      constexpr bool
77038fd1498Szrj      operator<(const time_point<_Clock, _Dur1>& __lhs,
77138fd1498Szrj		const time_point<_Clock, _Dur2>& __rhs)
77238fd1498Szrj      { return  __lhs.time_since_epoch() < __rhs.time_since_epoch(); }
77338fd1498Szrj
77438fd1498Szrj    template<typename _Clock, typename _Dur1, typename _Dur2>
77538fd1498Szrj      constexpr bool
77638fd1498Szrj      operator<=(const time_point<_Clock, _Dur1>& __lhs,
77738fd1498Szrj		 const time_point<_Clock, _Dur2>& __rhs)
77838fd1498Szrj      { return !(__rhs < __lhs); }
77938fd1498Szrj
78038fd1498Szrj    template<typename _Clock, typename _Dur1, typename _Dur2>
78138fd1498Szrj      constexpr bool
78238fd1498Szrj      operator>(const time_point<_Clock, _Dur1>& __lhs,
78338fd1498Szrj		const time_point<_Clock, _Dur2>& __rhs)
78438fd1498Szrj      { return __rhs < __lhs; }
78538fd1498Szrj
78638fd1498Szrj    template<typename _Clock, typename _Dur1, typename _Dur2>
78738fd1498Szrj      constexpr bool
78838fd1498Szrj      operator>=(const time_point<_Clock, _Dur1>& __lhs,
78938fd1498Szrj		 const time_point<_Clock, _Dur2>& __rhs)
79038fd1498Szrj      { return !(__lhs < __rhs); }
79138fd1498Szrj
79238fd1498Szrj
79338fd1498Szrj    // Clocks.
79438fd1498Szrj
79538fd1498Szrj    // Why nanosecond resolution as the default?
79638fd1498Szrj    // Why have std::system_clock always count in the highest
79738fd1498Szrj    // resolution (ie nanoseconds), even if on some OSes the low 3
79838fd1498Szrj    // or 9 decimal digits will be always zero? This allows later
79938fd1498Szrj    // implementations to change the system_clock::now()
80038fd1498Szrj    // implementation any time to provide better resolution without
80138fd1498Szrj    // changing function signature or units.
80238fd1498Szrj
80338fd1498Szrj    // To support the (forward) evolution of the library's defined
80438fd1498Szrj    // clocks, wrap inside inline namespace so that the current
80538fd1498Szrj    // defintions of system_clock, steady_clock, and
80638fd1498Szrj    // high_resolution_clock types are uniquely mangled. This way, new
80738fd1498Szrj    // code can use the latests clocks, while the library can contain
80838fd1498Szrj    // compatibility definitions for previous versions.  At some
80938fd1498Szrj    // point, when these clocks settle down, the inlined namespaces
81038fd1498Szrj    // can be removed.  XXX GLIBCXX_ABI Deprecated
81138fd1498Szrj    inline namespace _V2 {
81238fd1498Szrj
81338fd1498Szrj    /**
81438fd1498Szrj     *  @brief System clock.
81538fd1498Szrj     *
81638fd1498Szrj     *  Time returned represents wall time from the system-wide clock.
81738fd1498Szrj    */
81838fd1498Szrj    struct system_clock
81938fd1498Szrj    {
82038fd1498Szrj      typedef chrono::nanoseconds     				duration;
82138fd1498Szrj      typedef duration::rep    					rep;
82238fd1498Szrj      typedef duration::period 					period;
82338fd1498Szrj      typedef chrono::time_point<system_clock, duration> 	time_point;
82438fd1498Szrj
82538fd1498Szrj      static_assert(system_clock::duration::min()
82638fd1498Szrj		    < system_clock::duration::zero(),
82738fd1498Szrj		    "a clock's minimum duration cannot be less than its epoch");
82838fd1498Szrj
82938fd1498Szrj      static constexpr bool is_steady = false;
83038fd1498Szrj
83138fd1498Szrj      static time_point
83238fd1498Szrj      now() noexcept;
83338fd1498Szrj
83438fd1498Szrj      // Map to C API
83538fd1498Szrj      static std::time_t
83638fd1498Szrj      to_time_t(const time_point& __t) noexcept
83738fd1498Szrj      {
83838fd1498Szrj	return std::time_t(duration_cast<chrono::seconds>
83938fd1498Szrj			   (__t.time_since_epoch()).count());
84038fd1498Szrj      }
84138fd1498Szrj
84238fd1498Szrj      static time_point
84338fd1498Szrj      from_time_t(std::time_t __t) noexcept
84438fd1498Szrj      {
84538fd1498Szrj	typedef chrono::time_point<system_clock, seconds>	__from;
84638fd1498Szrj	return time_point_cast<system_clock::duration>
84738fd1498Szrj	       (__from(chrono::seconds(__t)));
84838fd1498Szrj      }
84938fd1498Szrj    };
85038fd1498Szrj
85138fd1498Szrj
85238fd1498Szrj    /**
85338fd1498Szrj     *  @brief Monotonic clock
85438fd1498Szrj     *
85538fd1498Szrj     *  Time returned has the property of only increasing at a uniform rate.
85638fd1498Szrj    */
85738fd1498Szrj    struct steady_clock
85838fd1498Szrj    {
85938fd1498Szrj      typedef chrono::nanoseconds 				duration;
86038fd1498Szrj      typedef duration::rep	  				rep;
86138fd1498Szrj      typedef duration::period	  				period;
86238fd1498Szrj      typedef chrono::time_point<steady_clock, duration> 	time_point;
86338fd1498Szrj
86438fd1498Szrj      static constexpr bool is_steady = true;
86538fd1498Szrj
86638fd1498Szrj      static time_point
86738fd1498Szrj      now() noexcept;
86838fd1498Szrj    };
86938fd1498Szrj
87038fd1498Szrj
87138fd1498Szrj    /**
87238fd1498Szrj     *  @brief Highest-resolution clock
87338fd1498Szrj     *
87438fd1498Szrj     *  This is the clock "with the shortest tick period." Alias to
87538fd1498Szrj     *  std::system_clock until higher-than-nanosecond definitions
87638fd1498Szrj     *  become feasible.
87738fd1498Szrj    */
87838fd1498Szrj    using high_resolution_clock = system_clock;
87938fd1498Szrj
88038fd1498Szrj    } // end inline namespace _V2
88138fd1498Szrj  } // namespace chrono
88238fd1498Szrj
88338fd1498Szrj#if __cplusplus > 201103L
88438fd1498Szrj
88538fd1498Szrj#define __cpp_lib_chrono_udls 201304
88638fd1498Szrj
88738fd1498Szrj  inline namespace literals
88838fd1498Szrj  {
88938fd1498Szrj  inline namespace chrono_literals
89038fd1498Szrj  {
89138fd1498Szrj#pragma GCC diagnostic push
89238fd1498Szrj#pragma GCC diagnostic ignored "-Wliteral-suffix"
89338fd1498Szrj    template<typename _Rep, unsigned long long _Val>
89438fd1498Szrj      struct _Checked_integral_constant
89538fd1498Szrj      : integral_constant<_Rep, static_cast<_Rep>(_Val)>
89638fd1498Szrj      {
89738fd1498Szrj	static_assert(_Checked_integral_constant::value >= 0
89838fd1498Szrj		      && _Checked_integral_constant::value == _Val,
89938fd1498Szrj		      "literal value cannot be represented by duration type");
90038fd1498Szrj      };
90138fd1498Szrj
90238fd1498Szrj    template<typename _Dur, char... _Digits>
90338fd1498Szrj      constexpr _Dur __check_overflow()
90438fd1498Szrj      {
90538fd1498Szrj	using _Val = __parse_int::_Parse_int<_Digits...>;
90638fd1498Szrj	using _Rep = typename _Dur::rep;
90738fd1498Szrj	// TODO: should be simply integral_constant<_Rep, _Val::value>
90838fd1498Szrj	// but GCC doesn't reject narrowing conversions to _Rep.
90938fd1498Szrj	using _CheckedVal = _Checked_integral_constant<_Rep, _Val::value>;
91038fd1498Szrj	return _Dur{_CheckedVal::value};
91138fd1498Szrj      }
91238fd1498Szrj
91338fd1498Szrj    constexpr chrono::duration<long double, ratio<3600,1>>
91438fd1498Szrj    operator""h(long double __hours)
91538fd1498Szrj    { return chrono::duration<long double, ratio<3600,1>>{__hours}; }
91638fd1498Szrj
91738fd1498Szrj    template <char... _Digits>
91838fd1498Szrj      constexpr chrono::hours
91938fd1498Szrj      operator""h()
92038fd1498Szrj      { return __check_overflow<chrono::hours, _Digits...>(); }
92138fd1498Szrj
92238fd1498Szrj    constexpr chrono::duration<long double, ratio<60,1>>
92338fd1498Szrj    operator""min(long double __mins)
92438fd1498Szrj    { return chrono::duration<long double, ratio<60,1>>{__mins}; }
92538fd1498Szrj
92638fd1498Szrj    template <char... _Digits>
92738fd1498Szrj      constexpr chrono::minutes
92838fd1498Szrj      operator""min()
92938fd1498Szrj      { return __check_overflow<chrono::minutes, _Digits...>(); }
93038fd1498Szrj
93138fd1498Szrj    constexpr chrono::duration<long double>
93238fd1498Szrj    operator""s(long double __secs)
93338fd1498Szrj    { return chrono::duration<long double>{__secs}; }
93438fd1498Szrj
93538fd1498Szrj    template <char... _Digits>
93638fd1498Szrj      constexpr chrono::seconds
93738fd1498Szrj      operator""s()
93838fd1498Szrj      { return __check_overflow<chrono::seconds, _Digits...>(); }
93938fd1498Szrj
94038fd1498Szrj    constexpr chrono::duration<long double, milli>
94138fd1498Szrj    operator""ms(long double __msecs)
94238fd1498Szrj    { return chrono::duration<long double, milli>{__msecs}; }
94338fd1498Szrj
94438fd1498Szrj    template <char... _Digits>
94538fd1498Szrj      constexpr chrono::milliseconds
94638fd1498Szrj      operator""ms()
94738fd1498Szrj      { return __check_overflow<chrono::milliseconds, _Digits...>(); }
94838fd1498Szrj
94938fd1498Szrj    constexpr chrono::duration<long double, micro>
95038fd1498Szrj    operator""us(long double __usecs)
95138fd1498Szrj    { return chrono::duration<long double, micro>{__usecs}; }
95238fd1498Szrj
95338fd1498Szrj    template <char... _Digits>
95438fd1498Szrj      constexpr chrono::microseconds
95538fd1498Szrj      operator""us()
95638fd1498Szrj      { return __check_overflow<chrono::microseconds, _Digits...>(); }
95738fd1498Szrj
95838fd1498Szrj    constexpr chrono::duration<long double, nano>
95938fd1498Szrj    operator""ns(long double __nsecs)
96038fd1498Szrj    { return chrono::duration<long double, nano>{__nsecs}; }
96138fd1498Szrj
96238fd1498Szrj    template <char... _Digits>
96338fd1498Szrj      constexpr chrono::nanoseconds
96438fd1498Szrj      operator""ns()
96538fd1498Szrj      { return __check_overflow<chrono::nanoseconds, _Digits...>(); }
96638fd1498Szrj
96738fd1498Szrj#pragma GCC diagnostic pop
96838fd1498Szrj  } // inline namespace chrono_literals
96938fd1498Szrj  } // inline namespace literals
97038fd1498Szrj
97138fd1498Szrj  namespace chrono
97238fd1498Szrj  {
97338fd1498Szrj    using namespace literals::chrono_literals;
97438fd1498Szrj  } // namespace chrono
97538fd1498Szrj
97638fd1498Szrj#endif // C++14
97738fd1498Szrj
97838fd1498Szrj  // @} group chrono
97938fd1498Szrj
98038fd1498Szrj_GLIBCXX_END_NAMESPACE_VERSION
98138fd1498Szrj} // namespace std
98238fd1498Szrj
98338fd1498Szrj#endif //_GLIBCXX_USE_C99_STDINT_TR1
98438fd1498Szrj
98538fd1498Szrj#endif // C++11
98638fd1498Szrj
98738fd1498Szrj#endif //_GLIBCXX_CHRONO
988