xref: /llvm-project/libcxx/include/__chrono/time_point.h (revision 7c010bfdc540890e33c5db2424e0cfb9df08d410)
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