xref: /freebsd/contrib/llvm-project/libcxx/include/chrono (revision 5f757f3ff9144b609b3c433dfd370cc6bdc191ad)
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
13*5f757f3fSDimitry Andric// clang-format off
14*5f757f3fSDimitry Andric
150b57cec5SDimitry Andric/*
160b57cec5SDimitry Andric    chrono synopsis
170b57cec5SDimitry Andric
18753f127fSDimitry Andric#include <compare> // C++20
19753f127fSDimitry Andric
200b57cec5SDimitry Andricnamespace std
210b57cec5SDimitry Andric{
220b57cec5SDimitry Andricnamespace chrono
230b57cec5SDimitry Andric{
240b57cec5SDimitry Andric
250b57cec5SDimitry Andrictemplate <class ToDuration, class Rep, class Period>
260b57cec5SDimitry Andricconstexpr
270b57cec5SDimitry AndricToDuration
280b57cec5SDimitry Andricduration_cast(const duration<Rep, Period>& fd);
290b57cec5SDimitry Andric
300b57cec5SDimitry Andrictemplate <class Rep> struct treat_as_floating_point : is_floating_point<Rep> {};
310b57cec5SDimitry Andric
320b57cec5SDimitry Andrictemplate <class Rep> inline constexpr bool treat_as_floating_point_v
330b57cec5SDimitry Andric    = treat_as_floating_point<Rep>::value;                       // C++17
340b57cec5SDimitry Andric
350b57cec5SDimitry Andrictemplate <class Rep>
360b57cec5SDimitry Andricstruct duration_values
370b57cec5SDimitry Andric{
380b57cec5SDimitry Andricpublic:
390b57cec5SDimitry Andric    static constexpr Rep zero(); // noexcept in C++20
400b57cec5SDimitry Andric    static constexpr Rep max();  // noexcept in C++20
410b57cec5SDimitry Andric    static constexpr Rep min();  // noexcept in C++20
420b57cec5SDimitry Andric};
430b57cec5SDimitry Andric
440b57cec5SDimitry Andric// duration
450b57cec5SDimitry Andric
460b57cec5SDimitry Andrictemplate <class Rep, class Period = ratio<1>>
470b57cec5SDimitry Andricclass duration
480b57cec5SDimitry Andric{
490b57cec5SDimitry Andric    static_assert(!__is_duration<Rep>::value, "A duration representation can not be a duration");
500b57cec5SDimitry Andric    static_assert(__is_ratio<Period>::value, "Second template parameter of duration must be a std::ratio");
510b57cec5SDimitry Andric    static_assert(Period::num > 0, "duration period must be positive");
520b57cec5SDimitry Andricpublic:
530b57cec5SDimitry Andric    typedef Rep rep;
540b57cec5SDimitry Andric    typedef typename _Period::type period;
550b57cec5SDimitry Andric
560b57cec5SDimitry Andric    constexpr duration() = default;
570b57cec5SDimitry Andric    template <class Rep2>
580b57cec5SDimitry Andric        constexpr explicit duration(const Rep2& r,
590b57cec5SDimitry Andric            typename enable_if
600b57cec5SDimitry Andric            <
610b57cec5SDimitry Andric               is_convertible<Rep2, rep>::value &&
620b57cec5SDimitry Andric               (treat_as_floating_point<rep>::value ||
630b57cec5SDimitry Andric               !treat_as_floating_point<rep>::value && !treat_as_floating_point<Rep2>::value)
640b57cec5SDimitry Andric            >::type* = 0);
650b57cec5SDimitry Andric
660b57cec5SDimitry Andric    // conversions
670b57cec5SDimitry Andric    template <class Rep2, class Period2>
680b57cec5SDimitry Andric        constexpr duration(const duration<Rep2, Period2>& d,
690b57cec5SDimitry Andric            typename enable_if
700b57cec5SDimitry Andric            <
710b57cec5SDimitry Andric                treat_as_floating_point<rep>::value ||
720b57cec5SDimitry Andric                ratio_divide<Period2, period>::type::den == 1
730b57cec5SDimitry Andric            >::type* = 0);
740b57cec5SDimitry Andric
750b57cec5SDimitry Andric    // observer
760b57cec5SDimitry Andric
770b57cec5SDimitry Andric    constexpr rep count() const;
780b57cec5SDimitry Andric
790b57cec5SDimitry Andric    // arithmetic
800b57cec5SDimitry Andric
810b57cec5SDimitry Andric    constexpr common_type<duration>::type  operator+() const;
820b57cec5SDimitry Andric    constexpr common_type<duration>::type  operator-() const;
830b57cec5SDimitry Andric    constexpr duration& operator++();    // constexpr in C++17
840b57cec5SDimitry Andric    constexpr duration  operator++(int); // constexpr in C++17
850b57cec5SDimitry Andric    constexpr duration& operator--();    // constexpr in C++17
860b57cec5SDimitry Andric    constexpr duration  operator--(int); // constexpr in C++17
870b57cec5SDimitry Andric
880b57cec5SDimitry Andric    constexpr duration& operator+=(const duration& d);  // constexpr in C++17
890b57cec5SDimitry Andric    constexpr duration& operator-=(const duration& d);  // constexpr in C++17
900b57cec5SDimitry Andric
910b57cec5SDimitry Andric    duration& operator*=(const rep& rhs);       // constexpr in C++17
920b57cec5SDimitry Andric    duration& operator/=(const rep& rhs);       // constexpr in C++17
930b57cec5SDimitry Andric    duration& operator%=(const rep& rhs);       // constexpr in C++17
940b57cec5SDimitry Andric    duration& operator%=(const duration& rhs);  // constexpr in C++17
950b57cec5SDimitry Andric
960b57cec5SDimitry Andric    // special values
970b57cec5SDimitry Andric
980b57cec5SDimitry Andric    static constexpr duration zero(); // noexcept in C++20
990b57cec5SDimitry Andric    static constexpr duration min();  // noexcept in C++20
1000b57cec5SDimitry Andric    static constexpr duration max();  // noexcept in C++20
1010b57cec5SDimitry Andric};
1020b57cec5SDimitry Andric
1030b57cec5SDimitry Andrictypedef duration<long long,         nano> nanoseconds;
1040b57cec5SDimitry Andrictypedef duration<long long,        micro> microseconds;
1050b57cec5SDimitry Andrictypedef duration<long long,        milli> milliseconds;
1060b57cec5SDimitry Andrictypedef duration<long long              > seconds;
1070b57cec5SDimitry Andrictypedef duration<     long, ratio<  60> > minutes;
1080b57cec5SDimitry Andrictypedef duration<     long, ratio<3600> > hours;
1090b57cec5SDimitry Andric
1100b57cec5SDimitry Andrictemplate <class Clock, class Duration = typename Clock::duration>
1110b57cec5SDimitry Andricclass time_point
1120b57cec5SDimitry Andric{
1130b57cec5SDimitry Andricpublic:
1140b57cec5SDimitry Andric    typedef Clock                     clock;
1150b57cec5SDimitry Andric    typedef Duration                  duration;
1160b57cec5SDimitry Andric    typedef typename duration::rep    rep;
1170b57cec5SDimitry Andric    typedef typename duration::period period;
1180b57cec5SDimitry Andricprivate:
1190b57cec5SDimitry Andric    duration d_;  // exposition only
1200b57cec5SDimitry Andric
1210b57cec5SDimitry Andricpublic:
1220b57cec5SDimitry Andric    time_point();  // has value "epoch" // constexpr in C++14
1230b57cec5SDimitry Andric    explicit time_point(const duration& d);  // same as time_point() + d // constexpr in C++14
1240b57cec5SDimitry Andric
1250b57cec5SDimitry Andric    // conversions
1260b57cec5SDimitry Andric    template <class Duration2>
1270b57cec5SDimitry Andric       time_point(const time_point<clock, Duration2>& t); // constexpr in C++14
1280b57cec5SDimitry Andric
1290b57cec5SDimitry Andric    // observer
1300b57cec5SDimitry Andric
1310b57cec5SDimitry Andric    duration time_since_epoch() const; // constexpr in C++14
1320b57cec5SDimitry Andric
1330b57cec5SDimitry Andric    // arithmetic
1340b57cec5SDimitry Andric
1350b57cec5SDimitry Andric    time_point& operator+=(const duration& d); // constexpr in C++17
1360b57cec5SDimitry Andric    time_point& operator-=(const duration& d); // constexpr in C++17
1370b57cec5SDimitry Andric
1380b57cec5SDimitry Andric    // special values
1390b57cec5SDimitry Andric
1400b57cec5SDimitry Andric    static constexpr time_point min();  // noexcept in C++20
1410b57cec5SDimitry Andric    static constexpr time_point max();  // noexcept in C++20
1420b57cec5SDimitry Andric};
1430b57cec5SDimitry Andric
1440b57cec5SDimitry Andric} // chrono
1450b57cec5SDimitry Andric
1460b57cec5SDimitry Andric// common_type traits
1470b57cec5SDimitry Andrictemplate <class Rep1, class Period1, class Rep2, class Period2>
1480b57cec5SDimitry Andric  struct common_type<chrono::duration<Rep1, Period1>, chrono::duration<Rep2, Period2>>;
1490b57cec5SDimitry Andric
1500b57cec5SDimitry Andrictemplate <class Clock, class Duration1, class Duration2>
1510b57cec5SDimitry Andric  struct common_type<chrono::time_point<Clock, Duration1>, chrono::time_point<Clock, Duration2>>;
1520b57cec5SDimitry Andric
1530b57cec5SDimitry Andricnamespace chrono {
1540b57cec5SDimitry Andric
1550b57cec5SDimitry Andric// duration arithmetic
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 Period1, class Rep2, class Period2>
1610b57cec5SDimitry Andric  constexpr
1620b57cec5SDimitry Andric  typename common_type<duration<Rep1, Period1>, duration<Rep2, Period2>>::type
1630b57cec5SDimitry Andric  operator-(const duration<Rep1, Period1>& lhs, const duration<Rep2, Period2>& rhs);
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 duration<Rep1, Period>& d, const Rep2& s);
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 Rep1& s, const duration<Rep2, Period>& d);
1720b57cec5SDimitry Andrictemplate <class Rep1, class Period, class Rep2>
1730b57cec5SDimitry Andric  constexpr
1740b57cec5SDimitry Andric  duration<typename common_type<Rep1, Rep2>::type, Period>
1750b57cec5SDimitry Andric  operator/(const duration<Rep1, Period>& d, const Rep2& s);
1760b57cec5SDimitry Andrictemplate <class Rep1, class Period1, class Rep2, class Period2>
1770b57cec5SDimitry Andric  constexpr
1780b57cec5SDimitry Andric  typename common_type<Rep1, Rep2>::type
1790b57cec5SDimitry Andric  operator/(const duration<Rep1, Period1>& lhs, const duration<Rep2, Period2>& rhs);
1800b57cec5SDimitry Andric
1810b57cec5SDimitry Andric// duration comparisons
1820b57cec5SDimitry Andrictemplate <class Rep1, class Period1, class Rep2, class Period2>
1830b57cec5SDimitry Andric   constexpr
1840b57cec5SDimitry Andric   bool operator==(const duration<Rep1, Period1>& lhs, const duration<Rep2, Period2>& rhs);
1850b57cec5SDimitry Andrictemplate <class Rep1, class Period1, class Rep2, class Period2>
1860b57cec5SDimitry Andric   constexpr
18706c3fb27SDimitry Andric   bool operator!=(const duration<Rep1, Period1>& lhs, const duration<Rep2, Period2>& rhs); // removed in C++20
1880b57cec5SDimitry Andrictemplate <class Rep1, class Period1, class Rep2, class Period2>
1890b57cec5SDimitry Andric   constexpr
1900b57cec5SDimitry Andric   bool operator< (const duration<Rep1, Period1>& lhs, const duration<Rep2, Period2>& rhs);
1910b57cec5SDimitry Andrictemplate <class Rep1, class Period1, class Rep2, class Period2>
1920b57cec5SDimitry Andric   constexpr
1930b57cec5SDimitry Andric   bool operator<=(const duration<Rep1, Period1>& lhs, const duration<Rep2, Period2>& rhs);
1940b57cec5SDimitry Andrictemplate <class Rep1, class Period1, class Rep2, class Period2>
1950b57cec5SDimitry Andric   constexpr
1960b57cec5SDimitry Andric   bool operator> (const duration<Rep1, Period1>& lhs, const duration<Rep2, Period2>& rhs);
1970b57cec5SDimitry Andrictemplate <class Rep1, class Period1, class Rep2, class Period2>
1980b57cec5SDimitry Andric   constexpr
1990b57cec5SDimitry Andric   bool operator>=(const duration<Rep1, Period1>& lhs, const duration<Rep2, Period2>& rhs);
20006c3fb27SDimitry Andrictemplate<class Rep1, class Period1, class Rep2, class Period2>
20106c3fb27SDimitry Andric  requires three_way_comparable<typename CT::rep>
20206c3fb27SDimitry Andric  constexpr auto operator<=>(const duration<Rep1, Period1>& lhs,
20306c3fb27SDimitry Andric                             const duration<Rep2, Period2>& rhs);                           // since C++20
2040b57cec5SDimitry Andric
2050b57cec5SDimitry Andric// duration_cast
2060b57cec5SDimitry Andrictemplate <class ToDuration, class Rep, class Period>
2070b57cec5SDimitry Andric  ToDuration duration_cast(const duration<Rep, Period>& d);
2080b57cec5SDimitry Andric
2090b57cec5SDimitry Andrictemplate <class ToDuration, class Rep, class Period>
2100b57cec5SDimitry Andric    constexpr ToDuration floor(const duration<Rep, Period>& d);    // C++17
2110b57cec5SDimitry Andrictemplate <class ToDuration, class Rep, class Period>
2120b57cec5SDimitry Andric    constexpr ToDuration ceil(const duration<Rep, Period>& d);     // C++17
2130b57cec5SDimitry Andrictemplate <class ToDuration, class Rep, class Period>
2140b57cec5SDimitry Andric    constexpr ToDuration round(const duration<Rep, Period>& d);    // C++17
2150b57cec5SDimitry Andric
216bdd1243dSDimitry Andric// duration I/O
217bdd1243dSDimitry Andrictemplate<class charT, class traits, class Rep, class Period>       // C++20
218bdd1243dSDimitry Andric  basic_ostream<charT, traits>&
219bdd1243dSDimitry Andric    operator<<(basic_ostream<charT, traits>& os,
220bdd1243dSDimitry Andric               const duration<Rep, Period>& d);
2210b57cec5SDimitry Andric
2220b57cec5SDimitry Andric// time_point arithmetic (all constexpr in C++14)
2230b57cec5SDimitry Andrictemplate <class Clock, class Duration1, class Rep2, class Period2>
2240b57cec5SDimitry Andric  time_point<Clock, typename common_type<Duration1, duration<Rep2, Period2>>::type>
2250b57cec5SDimitry Andric  operator+(const time_point<Clock, Duration1>& lhs, const duration<Rep2, Period2>& rhs);
2260b57cec5SDimitry Andrictemplate <class Rep1, class Period1, class Clock, class Duration2>
2270b57cec5SDimitry Andric  time_point<Clock, typename common_type<duration<Rep1, Period1>, Duration2>::type>
2280b57cec5SDimitry Andric  operator+(const duration<Rep1, Period1>& lhs, const time_point<Clock, Duration2>& rhs);
2290b57cec5SDimitry Andrictemplate <class Clock, class Duration1, class Rep2, class Period2>
2300b57cec5SDimitry Andric  time_point<Clock, typename common_type<Duration1, duration<Rep2, Period2>>::type>
2310b57cec5SDimitry Andric  operator-(const time_point<Clock, Duration1>& lhs, const duration<Rep2, Period2>& rhs);
2320b57cec5SDimitry Andrictemplate <class Clock, class Duration1, class Duration2>
2330b57cec5SDimitry Andric  typename common_type<Duration1, Duration2>::type
2340b57cec5SDimitry Andric  operator-(const time_point<Clock, Duration1>& lhs, const time_point<Clock, Duration2>& rhs);
2350b57cec5SDimitry Andric
2360b57cec5SDimitry Andric// time_point comparisons (all constexpr in C++14)
2370b57cec5SDimitry Andrictemplate <class Clock, class Duration1, class Duration2>
2380b57cec5SDimitry Andric   bool operator==(const time_point<Clock, Duration1>& lhs, const time_point<Clock, Duration2>& rhs);
2390b57cec5SDimitry Andrictemplate <class Clock, class Duration1, class Duration2>
24006c3fb27SDimitry Andric   bool operator!=(const time_point<Clock, Duration1>& lhs, const time_point<Clock, Duration2>& rhs); // removed in C++20
2410b57cec5SDimitry Andrictemplate <class Clock, class Duration1, class Duration2>
2420b57cec5SDimitry Andric   bool operator< (const time_point<Clock, Duration1>& lhs, const time_point<Clock, Duration2>& rhs);
2430b57cec5SDimitry Andrictemplate <class Clock, class Duration1, class Duration2>
2440b57cec5SDimitry Andric   bool operator<=(const time_point<Clock, Duration1>& lhs, const time_point<Clock, Duration2>& rhs);
2450b57cec5SDimitry Andrictemplate <class Clock, class Duration1, class Duration2>
2460b57cec5SDimitry Andric   bool operator> (const time_point<Clock, Duration1>& lhs, const time_point<Clock, Duration2>& rhs);
2470b57cec5SDimitry Andrictemplate <class Clock, class Duration1, class Duration2>
2480b57cec5SDimitry Andric   bool operator>=(const time_point<Clock, Duration1>& lhs, const time_point<Clock, Duration2>& rhs);
24906c3fb27SDimitry Andrictemplate<class Clock, class Duration1,
25006c3fb27SDimitry Andric         three_way_comparable_with<Duration1> Duration2>
25106c3fb27SDimitry Andric  constexpr auto operator<=>(const time_point<Clock, Duration1>& lhs,
25206c3fb27SDimitry Andric                             const time_point<Clock, Duration2>& rhs);                                // since C++20
2530b57cec5SDimitry Andric
2540b57cec5SDimitry Andric// time_point_cast (constexpr in C++14)
2550b57cec5SDimitry Andric
2560b57cec5SDimitry Andrictemplate <class ToDuration, class Clock, class Duration>
2570b57cec5SDimitry Andric  time_point<Clock, ToDuration> time_point_cast(const time_point<Clock, Duration>& t);
2580b57cec5SDimitry Andric
2590b57cec5SDimitry Andrictemplate <class ToDuration, class Clock, class Duration>
2600b57cec5SDimitry Andric    constexpr time_point<Clock, ToDuration>
2610b57cec5SDimitry Andric    floor(const time_point<Clock, Duration>& tp);                  // C++17
2620b57cec5SDimitry Andric
2630b57cec5SDimitry Andrictemplate <class ToDuration, class Clock, class Duration>
2640b57cec5SDimitry Andric    constexpr time_point<Clock, ToDuration>
2650b57cec5SDimitry Andric    ceil(const time_point<Clock, Duration>& tp);                   // C++17
2660b57cec5SDimitry Andric
2670b57cec5SDimitry Andrictemplate <class ToDuration, class Clock, class Duration>
2680b57cec5SDimitry Andric    constexpr time_point<Clock, ToDuration>
2690b57cec5SDimitry Andric    round(const time_point<Clock, Duration>& tp);                  // C++17
2700b57cec5SDimitry Andric
2710b57cec5SDimitry Andrictemplate <class Rep, class Period>
2720b57cec5SDimitry Andric    constexpr duration<Rep, Period> abs(duration<Rep, Period> d);  // C++17
2730b57cec5SDimitry Andric
2740b57cec5SDimitry Andric// Clocks
2750b57cec5SDimitry Andric
2760b57cec5SDimitry Andricclass system_clock
2770b57cec5SDimitry Andric{
2780b57cec5SDimitry Andricpublic:
2790b57cec5SDimitry Andric    typedef microseconds                     duration;
2800b57cec5SDimitry Andric    typedef duration::rep                    rep;
2810b57cec5SDimitry Andric    typedef duration::period                 period;
2820b57cec5SDimitry Andric    typedef chrono::time_point<system_clock> time_point;
2830b57cec5SDimitry Andric    static const bool is_steady =            false; // constexpr in C++14
2840b57cec5SDimitry Andric
2850b57cec5SDimitry Andric    static time_point now() noexcept;
2860b57cec5SDimitry Andric    static time_t     to_time_t  (const time_point& __t) noexcept;
2870b57cec5SDimitry Andric    static time_point from_time_t(time_t __t) noexcept;
2880b57cec5SDimitry Andric};
2890b57cec5SDimitry Andric
2900b57cec5SDimitry Andrictemplate <class Duration>
2910b57cec5SDimitry Andric  using sys_time  = time_point<system_clock, Duration>; // C++20
2920b57cec5SDimitry Andricusing sys_seconds = sys_time<seconds>;                  // C++20
2930b57cec5SDimitry Andricusing sys_days    = sys_time<days>;                     // C++20
2940b57cec5SDimitry Andric
29506c3fb27SDimitry Andrictemplate<class charT, class traits, class Duration>     // C++20
29606c3fb27SDimitry Andric  basic_ostream<charT, traits>&
29706c3fb27SDimitry Andric    operator<<(basic_ostream<charT, traits>& os, const sys_time<Duration>& tp);
29806c3fb27SDimitry Andric
299349cc55cSDimitry Andricclass file_clock                                        // C++20
300349cc55cSDimitry Andric{
301349cc55cSDimitry Andricpublic:
302349cc55cSDimitry Andric    typedef see-below                      rep;
303349cc55cSDimitry Andric    typedef nano                           period;
304349cc55cSDimitry Andric    typedef chrono::duration<rep, period>  duration;
305349cc55cSDimitry Andric    typedef chrono::time_point<file_clock> time_point;
306349cc55cSDimitry Andric    static constexpr bool is_steady =      false;
307349cc55cSDimitry Andric
308349cc55cSDimitry Andric    static time_point now() noexcept;
3090b57cec5SDimitry Andric
3100b57cec5SDimitry Andric    template<class Duration>
311349cc55cSDimitry Andric    static sys_time<see-below> to_sys(const file_time<Duration>&);
3120b57cec5SDimitry Andric
3130b57cec5SDimitry Andric    template<class Duration>
314349cc55cSDimitry Andric    static file_time<see-below> from_sys(const sys_time<Duration>&);
315349cc55cSDimitry Andric};
3160b57cec5SDimitry Andric
3170b57cec5SDimitry Andrictemplate<class Duration>
3180b57cec5SDimitry Andric  using file_time = time_point<file_clock, Duration>;   // C++20
3190b57cec5SDimitry Andric
32006c3fb27SDimitry Andrictemplate<class charT, class traits, class Duration>     // C++20
32106c3fb27SDimitry Andric  basic_ostream<charT, traits>&
32206c3fb27SDimitry Andric    operator<<(basic_ostream<charT, traits>& os, const file_time<Duration>& tp);
32306c3fb27SDimitry Andric
3240b57cec5SDimitry Andricclass steady_clock
3250b57cec5SDimitry Andric{
3260b57cec5SDimitry Andricpublic:
3270b57cec5SDimitry Andric    typedef nanoseconds                                   duration;
3280b57cec5SDimitry Andric    typedef duration::rep                                 rep;
3290b57cec5SDimitry Andric    typedef duration::period                              period;
3300b57cec5SDimitry Andric    typedef chrono::time_point<steady_clock, duration>    time_point;
3310b57cec5SDimitry Andric    static const bool is_steady =                         true; // constexpr in C++14
3320b57cec5SDimitry Andric
3330b57cec5SDimitry Andric    static time_point now() noexcept;
3340b57cec5SDimitry Andric};
3350b57cec5SDimitry Andric
3360b57cec5SDimitry Andrictypedef steady_clock high_resolution_clock;
3370b57cec5SDimitry Andric
3380b57cec5SDimitry Andric// 25.7.8, local time           // C++20
3390b57cec5SDimitry Andricstruct local_t {};
3400b57cec5SDimitry Andrictemplate<class Duration>
3410b57cec5SDimitry Andric  using local_time  = time_point<local_t, Duration>;
3420b57cec5SDimitry Andricusing local_seconds = local_time<seconds>;
3430b57cec5SDimitry Andricusing local_days    = local_time<days>;
3440b57cec5SDimitry Andric
34506c3fb27SDimitry Andrictemplate<class charT, class traits, class Duration>     // C++20
34606c3fb27SDimitry Andric  basic_ostream<charT, traits>&
34706c3fb27SDimitry Andric    operator<<(basic_ostream<charT, traits>& os, const local_time<Duration>& tp);
34806c3fb27SDimitry Andric
3490b57cec5SDimitry Andric// 25.8.2, class last_spec    // C++20
3500b57cec5SDimitry Andricstruct last_spec;
3510b57cec5SDimitry Andric
3520b57cec5SDimitry Andric// 25.8.3, class day          // C++20
3530b57cec5SDimitry Andric
3540b57cec5SDimitry Andricclass day;
3550b57cec5SDimitry Andricconstexpr bool operator==(const day& x, const day& y) noexcept;
356753f127fSDimitry Andricconstexpr strong_ordering operator<=>(const day& x, const day& y) noexcept;
3570b57cec5SDimitry Andricconstexpr day  operator+(const day&  x, const days& y) noexcept;
3580b57cec5SDimitry Andricconstexpr day  operator+(const days& x, const day&  y) noexcept;
3590b57cec5SDimitry Andricconstexpr day  operator-(const day&  x, const days& y) noexcept;
3600b57cec5SDimitry Andricconstexpr days operator-(const day&  x, const day&  y) noexcept;
361bdd1243dSDimitry Andrictemplate<class charT, class traits>
362bdd1243dSDimitry Andric  basic_ostream<charT, traits>&
363bdd1243dSDimitry Andric    operator<<(basic_ostream<charT, traits>& os, const day& d);
3640b57cec5SDimitry Andric
3650b57cec5SDimitry Andric// 25.8.4, class month    // C++20
3660b57cec5SDimitry Andricclass month;
3670b57cec5SDimitry Andricconstexpr bool operator==(const month& x, const month& y) noexcept;
368bdd1243dSDimitry Andricconstexpr strong_ordering operator<=>(const month& x, const month& y) noexcept;
369bdd1243dSDimitry Andric
3700b57cec5SDimitry Andricconstexpr month  operator+(const month&  x, const months& y) noexcept;
3710b57cec5SDimitry Andricconstexpr month  operator+(const months& x,  const month& y) noexcept;
3720b57cec5SDimitry Andricconstexpr month  operator-(const month&  x, const months& y) noexcept;
3730b57cec5SDimitry Andricconstexpr months operator-(const month&  x,  const month& y) noexcept;
374bdd1243dSDimitry Andrictemplate<class charT, class traits>
375bdd1243dSDimitry Andric  basic_ostream<charT, traits>&
376bdd1243dSDimitry Andric    operator<<(basic_ostream<charT, traits>& os, const month& m);
3770b57cec5SDimitry Andric
3780b57cec5SDimitry Andric// 25.8.5, class year    // C++20
3790b57cec5SDimitry Andricclass year;
3800b57cec5SDimitry Andricconstexpr bool operator==(const year& x, const year& y) noexcept;
381bdd1243dSDimitry Andricconstexpr strong_ordering operator<=>(const year& x, const year& y) noexcept;
382bdd1243dSDimitry Andric
3830b57cec5SDimitry Andricconstexpr year  operator+(const year&  x, const years& y) noexcept;
3840b57cec5SDimitry Andricconstexpr year  operator+(const years& x, const year&  y) noexcept;
3850b57cec5SDimitry Andricconstexpr year  operator-(const year&  x, const years& y) noexcept;
3860b57cec5SDimitry Andricconstexpr years operator-(const year&  x, const year&  y) noexcept;
387bdd1243dSDimitry Andrictemplate<class charT, class traits>
388bdd1243dSDimitry Andric  basic_ostream<charT, traits>&
389bdd1243dSDimitry Andric    operator<<(basic_ostream<charT, traits>& os, const year& y);
3900b57cec5SDimitry Andric
3910b57cec5SDimitry Andric// 25.8.6, class weekday    // C++20
3920b57cec5SDimitry Andricclass weekday;
3930b57cec5SDimitry Andric
3940b57cec5SDimitry Andricconstexpr bool operator==(const weekday& x, const weekday& y) noexcept;
3950b57cec5SDimitry Andricconstexpr weekday operator+(const weekday& x, const days&    y) noexcept;
3960b57cec5SDimitry Andricconstexpr weekday operator+(const days&    x, const weekday& y) noexcept;
3970b57cec5SDimitry Andricconstexpr weekday operator-(const weekday& x, const days&    y) noexcept;
3980b57cec5SDimitry Andricconstexpr days    operator-(const weekday& x, const weekday& y) noexcept;
399bdd1243dSDimitry Andrictemplate<class charT, class traits>
400bdd1243dSDimitry Andric  basic_ostream<charT, traits>&
401bdd1243dSDimitry Andric    operator<<(basic_ostream<charT, traits>& os, const weekday& wd);
4020b57cec5SDimitry Andric
4030b57cec5SDimitry Andric// 25.8.7, class weekday_indexed    // C++20
4040b57cec5SDimitry Andric
4050b57cec5SDimitry Andricclass weekday_indexed;
4060b57cec5SDimitry Andricconstexpr bool operator==(const weekday_indexed& x, const weekday_indexed& y) noexcept;
4070b57cec5SDimitry Andric
408bdd1243dSDimitry Andrictemplate<class charT, class traits>
409bdd1243dSDimitry Andric  basic_ostream<charT, traits>&
410bdd1243dSDimitry Andric    operator<<(basic_ostream<charT, traits>& os, const weekday_indexed& wdi);
411bdd1243dSDimitry Andric
4120b57cec5SDimitry Andric// 25.8.8, class weekday_last    // C++20
4130b57cec5SDimitry Andricclass weekday_last;
4140b57cec5SDimitry Andric
4150b57cec5SDimitry Andricconstexpr bool operator==(const weekday_last& x, const weekday_last& y) noexcept;
4160b57cec5SDimitry Andric
417bdd1243dSDimitry Andrictemplate<class charT, class traits>
418bdd1243dSDimitry Andric  basic_ostream<charT, traits>&
419bdd1243dSDimitry Andric    operator<<(basic_ostream<charT, traits>& os, const weekday_last& wdl);
420bdd1243dSDimitry Andric
4210b57cec5SDimitry Andric// 25.8.9, class month_day    // C++20
4220b57cec5SDimitry Andricclass month_day;
4230b57cec5SDimitry Andric
4240b57cec5SDimitry Andricconstexpr bool operator==(const month_day& x, const month_day& y) noexcept;
425bdd1243dSDimitry Andricconstexpr strong_ordering operator<=>(const month_day& x, const month_day& y) noexcept;
4260b57cec5SDimitry Andric
427bdd1243dSDimitry Andrictemplate<class charT, class traits>
428bdd1243dSDimitry Andric  basic_ostream<charT, traits>&
429bdd1243dSDimitry Andric    operator<<(basic_ostream<charT, traits>& os, const month_day& md);
4300b57cec5SDimitry Andric
4310b57cec5SDimitry Andric// 25.8.10, class month_day_last    // C++20
4320b57cec5SDimitry Andricclass month_day_last;
4330b57cec5SDimitry Andric
4340b57cec5SDimitry Andricconstexpr bool operator==(const month_day_last& x, const month_day_last& y) noexcept;
435bdd1243dSDimitry Andricconstexpr strong_ordering operator<=>(const month_day_last& x, const month_day_last& y) noexcept;
436bdd1243dSDimitry Andric
437bdd1243dSDimitry Andrictemplate<class charT, class traits>
438bdd1243dSDimitry Andric  basic_ostream<charT, traits>&
439bdd1243dSDimitry Andric    operator<<(basic_ostream<charT, traits>& os, const month_day_last& mdl);
4400b57cec5SDimitry Andric
4410b57cec5SDimitry Andric// 25.8.11, class month_weekday    // C++20
4420b57cec5SDimitry Andricclass month_weekday;
4430b57cec5SDimitry Andric
4440b57cec5SDimitry Andricconstexpr bool operator==(const month_weekday& x, const month_weekday& y) noexcept;
4450b57cec5SDimitry Andric
446bdd1243dSDimitry Andrictemplate<class charT, class traits>
447bdd1243dSDimitry Andric  basic_ostream<charT, traits>&
448bdd1243dSDimitry Andric    operator<<(basic_ostream<charT, traits>& os, const month_weekday& mwd);
449bdd1243dSDimitry Andric
4500b57cec5SDimitry Andric// 25.8.12, class month_weekday_last    // C++20
4510b57cec5SDimitry Andricclass month_weekday_last;
4520b57cec5SDimitry Andric
4530b57cec5SDimitry Andricconstexpr bool operator==(const month_weekday_last& x, const month_weekday_last& y) noexcept;
4540b57cec5SDimitry Andric
455bdd1243dSDimitry Andrictemplate<class charT, class traits>
456bdd1243dSDimitry Andric  basic_ostream<charT, traits>&
457bdd1243dSDimitry Andric    operator<<(basic_ostream<charT, traits>& os, const month_weekday_last& mwdl);
458bdd1243dSDimitry Andric
4590b57cec5SDimitry Andric
4600b57cec5SDimitry Andric// 25.8.13, class year_month    // C++20
4610b57cec5SDimitry Andricclass year_month;
4620b57cec5SDimitry Andric
4630b57cec5SDimitry Andricconstexpr bool operator==(const year_month& x, const year_month& y) noexcept;
464bdd1243dSDimitry Andricconstexpr strong_ordering operator<=>(const year_month& x, const year_month& y) noexcept;
4650b57cec5SDimitry Andric
4660b57cec5SDimitry Andricconstexpr year_month operator+(const year_month& ym, const months& dm) noexcept;
4670b57cec5SDimitry Andricconstexpr year_month operator+(const months& dm, const year_month& ym) noexcept;
4680b57cec5SDimitry Andricconstexpr year_month operator-(const year_month& ym, const months& dm) noexcept;
4690b57cec5SDimitry Andricconstexpr months operator-(const year_month& x, const year_month& y) noexcept;
4700b57cec5SDimitry Andricconstexpr year_month operator+(const year_month& ym, const years& dy) noexcept;
4710b57cec5SDimitry Andricconstexpr year_month operator+(const years& dy, const year_month& ym) noexcept;
4720b57cec5SDimitry Andricconstexpr year_month operator-(const year_month& ym, const years& dy) noexcept;
4730b57cec5SDimitry Andric
474bdd1243dSDimitry Andrictemplate<class charT, class traits>
475bdd1243dSDimitry Andric  basic_ostream<charT, traits>&
476bdd1243dSDimitry Andric    operator<<(basic_ostream<charT, traits>& os, const year_month& ym);
477bdd1243dSDimitry Andric
4780b57cec5SDimitry Andric// 25.8.14, class year_month_day class    // C++20
4790b57cec5SDimitry Andricyear_month_day;
4800b57cec5SDimitry Andric
4810b57cec5SDimitry Andricconstexpr bool operator==(const year_month_day& x, const year_month_day& y) noexcept;
482bdd1243dSDimitry Andricconstexpr strong_ordering operator<=>(const year_month_day& x, const year_month_day& y) noexcept;
4830b57cec5SDimitry Andric
4840b57cec5SDimitry Andricconstexpr year_month_day operator+(const year_month_day& ymd, const months& dm) noexcept;
4850b57cec5SDimitry Andricconstexpr year_month_day operator+(const months& dm, const year_month_day& ymd) noexcept;
4860b57cec5SDimitry Andricconstexpr year_month_day operator+(const year_month_day& ymd, const years& dy) noexcept;
4870b57cec5SDimitry Andricconstexpr year_month_day operator+(const years& dy, const year_month_day& ymd) noexcept;
4880b57cec5SDimitry Andricconstexpr year_month_day operator-(const year_month_day& ymd, const months& dm) noexcept;
4890b57cec5SDimitry Andricconstexpr year_month_day operator-(const year_month_day& ymd, const years& dy) noexcept;
4900b57cec5SDimitry Andric
491bdd1243dSDimitry Andrictemplate<class charT, class traits>
492bdd1243dSDimitry Andric  basic_ostream<charT, traits>&
493bdd1243dSDimitry Andric    operator<<(basic_ostream<charT, traits>& os, const year_month_day& ymd);
4940b57cec5SDimitry Andric
4950b57cec5SDimitry Andric// 25.8.15, class year_month_day_last    // C++20
4960b57cec5SDimitry Andricclass year_month_day_last;
4970b57cec5SDimitry Andric
498bdd1243dSDimitry Andricconstexpr bool operator==(const year_month_day_last& x, const year_month_day_last& y) noexcept;
499bdd1243dSDimitry Andricconstexpr strong_ordering operator<=>(const year_month_day_last_day& x, const year_month_day_last_day& y) noexcept;
5000b57cec5SDimitry Andric
5010b57cec5SDimitry Andricconstexpr year_month_day_last
5020b57cec5SDimitry Andric  operator+(const year_month_day_last& ymdl, const months& dm) noexcept;
5030b57cec5SDimitry Andricconstexpr year_month_day_last
5040b57cec5SDimitry Andric  operator+(const months& dm, const year_month_day_last& ymdl) noexcept;
5050b57cec5SDimitry Andricconstexpr year_month_day_last
5060b57cec5SDimitry Andric  operator+(const year_month_day_last& ymdl, const years& dy) noexcept;
5070b57cec5SDimitry Andricconstexpr year_month_day_last
5080b57cec5SDimitry Andric  operator+(const years& dy, const year_month_day_last& ymdl) noexcept;
5090b57cec5SDimitry Andricconstexpr year_month_day_last
5100b57cec5SDimitry Andric  operator-(const year_month_day_last& ymdl, const months& dm) noexcept;
5110b57cec5SDimitry Andricconstexpr year_month_day_last
5120b57cec5SDimitry Andric  operator-(const year_month_day_last& ymdl, const years& dy) noexcept;
5130b57cec5SDimitry Andric
514bdd1243dSDimitry Andrictemplate<class charT, class traits>
515bdd1243dSDimitry Andric  basic_ostream<charT, traits>&
516bdd1243dSDimitry Andric    operator<<(basic_ostream<charT, traits>& os, const year_month_day_last& ymdl);
517bdd1243dSDimitry Andric
5180b57cec5SDimitry Andric// 25.8.16, class year_month_weekday    // C++20
5190b57cec5SDimitry Andricclass year_month_weekday;
5200b57cec5SDimitry Andric
5210b57cec5SDimitry Andricconstexpr bool operator==(const year_month_weekday& x,
5220b57cec5SDimitry Andric                          const year_month_weekday& y) noexcept;
5230b57cec5SDimitry Andric
5240b57cec5SDimitry Andricconstexpr year_month_weekday
5250b57cec5SDimitry Andric  operator+(const year_month_weekday& ymwd, const months& dm) noexcept;
5260b57cec5SDimitry Andricconstexpr year_month_weekday
5270b57cec5SDimitry Andric  operator+(const months& dm, const year_month_weekday& ymwd) noexcept;
5280b57cec5SDimitry Andricconstexpr year_month_weekday
5290b57cec5SDimitry Andric  operator+(const year_month_weekday& ymwd, const years& dy) noexcept;
5300b57cec5SDimitry Andricconstexpr year_month_weekday
5310b57cec5SDimitry Andric  operator+(const years& dy, const year_month_weekday& ymwd) noexcept;
5320b57cec5SDimitry Andricconstexpr year_month_weekday
5330b57cec5SDimitry Andric  operator-(const year_month_weekday& ymwd, const months& dm) noexcept;
5340b57cec5SDimitry Andricconstexpr year_month_weekday
5350b57cec5SDimitry Andric  operator-(const year_month_weekday& ymwd, const years& dy) noexcept;
5360b57cec5SDimitry Andric
537bdd1243dSDimitry Andrictemplate<class charT, class traits>
538bdd1243dSDimitry Andric  basic_ostream<charT, traits>&
539bdd1243dSDimitry Andric    operator<<(basic_ostream<charT, traits>& os, const year_month_weekday& ymwd);
540bdd1243dSDimitry Andric
5410b57cec5SDimitry Andric// 25.8.17, class year_month_weekday_last    // C++20
5420b57cec5SDimitry Andricclass year_month_weekday_last;
5430b57cec5SDimitry Andric
5440b57cec5SDimitry Andricconstexpr bool operator==(const year_month_weekday_last& x,
5450b57cec5SDimitry Andric                          const year_month_weekday_last& y) noexcept;
5460b57cec5SDimitry Andricconstexpr year_month_weekday_last
5470b57cec5SDimitry Andric  operator+(const year_month_weekday_last& ymwdl, const months& dm) noexcept;
5480b57cec5SDimitry Andricconstexpr year_month_weekday_last
5490b57cec5SDimitry Andric  operator+(const months& dm, const year_month_weekday_last& ymwdl) noexcept;
5500b57cec5SDimitry Andricconstexpr year_month_weekday_last
5510b57cec5SDimitry Andric  operator+(const year_month_weekday_last& ymwdl, const years& dy) noexcept;
5520b57cec5SDimitry Andricconstexpr year_month_weekday_last
5530b57cec5SDimitry Andric  operator+(const years& dy, const year_month_weekday_last& ymwdl) noexcept;
5540b57cec5SDimitry Andricconstexpr year_month_weekday_last
5550b57cec5SDimitry Andric  operator-(const year_month_weekday_last& ymwdl, const months& dm) noexcept;
5560b57cec5SDimitry Andricconstexpr year_month_weekday_last
5570b57cec5SDimitry Andric  operator-(const year_month_weekday_last& ymwdl, const years& dy) noexcept;
5580b57cec5SDimitry Andric
559bdd1243dSDimitry Andrictemplate<class charT, class traits>
560bdd1243dSDimitry Andric  basic_ostream<charT, traits>&
561bdd1243dSDimitry Andric    operator<<(basic_ostream<charT, traits>& os, const year_month_weekday_last& ymwdl);
562bdd1243dSDimitry Andric
5630b57cec5SDimitry Andric// 25.8.18, civil calendar conventional syntax operators    // C++20
5640b57cec5SDimitry Andricconstexpr year_month
5650b57cec5SDimitry Andric  operator/(const year& y, const month& m) noexcept;
5660b57cec5SDimitry Andricconstexpr year_month
5670b57cec5SDimitry Andric  operator/(const year& y, int m) noexcept;
5680b57cec5SDimitry Andricconstexpr month_day
5690b57cec5SDimitry Andric  operator/(const month& m, const day& d) noexcept;
5700b57cec5SDimitry Andricconstexpr month_day
5710b57cec5SDimitry Andric  operator/(const month& m, int d) noexcept;
5720b57cec5SDimitry Andricconstexpr month_day
5730b57cec5SDimitry Andric  operator/(int m, const day& d) noexcept;
5740b57cec5SDimitry Andricconstexpr month_day
5750b57cec5SDimitry Andric  operator/(const day& d, const month& m) noexcept;
5760b57cec5SDimitry Andricconstexpr month_day
5770b57cec5SDimitry Andric  operator/(const day& d, int m) noexcept;
5780b57cec5SDimitry Andricconstexpr month_day_last
5790b57cec5SDimitry Andric  operator/(const month& m, last_spec) noexcept;
5800b57cec5SDimitry Andricconstexpr month_day_last
5810b57cec5SDimitry Andric  operator/(int m, last_spec) noexcept;
5820b57cec5SDimitry Andricconstexpr month_day_last
5830b57cec5SDimitry Andric  operator/(last_spec, const month& m) noexcept;
5840b57cec5SDimitry Andricconstexpr month_day_last
5850b57cec5SDimitry Andric  operator/(last_spec, int m) noexcept;
5860b57cec5SDimitry Andricconstexpr month_weekday
5870b57cec5SDimitry Andric  operator/(const month& m, const weekday_indexed& wdi) noexcept;
5880b57cec5SDimitry Andricconstexpr month_weekday
5890b57cec5SDimitry Andric  operator/(int m, const weekday_indexed& wdi) noexcept;
5900b57cec5SDimitry Andricconstexpr month_weekday
5910b57cec5SDimitry Andric  operator/(const weekday_indexed& wdi, const month& m) noexcept;
5920b57cec5SDimitry Andricconstexpr month_weekday
5930b57cec5SDimitry Andric  operator/(const weekday_indexed& wdi, int m) noexcept;
5940b57cec5SDimitry Andricconstexpr month_weekday_last
5950b57cec5SDimitry Andric  operator/(const month& m, const weekday_last& wdl) noexcept;
5960b57cec5SDimitry Andricconstexpr month_weekday_last
5970b57cec5SDimitry Andric  operator/(int m, const weekday_last& wdl) noexcept;
5980b57cec5SDimitry Andricconstexpr month_weekday_last
5990b57cec5SDimitry Andric  operator/(const weekday_last& wdl, const month& m) noexcept;
6000b57cec5SDimitry Andricconstexpr month_weekday_last
6010b57cec5SDimitry Andric  operator/(const weekday_last& wdl, int m) noexcept;
6020b57cec5SDimitry Andricconstexpr year_month_day
6030b57cec5SDimitry Andric  operator/(const year_month& ym, const day& d) noexcept;
6040b57cec5SDimitry Andricconstexpr year_month_day
6050b57cec5SDimitry Andric  operator/(const year_month& ym, int d) noexcept;
6060b57cec5SDimitry Andricconstexpr year_month_day
6070b57cec5SDimitry Andric  operator/(const year& y, const month_day& md) noexcept;
6080b57cec5SDimitry Andricconstexpr year_month_day
6090b57cec5SDimitry Andric  operator/(int y, const month_day& md) noexcept;
6100b57cec5SDimitry Andricconstexpr year_month_day
6110b57cec5SDimitry Andric  operator/(const month_day& md, const year& y) noexcept;
6120b57cec5SDimitry Andricconstexpr year_month_day
6130b57cec5SDimitry Andric  operator/(const month_day& md, int y) noexcept;
6140b57cec5SDimitry Andricconstexpr year_month_day_last
6150b57cec5SDimitry Andric  operator/(const year_month& ym, last_spec) noexcept;
6160b57cec5SDimitry Andricconstexpr year_month_day_last
6170b57cec5SDimitry Andric  operator/(const year& y, const month_day_last& mdl) noexcept;
6180b57cec5SDimitry Andricconstexpr year_month_day_last
6190b57cec5SDimitry Andric  operator/(int y, const month_day_last& mdl) noexcept;
6200b57cec5SDimitry Andricconstexpr year_month_day_last
6210b57cec5SDimitry Andric  operator/(const month_day_last& mdl, const year& y) noexcept;
6220b57cec5SDimitry Andricconstexpr year_month_day_last
6230b57cec5SDimitry Andric  operator/(const month_day_last& mdl, int y) noexcept;
6240b57cec5SDimitry Andricconstexpr year_month_weekday
6250b57cec5SDimitry Andric  operator/(const year_month& ym, const weekday_indexed& wdi) noexcept;
6260b57cec5SDimitry Andricconstexpr year_month_weekday
6270b57cec5SDimitry Andric  operator/(const year& y, const month_weekday& mwd) noexcept;
6280b57cec5SDimitry Andricconstexpr year_month_weekday
6290b57cec5SDimitry Andric  operator/(int y, const month_weekday& mwd) noexcept;
6300b57cec5SDimitry Andricconstexpr year_month_weekday
6310b57cec5SDimitry Andric  operator/(const month_weekday& mwd, const year& y) noexcept;
6320b57cec5SDimitry Andricconstexpr year_month_weekday
6330b57cec5SDimitry Andric  operator/(const month_weekday& mwd, int y) noexcept;
6340b57cec5SDimitry Andricconstexpr year_month_weekday_last
6350b57cec5SDimitry Andric  operator/(const year_month& ym, const weekday_last& wdl) noexcept;
6360b57cec5SDimitry Andricconstexpr year_month_weekday_last
6370b57cec5SDimitry Andric  operator/(const year& y, const month_weekday_last& mwdl) noexcept;
6380b57cec5SDimitry Andricconstexpr year_month_weekday_last
6390b57cec5SDimitry Andric  operator/(int y, const month_weekday_last& mwdl) noexcept;
6400b57cec5SDimitry Andricconstexpr year_month_weekday_last
6410b57cec5SDimitry Andric  operator/(const month_weekday_last& mwdl, const year& y) noexcept;
6420b57cec5SDimitry Andricconstexpr year_month_weekday_last
6430b57cec5SDimitry Andric  operator/(const month_weekday_last& mwdl, int y) noexcept;
6440b57cec5SDimitry Andric
645e40139ffSDimitry Andric// 26.9, class template hh_mm_ss
646e40139ffSDimitry Andrictemplate <class Duration>
647e40139ffSDimitry Andricclass hh_mm_ss
648e40139ffSDimitry Andric{
649e40139ffSDimitry Andric    bool            is_neg; // exposition only
650e40139ffSDimitry Andric    chrono::hours   h;      // exposition only
651e40139ffSDimitry Andric    chrono::minutes m;      // exposition only
652e40139ffSDimitry Andric    chrono::seconds s;      // exposition only
653e40139ffSDimitry Andric    precision       ss;     // exposition only
6540b57cec5SDimitry Andric
655e40139ffSDimitry Andricpublic:
656e40139ffSDimitry Andric    static unsigned constexpr fractional_width = see below;
657e40139ffSDimitry Andric    using precision                            = see below;
658e40139ffSDimitry Andric
659e40139ffSDimitry Andric    constexpr hh_mm_ss() noexcept : hh_mm_ss{Duration::zero()} {}
660e40139ffSDimitry Andric    constexpr explicit hh_mm_ss(Duration d) noexcept;
661e40139ffSDimitry Andric
662e40139ffSDimitry Andric    constexpr bool is_negative() const noexcept;
663e40139ffSDimitry Andric    constexpr chrono::hours hours() const noexcept;
664e40139ffSDimitry Andric    constexpr chrono::minutes minutes() const noexcept;
665e40139ffSDimitry Andric    constexpr chrono::seconds seconds() const noexcept;
666e40139ffSDimitry Andric    constexpr precision subseconds() const noexcept;
667e40139ffSDimitry Andric
668e40139ffSDimitry Andric    constexpr explicit operator  precision()   const noexcept;
669e40139ffSDimitry Andric    constexpr          precision to_duration() const noexcept;
670e40139ffSDimitry Andric};
671e40139ffSDimitry Andric
67206c3fb27SDimitry Andrictemplate<class charT, class traits, class Duration>
67306c3fb27SDimitry Andric  basic_ostream<charT, traits>&
67406c3fb27SDimitry Andric    operator<<(basic_ostream<charT, traits>& os, const hh_mm_ss<Duration>& hms); // C++20
67506c3fb27SDimitry Andric
676e40139ffSDimitry Andric// 26.10, 12/24 hour functions
677e40139ffSDimitry Andricconstexpr bool is_am(hours const& h) noexcept;
678e40139ffSDimitry Andricconstexpr bool is_pm(hours const& h) noexcept;
679e40139ffSDimitry Andricconstexpr hours make12(const hours& h) noexcept;
680e40139ffSDimitry Andricconstexpr hours make24(const hours& h, bool is_pm) noexcept;
681e40139ffSDimitry Andric
682*5f757f3fSDimitry Andric// [time.zone.db], time zone database
683*5f757f3fSDimitry Andricstruct tzdb {                                                                    // C++20
684*5f757f3fSDimitry Andric  string                 version;
685*5f757f3fSDimitry Andric};
686*5f757f3fSDimitry Andric
687*5f757f3fSDimitry Andricclass tzdb_list {                                                                // C++20
688*5f757f3fSDimitry Andricpublic:
689*5f757f3fSDimitry Andric  tzdb_list(const tzdb_list&) = delete;
690*5f757f3fSDimitry Andric  tzdb_list& operator=(const tzdb_list&) = delete;
691*5f757f3fSDimitry Andric
692*5f757f3fSDimitry Andric  // unspecified additional constructors
693*5f757f3fSDimitry Andric
694*5f757f3fSDimitry Andric  class const_iterator;
695*5f757f3fSDimitry Andric
696*5f757f3fSDimitry Andric  const tzdb& front() const noexcept;
697*5f757f3fSDimitry Andric
698*5f757f3fSDimitry Andric  const_iterator erase_after(const_iterator p);
699*5f757f3fSDimitry Andric
700*5f757f3fSDimitry Andric  const_iterator begin() const noexcept;
701*5f757f3fSDimitry Andric  const_iterator end()   const noexcept;
702*5f757f3fSDimitry Andric
703*5f757f3fSDimitry Andric  const_iterator cbegin() const noexcept;
704*5f757f3fSDimitry Andric  const_iterator cend()   const noexcept;
705*5f757f3fSDimitry Andric};
706*5f757f3fSDimitry Andric
707*5f757f3fSDimitry Andric// [time.zone.db.access], time zone database access
708*5f757f3fSDimitry Andricconst tzdb& get_tzdb();                                                          // C++20
709*5f757f3fSDimitry Andrictzdb_list& get_tzdb_list();                                                      // C++20
710*5f757f3fSDimitry Andric
711*5f757f3fSDimitry Andric// [time.zone.db.remote], remote time zone database support
712*5f757f3fSDimitry Andricconst tzdb& reload_tzdb();                                                       // C++20
713*5f757f3fSDimitry Andricstring remote_version();                                                         // C++20
714*5f757f3fSDimitry Andric
7150b57cec5SDimitry Andric// 25.10.5, class time_zone    // C++20
7160b57cec5SDimitry Andricenum class choose {earliest, latest};
7170b57cec5SDimitry Andricclass time_zone;
7180b57cec5SDimitry Andricbool operator==(const time_zone& x, const time_zone& y) noexcept;
7190b57cec5SDimitry Andricbool operator!=(const time_zone& x, const time_zone& y) noexcept;
7200b57cec5SDimitry Andricbool operator<(const time_zone& x, const time_zone& y) noexcept;
7210b57cec5SDimitry Andricbool operator>(const time_zone& x, const time_zone& y) noexcept;
7220b57cec5SDimitry Andricbool operator<=(const time_zone& x, const time_zone& y) noexcept;
7230b57cec5SDimitry Andricbool operator>=(const time_zone& x, const time_zone& y) noexcept;
724bdd1243dSDimitry Andric}  // chrono
7250b57cec5SDimitry Andric
726bdd1243dSDimitry Andricnamespace std {
72706c3fb27SDimitry Andric  template<class Duration, class charT>
72806c3fb27SDimitry Andric    struct formatter<chrono::sys_time<Duration>, charT>;                          // C++20
72906c3fb27SDimitry Andric  template<class Duration, class charT>
73006c3fb27SDimitry Andric    struct formatter<chrono::filetime<Duration>, charT>;                          // C++20
73106c3fb27SDimitry Andric  template<class Duration, class charT>
73206c3fb27SDimitry Andric    struct formatter<chrono::local_time<Duration>, charT>;                        // C++20
733bdd1243dSDimitry Andric  template<class Rep, class Period, class charT>
734bdd1243dSDimitry Andric    struct formatter<chrono::duration<Rep, Period>, charT>;                       // C++20
735bdd1243dSDimitry Andric  template<class charT> struct formatter<chrono::day, charT>;                     // C++20
736bdd1243dSDimitry Andric  template<class charT> struct formatter<chrono::month, charT>;                   // C++20
737bdd1243dSDimitry Andric  template<class charT> struct formatter<chrono::year, charT>;                    // C++20
738bdd1243dSDimitry Andric  template<class charT> struct formatter<chrono::weekday, charT>;                 // C++20
739bdd1243dSDimitry Andric  template<class charT> struct formatter<chrono::weekday_indexed, charT>;         // C++20
740bdd1243dSDimitry Andric  template<class charT> struct formatter<chrono::weekday_last, charT>;            // C++20
741bdd1243dSDimitry Andric  template<class charT> struct formatter<chrono::month_day, charT>;               // C++20
742bdd1243dSDimitry Andric  template<class charT> struct formatter<chrono::month_day_last, charT>;          // C++20
743bdd1243dSDimitry Andric  template<class charT> struct formatter<chrono::month_weekday, charT>;           // C++20
744bdd1243dSDimitry Andric  template<class charT> struct formatter<chrono::month_weekday_last, charT>;      // C++20
745bdd1243dSDimitry Andric  template<class charT> struct formatter<chrono::year_month, charT>;              // C++20
746bdd1243dSDimitry Andric  template<class charT> struct formatter<chrono::year_month_day, charT>;          // C++20
747bdd1243dSDimitry Andric  template<class charT> struct formatter<chrono::year_month_day_last, charT>;     // C++20
748bdd1243dSDimitry Andric  template<class charT> struct formatter<chrono::year_month_weekday, charT>;      // C++20
749bdd1243dSDimitry Andric  template<class charT> struct formatter<chrono::year_month_weekday_last, charT>; // C++20
75006c3fb27SDimitry Andric  template<class Rep, class Period, class charT>
75106c3fb27SDimitry Andric    struct formatter<chrono::hh_mm_ss<duration<Rep, Period>>, charT>;             // C++20
752bdd1243dSDimitry Andric} // namespace std
753bdd1243dSDimitry Andric
754bdd1243dSDimitry Andricnamespace chrono {
7550b57cec5SDimitry Andric// calendrical constants
7560b57cec5SDimitry Andricinline constexpr last_spec                              last{};       // C++20
7570b57cec5SDimitry Andricinline constexpr chrono::weekday                        Sunday{0};    // C++20
7580b57cec5SDimitry Andricinline constexpr chrono::weekday                        Monday{1};    // C++20
7590b57cec5SDimitry Andricinline constexpr chrono::weekday                        Tuesday{2};   // C++20
7600b57cec5SDimitry Andricinline constexpr chrono::weekday                        Wednesday{3}; // C++20
7610b57cec5SDimitry Andricinline constexpr chrono::weekday                        Thursday{4};  // C++20
7620b57cec5SDimitry Andricinline constexpr chrono::weekday                        Friday{5};    // C++20
7630b57cec5SDimitry Andricinline constexpr chrono::weekday                        Saturday{6};  // C++20
7640b57cec5SDimitry Andric
7650b57cec5SDimitry Andricinline constexpr chrono::month                          January{1};   // C++20
7660b57cec5SDimitry Andricinline constexpr chrono::month                          February{2};  // C++20
7670b57cec5SDimitry Andricinline constexpr chrono::month                          March{3};     // C++20
7680b57cec5SDimitry Andricinline constexpr chrono::month                          April{4};     // C++20
7690b57cec5SDimitry Andricinline constexpr chrono::month                          May{5};       // C++20
7700b57cec5SDimitry Andricinline constexpr chrono::month                          June{6};      // C++20
7710b57cec5SDimitry Andricinline constexpr chrono::month                          July{7};      // C++20
7720b57cec5SDimitry Andricinline constexpr chrono::month                          August{8};    // C++20
7730b57cec5SDimitry Andricinline constexpr chrono::month                          September{9}; // C++20
7740b57cec5SDimitry Andricinline constexpr chrono::month                          October{10};  // C++20
7750b57cec5SDimitry Andricinline constexpr chrono::month                          November{11}; // C++20
7760b57cec5SDimitry Andricinline constexpr chrono::month                          December{12}; // C++20
7770b57cec5SDimitry Andric}  // chrono
7780b57cec5SDimitry Andric
7790b57cec5SDimitry Andricinline namespace literals {
7800b57cec5SDimitry Andric  inline namespace chrono_literals {
7810b57cec5SDimitry Andricconstexpr chrono::hours                                 operator ""h(unsigned long long); // C++14
7820b57cec5SDimitry Andricconstexpr chrono::duration<unspecified , ratio<3600,1>> operator ""h(long double); // C++14
7830b57cec5SDimitry Andricconstexpr chrono::minutes                               operator ""min(unsigned long long); // C++14
7840b57cec5SDimitry Andricconstexpr chrono::duration<unspecified , ratio<60,1>>   operator ""min(long double); // C++14
7850b57cec5SDimitry Andricconstexpr chrono::seconds                               operator ""s(unsigned long long); // C++14
7860b57cec5SDimitry Andricconstexpr chrono::duration<unspecified >                operator ""s(long double); // C++14
7870b57cec5SDimitry Andricconstexpr chrono::milliseconds                          operator ""ms(unsigned long long); // C++14
7880b57cec5SDimitry Andricconstexpr chrono::duration<unspecified , milli>         operator ""ms(long double); // C++14
7890b57cec5SDimitry Andricconstexpr chrono::microseconds                          operator ""us(unsigned long long); // C++14
7900b57cec5SDimitry Andricconstexpr chrono::duration<unspecified , micro>         operator ""us(long double); // C++14
7910b57cec5SDimitry Andricconstexpr chrono::nanoseconds                           operator ""ns(unsigned long long); // C++14
7920b57cec5SDimitry Andricconstexpr chrono::duration<unspecified , nano>          operator ""ns(long double); // C++14
7930b57cec5SDimitry Andricconstexpr chrono::day                                   operator ""d(unsigned long long d) noexcept; // C++20
7940b57cec5SDimitry Andricconstexpr chrono::year                                  operator ""y(unsigned long long y) noexcept; // C++20
7950b57cec5SDimitry Andric}  // chrono_literals
7960b57cec5SDimitry Andric}  // literals
7970b57cec5SDimitry Andric
7980b57cec5SDimitry Andric}  // std
7990b57cec5SDimitry Andric*/
8000b57cec5SDimitry Andric
801*5f757f3fSDimitry Andric// clang-format on
802*5f757f3fSDimitry Andric
80381ad6265SDimitry Andric#include <__assert> // all public C++ headers provide the assertion handler
80404eeddc0SDimitry Andric#include <__chrono/calendar.h>
80504eeddc0SDimitry Andric#include <__chrono/convert_to_timespec.h>
806bdd1243dSDimitry Andric#include <__chrono/convert_to_tm.h>
80781ad6265SDimitry Andric#include <__chrono/day.h>
80804eeddc0SDimitry Andric#include <__chrono/duration.h>
80904eeddc0SDimitry Andric#include <__chrono/file_clock.h>
81081ad6265SDimitry Andric#include <__chrono/hh_mm_ss.h>
81104eeddc0SDimitry Andric#include <__chrono/high_resolution_clock.h>
81281ad6265SDimitry Andric#include <__chrono/literals.h>
81381ad6265SDimitry Andric#include <__chrono/month.h>
81481ad6265SDimitry Andric#include <__chrono/month_weekday.h>
81581ad6265SDimitry Andric#include <__chrono/monthday.h>
81604eeddc0SDimitry Andric#include <__chrono/steady_clock.h>
81704eeddc0SDimitry Andric#include <__chrono/system_clock.h>
81804eeddc0SDimitry Andric#include <__chrono/time_point.h>
81981ad6265SDimitry Andric#include <__chrono/weekday.h>
82081ad6265SDimitry Andric#include <__chrono/year.h>
82181ad6265SDimitry Andric#include <__chrono/year_month.h>
82281ad6265SDimitry Andric#include <__chrono/year_month_day.h>
82381ad6265SDimitry Andric#include <__chrono/year_month_weekday.h>
824fe6060f1SDimitry Andric#include <__config>
8250b57cec5SDimitry Andric#include <version>
8260b57cec5SDimitry Andric
827753f127fSDimitry Andric// standard-mandated includes
828bdd1243dSDimitry Andric
829bdd1243dSDimitry Andric// [time.syn]
830753f127fSDimitry Andric#include <compare>
831753f127fSDimitry Andric
83206c3fb27SDimitry Andric#if !defined(_LIBCPP_HAS_NO_LOCALIZATION) && _LIBCPP_STD_VER >= 20
833bdd1243dSDimitry Andric#  include <__chrono/formatter.h>
834bdd1243dSDimitry Andric#  include <__chrono/ostream.h>
835bdd1243dSDimitry Andric#  include <__chrono/parser_std_format_spec.h>
836bdd1243dSDimitry Andric#  include <__chrono/statically_widen.h>
837bdd1243dSDimitry Andric#endif
838bdd1243dSDimitry Andric
839*5f757f3fSDimitry Andric#if !defined(_LIBCPP_HAS_NO_TIME_ZONE_DATABASE) && !defined(_LIBCPP_HAS_NO_FILESYSTEM) &&                              \
840*5f757f3fSDimitry Andric    !defined(_LIBCPP_HAS_NO_LOCALIZATION)
841*5f757f3fSDimitry Andric#  include <__chrono/tzdb.h>
842*5f757f3fSDimitry Andric#  include <__chrono/tzdb_list.h>
843*5f757f3fSDimitry Andric#endif
844bdd1243dSDimitry Andric
8450b57cec5SDimitry Andric#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
8460b57cec5SDimitry Andric#  pragma GCC system_header
8470b57cec5SDimitry Andric#endif
8480b57cec5SDimitry Andric
849bdd1243dSDimitry Andric#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
85006c3fb27SDimitry Andric#  include <bit>
851bdd1243dSDimitry Andric#  include <concepts>
85206c3fb27SDimitry Andric#  include <cstring>
853*5f757f3fSDimitry Andric#  include <forward_list>
854*5f757f3fSDimitry Andric#  include <string>
85506c3fb27SDimitry Andric#endif
85606c3fb27SDimitry Andric
85706c3fb27SDimitry Andric#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER == 20
85806c3fb27SDimitry Andric#  include <charconv>
859bdd1243dSDimitry Andric#endif
860bdd1243dSDimitry Andric
8610b57cec5SDimitry Andric#endif // _LIBCPP_CHRONO
862