1 // -*- 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> inline constexpr bool treat_as_floating_point_v 30 = treat_as_floating_point<Rep>::value; // C++17 31 32 template <class Rep> 33 struct duration_values 34 { 35 public: 36 static constexpr Rep zero(); 37 static constexpr Rep max(); 38 static constexpr Rep min(); 39 }; 40 41 // duration 42 43 template <class Rep, class Period = ratio<1>> 44 class duration 45 { 46 static_assert(!__is_duration<Rep>::value, "A duration representation can not be a duration"); 47 static_assert(__is_ratio<Period>::value, "Second template parameter of duration must be a std::ratio"); 48 static_assert(Period::num > 0, "duration period must be positive"); 49 public: 50 typedef Rep rep; 51 typedef typename _Period::type period; 52 53 constexpr duration() = default; 54 template <class Rep2> 55 constexpr explicit duration(const Rep2& r, 56 typename enable_if 57 < 58 is_convertible<Rep2, rep>::value && 59 (treat_as_floating_point<rep>::value || 60 !treat_as_floating_point<rep>::value && !treat_as_floating_point<Rep2>::value) 61 >::type* = 0); 62 63 // conversions 64 template <class Rep2, class Period2> 65 constexpr duration(const duration<Rep2, Period2>& d, 66 typename enable_if 67 < 68 treat_as_floating_point<rep>::value || 69 ratio_divide<Period2, period>::type::den == 1 70 >::type* = 0); 71 72 // observer 73 74 constexpr rep count() const; 75 76 // arithmetic 77 78 constexpr common_type<duration>::type operator+() const; 79 constexpr common_type<duration>::type operator-() const; 80 constexpr duration& operator++(); 81 constexpr duration operator++(int); 82 constexpr duration& operator--(); 83 constexpr duration operator--(int); 84 85 constexpr duration& operator+=(const duration& d); 86 constexpr duration& operator-=(const duration& d); 87 88 duration& operator*=(const rep& rhs); 89 duration& operator/=(const rep& rhs); 90 91 // special values 92 93 static constexpr duration zero(); 94 static constexpr duration min(); 95 static constexpr duration max(); 96 }; 97 98 typedef duration<long long, nano> nanoseconds; 99 typedef duration<long long, micro> microseconds; 100 typedef duration<long long, milli> milliseconds; 101 typedef duration<long long > seconds; 102 typedef duration< long, ratio< 60> > minutes; 103 typedef duration< long, ratio<3600> > hours; 104 105 template <class Clock, class Duration = typename Clock::duration> 106 class time_point 107 { 108 public: 109 typedef Clock clock; 110 typedef Duration duration; 111 typedef typename duration::rep rep; 112 typedef typename duration::period period; 113 private: 114 duration d_; // exposition only 115 116 public: 117 time_point(); // has value "epoch" // constexpr in C++14 118 explicit time_point(const duration& d); // same as time_point() + d // constexpr in C++14 119 120 // conversions 121 template <class Duration2> 122 time_point(const time_point<clock, Duration2>& t); // constexpr in C++14 123 124 // observer 125 126 duration time_since_epoch() const; // constexpr in C++14 127 128 // arithmetic 129 130 time_point& operator+=(const duration& d); 131 time_point& operator-=(const duration& d); 132 133 // special values 134 135 static constexpr time_point min(); 136 static constexpr time_point max(); 137 }; 138 139 } // chrono 140 141 // common_type traits 142 template <class Rep1, class Period1, class Rep2, class Period2> 143 struct common_type<chrono::duration<Rep1, Period1>, chrono::duration<Rep2, Period2>>; 144 145 template <class Clock, class Duration1, class Duration2> 146 struct common_type<chrono::time_point<Clock, Duration1>, chrono::time_point<Clock, Duration2>>; 147 148 namespace chrono { 149 150 // duration arithmetic 151 template <class Rep1, class Period1, class Rep2, class Period2> 152 constexpr 153 typename common_type<duration<Rep1, Period1>, duration<Rep2, Period2>>::type 154 operator+(const duration<Rep1, Period1>& lhs, const duration<Rep2, Period2>& rhs); 155 template <class Rep1, class Period1, class Rep2, class Period2> 156 constexpr 157 typename common_type<duration<Rep1, Period1>, duration<Rep2, Period2>>::type 158 operator-(const duration<Rep1, Period1>& lhs, const duration<Rep2, Period2>& rhs); 159 template <class Rep1, class Period, class Rep2> 160 constexpr 161 duration<typename common_type<Rep1, Rep2>::type, Period> 162 operator*(const duration<Rep1, Period>& d, const Rep2& s); 163 template <class Rep1, class Period, class Rep2> 164 constexpr 165 duration<typename common_type<Rep1, Rep2>::type, Period> 166 operator*(const Rep1& s, const duration<Rep2, Period>& d); 167 template <class Rep1, class Period, class Rep2> 168 constexpr 169 duration<typename common_type<Rep1, Rep2>::type, Period> 170 operator/(const duration<Rep1, Period>& d, const Rep2& s); 171 template <class Rep1, class Period1, class Rep2, class Period2> 172 constexpr 173 typename common_type<Rep1, Rep2>::type 174 operator/(const duration<Rep1, Period1>& lhs, const duration<Rep2, Period2>& rhs); 175 176 // duration comparisons 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 template <class Rep1, class Period1, class Rep2, class Period2> 193 constexpr 194 bool operator>=(const duration<Rep1, Period1>& lhs, const duration<Rep2, Period2>& rhs); 195 196 // duration_cast 197 template <class ToDuration, class Rep, class Period> 198 ToDuration duration_cast(const duration<Rep, Period>& d); 199 200 template <class ToDuration, class Rep, class Period> 201 constexpr ToDuration floor(const duration<Rep, Period>& d); // C++17 202 template <class ToDuration, class Rep, class Period> 203 constexpr ToDuration ceil(const duration<Rep, Period>& d); // C++17 204 template <class ToDuration, class Rep, class Period> 205 constexpr ToDuration round(const duration<Rep, Period>& d); // C++17 206 207 // time_point arithmetic (all constexpr in C++14) 208 template <class Clock, class Duration1, class Rep2, class Period2> 209 time_point<Clock, typename common_type<Duration1, duration<Rep2, Period2>>::type> 210 operator+(const time_point<Clock, Duration1>& lhs, const duration<Rep2, Period2>& rhs); 211 template <class Rep1, class Period1, class Clock, class Duration2> 212 time_point<Clock, typename common_type<duration<Rep1, Period1>, Duration2>::type> 213 operator+(const duration<Rep1, Period1>& lhs, const time_point<Clock, Duration2>& rhs); 214 template <class Clock, class Duration1, class Rep2, class Period2> 215 time_point<Clock, typename common_type<Duration1, duration<Rep2, Period2>>::type> 216 operator-(const time_point<Clock, Duration1>& lhs, const duration<Rep2, Period2>& rhs); 217 template <class Clock, class Duration1, class Duration2> 218 typename common_type<Duration1, Duration2>::type 219 operator-(const time_point<Clock, Duration1>& lhs, const time_point<Clock, Duration2>& rhs); 220 221 // time_point comparisons (all constexpr in C++14) 222 template <class Clock, class Duration1, class Duration2> 223 bool operator==(const time_point<Clock, Duration1>& lhs, const time_point<Clock, Duration2>& rhs); 224 template <class Clock, class Duration1, class Duration2> 225 bool operator!=(const time_point<Clock, Duration1>& lhs, const time_point<Clock, Duration2>& rhs); 226 template <class Clock, class Duration1, class Duration2> 227 bool operator< (const time_point<Clock, Duration1>& lhs, const time_point<Clock, Duration2>& rhs); 228 template <class Clock, class Duration1, class Duration2> 229 bool operator<=(const time_point<Clock, Duration1>& lhs, const time_point<Clock, Duration2>& rhs); 230 template <class Clock, class Duration1, class Duration2> 231 bool operator> (const time_point<Clock, Duration1>& lhs, const time_point<Clock, Duration2>& rhs); 232 template <class Clock, class Duration1, class Duration2> 233 bool operator>=(const time_point<Clock, Duration1>& lhs, const time_point<Clock, Duration2>& rhs); 234 235 // time_point_cast (constexpr in C++14) 236 237 template <class ToDuration, class Clock, class Duration> 238 time_point<Clock, ToDuration> time_point_cast(const time_point<Clock, Duration>& t); 239 240 template <class ToDuration, class Clock, class Duration> 241 constexpr time_point<Clock, ToDuration> 242 floor(const time_point<Clock, Duration>& tp); // C++17 243 244 template <class ToDuration, class Clock, class Duration> 245 constexpr time_point<Clock, ToDuration> 246 ceil(const time_point<Clock, Duration>& tp); // C++17 247 248 template <class ToDuration, class Clock, class Duration> 249 constexpr time_point<Clock, ToDuration> 250 round(const time_point<Clock, Duration>& tp); // C++17 251 252 template <class Rep, class Period> 253 constexpr duration<Rep, Period> abs(duration<Rep, Period> d); // C++17 254 // Clocks 255 256 class system_clock 257 { 258 public: 259 typedef microseconds duration; 260 typedef duration::rep rep; 261 typedef duration::period period; 262 typedef chrono::time_point<system_clock> time_point; 263 static const bool is_steady = false; // constexpr in C++14 264 265 static time_point now() noexcept; 266 static time_t to_time_t (const time_point& __t) noexcept; 267 static time_point from_time_t(time_t __t) noexcept; 268 }; 269 270 class steady_clock 271 { 272 public: 273 typedef nanoseconds duration; 274 typedef duration::rep rep; 275 typedef duration::period period; 276 typedef chrono::time_point<steady_clock, duration> time_point; 277 static const bool is_steady = true; // constexpr in C++14 278 279 static time_point now() noexcept; 280 }; 281 282 typedef steady_clock high_resolution_clock; 283 284 } // chrono 285 286 constexpr chrono::hours operator ""h(unsigned long long); // C++14 287 constexpr chrono::duration<unspecified , ratio<3600,1>> operator ""h(long double); // C++14 288 constexpr chrono::minutes operator ""min(unsigned long long); // C++14 289 constexpr chrono::duration<unspecified , ratio<60,1>> operator ""min(long double); // C++14 290 constexpr chrono::seconds operator ""s(unsigned long long); // C++14 291 constexpr chrono::duration<unspecified > operator ""s(long double); // C++14 292 constexpr chrono::milliseconds operator ""ms(unsigned long long); // C++14 293 constexpr chrono::duration<unspecified , milli> operator ""ms(long double); // C++14 294 constexpr chrono::microseconds operator ""us(unsigned long long); // C++14 295 constexpr chrono::duration<unspecified , micro> operator ""us(long double); // C++14 296 constexpr chrono::nanoseconds operator ""ns(unsigned long long); // C++14 297 constexpr chrono::duration<unspecified , nano> operator ""ns(long double); // C++14 298 299 } // std 300 */ 301 302 #include <__config> 303 #include <ctime> 304 #include <type_traits> 305 #include <ratio> 306 #include <limits> 307 308 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 309 #pragma GCC system_header 310 #endif 311 312 _LIBCPP_PUSH_MACROS 313 #include <__undef_macros> 314 315 316 _LIBCPP_BEGIN_NAMESPACE_STD 317 318 namespace chrono 319 { 320 321 template <class _Rep, class _Period = ratio<1> > class _LIBCPP_TEMPLATE_VIS duration; 322 323 template <class _Tp> 324 struct __is_duration : false_type {}; 325 326 template <class _Rep, class _Period> 327 struct __is_duration<duration<_Rep, _Period> > : true_type {}; 328 329 template <class _Rep, class _Period> 330 struct __is_duration<const duration<_Rep, _Period> > : true_type {}; 331 332 template <class _Rep, class _Period> 333 struct __is_duration<volatile duration<_Rep, _Period> > : true_type {}; 334 335 template <class _Rep, class _Period> 336 struct __is_duration<const volatile duration<_Rep, _Period> > : true_type {}; 337 338 } // chrono 339 340 template <class _Rep1, class _Period1, class _Rep2, class _Period2> 341 struct _LIBCPP_TEMPLATE_VIS common_type<chrono::duration<_Rep1, _Period1>, 342 chrono::duration<_Rep2, _Period2> > 343 { 344 typedef chrono::duration<typename common_type<_Rep1, _Rep2>::type, 345 typename __ratio_gcd<_Period1, _Period2>::type> type; 346 }; 347 348 namespace chrono { 349 350 // duration_cast 351 352 template <class _FromDuration, class _ToDuration, 353 class _Period = typename ratio_divide<typename _FromDuration::period, typename _ToDuration::period>::type, 354 bool = _Period::num == 1, 355 bool = _Period::den == 1> 356 struct __duration_cast; 357 358 template <class _FromDuration, class _ToDuration, class _Period> 359 struct __duration_cast<_FromDuration, _ToDuration, _Period, true, true> 360 { 361 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR 362 _ToDuration operator()(const _FromDuration& __fd) const 363 { 364 return _ToDuration(static_cast<typename _ToDuration::rep>(__fd.count())); 365 } 366 }; 367 368 template <class _FromDuration, class _ToDuration, class _Period> 369 struct __duration_cast<_FromDuration, _ToDuration, _Period, true, false> 370 { 371 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR 372 _ToDuration operator()(const _FromDuration& __fd) const 373 { 374 typedef typename common_type<typename _ToDuration::rep, typename _FromDuration::rep, intmax_t>::type _Ct; 375 return _ToDuration(static_cast<typename _ToDuration::rep>( 376 static_cast<_Ct>(__fd.count()) / static_cast<_Ct>(_Period::den))); 377 } 378 }; 379 380 template <class _FromDuration, class _ToDuration, class _Period> 381 struct __duration_cast<_FromDuration, _ToDuration, _Period, false, true> 382 { 383 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR 384 _ToDuration operator()(const _FromDuration& __fd) const 385 { 386 typedef typename common_type<typename _ToDuration::rep, typename _FromDuration::rep, intmax_t>::type _Ct; 387 return _ToDuration(static_cast<typename _ToDuration::rep>( 388 static_cast<_Ct>(__fd.count()) * static_cast<_Ct>(_Period::num))); 389 } 390 }; 391 392 template <class _FromDuration, class _ToDuration, class _Period> 393 struct __duration_cast<_FromDuration, _ToDuration, _Period, false, false> 394 { 395 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR 396 _ToDuration operator()(const _FromDuration& __fd) const 397 { 398 typedef typename common_type<typename _ToDuration::rep, typename _FromDuration::rep, intmax_t>::type _Ct; 399 return _ToDuration(static_cast<typename _ToDuration::rep>( 400 static_cast<_Ct>(__fd.count()) * static_cast<_Ct>(_Period::num) 401 / static_cast<_Ct>(_Period::den))); 402 } 403 }; 404 405 template <class _ToDuration, class _Rep, class _Period> 406 inline _LIBCPP_INLINE_VISIBILITY 407 _LIBCPP_CONSTEXPR 408 typename enable_if 409 < 410 __is_duration<_ToDuration>::value, 411 _ToDuration 412 >::type 413 duration_cast(const duration<_Rep, _Period>& __fd) 414 { 415 return __duration_cast<duration<_Rep, _Period>, _ToDuration>()(__fd); 416 } 417 418 template <class _Rep> 419 struct _LIBCPP_TEMPLATE_VIS treat_as_floating_point : is_floating_point<_Rep> {}; 420 421 #if _LIBCPP_STD_VER > 14 && !defined(_LIBCPP_HAS_NO_VARIABLE_TEMPLATES) 422 template <class _Rep> 423 _LIBCPP_INLINE_VAR _LIBCPP_CONSTEXPR bool treat_as_floating_point_v 424 = treat_as_floating_point<_Rep>::value; 425 #endif 426 427 template <class _Rep> 428 struct _LIBCPP_TEMPLATE_VIS duration_values 429 { 430 public: 431 _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR _Rep zero() {return _Rep(0);} 432 _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR _Rep max() {return numeric_limits<_Rep>::max();} 433 _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR _Rep min() {return numeric_limits<_Rep>::lowest();} 434 }; 435 436 #if _LIBCPP_STD_VER > 14 437 template <class _ToDuration, class _Rep, class _Period> 438 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR 439 typename enable_if 440 < 441 __is_duration<_ToDuration>::value, 442 _ToDuration 443 >::type 444 floor(const duration<_Rep, _Period>& __d) 445 { 446 _ToDuration __t = duration_cast<_ToDuration>(__d); 447 if (__t > __d) 448 __t = __t - _ToDuration{1}; 449 return __t; 450 } 451 452 template <class _ToDuration, class _Rep, class _Period> 453 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR 454 typename enable_if 455 < 456 __is_duration<_ToDuration>::value, 457 _ToDuration 458 >::type 459 ceil(const duration<_Rep, _Period>& __d) 460 { 461 _ToDuration __t = duration_cast<_ToDuration>(__d); 462 if (__t < __d) 463 __t = __t + _ToDuration{1}; 464 return __t; 465 } 466 467 template <class _ToDuration, class _Rep, class _Period> 468 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR 469 typename enable_if 470 < 471 __is_duration<_ToDuration>::value, 472 _ToDuration 473 >::type 474 round(const duration<_Rep, _Period>& __d) 475 { 476 _ToDuration __lower = floor<_ToDuration>(__d); 477 _ToDuration __upper = __lower + _ToDuration{1}; 478 auto __lowerDiff = __d - __lower; 479 auto __upperDiff = __upper - __d; 480 if (__lowerDiff < __upperDiff) 481 return __lower; 482 if (__lowerDiff > __upperDiff) 483 return __upper; 484 return __lower.count() & 1 ? __upper : __lower; 485 } 486 #endif 487 488 // duration 489 490 template <class _Rep, class _Period> 491 class _LIBCPP_TEMPLATE_VIS duration 492 { 493 static_assert(!__is_duration<_Rep>::value, "A duration representation can not be a duration"); 494 static_assert(__is_ratio<_Period>::value, "Second template parameter of duration must be a std::ratio"); 495 static_assert(_Period::num > 0, "duration period must be positive"); 496 497 template <class _R1, class _R2> 498 struct __no_overflow 499 { 500 private: 501 static const intmax_t __gcd_n1_n2 = __static_gcd<_R1::num, _R2::num>::value; 502 static const intmax_t __gcd_d1_d2 = __static_gcd<_R1::den, _R2::den>::value; 503 static const intmax_t __n1 = _R1::num / __gcd_n1_n2; 504 static const intmax_t __d1 = _R1::den / __gcd_d1_d2; 505 static const intmax_t __n2 = _R2::num / __gcd_n1_n2; 506 static const intmax_t __d2 = _R2::den / __gcd_d1_d2; 507 static const intmax_t max = -((intmax_t(1) << (sizeof(intmax_t) * CHAR_BIT - 1)) + 1); 508 509 template <intmax_t _Xp, intmax_t _Yp, bool __overflow> 510 struct __mul // __overflow == false 511 { 512 static const intmax_t value = _Xp * _Yp; 513 }; 514 515 template <intmax_t _Xp, intmax_t _Yp> 516 struct __mul<_Xp, _Yp, true> 517 { 518 static const intmax_t value = 1; 519 }; 520 521 public: 522 static const bool value = (__n1 <= max / __d2) && (__n2 <= max / __d1); 523 typedef ratio<__mul<__n1, __d2, !value>::value, 524 __mul<__n2, __d1, !value>::value> type; 525 }; 526 527 public: 528 typedef _Rep rep; 529 typedef typename _Period::type period; 530 private: 531 rep __rep_; 532 public: 533 534 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR 535 #ifndef _LIBCPP_CXX03_LANG 536 duration() = default; 537 #else 538 duration() {} 539 #endif 540 541 template <class _Rep2> 542 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR 543 explicit duration(const _Rep2& __r, 544 typename enable_if 545 < 546 is_convertible<_Rep2, rep>::value && 547 (treat_as_floating_point<rep>::value || 548 !treat_as_floating_point<_Rep2>::value) 549 >::type* = 0) 550 : __rep_(__r) {} 551 552 // conversions 553 template <class _Rep2, class _Period2> 554 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR 555 duration(const duration<_Rep2, _Period2>& __d, 556 typename enable_if 557 < 558 __no_overflow<_Period2, period>::value && ( 559 treat_as_floating_point<rep>::value || 560 (__no_overflow<_Period2, period>::type::den == 1 && 561 !treat_as_floating_point<_Rep2>::value)) 562 >::type* = 0) 563 : __rep_(_VSTD::chrono::duration_cast<duration>(__d).count()) {} 564 565 // observer 566 567 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR rep count() const {return __rep_;} 568 569 // arithmetic 570 571 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR typename common_type<duration>::type operator+() const {return typename common_type<duration>::type(*this);} 572 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR typename common_type<duration>::type operator-() const {return typename common_type<duration>::type(-__rep_);} 573 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 duration& operator++() {++__rep_; return *this;} 574 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 duration operator++(int) {return duration(__rep_++);} 575 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 duration& operator--() {--__rep_; return *this;} 576 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 duration operator--(int) {return duration(__rep_--);} 577 578 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 duration& operator+=(const duration& __d) {__rep_ += __d.count(); return *this;} 579 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 duration& operator-=(const duration& __d) {__rep_ -= __d.count(); return *this;} 580 581 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 duration& operator*=(const rep& rhs) {__rep_ *= rhs; return *this;} 582 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 duration& operator/=(const rep& rhs) {__rep_ /= rhs; return *this;} 583 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 duration& operator%=(const rep& rhs) {__rep_ %= rhs; return *this;} 584 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 duration& operator%=(const duration& rhs) {__rep_ %= rhs.count(); return *this;} 585 586 // special values 587 588 _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR duration zero() {return duration(duration_values<rep>::zero());} 589 _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR duration min() {return duration(duration_values<rep>::min());} 590 _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR duration max() {return duration(duration_values<rep>::max());} 591 }; 592 593 typedef duration<long long, nano> nanoseconds; 594 typedef duration<long long, micro> microseconds; 595 typedef duration<long long, milli> milliseconds; 596 typedef duration<long long > seconds; 597 typedef duration< long, ratio< 60> > minutes; 598 typedef duration< long, ratio<3600> > hours; 599 600 // Duration == 601 602 template <class _LhsDuration, class _RhsDuration> 603 struct __duration_eq 604 { 605 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR 606 bool operator()(const _LhsDuration& __lhs, const _RhsDuration& __rhs) const 607 { 608 typedef typename common_type<_LhsDuration, _RhsDuration>::type _Ct; 609 return _Ct(__lhs).count() == _Ct(__rhs).count(); 610 } 611 }; 612 613 template <class _LhsDuration> 614 struct __duration_eq<_LhsDuration, _LhsDuration> 615 { 616 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR 617 bool operator()(const _LhsDuration& __lhs, const _LhsDuration& __rhs) const 618 {return __lhs.count() == __rhs.count();} 619 }; 620 621 template <class _Rep1, class _Period1, class _Rep2, class _Period2> 622 inline _LIBCPP_INLINE_VISIBILITY 623 _LIBCPP_CONSTEXPR 624 bool 625 operator==(const duration<_Rep1, _Period1>& __lhs, const duration<_Rep2, _Period2>& __rhs) 626 { 627 return __duration_eq<duration<_Rep1, _Period1>, duration<_Rep2, _Period2> >()(__lhs, __rhs); 628 } 629 630 // Duration != 631 632 template <class _Rep1, class _Period1, class _Rep2, class _Period2> 633 inline _LIBCPP_INLINE_VISIBILITY 634 _LIBCPP_CONSTEXPR 635 bool 636 operator!=(const duration<_Rep1, _Period1>& __lhs, const duration<_Rep2, _Period2>& __rhs) 637 { 638 return !(__lhs == __rhs); 639 } 640 641 // Duration < 642 643 template <class _LhsDuration, class _RhsDuration> 644 struct __duration_lt 645 { 646 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR 647 bool operator()(const _LhsDuration& __lhs, const _RhsDuration& __rhs) const 648 { 649 typedef typename common_type<_LhsDuration, _RhsDuration>::type _Ct; 650 return _Ct(__lhs).count() < _Ct(__rhs).count(); 651 } 652 }; 653 654 template <class _LhsDuration> 655 struct __duration_lt<_LhsDuration, _LhsDuration> 656 { 657 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR 658 bool operator()(const _LhsDuration& __lhs, const _LhsDuration& __rhs) const 659 {return __lhs.count() < __rhs.count();} 660 }; 661 662 template <class _Rep1, class _Period1, class _Rep2, class _Period2> 663 inline _LIBCPP_INLINE_VISIBILITY 664 _LIBCPP_CONSTEXPR 665 bool 666 operator< (const duration<_Rep1, _Period1>& __lhs, const duration<_Rep2, _Period2>& __rhs) 667 { 668 return __duration_lt<duration<_Rep1, _Period1>, duration<_Rep2, _Period2> >()(__lhs, __rhs); 669 } 670 671 // Duration > 672 673 template <class _Rep1, class _Period1, class _Rep2, class _Period2> 674 inline _LIBCPP_INLINE_VISIBILITY 675 _LIBCPP_CONSTEXPR 676 bool 677 operator> (const duration<_Rep1, _Period1>& __lhs, const duration<_Rep2, _Period2>& __rhs) 678 { 679 return __rhs < __lhs; 680 } 681 682 // Duration <= 683 684 template <class _Rep1, class _Period1, class _Rep2, class _Period2> 685 inline _LIBCPP_INLINE_VISIBILITY 686 _LIBCPP_CONSTEXPR 687 bool 688 operator<=(const duration<_Rep1, _Period1>& __lhs, const duration<_Rep2, _Period2>& __rhs) 689 { 690 return !(__rhs < __lhs); 691 } 692 693 // Duration >= 694 695 template <class _Rep1, class _Period1, class _Rep2, class _Period2> 696 inline _LIBCPP_INLINE_VISIBILITY 697 _LIBCPP_CONSTEXPR 698 bool 699 operator>=(const duration<_Rep1, _Period1>& __lhs, const duration<_Rep2, _Period2>& __rhs) 700 { 701 return !(__lhs < __rhs); 702 } 703 704 // Duration + 705 706 template <class _Rep1, class _Period1, class _Rep2, class _Period2> 707 inline _LIBCPP_INLINE_VISIBILITY 708 _LIBCPP_CONSTEXPR 709 typename common_type<duration<_Rep1, _Period1>, duration<_Rep2, _Period2> >::type 710 operator+(const duration<_Rep1, _Period1>& __lhs, const duration<_Rep2, _Period2>& __rhs) 711 { 712 typedef typename common_type<duration<_Rep1, _Period1>, duration<_Rep2, _Period2> >::type _Cd; 713 return _Cd(_Cd(__lhs).count() + _Cd(__rhs).count()); 714 } 715 716 // Duration - 717 718 template <class _Rep1, class _Period1, class _Rep2, class _Period2> 719 inline _LIBCPP_INLINE_VISIBILITY 720 _LIBCPP_CONSTEXPR 721 typename common_type<duration<_Rep1, _Period1>, duration<_Rep2, _Period2> >::type 722 operator-(const duration<_Rep1, _Period1>& __lhs, const duration<_Rep2, _Period2>& __rhs) 723 { 724 typedef typename common_type<duration<_Rep1, _Period1>, duration<_Rep2, _Period2> >::type _Cd; 725 return _Cd(_Cd(__lhs).count() - _Cd(__rhs).count()); 726 } 727 728 // Duration * 729 730 template <class _Rep1, class _Period, class _Rep2> 731 inline _LIBCPP_INLINE_VISIBILITY 732 _LIBCPP_CONSTEXPR 733 typename enable_if 734 < 735 is_convertible<_Rep2, typename common_type<_Rep1, _Rep2>::type>::value, 736 duration<typename common_type<_Rep1, _Rep2>::type, _Period> 737 >::type 738 operator*(const duration<_Rep1, _Period>& __d, const _Rep2& __s) 739 { 740 typedef typename common_type<_Rep1, _Rep2>::type _Cr; 741 typedef duration<_Cr, _Period> _Cd; 742 return _Cd(_Cd(__d).count() * static_cast<_Cr>(__s)); 743 } 744 745 template <class _Rep1, class _Period, class _Rep2> 746 inline _LIBCPP_INLINE_VISIBILITY 747 _LIBCPP_CONSTEXPR 748 typename enable_if 749 < 750 is_convertible<_Rep1, typename common_type<_Rep1, _Rep2>::type>::value, 751 duration<typename common_type<_Rep1, _Rep2>::type, _Period> 752 >::type 753 operator*(const _Rep1& __s, const duration<_Rep2, _Period>& __d) 754 { 755 return __d * __s; 756 } 757 758 // Duration / 759 760 template <class _Duration, class _Rep, bool = __is_duration<_Rep>::value> 761 struct __duration_divide_result 762 { 763 }; 764 765 template <class _Duration, class _Rep2, 766 bool = is_convertible<_Rep2, 767 typename common_type<typename _Duration::rep, _Rep2>::type>::value> 768 struct __duration_divide_imp 769 { 770 }; 771 772 template <class _Rep1, class _Period, class _Rep2> 773 struct __duration_divide_imp<duration<_Rep1, _Period>, _Rep2, true> 774 { 775 typedef duration<typename common_type<_Rep1, _Rep2>::type, _Period> type; 776 }; 777 778 template <class _Rep1, class _Period, class _Rep2> 779 struct __duration_divide_result<duration<_Rep1, _Period>, _Rep2, false> 780 : __duration_divide_imp<duration<_Rep1, _Period>, _Rep2> 781 { 782 }; 783 784 template <class _Rep1, class _Period, class _Rep2> 785 inline _LIBCPP_INLINE_VISIBILITY 786 _LIBCPP_CONSTEXPR 787 typename __duration_divide_result<duration<_Rep1, _Period>, _Rep2>::type 788 operator/(const duration<_Rep1, _Period>& __d, const _Rep2& __s) 789 { 790 typedef typename common_type<_Rep1, _Rep2>::type _Cr; 791 typedef duration<_Cr, _Period> _Cd; 792 return _Cd(_Cd(__d).count() / static_cast<_Cr>(__s)); 793 } 794 795 template <class _Rep1, class _Period1, class _Rep2, class _Period2> 796 inline _LIBCPP_INLINE_VISIBILITY 797 _LIBCPP_CONSTEXPR 798 typename common_type<_Rep1, _Rep2>::type 799 operator/(const duration<_Rep1, _Period1>& __lhs, const duration<_Rep2, _Period2>& __rhs) 800 { 801 typedef typename common_type<duration<_Rep1, _Period1>, duration<_Rep2, _Period2> >::type _Ct; 802 return _Ct(__lhs).count() / _Ct(__rhs).count(); 803 } 804 805 // Duration % 806 807 template <class _Rep1, class _Period, class _Rep2> 808 inline _LIBCPP_INLINE_VISIBILITY 809 _LIBCPP_CONSTEXPR 810 typename __duration_divide_result<duration<_Rep1, _Period>, _Rep2>::type 811 operator%(const duration<_Rep1, _Period>& __d, const _Rep2& __s) 812 { 813 typedef typename common_type<_Rep1, _Rep2>::type _Cr; 814 typedef duration<_Cr, _Period> _Cd; 815 return _Cd(_Cd(__d).count() % static_cast<_Cr>(__s)); 816 } 817 818 template <class _Rep1, class _Period1, class _Rep2, class _Period2> 819 inline _LIBCPP_INLINE_VISIBILITY 820 _LIBCPP_CONSTEXPR 821 typename common_type<duration<_Rep1, _Period1>, duration<_Rep2, _Period2> >::type 822 operator%(const duration<_Rep1, _Period1>& __lhs, const duration<_Rep2, _Period2>& __rhs) 823 { 824 typedef typename common_type<_Rep1, _Rep2>::type _Cr; 825 typedef typename common_type<duration<_Rep1, _Period1>, duration<_Rep2, _Period2> >::type _Cd; 826 return _Cd(static_cast<_Cr>(_Cd(__lhs).count()) % static_cast<_Cr>(_Cd(__rhs).count())); 827 } 828 829 ////////////////////////////////////////////////////////// 830 ///////////////////// time_point ///////////////////////// 831 ////////////////////////////////////////////////////////// 832 833 template <class _Clock, class _Duration = typename _Clock::duration> 834 class _LIBCPP_TEMPLATE_VIS time_point 835 { 836 static_assert(__is_duration<_Duration>::value, 837 "Second template parameter of time_point must be a std::chrono::duration"); 838 public: 839 typedef _Clock clock; 840 typedef _Duration duration; 841 typedef typename duration::rep rep; 842 typedef typename duration::period period; 843 private: 844 duration __d_; 845 846 public: 847 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 time_point() : __d_(duration::zero()) {} 848 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 explicit time_point(const duration& __d) : __d_(__d) {} 849 850 // conversions 851 template <class _Duration2> 852 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 853 time_point(const time_point<clock, _Duration2>& t, 854 typename enable_if 855 < 856 is_convertible<_Duration2, duration>::value 857 >::type* = 0) 858 : __d_(t.time_since_epoch()) {} 859 860 // observer 861 862 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 duration time_since_epoch() const {return __d_;} 863 864 // arithmetic 865 866 _LIBCPP_INLINE_VISIBILITY time_point& operator+=(const duration& __d) {__d_ += __d; return *this;} 867 _LIBCPP_INLINE_VISIBILITY time_point& operator-=(const duration& __d) {__d_ -= __d; return *this;} 868 869 // special values 870 871 _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR time_point min() {return time_point(duration::min());} 872 _LIBCPP_INLINE_VISIBILITY static _LIBCPP_CONSTEXPR time_point max() {return time_point(duration::max());} 873 }; 874 875 } // chrono 876 877 template <class _Clock, class _Duration1, class _Duration2> 878 struct _LIBCPP_TEMPLATE_VIS common_type<chrono::time_point<_Clock, _Duration1>, 879 chrono::time_point<_Clock, _Duration2> > 880 { 881 typedef chrono::time_point<_Clock, typename common_type<_Duration1, _Duration2>::type> type; 882 }; 883 884 namespace chrono { 885 886 template <class _ToDuration, class _Clock, class _Duration> 887 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 888 time_point<_Clock, _ToDuration> 889 time_point_cast(const time_point<_Clock, _Duration>& __t) 890 { 891 return time_point<_Clock, _ToDuration>(_VSTD::chrono::duration_cast<_ToDuration>(__t.time_since_epoch())); 892 } 893 894 #if _LIBCPP_STD_VER > 14 895 template <class _ToDuration, class _Clock, class _Duration> 896 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR 897 typename enable_if 898 < 899 __is_duration<_ToDuration>::value, 900 time_point<_Clock, _ToDuration> 901 >::type 902 floor(const time_point<_Clock, _Duration>& __t) 903 { 904 return time_point<_Clock, _ToDuration>{floor<_ToDuration>(__t.time_since_epoch())}; 905 } 906 907 template <class _ToDuration, class _Clock, class _Duration> 908 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR 909 typename enable_if 910 < 911 __is_duration<_ToDuration>::value, 912 time_point<_Clock, _ToDuration> 913 >::type 914 ceil(const time_point<_Clock, _Duration>& __t) 915 { 916 return time_point<_Clock, _ToDuration>{ceil<_ToDuration>(__t.time_since_epoch())}; 917 } 918 919 template <class _ToDuration, class _Clock, class _Duration> 920 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR 921 typename enable_if 922 < 923 __is_duration<_ToDuration>::value, 924 time_point<_Clock, _ToDuration> 925 >::type 926 round(const time_point<_Clock, _Duration>& __t) 927 { 928 return time_point<_Clock, _ToDuration>{round<_ToDuration>(__t.time_since_epoch())}; 929 } 930 931 template <class _Rep, class _Period> 932 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR 933 typename enable_if 934 < 935 numeric_limits<_Rep>::is_signed, 936 duration<_Rep, _Period> 937 >::type 938 abs(duration<_Rep, _Period> __d) 939 { 940 return __d >= __d.zero() ? __d : -__d; 941 } 942 #endif 943 944 // time_point == 945 946 template <class _Clock, class _Duration1, class _Duration2> 947 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 948 bool 949 operator==(const time_point<_Clock, _Duration1>& __lhs, const time_point<_Clock, _Duration2>& __rhs) 950 { 951 return __lhs.time_since_epoch() == __rhs.time_since_epoch(); 952 } 953 954 // time_point != 955 956 template <class _Clock, class _Duration1, class _Duration2> 957 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 958 bool 959 operator!=(const time_point<_Clock, _Duration1>& __lhs, const time_point<_Clock, _Duration2>& __rhs) 960 { 961 return !(__lhs == __rhs); 962 } 963 964 // time_point < 965 966 template <class _Clock, class _Duration1, class _Duration2> 967 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 968 bool 969 operator<(const time_point<_Clock, _Duration1>& __lhs, const time_point<_Clock, _Duration2>& __rhs) 970 { 971 return __lhs.time_since_epoch() < __rhs.time_since_epoch(); 972 } 973 974 // time_point > 975 976 template <class _Clock, class _Duration1, class _Duration2> 977 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 978 bool 979 operator>(const time_point<_Clock, _Duration1>& __lhs, const time_point<_Clock, _Duration2>& __rhs) 980 { 981 return __rhs < __lhs; 982 } 983 984 // time_point <= 985 986 template <class _Clock, class _Duration1, class _Duration2> 987 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 988 bool 989 operator<=(const time_point<_Clock, _Duration1>& __lhs, const time_point<_Clock, _Duration2>& __rhs) 990 { 991 return !(__rhs < __lhs); 992 } 993 994 // time_point >= 995 996 template <class _Clock, class _Duration1, class _Duration2> 997 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 998 bool 999 operator>=(const time_point<_Clock, _Duration1>& __lhs, const time_point<_Clock, _Duration2>& __rhs) 1000 { 1001 return !(__lhs < __rhs); 1002 } 1003 1004 // time_point operator+(time_point x, duration y); 1005 1006 template <class _Clock, class _Duration1, class _Rep2, class _Period2> 1007 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 1008 time_point<_Clock, typename common_type<_Duration1, duration<_Rep2, _Period2> >::type> 1009 operator+(const time_point<_Clock, _Duration1>& __lhs, const duration<_Rep2, _Period2>& __rhs) 1010 { 1011 typedef time_point<_Clock, typename common_type<_Duration1, duration<_Rep2, _Period2> >::type> _Tr; 1012 return _Tr (__lhs.time_since_epoch() + __rhs); 1013 } 1014 1015 // time_point operator+(duration x, time_point y); 1016 1017 template <class _Rep1, class _Period1, class _Clock, class _Duration2> 1018 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 1019 time_point<_Clock, typename common_type<duration<_Rep1, _Period1>, _Duration2>::type> 1020 operator+(const duration<_Rep1, _Period1>& __lhs, const time_point<_Clock, _Duration2>& __rhs) 1021 { 1022 return __rhs + __lhs; 1023 } 1024 1025 // time_point operator-(time_point x, duration y); 1026 1027 template <class _Clock, class _Duration1, class _Rep2, class _Period2> 1028 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 1029 time_point<_Clock, typename common_type<_Duration1, duration<_Rep2, _Period2> >::type> 1030 operator-(const time_point<_Clock, _Duration1>& __lhs, const duration<_Rep2, _Period2>& __rhs) 1031 { 1032 typedef time_point<_Clock, typename common_type<_Duration1, duration<_Rep2, _Period2> >::type> _Ret; 1033 return _Ret(__lhs.time_since_epoch() -__rhs); 1034 } 1035 1036 // duration operator-(time_point x, time_point y); 1037 1038 template <class _Clock, class _Duration1, class _Duration2> 1039 inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 1040 typename common_type<_Duration1, _Duration2>::type 1041 operator-(const time_point<_Clock, _Duration1>& __lhs, const time_point<_Clock, _Duration2>& __rhs) 1042 { 1043 return __lhs.time_since_epoch() - __rhs.time_since_epoch(); 1044 } 1045 1046 ////////////////////////////////////////////////////////// 1047 /////////////////////// clocks /////////////////////////// 1048 ////////////////////////////////////////////////////////// 1049 1050 class _LIBCPP_TYPE_VIS system_clock 1051 { 1052 public: 1053 typedef microseconds duration; 1054 typedef duration::rep rep; 1055 typedef duration::period period; 1056 typedef chrono::time_point<system_clock> time_point; 1057 static _LIBCPP_CONSTEXPR_AFTER_CXX11 const bool is_steady = false; 1058 1059 static time_point now() _NOEXCEPT; 1060 static time_t to_time_t (const time_point& __t) _NOEXCEPT; 1061 static time_point from_time_t(time_t __t) _NOEXCEPT; 1062 }; 1063 1064 #ifndef _LIBCPP_HAS_NO_MONOTONIC_CLOCK 1065 class _LIBCPP_TYPE_VIS steady_clock 1066 { 1067 public: 1068 typedef nanoseconds duration; 1069 typedef duration::rep rep; 1070 typedef duration::period period; 1071 typedef chrono::time_point<steady_clock, duration> time_point; 1072 static _LIBCPP_CONSTEXPR_AFTER_CXX11 const bool is_steady = true; 1073 1074 static time_point now() _NOEXCEPT; 1075 }; 1076 1077 typedef steady_clock high_resolution_clock; 1078 #else 1079 typedef system_clock high_resolution_clock; 1080 #endif 1081 1082 } // chrono 1083 1084 #if _LIBCPP_STD_VER > 11 1085 // Suffixes for duration literals [time.duration.literals] 1086 inline namespace literals 1087 { 1088 inline namespace chrono_literals 1089 { 1090 1091 constexpr chrono::hours operator""h(unsigned long long __h) 1092 { 1093 return chrono::hours(static_cast<chrono::hours::rep>(__h)); 1094 } 1095 1096 constexpr chrono::duration<long double, ratio<3600,1>> operator""h(long double __h) 1097 { 1098 return chrono::duration<long double, ratio<3600,1>>(__h); 1099 } 1100 1101 1102 constexpr chrono::minutes operator""min(unsigned long long __m) 1103 { 1104 return chrono::minutes(static_cast<chrono::minutes::rep>(__m)); 1105 } 1106 1107 constexpr chrono::duration<long double, ratio<60,1>> operator""min(long double __m) 1108 { 1109 return chrono::duration<long double, ratio<60,1>> (__m); 1110 } 1111 1112 1113 constexpr chrono::seconds operator""s(unsigned long long __s) 1114 { 1115 return chrono::seconds(static_cast<chrono::seconds::rep>(__s)); 1116 } 1117 1118 constexpr chrono::duration<long double> operator""s(long double __s) 1119 { 1120 return chrono::duration<long double> (__s); 1121 } 1122 1123 1124 constexpr chrono::milliseconds operator""ms(unsigned long long __ms) 1125 { 1126 return chrono::milliseconds(static_cast<chrono::milliseconds::rep>(__ms)); 1127 } 1128 1129 constexpr chrono::duration<long double, milli> operator""ms(long double __ms) 1130 { 1131 return chrono::duration<long double, milli>(__ms); 1132 } 1133 1134 1135 constexpr chrono::microseconds operator""us(unsigned long long __us) 1136 { 1137 return chrono::microseconds(static_cast<chrono::microseconds::rep>(__us)); 1138 } 1139 1140 constexpr chrono::duration<long double, micro> operator""us(long double __us) 1141 { 1142 return chrono::duration<long double, micro> (__us); 1143 } 1144 1145 1146 constexpr chrono::nanoseconds operator""ns(unsigned long long __ns) 1147 { 1148 return chrono::nanoseconds(static_cast<chrono::nanoseconds::rep>(__ns)); 1149 } 1150 1151 constexpr chrono::duration<long double, nano> operator""ns(long double __ns) 1152 { 1153 return chrono::duration<long double, nano> (__ns); 1154 } 1155 1156 }} 1157 1158 namespace chrono { // hoist the literals into namespace std::chrono 1159 using namespace literals::chrono_literals; 1160 } 1161 1162 #endif 1163 1164 _LIBCPP_END_NAMESPACE_STD 1165 1166 _LIBCPP_POP_MACROS 1167 1168 #endif // _LIBCPP_CHRONO 1169