15726e559SLouis Dionne // -*- C++ -*- 25726e559SLouis Dionne //===----------------------------------------------------------------------===// 35726e559SLouis Dionne // 45726e559SLouis Dionne // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 55726e559SLouis Dionne // See https://llvm.org/LICENSE.txt for license information. 65726e559SLouis Dionne // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 75726e559SLouis Dionne // 85726e559SLouis Dionne //===----------------------------------------------------------------------===// 95726e559SLouis Dionne 105726e559SLouis Dionne #ifndef _LIBCPP___CHRONO_TIME_POINT_H 115726e559SLouis Dionne #define _LIBCPP___CHRONO_TIME_POINT_H 125726e559SLouis Dionne 135726e559SLouis Dionne #include <__chrono/duration.h> 14d94a770fSHristo Hristov #include <__compare/ordering.h> 15d94a770fSHristo Hristov #include <__compare/three_way_comparable.h> 165726e559SLouis Dionne #include <__config> 17dc21ce44SNikolas Klauser #include <__type_traits/common_type.h> 18dc21ce44SNikolas Klauser #include <__type_traits/enable_if.h> 19dc21ce44SNikolas Klauser #include <__type_traits/is_convertible.h> 205726e559SLouis Dionne #include <limits> 215726e559SLouis Dionne 225726e559SLouis Dionne #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 235726e559SLouis Dionne # pragma GCC system_header 245726e559SLouis Dionne #endif 255726e559SLouis Dionne 265726e559SLouis Dionne _LIBCPP_PUSH_MACROS 275726e559SLouis Dionne #include <__undef_macros> 285726e559SLouis Dionne 295726e559SLouis Dionne _LIBCPP_BEGIN_NAMESPACE_STD 305726e559SLouis Dionne 319783f28cSLouis Dionne namespace chrono { 325726e559SLouis Dionne 335726e559SLouis Dionne template <class _Clock, class _Duration = typename _Clock::duration> 349783f28cSLouis Dionne class _LIBCPP_TEMPLATE_VIS time_point { 35*7c010bfdSNikolas Klauser static_assert(__is_duration_v<_Duration>, "Second template parameter of time_point must be a std::chrono::duration"); 369783f28cSLouis Dionne 375726e559SLouis Dionne public: 385726e559SLouis Dionne typedef _Clock clock; 395726e559SLouis Dionne typedef _Duration duration; 405726e559SLouis Dionne typedef typename duration::rep rep; 415726e559SLouis Dionne typedef typename duration::period period; 429783f28cSLouis Dionne 435726e559SLouis Dionne private: 445726e559SLouis Dionne duration __d_; 455726e559SLouis Dionne 465726e559SLouis Dionne public: 474c198542SLouis Dionne _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 time_point() : __d_(duration::zero()) {} 484c198542SLouis Dionne _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 explicit time_point(const duration& __d) : __d_(__d) {} 495726e559SLouis Dionne 505726e559SLouis Dionne // conversions 514da76ea7SNikolas Klauser template <class _Duration2, __enable_if_t<is_convertible<_Duration2, duration>::value, int> = 0> 529783f28cSLouis Dionne _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 time_point(const time_point<clock, _Duration2>& __t) 53b48c5010SNikolas Klauser : __d_(__t.time_since_epoch()) {} 545726e559SLouis Dionne 555726e559SLouis Dionne // observer 565726e559SLouis Dionne 574c198542SLouis Dionne _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 duration time_since_epoch() const { return __d_; } 585726e559SLouis Dionne 595726e559SLouis Dionne // arithmetic 605726e559SLouis Dionne 619783f28cSLouis Dionne _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 time_point& operator+=(const duration& __d) { 629783f28cSLouis Dionne __d_ += __d; 639783f28cSLouis Dionne return *this; 649783f28cSLouis Dionne } 659783f28cSLouis Dionne _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 time_point& operator-=(const duration& __d) { 669783f28cSLouis Dionne __d_ -= __d; 679783f28cSLouis Dionne return *this; 689783f28cSLouis Dionne } 695726e559SLouis Dionne 705726e559SLouis Dionne // special values 715726e559SLouis Dionne 724c198542SLouis Dionne _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR time_point min() _NOEXCEPT { return time_point(duration::min()); } 734c198542SLouis Dionne _LIBCPP_HIDE_FROM_ABI static _LIBCPP_CONSTEXPR time_point max() _NOEXCEPT { return time_point(duration::max()); } 745726e559SLouis Dionne }; 755726e559SLouis Dionne 765726e559SLouis Dionne } // namespace chrono 775726e559SLouis Dionne 785726e559SLouis Dionne template <class _Clock, class _Duration1, class _Duration2> 799783f28cSLouis Dionne struct _LIBCPP_TEMPLATE_VIS 809783f28cSLouis Dionne common_type<chrono::time_point<_Clock, _Duration1>, chrono::time_point<_Clock, _Duration2> > { 815726e559SLouis Dionne typedef chrono::time_point<_Clock, typename common_type<_Duration1, _Duration2>::type> type; 825726e559SLouis Dionne }; 835726e559SLouis Dionne 845726e559SLouis Dionne namespace chrono { 855726e559SLouis Dionne 865726e559SLouis Dionne template <class _ToDuration, class _Clock, class _Duration> 879783f28cSLouis Dionne inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 time_point<_Clock, _ToDuration> 889783f28cSLouis Dionne time_point_cast(const time_point<_Clock, _Duration>& __t) { 895726e559SLouis Dionne return time_point<_Clock, _ToDuration>(chrono::duration_cast<_ToDuration>(__t.time_since_epoch())); 905726e559SLouis Dionne } 915726e559SLouis Dionne 924f15267dSNikolas Klauser #if _LIBCPP_STD_VER >= 17 93*7c010bfdSNikolas Klauser template <class _ToDuration, class _Clock, class _Duration, enable_if_t<__is_duration_v<_ToDuration>, int> = 0> 941f98ac09SNikolas Klauser inline _LIBCPP_HIDE_FROM_ABI constexpr time_point<_Clock, _ToDuration> floor(const time_point<_Clock, _Duration>& __t) { 95841399a2SNikolas Klauser return time_point<_Clock, _ToDuration>{chrono::floor<_ToDuration>(__t.time_since_epoch())}; 965726e559SLouis Dionne } 975726e559SLouis Dionne 98*7c010bfdSNikolas Klauser template <class _ToDuration, class _Clock, class _Duration, enable_if_t<__is_duration_v<_ToDuration>, int> = 0> 991f98ac09SNikolas Klauser inline _LIBCPP_HIDE_FROM_ABI constexpr time_point<_Clock, _ToDuration> ceil(const time_point<_Clock, _Duration>& __t) { 100841399a2SNikolas Klauser return time_point<_Clock, _ToDuration>{chrono::ceil<_ToDuration>(__t.time_since_epoch())}; 1015726e559SLouis Dionne } 1025726e559SLouis Dionne 103*7c010bfdSNikolas Klauser template <class _ToDuration, class _Clock, class _Duration, enable_if_t<__is_duration_v<_ToDuration>, int> = 0> 1041f98ac09SNikolas Klauser inline _LIBCPP_HIDE_FROM_ABI constexpr time_point<_Clock, _ToDuration> round(const time_point<_Clock, _Duration>& __t) { 105841399a2SNikolas Klauser return time_point<_Clock, _ToDuration>{chrono::round<_ToDuration>(__t.time_since_epoch())}; 1065726e559SLouis Dionne } 1075726e559SLouis Dionne 108475bd19eSNikolas Klauser template <class _Rep, class _Period, enable_if_t<numeric_limits<_Rep>::is_signed, int> = 0> 1091f98ac09SNikolas Klauser inline _LIBCPP_HIDE_FROM_ABI constexpr duration<_Rep, _Period> abs(duration<_Rep, _Period> __d) { 1105726e559SLouis Dionne return __d >= __d.zero() ? +__d : -__d; 1115726e559SLouis Dionne } 1124f15267dSNikolas Klauser #endif // _LIBCPP_STD_VER >= 17 1135726e559SLouis Dionne 1145726e559SLouis Dionne // time_point == 1155726e559SLouis Dionne 1165726e559SLouis Dionne template <class _Clock, class _Duration1, class _Duration2> 1179783f28cSLouis Dionne inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 bool 1189783f28cSLouis Dionne operator==(const time_point<_Clock, _Duration1>& __lhs, const time_point<_Clock, _Duration2>& __rhs) { 1195726e559SLouis Dionne return __lhs.time_since_epoch() == __rhs.time_since_epoch(); 1205726e559SLouis Dionne } 1215726e559SLouis Dionne 122d94a770fSHristo Hristov #if _LIBCPP_STD_VER <= 17 123d94a770fSHristo Hristov 1245726e559SLouis Dionne // time_point != 1255726e559SLouis Dionne 1265726e559SLouis Dionne template <class _Clock, class _Duration1, class _Duration2> 1279783f28cSLouis Dionne inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 bool 1289783f28cSLouis Dionne operator!=(const time_point<_Clock, _Duration1>& __lhs, const time_point<_Clock, _Duration2>& __rhs) { 1295726e559SLouis Dionne return !(__lhs == __rhs); 1305726e559SLouis Dionne } 1315726e559SLouis Dionne 132d94a770fSHristo Hristov #endif // _LIBCPP_STD_VER <= 17 133d94a770fSHristo Hristov 1345726e559SLouis Dionne // time_point < 1355726e559SLouis Dionne 1365726e559SLouis Dionne template <class _Clock, class _Duration1, class _Duration2> 1379783f28cSLouis Dionne inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 bool 1389783f28cSLouis Dionne operator<(const time_point<_Clock, _Duration1>& __lhs, const time_point<_Clock, _Duration2>& __rhs) { 1395726e559SLouis Dionne return __lhs.time_since_epoch() < __rhs.time_since_epoch(); 1405726e559SLouis Dionne } 1415726e559SLouis Dionne 1425726e559SLouis Dionne // time_point > 1435726e559SLouis Dionne 1445726e559SLouis Dionne template <class _Clock, class _Duration1, class _Duration2> 1459783f28cSLouis Dionne inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 bool 1469783f28cSLouis Dionne operator>(const time_point<_Clock, _Duration1>& __lhs, const time_point<_Clock, _Duration2>& __rhs) { 1475726e559SLouis Dionne return __rhs < __lhs; 1485726e559SLouis Dionne } 1495726e559SLouis Dionne 1505726e559SLouis Dionne // time_point <= 1515726e559SLouis Dionne 1525726e559SLouis Dionne template <class _Clock, class _Duration1, class _Duration2> 1539783f28cSLouis Dionne inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 bool 1549783f28cSLouis Dionne operator<=(const time_point<_Clock, _Duration1>& __lhs, const time_point<_Clock, _Duration2>& __rhs) { 1555726e559SLouis Dionne return !(__rhs < __lhs); 1565726e559SLouis Dionne } 1575726e559SLouis Dionne 1585726e559SLouis Dionne // time_point >= 1595726e559SLouis Dionne 1605726e559SLouis Dionne template <class _Clock, class _Duration1, class _Duration2> 1619783f28cSLouis Dionne inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 bool 1629783f28cSLouis Dionne operator>=(const time_point<_Clock, _Duration1>& __lhs, const time_point<_Clock, _Duration2>& __rhs) { 1635726e559SLouis Dionne return !(__lhs < __rhs); 1645726e559SLouis Dionne } 1655726e559SLouis Dionne 166d94a770fSHristo Hristov #if _LIBCPP_STD_VER >= 20 167d94a770fSHristo Hristov 168d94a770fSHristo Hristov template <class _Clock, class _Duration1, three_way_comparable_with<_Duration1> _Duration2> 169d94a770fSHristo Hristov _LIBCPP_HIDE_FROM_ABI constexpr auto 170d94a770fSHristo Hristov operator<=>(const time_point<_Clock, _Duration1>& __lhs, const time_point<_Clock, _Duration2>& __rhs) { 171d94a770fSHristo Hristov return __lhs.time_since_epoch() <=> __rhs.time_since_epoch(); 172d94a770fSHristo Hristov } 173d94a770fSHristo Hristov 174d94a770fSHristo Hristov #endif // _LIBCPP_STD_VER >= 20 175d94a770fSHristo Hristov 1765726e559SLouis Dionne // time_point operator+(time_point x, duration y); 1775726e559SLouis Dionne 1785726e559SLouis Dionne template <class _Clock, class _Duration1, class _Rep2, class _Period2> 179e2c2ffbeSLouis Dionne inline _LIBCPP_HIDE_FROM_ABI 180e2c2ffbeSLouis Dionne _LIBCPP_CONSTEXPR_SINCE_CXX14 time_point<_Clock, typename common_type<_Duration1, duration<_Rep2, _Period2> >::type> 1819783f28cSLouis Dionne operator+(const time_point<_Clock, _Duration1>& __lhs, const duration<_Rep2, _Period2>& __rhs) { 1825726e559SLouis Dionne typedef time_point<_Clock, typename common_type<_Duration1, duration<_Rep2, _Period2> >::type> _Tr; 1835726e559SLouis Dionne return _Tr(__lhs.time_since_epoch() + __rhs); 1845726e559SLouis Dionne } 1855726e559SLouis Dionne 1865726e559SLouis Dionne // time_point operator+(duration x, time_point y); 1875726e559SLouis Dionne 1885726e559SLouis Dionne template <class _Rep1, class _Period1, class _Clock, class _Duration2> 189e2c2ffbeSLouis Dionne inline _LIBCPP_HIDE_FROM_ABI 190e2c2ffbeSLouis Dionne _LIBCPP_CONSTEXPR_SINCE_CXX14 time_point<_Clock, typename common_type<duration<_Rep1, _Period1>, _Duration2>::type> 1919783f28cSLouis Dionne operator+(const duration<_Rep1, _Period1>& __lhs, const time_point<_Clock, _Duration2>& __rhs) { 1925726e559SLouis Dionne return __rhs + __lhs; 1935726e559SLouis Dionne } 1945726e559SLouis Dionne 1955726e559SLouis Dionne // time_point operator-(time_point x, duration y); 1965726e559SLouis Dionne 1975726e559SLouis Dionne template <class _Clock, class _Duration1, class _Rep2, class _Period2> 198e2c2ffbeSLouis Dionne inline _LIBCPP_HIDE_FROM_ABI 199e2c2ffbeSLouis Dionne _LIBCPP_CONSTEXPR_SINCE_CXX14 time_point<_Clock, typename common_type<_Duration1, duration<_Rep2, _Period2> >::type> 2009783f28cSLouis Dionne operator-(const time_point<_Clock, _Duration1>& __lhs, const duration<_Rep2, _Period2>& __rhs) { 2015726e559SLouis Dionne typedef time_point<_Clock, typename common_type<_Duration1, duration<_Rep2, _Period2> >::type> _Ret; 2025726e559SLouis Dionne return _Ret(__lhs.time_since_epoch() - __rhs); 2035726e559SLouis Dionne } 2045726e559SLouis Dionne 2055726e559SLouis Dionne // duration operator-(time_point x, time_point y); 2065726e559SLouis Dionne 2075726e559SLouis Dionne template <class _Clock, class _Duration1, class _Duration2> 2089783f28cSLouis Dionne inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 typename common_type<_Duration1, _Duration2>::type 2099783f28cSLouis Dionne operator-(const time_point<_Clock, _Duration1>& __lhs, const time_point<_Clock, _Duration2>& __rhs) { 2105726e559SLouis Dionne return __lhs.time_since_epoch() - __rhs.time_since_epoch(); 2115726e559SLouis Dionne } 2125726e559SLouis Dionne 2135726e559SLouis Dionne } // namespace chrono 2145726e559SLouis Dionne 2155726e559SLouis Dionne _LIBCPP_END_NAMESPACE_STD 2165726e559SLouis Dionne 2175726e559SLouis Dionne _LIBCPP_POP_MACROS 2185726e559SLouis Dionne 2195726e559SLouis Dionne #endif // _LIBCPP___CHRONO_TIME_POINT_H 220