root / lab4 / .minix-src / include / c++ / chrono @ 14
History | View | Annotate | Download (35.9 KB)
1 | 13 | up20180614 | // -*- C++ -*- |
---|---|---|---|
2 | //===---------------------------- chrono ----------------------------------===// |
||
3 | // |
||
4 | // The LLVM Compiler Infrastructure |
||
5 | // |
||
6 | // This file is dual licensed under the MIT and the University of Illinois Open |
||
7 | // Source Licenses. See LICENSE.TXT for details. |
||
8 | // |
||
9 | //===----------------------------------------------------------------------===// |
||
10 | |||
11 | #ifndef _LIBCPP_CHRONO |
||
12 | #define _LIBCPP_CHRONO |
||
13 | |||
14 | /* |
||
15 | chrono synopsis |
||
16 | |||
17 | namespace std |
||
18 | { |
||
19 | namespace chrono |
||
20 | { |
||
21 | |||
22 | template <class ToDuration, class Rep, class Period> |
||
23 | constexpr |
||
24 | ToDuration |
||
25 | duration_cast(const duration<Rep, Period>& fd); |
||
26 | |||
27 | template <class Rep> struct treat_as_floating_point : is_floating_point<Rep> {}; |
||
28 | |||
29 | template <class Rep> |
||
30 | struct duration_values |
||
31 | { |
||
32 | public: |
||
33 | static constexpr Rep zero(); |
||
34 | static constexpr Rep max(); |
||
35 | static constexpr Rep min(); |
||
36 | }; |
||
37 | |||
38 | // duration |
||
39 | |||
40 | template <class Rep, class Period = ratio<1>> |
||
41 | class 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"); |
||
46 | public: |
||
47 | typedef Rep rep; |
||
48 | typedef Period period; |
||
49 | |||
50 | constexpr duration() = default; |
||
51 | template <class Rep2> |
||
52 | constexpr explicit duration(const Rep2& r, |
||
53 | 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> |
||
62 | constexpr duration(const duration<Rep2, Period2>& d, |
||
63 | 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 | |||
71 | constexpr rep count() const; |
||
72 | |||
73 | // arithmetic |
||
74 | |||
75 | constexpr duration operator+() const; |
||
76 | constexpr duration operator-() const; |
||
77 | 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 | |||
90 | static constexpr duration zero(); |
||
91 | static constexpr duration min(); |
||
92 | static constexpr duration max(); |
||
93 | }; |
||
94 | |||
95 | typedef duration<long long, nano> nanoseconds; |
||
96 | typedef duration<long long, micro> microseconds; |
||
97 | typedef duration<long long, milli> milliseconds; |
||
98 | typedef duration<long long > seconds; |
||
99 | typedef duration< long, ratio< 60> > minutes; |
||
100 | typedef duration< long, ratio<3600> > hours; |
||
101 | |||
102 | template <class Clock, class Duration = typename Clock::duration> |
||
103 | class time_point |
||
104 | { |
||
105 | public: |
||
106 | typedef Clock clock; |
||
107 | typedef Duration duration; |
||
108 | typedef typename duration::rep rep; |
||
109 | typedef typename duration::period period; |
||
110 | private: |
||
111 | duration d_; // exposition only |
||
112 | |||
113 | public: |
||
114 | 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 |
||
116 | |||
117 | // conversions |
||
118 | template <class Duration2> |
||
119 | time_point(const time_point<clock, Duration2>& t); // constexpr in C++14 |
||
120 | |||
121 | // observer |
||
122 | |||
123 | duration time_since_epoch() const; // constexpr in C++14 |
||
124 | |||
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 |
||
139 | template <class Rep1, class Period1, class Rep2, class Period2> |
||
140 | struct common_type<chrono::duration<Rep1, Period1>, chrono::duration<Rep2, Period2>>; |
||
141 | |||
142 | template <class Clock, class Duration1, class Duration2> |
||
143 | struct common_type<chrono::time_point<Clock, Duration1>, chrono::time_point<Clock, Duration2>>; |
||
144 | |||
145 | namespace chrono { |
||
146 | |||
147 | // duration arithmetic |
||
148 | template <class Rep1, class Period1, class Rep2, class Period2> |
||
149 | constexpr |
||
150 | typename common_type<duration<Rep1, Period1>, duration<Rep2, Period2>>::type |
||
151 | operator+(const duration<Rep1, Period1>& lhs, const duration<Rep2, Period2>& rhs); |
||
152 | template <class Rep1, class Period1, class Rep2, class Period2> |
||
153 | constexpr |
||
154 | typename common_type<duration<Rep1, Period1>, duration<Rep2, Period2>>::type |
||
155 | operator-(const duration<Rep1, Period1>& lhs, const duration<Rep2, Period2>& rhs); |
||
156 | template <class Rep1, class Period, class Rep2> |
||
157 | constexpr |
||
158 | duration<typename common_type<Rep1, Rep2>::type, Period> |
||
159 | operator*(const duration<Rep1, Period>& d, const Rep2& s); |
||
160 | template <class Rep1, class Period, class Rep2> |
||
161 | constexpr |
||
162 | duration<typename common_type<Rep1, Rep2>::type, Period> |
||
163 | operator*(const Rep1& s, const duration<Rep2, Period>& d); |
||
164 | template <class Rep1, class Period, class Rep2> |
||
165 | constexpr |
||
166 | duration<typename common_type<Rep1, Rep2>::type, Period> |
||
167 | operator/(const duration<Rep1, Period>& d, const Rep2& s); |
||
168 | template <class Rep1, class Period1, class Rep2, class Period2> |
||
169 | constexpr |
||
170 | typename common_type<Rep1, Rep2>::type |
||
171 | operator/(const duration<Rep1, Period1>& lhs, const duration<Rep2, Period2>& rhs); |
||
172 | |||
173 | // duration comparisons |
||
174 | template <class Rep1, class Period1, class Rep2, class Period2> |
||
175 | constexpr |
||
176 | bool operator==(const duration<Rep1, Period1>& lhs, const duration<Rep2, Period2>& rhs); |
||
177 | template <class Rep1, class Period1, class Rep2, class Period2> |
||
178 | constexpr |
||
179 | bool operator!=(const duration<Rep1, Period1>& lhs, const duration<Rep2, Period2>& rhs); |
||
180 | template <class Rep1, class Period1, class Rep2, class Period2> |
||
181 | constexpr |
||
182 | bool operator< (const duration<Rep1, Period1>& lhs, const duration<Rep2, Period2>& rhs); |
||
183 | template <class Rep1, class Period1, class Rep2, class Period2> |
||
184 | constexpr |
||
185 | bool operator<=(const duration<Rep1, Period1>& lhs, const duration<Rep2, Period2>& rhs); |
||
186 | template <class Rep1, class Period1, class Rep2, class Period2> |
||
187 | constexpr |
||
188 | bool operator> (const duration<Rep1, Period1>& lhs, const duration<Rep2, Period2>& rhs); |
||
189 | template <class Rep1, class Period1, class Rep2, class Period2> |
||
190 | constexpr |
||
191 | bool operator>=(const duration<Rep1, Period1>& lhs, const duration<Rep2, Period2>& rhs); |
||
192 | |||
193 | // duration_cast |
||
194 | template <class ToDuration, class Rep, class Period> |
||
195 | ToDuration duration_cast(const duration<Rep, Period>& d); |
||
196 | |||
197 | // time_point arithmetic (all constexpr in C++14) |
||
198 | template <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); |
||
201 | template <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); |
||
204 | template <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); |
||
207 | template <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 | |||
211 | // time_point comparisons (all constexpr in C++14) |
||
212 | template <class Clock, class Duration1, class Duration2> |
||
213 | bool operator==(const time_point<Clock, Duration1>& lhs, const time_point<Clock, Duration2>& rhs); |
||
214 | template <class Clock, class Duration1, class Duration2> |
||
215 | bool operator!=(const time_point<Clock, Duration1>& lhs, const time_point<Clock, Duration2>& rhs); |
||
216 | template <class Clock, class Duration1, class Duration2> |
||
217 | bool operator< (const time_point<Clock, Duration1>& lhs, const time_point<Clock, Duration2>& rhs); |
||
218 | template <class Clock, class Duration1, class Duration2> |
||
219 | bool operator<=(const time_point<Clock, Duration1>& lhs, const time_point<Clock, Duration2>& rhs); |
||
220 | template <class Clock, class Duration1, class Duration2> |
||
221 | bool operator> (const time_point<Clock, Duration1>& lhs, const time_point<Clock, Duration2>& rhs); |
||
222 | template <class Clock, class Duration1, class Duration2> |
||
223 | bool operator>=(const time_point<Clock, Duration1>& lhs, const time_point<Clock, Duration2>& rhs); |
||
224 | |||
225 | // time_point_cast (constexpr in C++14) |
||
226 | |||
227 | template <class ToDuration, class Clock, class Duration> |
||
228 | time_point<Clock, ToDuration> time_point_cast(const time_point<Clock, Duration>& t); |
||
229 | |||
230 | // Clocks |
||
231 | |||
232 | class system_clock |
||
233 | { |
||
234 | public: |
||
235 | typedef microseconds duration; |
||
236 | typedef duration::rep rep; |
||
237 | typedef duration::period period; |
||
238 | typedef chrono::time_point<system_clock> time_point; |
||
239 | static const bool is_steady = false; // constexpr in C++14 |
||
240 | |||
241 | 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; |
||
244 | }; |
||
245 | |||
246 | class steady_clock |
||
247 | { |
||
248 | public: |
||
249 | typedef nanoseconds duration; |
||
250 | typedef duration::rep rep; |
||
251 | typedef duration::period period; |
||
252 | typedef chrono::time_point<steady_clock, duration> time_point; |
||
253 | static const bool is_steady = true; // constexpr in C++14 |
||
254 | |||
255 | static time_point now() noexcept; |
||
256 | }; |
||
257 | |||
258 | typedef steady_clock high_resolution_clock; |
||
259 | |||
260 | } // chrono |
||
261 | |||
262 | constexpr chrono::hours operator "" h(unsigned long long); // C++14 |
||
263 | constexpr chrono::duration<unspecified , ratio<3600,1>> operator "" h(long double); // C++14 |
||
264 | constexpr chrono::minutes operator "" min(unsigned long long); // C++14 |
||
265 | constexpr chrono::duration<unspecified , ratio<60,1>> operator "" min(long double); // C++14 |
||
266 | constexpr chrono::seconds operator "" s(unsigned long long); // C++14 |
||
267 | constexpr chrono::duration<unspecified > operator "" s(long double); // C++14 |
||
268 | constexpr chrono::milliseconds operator "" ms(unsigned long long); // C++14 |
||
269 | constexpr chrono::duration<unspecified , milli> operator "" ms(long double); // C++14 |
||
270 | constexpr chrono::microseconds operator "" us(unsigned long long); // C++14 |
||
271 | constexpr chrono::duration<unspecified , micro> operator "" us(long double); // C++14 |
||
272 | constexpr chrono::nanoseconds operator "" ns(unsigned long long); // C++14 |
||
273 | constexpr chrono::duration<unspecified , nano> operator "" ns(long double); // C++14 |
||
274 | |||
275 | } // std |
||
276 | */ |
||
277 | |||
278 | #include <__config> |
||
279 | #include <ctime> |
||
280 | #include <type_traits> |
||
281 | #include <ratio> |
||
282 | #include <limits> |
||
283 | |||
284 | #include <__undef_min_max> |
||
285 | |||
286 | #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) |
||
287 | #pragma GCC system_header |
||
288 | #endif |
||
289 | |||
290 | _LIBCPP_BEGIN_NAMESPACE_STD |
||
291 | |||
292 | namespace chrono |
||
293 | { |
||
294 | |||
295 | template <class _Rep, class _Period = ratio<1> > class _LIBCPP_TYPE_VIS_ONLY duration; |
||
296 | |||
297 | template <class _Tp> |
||
298 | struct __is_duration : false_type {}; |
||
299 | |||
300 | template <class _Rep, class _Period> |
||
301 | struct __is_duration<duration<_Rep, _Period> > : true_type {}; |
||
302 | |||
303 | template <class _Rep, class _Period> |
||
304 | struct __is_duration<const duration<_Rep, _Period> > : true_type {}; |
||
305 | |||
306 | template <class _Rep, class _Period> |
||
307 | struct __is_duration<volatile duration<_Rep, _Period> > : true_type {}; |
||
308 | |||
309 | template <class _Rep, class _Period> |
||
310 | struct __is_duration<const volatile duration<_Rep, _Period> > : true_type {}; |
||
311 | |||
312 | } // chrono |
||
313 | |||
314 | template <class _Rep1, class _Period1, class _Rep2, class _Period2> |
||
315 | struct _LIBCPP_TYPE_VIS_ONLY common_type<chrono::duration<_Rep1, _Period1>, |
||
316 | chrono::duration<_Rep2, _Period2> > |
||
317 | { |
||
318 | typedef chrono::duration<typename common_type<_Rep1, _Rep2>::type, |
||
319 | typename __ratio_gcd<_Period1, _Period2>::type> type; |
||
320 | }; |
||
321 | |||
322 | namespace chrono { |
||
323 | |||
324 | // duration_cast |
||
325 | |||
326 | template <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> |
||
330 | struct __duration_cast; |
||
331 | |||
332 | template <class _FromDuration, class _ToDuration, class _Period> |
||
333 | struct __duration_cast<_FromDuration, _ToDuration, _Period, true, true> |
||
334 | { |
||
335 | _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR |
||
336 | _ToDuration operator()(const _FromDuration& __fd) const |
||
337 | { |
||
338 | return _ToDuration(static_cast<typename _ToDuration::rep>(__fd.count())); |
||
339 | } |
||
340 | }; |
||
341 | |||
342 | template <class _FromDuration, class _ToDuration, class _Period> |
||
343 | struct __duration_cast<_FromDuration, _ToDuration, _Period, true, false> |
||
344 | { |
||
345 | _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR |
||
346 | _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 | |||
354 | template <class _FromDuration, class _ToDuration, class _Period> |
||
355 | struct __duration_cast<_FromDuration, _ToDuration, _Period, false, true> |
||
356 | { |
||
357 | _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR |
||
358 | _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 | |||
366 | template <class _FromDuration, class _ToDuration, class _Period> |
||
367 | struct __duration_cast<_FromDuration, _ToDuration, _Period, false, false> |
||
368 | { |
||
369 | _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR |
||
370 | _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 | |||
379 | template <class _ToDuration, class _Rep, class _Period> |
||
380 | inline _LIBCPP_INLINE_VISIBILITY |
||
381 | _LIBCPP_CONSTEXPR |
||
382 | typename enable_if |
||
383 | < |
||
384 | __is_duration<_ToDuration>::value, |
||
385 | _ToDuration |
||
386 | >::type |
||
387 | duration_cast(const duration<_Rep, _Period>& __fd) |
||
388 | { |
||
389 | return __duration_cast<duration<_Rep, _Period>, _ToDuration>()(__fd); |
||
390 | } |
||
391 | |||
392 | template <class _Rep> |
||
393 | struct _LIBCPP_TYPE_VIS_ONLY treat_as_floating_point : is_floating_point<_Rep> {}; |
||
394 | |||
395 | template <class _Rep> |
||
396 | struct _LIBCPP_TYPE_VIS_ONLY duration_values |
||
397 | { |
||
398 | public: |
||
399 | _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();} |
||
402 | }; |
||
403 | |||
404 | // duration |
||
405 | |||
406 | template <class _Rep, class _Period> |
||
407 | class _LIBCPP_TYPE_VIS_ONLY duration |
||
408 | { |
||
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"); |
||
412 | |||
413 | template <class _R1, class _R2> |
||
414 | struct __no_overflow |
||
415 | { |
||
416 | private: |
||
417 | static const intmax_t __gcd_n1_n2 = __static_gcd<_R1::num, _R2::num>::value; |
||
418 | static const intmax_t __gcd_d1_d2 = __static_gcd<_R1::den, _R2::den>::value; |
||
419 | static const intmax_t __n1 = _R1::num / __gcd_n1_n2; |
||
420 | static const intmax_t __d1 = _R1::den / __gcd_d1_d2; |
||
421 | static const intmax_t __n2 = _R2::num / __gcd_n1_n2; |
||
422 | static const intmax_t __d2 = _R2::den / __gcd_d1_d2; |
||
423 | static const intmax_t max = -((intmax_t(1) << (sizeof(intmax_t) * CHAR_BIT - 1)) + 1); |
||
424 | |||
425 | template <intmax_t _Xp, intmax_t _Yp, bool __overflow> |
||
426 | struct __mul // __overflow == false |
||
427 | { |
||
428 | static const intmax_t value = _Xp * _Yp; |
||
429 | }; |
||
430 | |||
431 | template <intmax_t _Xp, intmax_t _Yp> |
||
432 | struct __mul<_Xp, _Yp, true> |
||
433 | { |
||
434 | static const intmax_t value = 1; |
||
435 | }; |
||
436 | |||
437 | public: |
||
438 | static const bool value = (__n1 <= max / __d2) && (__n2 <= max / __d1); |
||
439 | typedef ratio<__mul<__n1, __d2, !value>::value, |
||
440 | __mul<__n2, __d1, !value>::value> type; |
||
441 | }; |
||
442 | |||
443 | public: |
||
444 | typedef _Rep rep; |
||
445 | typedef _Period period; |
||
446 | private: |
||
447 | rep __rep_; |
||
448 | public: |
||
449 | |||
450 | _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR |
||
451 | #ifndef _LIBCPP_HAS_NO_DEFAULTED_FUNCTIONS |
||
452 | duration() = default; |
||
453 | #else |
||
454 | duration() {} |
||
455 | #endif |
||
456 | |||
457 | template <class _Rep2> |
||
458 | _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR |
||
459 | explicit duration(const _Rep2& __r, |
||
460 | typename enable_if |
||
461 | < |
||
462 | is_convertible<_Rep2, rep>::value && |
||
463 | (treat_as_floating_point<rep>::value || |
||
464 | !treat_as_floating_point<_Rep2>::value) |
||
465 | >::type* = 0) |
||
466 | : __rep_(__r) {} |
||
467 | |||
468 | // conversions |
||
469 | template <class _Rep2, class _Period2> |
||
470 | _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR |
||
471 | duration(const duration<_Rep2, _Period2>& __d, |
||
472 | typename enable_if |
||
473 | < |
||
474 | __no_overflow<_Period2, period>::value && ( |
||
475 | treat_as_floating_point<rep>::value || |
||
476 | (__no_overflow<_Period2, period>::type::den == 1 && |
||
477 | !treat_as_floating_point<_Rep2>::value)) |
||
478 | >::type* = 0) |
||
479 | : __rep_(_VSTD::chrono::duration_cast<duration>(__d).count()) {} |
||
480 | |||
481 | // observer |
||
482 | |||
483 | _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR rep count() const {return __rep_;} |
||
484 | |||
485 | // arithmetic |
||
486 | |||
487 | _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR duration operator+() const {return *this;} |
||
488 | _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR duration operator-() const {return duration(-__rep_);} |
||
489 | _LIBCPP_INLINE_VISIBILITY duration& operator++() {++__rep_; return *this;} |
||
490 | _LIBCPP_INLINE_VISIBILITY duration operator++(int) {return duration(__rep_++);} |
||
491 | _LIBCPP_INLINE_VISIBILITY duration& operator--() {--__rep_; return *this;} |
||
492 | _LIBCPP_INLINE_VISIBILITY duration operator--(int) {return duration(__rep_--);} |
||
493 | |||
494 | _LIBCPP_INLINE_VISIBILITY duration& operator+=(const duration& __d) {__rep_ += __d.count(); return *this;} |
||
495 | _LIBCPP_INLINE_VISIBILITY duration& operator-=(const duration& __d) {__rep_ -= __d.count(); return *this;} |
||
496 | |||
497 | _LIBCPP_INLINE_VISIBILITY duration& operator*=(const rep& rhs) {__rep_ *= rhs; return *this;} |
||
498 | _LIBCPP_INLINE_VISIBILITY duration& operator/=(const rep& rhs) {__rep_ /= rhs; return *this;} |
||
499 | _LIBCPP_INLINE_VISIBILITY duration& operator%=(const rep& rhs) {__rep_ %= rhs; return *this;} |
||
500 | _LIBCPP_INLINE_VISIBILITY duration& operator%=(const duration& rhs) {__rep_ %= rhs.count(); return *this;} |
||
501 | |||
502 | // special values |
||
503 | |||
504 | _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR duration zero() {return duration(duration_values<rep>::zero());} |
||
505 | _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR duration min() {return duration(duration_values<rep>::min());} |
||
506 | _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR duration max() {return duration(duration_values<rep>::max());} |
||
507 | }; |
||
508 | |||
509 | typedef duration<long long, nano> nanoseconds; |
||
510 | typedef duration<long long, micro> microseconds; |
||
511 | typedef duration<long long, milli> milliseconds; |
||
512 | typedef duration<long long > seconds; |
||
513 | typedef duration< long, ratio< 60> > minutes; |
||
514 | typedef duration< long, ratio<3600> > hours; |
||
515 | |||
516 | // Duration == |
||
517 | |||
518 | template <class _LhsDuration, class _RhsDuration> |
||
519 | struct __duration_eq |
||
520 | { |
||
521 | _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR |
||
522 | bool operator()(const _LhsDuration& __lhs, const _RhsDuration& __rhs) const |
||
523 | { |
||
524 | typedef typename common_type<_LhsDuration, _RhsDuration>::type _Ct; |
||
525 | return _Ct(__lhs).count() == _Ct(__rhs).count(); |
||
526 | } |
||
527 | }; |
||
528 | |||
529 | template <class _LhsDuration> |
||
530 | struct __duration_eq<_LhsDuration, _LhsDuration> |
||
531 | { |
||
532 | _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR |
||
533 | bool operator()(const _LhsDuration& __lhs, const _LhsDuration& __rhs) const |
||
534 | {return __lhs.count() == __rhs.count();} |
||
535 | }; |
||
536 | |||
537 | template <class _Rep1, class _Period1, class _Rep2, class _Period2> |
||
538 | inline _LIBCPP_INLINE_VISIBILITY |
||
539 | _LIBCPP_CONSTEXPR |
||
540 | bool |
||
541 | operator==(const duration<_Rep1, _Period1>& __lhs, const duration<_Rep2, _Period2>& __rhs) |
||
542 | { |
||
543 | return __duration_eq<duration<_Rep1, _Period1>, duration<_Rep2, _Period2> >()(__lhs, __rhs); |
||
544 | } |
||
545 | |||
546 | // Duration != |
||
547 | |||
548 | template <class _Rep1, class _Period1, class _Rep2, class _Period2> |
||
549 | inline _LIBCPP_INLINE_VISIBILITY |
||
550 | _LIBCPP_CONSTEXPR |
||
551 | bool |
||
552 | operator!=(const duration<_Rep1, _Period1>& __lhs, const duration<_Rep2, _Period2>& __rhs) |
||
553 | { |
||
554 | return !(__lhs == __rhs); |
||
555 | } |
||
556 | |||
557 | // Duration < |
||
558 | |||
559 | template <class _LhsDuration, class _RhsDuration> |
||
560 | struct __duration_lt |
||
561 | { |
||
562 | _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR |
||
563 | bool operator()(const _LhsDuration& __lhs, const _RhsDuration& __rhs) const |
||
564 | { |
||
565 | typedef typename common_type<_LhsDuration, _RhsDuration>::type _Ct; |
||
566 | return _Ct(__lhs).count() < _Ct(__rhs).count(); |
||
567 | } |
||
568 | }; |
||
569 | |||
570 | template <class _LhsDuration> |
||
571 | struct __duration_lt<_LhsDuration, _LhsDuration> |
||
572 | { |
||
573 | _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR |
||
574 | bool operator()(const _LhsDuration& __lhs, const _LhsDuration& __rhs) const |
||
575 | {return __lhs.count() < __rhs.count();} |
||
576 | }; |
||
577 | |||
578 | template <class _Rep1, class _Period1, class _Rep2, class _Period2> |
||
579 | inline _LIBCPP_INLINE_VISIBILITY |
||
580 | _LIBCPP_CONSTEXPR |
||
581 | bool |
||
582 | operator< (const duration<_Rep1, _Period1>& __lhs, const duration<_Rep2, _Period2>& __rhs) |
||
583 | { |
||
584 | return __duration_lt<duration<_Rep1, _Period1>, duration<_Rep2, _Period2> >()(__lhs, __rhs); |
||
585 | } |
||
586 | |||
587 | // Duration > |
||
588 | |||
589 | template <class _Rep1, class _Period1, class _Rep2, class _Period2> |
||
590 | inline _LIBCPP_INLINE_VISIBILITY |
||
591 | _LIBCPP_CONSTEXPR |
||
592 | bool |
||
593 | operator> (const duration<_Rep1, _Period1>& __lhs, const duration<_Rep2, _Period2>& __rhs) |
||
594 | { |
||
595 | return __rhs < __lhs; |
||
596 | } |
||
597 | |||
598 | // Duration <= |
||
599 | |||
600 | template <class _Rep1, class _Period1, class _Rep2, class _Period2> |
||
601 | inline _LIBCPP_INLINE_VISIBILITY |
||
602 | _LIBCPP_CONSTEXPR |
||
603 | bool |
||
604 | operator<=(const duration<_Rep1, _Period1>& __lhs, const duration<_Rep2, _Period2>& __rhs) |
||
605 | { |
||
606 | return !(__rhs < __lhs); |
||
607 | } |
||
608 | |||
609 | // Duration >= |
||
610 | |||
611 | template <class _Rep1, class _Period1, class _Rep2, class _Period2> |
||
612 | inline _LIBCPP_INLINE_VISIBILITY |
||
613 | _LIBCPP_CONSTEXPR |
||
614 | bool |
||
615 | operator>=(const duration<_Rep1, _Period1>& __lhs, const duration<_Rep2, _Period2>& __rhs) |
||
616 | { |
||
617 | return !(__lhs < __rhs); |
||
618 | } |
||
619 | |||
620 | // Duration + |
||
621 | |||
622 | template <class _Rep1, class _Period1, class _Rep2, class _Period2> |
||
623 | inline _LIBCPP_INLINE_VISIBILITY |
||
624 | _LIBCPP_CONSTEXPR |
||
625 | typename common_type<duration<_Rep1, _Period1>, duration<_Rep2, _Period2> >::type |
||
626 | operator+(const duration<_Rep1, _Period1>& __lhs, const duration<_Rep2, _Period2>& __rhs) |
||
627 | { |
||
628 | typedef typename common_type<duration<_Rep1, _Period1>, duration<_Rep2, _Period2> >::type _Cd; |
||
629 | return _Cd(_Cd(__lhs).count() + _Cd(__rhs).count()); |
||
630 | } |
||
631 | |||
632 | // Duration - |
||
633 | |||
634 | template <class _Rep1, class _Period1, class _Rep2, class _Period2> |
||
635 | inline _LIBCPP_INLINE_VISIBILITY |
||
636 | _LIBCPP_CONSTEXPR |
||
637 | typename common_type<duration<_Rep1, _Period1>, duration<_Rep2, _Period2> >::type |
||
638 | operator-(const duration<_Rep1, _Period1>& __lhs, const duration<_Rep2, _Period2>& __rhs) |
||
639 | { |
||
640 | typedef typename common_type<duration<_Rep1, _Period1>, duration<_Rep2, _Period2> >::type _Cd; |
||
641 | return _Cd(_Cd(__lhs).count() - _Cd(__rhs).count()); |
||
642 | } |
||
643 | |||
644 | // Duration * |
||
645 | |||
646 | template <class _Rep1, class _Period, class _Rep2> |
||
647 | inline _LIBCPP_INLINE_VISIBILITY |
||
648 | _LIBCPP_CONSTEXPR |
||
649 | typename enable_if |
||
650 | < |
||
651 | is_convertible<_Rep2, typename common_type<_Rep1, _Rep2>::type>::value, |
||
652 | duration<typename common_type<_Rep1, _Rep2>::type, _Period> |
||
653 | >::type |
||
654 | operator*(const duration<_Rep1, _Period>& __d, const _Rep2& __s) |
||
655 | { |
||
656 | typedef typename common_type<_Rep1, _Rep2>::type _Cr; |
||
657 | typedef duration<_Cr, _Period> _Cd; |
||
658 | return _Cd(_Cd(__d).count() * static_cast<_Cr>(__s)); |
||
659 | } |
||
660 | |||
661 | template <class _Rep1, class _Period, class _Rep2> |
||
662 | inline _LIBCPP_INLINE_VISIBILITY |
||
663 | _LIBCPP_CONSTEXPR |
||
664 | typename enable_if |
||
665 | < |
||
666 | is_convertible<_Rep1, typename common_type<_Rep1, _Rep2>::type>::value, |
||
667 | duration<typename common_type<_Rep1, _Rep2>::type, _Period> |
||
668 | >::type |
||
669 | operator*(const _Rep1& __s, const duration<_Rep2, _Period>& __d) |
||
670 | { |
||
671 | return __d * __s; |
||
672 | } |
||
673 | |||
674 | // Duration / |
||
675 | |||
676 | template <class _Duration, class _Rep, bool = __is_duration<_Rep>::value> |
||
677 | struct __duration_divide_result |
||
678 | { |
||
679 | }; |
||
680 | |||
681 | template <class _Duration, class _Rep2, |
||
682 | bool = is_convertible<_Rep2, |
||
683 | typename common_type<typename _Duration::rep, _Rep2>::type>::value> |
||
684 | struct __duration_divide_imp |
||
685 | { |
||
686 | }; |
||
687 | |||
688 | template <class _Rep1, class _Period, class _Rep2> |
||
689 | struct __duration_divide_imp<duration<_Rep1, _Period>, _Rep2, true> |
||
690 | { |
||
691 | typedef duration<typename common_type<_Rep1, _Rep2>::type, _Period> type; |
||
692 | }; |
||
693 | |||
694 | template <class _Rep1, class _Period, class _Rep2> |
||
695 | struct __duration_divide_result<duration<_Rep1, _Period>, _Rep2, false> |
||
696 | : __duration_divide_imp<duration<_Rep1, _Period>, _Rep2> |
||
697 | { |
||
698 | }; |
||
699 | |||
700 | template <class _Rep1, class _Period, class _Rep2> |
||
701 | inline _LIBCPP_INLINE_VISIBILITY |
||
702 | _LIBCPP_CONSTEXPR |
||
703 | typename __duration_divide_result<duration<_Rep1, _Period>, _Rep2>::type |
||
704 | operator/(const duration<_Rep1, _Period>& __d, const _Rep2& __s) |
||
705 | { |
||
706 | typedef typename common_type<_Rep1, _Rep2>::type _Cr; |
||
707 | typedef duration<_Cr, _Period> _Cd; |
||
708 | return _Cd(_Cd(__d).count() / static_cast<_Cr>(__s)); |
||
709 | } |
||
710 | |||
711 | template <class _Rep1, class _Period1, class _Rep2, class _Period2> |
||
712 | inline _LIBCPP_INLINE_VISIBILITY |
||
713 | _LIBCPP_CONSTEXPR |
||
714 | typename common_type<_Rep1, _Rep2>::type |
||
715 | operator/(const duration<_Rep1, _Period1>& __lhs, const duration<_Rep2, _Period2>& __rhs) |
||
716 | { |
||
717 | typedef typename common_type<duration<_Rep1, _Period1>, duration<_Rep2, _Period2> >::type _Ct; |
||
718 | return _Ct(__lhs).count() / _Ct(__rhs).count(); |
||
719 | } |
||
720 | |||
721 | // Duration % |
||
722 | |||
723 | template <class _Rep1, class _Period, class _Rep2> |
||
724 | inline _LIBCPP_INLINE_VISIBILITY |
||
725 | _LIBCPP_CONSTEXPR |
||
726 | typename __duration_divide_result<duration<_Rep1, _Period>, _Rep2>::type |
||
727 | operator%(const duration<_Rep1, _Period>& __d, const _Rep2& __s) |
||
728 | { |
||
729 | typedef typename common_type<_Rep1, _Rep2>::type _Cr; |
||
730 | typedef duration<_Cr, _Period> _Cd; |
||
731 | return _Cd(_Cd(__d).count() % static_cast<_Cr>(__s)); |
||
732 | } |
||
733 | |||
734 | template <class _Rep1, class _Period1, class _Rep2, class _Period2> |
||
735 | inline _LIBCPP_INLINE_VISIBILITY |
||
736 | _LIBCPP_CONSTEXPR |
||
737 | typename common_type<duration<_Rep1, _Period1>, duration<_Rep2, _Period2> >::type |
||
738 | operator%(const duration<_Rep1, _Period1>& __lhs, const duration<_Rep2, _Period2>& __rhs) |
||
739 | { |
||
740 | typedef typename common_type<_Rep1, _Rep2>::type _Cr; |
||
741 | typedef typename common_type<duration<_Rep1, _Period1>, duration<_Rep2, _Period2> >::type _Cd; |
||
742 | return _Cd(static_cast<_Cr>(_Cd(__lhs).count()) % static_cast<_Cr>(_Cd(__rhs).count())); |
||
743 | } |
||
744 | |||
745 | ////////////////////////////////////////////////////////// |
||
746 | ///////////////////// time_point ///////////////////////// |
||
747 | ////////////////////////////////////////////////////////// |
||
748 | |||
749 | template <class _Clock, class _Duration = typename _Clock::duration> |
||
750 | class _LIBCPP_TYPE_VIS_ONLY time_point |
||
751 | { |
||
752 | static_assert(__is_duration<_Duration>::value, |
||
753 | "Second template parameter of time_point must be a std::chrono::duration"); |
||
754 | public: |
||
755 | typedef _Clock clock; |
||
756 | typedef _Duration duration; |
||
757 | typedef typename duration::rep rep; |
||
758 | typedef typename duration::period period; |
||
759 | private: |
||
760 | duration __d_; |
||
761 | |||
762 | public: |
||
763 | _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 time_point() : __d_(duration::zero()) {} |
||
764 | _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 explicit time_point(const duration& __d) : __d_(__d) {} |
||
765 | |||
766 | // conversions |
||
767 | template <class _Duration2> |
||
768 | _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 |
||
769 | time_point(const time_point<clock, _Duration2>& t, |
||
770 | typename enable_if |
||
771 | < |
||
772 | is_convertible<_Duration2, duration>::value |
||
773 | >::type* = 0) |
||
774 | : __d_(t.time_since_epoch()) {} |
||
775 | |||
776 | // observer |
||
777 | |||
778 | _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 duration time_since_epoch() const {return __d_;} |
||
779 | |||
780 | // arithmetic |
||
781 | |||
782 | _LIBCPP_INLINE_VISIBILITY time_point& operator+=(const duration& __d) {__d_ += __d; return *this;} |
||
783 | _LIBCPP_INLINE_VISIBILITY time_point& operator-=(const duration& __d) {__d_ -= __d; return *this;} |
||
784 | |||
785 | // special values |
||
786 | |||
787 | _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR time_point min() {return time_point(duration::min());} |
||
788 | _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR time_point max() {return time_point(duration::max());} |
||
789 | }; |
||
790 | |||
791 | } // chrono |
||
792 | |||
793 | template <class _Clock, class _Duration1, class _Duration2> |
||
794 | struct _LIBCPP_TYPE_VIS_ONLY common_type<chrono::time_point<_Clock, _Duration1>, |
||
795 | chrono::time_point<_Clock, _Duration2> > |
||
796 | { |
||
797 | typedef chrono::time_point<_Clock, typename common_type<_Duration1, _Duration2>::type> type; |
||
798 | }; |
||
799 | |||
800 | namespace chrono { |
||
801 | |||
802 | template <class _ToDuration, class _Clock, class _Duration> |
||
803 | inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 |
||
804 | time_point<_Clock, _ToDuration> |
||
805 | time_point_cast(const time_point<_Clock, _Duration>& __t) |
||
806 | { |
||
807 | return time_point<_Clock, _ToDuration>(_VSTD::chrono::duration_cast<_ToDuration>(__t.time_since_epoch())); |
||
808 | } |
||
809 | |||
810 | // time_point == |
||
811 | |||
812 | template <class _Clock, class _Duration1, class _Duration2> |
||
813 | inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 |
||
814 | bool |
||
815 | operator==(const time_point<_Clock, _Duration1>& __lhs, const time_point<_Clock, _Duration2>& __rhs) |
||
816 | { |
||
817 | return __lhs.time_since_epoch() == __rhs.time_since_epoch(); |
||
818 | } |
||
819 | |||
820 | // time_point != |
||
821 | |||
822 | template <class _Clock, class _Duration1, class _Duration2> |
||
823 | inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 |
||
824 | bool |
||
825 | operator!=(const time_point<_Clock, _Duration1>& __lhs, const time_point<_Clock, _Duration2>& __rhs) |
||
826 | { |
||
827 | return !(__lhs == __rhs); |
||
828 | } |
||
829 | |||
830 | // time_point < |
||
831 | |||
832 | template <class _Clock, class _Duration1, class _Duration2> |
||
833 | inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 |
||
834 | bool |
||
835 | operator<(const time_point<_Clock, _Duration1>& __lhs, const time_point<_Clock, _Duration2>& __rhs) |
||
836 | { |
||
837 | return __lhs.time_since_epoch() < __rhs.time_since_epoch(); |
||
838 | } |
||
839 | |||
840 | // time_point > |
||
841 | |||
842 | template <class _Clock, class _Duration1, class _Duration2> |
||
843 | inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 |
||
844 | bool |
||
845 | operator>(const time_point<_Clock, _Duration1>& __lhs, const time_point<_Clock, _Duration2>& __rhs) |
||
846 | { |
||
847 | return __rhs < __lhs; |
||
848 | } |
||
849 | |||
850 | // time_point <= |
||
851 | |||
852 | template <class _Clock, class _Duration1, class _Duration2> |
||
853 | inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 |
||
854 | bool |
||
855 | operator<=(const time_point<_Clock, _Duration1>& __lhs, const time_point<_Clock, _Duration2>& __rhs) |
||
856 | { |
||
857 | return !(__rhs < __lhs); |
||
858 | } |
||
859 | |||
860 | // time_point >= |
||
861 | |||
862 | template <class _Clock, class _Duration1, class _Duration2> |
||
863 | inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 |
||
864 | bool |
||
865 | operator>=(const time_point<_Clock, _Duration1>& __lhs, const time_point<_Clock, _Duration2>& __rhs) |
||
866 | { |
||
867 | return !(__lhs < __rhs); |
||
868 | } |
||
869 | |||
870 | // time_point operator+(time_point x, duration y); |
||
871 | |||
872 | template <class _Clock, class _Duration1, class _Rep2, class _Period2> |
||
873 | inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 |
||
874 | time_point<_Clock, typename common_type<_Duration1, duration<_Rep2, _Period2> >::type> |
||
875 | operator+(const time_point<_Clock, _Duration1>& __lhs, const duration<_Rep2, _Period2>& __rhs) |
||
876 | { |
||
877 | typedef time_point<_Clock, typename common_type<_Duration1, duration<_Rep2, _Period2> >::type> _Tr; |
||
878 | return _Tr (__lhs.time_since_epoch() + __rhs); |
||
879 | } |
||
880 | |||
881 | // time_point operator+(duration x, time_point y); |
||
882 | |||
883 | template <class _Rep1, class _Period1, class _Clock, class _Duration2> |
||
884 | inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 |
||
885 | time_point<_Clock, typename common_type<duration<_Rep1, _Period1>, _Duration2>::type> |
||
886 | operator+(const duration<_Rep1, _Period1>& __lhs, const time_point<_Clock, _Duration2>& __rhs) |
||
887 | { |
||
888 | return __rhs + __lhs; |
||
889 | } |
||
890 | |||
891 | // time_point operator-(time_point x, duration y); |
||
892 | |||
893 | template <class _Clock, class _Duration1, class _Rep2, class _Period2> |
||
894 | inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 |
||
895 | time_point<_Clock, typename common_type<_Duration1, duration<_Rep2, _Period2> >::type> |
||
896 | operator-(const time_point<_Clock, _Duration1>& __lhs, const duration<_Rep2, _Period2>& __rhs) |
||
897 | { |
||
898 | return __lhs + (-__rhs); |
||
899 | } |
||
900 | |||
901 | // duration operator-(time_point x, time_point y); |
||
902 | |||
903 | template <class _Clock, class _Duration1, class _Duration2> |
||
904 | inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 |
||
905 | typename common_type<_Duration1, _Duration2>::type |
||
906 | operator-(const time_point<_Clock, _Duration1>& __lhs, const time_point<_Clock, _Duration2>& __rhs) |
||
907 | { |
||
908 | return __lhs.time_since_epoch() - __rhs.time_since_epoch(); |
||
909 | } |
||
910 | |||
911 | ////////////////////////////////////////////////////////// |
||
912 | /////////////////////// clocks /////////////////////////// |
||
913 | ////////////////////////////////////////////////////////// |
||
914 | |||
915 | class _LIBCPP_TYPE_VIS system_clock |
||
916 | { |
||
917 | public: |
||
918 | typedef microseconds duration; |
||
919 | typedef duration::rep rep; |
||
920 | typedef duration::period period; |
||
921 | typedef chrono::time_point<system_clock> time_point; |
||
922 | static _LIBCPP_CONSTEXPR_AFTER_CXX11 const bool is_steady = false; |
||
923 | |||
924 | static time_point now() _NOEXCEPT; |
||
925 | static time_t to_time_t (const time_point& __t) _NOEXCEPT; |
||
926 | static time_point from_time_t(time_t __t) _NOEXCEPT; |
||
927 | }; |
||
928 | |||
929 | #ifndef _LIBCPP_HAS_NO_MONOTONIC_CLOCK |
||
930 | class _LIBCPP_TYPE_VIS steady_clock |
||
931 | { |
||
932 | public: |
||
933 | typedef nanoseconds duration; |
||
934 | typedef duration::rep rep; |
||
935 | typedef duration::period period; |
||
936 | typedef chrono::time_point<steady_clock, duration> time_point; |
||
937 | static _LIBCPP_CONSTEXPR_AFTER_CXX11 const bool is_steady = true; |
||
938 | |||
939 | static time_point now() _NOEXCEPT; |
||
940 | }; |
||
941 | |||
942 | typedef steady_clock high_resolution_clock; |
||
943 | #else |
||
944 | typedef system_clock high_resolution_clock; |
||
945 | #endif |
||
946 | |||
947 | } // chrono |
||
948 | |||
949 | #if _LIBCPP_STD_VER > 11 |
||
950 | // Suffixes for duration literals [time.duration.literals] |
||
951 | inline namespace literals |
||
952 | { |
||
953 | inline namespace chrono_literals |
||
954 | { |
||
955 | |||
956 | constexpr chrono::hours operator"" h(unsigned long long __h) |
||
957 | { |
||
958 | return chrono::hours(static_cast<chrono::hours::rep>(__h)); |
||
959 | } |
||
960 | |||
961 | constexpr chrono::duration<long double, ratio<3600,1>> operator"" h(long double __h) |
||
962 | { |
||
963 | return chrono::duration<long double, ratio<3600,1>>(__h); |
||
964 | } |
||
965 | |||
966 | |||
967 | constexpr chrono::minutes operator"" min(unsigned long long __m) |
||
968 | { |
||
969 | return chrono::minutes(static_cast<chrono::minutes::rep>(__m)); |
||
970 | } |
||
971 | |||
972 | constexpr chrono::duration<long double, ratio<60,1>> operator"" min(long double __m) |
||
973 | { |
||
974 | return chrono::duration<long double, ratio<60,1>> (__m); |
||
975 | } |
||
976 | |||
977 | |||
978 | constexpr chrono::seconds operator"" s(unsigned long long __s) |
||
979 | { |
||
980 | return chrono::seconds(static_cast<chrono::seconds::rep>(__s)); |
||
981 | } |
||
982 | |||
983 | constexpr chrono::duration<long double> operator"" s(long double __s) |
||
984 | { |
||
985 | return chrono::duration<long double> (__s); |
||
986 | } |
||
987 | |||
988 | |||
989 | constexpr chrono::milliseconds operator"" ms(unsigned long long __ms) |
||
990 | { |
||
991 | return chrono::milliseconds(static_cast<chrono::milliseconds::rep>(__ms)); |
||
992 | } |
||
993 | |||
994 | constexpr chrono::duration<long double, milli> operator"" ms(long double __ms) |
||
995 | { |
||
996 | return chrono::duration<long double, milli>(__ms); |
||
997 | } |
||
998 | |||
999 | |||
1000 | constexpr chrono::microseconds operator"" us(unsigned long long __us) |
||
1001 | { |
||
1002 | return chrono::microseconds(static_cast<chrono::microseconds::rep>(__us)); |
||
1003 | } |
||
1004 | |||
1005 | constexpr chrono::duration<long double, micro> operator"" us(long double __us) |
||
1006 | { |
||
1007 | return chrono::duration<long double, micro> (__us); |
||
1008 | } |
||
1009 | |||
1010 | |||
1011 | constexpr chrono::nanoseconds operator"" ns(unsigned long long __ns) |
||
1012 | { |
||
1013 | return chrono::nanoseconds(static_cast<chrono::nanoseconds::rep>(__ns)); |
||
1014 | } |
||
1015 | |||
1016 | constexpr chrono::duration<long double, nano> operator"" ns(long double __ns) |
||
1017 | { |
||
1018 | return chrono::duration<long double, nano> (__ns); |
||
1019 | } |
||
1020 | |||
1021 | }} |
||
1022 | |||
1023 | namespace chrono { // hoist the literals into namespace std::chrono |
||
1024 | using namespace literals::chrono_literals; |
||
1025 | } |
||
1026 | |||
1027 | #endif |
||
1028 | |||
1029 | _LIBCPP_END_NAMESPACE_STD |
||
1030 | |||
1031 | #endif // _LIBCPP_CHRONO |