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