1 | // -*- C++ -*- |
2 | //===----------------------------------------------------------------------===// |
3 | // |
4 | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
5 | // See https://llvm.org/LICENSE.txt for license information. |
6 | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
7 | // |
8 | //===----------------------------------------------------------------------===// |
9 | |
10 | #ifndef _LIBCPP___CHRONO_DURATION_H |
11 | #define _LIBCPP___CHRONO_DURATION_H |
12 | |
13 | #include <__compare/ordering.h> |
14 | #include <__compare/three_way_comparable.h> |
15 | #include <__config> |
16 | #include <__type_traits/common_type.h> |
17 | #include <__type_traits/enable_if.h> |
18 | #include <__type_traits/is_convertible.h> |
19 | #include <__type_traits/is_floating_point.h> |
20 | #include <limits> |
21 | #include <ratio> |
22 | |
23 | #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) |
24 | # pragma GCC system_header |
25 | #endif |
26 | |
27 | _LIBCPP_PUSH_MACROS |
28 | #include <__undef_macros> |
29 | |
30 | _LIBCPP_BEGIN_NAMESPACE_STD |
31 | |
32 | namespace chrono { |
33 | |
34 | template <class _Rep, class _Period = ratio<1> > |
35 | class _LIBCPP_TEMPLATE_VIS duration; |
36 | |
37 | template <class _Tp> |
38 | struct __is_duration : false_type {}; |
39 | |
40 | template <class _Rep, class _Period> |
41 | struct __is_duration<duration<_Rep, _Period> > : true_type {}; |
42 | |
43 | template <class _Rep, class _Period> |
44 | struct __is_duration<const duration<_Rep, _Period> > : true_type {}; |
45 | |
46 | template <class _Rep, class _Period> |
47 | struct __is_duration<volatile duration<_Rep, _Period> > : true_type {}; |
48 | |
49 | template <class _Rep, class _Period> |
50 | struct __is_duration<const volatile duration<_Rep, _Period> > : true_type {}; |
51 | |
52 | } // namespace chrono |
53 | |
54 | template <class _Rep1, class _Period1, class _Rep2, class _Period2> |
55 | struct _LIBCPP_TEMPLATE_VIS common_type<chrono::duration<_Rep1, _Period1>, chrono::duration<_Rep2, _Period2> > { |
56 | typedef chrono::duration<typename common_type<_Rep1, _Rep2>::type, typename __ratio_gcd<_Period1, _Period2>::type> |
57 | type; |
58 | }; |
59 | |
60 | namespace chrono { |
61 | |
62 | // duration_cast |
63 | |
64 | template <class _FromDuration, |
65 | class _ToDuration, |
66 | class _Period = typename ratio_divide<typename _FromDuration::period, typename _ToDuration::period>::type, |
67 | bool = _Period::num == 1, |
68 | bool = _Period::den == 1> |
69 | struct __duration_cast; |
70 | |
71 | template <class _FromDuration, class _ToDuration, class _Period> |
72 | struct __duration_cast<_FromDuration, _ToDuration, _Period, true, true> { |
73 | _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR _ToDuration operator()(const _FromDuration& __fd) const { |
74 | return _ToDuration(static_cast<typename _ToDuration::rep>(__fd.count())); |
75 | } |
76 | }; |
77 | |
78 | template <class _FromDuration, class _ToDuration, class _Period> |
79 | struct __duration_cast<_FromDuration, _ToDuration, _Period, true, false> { |
80 | _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR _ToDuration operator()(const _FromDuration& __fd) const { |
81 | typedef typename common_type<typename _ToDuration::rep, typename _FromDuration::rep, intmax_t>::type _Ct; |
82 | return _ToDuration( |
83 | static_cast<typename _ToDuration::rep>(static_cast<_Ct>(__fd.count()) / static_cast<_Ct>(_Period::den))); |
84 | } |
85 | }; |
86 | |
87 | template <class _FromDuration, class _ToDuration, class _Period> |
88 | struct __duration_cast<_FromDuration, _ToDuration, _Period, false, true> { |
89 | _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR _ToDuration operator()(const _FromDuration& __fd) const { |
90 | typedef typename common_type<typename _ToDuration::rep, typename _FromDuration::rep, intmax_t>::type _Ct; |
91 | return _ToDuration( |
92 | static_cast<typename _ToDuration::rep>(static_cast<_Ct>(__fd.count()) * static_cast<_Ct>(_Period::num))); |
93 | } |
94 | }; |
95 | |
96 | template <class _FromDuration, class _ToDuration, class _Period> |
97 | struct __duration_cast<_FromDuration, _ToDuration, _Period, false, false> { |
98 | _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR _ToDuration operator()(const _FromDuration& __fd) const { |
99 | typedef typename common_type<typename _ToDuration::rep, typename _FromDuration::rep, intmax_t>::type _Ct; |
100 | return _ToDuration(static_cast<typename _ToDuration::rep>( |
101 | static_cast<_Ct>(__fd.count()) * static_cast<_Ct>(_Period::num) / static_cast<_Ct>(_Period::den))); |
102 | } |
103 | }; |
104 | |
105 | template <class _ToDuration, class _Rep, class _Period, __enable_if_t<__is_duration<_ToDuration>::value, int> = 0> |
106 | inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR _ToDuration duration_cast(const duration<_Rep, _Period>& __fd) { |
107 | return __duration_cast<duration<_Rep, _Period>, _ToDuration>()(__fd); |
108 | } |
109 | |
110 | template <class _Rep> |
111 | struct _LIBCPP_TEMPLATE_VIS treat_as_floating_point : is_floating_point<_Rep> {}; |
112 | |
113 | #if _LIBCPP_STD_VER >= 17 |
114 | template <class _Rep> |
115 | inline constexpr bool treat_as_floating_point_v = treat_as_floating_point<_Rep>::value; |
116 | #endif |
117 | |
118 | template <class _Rep> |
119 | struct _LIBCPP_TEMPLATE_VIS duration_values { |
120 | public: |
121 | _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR _Rep zero() _NOEXCEPT { return _Rep(0); } |
122 | _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR _Rep max() _NOEXCEPT { return numeric_limits<_Rep>::max(); } |
123 | _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR _Rep min() _NOEXCEPT { return numeric_limits<_Rep>::lowest(); } |
124 | }; |
125 | |
126 | #if _LIBCPP_STD_VER >= 17 |
127 | template <class _ToDuration, class _Rep, class _Period, enable_if_t<__is_duration<_ToDuration>::value, int> = 0> |
128 | inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR _ToDuration floor(const duration<_Rep, _Period>& __d) { |
129 | _ToDuration __t = chrono::duration_cast<_ToDuration>(__d); |
130 | if (__t > __d) |
131 | __t = __t - _ToDuration{1}; |
132 | return __t; |
133 | } |
134 | |
135 | template <class _ToDuration, class _Rep, class _Period, enable_if_t<__is_duration<_ToDuration>::value, int> = 0> |
136 | inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR _ToDuration ceil(const duration<_Rep, _Period>& __d) { |
137 | _ToDuration __t = chrono::duration_cast<_ToDuration>(__d); |
138 | if (__t < __d) |
139 | __t = __t + _ToDuration{1}; |
140 | return __t; |
141 | } |
142 | |
143 | template <class _ToDuration, class _Rep, class _Period, enable_if_t<__is_duration<_ToDuration>::value, int> = 0> |
144 | inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR _ToDuration round(const duration<_Rep, _Period>& __d) { |
145 | _ToDuration __lower = chrono::floor<_ToDuration>(__d); |
146 | _ToDuration __upper = __lower + _ToDuration{1}; |
147 | auto __lower_diff = __d - __lower; |
148 | auto __upper_diff = __upper - __d; |
149 | if (__lower_diff < __upper_diff) |
150 | return __lower; |
151 | if (__lower_diff > __upper_diff) |
152 | return __upper; |
153 | return __lower.count() & 1 ? __upper : __lower; |
154 | } |
155 | #endif |
156 | |
157 | // duration |
158 | |
159 | template <class _Rep, class _Period> |
160 | class _LIBCPP_TEMPLATE_VIS duration { |
161 | static_assert(!__is_duration<_Rep>::value, "A duration representation can not be a duration" ); |
162 | static_assert(__is_ratio<_Period>::value, "Second template parameter of duration must be a std::ratio" ); |
163 | static_assert(_Period::num > 0, "duration period must be positive" ); |
164 | |
165 | template <class _R1, class _R2> |
166 | struct __no_overflow { |
167 | private: |
168 | static const intmax_t __gcd_n1_n2 = __static_gcd<_R1::num, _R2::num>::value; |
169 | static const intmax_t __gcd_d1_d2 = __static_gcd<_R1::den, _R2::den>::value; |
170 | static const intmax_t __n1 = _R1::num / __gcd_n1_n2; |
171 | static const intmax_t __d1 = _R1::den / __gcd_d1_d2; |
172 | static const intmax_t __n2 = _R2::num / __gcd_n1_n2; |
173 | static const intmax_t __d2 = _R2::den / __gcd_d1_d2; |
174 | static const intmax_t max = -((intmax_t(1) << (sizeof(intmax_t) * CHAR_BIT - 1)) + 1); |
175 | |
176 | template <intmax_t _Xp, intmax_t _Yp, bool __overflow> |
177 | struct __mul // __overflow == false |
178 | { |
179 | static const intmax_t value = _Xp * _Yp; |
180 | }; |
181 | |
182 | template <intmax_t _Xp, intmax_t _Yp> |
183 | struct __mul<_Xp, _Yp, true> { |
184 | static const intmax_t value = 1; |
185 | }; |
186 | |
187 | public: |
188 | static const bool value = (__n1 <= max / __d2) && (__n2 <= max / __d1); |
189 | typedef ratio<__mul<__n1, __d2, !value>::value, __mul<__n2, __d1, !value>::value> type; |
190 | }; |
191 | |
192 | public: |
193 | typedef _Rep rep; |
194 | typedef typename _Period::type period; |
195 | |
196 | private: |
197 | rep __rep_; |
198 | |
199 | public: |
200 | #ifndef _LIBCPP_CXX03_LANG |
201 | constexpr duration() = default; |
202 | #else |
203 | _LIBCPP_HIDE_FROM_ABI duration() {} |
204 | #endif |
205 | |
206 | template <class _Rep2, |
207 | __enable_if_t<is_convertible<const _Rep2&, rep>::value && |
208 | (treat_as_floating_point<rep>::value || !treat_as_floating_point<_Rep2>::value), |
209 | int> = 0> |
210 | _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR explicit duration(const _Rep2& __r) : __rep_(__r) {} |
211 | |
212 | // conversions |
213 | template <class _Rep2, |
214 | class _Period2, |
215 | __enable_if_t<__no_overflow<_Period2, period>::value && (treat_as_floating_point<rep>::value || |
216 | (__no_overflow<_Period2, period>::type::den == 1 && |
217 | !treat_as_floating_point<_Rep2>::value)), |
218 | int> = 0> |
219 | _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR duration(const duration<_Rep2, _Period2>& __d) |
220 | : __rep_(chrono::duration_cast<duration>(__d).count()) {} |
221 | |
222 | // observer |
223 | |
224 | _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR rep count() const { return __rep_; } |
225 | |
226 | // arithmetic |
227 | |
228 | _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR typename common_type<duration>::type operator+() const { |
229 | return typename common_type<duration>::type(*this); |
230 | } |
231 | _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR typename common_type<duration>::type operator-() const { |
232 | return typename common_type<duration>::type(-__rep_); |
233 | } |
234 | _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 duration& operator++() { |
235 | ++__rep_; |
236 | return *this; |
237 | } |
238 | _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 duration operator++(int) { return duration(__rep_++); } |
239 | _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 duration& operator--() { |
240 | --__rep_; |
241 | return *this; |
242 | } |
243 | _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 duration operator--(int) { return duration(__rep_--); } |
244 | |
245 | _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 duration& operator+=(const duration& __d) { |
246 | __rep_ += __d.count(); |
247 | return *this; |
248 | } |
249 | _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 duration& operator-=(const duration& __d) { |
250 | __rep_ -= __d.count(); |
251 | return *this; |
252 | } |
253 | |
254 | _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 duration& operator*=(const rep& __rhs) { |
255 | __rep_ *= __rhs; |
256 | return *this; |
257 | } |
258 | _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 duration& operator/=(const rep& __rhs) { |
259 | __rep_ /= __rhs; |
260 | return *this; |
261 | } |
262 | _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 duration& operator%=(const rep& __rhs) { |
263 | __rep_ %= __rhs; |
264 | return *this; |
265 | } |
266 | _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 duration& operator%=(const duration& __rhs) { |
267 | __rep_ %= __rhs.count(); |
268 | return *this; |
269 | } |
270 | |
271 | // special values |
272 | |
273 | _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR duration zero() _NOEXCEPT { |
274 | return duration(duration_values<rep>::zero()); |
275 | } |
276 | _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR duration min() _NOEXCEPT { |
277 | return duration(duration_values<rep>::min()); |
278 | } |
279 | _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR duration max() _NOEXCEPT { |
280 | return duration(duration_values<rep>::max()); |
281 | } |
282 | }; |
283 | |
284 | typedef duration<long long, nano> nanoseconds; |
285 | typedef duration<long long, micro> microseconds; |
286 | typedef duration<long long, milli> milliseconds; |
287 | typedef duration<long long > seconds; |
288 | typedef duration< long, ratio< 60> > minutes; |
289 | typedef duration< long, ratio<3600> > hours; |
290 | #if _LIBCPP_STD_VER >= 20 |
291 | typedef duration< int, ratio_multiply<ratio<24>, hours::period>> days; |
292 | typedef duration< int, ratio_multiply<ratio<7>, days::period>> weeks; |
293 | typedef duration< int, ratio_multiply<ratio<146097, 400>, days::period>> years; |
294 | typedef duration< int, ratio_divide<years::period, ratio<12>>> months; |
295 | #endif |
296 | // Duration == |
297 | |
298 | template <class _LhsDuration, class _RhsDuration> |
299 | struct __duration_eq { |
300 | _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR bool operator()(const _LhsDuration& __lhs, const _RhsDuration& __rhs) const { |
301 | typedef typename common_type<_LhsDuration, _RhsDuration>::type _Ct; |
302 | return _Ct(__lhs).count() == _Ct(__rhs).count(); |
303 | } |
304 | }; |
305 | |
306 | template <class _LhsDuration> |
307 | struct __duration_eq<_LhsDuration, _LhsDuration> { |
308 | _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR bool operator()(const _LhsDuration& __lhs, const _LhsDuration& __rhs) const { |
309 | return __lhs.count() == __rhs.count(); |
310 | } |
311 | }; |
312 | |
313 | template <class _Rep1, class _Period1, class _Rep2, class _Period2> |
314 | inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR bool |
315 | operator==(const duration<_Rep1, _Period1>& __lhs, const duration<_Rep2, _Period2>& __rhs) { |
316 | return __duration_eq<duration<_Rep1, _Period1>, duration<_Rep2, _Period2> >()(__lhs, __rhs); |
317 | } |
318 | |
319 | #if _LIBCPP_STD_VER <= 17 |
320 | |
321 | // Duration != |
322 | |
323 | template <class _Rep1, class _Period1, class _Rep2, class _Period2> |
324 | inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR bool |
325 | operator!=(const duration<_Rep1, _Period1>& __lhs, const duration<_Rep2, _Period2>& __rhs) { |
326 | return !(__lhs == __rhs); |
327 | } |
328 | |
329 | #endif // _LIBCPP_STD_VER <= 17 |
330 | |
331 | // Duration < |
332 | |
333 | template <class _LhsDuration, class _RhsDuration> |
334 | struct __duration_lt { |
335 | _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR bool operator()(const _LhsDuration& __lhs, const _RhsDuration& __rhs) const { |
336 | typedef typename common_type<_LhsDuration, _RhsDuration>::type _Ct; |
337 | return _Ct(__lhs).count() < _Ct(__rhs).count(); |
338 | } |
339 | }; |
340 | |
341 | template <class _LhsDuration> |
342 | struct __duration_lt<_LhsDuration, _LhsDuration> { |
343 | _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR bool operator()(const _LhsDuration& __lhs, const _LhsDuration& __rhs) const { |
344 | return __lhs.count() < __rhs.count(); |
345 | } |
346 | }; |
347 | |
348 | template <class _Rep1, class _Period1, class _Rep2, class _Period2> |
349 | inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR bool |
350 | operator<(const duration<_Rep1, _Period1>& __lhs, const duration<_Rep2, _Period2>& __rhs) { |
351 | return __duration_lt<duration<_Rep1, _Period1>, duration<_Rep2, _Period2> >()(__lhs, __rhs); |
352 | } |
353 | |
354 | // Duration > |
355 | |
356 | template <class _Rep1, class _Period1, class _Rep2, class _Period2> |
357 | inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR bool |
358 | operator>(const duration<_Rep1, _Period1>& __lhs, const duration<_Rep2, _Period2>& __rhs) { |
359 | return __rhs < __lhs; |
360 | } |
361 | |
362 | // Duration <= |
363 | |
364 | template <class _Rep1, class _Period1, class _Rep2, class _Period2> |
365 | inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR bool |
366 | operator<=(const duration<_Rep1, _Period1>& __lhs, const duration<_Rep2, _Period2>& __rhs) { |
367 | return !(__rhs < __lhs); |
368 | } |
369 | |
370 | // Duration >= |
371 | |
372 | template <class _Rep1, class _Period1, class _Rep2, class _Period2> |
373 | inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR bool |
374 | operator>=(const duration<_Rep1, _Period1>& __lhs, const duration<_Rep2, _Period2>& __rhs) { |
375 | return !(__lhs < __rhs); |
376 | } |
377 | |
378 | #if _LIBCPP_STD_VER >= 20 |
379 | |
380 | template <class _Rep1, class _Period1, class _Rep2, class _Period2> |
381 | requires three_way_comparable<common_type_t<_Rep1, _Rep2>> |
382 | _LIBCPP_HIDE_FROM_ABI constexpr auto |
383 | operator<=>(const duration<_Rep1, _Period1>& __lhs, const duration<_Rep2, _Period2>& __rhs) { |
384 | using _Ct = common_type_t<duration<_Rep1, _Period1>, duration<_Rep2, _Period2>>; |
385 | return _Ct(__lhs).count() <=> _Ct(__rhs).count(); |
386 | } |
387 | |
388 | #endif // _LIBCPP_STD_VER >= 20 |
389 | |
390 | // Duration + |
391 | |
392 | template <class _Rep1, class _Period1, class _Rep2, class _Period2> |
393 | inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR |
394 | typename common_type<duration<_Rep1, _Period1>, duration<_Rep2, _Period2> >::type |
395 | operator+(const duration<_Rep1, _Period1>& __lhs, const duration<_Rep2, _Period2>& __rhs) { |
396 | typedef typename common_type<duration<_Rep1, _Period1>, duration<_Rep2, _Period2> >::type _Cd; |
397 | return _Cd(_Cd(__lhs).count() + _Cd(__rhs).count()); |
398 | } |
399 | |
400 | // Duration - |
401 | |
402 | template <class _Rep1, class _Period1, class _Rep2, class _Period2> |
403 | inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR |
404 | typename common_type<duration<_Rep1, _Period1>, duration<_Rep2, _Period2> >::type |
405 | operator-(const duration<_Rep1, _Period1>& __lhs, const duration<_Rep2, _Period2>& __rhs) { |
406 | typedef typename common_type<duration<_Rep1, _Period1>, duration<_Rep2, _Period2> >::type _Cd; |
407 | return _Cd(_Cd(__lhs).count() - _Cd(__rhs).count()); |
408 | } |
409 | |
410 | // Duration * |
411 | |
412 | template <class _Rep1, |
413 | class _Period, |
414 | class _Rep2, |
415 | __enable_if_t<is_convertible<const _Rep2&, typename common_type<_Rep1, _Rep2>::type>::value, int> = 0> |
416 | inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR duration<typename common_type<_Rep1, _Rep2>::type, _Period> |
417 | operator*(const duration<_Rep1, _Period>& __d, const _Rep2& __s) { |
418 | typedef typename common_type<_Rep1, _Rep2>::type _Cr; |
419 | typedef duration<_Cr, _Period> _Cd; |
420 | return _Cd(_Cd(__d).count() * static_cast<_Cr>(__s)); |
421 | } |
422 | |
423 | template <class _Rep1, |
424 | class _Period, |
425 | class _Rep2, |
426 | __enable_if_t<is_convertible<const _Rep1&, typename common_type<_Rep1, _Rep2>::type>::value, int> = 0> |
427 | inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR duration<typename common_type<_Rep1, _Rep2>::type, _Period> |
428 | operator*(const _Rep1& __s, const duration<_Rep2, _Period>& __d) { |
429 | return __d * __s; |
430 | } |
431 | |
432 | // Duration / |
433 | |
434 | template <class _Rep1, |
435 | class _Period, |
436 | class _Rep2, |
437 | __enable_if_t<!__is_duration<_Rep2>::value && |
438 | is_convertible<const _Rep2&, typename common_type<_Rep1, _Rep2>::type>::value, |
439 | int> = 0> |
440 | inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR duration<typename common_type<_Rep1, _Rep2>::type, _Period> |
441 | operator/(const duration<_Rep1, _Period>& __d, const _Rep2& __s) { |
442 | typedef typename common_type<_Rep1, _Rep2>::type _Cr; |
443 | typedef duration<_Cr, _Period> _Cd; |
444 | return _Cd(_Cd(__d).count() / static_cast<_Cr>(__s)); |
445 | } |
446 | |
447 | template <class _Rep1, class _Period1, class _Rep2, class _Period2> |
448 | inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR typename common_type<_Rep1, _Rep2>::type |
449 | operator/(const duration<_Rep1, _Period1>& __lhs, const duration<_Rep2, _Period2>& __rhs) { |
450 | typedef typename common_type<duration<_Rep1, _Period1>, duration<_Rep2, _Period2> >::type _Ct; |
451 | return _Ct(__lhs).count() / _Ct(__rhs).count(); |
452 | } |
453 | |
454 | // Duration % |
455 | |
456 | template <class _Rep1, |
457 | class _Period, |
458 | class _Rep2, |
459 | __enable_if_t<!__is_duration<_Rep2>::value && |
460 | is_convertible<const _Rep2&, typename common_type<_Rep1, _Rep2>::type>::value, |
461 | int> = 0> |
462 | inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR duration<typename common_type<_Rep1, _Rep2>::type, _Period> |
463 | operator%(const duration<_Rep1, _Period>& __d, const _Rep2& __s) { |
464 | typedef typename common_type<_Rep1, _Rep2>::type _Cr; |
465 | typedef duration<_Cr, _Period> _Cd; |
466 | return _Cd(_Cd(__d).count() % static_cast<_Cr>(__s)); |
467 | } |
468 | |
469 | template <class _Rep1, class _Period1, class _Rep2, class _Period2> |
470 | inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR |
471 | typename common_type<duration<_Rep1, _Period1>, duration<_Rep2, _Period2> >::type |
472 | operator%(const duration<_Rep1, _Period1>& __lhs, const duration<_Rep2, _Period2>& __rhs) { |
473 | typedef typename common_type<_Rep1, _Rep2>::type _Cr; |
474 | typedef typename common_type<duration<_Rep1, _Period1>, duration<_Rep2, _Period2> >::type _Cd; |
475 | return _Cd(static_cast<_Cr>(_Cd(__lhs).count()) % static_cast<_Cr>(_Cd(__rhs).count())); |
476 | } |
477 | |
478 | } // namespace chrono |
479 | |
480 | #if _LIBCPP_STD_VER >= 14 |
481 | // Suffixes for duration literals [time.duration.literals] |
482 | inline namespace literals { |
483 | inline namespace chrono_literals { |
484 | |
485 | _LIBCPP_HIDE_FROM_ABI constexpr chrono::hours operator""h (unsigned long long __h) { |
486 | return chrono::hours(static_cast<chrono::hours::rep>(__h)); |
487 | } |
488 | |
489 | _LIBCPP_HIDE_FROM_ABI constexpr chrono::duration<long double, ratio<3600, 1>> operator""h (long double __h) { |
490 | return chrono::duration<long double, ratio<3600, 1>>(__h); |
491 | } |
492 | |
493 | _LIBCPP_HIDE_FROM_ABI constexpr chrono::minutes operator""min (unsigned long long __m) { |
494 | return chrono::minutes(static_cast<chrono::minutes::rep>(__m)); |
495 | } |
496 | |
497 | _LIBCPP_HIDE_FROM_ABI constexpr chrono::duration<long double, ratio<60, 1>> operator""min (long double __m) { |
498 | return chrono::duration<long double, ratio<60, 1>>(__m); |
499 | } |
500 | |
501 | _LIBCPP_HIDE_FROM_ABI constexpr chrono::seconds operator""s (unsigned long long __s) { |
502 | return chrono::seconds(static_cast<chrono::seconds::rep>(__s)); |
503 | } |
504 | |
505 | _LIBCPP_HIDE_FROM_ABI constexpr chrono::duration<long double> operator""s (long double __s) { |
506 | return chrono::duration<long double>(__s); |
507 | } |
508 | |
509 | _LIBCPP_HIDE_FROM_ABI constexpr chrono::milliseconds operator""ms (unsigned long long __ms) { |
510 | return chrono::milliseconds(static_cast<chrono::milliseconds::rep>(__ms)); |
511 | } |
512 | |
513 | _LIBCPP_HIDE_FROM_ABI constexpr chrono::duration<long double, milli> operator""ms (long double __ms) { |
514 | return chrono::duration<long double, milli>(__ms); |
515 | } |
516 | |
517 | _LIBCPP_HIDE_FROM_ABI constexpr chrono::microseconds operator""us (unsigned long long __us) { |
518 | return chrono::microseconds(static_cast<chrono::microseconds::rep>(__us)); |
519 | } |
520 | |
521 | _LIBCPP_HIDE_FROM_ABI constexpr chrono::duration<long double, micro> operator""us (long double __us) { |
522 | return chrono::duration<long double, micro>(__us); |
523 | } |
524 | |
525 | _LIBCPP_HIDE_FROM_ABI constexpr chrono::nanoseconds operator""ns (unsigned long long __ns) { |
526 | return chrono::nanoseconds(static_cast<chrono::nanoseconds::rep>(__ns)); |
527 | } |
528 | |
529 | _LIBCPP_HIDE_FROM_ABI constexpr chrono::duration<long double, nano> operator""ns (long double __ns) { |
530 | return chrono::duration<long double, nano>(__ns); |
531 | } |
532 | |
533 | } // namespace chrono_literals |
534 | } // namespace literals |
535 | |
536 | namespace chrono { // hoist the literals into namespace std::chrono |
537 | using namespace literals::chrono_literals; |
538 | } // namespace chrono |
539 | |
540 | #endif // _LIBCPP_STD_VER >= 14 |
541 | |
542 | _LIBCPP_END_NAMESPACE_STD |
543 | |
544 | _LIBCPP_POP_MACROS |
545 | |
546 | #if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20 |
547 | # include <type_traits> |
548 | #endif |
549 | |
550 | #endif // _LIBCPP___CHRONO_DURATION_H |
551 | |