blob: fb26fb824ad3bd7abdae62ef89abe8d59c76517c [file] [log] [blame]
Howard Hinnantbc8d3f92010-05-11 19:42:161// -*- C++ -*-
2//===---------------------------- chrono ----------------------------------===//
3//
Howard Hinnantf5256e12010-05-11 21:36:014// The LLVM Compiler Infrastructure
Howard Hinnantbc8d3f92010-05-11 19:42:165//
Howard Hinnantb64f8b02010-11-16 22:09:026// 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:168//
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:2723constexpr
Howard Hinnantbc8d3f92010-05-11 19:42:1624ToDuration
25duration_cast(const duration<Rep, Period>& fd);
26
27template <class Rep> struct treat_as_floating_point : is_floating_point<Rep> {};
28
29template <class Rep>
30struct duration_values
31{
32public:
Howard Hinnant473f8382012-07-13 19:17:2733 static constexpr Rep zero();
34 static constexpr Rep max();
35 static constexpr Rep min();
Howard Hinnantbc8d3f92010-05-11 19:42:1636};
37
38// duration
39
40template <class Rep, class Period = ratio<1>>
41class duration
42{
43 static_assert(!__is_duration<Rep>::value, "A duration representation can not be a duration");
44 static_assert(__is_ratio<Period>::value, "Second template parameter of duration must be a std::ratio");
45 static_assert(Period::num > 0, "duration period must be positive");
46public:
47 typedef Rep rep;
48 typedef Period period;
49
Howard Hinnant473f8382012-07-13 19:17:2750 constexpr duration() = default;
Howard Hinnantbc8d3f92010-05-11 19:42:1651 template <class Rep2>
Howard Hinnant473f8382012-07-13 19:17:2752 constexpr explicit duration(const Rep2& r,
Howard Hinnantbc8d3f92010-05-11 19:42:1653 typename enable_if
54 <
55 is_convertible<Rep2, rep>::value &&
56 (treat_as_floating_point<rep>::value ||
57 !treat_as_floating_point<rep>::value && !treat_as_floating_point<Rep2>::value)
58 >::type* = 0);
59
60 // conversions
61 template <class Rep2, class Period2>
Howard Hinnant473f8382012-07-13 19:17:2762 constexpr duration(const duration<Rep2, Period2>& d,
Howard Hinnantbc8d3f92010-05-11 19:42:1663 typename enable_if
64 <
65 treat_as_floating_point<rep>::value ||
66 ratio_divide<Period2, period>::type::den == 1
67 >::type* = 0);
68
69 // observer
70
Howard Hinnant473f8382012-07-13 19:17:2771 constexpr rep count() const;
Howard Hinnantbc8d3f92010-05-11 19:42:1672
73 // arithmetic
74
Howard Hinnant473f8382012-07-13 19:17:2775 constexpr duration operator+() const;
76 constexpr duration operator-() const;
Howard Hinnantbc8d3f92010-05-11 19:42:1677 duration& operator++();
78 duration operator++(int);
79 duration& operator--();
80 duration operator--(int);
81
82 duration& operator+=(const duration& d);
83 duration& operator-=(const duration& d);
84
85 duration& operator*=(const rep& rhs);
86 duration& operator/=(const rep& rhs);
87
88 // special values
89
Howard Hinnant473f8382012-07-13 19:17:2790 static constexpr duration zero();
91 static constexpr duration min();
92 static constexpr duration max();
Howard Hinnantbc8d3f92010-05-11 19:42:1693};
94
95typedef duration<long long, nano> nanoseconds;
96typedef duration<long long, micro> microseconds;
97typedef duration<long long, milli> milliseconds;
98typedef duration<long long > seconds;
99typedef duration< long, ratio< 60> > minutes;
100typedef duration< long, ratio<3600> > hours;
101
102template <class Clock, class Duration = typename Clock::duration>
103class time_point
104{
105public:
106 typedef Clock clock;
107 typedef Duration duration;
108 typedef typename duration::rep rep;
109 typedef typename duration::period period;
110private:
111 duration d_; // exposition only
112
113public:
Marshall Clow832b3042013-07-31 19:32:19114 time_point(); // has value "epoch" // constexpr in C++14
115 explicit time_point(const duration& d); // same as time_point() + d // constexpr in C++14
Howard Hinnantbc8d3f92010-05-11 19:42:16116
117 // conversions
118 template <class Duration2>
Marshall Clow832b3042013-07-31 19:32:19119 time_point(const time_point<clock, Duration2>& t); // constexpr in C++14
Howard Hinnantbc8d3f92010-05-11 19:42:16120
121 // observer
122
Marshall Clow832b3042013-07-31 19:32:19123 duration time_since_epoch() const; // constexpr in C++14
Howard Hinnantbc8d3f92010-05-11 19:42:16124
125 // arithmetic
126
127 time_point& operator+=(const duration& d);
128 time_point& operator-=(const duration& d);
129
130 // special values
131
132 static constexpr time_point min();
133 static constexpr time_point max();
134};
135
136} // chrono
137
138// common_type traits
139template <class Rep1, class Period1, class Rep2, class Period2>
140 struct common_type<chrono::duration<Rep1, Period1>, chrono::duration<Rep2, Period2>>;
141
142template <class Clock, class Duration1, class Duration2>
143 struct common_type<chrono::time_point<Clock, Duration1>, chrono::time_point<Clock, Duration2>>;
144
145namespace chrono {
146
147// duration arithmetic
148template <class Rep1, class Period1, class Rep2, class Period2>
Howard Hinnant473f8382012-07-13 19:17:27149 constexpr
Howard Hinnantbc8d3f92010-05-11 19:42:16150 typename common_type<duration<Rep1, Period1>, duration<Rep2, Period2>>::type
151 operator+(const duration<Rep1, Period1>& lhs, const duration<Rep2, Period2>& rhs);
152template <class Rep1, class Period1, class Rep2, class Period2>
Howard Hinnant473f8382012-07-13 19:17:27153 constexpr
Howard Hinnantbc8d3f92010-05-11 19:42:16154 typename common_type<duration<Rep1, Period1>, duration<Rep2, Period2>>::type
155 operator-(const duration<Rep1, Period1>& lhs, const duration<Rep2, Period2>& rhs);
156template <class Rep1, class Period, class Rep2>
Howard Hinnant473f8382012-07-13 19:17:27157 constexpr
Howard Hinnantbc8d3f92010-05-11 19:42:16158 duration<typename common_type<Rep1, Rep2>::type, Period>
159 operator*(const duration<Rep1, Period>& d, const Rep2& s);
160template <class Rep1, class Period, class Rep2>
Howard Hinnant473f8382012-07-13 19:17:27161 constexpr
Howard Hinnantbc8d3f92010-05-11 19:42:16162 duration<typename common_type<Rep1, Rep2>::type, Period>
163 operator*(const Rep1& s, const duration<Rep2, Period>& d);
164template <class Rep1, class Period, class Rep2>
Howard Hinnant473f8382012-07-13 19:17:27165 constexpr
Howard Hinnantbc8d3f92010-05-11 19:42:16166 duration<typename common_type<Rep1, Rep2>::type, Period>
167 operator/(const duration<Rep1, Period>& d, const Rep2& s);
168template <class Rep1, class Period1, class Rep2, class Period2>
Howard Hinnant473f8382012-07-13 19:17:27169 constexpr
Howard Hinnantbc8d3f92010-05-11 19:42:16170 typename common_type<Rep1, Rep2>::type
171 operator/(const duration<Rep1, Period1>& lhs, const duration<Rep2, Period2>& rhs);
172
173// duration comparisons
174template <class Rep1, class Period1, class Rep2, class Period2>
Howard Hinnant473f8382012-07-13 19:17:27175 constexpr
Howard Hinnantbc8d3f92010-05-11 19:42:16176 bool operator==(const duration<Rep1, Period1>& lhs, const duration<Rep2, Period2>& rhs);
177template <class Rep1, class Period1, class Rep2, class Period2>
Howard Hinnant473f8382012-07-13 19:17:27178 constexpr
Howard Hinnantbc8d3f92010-05-11 19:42:16179 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:27181 constexpr
Howard Hinnantbc8d3f92010-05-11 19:42:16182 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:27184 constexpr
Howard Hinnantbc8d3f92010-05-11 19:42:16185 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:27187 constexpr
Howard Hinnantbc8d3f92010-05-11 19:42:16188 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:27190 constexpr
Howard Hinnantbc8d3f92010-05-11 19:42:16191 bool operator>=(const duration<Rep1, Period1>& lhs, const duration<Rep2, Period2>& rhs);
192
193// duration_cast
194template <class ToDuration, class Rep, class Period>
195 ToDuration duration_cast(const duration<Rep, Period>& d);
196
Marshall Clow832b3042013-07-31 19:32:19197// time_point arithmetic (all constexpr in C++14)
Howard Hinnantbc8d3f92010-05-11 19:42:16198template <class Clock, class Duration1, class Rep2, class Period2>
199 time_point<Clock, typename common_type<Duration1, duration<Rep2, Period2>>::type>
200 operator+(const time_point<Clock, Duration1>& lhs, const duration<Rep2, Period2>& rhs);
201template <class Rep1, class Period1, class Clock, class Duration2>
202 time_point<Clock, typename common_type<duration<Rep1, Period1>, Duration2>::type>
203 operator+(const duration<Rep1, Period1>& lhs, const time_point<Clock, Duration2>& rhs);
204template <class Clock, class Duration1, class Rep2, class Period2>
205 time_point<Clock, typename common_type<Duration1, duration<Rep2, Period2>>::type>
206 operator-(const time_point<Clock, Duration1>& lhs, const duration<Rep2, Period2>& rhs);
207template <class Clock, class Duration1, class Duration2>
208 typename common_type<Duration1, Duration2>::type
209 operator-(const time_point<Clock, Duration1>& lhs, const time_point<Clock, Duration2>& rhs);
210
Marshall Clow832b3042013-07-31 19:32:19211// time_point comparisons (all constexpr in C++14)
Howard Hinnantbc8d3f92010-05-11 19:42:16212template <class Clock, class Duration1, class Duration2>
213 bool operator==(const time_point<Clock, Duration1>& lhs, const time_point<Clock, Duration2>& rhs);
214template <class Clock, class Duration1, class Duration2>
215 bool operator!=(const time_point<Clock, Duration1>& lhs, const time_point<Clock, Duration2>& rhs);
216template <class Clock, class Duration1, class Duration2>
217 bool operator< (const time_point<Clock, Duration1>& lhs, const time_point<Clock, Duration2>& rhs);
218template <class Clock, class Duration1, class Duration2>
219 bool operator<=(const time_point<Clock, Duration1>& lhs, const time_point<Clock, Duration2>& rhs);
220template <class Clock, class Duration1, class Duration2>
221 bool operator> (const time_point<Clock, Duration1>& lhs, const time_point<Clock, Duration2>& rhs);
222template <class Clock, class Duration1, class Duration2>
223 bool operator>=(const time_point<Clock, Duration1>& lhs, const time_point<Clock, Duration2>& rhs);
224
Marshall Clow832b3042013-07-31 19:32:19225// time_point_cast (constexpr in C++14)
Howard Hinnantbc8d3f92010-05-11 19:42:16226
227template <class ToDuration, class Clock, class Duration>
228 time_point<Clock, ToDuration> time_point_cast(const time_point<Clock, Duration>& t);
229
230// Clocks
231
232class system_clock
233{
234public:
235 typedef microseconds duration;
236 typedef duration::rep rep;
237 typedef duration::period period;
238 typedef chrono::time_point<system_clock> time_point;
Marshall Clow832b3042013-07-31 19:32:19239 static const bool is_steady = false; // constexpr in C++14
Howard Hinnantbc8d3f92010-05-11 19:42:16240
Howard Hinnant756a1762011-05-28 18:34:36241 static time_point now() noexcept;
242 static time_t to_time_t (const time_point& __t) noexcept;
243 static time_point from_time_t(time_t __t) noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16244};
245
Howard Hinnantf8f85212010-11-20 19:16:30246class steady_clock
Howard Hinnantbc8d3f92010-05-11 19:42:16247{
248public:
249 typedef nanoseconds duration;
250 typedef duration::rep rep;
251 typedef duration::period period;
Howard Hinnantf8f85212010-11-20 19:16:30252 typedef chrono::time_point<steady_clock, duration> time_point;
Marshall Clow832b3042013-07-31 19:32:19253 static const bool is_steady = true; // constexpr in C++14
Howard Hinnantbc8d3f92010-05-11 19:42:16254
Howard Hinnant756a1762011-05-28 18:34:36255 static time_point now() noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16256};
257
Howard Hinnantf8f85212010-11-20 19:16:30258typedef steady_clock high_resolution_clock;
Howard Hinnantbc8d3f92010-05-11 19:42:16259
260} // chrono
261
Marshall Clowf1820382013-07-24 21:18:14262constexpr chrono::hours operator "" h(unsigned long long); // C++14
263constexpr chrono::duration<unspecified , ratio<3600,1>> operator "" h(long double); // C++14
264constexpr chrono::minutes operator "" min(unsigned long long); // C++14
265constexpr chrono::duration<unspecified , ratio<60,1>> operator "" min(long double); // C++14
266constexpr chrono::seconds operator "" s(unsigned long long); // C++14
267constexpr chrono::duration<unspecified > operator "" s(long double); // C++14
268constexpr chrono::milliseconds operator "" ms(unsigned long long); // C++14
269constexpr chrono::duration<unspecified , milli> operator "" ms(long double); // C++14
270constexpr chrono::microseconds operator "" us(unsigned long long); // C++14
271constexpr chrono::duration<unspecified , micro> operator "" us(long double); // C++14
272constexpr chrono::nanoseconds operator "" ns(unsigned long long); // C++14
273constexpr chrono::duration<unspecified , nano> operator "" ns(long double); // C++14
274
Howard Hinnantbc8d3f92010-05-11 19:42:16275} // std
276*/
277
278#include <__config>
279#include <ctime>
280#include <type_traits>
281#include <ratio>
282#include <limits>
283
Howard Hinnant66c6f972011-11-29 16:45:27284#include <__undef_min_max>
285
Howard Hinnant08e17472011-10-17 20:05:10286#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
Howard Hinnantbc8d3f92010-05-11 19:42:16287#pragma GCC system_header
Howard Hinnant08e17472011-10-17 20:05:10288#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16289
290_LIBCPP_BEGIN_NAMESPACE_STD
291
292namespace chrono
293{
294
Howard Hinnant83eade62013-03-06 23:30:19295template <class _Rep, class _Period = ratio<1> > class _LIBCPP_TYPE_VIS duration;
Howard Hinnantbc8d3f92010-05-11 19:42:16296
Howard Hinnantd8bc09b2010-05-18 17:32:30297template <class _Tp>
Howard Hinnantbc8d3f92010-05-11 19:42:16298struct __is_duration : false_type {};
299
300template <class _Rep, class _Period>
301struct __is_duration<duration<_Rep, _Period> > : true_type {};
302
303template <class _Rep, class _Period>
304struct __is_duration<const duration<_Rep, _Period> > : true_type {};
305
306template <class _Rep, class _Period>
307struct __is_duration<volatile duration<_Rep, _Period> > : true_type {};
308
309template <class _Rep, class _Period>
310struct __is_duration<const volatile duration<_Rep, _Period> > : true_type {};
311
312} // chrono
313
314template <class _Rep1, class _Period1, class _Rep2, class _Period2>
Howard Hinnant83eade62013-03-06 23:30:19315struct _LIBCPP_TYPE_VIS common_type<chrono::duration<_Rep1, _Period1>,
Howard Hinnant422a53f2010-09-21 21:28:23316 chrono::duration<_Rep2, _Period2> >
Howard Hinnantbc8d3f92010-05-11 19:42:16317{
318 typedef chrono::duration<typename common_type<_Rep1, _Rep2>::type,
319 typename __ratio_gcd<_Period1, _Period2>::type> type;
320};
321
322namespace chrono {
323
324// duration_cast
325
326template <class _FromDuration, class _ToDuration,
327 class _Period = typename ratio_divide<typename _FromDuration::period, typename _ToDuration::period>::type,
328 bool = _Period::num == 1,
329 bool = _Period::den == 1>
330struct __duration_cast;
331
332template <class _FromDuration, class _ToDuration, class _Period>
333struct __duration_cast<_FromDuration, _ToDuration, _Period, true, true>
334{
Howard Hinnant473f8382012-07-13 19:17:27335 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
Howard Hinnantbc8d3f92010-05-11 19:42:16336 _ToDuration operator()(const _FromDuration& __fd) const
337 {
338 return _ToDuration(static_cast<typename _ToDuration::rep>(__fd.count()));
339 }
340};
341
342template <class _FromDuration, class _ToDuration, class _Period>
343struct __duration_cast<_FromDuration, _ToDuration, _Period, true, false>
344{
Howard Hinnant473f8382012-07-13 19:17:27345 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
Howard Hinnantbc8d3f92010-05-11 19:42:16346 _ToDuration operator()(const _FromDuration& __fd) const
347 {
348 typedef typename common_type<typename _ToDuration::rep, typename _FromDuration::rep, intmax_t>::type _Ct;
349 return _ToDuration(static_cast<typename _ToDuration::rep>(
350 static_cast<_Ct>(__fd.count()) / static_cast<_Ct>(_Period::den)));
351 }
352};
353
354template <class _FromDuration, class _ToDuration, class _Period>
355struct __duration_cast<_FromDuration, _ToDuration, _Period, false, true>
356{
Howard Hinnant473f8382012-07-13 19:17:27357 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
Howard Hinnantbc8d3f92010-05-11 19:42:16358 _ToDuration operator()(const _FromDuration& __fd) const
359 {
360 typedef typename common_type<typename _ToDuration::rep, typename _FromDuration::rep, intmax_t>::type _Ct;
361 return _ToDuration(static_cast<typename _ToDuration::rep>(
362 static_cast<_Ct>(__fd.count()) * static_cast<_Ct>(_Period::num)));
363 }
364};
365
366template <class _FromDuration, class _ToDuration, class _Period>
367struct __duration_cast<_FromDuration, _ToDuration, _Period, false, false>
368{
Howard Hinnant473f8382012-07-13 19:17:27369 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
Howard Hinnantbc8d3f92010-05-11 19:42:16370 _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::num)
375 / static_cast<_Ct>(_Period::den)));
376 }
377};
378
379template <class _ToDuration, class _Rep, class _Period>
380inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant473f8382012-07-13 19:17:27381_LIBCPP_CONSTEXPR
Howard Hinnantbc8d3f92010-05-11 19:42:16382typename enable_if
383<
384 __is_duration<_ToDuration>::value,
385 _ToDuration
386>::type
387duration_cast(const duration<_Rep, _Period>& __fd)
388{
389 return __duration_cast<duration<_Rep, _Period>, _ToDuration>()(__fd);
390}
391
Howard Hinnant422a53f2010-09-21 21:28:23392template <class _Rep>
Howard Hinnant83eade62013-03-06 23:30:19393struct _LIBCPP_TYPE_VIS treat_as_floating_point : is_floating_point<_Rep> {};
Howard Hinnantbc8d3f92010-05-11 19:42:16394
395template <class _Rep>
Howard Hinnant83eade62013-03-06 23:30:19396struct _LIBCPP_TYPE_VIS duration_values
Howard Hinnantbc8d3f92010-05-11 19:42:16397{
398public:
Howard Hinnant473f8382012-07-13 19:17:27399 _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR _Rep zero() {return _Rep(0);}
400 _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR _Rep max() {return numeric_limits<_Rep>::max();}
401 _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR _Rep min() {return numeric_limits<_Rep>::lowest();}
Howard Hinnantbc8d3f92010-05-11 19:42:16402};
403
404// duration
405
406template <class _Rep, class _Period>
Howard Hinnant83eade62013-03-06 23:30:19407class _LIBCPP_TYPE_VIS duration
Howard Hinnantbc8d3f92010-05-11 19:42:16408{
409 static_assert(!__is_duration<_Rep>::value, "A duration representation can not be a duration");
410 static_assert(__is_ratio<_Period>::value, "Second template parameter of duration must be a std::ratio");
411 static_assert(_Period::num > 0, "duration period must be positive");
412public:
413 typedef _Rep rep;
414 typedef _Period period;
415private:
416 rep __rep_;
417public:
418
Marshall Clow832b3042013-07-31 19:32:19419 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
420#ifndef _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS
Marshall Clow832b3042013-07-31 19:32:19421 duration() = default;
Marshall Clow07774732013-07-31 19:39:37422#else
423 duration() {}
Marshall Clow832b3042013-07-31 19:32:19424#endif
425
Howard Hinnantbc8d3f92010-05-11 19:42:16426 template <class _Rep2>
Howard Hinnant473f8382012-07-13 19:17:27427 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
Howard Hinnantbc8d3f92010-05-11 19:42:16428 explicit duration(const _Rep2& __r,
429 typename enable_if
430 <
431 is_convertible<_Rep2, rep>::value &&
432 (treat_as_floating_point<rep>::value ||
433 !treat_as_floating_point<_Rep2>::value)
434 >::type* = 0)
435 : __rep_(__r) {}
436
437 // conversions
438 template <class _Rep2, class _Period2>
Howard Hinnant473f8382012-07-13 19:17:27439 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
Howard Hinnantbc8d3f92010-05-11 19:42:16440 duration(const duration<_Rep2, _Period2>& __d,
441 typename enable_if
442 <
443 treat_as_floating_point<rep>::value ||
444 (ratio_divide<_Period2, period>::type::den == 1 &&
445 !treat_as_floating_point<_Rep2>::value)
446 >::type* = 0)
Howard Hinnant0949eed2011-06-30 21:18:19447 : __rep_(_VSTD::chrono::duration_cast<duration>(__d).count()) {}
Howard Hinnantbc8d3f92010-05-11 19:42:16448
449 // observer
450
Howard Hinnant473f8382012-07-13 19:17:27451 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR rep count() const {return __rep_;}
Howard Hinnantbc8d3f92010-05-11 19:42:16452
453 // arithmetic
454
Howard Hinnant473f8382012-07-13 19:17:27455 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR duration operator+() const {return *this;}
456 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR duration operator-() const {return duration(-__rep_);}
Howard Hinnantbc8d3f92010-05-11 19:42:16457 _LIBCPP_INLINE_VISIBILITY duration& operator++() {++__rep_; return *this;}
458 _LIBCPP_INLINE_VISIBILITY duration operator++(int) {return duration(__rep_++);}
459 _LIBCPP_INLINE_VISIBILITY duration& operator--() {--__rep_; return *this;}
460 _LIBCPP_INLINE_VISIBILITY duration operator--(int) {return duration(__rep_--);}
461
462 _LIBCPP_INLINE_VISIBILITY duration& operator+=(const duration& __d) {__rep_ += __d.count(); return *this;}
463 _LIBCPP_INLINE_VISIBILITY duration& operator-=(const duration& __d) {__rep_ -= __d.count(); return *this;}
464
465 _LIBCPP_INLINE_VISIBILITY duration& operator*=(const rep& rhs) {__rep_ *= rhs; return *this;}
466 _LIBCPP_INLINE_VISIBILITY duration& operator/=(const rep& rhs) {__rep_ /= rhs; return *this;}
467 _LIBCPP_INLINE_VISIBILITY duration& operator%=(const rep& rhs) {__rep_ %= rhs; return *this;}
468 _LIBCPP_INLINE_VISIBILITY duration& operator%=(const duration& rhs) {__rep_ %= rhs.count(); return *this;}
469
470 // special values
471
Howard Hinnant473f8382012-07-13 19:17:27472 _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR duration zero() {return duration(duration_values<rep>::zero());}
473 _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR duration min() {return duration(duration_values<rep>::min());}
474 _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR duration max() {return duration(duration_values<rep>::max());}
Howard Hinnantbc8d3f92010-05-11 19:42:16475};
476
477typedef duration<long long, nano> nanoseconds;
478typedef duration<long long, micro> microseconds;
479typedef duration<long long, milli> milliseconds;
480typedef duration<long long > seconds;
481typedef duration< long, ratio< 60> > minutes;
482typedef duration< long, ratio<3600> > hours;
483
484// Duration ==
485
486template <class _LhsDuration, class _RhsDuration>
487struct __duration_eq
488{
Howard Hinnant473f8382012-07-13 19:17:27489 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
Howard Hinnantb9d9fb42013-06-28 18:09:35490 bool operator()(const _LhsDuration& __lhs, const _RhsDuration& __rhs) const
Howard Hinnantbc8d3f92010-05-11 19:42:16491 {
492 typedef typename common_type<_LhsDuration, _RhsDuration>::type _Ct;
493 return _Ct(__lhs).count() == _Ct(__rhs).count();
494 }
495};
496
497template <class _LhsDuration>
498struct __duration_eq<_LhsDuration, _LhsDuration>
499{
Howard Hinnant473f8382012-07-13 19:17:27500 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
Howard Hinnantb9d9fb42013-06-28 18:09:35501 bool operator()(const _LhsDuration& __lhs, const _LhsDuration& __rhs) const
Howard Hinnantbc8d3f92010-05-11 19:42:16502 {return __lhs.count() == __rhs.count();}
503};
504
505template <class _Rep1, class _Period1, class _Rep2, class _Period2>
506inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant473f8382012-07-13 19:17:27507_LIBCPP_CONSTEXPR
Howard Hinnantbc8d3f92010-05-11 19:42:16508bool
509operator==(const duration<_Rep1, _Period1>& __lhs, const duration<_Rep2, _Period2>& __rhs)
510{
511 return __duration_eq<duration<_Rep1, _Period1>, duration<_Rep2, _Period2> >()(__lhs, __rhs);
512}
513
514// Duration !=
515
516template <class _Rep1, class _Period1, class _Rep2, class _Period2>
517inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant473f8382012-07-13 19:17:27518_LIBCPP_CONSTEXPR
Howard Hinnantbc8d3f92010-05-11 19:42:16519bool
520operator!=(const duration<_Rep1, _Period1>& __lhs, const duration<_Rep2, _Period2>& __rhs)
521{
522 return !(__lhs == __rhs);
523}
524
525// Duration <
526
527template <class _LhsDuration, class _RhsDuration>
528struct __duration_lt
529{
Howard Hinnant473f8382012-07-13 19:17:27530 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
Howard Hinnantb9d9fb42013-06-28 18:09:35531 bool operator()(const _LhsDuration& __lhs, const _RhsDuration& __rhs) const
Howard Hinnantbc8d3f92010-05-11 19:42:16532 {
533 typedef typename common_type<_LhsDuration, _RhsDuration>::type _Ct;
534 return _Ct(__lhs).count() < _Ct(__rhs).count();
535 }
536};
537
538template <class _LhsDuration>
539struct __duration_lt<_LhsDuration, _LhsDuration>
540{
Howard Hinnant473f8382012-07-13 19:17:27541 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
Howard Hinnantb9d9fb42013-06-28 18:09:35542 bool operator()(const _LhsDuration& __lhs, const _LhsDuration& __rhs) const
Howard Hinnantbc8d3f92010-05-11 19:42:16543 {return __lhs.count() < __rhs.count();}
544};
545
546template <class _Rep1, class _Period1, class _Rep2, class _Period2>
547inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant473f8382012-07-13 19:17:27548_LIBCPP_CONSTEXPR
Howard Hinnantbc8d3f92010-05-11 19:42:16549bool
550operator< (const duration<_Rep1, _Period1>& __lhs, const duration<_Rep2, _Period2>& __rhs)
551{
552 return __duration_lt<duration<_Rep1, _Period1>, duration<_Rep2, _Period2> >()(__lhs, __rhs);
553}
554
555// Duration >
556
557template <class _Rep1, class _Period1, class _Rep2, class _Period2>
558inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant473f8382012-07-13 19:17:27559_LIBCPP_CONSTEXPR
Howard Hinnantbc8d3f92010-05-11 19:42:16560bool
561operator> (const duration<_Rep1, _Period1>& __lhs, const duration<_Rep2, _Period2>& __rhs)
562{
563 return __rhs < __lhs;
564}
565
566// Duration <=
567
568template <class _Rep1, class _Period1, class _Rep2, class _Period2>
569inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant473f8382012-07-13 19:17:27570_LIBCPP_CONSTEXPR
Howard Hinnantbc8d3f92010-05-11 19:42:16571bool
572operator<=(const duration<_Rep1, _Period1>& __lhs, const duration<_Rep2, _Period2>& __rhs)
573{
574 return !(__rhs < __lhs);
575}
576
577// Duration >=
578
579template <class _Rep1, class _Period1, class _Rep2, class _Period2>
580inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant473f8382012-07-13 19:17:27581_LIBCPP_CONSTEXPR
Howard Hinnantbc8d3f92010-05-11 19:42:16582bool
583operator>=(const duration<_Rep1, _Period1>& __lhs, const duration<_Rep2, _Period2>& __rhs)
584{
585 return !(__lhs < __rhs);
586}
587
588// Duration +
589
590template <class _Rep1, class _Period1, class _Rep2, class _Period2>
591inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant473f8382012-07-13 19:17:27592_LIBCPP_CONSTEXPR
Howard Hinnantbc8d3f92010-05-11 19:42:16593typename common_type<duration<_Rep1, _Period1>, duration<_Rep2, _Period2> >::type
594operator+(const duration<_Rep1, _Period1>& __lhs, const duration<_Rep2, _Period2>& __rhs)
595{
Howard Hinnant473f8382012-07-13 19:17:27596 typedef typename common_type<duration<_Rep1, _Period1>, duration<_Rep2, _Period2> >::type _Cd;
597 return _Cd(_Cd(__lhs).count() + _Cd(__rhs).count());
Howard Hinnantbc8d3f92010-05-11 19:42:16598}
599
600// Duration -
601
602template <class _Rep1, class _Period1, class _Rep2, class _Period2>
603inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant473f8382012-07-13 19:17:27604_LIBCPP_CONSTEXPR
Howard Hinnantbc8d3f92010-05-11 19:42:16605typename common_type<duration<_Rep1, _Period1>, duration<_Rep2, _Period2> >::type
606operator-(const duration<_Rep1, _Period1>& __lhs, const duration<_Rep2, _Period2>& __rhs)
607{
Howard Hinnant473f8382012-07-13 19:17:27608 typedef typename common_type<duration<_Rep1, _Period1>, duration<_Rep2, _Period2> >::type _Cd;
609 return _Cd(_Cd(__lhs).count() - _Cd(__rhs).count());
Howard Hinnantbc8d3f92010-05-11 19:42:16610}
611
612// Duration *
613
614template <class _Rep1, class _Period, class _Rep2>
615inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant473f8382012-07-13 19:17:27616_LIBCPP_CONSTEXPR
Howard Hinnantbc8d3f92010-05-11 19:42:16617typename enable_if
618<
619 is_convertible<_Rep2, typename common_type<_Rep1, _Rep2>::type>::value,
620 duration<typename common_type<_Rep1, _Rep2>::type, _Period>
621>::type
622operator*(const duration<_Rep1, _Period>& __d, const _Rep2& __s)
623{
624 typedef typename common_type<_Rep1, _Rep2>::type _Cr;
Howard Hinnant473f8382012-07-13 19:17:27625 typedef duration<_Cr, _Period> _Cd;
626 return _Cd(_Cd(__d).count() * static_cast<_Cr>(__s));
Howard Hinnantbc8d3f92010-05-11 19:42:16627}
628
629template <class _Rep1, class _Period, class _Rep2>
630inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant473f8382012-07-13 19:17:27631_LIBCPP_CONSTEXPR
Howard Hinnantbc8d3f92010-05-11 19:42:16632typename enable_if
633<
634 is_convertible<_Rep1, typename common_type<_Rep1, _Rep2>::type>::value,
635 duration<typename common_type<_Rep1, _Rep2>::type, _Period>
636>::type
637operator*(const _Rep1& __s, const duration<_Rep2, _Period>& __d)
638{
639 return __d * __s;
640}
641
642// Duration /
643
644template <class _Duration, class _Rep, bool = __is_duration<_Rep>::value>
645struct __duration_divide_result
646{
647};
648
649template <class _Duration, class _Rep2,
650 bool = is_convertible<_Rep2,
651 typename common_type<typename _Duration::rep, _Rep2>::type>::value>
652struct __duration_divide_imp
653{
654};
655
656template <class _Rep1, class _Period, class _Rep2>
657struct __duration_divide_imp<duration<_Rep1, _Period>, _Rep2, true>
658{
659 typedef duration<typename common_type<_Rep1, _Rep2>::type, _Period> type;
660};
661
662template <class _Rep1, class _Period, class _Rep2>
663struct __duration_divide_result<duration<_Rep1, _Period>, _Rep2, false>
664 : __duration_divide_imp<duration<_Rep1, _Period>, _Rep2>
665{
666};
667
668template <class _Rep1, class _Period, class _Rep2>
669inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant473f8382012-07-13 19:17:27670_LIBCPP_CONSTEXPR
Howard Hinnantbc8d3f92010-05-11 19:42:16671typename __duration_divide_result<duration<_Rep1, _Period>, _Rep2>::type
672operator/(const duration<_Rep1, _Period>& __d, const _Rep2& __s)
673{
674 typedef typename common_type<_Rep1, _Rep2>::type _Cr;
Howard Hinnant473f8382012-07-13 19:17:27675 typedef duration<_Cr, _Period> _Cd;
676 return _Cd(_Cd(__d).count() / static_cast<_Cr>(__s));
Howard Hinnantbc8d3f92010-05-11 19:42:16677}
678
679template <class _Rep1, class _Period1, class _Rep2, class _Period2>
680inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant473f8382012-07-13 19:17:27681_LIBCPP_CONSTEXPR
Howard Hinnantbc8d3f92010-05-11 19:42:16682typename common_type<_Rep1, _Rep2>::type
683operator/(const duration<_Rep1, _Period1>& __lhs, const duration<_Rep2, _Period2>& __rhs)
684{
685 typedef typename common_type<duration<_Rep1, _Period1>, duration<_Rep2, _Period2> >::type _Ct;
686 return _Ct(__lhs).count() / _Ct(__rhs).count();
687}
688
689// Duration %
690
691template <class _Rep1, class _Period, class _Rep2>
692inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant473f8382012-07-13 19:17:27693_LIBCPP_CONSTEXPR
Howard Hinnantbc8d3f92010-05-11 19:42:16694typename __duration_divide_result<duration<_Rep1, _Period>, _Rep2>::type
695operator%(const duration<_Rep1, _Period>& __d, const _Rep2& __s)
696{
697 typedef typename common_type<_Rep1, _Rep2>::type _Cr;
Howard Hinnant473f8382012-07-13 19:17:27698 typedef duration<_Cr, _Period> _Cd;
699 return _Cd(_Cd(__d).count() % static_cast<_Cr>(__s));
Howard Hinnantbc8d3f92010-05-11 19:42:16700}
701
702template <class _Rep1, class _Period1, class _Rep2, class _Period2>
703inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant473f8382012-07-13 19:17:27704_LIBCPP_CONSTEXPR
Howard Hinnantbc8d3f92010-05-11 19:42:16705typename common_type<duration<_Rep1, _Period1>, duration<_Rep2, _Period2> >::type
706operator%(const duration<_Rep1, _Period1>& __lhs, const duration<_Rep2, _Period2>& __rhs)
707{
Howard Hinnant473f8382012-07-13 19:17:27708 typedef typename common_type<_Rep1, _Rep2>::type _Cr;
709 typedef typename common_type<duration<_Rep1, _Period1>, duration<_Rep2, _Period2> >::type _Cd;
710 return _Cd(static_cast<_Cr>(_Cd(__lhs).count()) % static_cast<_Cr>(_Cd(__rhs).count()));
Howard Hinnantbc8d3f92010-05-11 19:42:16711}
712
713//////////////////////////////////////////////////////////
714///////////////////// time_point /////////////////////////
715//////////////////////////////////////////////////////////
716
717template <class _Clock, class _Duration = typename _Clock::duration>
Howard Hinnant83eade62013-03-06 23:30:19718class _LIBCPP_TYPE_VIS time_point
Howard Hinnantbc8d3f92010-05-11 19:42:16719{
720 static_assert(__is_duration<_Duration>::value,
721 "Second template parameter of time_point must be a std::chrono::duration");
722public:
723 typedef _Clock clock;
724 typedef _Duration duration;
725 typedef typename duration::rep rep;
726 typedef typename duration::period period;
727private:
728 duration __d_;
729
730public:
Marshall Clow832b3042013-07-31 19:32:19731 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 time_point() : __d_(duration::zero()) {}
732 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 explicit time_point(const duration& __d) : __d_(__d) {}
Howard Hinnantbc8d3f92010-05-11 19:42:16733
734 // conversions
735 template <class _Duration2>
Marshall Clow832b3042013-07-31 19:32:19736 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
Howard Hinnantbc8d3f92010-05-11 19:42:16737 time_point(const time_point<clock, _Duration2>& t,
738 typename enable_if
739 <
740 is_convertible<_Duration2, duration>::value
741 >::type* = 0)
742 : __d_(t.time_since_epoch()) {}
743
744 // observer
745
Marshall Clow832b3042013-07-31 19:32:19746 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 duration time_since_epoch() const {return __d_;}
Howard Hinnantbc8d3f92010-05-11 19:42:16747
748 // arithmetic
749
Howard Hinnant171771a2013-07-08 21:06:38750 _LIBCPP_INLINE_VISIBILITY time_point& operator+=(const duration& __d) {__d_ += __d; return *this;}
751 _LIBCPP_INLINE_VISIBILITY time_point& operator-=(const duration& __d) {__d_ -= __d; return *this;}
Howard Hinnantbc8d3f92010-05-11 19:42:16752
753 // special values
754
Howard Hinnant473f8382012-07-13 19:17:27755 _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR time_point min() {return time_point(duration::min());}
756 _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR time_point max() {return time_point(duration::max());}
Howard Hinnantbc8d3f92010-05-11 19:42:16757};
758
759} // chrono
760
761template <class _Clock, class _Duration1, class _Duration2>
Howard Hinnant83eade62013-03-06 23:30:19762struct _LIBCPP_TYPE_VIS common_type<chrono::time_point<_Clock, _Duration1>,
Howard Hinnant422a53f2010-09-21 21:28:23763 chrono::time_point<_Clock, _Duration2> >
Howard Hinnantbc8d3f92010-05-11 19:42:16764{
765 typedef chrono::time_point<_Clock, typename common_type<_Duration1, _Duration2>::type> type;
766};
767
768namespace chrono {
769
770template <class _ToDuration, class _Clock, class _Duration>
Marshall Clow832b3042013-07-31 19:32:19771inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
Howard Hinnantbc8d3f92010-05-11 19:42:16772time_point<_Clock, _ToDuration>
773time_point_cast(const time_point<_Clock, _Duration>& __t)
774{
Howard Hinnant0949eed2011-06-30 21:18:19775 return time_point<_Clock, _ToDuration>(_VSTD::chrono::duration_cast<_ToDuration>(__t.time_since_epoch()));
Howard Hinnantbc8d3f92010-05-11 19:42:16776}
777
778// time_point ==
779
780template <class _Clock, class _Duration1, class _Duration2>
Marshall Clow832b3042013-07-31 19:32:19781inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
Howard Hinnantbc8d3f92010-05-11 19:42:16782bool
783operator==(const time_point<_Clock, _Duration1>& __lhs, const time_point<_Clock, _Duration2>& __rhs)
784{
785 return __lhs.time_since_epoch() == __rhs.time_since_epoch();
786}
787
788// time_point !=
789
790template <class _Clock, class _Duration1, class _Duration2>
Marshall Clow832b3042013-07-31 19:32:19791inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
Howard Hinnantbc8d3f92010-05-11 19:42:16792bool
793operator!=(const time_point<_Clock, _Duration1>& __lhs, const time_point<_Clock, _Duration2>& __rhs)
794{
795 return !(__lhs == __rhs);
796}
797
798// time_point <
799
800template <class _Clock, class _Duration1, class _Duration2>
Marshall Clow832b3042013-07-31 19:32:19801inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
Howard Hinnantbc8d3f92010-05-11 19:42:16802bool
803operator<(const time_point<_Clock, _Duration1>& __lhs, const time_point<_Clock, _Duration2>& __rhs)
804{
805 return __lhs.time_since_epoch() < __rhs.time_since_epoch();
806}
807
808// time_point >
809
810template <class _Clock, class _Duration1, class _Duration2>
Marshall Clow832b3042013-07-31 19:32:19811inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
Howard Hinnantbc8d3f92010-05-11 19:42:16812bool
813operator>(const time_point<_Clock, _Duration1>& __lhs, const time_point<_Clock, _Duration2>& __rhs)
814{
815 return __rhs < __lhs;
816}
817
818// time_point <=
819
820template <class _Clock, class _Duration1, class _Duration2>
Marshall Clow832b3042013-07-31 19:32:19821inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
Howard Hinnantbc8d3f92010-05-11 19:42:16822bool
823operator<=(const time_point<_Clock, _Duration1>& __lhs, const time_point<_Clock, _Duration2>& __rhs)
824{
825 return !(__rhs < __lhs);
826}
827
828// time_point >=
829
830template <class _Clock, class _Duration1, class _Duration2>
Marshall Clow832b3042013-07-31 19:32:19831inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
Howard Hinnantbc8d3f92010-05-11 19:42:16832bool
833operator>=(const time_point<_Clock, _Duration1>& __lhs, const time_point<_Clock, _Duration2>& __rhs)
834{
835 return !(__lhs < __rhs);
836}
837
838// time_point operator+(time_point x, duration y);
839
840template <class _Clock, class _Duration1, class _Rep2, class _Period2>
Marshall Clow832b3042013-07-31 19:32:19841inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
Howard Hinnantbc8d3f92010-05-11 19:42:16842time_point<_Clock, typename common_type<_Duration1, duration<_Rep2, _Period2> >::type>
843operator+(const time_point<_Clock, _Duration1>& __lhs, const duration<_Rep2, _Period2>& __rhs)
844{
845 typedef time_point<_Clock, typename common_type<_Duration1, duration<_Rep2, _Period2> >::type> _Tr;
Marshall Clow832b3042013-07-31 19:32:19846 return _Tr (__lhs.time_since_epoch() + __rhs);
Howard Hinnantbc8d3f92010-05-11 19:42:16847}
848
849// time_point operator+(duration x, time_point y);
850
851template <class _Rep1, class _Period1, class _Clock, class _Duration2>
Marshall Clow832b3042013-07-31 19:32:19852inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
Howard Hinnantbc8d3f92010-05-11 19:42:16853time_point<_Clock, typename common_type<duration<_Rep1, _Period1>, _Duration2>::type>
854operator+(const duration<_Rep1, _Period1>& __lhs, const time_point<_Clock, _Duration2>& __rhs)
855{
856 return __rhs + __lhs;
857}
858
859// time_point operator-(time_point x, duration y);
860
861template <class _Clock, class _Duration1, class _Rep2, class _Period2>
Marshall Clow832b3042013-07-31 19:32:19862inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
Howard Hinnantbc8d3f92010-05-11 19:42:16863time_point<_Clock, typename common_type<_Duration1, duration<_Rep2, _Period2> >::type>
864operator-(const time_point<_Clock, _Duration1>& __lhs, const duration<_Rep2, _Period2>& __rhs)
865{
866 return __lhs + (-__rhs);
867}
868
869// duration operator-(time_point x, time_point y);
870
871template <class _Clock, class _Duration1, class _Duration2>
Marshall Clow832b3042013-07-31 19:32:19872inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
Howard Hinnantbc8d3f92010-05-11 19:42:16873typename common_type<_Duration1, _Duration2>::type
874operator-(const time_point<_Clock, _Duration1>& __lhs, const time_point<_Clock, _Duration2>& __rhs)
875{
876 return __lhs.time_since_epoch() - __rhs.time_since_epoch();
877}
878
879//////////////////////////////////////////////////////////
880/////////////////////// clocks ///////////////////////////
881//////////////////////////////////////////////////////////
882
Howard Hinnant83eade62013-03-06 23:30:19883class _LIBCPP_TYPE_VIS system_clock
Howard Hinnantbc8d3f92010-05-11 19:42:16884{
885public:
886 typedef microseconds duration;
887 typedef duration::rep rep;
888 typedef duration::period period;
889 typedef chrono::time_point<system_clock> time_point;
Marshall Clow832b3042013-07-31 19:32:19890 static _LIBCPP_CONSTEXPR_AFTER_CXX11 const bool is_steady = false;
Howard Hinnantbc8d3f92010-05-11 19:42:16891
Howard Hinnant756a1762011-05-28 18:34:36892 static time_point now() _NOEXCEPT;
893 static time_t to_time_t (const time_point& __t) _NOEXCEPT;
894 static time_point from_time_t(time_t __t) _NOEXCEPT;
Howard Hinnantbc8d3f92010-05-11 19:42:16895};
896
Howard Hinnant83eade62013-03-06 23:30:19897class _LIBCPP_TYPE_VIS steady_clock
Howard Hinnantbc8d3f92010-05-11 19:42:16898{
899public:
900 typedef nanoseconds duration;
901 typedef duration::rep rep;
902 typedef duration::period period;
Howard Hinnantf8f85212010-11-20 19:16:30903 typedef chrono::time_point<steady_clock, duration> time_point;
Marshall Clow832b3042013-07-31 19:32:19904 static _LIBCPP_CONSTEXPR_AFTER_CXX11 const bool is_steady = true;
Howard Hinnantbc8d3f92010-05-11 19:42:16905
Howard Hinnant756a1762011-05-28 18:34:36906 static time_point now() _NOEXCEPT;
Howard Hinnantbc8d3f92010-05-11 19:42:16907};
908
Howard Hinnantf8f85212010-11-20 19:16:30909typedef steady_clock high_resolution_clock;
Howard Hinnantbc8d3f92010-05-11 19:42:16910
911} // chrono
912
Marshall Clowf1820382013-07-24 21:18:14913#if _LIBCPP_STD_VER > 11
914// Literal suffixes for chrono types
915// inline // Deviation from N3690.
916// We believe the inline to be a defect and have submitted an LWG issue.
917// An LWG issue number has not yet been assigned.
918namespace literals
919{
920 inline namespace chrono_literals
921 {
922
923constexpr chrono::hours operator"" h(unsigned long long __h)
924{
925return chrono::hours(static_cast<chrono::hours::rep>(__h));
926}
927
928constexpr chrono::duration<long double, ratio<3600,1>> operator"" h(long double __h)
929{
930return chrono::duration<long double, ratio<3600,1>>(__h);
931}
932
933
934constexpr chrono::minutes operator"" min(unsigned long long __m)
935{
936return chrono::minutes(static_cast<chrono::minutes::rep>(__m));
937}
938
939constexpr chrono::duration<long double, ratio<60,1>> operator"" min(long double __m)
940{
941return chrono::duration<long double, ratio<60,1>> (__m);
942}
943
944
945constexpr chrono::seconds operator"" s(unsigned long long __s)
946{
947return chrono::seconds(static_cast<chrono::seconds::rep>(__s));
948}
949
950constexpr chrono::duration<long double> operator"" s(long double __s)
951{
952return chrono::duration<long double> (__s);
953}
954
955
956constexpr chrono::milliseconds operator"" ms(unsigned long long __ms)
957{
958return chrono::milliseconds(static_cast<chrono::milliseconds::rep>(__ms));
959}
960
961constexpr chrono::duration<long double, milli> operator"" ms(long double __ms)
962{
963return chrono::duration<long double, milli>(__ms);
964}
965
966
967constexpr chrono::microseconds operator"" us(unsigned long long __us)
968{
969return chrono::microseconds(static_cast<chrono::microseconds::rep>(__us));
970}
971
972constexpr chrono::duration<long double, micro> operator"" us(long double __us)
973{
974return chrono::duration<long double, micro> (__us);
975}
976
977
978constexpr chrono::nanoseconds operator"" ns(unsigned long long __ns)
979{
980return chrono::nanoseconds(static_cast<chrono::nanoseconds::rep>(__ns));
981}
982
983constexpr chrono::duration<long double, nano> operator"" ns(long double __ns)
984{
985return chrono::duration<long double, nano> (__ns);
986}
987
988}}
989#endif
990
Howard Hinnantbc8d3f92010-05-11 19:42:16991_LIBCPP_END_NAMESPACE_STD
992
993#endif // _LIBCPP_CHRONO