xref: /freebsd/contrib/llvm-project/libcxx/include/chrono (revision 81ad626541db97eb356e2c1d4a20eb2a26a766ab)
10b57cec5SDimitry Andric// -*- C++ -*-
2349cc55cSDimitry Andric//===----------------------------------------------------------------------===//
30b57cec5SDimitry Andric//
40b57cec5SDimitry Andric// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
50b57cec5SDimitry Andric// See https://llvm.org/LICENSE.txt for license information.
60b57cec5SDimitry Andric// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
70b57cec5SDimitry Andric//
80b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
90b57cec5SDimitry Andric
100b57cec5SDimitry Andric#ifndef _LIBCPP_CHRONO
110b57cec5SDimitry Andric#define _LIBCPP_CHRONO
120b57cec5SDimitry Andric
130b57cec5SDimitry Andric/*
140b57cec5SDimitry Andric    chrono synopsis
150b57cec5SDimitry Andric
160b57cec5SDimitry Andricnamespace std
170b57cec5SDimitry Andric{
180b57cec5SDimitry Andricnamespace chrono
190b57cec5SDimitry Andric{
200b57cec5SDimitry Andric
210b57cec5SDimitry Andrictemplate <class ToDuration, class Rep, class Period>
220b57cec5SDimitry Andricconstexpr
230b57cec5SDimitry AndricToDuration
240b57cec5SDimitry Andricduration_cast(const duration<Rep, Period>& fd);
250b57cec5SDimitry Andric
260b57cec5SDimitry Andrictemplate <class Rep> struct treat_as_floating_point : is_floating_point<Rep> {};
270b57cec5SDimitry Andric
280b57cec5SDimitry Andrictemplate <class Rep> inline constexpr bool treat_as_floating_point_v
290b57cec5SDimitry Andric    = treat_as_floating_point<Rep>::value;                       // C++17
300b57cec5SDimitry Andric
310b57cec5SDimitry Andrictemplate <class Rep>
320b57cec5SDimitry Andricstruct duration_values
330b57cec5SDimitry Andric{
340b57cec5SDimitry Andricpublic:
350b57cec5SDimitry Andric    static constexpr Rep zero(); // noexcept in C++20
360b57cec5SDimitry Andric    static constexpr Rep max();  // noexcept in C++20
370b57cec5SDimitry Andric    static constexpr Rep min();  // noexcept in C++20
380b57cec5SDimitry Andric};
390b57cec5SDimitry Andric
400b57cec5SDimitry Andric// duration
410b57cec5SDimitry Andric
420b57cec5SDimitry Andrictemplate <class Rep, class Period = ratio<1>>
430b57cec5SDimitry Andricclass duration
440b57cec5SDimitry Andric{
450b57cec5SDimitry Andric    static_assert(!__is_duration<Rep>::value, "A duration representation can not be a duration");
460b57cec5SDimitry Andric    static_assert(__is_ratio<Period>::value, "Second template parameter of duration must be a std::ratio");
470b57cec5SDimitry Andric    static_assert(Period::num > 0, "duration period must be positive");
480b57cec5SDimitry Andricpublic:
490b57cec5SDimitry Andric    typedef Rep rep;
500b57cec5SDimitry Andric    typedef typename _Period::type period;
510b57cec5SDimitry Andric
520b57cec5SDimitry Andric    constexpr duration() = default;
530b57cec5SDimitry Andric    template <class Rep2>
540b57cec5SDimitry Andric        constexpr explicit duration(const Rep2& r,
550b57cec5SDimitry Andric            typename enable_if
560b57cec5SDimitry Andric            <
570b57cec5SDimitry Andric               is_convertible<Rep2, rep>::value &&
580b57cec5SDimitry Andric               (treat_as_floating_point<rep>::value ||
590b57cec5SDimitry Andric               !treat_as_floating_point<rep>::value && !treat_as_floating_point<Rep2>::value)
600b57cec5SDimitry Andric            >::type* = 0);
610b57cec5SDimitry Andric
620b57cec5SDimitry Andric    // conversions
630b57cec5SDimitry Andric    template <class Rep2, class Period2>
640b57cec5SDimitry Andric        constexpr duration(const duration<Rep2, Period2>& d,
650b57cec5SDimitry Andric            typename enable_if
660b57cec5SDimitry Andric            <
670b57cec5SDimitry Andric                treat_as_floating_point<rep>::value ||
680b57cec5SDimitry Andric                ratio_divide<Period2, period>::type::den == 1
690b57cec5SDimitry Andric            >::type* = 0);
700b57cec5SDimitry Andric
710b57cec5SDimitry Andric    // observer
720b57cec5SDimitry Andric
730b57cec5SDimitry Andric    constexpr rep count() const;
740b57cec5SDimitry Andric
750b57cec5SDimitry Andric    // arithmetic
760b57cec5SDimitry Andric
770b57cec5SDimitry Andric    constexpr common_type<duration>::type  operator+() const;
780b57cec5SDimitry Andric    constexpr common_type<duration>::type  operator-() const;
790b57cec5SDimitry Andric    constexpr duration& operator++();    // constexpr in C++17
800b57cec5SDimitry Andric    constexpr duration  operator++(int); // constexpr in C++17
810b57cec5SDimitry Andric    constexpr duration& operator--();    // constexpr in C++17
820b57cec5SDimitry Andric    constexpr duration  operator--(int); // constexpr in C++17
830b57cec5SDimitry Andric
840b57cec5SDimitry Andric    constexpr duration& operator+=(const duration& d);  // constexpr in C++17
850b57cec5SDimitry Andric    constexpr duration& operator-=(const duration& d);  // constexpr in C++17
860b57cec5SDimitry Andric
870b57cec5SDimitry Andric    duration& operator*=(const rep& rhs);       // constexpr in C++17
880b57cec5SDimitry Andric    duration& operator/=(const rep& rhs);       // constexpr in C++17
890b57cec5SDimitry Andric    duration& operator%=(const rep& rhs);       // constexpr in C++17
900b57cec5SDimitry Andric    duration& operator%=(const duration& rhs);  // constexpr in C++17
910b57cec5SDimitry Andric
920b57cec5SDimitry Andric    // special values
930b57cec5SDimitry Andric
940b57cec5SDimitry Andric    static constexpr duration zero(); // noexcept in C++20
950b57cec5SDimitry Andric    static constexpr duration min();  // noexcept in C++20
960b57cec5SDimitry Andric    static constexpr duration max();  // noexcept in C++20
970b57cec5SDimitry Andric};
980b57cec5SDimitry Andric
990b57cec5SDimitry Andrictypedef duration<long long,         nano> nanoseconds;
1000b57cec5SDimitry Andrictypedef duration<long long,        micro> microseconds;
1010b57cec5SDimitry Andrictypedef duration<long long,        milli> milliseconds;
1020b57cec5SDimitry Andrictypedef duration<long long              > seconds;
1030b57cec5SDimitry Andrictypedef duration<     long, ratio<  60> > minutes;
1040b57cec5SDimitry Andrictypedef duration<     long, ratio<3600> > hours;
1050b57cec5SDimitry Andric
1060b57cec5SDimitry Andrictemplate <class Clock, class Duration = typename Clock::duration>
1070b57cec5SDimitry Andricclass time_point
1080b57cec5SDimitry Andric{
1090b57cec5SDimitry Andricpublic:
1100b57cec5SDimitry Andric    typedef Clock                     clock;
1110b57cec5SDimitry Andric    typedef Duration                  duration;
1120b57cec5SDimitry Andric    typedef typename duration::rep    rep;
1130b57cec5SDimitry Andric    typedef typename duration::period period;
1140b57cec5SDimitry Andricprivate:
1150b57cec5SDimitry Andric    duration d_;  // exposition only
1160b57cec5SDimitry Andric
1170b57cec5SDimitry Andricpublic:
1180b57cec5SDimitry Andric    time_point();  // has value "epoch" // constexpr in C++14
1190b57cec5SDimitry Andric    explicit time_point(const duration& d);  // same as time_point() + d // constexpr in C++14
1200b57cec5SDimitry Andric
1210b57cec5SDimitry Andric    // conversions
1220b57cec5SDimitry Andric    template <class Duration2>
1230b57cec5SDimitry Andric       time_point(const time_point<clock, Duration2>& t); // constexpr in C++14
1240b57cec5SDimitry Andric
1250b57cec5SDimitry Andric    // observer
1260b57cec5SDimitry Andric
1270b57cec5SDimitry Andric    duration time_since_epoch() const; // constexpr in C++14
1280b57cec5SDimitry Andric
1290b57cec5SDimitry Andric    // arithmetic
1300b57cec5SDimitry Andric
1310b57cec5SDimitry Andric    time_point& operator+=(const duration& d); // constexpr in C++17
1320b57cec5SDimitry Andric    time_point& operator-=(const duration& d); // constexpr in C++17
1330b57cec5SDimitry Andric
1340b57cec5SDimitry Andric    // special values
1350b57cec5SDimitry Andric
1360b57cec5SDimitry Andric    static constexpr time_point min();  // noexcept in C++20
1370b57cec5SDimitry Andric    static constexpr time_point max();  // noexcept in C++20
1380b57cec5SDimitry Andric};
1390b57cec5SDimitry Andric
1400b57cec5SDimitry Andric} // chrono
1410b57cec5SDimitry Andric
1420b57cec5SDimitry Andric// common_type traits
1430b57cec5SDimitry Andrictemplate <class Rep1, class Period1, class Rep2, class Period2>
1440b57cec5SDimitry Andric  struct common_type<chrono::duration<Rep1, Period1>, chrono::duration<Rep2, Period2>>;
1450b57cec5SDimitry Andric
1460b57cec5SDimitry Andrictemplate <class Clock, class Duration1, class Duration2>
1470b57cec5SDimitry Andric  struct common_type<chrono::time_point<Clock, Duration1>, chrono::time_point<Clock, Duration2>>;
1480b57cec5SDimitry Andric
1490b57cec5SDimitry Andricnamespace chrono {
1500b57cec5SDimitry Andric
1510b57cec5SDimitry Andric// duration arithmetic
1520b57cec5SDimitry Andrictemplate <class Rep1, class Period1, class Rep2, class Period2>
1530b57cec5SDimitry Andric  constexpr
1540b57cec5SDimitry Andric  typename common_type<duration<Rep1, Period1>, duration<Rep2, Period2>>::type
1550b57cec5SDimitry Andric  operator+(const duration<Rep1, Period1>& lhs, const duration<Rep2, Period2>& rhs);
1560b57cec5SDimitry Andrictemplate <class Rep1, class Period1, class Rep2, class Period2>
1570b57cec5SDimitry Andric  constexpr
1580b57cec5SDimitry Andric  typename common_type<duration<Rep1, Period1>, duration<Rep2, Period2>>::type
1590b57cec5SDimitry Andric  operator-(const duration<Rep1, Period1>& lhs, const duration<Rep2, Period2>& rhs);
1600b57cec5SDimitry Andrictemplate <class Rep1, class Period, class Rep2>
1610b57cec5SDimitry Andric  constexpr
1620b57cec5SDimitry Andric  duration<typename common_type<Rep1, Rep2>::type, Period>
1630b57cec5SDimitry Andric  operator*(const duration<Rep1, Period>& d, const Rep2& s);
1640b57cec5SDimitry Andrictemplate <class Rep1, class Period, class Rep2>
1650b57cec5SDimitry Andric  constexpr
1660b57cec5SDimitry Andric  duration<typename common_type<Rep1, Rep2>::type, Period>
1670b57cec5SDimitry Andric  operator*(const Rep1& s, const duration<Rep2, Period>& d);
1680b57cec5SDimitry Andrictemplate <class Rep1, class Period, class Rep2>
1690b57cec5SDimitry Andric  constexpr
1700b57cec5SDimitry Andric  duration<typename common_type<Rep1, Rep2>::type, Period>
1710b57cec5SDimitry Andric  operator/(const duration<Rep1, Period>& d, const Rep2& s);
1720b57cec5SDimitry Andrictemplate <class Rep1, class Period1, class Rep2, class Period2>
1730b57cec5SDimitry Andric  constexpr
1740b57cec5SDimitry Andric  typename common_type<Rep1, Rep2>::type
1750b57cec5SDimitry Andric  operator/(const duration<Rep1, Period1>& lhs, const duration<Rep2, Period2>& rhs);
1760b57cec5SDimitry Andric
1770b57cec5SDimitry Andric// duration comparisons
1780b57cec5SDimitry Andrictemplate <class Rep1, class Period1, class Rep2, class Period2>
1790b57cec5SDimitry Andric   constexpr
1800b57cec5SDimitry Andric   bool operator==(const duration<Rep1, Period1>& lhs, const duration<Rep2, Period2>& rhs);
1810b57cec5SDimitry Andrictemplate <class Rep1, class Period1, class Rep2, class Period2>
1820b57cec5SDimitry Andric   constexpr
1830b57cec5SDimitry Andric   bool operator!=(const duration<Rep1, Period1>& lhs, const duration<Rep2, Period2>& rhs);
1840b57cec5SDimitry Andrictemplate <class Rep1, class Period1, class Rep2, class Period2>
1850b57cec5SDimitry Andric   constexpr
1860b57cec5SDimitry Andric   bool operator< (const duration<Rep1, Period1>& lhs, const duration<Rep2, Period2>& rhs);
1870b57cec5SDimitry Andrictemplate <class Rep1, class Period1, class Rep2, class Period2>
1880b57cec5SDimitry Andric   constexpr
1890b57cec5SDimitry Andric   bool operator<=(const duration<Rep1, Period1>& lhs, const duration<Rep2, Period2>& rhs);
1900b57cec5SDimitry Andrictemplate <class Rep1, class Period1, class Rep2, class Period2>
1910b57cec5SDimitry Andric   constexpr
1920b57cec5SDimitry Andric   bool operator> (const duration<Rep1, Period1>& lhs, const duration<Rep2, Period2>& rhs);
1930b57cec5SDimitry Andrictemplate <class Rep1, class Period1, class Rep2, class Period2>
1940b57cec5SDimitry Andric   constexpr
1950b57cec5SDimitry Andric   bool operator>=(const duration<Rep1, Period1>& lhs, const duration<Rep2, Period2>& rhs);
1960b57cec5SDimitry Andric
1970b57cec5SDimitry Andric// duration_cast
1980b57cec5SDimitry Andrictemplate <class ToDuration, class Rep, class Period>
1990b57cec5SDimitry Andric  ToDuration duration_cast(const duration<Rep, Period>& d);
2000b57cec5SDimitry Andric
2010b57cec5SDimitry Andrictemplate <class ToDuration, class Rep, class Period>
2020b57cec5SDimitry Andric    constexpr ToDuration floor(const duration<Rep, Period>& d);    // C++17
2030b57cec5SDimitry Andrictemplate <class ToDuration, class Rep, class Period>
2040b57cec5SDimitry Andric    constexpr ToDuration ceil(const duration<Rep, Period>& d);     // C++17
2050b57cec5SDimitry Andrictemplate <class ToDuration, class Rep, class Period>
2060b57cec5SDimitry Andric    constexpr ToDuration round(const duration<Rep, Period>& d);    // C++17
2070b57cec5SDimitry Andric
2080b57cec5SDimitry Andric// duration I/O is elsewhere
2090b57cec5SDimitry Andric
2100b57cec5SDimitry Andric// time_point arithmetic (all constexpr in C++14)
2110b57cec5SDimitry Andrictemplate <class Clock, class Duration1, class Rep2, class Period2>
2120b57cec5SDimitry Andric  time_point<Clock, typename common_type<Duration1, duration<Rep2, Period2>>::type>
2130b57cec5SDimitry Andric  operator+(const time_point<Clock, Duration1>& lhs, const duration<Rep2, Period2>& rhs);
2140b57cec5SDimitry Andrictemplate <class Rep1, class Period1, class Clock, class Duration2>
2150b57cec5SDimitry Andric  time_point<Clock, typename common_type<duration<Rep1, Period1>, Duration2>::type>
2160b57cec5SDimitry Andric  operator+(const duration<Rep1, Period1>& lhs, const time_point<Clock, Duration2>& rhs);
2170b57cec5SDimitry Andrictemplate <class Clock, class Duration1, class Rep2, class Period2>
2180b57cec5SDimitry Andric  time_point<Clock, typename common_type<Duration1, duration<Rep2, Period2>>::type>
2190b57cec5SDimitry Andric  operator-(const time_point<Clock, Duration1>& lhs, const duration<Rep2, Period2>& rhs);
2200b57cec5SDimitry Andrictemplate <class Clock, class Duration1, class Duration2>
2210b57cec5SDimitry Andric  typename common_type<Duration1, Duration2>::type
2220b57cec5SDimitry Andric  operator-(const time_point<Clock, Duration1>& lhs, const time_point<Clock, Duration2>& rhs);
2230b57cec5SDimitry Andric
2240b57cec5SDimitry Andric// time_point comparisons (all constexpr in C++14)
2250b57cec5SDimitry Andrictemplate <class Clock, class Duration1, class Duration2>
2260b57cec5SDimitry Andric   bool operator==(const time_point<Clock, Duration1>& lhs, const time_point<Clock, Duration2>& rhs);
2270b57cec5SDimitry Andrictemplate <class Clock, class Duration1, class Duration2>
2280b57cec5SDimitry Andric   bool operator!=(const time_point<Clock, Duration1>& lhs, const time_point<Clock, Duration2>& rhs);
2290b57cec5SDimitry Andrictemplate <class Clock, class Duration1, class Duration2>
2300b57cec5SDimitry Andric   bool operator< (const time_point<Clock, Duration1>& lhs, const time_point<Clock, Duration2>& rhs);
2310b57cec5SDimitry Andrictemplate <class Clock, class Duration1, class Duration2>
2320b57cec5SDimitry Andric   bool operator<=(const time_point<Clock, Duration1>& lhs, const time_point<Clock, Duration2>& rhs);
2330b57cec5SDimitry Andrictemplate <class Clock, class Duration1, class Duration2>
2340b57cec5SDimitry Andric   bool operator> (const time_point<Clock, Duration1>& lhs, const time_point<Clock, Duration2>& rhs);
2350b57cec5SDimitry Andrictemplate <class Clock, class Duration1, class Duration2>
2360b57cec5SDimitry Andric   bool operator>=(const time_point<Clock, Duration1>& lhs, const time_point<Clock, Duration2>& rhs);
2370b57cec5SDimitry Andric
2380b57cec5SDimitry Andric// time_point_cast (constexpr in C++14)
2390b57cec5SDimitry Andric
2400b57cec5SDimitry Andrictemplate <class ToDuration, class Clock, class Duration>
2410b57cec5SDimitry Andric  time_point<Clock, ToDuration> time_point_cast(const time_point<Clock, Duration>& t);
2420b57cec5SDimitry Andric
2430b57cec5SDimitry Andrictemplate <class ToDuration, class Clock, class Duration>
2440b57cec5SDimitry Andric    constexpr time_point<Clock, ToDuration>
2450b57cec5SDimitry Andric    floor(const time_point<Clock, Duration>& tp);                  // C++17
2460b57cec5SDimitry Andric
2470b57cec5SDimitry Andrictemplate <class ToDuration, class Clock, class Duration>
2480b57cec5SDimitry Andric    constexpr time_point<Clock, ToDuration>
2490b57cec5SDimitry Andric    ceil(const time_point<Clock, Duration>& tp);                   // C++17
2500b57cec5SDimitry Andric
2510b57cec5SDimitry Andrictemplate <class ToDuration, class Clock, class Duration>
2520b57cec5SDimitry Andric    constexpr time_point<Clock, ToDuration>
2530b57cec5SDimitry Andric    round(const time_point<Clock, Duration>& tp);                  // C++17
2540b57cec5SDimitry Andric
2550b57cec5SDimitry Andrictemplate <class Rep, class Period>
2560b57cec5SDimitry Andric    constexpr duration<Rep, Period> abs(duration<Rep, Period> d);  // C++17
2570b57cec5SDimitry Andric
2580b57cec5SDimitry Andric// Clocks
2590b57cec5SDimitry Andric
2600b57cec5SDimitry Andricclass system_clock
2610b57cec5SDimitry Andric{
2620b57cec5SDimitry Andricpublic:
2630b57cec5SDimitry Andric    typedef microseconds                     duration;
2640b57cec5SDimitry Andric    typedef duration::rep                    rep;
2650b57cec5SDimitry Andric    typedef duration::period                 period;
2660b57cec5SDimitry Andric    typedef chrono::time_point<system_clock> time_point;
2670b57cec5SDimitry Andric    static const bool is_steady =            false; // constexpr in C++14
2680b57cec5SDimitry Andric
2690b57cec5SDimitry Andric    static time_point now() noexcept;
2700b57cec5SDimitry Andric    static time_t     to_time_t  (const time_point& __t) noexcept;
2710b57cec5SDimitry Andric    static time_point from_time_t(time_t __t) noexcept;
2720b57cec5SDimitry Andric};
2730b57cec5SDimitry Andric
2740b57cec5SDimitry Andrictemplate <class Duration>
2750b57cec5SDimitry Andric  using sys_time  = time_point<system_clock, Duration>; // C++20
2760b57cec5SDimitry Andricusing sys_seconds = sys_time<seconds>;                  // C++20
2770b57cec5SDimitry Andricusing sys_days    = sys_time<days>;                     // C++20
2780b57cec5SDimitry Andric
279349cc55cSDimitry Andricclass file_clock                                        // C++20
280349cc55cSDimitry Andric{
281349cc55cSDimitry Andricpublic:
282349cc55cSDimitry Andric    typedef see-below                      rep;
283349cc55cSDimitry Andric    typedef nano                           period;
284349cc55cSDimitry Andric    typedef chrono::duration<rep, period>  duration;
285349cc55cSDimitry Andric    typedef chrono::time_point<file_clock> time_point;
286349cc55cSDimitry Andric    static constexpr bool is_steady =      false;
287349cc55cSDimitry Andric
288349cc55cSDimitry Andric    static time_point now() noexcept;
2890b57cec5SDimitry Andric
2900b57cec5SDimitry Andric    template<class Duration>
291349cc55cSDimitry Andric    static sys_time<see-below> to_sys(const file_time<Duration>&);
2920b57cec5SDimitry Andric
2930b57cec5SDimitry Andric    template<class Duration>
294349cc55cSDimitry Andric    static file_time<see-below> from_sys(const sys_time<Duration>&);
295349cc55cSDimitry Andric};
2960b57cec5SDimitry Andric
2970b57cec5SDimitry Andrictemplate<class Duration>
2980b57cec5SDimitry Andric  using file_time = time_point<file_clock, Duration>;   // C++20
2990b57cec5SDimitry Andric
3000b57cec5SDimitry Andricclass steady_clock
3010b57cec5SDimitry Andric{
3020b57cec5SDimitry Andricpublic:
3030b57cec5SDimitry Andric    typedef nanoseconds                                   duration;
3040b57cec5SDimitry Andric    typedef duration::rep                                 rep;
3050b57cec5SDimitry Andric    typedef duration::period                              period;
3060b57cec5SDimitry Andric    typedef chrono::time_point<steady_clock, duration>    time_point;
3070b57cec5SDimitry Andric    static const bool is_steady =                         true; // constexpr in C++14
3080b57cec5SDimitry Andric
3090b57cec5SDimitry Andric    static time_point now() noexcept;
3100b57cec5SDimitry Andric};
3110b57cec5SDimitry Andric
3120b57cec5SDimitry Andrictypedef steady_clock high_resolution_clock;
3130b57cec5SDimitry Andric
3140b57cec5SDimitry Andric// 25.7.8, local time           // C++20
3150b57cec5SDimitry Andricstruct local_t {};
3160b57cec5SDimitry Andrictemplate<class Duration>
3170b57cec5SDimitry Andric  using local_time  = time_point<local_t, Duration>;
3180b57cec5SDimitry Andricusing local_seconds = local_time<seconds>;
3190b57cec5SDimitry Andricusing local_days    = local_time<days>;
3200b57cec5SDimitry Andric
3210b57cec5SDimitry Andric// 25.8.2, class last_spec    // C++20
3220b57cec5SDimitry Andricstruct last_spec;
3230b57cec5SDimitry Andric
3240b57cec5SDimitry Andric// 25.8.3, class day          // C++20
3250b57cec5SDimitry Andric
3260b57cec5SDimitry Andricclass day;
3270b57cec5SDimitry Andricconstexpr bool operator==(const day& x, const day& y) noexcept;
3280b57cec5SDimitry Andricconstexpr bool operator!=(const day& x, const day& y) noexcept;
3290b57cec5SDimitry Andricconstexpr bool operator< (const day& x, const day& y) noexcept;
3300b57cec5SDimitry Andricconstexpr bool operator> (const day& x, const day& y) noexcept;
3310b57cec5SDimitry Andricconstexpr bool operator<=(const day& x, const day& y) noexcept;
3320b57cec5SDimitry Andricconstexpr bool operator>=(const day& x, const day& y) noexcept;
3330b57cec5SDimitry Andricconstexpr day  operator+(const day&  x, const days& y) noexcept;
3340b57cec5SDimitry Andricconstexpr day  operator+(const days& x, const day&  y) noexcept;
3350b57cec5SDimitry Andricconstexpr day  operator-(const day&  x, const days& y) noexcept;
3360b57cec5SDimitry Andricconstexpr days operator-(const day&  x, const day&  y) noexcept;
3370b57cec5SDimitry Andric
3380b57cec5SDimitry Andric// 25.8.4, class month    // C++20
3390b57cec5SDimitry Andricclass month;
3400b57cec5SDimitry Andricconstexpr bool operator==(const month& x, const month& y) noexcept;
3410b57cec5SDimitry Andricconstexpr bool operator!=(const month& x, const month& y) noexcept;
3420b57cec5SDimitry Andricconstexpr bool operator< (const month& x, const month& y) noexcept;
3430b57cec5SDimitry Andricconstexpr bool operator> (const month& x, const month& y) noexcept;
3440b57cec5SDimitry Andricconstexpr bool operator<=(const month& x, const month& y) noexcept;
3450b57cec5SDimitry Andricconstexpr bool operator>=(const month& x, const month& y) noexcept;
3460b57cec5SDimitry Andricconstexpr month  operator+(const month&  x, const months& y) noexcept;
3470b57cec5SDimitry Andricconstexpr month  operator+(const months& x,  const month& y) noexcept;
3480b57cec5SDimitry Andricconstexpr month  operator-(const month&  x, const months& y) noexcept;
3490b57cec5SDimitry Andricconstexpr months operator-(const month&  x,  const month& y) noexcept;
3500b57cec5SDimitry Andric
3510b57cec5SDimitry Andric// 25.8.5, class year    // C++20
3520b57cec5SDimitry Andricclass year;
3530b57cec5SDimitry Andricconstexpr bool operator==(const year& x, const year& y) noexcept;
3540b57cec5SDimitry Andricconstexpr bool operator!=(const year& x, const year& y) noexcept;
3550b57cec5SDimitry Andricconstexpr bool operator< (const year& x, const year& y) noexcept;
3560b57cec5SDimitry Andricconstexpr bool operator> (const year& x, const year& y) noexcept;
3570b57cec5SDimitry Andricconstexpr bool operator<=(const year& x, const year& y) noexcept;
3580b57cec5SDimitry Andricconstexpr bool operator>=(const year& x, const year& y) noexcept;
3590b57cec5SDimitry Andricconstexpr year  operator+(const year&  x, const years& y) noexcept;
3600b57cec5SDimitry Andricconstexpr year  operator+(const years& x, const year&  y) noexcept;
3610b57cec5SDimitry Andricconstexpr year  operator-(const year&  x, const years& y) noexcept;
3620b57cec5SDimitry Andricconstexpr years operator-(const year&  x, const year&  y) noexcept;
3630b57cec5SDimitry Andric
3640b57cec5SDimitry Andric// 25.8.6, class weekday    // C++20
3650b57cec5SDimitry Andricclass weekday;
3660b57cec5SDimitry Andric
3670b57cec5SDimitry Andricconstexpr bool operator==(const weekday& x, const weekday& y) noexcept;
3680b57cec5SDimitry Andricconstexpr bool operator!=(const weekday& x, const weekday& y) noexcept;
3690b57cec5SDimitry Andricconstexpr weekday operator+(const weekday& x, const days&    y) noexcept;
3700b57cec5SDimitry Andricconstexpr weekday operator+(const days&    x, const weekday& y) noexcept;
3710b57cec5SDimitry Andricconstexpr weekday operator-(const weekday& x, const days&    y) noexcept;
3720b57cec5SDimitry Andricconstexpr days    operator-(const weekday& x, const weekday& y) noexcept;
3730b57cec5SDimitry Andric
3740b57cec5SDimitry Andric// 25.8.7, class weekday_indexed    // C++20
3750b57cec5SDimitry Andric
3760b57cec5SDimitry Andricclass weekday_indexed;
3770b57cec5SDimitry Andricconstexpr bool operator==(const weekday_indexed& x, const weekday_indexed& y) noexcept;
3780b57cec5SDimitry Andricconstexpr bool operator!=(const weekday_indexed& x, const weekday_indexed& y) noexcept;
3790b57cec5SDimitry Andric
3800b57cec5SDimitry Andric// 25.8.8, class weekday_last    // C++20
3810b57cec5SDimitry Andricclass weekday_last;
3820b57cec5SDimitry Andric
3830b57cec5SDimitry Andricconstexpr bool operator==(const weekday_last& x, const weekday_last& y) noexcept;
3840b57cec5SDimitry Andricconstexpr bool operator!=(const weekday_last& x, const weekday_last& y) noexcept;
3850b57cec5SDimitry Andric
3860b57cec5SDimitry Andric// 25.8.9, class month_day    // C++20
3870b57cec5SDimitry Andricclass month_day;
3880b57cec5SDimitry Andric
3890b57cec5SDimitry Andricconstexpr bool operator==(const month_day& x, const month_day& y) noexcept;
3900b57cec5SDimitry Andricconstexpr bool operator!=(const month_day& x, const month_day& y) noexcept;
3910b57cec5SDimitry Andricconstexpr bool operator< (const month_day& x, const month_day& y) noexcept;
3920b57cec5SDimitry Andricconstexpr bool operator> (const month_day& x, const month_day& y) noexcept;
3930b57cec5SDimitry Andricconstexpr bool operator<=(const month_day& x, const month_day& y) noexcept;
3940b57cec5SDimitry Andricconstexpr bool operator>=(const month_day& x, const month_day& y) noexcept;
3950b57cec5SDimitry Andric
3960b57cec5SDimitry Andric
3970b57cec5SDimitry Andric// 25.8.10, class month_day_last    // C++20
3980b57cec5SDimitry Andricclass month_day_last;
3990b57cec5SDimitry Andric
4000b57cec5SDimitry Andricconstexpr bool operator==(const month_day_last& x, const month_day_last& y) noexcept;
4010b57cec5SDimitry Andricconstexpr bool operator!=(const month_day_last& x, const month_day_last& y) noexcept;
4020b57cec5SDimitry Andricconstexpr bool operator< (const month_day_last& x, const month_day_last& y) noexcept;
4030b57cec5SDimitry Andricconstexpr bool operator> (const month_day_last& x, const month_day_last& y) noexcept;
4040b57cec5SDimitry Andricconstexpr bool operator<=(const month_day_last& x, const month_day_last& y) noexcept;
4050b57cec5SDimitry Andricconstexpr bool operator>=(const month_day_last& x, const month_day_last& y) noexcept;
4060b57cec5SDimitry Andric
4070b57cec5SDimitry Andric// 25.8.11, class month_weekday    // C++20
4080b57cec5SDimitry Andricclass month_weekday;
4090b57cec5SDimitry Andric
4100b57cec5SDimitry Andricconstexpr bool operator==(const month_weekday& x, const month_weekday& y) noexcept;
4110b57cec5SDimitry Andricconstexpr bool operator!=(const month_weekday& x, const month_weekday& y) noexcept;
4120b57cec5SDimitry Andric
4130b57cec5SDimitry Andric// 25.8.12, class month_weekday_last    // C++20
4140b57cec5SDimitry Andricclass month_weekday_last;
4150b57cec5SDimitry Andric
4160b57cec5SDimitry Andricconstexpr bool operator==(const month_weekday_last& x, const month_weekday_last& y) noexcept;
4170b57cec5SDimitry Andricconstexpr bool operator!=(const month_weekday_last& x, const month_weekday_last& y) noexcept;
4180b57cec5SDimitry Andric
4190b57cec5SDimitry Andric
4200b57cec5SDimitry Andric// 25.8.13, class year_month    // C++20
4210b57cec5SDimitry Andricclass year_month;
4220b57cec5SDimitry Andric
4230b57cec5SDimitry Andricconstexpr bool operator==(const year_month& x, const year_month& y) noexcept;
4240b57cec5SDimitry Andricconstexpr bool operator!=(const year_month& x, const year_month& y) noexcept;
4250b57cec5SDimitry Andricconstexpr bool operator< (const year_month& x, const year_month& y) noexcept;
4260b57cec5SDimitry Andricconstexpr bool operator> (const year_month& x, const year_month& y) noexcept;
4270b57cec5SDimitry Andricconstexpr bool operator<=(const year_month& x, const year_month& y) noexcept;
4280b57cec5SDimitry Andricconstexpr bool operator>=(const year_month& x, const year_month& y) noexcept;
4290b57cec5SDimitry Andric
4300b57cec5SDimitry Andricconstexpr year_month operator+(const year_month& ym, const months& dm) noexcept;
4310b57cec5SDimitry Andricconstexpr year_month operator+(const months& dm, const year_month& ym) noexcept;
4320b57cec5SDimitry Andricconstexpr year_month operator-(const year_month& ym, const months& dm) noexcept;
4330b57cec5SDimitry Andricconstexpr months operator-(const year_month& x, const year_month& y) noexcept;
4340b57cec5SDimitry Andricconstexpr year_month operator+(const year_month& ym, const years& dy) noexcept;
4350b57cec5SDimitry Andricconstexpr year_month operator+(const years& dy, const year_month& ym) noexcept;
4360b57cec5SDimitry Andricconstexpr year_month operator-(const year_month& ym, const years& dy) noexcept;
4370b57cec5SDimitry Andric
4380b57cec5SDimitry Andric// 25.8.14, class year_month_day class    // C++20
4390b57cec5SDimitry Andricyear_month_day;
4400b57cec5SDimitry Andric
4410b57cec5SDimitry Andricconstexpr bool operator==(const year_month_day& x, const year_month_day& y) noexcept;
4420b57cec5SDimitry Andricconstexpr bool operator!=(const year_month_day& x, const year_month_day& y) noexcept;
4430b57cec5SDimitry Andricconstexpr bool operator< (const year_month_day& x, const year_month_day& y) noexcept;
4440b57cec5SDimitry Andricconstexpr bool operator> (const year_month_day& x, const year_month_day& y) noexcept;
4450b57cec5SDimitry Andricconstexpr bool operator<=(const year_month_day& x, const year_month_day& y) noexcept;
4460b57cec5SDimitry Andricconstexpr bool operator>=(const year_month_day& x, const year_month_day& y) noexcept;
4470b57cec5SDimitry Andric
4480b57cec5SDimitry Andricconstexpr year_month_day operator+(const year_month_day& ymd, const months& dm) noexcept;
4490b57cec5SDimitry Andricconstexpr year_month_day operator+(const months& dm, const year_month_day& ymd) noexcept;
4500b57cec5SDimitry Andricconstexpr year_month_day operator+(const year_month_day& ymd, const years& dy) noexcept;
4510b57cec5SDimitry Andricconstexpr year_month_day operator+(const years& dy, const year_month_day& ymd) noexcept;
4520b57cec5SDimitry Andricconstexpr year_month_day operator-(const year_month_day& ymd, const months& dm) noexcept;
4530b57cec5SDimitry Andricconstexpr year_month_day operator-(const year_month_day& ymd, const years& dy) noexcept;
4540b57cec5SDimitry Andric
4550b57cec5SDimitry Andric
4560b57cec5SDimitry Andric// 25.8.15, class year_month_day_last    // C++20
4570b57cec5SDimitry Andricclass year_month_day_last;
4580b57cec5SDimitry Andric
4590b57cec5SDimitry Andricconstexpr bool operator==(const year_month_day_last& x,
4600b57cec5SDimitry Andric                          const year_month_day_last& y) noexcept;
4610b57cec5SDimitry Andricconstexpr bool operator!=(const year_month_day_last& x,
4620b57cec5SDimitry Andric                          const year_month_day_last& y) noexcept;
4630b57cec5SDimitry Andricconstexpr bool operator< (const year_month_day_last& x,
4640b57cec5SDimitry Andric                          const year_month_day_last& y) noexcept;
4650b57cec5SDimitry Andricconstexpr bool operator> (const year_month_day_last& x,
4660b57cec5SDimitry Andric                          const year_month_day_last& y) noexcept;
4670b57cec5SDimitry Andricconstexpr bool operator<=(const year_month_day_last& x,
4680b57cec5SDimitry Andric                          const year_month_day_last& y) noexcept;
4690b57cec5SDimitry Andricconstexpr bool operator>=(const year_month_day_last& x,
4700b57cec5SDimitry Andric                          const year_month_day_last& y) noexcept;
4710b57cec5SDimitry Andric
4720b57cec5SDimitry Andricconstexpr year_month_day_last
4730b57cec5SDimitry Andric  operator+(const year_month_day_last& ymdl, const months& dm) noexcept;
4740b57cec5SDimitry Andricconstexpr year_month_day_last
4750b57cec5SDimitry Andric  operator+(const months& dm, const year_month_day_last& ymdl) noexcept;
4760b57cec5SDimitry Andricconstexpr year_month_day_last
4770b57cec5SDimitry Andric  operator+(const year_month_day_last& ymdl, const years& dy) noexcept;
4780b57cec5SDimitry Andricconstexpr year_month_day_last
4790b57cec5SDimitry Andric  operator+(const years& dy, const year_month_day_last& ymdl) noexcept;
4800b57cec5SDimitry Andricconstexpr year_month_day_last
4810b57cec5SDimitry Andric  operator-(const year_month_day_last& ymdl, const months& dm) noexcept;
4820b57cec5SDimitry Andricconstexpr year_month_day_last
4830b57cec5SDimitry Andric  operator-(const year_month_day_last& ymdl, const years& dy) noexcept;
4840b57cec5SDimitry Andric
4850b57cec5SDimitry Andric// 25.8.16, class year_month_weekday    // C++20
4860b57cec5SDimitry Andricclass year_month_weekday;
4870b57cec5SDimitry Andric
4880b57cec5SDimitry Andricconstexpr bool operator==(const year_month_weekday& x,
4890b57cec5SDimitry Andric                          const year_month_weekday& y) noexcept;
4900b57cec5SDimitry Andricconstexpr bool operator!=(const year_month_weekday& x,
4910b57cec5SDimitry Andric                          const year_month_weekday& y) noexcept;
4920b57cec5SDimitry Andric
4930b57cec5SDimitry Andricconstexpr year_month_weekday
4940b57cec5SDimitry Andric  operator+(const year_month_weekday& ymwd, const months& dm) noexcept;
4950b57cec5SDimitry Andricconstexpr year_month_weekday
4960b57cec5SDimitry Andric  operator+(const months& dm, const year_month_weekday& ymwd) noexcept;
4970b57cec5SDimitry Andricconstexpr year_month_weekday
4980b57cec5SDimitry Andric  operator+(const year_month_weekday& ymwd, const years& dy) noexcept;
4990b57cec5SDimitry Andricconstexpr year_month_weekday
5000b57cec5SDimitry Andric  operator+(const years& dy, const year_month_weekday& ymwd) noexcept;
5010b57cec5SDimitry Andricconstexpr year_month_weekday
5020b57cec5SDimitry Andric  operator-(const year_month_weekday& ymwd, const months& dm) noexcept;
5030b57cec5SDimitry Andricconstexpr year_month_weekday
5040b57cec5SDimitry Andric  operator-(const year_month_weekday& ymwd, const years& dy) noexcept;
5050b57cec5SDimitry Andric
5060b57cec5SDimitry Andric// 25.8.17, class year_month_weekday_last    // C++20
5070b57cec5SDimitry Andricclass year_month_weekday_last;
5080b57cec5SDimitry Andric
5090b57cec5SDimitry Andricconstexpr bool operator==(const year_month_weekday_last& x,
5100b57cec5SDimitry Andric                          const year_month_weekday_last& y) noexcept;
5110b57cec5SDimitry Andricconstexpr bool operator!=(const year_month_weekday_last& x,
5120b57cec5SDimitry Andric                          const year_month_weekday_last& y) noexcept;
5130b57cec5SDimitry Andricconstexpr year_month_weekday_last
5140b57cec5SDimitry Andric  operator+(const year_month_weekday_last& ymwdl, const months& dm) noexcept;
5150b57cec5SDimitry Andricconstexpr year_month_weekday_last
5160b57cec5SDimitry Andric  operator+(const months& dm, const year_month_weekday_last& ymwdl) noexcept;
5170b57cec5SDimitry Andricconstexpr year_month_weekday_last
5180b57cec5SDimitry Andric  operator+(const year_month_weekday_last& ymwdl, const years& dy) noexcept;
5190b57cec5SDimitry Andricconstexpr year_month_weekday_last
5200b57cec5SDimitry Andric  operator+(const years& dy, const year_month_weekday_last& ymwdl) noexcept;
5210b57cec5SDimitry Andricconstexpr year_month_weekday_last
5220b57cec5SDimitry Andric  operator-(const year_month_weekday_last& ymwdl, const months& dm) noexcept;
5230b57cec5SDimitry Andricconstexpr year_month_weekday_last
5240b57cec5SDimitry Andric  operator-(const year_month_weekday_last& ymwdl, const years& dy) noexcept;
5250b57cec5SDimitry Andric
5260b57cec5SDimitry Andric// 25.8.18, civil calendar conventional syntax operators    // C++20
5270b57cec5SDimitry Andricconstexpr year_month
5280b57cec5SDimitry Andric  operator/(const year& y, const month& m) noexcept;
5290b57cec5SDimitry Andricconstexpr year_month
5300b57cec5SDimitry Andric  operator/(const year& y, int m) noexcept;
5310b57cec5SDimitry Andricconstexpr month_day
5320b57cec5SDimitry Andric  operator/(const month& m, const day& d) noexcept;
5330b57cec5SDimitry Andricconstexpr month_day
5340b57cec5SDimitry Andric  operator/(const month& m, int d) noexcept;
5350b57cec5SDimitry Andricconstexpr month_day
5360b57cec5SDimitry Andric  operator/(int m, const day& d) noexcept;
5370b57cec5SDimitry Andricconstexpr month_day
5380b57cec5SDimitry Andric  operator/(const day& d, const month& m) noexcept;
5390b57cec5SDimitry Andricconstexpr month_day
5400b57cec5SDimitry Andric  operator/(const day& d, int m) noexcept;
5410b57cec5SDimitry Andricconstexpr month_day_last
5420b57cec5SDimitry Andric  operator/(const month& m, last_spec) noexcept;
5430b57cec5SDimitry Andricconstexpr month_day_last
5440b57cec5SDimitry Andric  operator/(int m, last_spec) noexcept;
5450b57cec5SDimitry Andricconstexpr month_day_last
5460b57cec5SDimitry Andric  operator/(last_spec, const month& m) noexcept;
5470b57cec5SDimitry Andricconstexpr month_day_last
5480b57cec5SDimitry Andric  operator/(last_spec, int m) noexcept;
5490b57cec5SDimitry Andricconstexpr month_weekday
5500b57cec5SDimitry Andric  operator/(const month& m, const weekday_indexed& wdi) noexcept;
5510b57cec5SDimitry Andricconstexpr month_weekday
5520b57cec5SDimitry Andric  operator/(int m, const weekday_indexed& wdi) noexcept;
5530b57cec5SDimitry Andricconstexpr month_weekday
5540b57cec5SDimitry Andric  operator/(const weekday_indexed& wdi, const month& m) noexcept;
5550b57cec5SDimitry Andricconstexpr month_weekday
5560b57cec5SDimitry Andric  operator/(const weekday_indexed& wdi, int m) noexcept;
5570b57cec5SDimitry Andricconstexpr month_weekday_last
5580b57cec5SDimitry Andric  operator/(const month& m, const weekday_last& wdl) noexcept;
5590b57cec5SDimitry Andricconstexpr month_weekday_last
5600b57cec5SDimitry Andric  operator/(int m, const weekday_last& wdl) noexcept;
5610b57cec5SDimitry Andricconstexpr month_weekday_last
5620b57cec5SDimitry Andric  operator/(const weekday_last& wdl, const month& m) noexcept;
5630b57cec5SDimitry Andricconstexpr month_weekday_last
5640b57cec5SDimitry Andric  operator/(const weekday_last& wdl, int m) noexcept;
5650b57cec5SDimitry Andricconstexpr year_month_day
5660b57cec5SDimitry Andric  operator/(const year_month& ym, const day& d) noexcept;
5670b57cec5SDimitry Andricconstexpr year_month_day
5680b57cec5SDimitry Andric  operator/(const year_month& ym, int d) noexcept;
5690b57cec5SDimitry Andricconstexpr year_month_day
5700b57cec5SDimitry Andric  operator/(const year& y, const month_day& md) noexcept;
5710b57cec5SDimitry Andricconstexpr year_month_day
5720b57cec5SDimitry Andric  operator/(int y, const month_day& md) noexcept;
5730b57cec5SDimitry Andricconstexpr year_month_day
5740b57cec5SDimitry Andric  operator/(const month_day& md, const year& y) noexcept;
5750b57cec5SDimitry Andricconstexpr year_month_day
5760b57cec5SDimitry Andric  operator/(const month_day& md, int y) noexcept;
5770b57cec5SDimitry Andricconstexpr year_month_day_last
5780b57cec5SDimitry Andric  operator/(const year_month& ym, last_spec) noexcept;
5790b57cec5SDimitry Andricconstexpr year_month_day_last
5800b57cec5SDimitry Andric  operator/(const year& y, const month_day_last& mdl) noexcept;
5810b57cec5SDimitry Andricconstexpr year_month_day_last
5820b57cec5SDimitry Andric  operator/(int y, const month_day_last& mdl) noexcept;
5830b57cec5SDimitry Andricconstexpr year_month_day_last
5840b57cec5SDimitry Andric  operator/(const month_day_last& mdl, const year& y) noexcept;
5850b57cec5SDimitry Andricconstexpr year_month_day_last
5860b57cec5SDimitry Andric  operator/(const month_day_last& mdl, int y) noexcept;
5870b57cec5SDimitry Andricconstexpr year_month_weekday
5880b57cec5SDimitry Andric  operator/(const year_month& ym, const weekday_indexed& wdi) noexcept;
5890b57cec5SDimitry Andricconstexpr year_month_weekday
5900b57cec5SDimitry Andric  operator/(const year& y, const month_weekday& mwd) noexcept;
5910b57cec5SDimitry Andricconstexpr year_month_weekday
5920b57cec5SDimitry Andric  operator/(int y, const month_weekday& mwd) noexcept;
5930b57cec5SDimitry Andricconstexpr year_month_weekday
5940b57cec5SDimitry Andric  operator/(const month_weekday& mwd, const year& y) noexcept;
5950b57cec5SDimitry Andricconstexpr year_month_weekday
5960b57cec5SDimitry Andric  operator/(const month_weekday& mwd, int y) noexcept;
5970b57cec5SDimitry Andricconstexpr year_month_weekday_last
5980b57cec5SDimitry Andric  operator/(const year_month& ym, const weekday_last& wdl) noexcept;
5990b57cec5SDimitry Andricconstexpr year_month_weekday_last
6000b57cec5SDimitry Andric  operator/(const year& y, const month_weekday_last& mwdl) noexcept;
6010b57cec5SDimitry Andricconstexpr year_month_weekday_last
6020b57cec5SDimitry Andric  operator/(int y, const month_weekday_last& mwdl) noexcept;
6030b57cec5SDimitry Andricconstexpr year_month_weekday_last
6040b57cec5SDimitry Andric  operator/(const month_weekday_last& mwdl, const year& y) noexcept;
6050b57cec5SDimitry Andricconstexpr year_month_weekday_last
6060b57cec5SDimitry Andric  operator/(const month_weekday_last& mwdl, int y) noexcept;
6070b57cec5SDimitry Andric
608e40139ffSDimitry Andric// 26.9, class template hh_mm_ss
609e40139ffSDimitry Andrictemplate <class Duration>
610e40139ffSDimitry Andricclass hh_mm_ss
611e40139ffSDimitry Andric{
612e40139ffSDimitry Andric    bool            is_neg; // exposition only
613e40139ffSDimitry Andric    chrono::hours   h;      // exposition only
614e40139ffSDimitry Andric    chrono::minutes m;      // exposition only
615e40139ffSDimitry Andric    chrono::seconds s;      // exposition only
616e40139ffSDimitry Andric    precision       ss;     // exposition only
6170b57cec5SDimitry Andric
618e40139ffSDimitry Andricpublic:
619e40139ffSDimitry Andric    static unsigned constexpr fractional_width = see below;
620e40139ffSDimitry Andric    using precision                            = see below;
621e40139ffSDimitry Andric
622e40139ffSDimitry Andric    constexpr hh_mm_ss() noexcept : hh_mm_ss{Duration::zero()} {}
623e40139ffSDimitry Andric    constexpr explicit hh_mm_ss(Duration d) noexcept;
624e40139ffSDimitry Andric
625e40139ffSDimitry Andric    constexpr bool is_negative() const noexcept;
626e40139ffSDimitry Andric    constexpr chrono::hours hours() const noexcept;
627e40139ffSDimitry Andric    constexpr chrono::minutes minutes() const noexcept;
628e40139ffSDimitry Andric    constexpr chrono::seconds seconds() const noexcept;
629e40139ffSDimitry Andric    constexpr precision subseconds() const noexcept;
630e40139ffSDimitry Andric
631e40139ffSDimitry Andric    constexpr explicit operator  precision()   const noexcept;
632e40139ffSDimitry Andric    constexpr          precision to_duration() const noexcept;
633e40139ffSDimitry Andric};
634e40139ffSDimitry Andric
635e40139ffSDimitry Andric// 26.10, 12/24 hour functions
636e40139ffSDimitry Andricconstexpr bool is_am(hours const& h) noexcept;
637e40139ffSDimitry Andricconstexpr bool is_pm(hours const& h) noexcept;
638e40139ffSDimitry Andricconstexpr hours make12(const hours& h) noexcept;
639e40139ffSDimitry Andricconstexpr hours make24(const hours& h, bool is_pm) noexcept;
640e40139ffSDimitry Andric
6410b57cec5SDimitry Andric// 25.10.5, class time_zone    // C++20
6420b57cec5SDimitry Andricenum class choose {earliest, latest};
6430b57cec5SDimitry Andricclass time_zone;
6440b57cec5SDimitry Andricbool operator==(const time_zone& x, const time_zone& y) noexcept;
6450b57cec5SDimitry Andricbool operator!=(const time_zone& x, const time_zone& y) noexcept;
6460b57cec5SDimitry Andricbool operator<(const time_zone& x, const time_zone& y) noexcept;
6470b57cec5SDimitry Andricbool operator>(const time_zone& x, const time_zone& y) noexcept;
6480b57cec5SDimitry Andricbool operator<=(const time_zone& x, const time_zone& y) noexcept;
6490b57cec5SDimitry Andricbool operator>=(const time_zone& x, const time_zone& y) noexcept;
6500b57cec5SDimitry Andric
6510b57cec5SDimitry Andric// calendrical constants
6520b57cec5SDimitry Andricinline constexpr last_spec                              last{};       // C++20
6530b57cec5SDimitry Andricinline constexpr chrono::weekday                        Sunday{0};    // C++20
6540b57cec5SDimitry Andricinline constexpr chrono::weekday                        Monday{1};    // C++20
6550b57cec5SDimitry Andricinline constexpr chrono::weekday                        Tuesday{2};   // C++20
6560b57cec5SDimitry Andricinline constexpr chrono::weekday                        Wednesday{3}; // C++20
6570b57cec5SDimitry Andricinline constexpr chrono::weekday                        Thursday{4};  // C++20
6580b57cec5SDimitry Andricinline constexpr chrono::weekday                        Friday{5};    // C++20
6590b57cec5SDimitry Andricinline constexpr chrono::weekday                        Saturday{6};  // C++20
6600b57cec5SDimitry Andric
6610b57cec5SDimitry Andricinline constexpr chrono::month                          January{1};   // C++20
6620b57cec5SDimitry Andricinline constexpr chrono::month                          February{2};  // C++20
6630b57cec5SDimitry Andricinline constexpr chrono::month                          March{3};     // C++20
6640b57cec5SDimitry Andricinline constexpr chrono::month                          April{4};     // C++20
6650b57cec5SDimitry Andricinline constexpr chrono::month                          May{5};       // C++20
6660b57cec5SDimitry Andricinline constexpr chrono::month                          June{6};      // C++20
6670b57cec5SDimitry Andricinline constexpr chrono::month                          July{7};      // C++20
6680b57cec5SDimitry Andricinline constexpr chrono::month                          August{8};    // C++20
6690b57cec5SDimitry Andricinline constexpr chrono::month                          September{9}; // C++20
6700b57cec5SDimitry Andricinline constexpr chrono::month                          October{10};  // C++20
6710b57cec5SDimitry Andricinline constexpr chrono::month                          November{11}; // C++20
6720b57cec5SDimitry Andricinline constexpr chrono::month                          December{12}; // C++20
6730b57cec5SDimitry Andric}  // chrono
6740b57cec5SDimitry Andric
6750b57cec5SDimitry Andricinline namespace literals {
6760b57cec5SDimitry Andric  inline namespace chrono_literals {
6770b57cec5SDimitry Andricconstexpr chrono::hours                                 operator ""h(unsigned long long); // C++14
6780b57cec5SDimitry Andricconstexpr chrono::duration<unspecified , ratio<3600,1>> operator ""h(long double); // C++14
6790b57cec5SDimitry Andricconstexpr chrono::minutes                               operator ""min(unsigned long long); // C++14
6800b57cec5SDimitry Andricconstexpr chrono::duration<unspecified , ratio<60,1>>   operator ""min(long double); // C++14
6810b57cec5SDimitry Andricconstexpr chrono::seconds                               operator ""s(unsigned long long); // C++14
6820b57cec5SDimitry Andricconstexpr chrono::duration<unspecified >                operator ""s(long double); // C++14
6830b57cec5SDimitry Andricconstexpr chrono::milliseconds                          operator ""ms(unsigned long long); // C++14
6840b57cec5SDimitry Andricconstexpr chrono::duration<unspecified , milli>         operator ""ms(long double); // C++14
6850b57cec5SDimitry Andricconstexpr chrono::microseconds                          operator ""us(unsigned long long); // C++14
6860b57cec5SDimitry Andricconstexpr chrono::duration<unspecified , micro>         operator ""us(long double); // C++14
6870b57cec5SDimitry Andricconstexpr chrono::nanoseconds                           operator ""ns(unsigned long long); // C++14
6880b57cec5SDimitry Andricconstexpr chrono::duration<unspecified , nano>          operator ""ns(long double); // C++14
6890b57cec5SDimitry Andricconstexpr chrono::day                                   operator ""d(unsigned long long d) noexcept; // C++20
6900b57cec5SDimitry Andricconstexpr chrono::year                                  operator ""y(unsigned long long y) noexcept; // C++20
6910b57cec5SDimitry Andric}  // chrono_literals
6920b57cec5SDimitry Andric}  // literals
6930b57cec5SDimitry Andric
6940b57cec5SDimitry Andric}  // std
6950b57cec5SDimitry Andric*/
6960b57cec5SDimitry Andric
697*81ad6265SDimitry Andric#include <__assert> // all public C++ headers provide the assertion handler
69804eeddc0SDimitry Andric#include <__chrono/calendar.h>
69904eeddc0SDimitry Andric#include <__chrono/convert_to_timespec.h>
700*81ad6265SDimitry Andric#include <__chrono/day.h>
70104eeddc0SDimitry Andric#include <__chrono/duration.h>
70204eeddc0SDimitry Andric#include <__chrono/file_clock.h>
703*81ad6265SDimitry Andric#include <__chrono/hh_mm_ss.h>
70404eeddc0SDimitry Andric#include <__chrono/high_resolution_clock.h>
705*81ad6265SDimitry Andric#include <__chrono/literals.h>
706*81ad6265SDimitry Andric#include <__chrono/month.h>
707*81ad6265SDimitry Andric#include <__chrono/month_weekday.h>
708*81ad6265SDimitry Andric#include <__chrono/monthday.h>
70904eeddc0SDimitry Andric#include <__chrono/steady_clock.h>
71004eeddc0SDimitry Andric#include <__chrono/system_clock.h>
71104eeddc0SDimitry Andric#include <__chrono/time_point.h>
712*81ad6265SDimitry Andric#include <__chrono/weekday.h>
713*81ad6265SDimitry Andric#include <__chrono/year.h>
714*81ad6265SDimitry Andric#include <__chrono/year_month.h>
715*81ad6265SDimitry Andric#include <__chrono/year_month_day.h>
716*81ad6265SDimitry Andric#include <__chrono/year_month_weekday.h>
717fe6060f1SDimitry Andric#include <__config>
718fe6060f1SDimitry Andric#include <compare>
7190b57cec5SDimitry Andric#include <version>
7200b57cec5SDimitry Andric
7210b57cec5SDimitry Andric#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
7220b57cec5SDimitry Andric#  pragma GCC system_header
7230b57cec5SDimitry Andric#endif
7240b57cec5SDimitry Andric
7250b57cec5SDimitry Andric#endif // _LIBCPP_CHRONO
726