blob: 74e359c58dc24863c3875f16faffc8251807f3bc [file] [log] [blame]
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001// -*- C++ -*-
2//===---------------------------- chrono ----------------------------------===//
3//
Howard Hinnantf5256e12010-05-11 21:36:01 +00004// The LLVM Compiler Infrastructure
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005//
Howard Hinnantb64f8b02010-11-16 22:09:02 +00006// This file is dual licensed under the MIT and the University of Illinois Open
7// Source Licenses. See LICENSE.TXT for details.
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00008//
9//===----------------------------------------------------------------------===//
10
11#ifndef _LIBCPP_CHRONO
12#define _LIBCPP_CHRONO
13
14/*
15 chrono synopsis
16
17namespace std
18{
19namespace chrono
20{
21
22template <class ToDuration, class Rep, class Period>
Howard Hinnant473f8382012-07-13 19:17:27 +000023constexpr
Howard Hinnantbc8d3f92010-05-11 19:42:16 +000024ToDuration
25duration_cast(const duration<Rep, Period>& fd);
26
27template <class Rep> struct treat_as_floating_point : is_floating_point<Rep> {};
28
Marshall Clowa3866e42015-11-30 05:39:30 +000029template <class Rep> constexpr bool treat_as_floating_point_v
30 = treat_as_floating_point<Rep>::value; // C++17
31
Howard Hinnantbc8d3f92010-05-11 19:42:16 +000032template <class Rep>
33struct duration_values
34{
35public:
Howard Hinnant473f8382012-07-13 19:17:27 +000036 static constexpr Rep zero();
37 static constexpr Rep max();
38 static constexpr Rep min();
Howard Hinnantbc8d3f92010-05-11 19:42:16 +000039};
40
41// duration
42
43template <class Rep, class Period = ratio<1>>
44class duration
45{
46 static_assert(!__is_duration<Rep>::value, "A duration representation can not be a duration");
47 static_assert(__is_ratio<Period>::value, "Second template parameter of duration must be a std::ratio");
48 static_assert(Period::num > 0, "duration period must be positive");
49public:
50 typedef Rep rep;
51 typedef Period period;
52
Howard Hinnant473f8382012-07-13 19:17:27 +000053 constexpr duration() = default;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +000054 template <class Rep2>
Howard Hinnant473f8382012-07-13 19:17:27 +000055 constexpr explicit duration(const Rep2& r,
Howard Hinnantbc8d3f92010-05-11 19:42:16 +000056 typename enable_if
57 <
58 is_convertible<Rep2, rep>::value &&
59 (treat_as_floating_point<rep>::value ||
60 !treat_as_floating_point<rep>::value && !treat_as_floating_point<Rep2>::value)
61 >::type* = 0);
62
63 // conversions
64 template <class Rep2, class Period2>
Howard Hinnant473f8382012-07-13 19:17:27 +000065 constexpr duration(const duration<Rep2, Period2>& d,
Howard Hinnantbc8d3f92010-05-11 19:42:16 +000066 typename enable_if
67 <
68 treat_as_floating_point<rep>::value ||
69 ratio_divide<Period2, period>::type::den == 1
70 >::type* = 0);
71
72 // observer
73
Howard Hinnant473f8382012-07-13 19:17:27 +000074 constexpr rep count() const;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +000075
76 // arithmetic
77
Howard Hinnant473f8382012-07-13 19:17:27 +000078 constexpr duration operator+() const;
79 constexpr duration operator-() const;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +000080 duration& operator++();
81 duration operator++(int);
82 duration& operator--();
83 duration operator--(int);
84
85 duration& operator+=(const duration& d);
86 duration& operator-=(const duration& d);
87
88 duration& operator*=(const rep& rhs);
89 duration& operator/=(const rep& rhs);
90
91 // special values
92
Howard Hinnant473f8382012-07-13 19:17:27 +000093 static constexpr duration zero();
94 static constexpr duration min();
95 static constexpr duration max();
Howard Hinnantbc8d3f92010-05-11 19:42:16 +000096};
97
98typedef duration<long long, nano> nanoseconds;
99typedef duration<long long, micro> microseconds;
100typedef duration<long long, milli> milliseconds;
101typedef duration<long long > seconds;
102typedef duration< long, ratio< 60> > minutes;
103typedef duration< long, ratio<3600> > hours;
104
105template <class Clock, class Duration = typename Clock::duration>
106class time_point
107{
108public:
109 typedef Clock clock;
110 typedef Duration duration;
111 typedef typename duration::rep rep;
112 typedef typename duration::period period;
113private:
114 duration d_; // exposition only
115
116public:
Marshall Clow832b3042013-07-31 19:32:19 +0000117 time_point(); // has value "epoch" // constexpr in C++14
118 explicit time_point(const duration& d); // same as time_point() + d // constexpr in C++14
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000119
120 // conversions
121 template <class Duration2>
Marshall Clow832b3042013-07-31 19:32:19 +0000122 time_point(const time_point<clock, Duration2>& t); // constexpr in C++14
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000123
124 // observer
125
Marshall Clow832b3042013-07-31 19:32:19 +0000126 duration time_since_epoch() const; // constexpr in C++14
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000127
128 // arithmetic
129
130 time_point& operator+=(const duration& d);
131 time_point& operator-=(const duration& d);
132
133 // special values
134
135 static constexpr time_point min();
136 static constexpr time_point max();
137};
138
139} // chrono
140
141// common_type traits
142template <class Rep1, class Period1, class Rep2, class Period2>
143 struct common_type<chrono::duration<Rep1, Period1>, chrono::duration<Rep2, Period2>>;
144
145template <class Clock, class Duration1, class Duration2>
146 struct common_type<chrono::time_point<Clock, Duration1>, chrono::time_point<Clock, Duration2>>;
147
148namespace chrono {
149
150// duration arithmetic
151template <class Rep1, class Period1, class Rep2, class Period2>
Howard Hinnant473f8382012-07-13 19:17:27 +0000152 constexpr
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000153 typename common_type<duration<Rep1, Period1>, duration<Rep2, Period2>>::type
154 operator+(const duration<Rep1, Period1>& lhs, const duration<Rep2, Period2>& rhs);
155template <class Rep1, class Period1, class Rep2, class Period2>
Howard Hinnant473f8382012-07-13 19:17:27 +0000156 constexpr
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000157 typename common_type<duration<Rep1, Period1>, duration<Rep2, Period2>>::type
158 operator-(const duration<Rep1, Period1>& lhs, const duration<Rep2, Period2>& rhs);
159template <class Rep1, class Period, class Rep2>
Howard Hinnant473f8382012-07-13 19:17:27 +0000160 constexpr
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000161 duration<typename common_type<Rep1, Rep2>::type, Period>
162 operator*(const duration<Rep1, Period>& d, const Rep2& s);
163template <class Rep1, class Period, class Rep2>
Howard Hinnant473f8382012-07-13 19:17:27 +0000164 constexpr
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000165 duration<typename common_type<Rep1, Rep2>::type, Period>
166 operator*(const Rep1& s, const duration<Rep2, Period>& d);
167template <class Rep1, class Period, class Rep2>
Howard Hinnant473f8382012-07-13 19:17:27 +0000168 constexpr
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000169 duration<typename common_type<Rep1, Rep2>::type, Period>
170 operator/(const duration<Rep1, Period>& d, const Rep2& s);
171template <class Rep1, class Period1, class Rep2, class Period2>
Howard Hinnant473f8382012-07-13 19:17:27 +0000172 constexpr
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000173 typename common_type<Rep1, Rep2>::type
174 operator/(const duration<Rep1, Period1>& lhs, const duration<Rep2, Period2>& rhs);
175
176// duration comparisons
177template <class Rep1, class Period1, class Rep2, class Period2>
Howard Hinnant473f8382012-07-13 19:17:27 +0000178 constexpr
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000179 bool operator==(const duration<Rep1, Period1>& lhs, const duration<Rep2, Period2>& rhs);
180template <class Rep1, class Period1, class Rep2, class Period2>
Howard Hinnant473f8382012-07-13 19:17:27 +0000181 constexpr
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000182 bool operator!=(const duration<Rep1, Period1>& lhs, const duration<Rep2, Period2>& rhs);
183template <class Rep1, class Period1, class Rep2, class Period2>
Howard Hinnant473f8382012-07-13 19:17:27 +0000184 constexpr
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000185 bool operator< (const duration<Rep1, Period1>& lhs, const duration<Rep2, Period2>& rhs);
186template <class Rep1, class Period1, class Rep2, class Period2>
Howard Hinnant473f8382012-07-13 19:17:27 +0000187 constexpr
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000188 bool operator<=(const duration<Rep1, Period1>& lhs, const duration<Rep2, Period2>& rhs);
189template <class Rep1, class Period1, class Rep2, class Period2>
Howard Hinnant473f8382012-07-13 19:17:27 +0000190 constexpr
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000191 bool operator> (const duration<Rep1, Period1>& lhs, const duration<Rep2, Period2>& rhs);
192template <class Rep1, class Period1, class Rep2, class Period2>
Howard Hinnant473f8382012-07-13 19:17:27 +0000193 constexpr
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000194 bool operator>=(const duration<Rep1, Period1>& lhs, const duration<Rep2, Period2>& rhs);
195
196// duration_cast
197template <class ToDuration, class Rep, class Period>
198 ToDuration duration_cast(const duration<Rep, Period>& d);
199
Marshall Clow223df2e2015-11-05 19:33:59 +0000200template <class ToDuration, class Rep, class Period>
201 constexpr ToDuration floor(const duration<Rep, Period>& d); // C++17
202template <class ToDuration, class Rep, class Period>
203 constexpr ToDuration ceil(const duration<Rep, Period>& d); // C++17
204template <class ToDuration, class Rep, class Period>
205 constexpr ToDuration round(const duration<Rep, Period>& d); // C++17
206
Marshall Clow832b3042013-07-31 19:32:19 +0000207// time_point arithmetic (all constexpr in C++14)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000208template <class Clock, class Duration1, class Rep2, class Period2>
209 time_point<Clock, typename common_type<Duration1, duration<Rep2, Period2>>::type>
210 operator+(const time_point<Clock, Duration1>& lhs, const duration<Rep2, Period2>& rhs);
211template <class Rep1, class Period1, class Clock, class Duration2>
212 time_point<Clock, typename common_type<duration<Rep1, Period1>, Duration2>::type>
213 operator+(const duration<Rep1, Period1>& lhs, const time_point<Clock, Duration2>& rhs);
214template <class Clock, class Duration1, class Rep2, class Period2>
215 time_point<Clock, typename common_type<Duration1, duration<Rep2, Period2>>::type>
216 operator-(const time_point<Clock, Duration1>& lhs, const duration<Rep2, Period2>& rhs);
217template <class Clock, class Duration1, class Duration2>
218 typename common_type<Duration1, Duration2>::type
219 operator-(const time_point<Clock, Duration1>& lhs, const time_point<Clock, Duration2>& rhs);
220
Marshall Clow832b3042013-07-31 19:32:19 +0000221// time_point comparisons (all constexpr in C++14)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000222template <class Clock, class Duration1, class Duration2>
223 bool operator==(const time_point<Clock, Duration1>& lhs, const time_point<Clock, Duration2>& rhs);
224template <class Clock, class Duration1, class Duration2>
225 bool operator!=(const time_point<Clock, Duration1>& lhs, const time_point<Clock, Duration2>& rhs);
226template <class Clock, class Duration1, class Duration2>
227 bool operator< (const time_point<Clock, Duration1>& lhs, const time_point<Clock, Duration2>& rhs);
228template <class Clock, class Duration1, class Duration2>
229 bool operator<=(const time_point<Clock, Duration1>& lhs, const time_point<Clock, Duration2>& rhs);
230template <class Clock, class Duration1, class Duration2>
231 bool operator> (const time_point<Clock, Duration1>& lhs, const time_point<Clock, Duration2>& rhs);
232template <class Clock, class Duration1, class Duration2>
233 bool operator>=(const time_point<Clock, Duration1>& lhs, const time_point<Clock, Duration2>& rhs);
234
Marshall Clow832b3042013-07-31 19:32:19 +0000235// time_point_cast (constexpr in C++14)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000236
237template <class ToDuration, class Clock, class Duration>
238 time_point<Clock, ToDuration> time_point_cast(const time_point<Clock, Duration>& t);
239
Marshall Clow223df2e2015-11-05 19:33:59 +0000240template <class ToDuration, class Clock, class Duration>
241 constexpr time_point<Clock, ToDuration>
242 floor(const time_point<Clock, Duration>& tp); // C++17
243
244template <class ToDuration, class Clock, class Duration>
245 constexpr time_point<Clock, ToDuration>
246 ceil(const time_point<Clock, Duration>& tp); // C++17
247
248template <class ToDuration, class Clock, class Duration>
249 constexpr time_point<Clock, ToDuration>
250 round(const time_point<Clock, Duration>& tp); // C++17
251
252template <class Rep, class Period>
253 constexpr duration<Rep, Period> abs(duration<Rep, Period> d); // C++17
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000254// Clocks
255
256class system_clock
257{
258public:
259 typedef microseconds duration;
260 typedef duration::rep rep;
261 typedef duration::period period;
262 typedef chrono::time_point<system_clock> time_point;
Marshall Clow832b3042013-07-31 19:32:19 +0000263 static const bool is_steady = false; // constexpr in C++14
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000264
Howard Hinnant756a1762011-05-28 18:34:36 +0000265 static time_point now() noexcept;
266 static time_t to_time_t (const time_point& __t) noexcept;
267 static time_point from_time_t(time_t __t) noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000268};
269
Howard Hinnantf8f85212010-11-20 19:16:30 +0000270class steady_clock
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000271{
272public:
273 typedef nanoseconds duration;
274 typedef duration::rep rep;
275 typedef duration::period period;
Howard Hinnantf8f85212010-11-20 19:16:30 +0000276 typedef chrono::time_point<steady_clock, duration> time_point;
Marshall Clow832b3042013-07-31 19:32:19 +0000277 static const bool is_steady = true; // constexpr in C++14
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000278
Howard Hinnant756a1762011-05-28 18:34:36 +0000279 static time_point now() noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000280};
281
Howard Hinnantf8f85212010-11-20 19:16:30 +0000282typedef steady_clock high_resolution_clock;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000283
284} // chrono
285
Marshall Clowf1820382013-07-24 21:18:14 +0000286constexpr chrono::hours operator "" h(unsigned long long); // C++14
287constexpr chrono::duration<unspecified , ratio<3600,1>> operator "" h(long double); // C++14
288constexpr chrono::minutes operator "" min(unsigned long long); // C++14
289constexpr chrono::duration<unspecified , ratio<60,1>> operator "" min(long double); // C++14
290constexpr chrono::seconds operator "" s(unsigned long long); // C++14
291constexpr chrono::duration<unspecified > operator "" s(long double); // C++14
292constexpr chrono::milliseconds operator "" ms(unsigned long long); // C++14
293constexpr chrono::duration<unspecified , milli> operator "" ms(long double); // C++14
294constexpr chrono::microseconds operator "" us(unsigned long long); // C++14
295constexpr chrono::duration<unspecified , micro> operator "" us(long double); // C++14
296constexpr chrono::nanoseconds operator "" ns(unsigned long long); // C++14
297constexpr chrono::duration<unspecified , nano> operator "" ns(long double); // C++14
298
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000299} // std
300*/
301
302#include <__config>
303#include <ctime>
304#include <type_traits>
305#include <ratio>
306#include <limits>
307
Howard Hinnant66c6f972011-11-29 16:45:27 +0000308#include <__undef_min_max>
309
Howard Hinnant08e17472011-10-17 20:05:10 +0000310#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000311#pragma GCC system_header
Howard Hinnant08e17472011-10-17 20:05:10 +0000312#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000313
314_LIBCPP_BEGIN_NAMESPACE_STD
315
316namespace chrono
317{
318
Howard Hinnant0f678bd2013-08-12 18:38:34 +0000319template <class _Rep, class _Period = ratio<1> > class _LIBCPP_TYPE_VIS_ONLY duration;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000320
Howard Hinnantd8bc09b2010-05-18 17:32:30 +0000321template <class _Tp>
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000322struct __is_duration : false_type {};
323
324template <class _Rep, class _Period>
325struct __is_duration<duration<_Rep, _Period> > : true_type {};
326
327template <class _Rep, class _Period>
328struct __is_duration<const duration<_Rep, _Period> > : true_type {};
329
330template <class _Rep, class _Period>
331struct __is_duration<volatile duration<_Rep, _Period> > : true_type {};
332
333template <class _Rep, class _Period>
334struct __is_duration<const volatile duration<_Rep, _Period> > : true_type {};
335
336} // chrono
337
338template <class _Rep1, class _Period1, class _Rep2, class _Period2>
Howard Hinnant0f678bd2013-08-12 18:38:34 +0000339struct _LIBCPP_TYPE_VIS_ONLY common_type<chrono::duration<_Rep1, _Period1>,
340 chrono::duration<_Rep2, _Period2> >
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000341{
342 typedef chrono::duration<typename common_type<_Rep1, _Rep2>::type,
343 typename __ratio_gcd<_Period1, _Period2>::type> type;
344};
345
346namespace chrono {
347
348// duration_cast
349
350template <class _FromDuration, class _ToDuration,
351 class _Period = typename ratio_divide<typename _FromDuration::period, typename _ToDuration::period>::type,
352 bool = _Period::num == 1,
353 bool = _Period::den == 1>
354struct __duration_cast;
355
356template <class _FromDuration, class _ToDuration, class _Period>
357struct __duration_cast<_FromDuration, _ToDuration, _Period, true, true>
358{
Howard Hinnant473f8382012-07-13 19:17:27 +0000359 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000360 _ToDuration operator()(const _FromDuration& __fd) const
361 {
362 return _ToDuration(static_cast<typename _ToDuration::rep>(__fd.count()));
363 }
364};
365
366template <class _FromDuration, class _ToDuration, class _Period>
367struct __duration_cast<_FromDuration, _ToDuration, _Period, true, false>
368{
Howard Hinnant473f8382012-07-13 19:17:27 +0000369 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000370 _ToDuration operator()(const _FromDuration& __fd) const
371 {
372 typedef typename common_type<typename _ToDuration::rep, typename _FromDuration::rep, intmax_t>::type _Ct;
373 return _ToDuration(static_cast<typename _ToDuration::rep>(
374 static_cast<_Ct>(__fd.count()) / static_cast<_Ct>(_Period::den)));
375 }
376};
377
378template <class _FromDuration, class _ToDuration, class _Period>
379struct __duration_cast<_FromDuration, _ToDuration, _Period, false, true>
380{
Howard Hinnant473f8382012-07-13 19:17:27 +0000381 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000382 _ToDuration operator()(const _FromDuration& __fd) const
383 {
384 typedef typename common_type<typename _ToDuration::rep, typename _FromDuration::rep, intmax_t>::type _Ct;
385 return _ToDuration(static_cast<typename _ToDuration::rep>(
386 static_cast<_Ct>(__fd.count()) * static_cast<_Ct>(_Period::num)));
387 }
388};
389
390template <class _FromDuration, class _ToDuration, class _Period>
391struct __duration_cast<_FromDuration, _ToDuration, _Period, false, false>
392{
Howard Hinnant473f8382012-07-13 19:17:27 +0000393 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000394 _ToDuration operator()(const _FromDuration& __fd) const
395 {
396 typedef typename common_type<typename _ToDuration::rep, typename _FromDuration::rep, intmax_t>::type _Ct;
397 return _ToDuration(static_cast<typename _ToDuration::rep>(
398 static_cast<_Ct>(__fd.count()) * static_cast<_Ct>(_Period::num)
399 / static_cast<_Ct>(_Period::den)));
400 }
401};
402
403template <class _ToDuration, class _Rep, class _Period>
404inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant473f8382012-07-13 19:17:27 +0000405_LIBCPP_CONSTEXPR
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000406typename enable_if
407<
408 __is_duration<_ToDuration>::value,
409 _ToDuration
410>::type
411duration_cast(const duration<_Rep, _Period>& __fd)
412{
413 return __duration_cast<duration<_Rep, _Period>, _ToDuration>()(__fd);
414}
415
Howard Hinnant422a53f2010-09-21 21:28:23 +0000416template <class _Rep>
Howard Hinnant0f678bd2013-08-12 18:38:34 +0000417struct _LIBCPP_TYPE_VIS_ONLY treat_as_floating_point : is_floating_point<_Rep> {};
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000418
Marshall Clowa3866e42015-11-30 05:39:30 +0000419#if _LIBCPP_STD_VER > 14 && !defined(_LIBCPP_HAS_NO_VARIABLE_TEMPLATES)
420template <class _Rep> _LIBCPP_CONSTEXPR bool treat_as_floating_point_v
421 = treat_as_floating_point<_Rep>::value;
422#endif
423
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000424template <class _Rep>
Howard Hinnant0f678bd2013-08-12 18:38:34 +0000425struct _LIBCPP_TYPE_VIS_ONLY duration_values
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000426{
427public:
Howard Hinnant473f8382012-07-13 19:17:27 +0000428 _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR _Rep zero() {return _Rep(0);}
429 _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR _Rep max() {return numeric_limits<_Rep>::max();}
430 _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR _Rep min() {return numeric_limits<_Rep>::lowest();}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000431};
432
Marshall Clow223df2e2015-11-05 19:33:59 +0000433#if _LIBCPP_STD_VER > 14
434template <class _ToDuration, class _Rep, class _Period>
435inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
436typename enable_if
437<
438 __is_duration<_ToDuration>::value,
439 _ToDuration
440>::type
441floor(const duration<_Rep, _Period>& __d)
442{
443 _ToDuration __t = duration_cast<_ToDuration>(__d);
444 if (__t > __d)
445 __t = __t - _ToDuration{1};
446 return __t;
447}
448
449template <class _ToDuration, class _Rep, class _Period>
450inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
451typename enable_if
452<
453 __is_duration<_ToDuration>::value,
454 _ToDuration
455>::type
456ceil(const duration<_Rep, _Period>& __d)
457{
458 _ToDuration __t = duration_cast<_ToDuration>(__d);
459 if (__t < __d)
460 __t = __t + _ToDuration{1};
461 return __t;
462}
463
464template <class _ToDuration, class _Rep, class _Period>
465inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
466typename enable_if
467<
468 __is_duration<_ToDuration>::value,
469 _ToDuration
470>::type
471round(const duration<_Rep, _Period>& __d)
472{
473 _ToDuration __lower = floor<_ToDuration>(__d);
474 _ToDuration __upper = __lower + _ToDuration{1};
475 auto __lowerDiff = __d - __lower;
476 auto __upperDiff = __upper - __d;
477 if (__lowerDiff < __upperDiff)
478 return __lower;
479 if (__lowerDiff > __upperDiff)
480 return __upper;
481 return __lower.count() & 1 ? __upper : __lower;
482}
483#endif
484
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000485// duration
486
487template <class _Rep, class _Period>
Howard Hinnant0f678bd2013-08-12 18:38:34 +0000488class _LIBCPP_TYPE_VIS_ONLY duration
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000489{
490 static_assert(!__is_duration<_Rep>::value, "A duration representation can not be a duration");
491 static_assert(__is_ratio<_Period>::value, "Second template parameter of duration must be a std::ratio");
492 static_assert(_Period::num > 0, "duration period must be positive");
Howard Hinnant713f4db2013-08-31 16:51:56 +0000493
494 template <class _R1, class _R2>
495 struct __no_overflow
496 {
497 private:
498 static const intmax_t __gcd_n1_n2 = __static_gcd<_R1::num, _R2::num>::value;
499 static const intmax_t __gcd_d1_d2 = __static_gcd<_R1::den, _R2::den>::value;
500 static const intmax_t __n1 = _R1::num / __gcd_n1_n2;
501 static const intmax_t __d1 = _R1::den / __gcd_d1_d2;
502 static const intmax_t __n2 = _R2::num / __gcd_n1_n2;
503 static const intmax_t __d2 = _R2::den / __gcd_d1_d2;
504 static const intmax_t max = -((intmax_t(1) << (sizeof(intmax_t) * CHAR_BIT - 1)) + 1);
505
506 template <intmax_t _Xp, intmax_t _Yp, bool __overflow>
507 struct __mul // __overflow == false
508 {
509 static const intmax_t value = _Xp * _Yp;
510 };
511
512 template <intmax_t _Xp, intmax_t _Yp>
513 struct __mul<_Xp, _Yp, true>
514 {
515 static const intmax_t value = 1;
516 };
517
518 public:
519 static const bool value = (__n1 <= max / __d2) && (__n2 <= max / __d1);
520 typedef ratio<__mul<__n1, __d2, !value>::value,
521 __mul<__n2, __d1, !value>::value> type;
522 };
523
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000524public:
525 typedef _Rep rep;
526 typedef _Period period;
527private:
528 rep __rep_;
529public:
530
Marshall Clow832b3042013-07-31 19:32:19 +0000531 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
Eric Fiselier8c570322016-11-18 06:42:17 +0000532#ifndef _LIBCPP_CXX03_LANG
Marshall Clow832b3042013-07-31 19:32:19 +0000533 duration() = default;
Marshall Clow07774732013-07-31 19:39:37 +0000534#else
535 duration() {}
Marshall Clow832b3042013-07-31 19:32:19 +0000536#endif
537
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000538 template <class _Rep2>
Howard Hinnant473f8382012-07-13 19:17:27 +0000539 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000540 explicit duration(const _Rep2& __r,
541 typename enable_if
542 <
543 is_convertible<_Rep2, rep>::value &&
544 (treat_as_floating_point<rep>::value ||
545 !treat_as_floating_point<_Rep2>::value)
546 >::type* = 0)
547 : __rep_(__r) {}
548
549 // conversions
550 template <class _Rep2, class _Period2>
Howard Hinnant473f8382012-07-13 19:17:27 +0000551 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000552 duration(const duration<_Rep2, _Period2>& __d,
553 typename enable_if
554 <
Howard Hinnant713f4db2013-08-31 16:51:56 +0000555 __no_overflow<_Period2, period>::value && (
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000556 treat_as_floating_point<rep>::value ||
Howard Hinnant713f4db2013-08-31 16:51:56 +0000557 (__no_overflow<_Period2, period>::type::den == 1 &&
558 !treat_as_floating_point<_Rep2>::value))
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000559 >::type* = 0)
Howard Hinnant0949eed2011-06-30 21:18:19 +0000560 : __rep_(_VSTD::chrono::duration_cast<duration>(__d).count()) {}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000561
562 // observer
563
Howard Hinnant473f8382012-07-13 19:17:27 +0000564 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR rep count() const {return __rep_;}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000565
566 // arithmetic
567
Howard Hinnant473f8382012-07-13 19:17:27 +0000568 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR duration operator+() const {return *this;}
569 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR duration operator-() const {return duration(-__rep_);}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000570 _LIBCPP_INLINE_VISIBILITY duration& operator++() {++__rep_; return *this;}
571 _LIBCPP_INLINE_VISIBILITY duration operator++(int) {return duration(__rep_++);}
572 _LIBCPP_INLINE_VISIBILITY duration& operator--() {--__rep_; return *this;}
573 _LIBCPP_INLINE_VISIBILITY duration operator--(int) {return duration(__rep_--);}
574
575 _LIBCPP_INLINE_VISIBILITY duration& operator+=(const duration& __d) {__rep_ += __d.count(); return *this;}
576 _LIBCPP_INLINE_VISIBILITY duration& operator-=(const duration& __d) {__rep_ -= __d.count(); return *this;}
577
578 _LIBCPP_INLINE_VISIBILITY duration& operator*=(const rep& rhs) {__rep_ *= rhs; return *this;}
579 _LIBCPP_INLINE_VISIBILITY duration& operator/=(const rep& rhs) {__rep_ /= rhs; return *this;}
580 _LIBCPP_INLINE_VISIBILITY duration& operator%=(const rep& rhs) {__rep_ %= rhs; return *this;}
581 _LIBCPP_INLINE_VISIBILITY duration& operator%=(const duration& rhs) {__rep_ %= rhs.count(); return *this;}
582
583 // special values
584
Howard Hinnant473f8382012-07-13 19:17:27 +0000585 _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR duration zero() {return duration(duration_values<rep>::zero());}
586 _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR duration min() {return duration(duration_values<rep>::min());}
587 _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR duration max() {return duration(duration_values<rep>::max());}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000588};
589
590typedef duration<long long, nano> nanoseconds;
591typedef duration<long long, micro> microseconds;
592typedef duration<long long, milli> milliseconds;
593typedef duration<long long > seconds;
594typedef duration< long, ratio< 60> > minutes;
595typedef duration< long, ratio<3600> > hours;
596
597// Duration ==
598
599template <class _LhsDuration, class _RhsDuration>
600struct __duration_eq
601{
Howard Hinnant473f8382012-07-13 19:17:27 +0000602 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
Howard Hinnantb9d9fb42013-06-28 18:09:35 +0000603 bool operator()(const _LhsDuration& __lhs, const _RhsDuration& __rhs) const
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000604 {
605 typedef typename common_type<_LhsDuration, _RhsDuration>::type _Ct;
606 return _Ct(__lhs).count() == _Ct(__rhs).count();
607 }
608};
609
610template <class _LhsDuration>
611struct __duration_eq<_LhsDuration, _LhsDuration>
612{
Howard Hinnant473f8382012-07-13 19:17:27 +0000613 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
Howard Hinnantb9d9fb42013-06-28 18:09:35 +0000614 bool operator()(const _LhsDuration& __lhs, const _LhsDuration& __rhs) const
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000615 {return __lhs.count() == __rhs.count();}
616};
617
618template <class _Rep1, class _Period1, class _Rep2, class _Period2>
619inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant473f8382012-07-13 19:17:27 +0000620_LIBCPP_CONSTEXPR
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000621bool
622operator==(const duration<_Rep1, _Period1>& __lhs, const duration<_Rep2, _Period2>& __rhs)
623{
624 return __duration_eq<duration<_Rep1, _Period1>, duration<_Rep2, _Period2> >()(__lhs, __rhs);
625}
626
627// Duration !=
628
629template <class _Rep1, class _Period1, class _Rep2, class _Period2>
630inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant473f8382012-07-13 19:17:27 +0000631_LIBCPP_CONSTEXPR
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000632bool
633operator!=(const duration<_Rep1, _Period1>& __lhs, const duration<_Rep2, _Period2>& __rhs)
634{
635 return !(__lhs == __rhs);
636}
637
638// Duration <
639
640template <class _LhsDuration, class _RhsDuration>
641struct __duration_lt
642{
Howard Hinnant473f8382012-07-13 19:17:27 +0000643 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
Howard Hinnantb9d9fb42013-06-28 18:09:35 +0000644 bool operator()(const _LhsDuration& __lhs, const _RhsDuration& __rhs) const
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000645 {
646 typedef typename common_type<_LhsDuration, _RhsDuration>::type _Ct;
647 return _Ct(__lhs).count() < _Ct(__rhs).count();
648 }
649};
650
651template <class _LhsDuration>
652struct __duration_lt<_LhsDuration, _LhsDuration>
653{
Howard Hinnant473f8382012-07-13 19:17:27 +0000654 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
Howard Hinnantb9d9fb42013-06-28 18:09:35 +0000655 bool operator()(const _LhsDuration& __lhs, const _LhsDuration& __rhs) const
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000656 {return __lhs.count() < __rhs.count();}
657};
658
659template <class _Rep1, class _Period1, class _Rep2, class _Period2>
660inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant473f8382012-07-13 19:17:27 +0000661_LIBCPP_CONSTEXPR
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000662bool
663operator< (const duration<_Rep1, _Period1>& __lhs, const duration<_Rep2, _Period2>& __rhs)
664{
665 return __duration_lt<duration<_Rep1, _Period1>, duration<_Rep2, _Period2> >()(__lhs, __rhs);
666}
667
668// Duration >
669
670template <class _Rep1, class _Period1, class _Rep2, class _Period2>
671inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant473f8382012-07-13 19:17:27 +0000672_LIBCPP_CONSTEXPR
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000673bool
674operator> (const duration<_Rep1, _Period1>& __lhs, const duration<_Rep2, _Period2>& __rhs)
675{
676 return __rhs < __lhs;
677}
678
679// Duration <=
680
681template <class _Rep1, class _Period1, class _Rep2, class _Period2>
682inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant473f8382012-07-13 19:17:27 +0000683_LIBCPP_CONSTEXPR
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000684bool
685operator<=(const duration<_Rep1, _Period1>& __lhs, const duration<_Rep2, _Period2>& __rhs)
686{
687 return !(__rhs < __lhs);
688}
689
690// Duration >=
691
692template <class _Rep1, class _Period1, class _Rep2, class _Period2>
693inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant473f8382012-07-13 19:17:27 +0000694_LIBCPP_CONSTEXPR
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000695bool
696operator>=(const duration<_Rep1, _Period1>& __lhs, const duration<_Rep2, _Period2>& __rhs)
697{
698 return !(__lhs < __rhs);
699}
700
701// Duration +
702
703template <class _Rep1, class _Period1, class _Rep2, class _Period2>
704inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant473f8382012-07-13 19:17:27 +0000705_LIBCPP_CONSTEXPR
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000706typename common_type<duration<_Rep1, _Period1>, duration<_Rep2, _Period2> >::type
707operator+(const duration<_Rep1, _Period1>& __lhs, const duration<_Rep2, _Period2>& __rhs)
708{
Howard Hinnant473f8382012-07-13 19:17:27 +0000709 typedef typename common_type<duration<_Rep1, _Period1>, duration<_Rep2, _Period2> >::type _Cd;
710 return _Cd(_Cd(__lhs).count() + _Cd(__rhs).count());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000711}
712
713// Duration -
714
715template <class _Rep1, class _Period1, class _Rep2, class _Period2>
716inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant473f8382012-07-13 19:17:27 +0000717_LIBCPP_CONSTEXPR
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000718typename common_type<duration<_Rep1, _Period1>, duration<_Rep2, _Period2> >::type
719operator-(const duration<_Rep1, _Period1>& __lhs, const duration<_Rep2, _Period2>& __rhs)
720{
Howard Hinnant473f8382012-07-13 19:17:27 +0000721 typedef typename common_type<duration<_Rep1, _Period1>, duration<_Rep2, _Period2> >::type _Cd;
722 return _Cd(_Cd(__lhs).count() - _Cd(__rhs).count());
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000723}
724
725// Duration *
726
727template <class _Rep1, class _Period, class _Rep2>
728inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant473f8382012-07-13 19:17:27 +0000729_LIBCPP_CONSTEXPR
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000730typename enable_if
731<
732 is_convertible<_Rep2, typename common_type<_Rep1, _Rep2>::type>::value,
733 duration<typename common_type<_Rep1, _Rep2>::type, _Period>
734>::type
735operator*(const duration<_Rep1, _Period>& __d, const _Rep2& __s)
736{
737 typedef typename common_type<_Rep1, _Rep2>::type _Cr;
Howard Hinnant473f8382012-07-13 19:17:27 +0000738 typedef duration<_Cr, _Period> _Cd;
739 return _Cd(_Cd(__d).count() * static_cast<_Cr>(__s));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000740}
741
742template <class _Rep1, class _Period, class _Rep2>
743inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant473f8382012-07-13 19:17:27 +0000744_LIBCPP_CONSTEXPR
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000745typename enable_if
746<
747 is_convertible<_Rep1, typename common_type<_Rep1, _Rep2>::type>::value,
748 duration<typename common_type<_Rep1, _Rep2>::type, _Period>
749>::type
750operator*(const _Rep1& __s, const duration<_Rep2, _Period>& __d)
751{
752 return __d * __s;
753}
754
755// Duration /
756
757template <class _Duration, class _Rep, bool = __is_duration<_Rep>::value>
758struct __duration_divide_result
759{
760};
761
762template <class _Duration, class _Rep2,
763 bool = is_convertible<_Rep2,
764 typename common_type<typename _Duration::rep, _Rep2>::type>::value>
765struct __duration_divide_imp
766{
767};
768
769template <class _Rep1, class _Period, class _Rep2>
770struct __duration_divide_imp<duration<_Rep1, _Period>, _Rep2, true>
771{
772 typedef duration<typename common_type<_Rep1, _Rep2>::type, _Period> type;
773};
774
775template <class _Rep1, class _Period, class _Rep2>
776struct __duration_divide_result<duration<_Rep1, _Period>, _Rep2, false>
777 : __duration_divide_imp<duration<_Rep1, _Period>, _Rep2>
778{
779};
780
781template <class _Rep1, class _Period, class _Rep2>
782inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant473f8382012-07-13 19:17:27 +0000783_LIBCPP_CONSTEXPR
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000784typename __duration_divide_result<duration<_Rep1, _Period>, _Rep2>::type
785operator/(const duration<_Rep1, _Period>& __d, const _Rep2& __s)
786{
787 typedef typename common_type<_Rep1, _Rep2>::type _Cr;
Howard Hinnant473f8382012-07-13 19:17:27 +0000788 typedef duration<_Cr, _Period> _Cd;
789 return _Cd(_Cd(__d).count() / static_cast<_Cr>(__s));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000790}
791
792template <class _Rep1, class _Period1, class _Rep2, class _Period2>
793inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant473f8382012-07-13 19:17:27 +0000794_LIBCPP_CONSTEXPR
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000795typename common_type<_Rep1, _Rep2>::type
796operator/(const duration<_Rep1, _Period1>& __lhs, const duration<_Rep2, _Period2>& __rhs)
797{
798 typedef typename common_type<duration<_Rep1, _Period1>, duration<_Rep2, _Period2> >::type _Ct;
799 return _Ct(__lhs).count() / _Ct(__rhs).count();
800}
801
802// Duration %
803
804template <class _Rep1, class _Period, class _Rep2>
805inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant473f8382012-07-13 19:17:27 +0000806_LIBCPP_CONSTEXPR
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000807typename __duration_divide_result<duration<_Rep1, _Period>, _Rep2>::type
808operator%(const duration<_Rep1, _Period>& __d, const _Rep2& __s)
809{
810 typedef typename common_type<_Rep1, _Rep2>::type _Cr;
Howard Hinnant473f8382012-07-13 19:17:27 +0000811 typedef duration<_Cr, _Period> _Cd;
812 return _Cd(_Cd(__d).count() % static_cast<_Cr>(__s));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000813}
814
815template <class _Rep1, class _Period1, class _Rep2, class _Period2>
816inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant473f8382012-07-13 19:17:27 +0000817_LIBCPP_CONSTEXPR
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000818typename common_type<duration<_Rep1, _Period1>, duration<_Rep2, _Period2> >::type
819operator%(const duration<_Rep1, _Period1>& __lhs, const duration<_Rep2, _Period2>& __rhs)
820{
Howard Hinnant473f8382012-07-13 19:17:27 +0000821 typedef typename common_type<_Rep1, _Rep2>::type _Cr;
822 typedef typename common_type<duration<_Rep1, _Period1>, duration<_Rep2, _Period2> >::type _Cd;
823 return _Cd(static_cast<_Cr>(_Cd(__lhs).count()) % static_cast<_Cr>(_Cd(__rhs).count()));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000824}
825
826//////////////////////////////////////////////////////////
827///////////////////// time_point /////////////////////////
828//////////////////////////////////////////////////////////
829
830template <class _Clock, class _Duration = typename _Clock::duration>
Howard Hinnant0f678bd2013-08-12 18:38:34 +0000831class _LIBCPP_TYPE_VIS_ONLY time_point
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000832{
833 static_assert(__is_duration<_Duration>::value,
834 "Second template parameter of time_point must be a std::chrono::duration");
835public:
836 typedef _Clock clock;
837 typedef _Duration duration;
838 typedef typename duration::rep rep;
839 typedef typename duration::period period;
840private:
841 duration __d_;
842
843public:
Marshall Clow832b3042013-07-31 19:32:19 +0000844 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 time_point() : __d_(duration::zero()) {}
845 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 explicit time_point(const duration& __d) : __d_(__d) {}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000846
847 // conversions
848 template <class _Duration2>
Marshall Clow832b3042013-07-31 19:32:19 +0000849 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000850 time_point(const time_point<clock, _Duration2>& t,
851 typename enable_if
852 <
853 is_convertible<_Duration2, duration>::value
854 >::type* = 0)
855 : __d_(t.time_since_epoch()) {}
856
857 // observer
858
Marshall Clow832b3042013-07-31 19:32:19 +0000859 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 duration time_since_epoch() const {return __d_;}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000860
861 // arithmetic
862
Howard Hinnant171771a2013-07-08 21:06:38 +0000863 _LIBCPP_INLINE_VISIBILITY time_point& operator+=(const duration& __d) {__d_ += __d; return *this;}
864 _LIBCPP_INLINE_VISIBILITY time_point& operator-=(const duration& __d) {__d_ -= __d; return *this;}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000865
866 // special values
867
Howard Hinnant473f8382012-07-13 19:17:27 +0000868 _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR time_point min() {return time_point(duration::min());}
869 _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR time_point max() {return time_point(duration::max());}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000870};
871
872} // chrono
873
874template <class _Clock, class _Duration1, class _Duration2>
Howard Hinnant0f678bd2013-08-12 18:38:34 +0000875struct _LIBCPP_TYPE_VIS_ONLY common_type<chrono::time_point<_Clock, _Duration1>,
876 chrono::time_point<_Clock, _Duration2> >
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000877{
878 typedef chrono::time_point<_Clock, typename common_type<_Duration1, _Duration2>::type> type;
879};
880
881namespace chrono {
882
883template <class _ToDuration, class _Clock, class _Duration>
Marshall Clow832b3042013-07-31 19:32:19 +0000884inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000885time_point<_Clock, _ToDuration>
886time_point_cast(const time_point<_Clock, _Duration>& __t)
887{
Howard Hinnant0949eed2011-06-30 21:18:19 +0000888 return time_point<_Clock, _ToDuration>(_VSTD::chrono::duration_cast<_ToDuration>(__t.time_since_epoch()));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000889}
890
Marshall Clow223df2e2015-11-05 19:33:59 +0000891#if _LIBCPP_STD_VER > 14
892template <class _ToDuration, class _Clock, class _Duration>
893inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
894typename enable_if
895<
896 __is_duration<_ToDuration>::value,
897 time_point<_Clock, _ToDuration>
898>::type
899floor(const time_point<_Clock, _Duration>& __t)
900{
901 return time_point<_Clock, _ToDuration>{floor<_ToDuration>(__t.time_since_epoch())};
902}
903
904template <class _ToDuration, class _Clock, class _Duration>
905inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
906typename enable_if
907<
908 __is_duration<_ToDuration>::value,
909 time_point<_Clock, _ToDuration>
910>::type
911ceil(const time_point<_Clock, _Duration>& __t)
912{
913 return time_point<_Clock, _ToDuration>{ceil<_ToDuration>(__t.time_since_epoch())};
914}
915
916template <class _ToDuration, class _Clock, class _Duration>
917inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
918typename enable_if
919<
920 __is_duration<_ToDuration>::value,
921 time_point<_Clock, _ToDuration>
922>::type
923round(const time_point<_Clock, _Duration>& __t)
924{
925 return time_point<_Clock, _ToDuration>{round<_ToDuration>(__t.time_since_epoch())};
926}
927
928template <class _Rep, class _Period>
929inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
930typename enable_if
931<
932 numeric_limits<_Rep>::is_signed,
933 duration<_Rep, _Period>
934>::type
935abs(duration<_Rep, _Period> __d)
936{
937 return __d >= __d.zero() ? __d : -__d;
938}
939#endif
940
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000941// time_point ==
942
943template <class _Clock, class _Duration1, class _Duration2>
Marshall Clow832b3042013-07-31 19:32:19 +0000944inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000945bool
946operator==(const time_point<_Clock, _Duration1>& __lhs, const time_point<_Clock, _Duration2>& __rhs)
947{
948 return __lhs.time_since_epoch() == __rhs.time_since_epoch();
949}
950
951// time_point !=
952
953template <class _Clock, class _Duration1, class _Duration2>
Marshall Clow832b3042013-07-31 19:32:19 +0000954inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000955bool
956operator!=(const time_point<_Clock, _Duration1>& __lhs, const time_point<_Clock, _Duration2>& __rhs)
957{
958 return !(__lhs == __rhs);
959}
960
961// time_point <
962
963template <class _Clock, class _Duration1, class _Duration2>
Marshall Clow832b3042013-07-31 19:32:19 +0000964inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000965bool
966operator<(const time_point<_Clock, _Duration1>& __lhs, const time_point<_Clock, _Duration2>& __rhs)
967{
968 return __lhs.time_since_epoch() < __rhs.time_since_epoch();
969}
970
971// time_point >
972
973template <class _Clock, class _Duration1, class _Duration2>
Marshall Clow832b3042013-07-31 19:32:19 +0000974inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000975bool
976operator>(const time_point<_Clock, _Duration1>& __lhs, const time_point<_Clock, _Duration2>& __rhs)
977{
978 return __rhs < __lhs;
979}
980
981// time_point <=
982
983template <class _Clock, class _Duration1, class _Duration2>
Marshall Clow832b3042013-07-31 19:32:19 +0000984inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000985bool
986operator<=(const time_point<_Clock, _Duration1>& __lhs, const time_point<_Clock, _Duration2>& __rhs)
987{
988 return !(__rhs < __lhs);
989}
990
991// time_point >=
992
993template <class _Clock, class _Duration1, class _Duration2>
Marshall Clow832b3042013-07-31 19:32:19 +0000994inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000995bool
996operator>=(const time_point<_Clock, _Duration1>& __lhs, const time_point<_Clock, _Duration2>& __rhs)
997{
998 return !(__lhs < __rhs);
999}
1000
1001// time_point operator+(time_point x, duration y);
1002
1003template <class _Clock, class _Duration1, class _Rep2, class _Period2>
Marshall Clow832b3042013-07-31 19:32:19 +00001004inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001005time_point<_Clock, typename common_type<_Duration1, duration<_Rep2, _Period2> >::type>
1006operator+(const time_point<_Clock, _Duration1>& __lhs, const duration<_Rep2, _Period2>& __rhs)
1007{
1008 typedef time_point<_Clock, typename common_type<_Duration1, duration<_Rep2, _Period2> >::type> _Tr;
Marshall Clow832b3042013-07-31 19:32:19 +00001009 return _Tr (__lhs.time_since_epoch() + __rhs);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001010}
1011
1012// time_point operator+(duration x, time_point y);
1013
1014template <class _Rep1, class _Period1, class _Clock, class _Duration2>
Marshall Clow832b3042013-07-31 19:32:19 +00001015inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001016time_point<_Clock, typename common_type<duration<_Rep1, _Period1>, _Duration2>::type>
1017operator+(const duration<_Rep1, _Period1>& __lhs, const time_point<_Clock, _Duration2>& __rhs)
1018{
1019 return __rhs + __lhs;
1020}
1021
1022// time_point operator-(time_point x, duration y);
1023
1024template <class _Clock, class _Duration1, class _Rep2, class _Period2>
Marshall Clow832b3042013-07-31 19:32:19 +00001025inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001026time_point<_Clock, typename common_type<_Duration1, duration<_Rep2, _Period2> >::type>
1027operator-(const time_point<_Clock, _Duration1>& __lhs, const duration<_Rep2, _Period2>& __rhs)
1028{
Marshall Clowdb7fa112016-11-14 18:22:19 +00001029 typedef time_point<_Clock, typename common_type<_Duration1, duration<_Rep2, _Period2> >::type> _Ret;
1030 return _Ret(__lhs.time_since_epoch() -__rhs);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001031}
1032
1033// duration operator-(time_point x, time_point y);
1034
1035template <class _Clock, class _Duration1, class _Duration2>
Marshall Clow832b3042013-07-31 19:32:19 +00001036inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001037typename common_type<_Duration1, _Duration2>::type
1038operator-(const time_point<_Clock, _Duration1>& __lhs, const time_point<_Clock, _Duration2>& __rhs)
1039{
1040 return __lhs.time_since_epoch() - __rhs.time_since_epoch();
1041}
1042
1043//////////////////////////////////////////////////////////
1044/////////////////////// clocks ///////////////////////////
1045//////////////////////////////////////////////////////////
1046
Howard Hinnant83eade62013-03-06 23:30:19 +00001047class _LIBCPP_TYPE_VIS system_clock
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001048{
1049public:
1050 typedef microseconds duration;
1051 typedef duration::rep rep;
1052 typedef duration::period period;
1053 typedef chrono::time_point<system_clock> time_point;
Marshall Clow832b3042013-07-31 19:32:19 +00001054 static _LIBCPP_CONSTEXPR_AFTER_CXX11 const bool is_steady = false;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001055
Howard Hinnant756a1762011-05-28 18:34:36 +00001056 static time_point now() _NOEXCEPT;
1057 static time_t to_time_t (const time_point& __t) _NOEXCEPT;
1058 static time_point from_time_t(time_t __t) _NOEXCEPT;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001059};
1060
Jonathan Roelofsc5780652014-09-02 21:14:38 +00001061#ifndef _LIBCPP_HAS_NO_MONOTONIC_CLOCK
Howard Hinnant83eade62013-03-06 23:30:19 +00001062class _LIBCPP_TYPE_VIS steady_clock
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001063{
1064public:
1065 typedef nanoseconds duration;
1066 typedef duration::rep rep;
1067 typedef duration::period period;
Howard Hinnantf8f85212010-11-20 19:16:30 +00001068 typedef chrono::time_point<steady_clock, duration> time_point;
Marshall Clow832b3042013-07-31 19:32:19 +00001069 static _LIBCPP_CONSTEXPR_AFTER_CXX11 const bool is_steady = true;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001070
Howard Hinnant756a1762011-05-28 18:34:36 +00001071 static time_point now() _NOEXCEPT;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001072};
1073
Howard Hinnantf8f85212010-11-20 19:16:30 +00001074typedef steady_clock high_resolution_clock;
Jonathan Roelofsc5780652014-09-02 21:14:38 +00001075#else
1076typedef system_clock high_resolution_clock;
1077#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001078
1079} // chrono
1080
Marshall Clow8d9dd7a2013-10-05 21:18:32 +00001081#if _LIBCPP_STD_VER > 11
1082// Suffixes for duration literals [time.duration.literals]
1083inline namespace literals
Marshall Clowf1820382013-07-24 21:18:14 +00001084{
1085 inline namespace chrono_literals
1086 {
1087
Howard Hinnantab61b2c2013-08-07 19:39:48 +00001088 constexpr chrono::hours operator"" h(unsigned long long __h)
1089 {
1090 return chrono::hours(static_cast<chrono::hours::rep>(__h));
1091 }
Marshall Clowf1820382013-07-24 21:18:14 +00001092
Howard Hinnantab61b2c2013-08-07 19:39:48 +00001093 constexpr chrono::duration<long double, ratio<3600,1>> operator"" h(long double __h)
1094 {
1095 return chrono::duration<long double, ratio<3600,1>>(__h);
1096 }
Marshall Clowf1820382013-07-24 21:18:14 +00001097
1098
Howard Hinnantab61b2c2013-08-07 19:39:48 +00001099 constexpr chrono::minutes operator"" min(unsigned long long __m)
1100 {
1101 return chrono::minutes(static_cast<chrono::minutes::rep>(__m));
1102 }
Marshall Clowf1820382013-07-24 21:18:14 +00001103
Howard Hinnantab61b2c2013-08-07 19:39:48 +00001104 constexpr chrono::duration<long double, ratio<60,1>> operator"" min(long double __m)
1105 {
1106 return chrono::duration<long double, ratio<60,1>> (__m);
1107 }
Marshall Clowf1820382013-07-24 21:18:14 +00001108
1109
Howard Hinnantab61b2c2013-08-07 19:39:48 +00001110 constexpr chrono::seconds operator"" s(unsigned long long __s)
1111 {
1112 return chrono::seconds(static_cast<chrono::seconds::rep>(__s));
1113 }
Marshall Clowf1820382013-07-24 21:18:14 +00001114
Howard Hinnantab61b2c2013-08-07 19:39:48 +00001115 constexpr chrono::duration<long double> operator"" s(long double __s)
1116 {
1117 return chrono::duration<long double> (__s);
1118 }
Marshall Clowf1820382013-07-24 21:18:14 +00001119
1120
Howard Hinnantab61b2c2013-08-07 19:39:48 +00001121 constexpr chrono::milliseconds operator"" ms(unsigned long long __ms)
1122 {
1123 return chrono::milliseconds(static_cast<chrono::milliseconds::rep>(__ms));
1124 }
Marshall Clowf1820382013-07-24 21:18:14 +00001125
Howard Hinnantab61b2c2013-08-07 19:39:48 +00001126 constexpr chrono::duration<long double, milli> operator"" ms(long double __ms)
1127 {
1128 return chrono::duration<long double, milli>(__ms);
1129 }
Marshall Clowf1820382013-07-24 21:18:14 +00001130
1131
Howard Hinnantab61b2c2013-08-07 19:39:48 +00001132 constexpr chrono::microseconds operator"" us(unsigned long long __us)
1133 {
1134 return chrono::microseconds(static_cast<chrono::microseconds::rep>(__us));
1135 }
Marshall Clowf1820382013-07-24 21:18:14 +00001136
Howard Hinnantab61b2c2013-08-07 19:39:48 +00001137 constexpr chrono::duration<long double, micro> operator"" us(long double __us)
1138 {
1139 return chrono::duration<long double, micro> (__us);
1140 }
1141
Marshall Clowf1820382013-07-24 21:18:14 +00001142
Howard Hinnantab61b2c2013-08-07 19:39:48 +00001143 constexpr chrono::nanoseconds operator"" ns(unsigned long long __ns)
1144 {
1145 return chrono::nanoseconds(static_cast<chrono::nanoseconds::rep>(__ns));
1146 }
Marshall Clowf1820382013-07-24 21:18:14 +00001147
Howard Hinnantab61b2c2013-08-07 19:39:48 +00001148 constexpr chrono::duration<long double, nano> operator"" ns(long double __ns)
1149 {
1150 return chrono::duration<long double, nano> (__ns);
1151 }
Marshall Clowf1820382013-07-24 21:18:14 +00001152
1153}}
Marshall Clow8d9dd7a2013-10-05 21:18:32 +00001154
1155namespace chrono { // hoist the literals into namespace std::chrono
1156 using namespace literals::chrono_literals;
1157}
1158
Marshall Clowf1820382013-07-24 21:18:14 +00001159#endif
1160
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001161_LIBCPP_END_NAMESPACE_STD
1162
1163#endif // _LIBCPP_CHRONO