1// <chrono> -*- C++ -*- 2 3// Copyright (C) 2008-2019 Free Software Foundation, Inc. 4// 5// This file is part of the GNU ISO C++ Library. This library is free 6// software; you can redistribute it and/or modify it under the 7// terms of the GNU General Public License as published by the 8// Free Software Foundation; either version 3, or (at your option) 9// any later version. 10 11// This library is distributed in the hope that it will be useful, 12// but WITHOUT ANY WARRANTY; without even the implied warranty of 13// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14// GNU General Public License for more details. 15 16// Under Section 7 of GPL version 3, you are granted additional 17// permissions described in the GCC Runtime Library Exception, version 18// 3.1, as published by the Free Software Foundation. 19 20// You should have received a copy of the GNU General Public License and 21// a copy of the GCC Runtime Library Exception along with this program; 22// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see 23// <http://www.gnu.org/licenses/>. 24 25/** @file include/chrono 26 * This is a Standard C++ Library header. 27 */ 28 29#ifndef _GLIBCXX_CHRONO 30#define _GLIBCXX_CHRONO 1 31 32#pragma GCC system_header 33 34#if __cplusplus < 201103L 35# include <bits/c++0x_warning.h> 36#else 37 38#include <ratio> 39#include <type_traits> 40#include <limits> 41#include <ctime> 42#include <bits/parse_numbers.h> // for literals support. 43 44namespace std _GLIBCXX_VISIBILITY(default) 45{ 46_GLIBCXX_BEGIN_NAMESPACE_VERSION 47 48 /** 49 * @defgroup chrono Time 50 * @ingroup utilities 51 * 52 * Classes and functions for time. 53 * @{ 54 */ 55 56 /** @namespace std::chrono 57 * @brief ISO C++ 2011 entities sub-namespace for time and date. 58 */ 59 namespace chrono 60 { 61 template<typename _Rep, typename _Period = ratio<1>> 62 struct duration; 63 64 template<typename _Clock, typename _Dur = typename _Clock::duration> 65 struct time_point; 66 } 67 68 // 20.11.4.3 specialization of common_type (for duration, sfinae-friendly) 69 70 template<typename _CT, typename _Period1, typename _Period2> 71 struct __duration_common_type_wrapper 72 { 73 private: 74 typedef __static_gcd<_Period1::num, _Period2::num> __gcd_num; 75 typedef __static_gcd<_Period1::den, _Period2::den> __gcd_den; 76 typedef typename _CT::type __cr; 77 typedef ratio<__gcd_num::value, 78 (_Period1::den / __gcd_den::value) * _Period2::den> __r; 79 public: 80 typedef __success_type<chrono::duration<__cr, __r>> type; 81 }; 82 83 template<typename _Period1, typename _Period2> 84 struct __duration_common_type_wrapper<__failure_type, _Period1, _Period2> 85 { typedef __failure_type type; }; 86 87 template<typename _Rep1, typename _Period1, typename _Rep2, typename _Period2> 88 struct common_type<chrono::duration<_Rep1, _Period1>, 89 chrono::duration<_Rep2, _Period2>> 90 : public __duration_common_type_wrapper<typename __member_type_wrapper< 91 common_type<_Rep1, _Rep2>>::type, _Period1, _Period2>::type 92 { }; 93 94 // 20.11.4.3 specialization of common_type (for time_point, sfinae-friendly) 95 96 template<typename _CT, typename _Clock> 97 struct __timepoint_common_type_wrapper 98 { 99 typedef __success_type<chrono::time_point<_Clock, typename _CT::type>> 100 type; 101 }; 102 103 template<typename _Clock> 104 struct __timepoint_common_type_wrapper<__failure_type, _Clock> 105 { typedef __failure_type type; }; 106 107 template<typename _Clock, typename _Duration1, typename _Duration2> 108 struct common_type<chrono::time_point<_Clock, _Duration1>, 109 chrono::time_point<_Clock, _Duration2>> 110 : public __timepoint_common_type_wrapper<typename __member_type_wrapper< 111 common_type<_Duration1, _Duration2>>::type, _Clock>::type 112 { }; 113 114 namespace chrono 115 { 116 // Primary template for duration_cast impl. 117 template<typename _ToDur, typename _CF, typename _CR, 118 bool _NumIsOne = false, bool _DenIsOne = false> 119 struct __duration_cast_impl 120 { 121 template<typename _Rep, typename _Period> 122 static constexpr _ToDur 123 __cast(const duration<_Rep, _Period>& __d) 124 { 125 typedef typename _ToDur::rep __to_rep; 126 return _ToDur(static_cast<__to_rep>(static_cast<_CR>(__d.count()) 127 * static_cast<_CR>(_CF::num) 128 / static_cast<_CR>(_CF::den))); 129 } 130 }; 131 132 template<typename _ToDur, typename _CF, typename _CR> 133 struct __duration_cast_impl<_ToDur, _CF, _CR, true, true> 134 { 135 template<typename _Rep, typename _Period> 136 static constexpr _ToDur 137 __cast(const duration<_Rep, _Period>& __d) 138 { 139 typedef typename _ToDur::rep __to_rep; 140 return _ToDur(static_cast<__to_rep>(__d.count())); 141 } 142 }; 143 144 template<typename _ToDur, typename _CF, typename _CR> 145 struct __duration_cast_impl<_ToDur, _CF, _CR, true, false> 146 { 147 template<typename _Rep, typename _Period> 148 static constexpr _ToDur 149 __cast(const duration<_Rep, _Period>& __d) 150 { 151 typedef typename _ToDur::rep __to_rep; 152 return _ToDur(static_cast<__to_rep>( 153 static_cast<_CR>(__d.count()) / static_cast<_CR>(_CF::den))); 154 } 155 }; 156 157 template<typename _ToDur, typename _CF, typename _CR> 158 struct __duration_cast_impl<_ToDur, _CF, _CR, false, true> 159 { 160 template<typename _Rep, typename _Period> 161 static constexpr _ToDur 162 __cast(const duration<_Rep, _Period>& __d) 163 { 164 typedef typename _ToDur::rep __to_rep; 165 return _ToDur(static_cast<__to_rep>( 166 static_cast<_CR>(__d.count()) * static_cast<_CR>(_CF::num))); 167 } 168 }; 169 170 template<typename _Tp> 171 struct __is_duration 172 : std::false_type 173 { }; 174 175 template<typename _Rep, typename _Period> 176 struct __is_duration<duration<_Rep, _Period>> 177 : std::true_type 178 { }; 179 180 template<typename _Tp> 181 using __enable_if_is_duration 182 = typename enable_if<__is_duration<_Tp>::value, _Tp>::type; 183 184 template<typename _Tp> 185 using __disable_if_is_duration 186 = typename enable_if<!__is_duration<_Tp>::value, _Tp>::type; 187 188 /// duration_cast 189 template<typename _ToDur, typename _Rep, typename _Period> 190 constexpr __enable_if_is_duration<_ToDur> 191 duration_cast(const duration<_Rep, _Period>& __d) 192 { 193 typedef typename _ToDur::period __to_period; 194 typedef typename _ToDur::rep __to_rep; 195 typedef ratio_divide<_Period, __to_period> __cf; 196 typedef typename common_type<__to_rep, _Rep, intmax_t>::type 197 __cr; 198 typedef __duration_cast_impl<_ToDur, __cf, __cr, 199 __cf::num == 1, __cf::den == 1> __dc; 200 return __dc::__cast(__d); 201 } 202 203 /// treat_as_floating_point 204 template<typename _Rep> 205 struct treat_as_floating_point 206 : is_floating_point<_Rep> 207 { }; 208 209#if __cplusplus > 201402L 210 template <typename _Rep> 211 inline constexpr bool treat_as_floating_point_v = 212 treat_as_floating_point<_Rep>::value; 213#endif // C++17 214 215#if __cplusplus >= 201703L 216# define __cpp_lib_chrono 201611 217 218 template<typename _ToDur, typename _Rep, typename _Period> 219 constexpr __enable_if_is_duration<_ToDur> 220 floor(const duration<_Rep, _Period>& __d) 221 { 222 auto __to = chrono::duration_cast<_ToDur>(__d); 223 if (__to > __d) 224 return __to - _ToDur{1}; 225 return __to; 226 } 227 228 template<typename _ToDur, typename _Rep, typename _Period> 229 constexpr __enable_if_is_duration<_ToDur> 230 ceil(const duration<_Rep, _Period>& __d) 231 { 232 auto __to = chrono::duration_cast<_ToDur>(__d); 233 if (__to < __d) 234 return __to + _ToDur{1}; 235 return __to; 236 } 237 238 template <typename _ToDur, typename _Rep, typename _Period> 239 constexpr enable_if_t< 240 __and_<__is_duration<_ToDur>, 241 __not_<treat_as_floating_point<typename _ToDur::rep>>>::value, 242 _ToDur> 243 round(const duration<_Rep, _Period>& __d) 244 { 245 _ToDur __t0 = chrono::floor<_ToDur>(__d); 246 _ToDur __t1 = __t0 + _ToDur{1}; 247 auto __diff0 = __d - __t0; 248 auto __diff1 = __t1 - __d; 249 if (__diff0 == __diff1) 250 { 251 if (__t0.count() & 1) 252 return __t1; 253 return __t0; 254 } 255 else if (__diff0 < __diff1) 256 return __t0; 257 return __t1; 258 } 259 260 template<typename _Rep, typename _Period> 261 constexpr 262 enable_if_t<numeric_limits<_Rep>::is_signed, duration<_Rep, _Period>> 263 abs(duration<_Rep, _Period> __d) 264 { 265 if (__d >= __d.zero()) 266 return __d; 267 return -__d; 268 } 269#endif // C++17 270 271 /// duration_values 272 template<typename _Rep> 273 struct duration_values 274 { 275 static constexpr _Rep 276 zero() noexcept 277 { return _Rep(0); } 278 279 static constexpr _Rep 280 max() noexcept 281 { return numeric_limits<_Rep>::max(); } 282 283 static constexpr _Rep 284 min() noexcept 285 { return numeric_limits<_Rep>::lowest(); } 286 }; 287 288 template<typename _Tp> 289 struct __is_ratio 290 : std::false_type 291 { }; 292 293 template<intmax_t _Num, intmax_t _Den> 294 struct __is_ratio<ratio<_Num, _Den>> 295 : std::true_type 296 { }; 297 298 /// duration 299 template<typename _Rep, typename _Period> 300 struct duration 301 { 302 private: 303 template<typename _Rep2> 304 using __is_float = treat_as_floating_point<_Rep2>; 305 306 // _Period2 is an exact multiple of _Period 307 template<typename _Period2> 308 using __is_harmonic 309 = __bool_constant<ratio_divide<_Period2, _Period>::den == 1>; 310 311 public: 312 313 typedef _Rep rep; 314 typedef _Period period; 315 316 static_assert(!__is_duration<_Rep>::value, "rep cannot be a duration"); 317 static_assert(__is_ratio<_Period>::value, 318 "period must be a specialization of ratio"); 319 static_assert(_Period::num > 0, "period must be positive"); 320 321 // 20.11.5.1 construction / copy / destroy 322 constexpr duration() = default; 323 324 duration(const duration&) = default; 325 326 // _GLIBCXX_RESOLVE_LIB_DEFECTS 327 // 3050. Conversion specification problem in chrono::duration 328 template<typename _Rep2, typename = _Require< 329 is_convertible<const _Rep2&, rep>, 330 __or_<__is_float<rep>, __not_<__is_float<_Rep2>>>>> 331 constexpr explicit duration(const _Rep2& __rep) 332 : __r(static_cast<rep>(__rep)) { } 333 334 template<typename _Rep2, typename _Period2, typename = _Require< 335 __or_<__is_float<rep>, 336 __and_<__is_harmonic<_Period2>, 337 __not_<__is_float<_Rep2>>>>>> 338 constexpr duration(const duration<_Rep2, _Period2>& __d) 339 : __r(duration_cast<duration>(__d).count()) { } 340 341 ~duration() = default; 342 duration& operator=(const duration&) = default; 343 344 // 20.11.5.2 observer 345 constexpr rep 346 count() const 347 { return __r; } 348 349 // 20.11.5.3 arithmetic 350 constexpr duration 351 operator+() const 352 { return *this; } 353 354 constexpr duration 355 operator-() const 356 { return duration(-__r); } 357 358 _GLIBCXX17_CONSTEXPR duration& 359 operator++() 360 { 361 ++__r; 362 return *this; 363 } 364 365 _GLIBCXX17_CONSTEXPR duration 366 operator++(int) 367 { return duration(__r++); } 368 369 _GLIBCXX17_CONSTEXPR duration& 370 operator--() 371 { 372 --__r; 373 return *this; 374 } 375 376 _GLIBCXX17_CONSTEXPR duration 377 operator--(int) 378 { return duration(__r--); } 379 380 _GLIBCXX17_CONSTEXPR duration& 381 operator+=(const duration& __d) 382 { 383 __r += __d.count(); 384 return *this; 385 } 386 387 _GLIBCXX17_CONSTEXPR duration& 388 operator-=(const duration& __d) 389 { 390 __r -= __d.count(); 391 return *this; 392 } 393 394 _GLIBCXX17_CONSTEXPR duration& 395 operator*=(const rep& __rhs) 396 { 397 __r *= __rhs; 398 return *this; 399 } 400 401 _GLIBCXX17_CONSTEXPR duration& 402 operator/=(const rep& __rhs) 403 { 404 __r /= __rhs; 405 return *this; 406 } 407 408 // DR 934. 409 template<typename _Rep2 = rep> 410 _GLIBCXX17_CONSTEXPR 411 typename enable_if<!treat_as_floating_point<_Rep2>::value, 412 duration&>::type 413 operator%=(const rep& __rhs) 414 { 415 __r %= __rhs; 416 return *this; 417 } 418 419 template<typename _Rep2 = rep> 420 _GLIBCXX17_CONSTEXPR 421 typename enable_if<!treat_as_floating_point<_Rep2>::value, 422 duration&>::type 423 operator%=(const duration& __d) 424 { 425 __r %= __d.count(); 426 return *this; 427 } 428 429 // 20.11.5.4 special values 430 static constexpr duration 431 zero() noexcept 432 { return duration(duration_values<rep>::zero()); } 433 434 static constexpr duration 435 min() noexcept 436 { return duration(duration_values<rep>::min()); } 437 438 static constexpr duration 439 max() noexcept 440 { return duration(duration_values<rep>::max()); } 441 442 private: 443 rep __r; 444 }; 445 446 template<typename _Rep1, typename _Period1, 447 typename _Rep2, typename _Period2> 448 constexpr typename common_type<duration<_Rep1, _Period1>, 449 duration<_Rep2, _Period2>>::type 450 operator+(const duration<_Rep1, _Period1>& __lhs, 451 const duration<_Rep2, _Period2>& __rhs) 452 { 453 typedef duration<_Rep1, _Period1> __dur1; 454 typedef duration<_Rep2, _Period2> __dur2; 455 typedef typename common_type<__dur1,__dur2>::type __cd; 456 return __cd(__cd(__lhs).count() + __cd(__rhs).count()); 457 } 458 459 template<typename _Rep1, typename _Period1, 460 typename _Rep2, typename _Period2> 461 constexpr typename common_type<duration<_Rep1, _Period1>, 462 duration<_Rep2, _Period2>>::type 463 operator-(const duration<_Rep1, _Period1>& __lhs, 464 const duration<_Rep2, _Period2>& __rhs) 465 { 466 typedef duration<_Rep1, _Period1> __dur1; 467 typedef duration<_Rep2, _Period2> __dur2; 468 typedef typename common_type<__dur1,__dur2>::type __cd; 469 return __cd(__cd(__lhs).count() - __cd(__rhs).count()); 470 } 471 472 // SFINAE helper to obtain common_type<_Rep1, _Rep2> only if _Rep2 473 // is implicitly convertible to it. 474 // _GLIBCXX_RESOLVE_LIB_DEFECTS 475 // 3050. Conversion specification problem in chrono::duration constructor 476 template<typename _Rep1, typename _Rep2, 477 typename _CRep = typename common_type<_Rep1, _Rep2>::type> 478 using __common_rep_t = typename 479 enable_if<is_convertible<const _Rep2&, _CRep>::value, _CRep>::type; 480 481 template<typename _Rep1, typename _Period, typename _Rep2> 482 constexpr duration<__common_rep_t<_Rep1, _Rep2>, _Period> 483 operator*(const duration<_Rep1, _Period>& __d, const _Rep2& __s) 484 { 485 typedef duration<typename common_type<_Rep1, _Rep2>::type, _Period> 486 __cd; 487 return __cd(__cd(__d).count() * __s); 488 } 489 490 template<typename _Rep1, typename _Rep2, typename _Period> 491 constexpr duration<__common_rep_t<_Rep2, _Rep1>, _Period> 492 operator*(const _Rep1& __s, const duration<_Rep2, _Period>& __d) 493 { return __d * __s; } 494 495 template<typename _Rep1, typename _Period, typename _Rep2> 496 constexpr 497 duration<__common_rep_t<_Rep1, __disable_if_is_duration<_Rep2>>, _Period> 498 operator/(const duration<_Rep1, _Period>& __d, const _Rep2& __s) 499 { 500 typedef duration<typename common_type<_Rep1, _Rep2>::type, _Period> 501 __cd; 502 return __cd(__cd(__d).count() / __s); 503 } 504 505 template<typename _Rep1, typename _Period1, 506 typename _Rep2, typename _Period2> 507 constexpr typename common_type<_Rep1, _Rep2>::type 508 operator/(const duration<_Rep1, _Period1>& __lhs, 509 const duration<_Rep2, _Period2>& __rhs) 510 { 511 typedef duration<_Rep1, _Period1> __dur1; 512 typedef duration<_Rep2, _Period2> __dur2; 513 typedef typename common_type<__dur1,__dur2>::type __cd; 514 return __cd(__lhs).count() / __cd(__rhs).count(); 515 } 516 517 // DR 934. 518 template<typename _Rep1, typename _Period, typename _Rep2> 519 constexpr 520 duration<__common_rep_t<_Rep1, __disable_if_is_duration<_Rep2>>, _Period> 521 operator%(const duration<_Rep1, _Period>& __d, const _Rep2& __s) 522 { 523 typedef duration<typename common_type<_Rep1, _Rep2>::type, _Period> 524 __cd; 525 return __cd(__cd(__d).count() % __s); 526 } 527 528 template<typename _Rep1, typename _Period1, 529 typename _Rep2, typename _Period2> 530 constexpr typename common_type<duration<_Rep1, _Period1>, 531 duration<_Rep2, _Period2>>::type 532 operator%(const duration<_Rep1, _Period1>& __lhs, 533 const duration<_Rep2, _Period2>& __rhs) 534 { 535 typedef duration<_Rep1, _Period1> __dur1; 536 typedef duration<_Rep2, _Period2> __dur2; 537 typedef typename common_type<__dur1,__dur2>::type __cd; 538 return __cd(__cd(__lhs).count() % __cd(__rhs).count()); 539 } 540 541 // comparisons 542 template<typename _Rep1, typename _Period1, 543 typename _Rep2, typename _Period2> 544 constexpr bool 545 operator==(const duration<_Rep1, _Period1>& __lhs, 546 const duration<_Rep2, _Period2>& __rhs) 547 { 548 typedef duration<_Rep1, _Period1> __dur1; 549 typedef duration<_Rep2, _Period2> __dur2; 550 typedef typename common_type<__dur1,__dur2>::type __ct; 551 return __ct(__lhs).count() == __ct(__rhs).count(); 552 } 553 554 template<typename _Rep1, typename _Period1, 555 typename _Rep2, typename _Period2> 556 constexpr bool 557 operator<(const duration<_Rep1, _Period1>& __lhs, 558 const duration<_Rep2, _Period2>& __rhs) 559 { 560 typedef duration<_Rep1, _Period1> __dur1; 561 typedef duration<_Rep2, _Period2> __dur2; 562 typedef typename common_type<__dur1,__dur2>::type __ct; 563 return __ct(__lhs).count() < __ct(__rhs).count(); 564 } 565 566 template<typename _Rep1, typename _Period1, 567 typename _Rep2, typename _Period2> 568 constexpr bool 569 operator!=(const duration<_Rep1, _Period1>& __lhs, 570 const duration<_Rep2, _Period2>& __rhs) 571 { return !(__lhs == __rhs); } 572 573 template<typename _Rep1, typename _Period1, 574 typename _Rep2, typename _Period2> 575 constexpr bool 576 operator<=(const duration<_Rep1, _Period1>& __lhs, 577 const duration<_Rep2, _Period2>& __rhs) 578 { return !(__rhs < __lhs); } 579 580 template<typename _Rep1, typename _Period1, 581 typename _Rep2, typename _Period2> 582 constexpr bool 583 operator>(const duration<_Rep1, _Period1>& __lhs, 584 const duration<_Rep2, _Period2>& __rhs) 585 { return __rhs < __lhs; } 586 587 template<typename _Rep1, typename _Period1, 588 typename _Rep2, typename _Period2> 589 constexpr bool 590 operator>=(const duration<_Rep1, _Period1>& __lhs, 591 const duration<_Rep2, _Period2>& __rhs) 592 { return !(__lhs < __rhs); } 593 594#ifdef _GLIBCXX_USE_C99_STDINT_TR1 595# define _GLIBCXX_CHRONO_INT64_T int64_t 596#elif defined __INT64_TYPE__ 597# define _GLIBCXX_CHRONO_INT64_T __INT64_TYPE__ 598#else 599 static_assert(std::numeric_limits<unsigned long long>::digits >= 64, 600 "Representation type for nanoseconds must have at least 64 bits"); 601# define _GLIBCXX_CHRONO_INT64_T long long 602#endif 603 604 /// nanoseconds 605 typedef duration<_GLIBCXX_CHRONO_INT64_T, nano> nanoseconds; 606 607 /// microseconds 608 typedef duration<_GLIBCXX_CHRONO_INT64_T, micro> microseconds; 609 610 /// milliseconds 611 typedef duration<_GLIBCXX_CHRONO_INT64_T, milli> milliseconds; 612 613 /// seconds 614 typedef duration<_GLIBCXX_CHRONO_INT64_T> seconds; 615 616 /// minutes 617 typedef duration<_GLIBCXX_CHRONO_INT64_T, ratio< 60>> minutes; 618 619 /// hours 620 typedef duration<_GLIBCXX_CHRONO_INT64_T, ratio<3600>> hours; 621 622#undef _GLIBCXX_CHRONO_INT64_T 623 624 /// time_point 625 template<typename _Clock, typename _Dur> 626 struct time_point 627 { 628 typedef _Clock clock; 629 typedef _Dur duration; 630 typedef typename duration::rep rep; 631 typedef typename duration::period period; 632 633 constexpr time_point() : __d(duration::zero()) 634 { } 635 636 constexpr explicit time_point(const duration& __dur) 637 : __d(__dur) 638 { } 639 640 // conversions 641 template<typename _Dur2, 642 typename = _Require<is_convertible<_Dur2, _Dur>>> 643 constexpr time_point(const time_point<clock, _Dur2>& __t) 644 : __d(__t.time_since_epoch()) 645 { } 646 647 // observer 648 constexpr duration 649 time_since_epoch() const 650 { return __d; } 651 652 // arithmetic 653 _GLIBCXX17_CONSTEXPR time_point& 654 operator+=(const duration& __dur) 655 { 656 __d += __dur; 657 return *this; 658 } 659 660 _GLIBCXX17_CONSTEXPR time_point& 661 operator-=(const duration& __dur) 662 { 663 __d -= __dur; 664 return *this; 665 } 666 667 // special values 668 static constexpr time_point 669 min() noexcept 670 { return time_point(duration::min()); } 671 672 static constexpr time_point 673 max() noexcept 674 { return time_point(duration::max()); } 675 676 private: 677 duration __d; 678 }; 679 680 /// time_point_cast 681 template<typename _ToDur, typename _Clock, typename _Dur> 682 constexpr typename enable_if<__is_duration<_ToDur>::value, 683 time_point<_Clock, _ToDur>>::type 684 time_point_cast(const time_point<_Clock, _Dur>& __t) 685 { 686 typedef time_point<_Clock, _ToDur> __time_point; 687 return __time_point(duration_cast<_ToDur>(__t.time_since_epoch())); 688 } 689 690#if __cplusplus > 201402L 691 template<typename _ToDur, typename _Clock, typename _Dur> 692 constexpr 693 enable_if_t<__is_duration<_ToDur>::value, time_point<_Clock, _ToDur>> 694 floor(const time_point<_Clock, _Dur>& __tp) 695 { 696 return time_point<_Clock, _ToDur>{ 697 chrono::floor<_ToDur>(__tp.time_since_epoch())}; 698 } 699 700 template<typename _ToDur, typename _Clock, typename _Dur> 701 constexpr 702 enable_if_t<__is_duration<_ToDur>::value, time_point<_Clock, _ToDur>> 703 ceil(const time_point<_Clock, _Dur>& __tp) 704 { 705 return time_point<_Clock, _ToDur>{ 706 chrono::ceil<_ToDur>(__tp.time_since_epoch())}; 707 } 708 709 template<typename _ToDur, typename _Clock, typename _Dur> 710 constexpr enable_if_t< 711 __and_<__is_duration<_ToDur>, 712 __not_<treat_as_floating_point<typename _ToDur::rep>>>::value, 713 time_point<_Clock, _ToDur>> 714 round(const time_point<_Clock, _Dur>& __tp) 715 { 716 return time_point<_Clock, _ToDur>{ 717 chrono::round<_ToDur>(__tp.time_since_epoch())}; 718 } 719#endif // C++17 720 721 template<typename _Clock, typename _Dur1, 722 typename _Rep2, typename _Period2> 723 constexpr time_point<_Clock, 724 typename common_type<_Dur1, duration<_Rep2, _Period2>>::type> 725 operator+(const time_point<_Clock, _Dur1>& __lhs, 726 const duration<_Rep2, _Period2>& __rhs) 727 { 728 typedef duration<_Rep2, _Period2> __dur2; 729 typedef typename common_type<_Dur1,__dur2>::type __ct; 730 typedef time_point<_Clock, __ct> __time_point; 731 return __time_point(__lhs.time_since_epoch() + __rhs); 732 } 733 734 template<typename _Rep1, typename _Period1, 735 typename _Clock, typename _Dur2> 736 constexpr time_point<_Clock, 737 typename common_type<duration<_Rep1, _Period1>, _Dur2>::type> 738 operator+(const duration<_Rep1, _Period1>& __lhs, 739 const time_point<_Clock, _Dur2>& __rhs) 740 { 741 typedef duration<_Rep1, _Period1> __dur1; 742 typedef typename common_type<__dur1,_Dur2>::type __ct; 743 typedef time_point<_Clock, __ct> __time_point; 744 return __time_point(__rhs.time_since_epoch() + __lhs); 745 } 746 747 template<typename _Clock, typename _Dur1, 748 typename _Rep2, typename _Period2> 749 constexpr time_point<_Clock, 750 typename common_type<_Dur1, duration<_Rep2, _Period2>>::type> 751 operator-(const time_point<_Clock, _Dur1>& __lhs, 752 const duration<_Rep2, _Period2>& __rhs) 753 { 754 typedef duration<_Rep2, _Period2> __dur2; 755 typedef typename common_type<_Dur1,__dur2>::type __ct; 756 typedef time_point<_Clock, __ct> __time_point; 757 return __time_point(__lhs.time_since_epoch() -__rhs); 758 } 759 760 template<typename _Clock, typename _Dur1, typename _Dur2> 761 constexpr typename common_type<_Dur1, _Dur2>::type 762 operator-(const time_point<_Clock, _Dur1>& __lhs, 763 const time_point<_Clock, _Dur2>& __rhs) 764 { return __lhs.time_since_epoch() - __rhs.time_since_epoch(); } 765 766 template<typename _Clock, typename _Dur1, typename _Dur2> 767 constexpr bool 768 operator==(const time_point<_Clock, _Dur1>& __lhs, 769 const time_point<_Clock, _Dur2>& __rhs) 770 { return __lhs.time_since_epoch() == __rhs.time_since_epoch(); } 771 772 template<typename _Clock, typename _Dur1, typename _Dur2> 773 constexpr bool 774 operator!=(const time_point<_Clock, _Dur1>& __lhs, 775 const time_point<_Clock, _Dur2>& __rhs) 776 { return !(__lhs == __rhs); } 777 778 template<typename _Clock, typename _Dur1, typename _Dur2> 779 constexpr bool 780 operator<(const time_point<_Clock, _Dur1>& __lhs, 781 const time_point<_Clock, _Dur2>& __rhs) 782 { return __lhs.time_since_epoch() < __rhs.time_since_epoch(); } 783 784 template<typename _Clock, typename _Dur1, typename _Dur2> 785 constexpr bool 786 operator<=(const time_point<_Clock, _Dur1>& __lhs, 787 const time_point<_Clock, _Dur2>& __rhs) 788 { return !(__rhs < __lhs); } 789 790 template<typename _Clock, typename _Dur1, typename _Dur2> 791 constexpr bool 792 operator>(const time_point<_Clock, _Dur1>& __lhs, 793 const time_point<_Clock, _Dur2>& __rhs) 794 { return __rhs < __lhs; } 795 796 template<typename _Clock, typename _Dur1, typename _Dur2> 797 constexpr bool 798 operator>=(const time_point<_Clock, _Dur1>& __lhs, 799 const time_point<_Clock, _Dur2>& __rhs) 800 { return !(__lhs < __rhs); } 801 802 803 // Clocks. 804 805 // Why nanosecond resolution as the default? 806 // Why have std::system_clock always count in the highest 807 // resolution (ie nanoseconds), even if on some OSes the low 3 808 // or 9 decimal digits will be always zero? This allows later 809 // implementations to change the system_clock::now() 810 // implementation any time to provide better resolution without 811 // changing function signature or units. 812 813 // To support the (forward) evolution of the library's defined 814 // clocks, wrap inside inline namespace so that the current 815 // defintions of system_clock, steady_clock, and 816 // high_resolution_clock types are uniquely mangled. This way, new 817 // code can use the latests clocks, while the library can contain 818 // compatibility definitions for previous versions. At some 819 // point, when these clocks settle down, the inlined namespaces 820 // can be removed. XXX GLIBCXX_ABI Deprecated 821 inline namespace _V2 { 822 823 /** 824 * @brief System clock. 825 * 826 * Time returned represents wall time from the system-wide clock. 827 */ 828 struct system_clock 829 { 830 typedef chrono::nanoseconds duration; 831 typedef duration::rep rep; 832 typedef duration::period period; 833 typedef chrono::time_point<system_clock, duration> time_point; 834 835 static_assert(system_clock::duration::min() 836 < system_clock::duration::zero(), 837 "a clock's minimum duration cannot be less than its epoch"); 838 839 static constexpr bool is_steady = false; 840 841 static time_point 842 now() noexcept; 843 844 // Map to C API 845 static std::time_t 846 to_time_t(const time_point& __t) noexcept 847 { 848 return std::time_t(duration_cast<chrono::seconds> 849 (__t.time_since_epoch()).count()); 850 } 851 852 static time_point 853 from_time_t(std::time_t __t) noexcept 854 { 855 typedef chrono::time_point<system_clock, seconds> __from; 856 return time_point_cast<system_clock::duration> 857 (__from(chrono::seconds(__t))); 858 } 859 }; 860 861 862 /** 863 * @brief Monotonic clock 864 * 865 * Time returned has the property of only increasing at a uniform rate. 866 */ 867 struct steady_clock 868 { 869 typedef chrono::nanoseconds duration; 870 typedef duration::rep rep; 871 typedef duration::period period; 872 typedef chrono::time_point<steady_clock, duration> time_point; 873 874 static constexpr bool is_steady = true; 875 876 static time_point 877 now() noexcept; 878 }; 879 880 881 /** 882 * @brief Highest-resolution clock 883 * 884 * This is the clock "with the shortest tick period." Alias to 885 * std::system_clock until higher-than-nanosecond definitions 886 * become feasible. 887 */ 888 using high_resolution_clock = system_clock; 889 890 } // end inline namespace _V2 891 } // namespace chrono 892 893#if __cplusplus > 201103L 894 895#define __cpp_lib_chrono_udls 201304 896 897 inline namespace literals 898 { 899 inline namespace chrono_literals 900 { 901#pragma GCC diagnostic push 902#pragma GCC diagnostic ignored "-Wliteral-suffix" 903 template<typename _Dur, char... _Digits> 904 constexpr _Dur __check_overflow() 905 { 906 using _Val = __parse_int::_Parse_int<_Digits...>; 907 constexpr typename _Dur::rep __repval = _Val::value; 908 static_assert(__repval >= 0 && __repval == _Val::value, 909 "literal value cannot be represented by duration type"); 910 return _Dur(__repval); 911 } 912 913 constexpr chrono::duration<long double, ratio<3600,1>> 914 operator""h(long double __hours) 915 { return chrono::duration<long double, ratio<3600,1>>{__hours}; } 916 917 template <char... _Digits> 918 constexpr chrono::hours 919 operator""h() 920 { return __check_overflow<chrono::hours, _Digits...>(); } 921 922 constexpr chrono::duration<long double, ratio<60,1>> 923 operator""min(long double __mins) 924 { return chrono::duration<long double, ratio<60,1>>{__mins}; } 925 926 template <char... _Digits> 927 constexpr chrono::minutes 928 operator""min() 929 { return __check_overflow<chrono::minutes, _Digits...>(); } 930 931 constexpr chrono::duration<long double> 932 operator""s(long double __secs) 933 { return chrono::duration<long double>{__secs}; } 934 935 template <char... _Digits> 936 constexpr chrono::seconds 937 operator""s() 938 { return __check_overflow<chrono::seconds, _Digits...>(); } 939 940 constexpr chrono::duration<long double, milli> 941 operator""ms(long double __msecs) 942 { return chrono::duration<long double, milli>{__msecs}; } 943 944 template <char... _Digits> 945 constexpr chrono::milliseconds 946 operator""ms() 947 { return __check_overflow<chrono::milliseconds, _Digits...>(); } 948 949 constexpr chrono::duration<long double, micro> 950 operator""us(long double __usecs) 951 { return chrono::duration<long double, micro>{__usecs}; } 952 953 template <char... _Digits> 954 constexpr chrono::microseconds 955 operator""us() 956 { return __check_overflow<chrono::microseconds, _Digits...>(); } 957 958 constexpr chrono::duration<long double, nano> 959 operator""ns(long double __nsecs) 960 { return chrono::duration<long double, nano>{__nsecs}; } 961 962 template <char... _Digits> 963 constexpr chrono::nanoseconds 964 operator""ns() 965 { return __check_overflow<chrono::nanoseconds, _Digits...>(); } 966 967#pragma GCC diagnostic pop 968 } // inline namespace chrono_literals 969 } // inline namespace literals 970 971 namespace chrono 972 { 973 using namespace literals::chrono_literals; 974 } // namespace chrono 975 976#endif // C++14 977 978 /// @} group chrono 979 980_GLIBCXX_END_NAMESPACE_VERSION 981} // namespace std 982 983#endif // C++11 984 985#endif //_GLIBCXX_CHRONO 986