xref: /freebsd/contrib/llvm-project/libcxx/include/chrono (revision bdd1243df58e60e85101c09001d9812a789b6bc4)
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
16753f127fSDimitry Andric#include <compare> // C++20
17753f127fSDimitry Andric
180b57cec5SDimitry Andricnamespace std
190b57cec5SDimitry Andric{
200b57cec5SDimitry Andricnamespace chrono
210b57cec5SDimitry Andric{
220b57cec5SDimitry Andric
230b57cec5SDimitry Andrictemplate <class ToDuration, class Rep, class Period>
240b57cec5SDimitry Andricconstexpr
250b57cec5SDimitry AndricToDuration
260b57cec5SDimitry Andricduration_cast(const duration<Rep, Period>& fd);
270b57cec5SDimitry Andric
280b57cec5SDimitry Andrictemplate <class Rep> struct treat_as_floating_point : is_floating_point<Rep> {};
290b57cec5SDimitry Andric
300b57cec5SDimitry Andrictemplate <class Rep> inline constexpr bool treat_as_floating_point_v
310b57cec5SDimitry Andric    = treat_as_floating_point<Rep>::value;                       // C++17
320b57cec5SDimitry Andric
330b57cec5SDimitry Andrictemplate <class Rep>
340b57cec5SDimitry Andricstruct duration_values
350b57cec5SDimitry Andric{
360b57cec5SDimitry Andricpublic:
370b57cec5SDimitry Andric    static constexpr Rep zero(); // noexcept in C++20
380b57cec5SDimitry Andric    static constexpr Rep max();  // noexcept in C++20
390b57cec5SDimitry Andric    static constexpr Rep min();  // noexcept in C++20
400b57cec5SDimitry Andric};
410b57cec5SDimitry Andric
420b57cec5SDimitry Andric// duration
430b57cec5SDimitry Andric
440b57cec5SDimitry Andrictemplate <class Rep, class Period = ratio<1>>
450b57cec5SDimitry Andricclass duration
460b57cec5SDimitry Andric{
470b57cec5SDimitry Andric    static_assert(!__is_duration<Rep>::value, "A duration representation can not be a duration");
480b57cec5SDimitry Andric    static_assert(__is_ratio<Period>::value, "Second template parameter of duration must be a std::ratio");
490b57cec5SDimitry Andric    static_assert(Period::num > 0, "duration period must be positive");
500b57cec5SDimitry Andricpublic:
510b57cec5SDimitry Andric    typedef Rep rep;
520b57cec5SDimitry Andric    typedef typename _Period::type period;
530b57cec5SDimitry Andric
540b57cec5SDimitry Andric    constexpr duration() = default;
550b57cec5SDimitry Andric    template <class Rep2>
560b57cec5SDimitry Andric        constexpr explicit duration(const Rep2& r,
570b57cec5SDimitry Andric            typename enable_if
580b57cec5SDimitry Andric            <
590b57cec5SDimitry Andric               is_convertible<Rep2, rep>::value &&
600b57cec5SDimitry Andric               (treat_as_floating_point<rep>::value ||
610b57cec5SDimitry Andric               !treat_as_floating_point<rep>::value && !treat_as_floating_point<Rep2>::value)
620b57cec5SDimitry Andric            >::type* = 0);
630b57cec5SDimitry Andric
640b57cec5SDimitry Andric    // conversions
650b57cec5SDimitry Andric    template <class Rep2, class Period2>
660b57cec5SDimitry Andric        constexpr duration(const duration<Rep2, Period2>& d,
670b57cec5SDimitry Andric            typename enable_if
680b57cec5SDimitry Andric            <
690b57cec5SDimitry Andric                treat_as_floating_point<rep>::value ||
700b57cec5SDimitry Andric                ratio_divide<Period2, period>::type::den == 1
710b57cec5SDimitry Andric            >::type* = 0);
720b57cec5SDimitry Andric
730b57cec5SDimitry Andric    // observer
740b57cec5SDimitry Andric
750b57cec5SDimitry Andric    constexpr rep count() const;
760b57cec5SDimitry Andric
770b57cec5SDimitry Andric    // arithmetic
780b57cec5SDimitry Andric
790b57cec5SDimitry Andric    constexpr common_type<duration>::type  operator+() const;
800b57cec5SDimitry Andric    constexpr common_type<duration>::type  operator-() const;
810b57cec5SDimitry Andric    constexpr duration& operator++();    // constexpr in C++17
820b57cec5SDimitry Andric    constexpr duration  operator++(int); // constexpr in C++17
830b57cec5SDimitry Andric    constexpr duration& operator--();    // constexpr in C++17
840b57cec5SDimitry Andric    constexpr duration  operator--(int); // constexpr in C++17
850b57cec5SDimitry Andric
860b57cec5SDimitry Andric    constexpr duration& operator+=(const duration& d);  // constexpr in C++17
870b57cec5SDimitry Andric    constexpr duration& operator-=(const duration& d);  // constexpr in C++17
880b57cec5SDimitry Andric
890b57cec5SDimitry Andric    duration& operator*=(const rep& rhs);       // constexpr in C++17
900b57cec5SDimitry Andric    duration& operator/=(const rep& rhs);       // constexpr in C++17
910b57cec5SDimitry Andric    duration& operator%=(const rep& rhs);       // constexpr in C++17
920b57cec5SDimitry Andric    duration& operator%=(const duration& rhs);  // constexpr in C++17
930b57cec5SDimitry Andric
940b57cec5SDimitry Andric    // special values
950b57cec5SDimitry Andric
960b57cec5SDimitry Andric    static constexpr duration zero(); // noexcept in C++20
970b57cec5SDimitry Andric    static constexpr duration min();  // noexcept in C++20
980b57cec5SDimitry Andric    static constexpr duration max();  // noexcept in C++20
990b57cec5SDimitry Andric};
1000b57cec5SDimitry Andric
1010b57cec5SDimitry Andrictypedef duration<long long,         nano> nanoseconds;
1020b57cec5SDimitry Andrictypedef duration<long long,        micro> microseconds;
1030b57cec5SDimitry Andrictypedef duration<long long,        milli> milliseconds;
1040b57cec5SDimitry Andrictypedef duration<long long              > seconds;
1050b57cec5SDimitry Andrictypedef duration<     long, ratio<  60> > minutes;
1060b57cec5SDimitry Andrictypedef duration<     long, ratio<3600> > hours;
1070b57cec5SDimitry Andric
1080b57cec5SDimitry Andrictemplate <class Clock, class Duration = typename Clock::duration>
1090b57cec5SDimitry Andricclass time_point
1100b57cec5SDimitry Andric{
1110b57cec5SDimitry Andricpublic:
1120b57cec5SDimitry Andric    typedef Clock                     clock;
1130b57cec5SDimitry Andric    typedef Duration                  duration;
1140b57cec5SDimitry Andric    typedef typename duration::rep    rep;
1150b57cec5SDimitry Andric    typedef typename duration::period period;
1160b57cec5SDimitry Andricprivate:
1170b57cec5SDimitry Andric    duration d_;  // exposition only
1180b57cec5SDimitry Andric
1190b57cec5SDimitry Andricpublic:
1200b57cec5SDimitry Andric    time_point();  // has value "epoch" // constexpr in C++14
1210b57cec5SDimitry Andric    explicit time_point(const duration& d);  // same as time_point() + d // constexpr in C++14
1220b57cec5SDimitry Andric
1230b57cec5SDimitry Andric    // conversions
1240b57cec5SDimitry Andric    template <class Duration2>
1250b57cec5SDimitry Andric       time_point(const time_point<clock, Duration2>& t); // constexpr in C++14
1260b57cec5SDimitry Andric
1270b57cec5SDimitry Andric    // observer
1280b57cec5SDimitry Andric
1290b57cec5SDimitry Andric    duration time_since_epoch() const; // constexpr in C++14
1300b57cec5SDimitry Andric
1310b57cec5SDimitry Andric    // arithmetic
1320b57cec5SDimitry Andric
1330b57cec5SDimitry Andric    time_point& operator+=(const duration& d); // constexpr in C++17
1340b57cec5SDimitry Andric    time_point& operator-=(const duration& d); // constexpr in C++17
1350b57cec5SDimitry Andric
1360b57cec5SDimitry Andric    // special values
1370b57cec5SDimitry Andric
1380b57cec5SDimitry Andric    static constexpr time_point min();  // noexcept in C++20
1390b57cec5SDimitry Andric    static constexpr time_point max();  // noexcept in C++20
1400b57cec5SDimitry Andric};
1410b57cec5SDimitry Andric
1420b57cec5SDimitry Andric} // chrono
1430b57cec5SDimitry Andric
1440b57cec5SDimitry Andric// common_type traits
1450b57cec5SDimitry Andrictemplate <class Rep1, class Period1, class Rep2, class Period2>
1460b57cec5SDimitry Andric  struct common_type<chrono::duration<Rep1, Period1>, chrono::duration<Rep2, Period2>>;
1470b57cec5SDimitry Andric
1480b57cec5SDimitry Andrictemplate <class Clock, class Duration1, class Duration2>
1490b57cec5SDimitry Andric  struct common_type<chrono::time_point<Clock, Duration1>, chrono::time_point<Clock, Duration2>>;
1500b57cec5SDimitry Andric
1510b57cec5SDimitry Andricnamespace chrono {
1520b57cec5SDimitry Andric
1530b57cec5SDimitry Andric// duration arithmetic
1540b57cec5SDimitry Andrictemplate <class Rep1, class Period1, class Rep2, class Period2>
1550b57cec5SDimitry Andric  constexpr
1560b57cec5SDimitry Andric  typename common_type<duration<Rep1, Period1>, duration<Rep2, Period2>>::type
1570b57cec5SDimitry Andric  operator+(const duration<Rep1, Period1>& lhs, const duration<Rep2, Period2>& rhs);
1580b57cec5SDimitry Andrictemplate <class Rep1, class Period1, class Rep2, class Period2>
1590b57cec5SDimitry Andric  constexpr
1600b57cec5SDimitry Andric  typename common_type<duration<Rep1, Period1>, duration<Rep2, Period2>>::type
1610b57cec5SDimitry Andric  operator-(const duration<Rep1, Period1>& lhs, const duration<Rep2, Period2>& rhs);
1620b57cec5SDimitry Andrictemplate <class Rep1, class Period, class Rep2>
1630b57cec5SDimitry Andric  constexpr
1640b57cec5SDimitry Andric  duration<typename common_type<Rep1, Rep2>::type, Period>
1650b57cec5SDimitry Andric  operator*(const duration<Rep1, Period>& d, const Rep2& s);
1660b57cec5SDimitry Andrictemplate <class Rep1, class Period, class Rep2>
1670b57cec5SDimitry Andric  constexpr
1680b57cec5SDimitry Andric  duration<typename common_type<Rep1, Rep2>::type, Period>
1690b57cec5SDimitry Andric  operator*(const Rep1& s, const duration<Rep2, Period>& d);
1700b57cec5SDimitry Andrictemplate <class Rep1, class Period, class Rep2>
1710b57cec5SDimitry Andric  constexpr
1720b57cec5SDimitry Andric  duration<typename common_type<Rep1, Rep2>::type, Period>
1730b57cec5SDimitry Andric  operator/(const duration<Rep1, Period>& d, const Rep2& s);
1740b57cec5SDimitry Andrictemplate <class Rep1, class Period1, class Rep2, class Period2>
1750b57cec5SDimitry Andric  constexpr
1760b57cec5SDimitry Andric  typename common_type<Rep1, Rep2>::type
1770b57cec5SDimitry Andric  operator/(const duration<Rep1, Period1>& lhs, const duration<Rep2, Period2>& rhs);
1780b57cec5SDimitry Andric
1790b57cec5SDimitry Andric// duration comparisons
1800b57cec5SDimitry Andrictemplate <class Rep1, class Period1, class Rep2, class Period2>
1810b57cec5SDimitry Andric   constexpr
1820b57cec5SDimitry Andric   bool operator==(const duration<Rep1, Period1>& lhs, const duration<Rep2, Period2>& rhs);
1830b57cec5SDimitry Andrictemplate <class Rep1, class Period1, class Rep2, class Period2>
1840b57cec5SDimitry Andric   constexpr
1850b57cec5SDimitry Andric   bool operator!=(const duration<Rep1, Period1>& lhs, const duration<Rep2, Period2>& rhs);
1860b57cec5SDimitry Andrictemplate <class Rep1, class Period1, class Rep2, class Period2>
1870b57cec5SDimitry Andric   constexpr
1880b57cec5SDimitry Andric   bool operator< (const duration<Rep1, Period1>& lhs, const duration<Rep2, Period2>& rhs);
1890b57cec5SDimitry Andrictemplate <class Rep1, class Period1, class Rep2, class Period2>
1900b57cec5SDimitry Andric   constexpr
1910b57cec5SDimitry Andric   bool operator<=(const duration<Rep1, Period1>& lhs, const duration<Rep2, Period2>& rhs);
1920b57cec5SDimitry Andrictemplate <class Rep1, class Period1, class Rep2, class Period2>
1930b57cec5SDimitry Andric   constexpr
1940b57cec5SDimitry Andric   bool operator> (const duration<Rep1, Period1>& lhs, const duration<Rep2, Period2>& rhs);
1950b57cec5SDimitry Andrictemplate <class Rep1, class Period1, class Rep2, class Period2>
1960b57cec5SDimitry Andric   constexpr
1970b57cec5SDimitry Andric   bool operator>=(const duration<Rep1, Period1>& lhs, const duration<Rep2, Period2>& rhs);
1980b57cec5SDimitry Andric
1990b57cec5SDimitry Andric// duration_cast
2000b57cec5SDimitry Andrictemplate <class ToDuration, class Rep, class Period>
2010b57cec5SDimitry Andric  ToDuration duration_cast(const duration<Rep, Period>& d);
2020b57cec5SDimitry Andric
2030b57cec5SDimitry Andrictemplate <class ToDuration, class Rep, class Period>
2040b57cec5SDimitry Andric    constexpr ToDuration floor(const duration<Rep, Period>& d);    // C++17
2050b57cec5SDimitry Andrictemplate <class ToDuration, class Rep, class Period>
2060b57cec5SDimitry Andric    constexpr ToDuration ceil(const duration<Rep, Period>& d);     // C++17
2070b57cec5SDimitry Andrictemplate <class ToDuration, class Rep, class Period>
2080b57cec5SDimitry Andric    constexpr ToDuration round(const duration<Rep, Period>& d);    // C++17
2090b57cec5SDimitry Andric
210*bdd1243dSDimitry Andric// duration I/O
211*bdd1243dSDimitry Andrictemplate<class charT, class traits, class Rep, class Period>       // C++20
212*bdd1243dSDimitry Andric  basic_ostream<charT, traits>&
213*bdd1243dSDimitry Andric    operator<<(basic_ostream<charT, traits>& os,
214*bdd1243dSDimitry Andric               const duration<Rep, Period>& d);
2150b57cec5SDimitry Andric
2160b57cec5SDimitry Andric// time_point arithmetic (all constexpr in C++14)
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 Rep1, class Period1, class Clock, class Duration2>
2210b57cec5SDimitry Andric  time_point<Clock, typename common_type<duration<Rep1, Period1>, Duration2>::type>
2220b57cec5SDimitry Andric  operator+(const duration<Rep1, Period1>& lhs, const time_point<Clock, Duration2>& rhs);
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 Clock, class Duration1, class Duration2>
2270b57cec5SDimitry Andric  typename common_type<Duration1, Duration2>::type
2280b57cec5SDimitry Andric  operator-(const time_point<Clock, Duration1>& lhs, const time_point<Clock, Duration2>& rhs);
2290b57cec5SDimitry Andric
2300b57cec5SDimitry Andric// time_point comparisons (all constexpr in C++14)
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 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>
2400b57cec5SDimitry Andric   bool operator> (const time_point<Clock, Duration1>& lhs, const time_point<Clock, Duration2>& rhs);
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 Andric
2440b57cec5SDimitry Andric// time_point_cast (constexpr in C++14)
2450b57cec5SDimitry Andric
2460b57cec5SDimitry Andrictemplate <class ToDuration, class Clock, class Duration>
2470b57cec5SDimitry Andric  time_point<Clock, ToDuration> time_point_cast(const time_point<Clock, Duration>& t);
2480b57cec5SDimitry Andric
2490b57cec5SDimitry Andrictemplate <class ToDuration, class Clock, class Duration>
2500b57cec5SDimitry Andric    constexpr time_point<Clock, ToDuration>
2510b57cec5SDimitry Andric    floor(const time_point<Clock, Duration>& tp);                  // C++17
2520b57cec5SDimitry Andric
2530b57cec5SDimitry Andrictemplate <class ToDuration, class Clock, class Duration>
2540b57cec5SDimitry Andric    constexpr time_point<Clock, ToDuration>
2550b57cec5SDimitry Andric    ceil(const time_point<Clock, Duration>& tp);                   // C++17
2560b57cec5SDimitry Andric
2570b57cec5SDimitry Andrictemplate <class ToDuration, class Clock, class Duration>
2580b57cec5SDimitry Andric    constexpr time_point<Clock, ToDuration>
2590b57cec5SDimitry Andric    round(const time_point<Clock, Duration>& tp);                  // C++17
2600b57cec5SDimitry Andric
2610b57cec5SDimitry Andrictemplate <class Rep, class Period>
2620b57cec5SDimitry Andric    constexpr duration<Rep, Period> abs(duration<Rep, Period> d);  // C++17
2630b57cec5SDimitry Andric
2640b57cec5SDimitry Andric// Clocks
2650b57cec5SDimitry Andric
2660b57cec5SDimitry Andricclass system_clock
2670b57cec5SDimitry Andric{
2680b57cec5SDimitry Andricpublic:
2690b57cec5SDimitry Andric    typedef microseconds                     duration;
2700b57cec5SDimitry Andric    typedef duration::rep                    rep;
2710b57cec5SDimitry Andric    typedef duration::period                 period;
2720b57cec5SDimitry Andric    typedef chrono::time_point<system_clock> time_point;
2730b57cec5SDimitry Andric    static const bool is_steady =            false; // constexpr in C++14
2740b57cec5SDimitry Andric
2750b57cec5SDimitry Andric    static time_point now() noexcept;
2760b57cec5SDimitry Andric    static time_t     to_time_t  (const time_point& __t) noexcept;
2770b57cec5SDimitry Andric    static time_point from_time_t(time_t __t) noexcept;
2780b57cec5SDimitry Andric};
2790b57cec5SDimitry Andric
2800b57cec5SDimitry Andrictemplate <class Duration>
2810b57cec5SDimitry Andric  using sys_time  = time_point<system_clock, Duration>; // C++20
2820b57cec5SDimitry Andricusing sys_seconds = sys_time<seconds>;                  // C++20
2830b57cec5SDimitry Andricusing sys_days    = sys_time<days>;                     // C++20
2840b57cec5SDimitry Andric
285349cc55cSDimitry Andricclass file_clock                                        // C++20
286349cc55cSDimitry Andric{
287349cc55cSDimitry Andricpublic:
288349cc55cSDimitry Andric    typedef see-below                      rep;
289349cc55cSDimitry Andric    typedef nano                           period;
290349cc55cSDimitry Andric    typedef chrono::duration<rep, period>  duration;
291349cc55cSDimitry Andric    typedef chrono::time_point<file_clock> time_point;
292349cc55cSDimitry Andric    static constexpr bool is_steady =      false;
293349cc55cSDimitry Andric
294349cc55cSDimitry Andric    static time_point now() noexcept;
2950b57cec5SDimitry Andric
2960b57cec5SDimitry Andric    template<class Duration>
297349cc55cSDimitry Andric    static sys_time<see-below> to_sys(const file_time<Duration>&);
2980b57cec5SDimitry Andric
2990b57cec5SDimitry Andric    template<class Duration>
300349cc55cSDimitry Andric    static file_time<see-below> from_sys(const sys_time<Duration>&);
301349cc55cSDimitry Andric};
3020b57cec5SDimitry Andric
3030b57cec5SDimitry Andrictemplate<class Duration>
3040b57cec5SDimitry Andric  using file_time = time_point<file_clock, Duration>;   // C++20
3050b57cec5SDimitry Andric
3060b57cec5SDimitry Andricclass steady_clock
3070b57cec5SDimitry Andric{
3080b57cec5SDimitry Andricpublic:
3090b57cec5SDimitry Andric    typedef nanoseconds                                   duration;
3100b57cec5SDimitry Andric    typedef duration::rep                                 rep;
3110b57cec5SDimitry Andric    typedef duration::period                              period;
3120b57cec5SDimitry Andric    typedef chrono::time_point<steady_clock, duration>    time_point;
3130b57cec5SDimitry Andric    static const bool is_steady =                         true; // constexpr in C++14
3140b57cec5SDimitry Andric
3150b57cec5SDimitry Andric    static time_point now() noexcept;
3160b57cec5SDimitry Andric};
3170b57cec5SDimitry Andric
3180b57cec5SDimitry Andrictypedef steady_clock high_resolution_clock;
3190b57cec5SDimitry Andric
3200b57cec5SDimitry Andric// 25.7.8, local time           // C++20
3210b57cec5SDimitry Andricstruct local_t {};
3220b57cec5SDimitry Andrictemplate<class Duration>
3230b57cec5SDimitry Andric  using local_time  = time_point<local_t, Duration>;
3240b57cec5SDimitry Andricusing local_seconds = local_time<seconds>;
3250b57cec5SDimitry Andricusing local_days    = local_time<days>;
3260b57cec5SDimitry Andric
3270b57cec5SDimitry Andric// 25.8.2, class last_spec    // C++20
3280b57cec5SDimitry Andricstruct last_spec;
3290b57cec5SDimitry Andric
3300b57cec5SDimitry Andric// 25.8.3, class day          // C++20
3310b57cec5SDimitry Andric
3320b57cec5SDimitry Andricclass day;
3330b57cec5SDimitry Andricconstexpr bool operator==(const day& x, const day& y) noexcept;
334753f127fSDimitry Andricconstexpr strong_ordering operator<=>(const day& x, const day& y) noexcept;
3350b57cec5SDimitry Andricconstexpr day  operator+(const day&  x, const days& y) noexcept;
3360b57cec5SDimitry Andricconstexpr day  operator+(const days& x, const day&  y) noexcept;
3370b57cec5SDimitry Andricconstexpr day  operator-(const day&  x, const days& y) noexcept;
3380b57cec5SDimitry Andricconstexpr days operator-(const day&  x, const day&  y) noexcept;
339*bdd1243dSDimitry Andrictemplate<class charT, class traits>
340*bdd1243dSDimitry Andric  basic_ostream<charT, traits>&
341*bdd1243dSDimitry Andric    operator<<(basic_ostream<charT, traits>& os, const day& d);
3420b57cec5SDimitry Andric
3430b57cec5SDimitry Andric// 25.8.4, class month    // C++20
3440b57cec5SDimitry Andricclass month;
3450b57cec5SDimitry Andricconstexpr bool operator==(const month& x, const month& y) noexcept;
346*bdd1243dSDimitry Andricconstexpr strong_ordering operator<=>(const month& x, const month& y) noexcept;
347*bdd1243dSDimitry Andric
3480b57cec5SDimitry Andricconstexpr month  operator+(const month&  x, const months& y) noexcept;
3490b57cec5SDimitry Andricconstexpr month  operator+(const months& x,  const month& y) noexcept;
3500b57cec5SDimitry Andricconstexpr month  operator-(const month&  x, const months& y) noexcept;
3510b57cec5SDimitry Andricconstexpr months operator-(const month&  x,  const month& y) noexcept;
352*bdd1243dSDimitry Andrictemplate<class charT, class traits>
353*bdd1243dSDimitry Andric  basic_ostream<charT, traits>&
354*bdd1243dSDimitry Andric    operator<<(basic_ostream<charT, traits>& os, const month& m);
3550b57cec5SDimitry Andric
3560b57cec5SDimitry Andric// 25.8.5, class year    // C++20
3570b57cec5SDimitry Andricclass year;
3580b57cec5SDimitry Andricconstexpr bool operator==(const year& x, const year& y) noexcept;
359*bdd1243dSDimitry Andricconstexpr strong_ordering operator<=>(const year& x, const year& y) noexcept;
360*bdd1243dSDimitry Andric
3610b57cec5SDimitry Andricconstexpr year  operator+(const year&  x, const years& y) noexcept;
3620b57cec5SDimitry Andricconstexpr year  operator+(const years& x, const year&  y) noexcept;
3630b57cec5SDimitry Andricconstexpr year  operator-(const year&  x, const years& y) noexcept;
3640b57cec5SDimitry Andricconstexpr years operator-(const year&  x, const year&  y) noexcept;
365*bdd1243dSDimitry Andrictemplate<class charT, class traits>
366*bdd1243dSDimitry Andric  basic_ostream<charT, traits>&
367*bdd1243dSDimitry Andric    operator<<(basic_ostream<charT, traits>& os, const year& y);
3680b57cec5SDimitry Andric
3690b57cec5SDimitry Andric// 25.8.6, class weekday    // C++20
3700b57cec5SDimitry Andricclass weekday;
3710b57cec5SDimitry Andric
3720b57cec5SDimitry Andricconstexpr bool operator==(const weekday& x, const weekday& y) noexcept;
3730b57cec5SDimitry Andricconstexpr bool operator!=(const weekday& x, const weekday& y) noexcept;
3740b57cec5SDimitry Andricconstexpr weekday operator+(const weekday& x, const days&    y) noexcept;
3750b57cec5SDimitry Andricconstexpr weekday operator+(const days&    x, const weekday& y) noexcept;
3760b57cec5SDimitry Andricconstexpr weekday operator-(const weekday& x, const days&    y) noexcept;
3770b57cec5SDimitry Andricconstexpr days    operator-(const weekday& x, const weekday& y) noexcept;
378*bdd1243dSDimitry Andrictemplate<class charT, class traits>
379*bdd1243dSDimitry Andric  basic_ostream<charT, traits>&
380*bdd1243dSDimitry Andric    operator<<(basic_ostream<charT, traits>& os, const weekday& wd);
3810b57cec5SDimitry Andric
3820b57cec5SDimitry Andric// 25.8.7, class weekday_indexed    // C++20
3830b57cec5SDimitry Andric
3840b57cec5SDimitry Andricclass weekday_indexed;
3850b57cec5SDimitry Andricconstexpr bool operator==(const weekday_indexed& x, const weekday_indexed& y) noexcept;
3860b57cec5SDimitry Andricconstexpr bool operator!=(const weekday_indexed& x, const weekday_indexed& y) noexcept;
3870b57cec5SDimitry Andric
388*bdd1243dSDimitry Andrictemplate<class charT, class traits>
389*bdd1243dSDimitry Andric  basic_ostream<charT, traits>&
390*bdd1243dSDimitry Andric    operator<<(basic_ostream<charT, traits>& os, const weekday_indexed& wdi);
391*bdd1243dSDimitry Andric
3920b57cec5SDimitry Andric// 25.8.8, class weekday_last    // C++20
3930b57cec5SDimitry Andricclass weekday_last;
3940b57cec5SDimitry Andric
3950b57cec5SDimitry Andricconstexpr bool operator==(const weekday_last& x, const weekday_last& y) noexcept;
3960b57cec5SDimitry Andricconstexpr bool operator!=(const weekday_last& x, const weekday_last& y) noexcept;
3970b57cec5SDimitry Andric
398*bdd1243dSDimitry Andrictemplate<class charT, class traits>
399*bdd1243dSDimitry Andric  basic_ostream<charT, traits>&
400*bdd1243dSDimitry Andric    operator<<(basic_ostream<charT, traits>& os, const weekday_last& wdl);
401*bdd1243dSDimitry Andric
4020b57cec5SDimitry Andric// 25.8.9, class month_day    // C++20
4030b57cec5SDimitry Andricclass month_day;
4040b57cec5SDimitry Andric
4050b57cec5SDimitry Andricconstexpr bool operator==(const month_day& x, const month_day& y) noexcept;
406*bdd1243dSDimitry Andricconstexpr strong_ordering operator<=>(const month_day& x, const month_day& y) noexcept;
4070b57cec5SDimitry Andric
408*bdd1243dSDimitry Andrictemplate<class charT, class traits>
409*bdd1243dSDimitry Andric  basic_ostream<charT, traits>&
410*bdd1243dSDimitry Andric    operator<<(basic_ostream<charT, traits>& os, const month_day& md);
4110b57cec5SDimitry Andric
4120b57cec5SDimitry Andric// 25.8.10, class month_day_last    // C++20
4130b57cec5SDimitry Andricclass month_day_last;
4140b57cec5SDimitry Andric
4150b57cec5SDimitry Andricconstexpr bool operator==(const month_day_last& x, const month_day_last& y) noexcept;
416*bdd1243dSDimitry Andricconstexpr strong_ordering operator<=>(const month_day_last& x, const month_day_last& y) noexcept;
417*bdd1243dSDimitry Andric
418*bdd1243dSDimitry Andrictemplate<class charT, class traits>
419*bdd1243dSDimitry Andric  basic_ostream<charT, traits>&
420*bdd1243dSDimitry Andric    operator<<(basic_ostream<charT, traits>& os, const month_day_last& mdl);
4210b57cec5SDimitry Andric
4220b57cec5SDimitry Andric// 25.8.11, class month_weekday    // C++20
4230b57cec5SDimitry Andricclass month_weekday;
4240b57cec5SDimitry Andric
4250b57cec5SDimitry Andricconstexpr bool operator==(const month_weekday& x, const month_weekday& y) noexcept;
4260b57cec5SDimitry Andricconstexpr bool operator!=(const month_weekday& x, const month_weekday& y) noexcept;
4270b57cec5SDimitry Andric
428*bdd1243dSDimitry Andrictemplate<class charT, class traits>
429*bdd1243dSDimitry Andric  basic_ostream<charT, traits>&
430*bdd1243dSDimitry Andric    operator<<(basic_ostream<charT, traits>& os, const month_weekday& mwd);
431*bdd1243dSDimitry Andric
4320b57cec5SDimitry Andric// 25.8.12, class month_weekday_last    // C++20
4330b57cec5SDimitry Andricclass month_weekday_last;
4340b57cec5SDimitry Andric
4350b57cec5SDimitry Andricconstexpr bool operator==(const month_weekday_last& x, const month_weekday_last& y) noexcept;
4360b57cec5SDimitry Andricconstexpr bool operator!=(const month_weekday_last& x, const month_weekday_last& y) noexcept;
4370b57cec5SDimitry Andric
438*bdd1243dSDimitry Andrictemplate<class charT, class traits>
439*bdd1243dSDimitry Andric  basic_ostream<charT, traits>&
440*bdd1243dSDimitry Andric    operator<<(basic_ostream<charT, traits>& os, const month_weekday_last& mwdl);
441*bdd1243dSDimitry Andric
4420b57cec5SDimitry Andric
4430b57cec5SDimitry Andric// 25.8.13, class year_month    // C++20
4440b57cec5SDimitry Andricclass year_month;
4450b57cec5SDimitry Andric
4460b57cec5SDimitry Andricconstexpr bool operator==(const year_month& x, const year_month& y) noexcept;
447*bdd1243dSDimitry Andricconstexpr strong_ordering operator<=>(const year_month& x, const year_month& y) noexcept;
4480b57cec5SDimitry Andric
4490b57cec5SDimitry Andricconstexpr year_month operator+(const year_month& ym, const months& dm) noexcept;
4500b57cec5SDimitry Andricconstexpr year_month operator+(const months& dm, const year_month& ym) noexcept;
4510b57cec5SDimitry Andricconstexpr year_month operator-(const year_month& ym, const months& dm) noexcept;
4520b57cec5SDimitry Andricconstexpr months operator-(const year_month& x, const year_month& y) noexcept;
4530b57cec5SDimitry Andricconstexpr year_month operator+(const year_month& ym, const years& dy) noexcept;
4540b57cec5SDimitry Andricconstexpr year_month operator+(const years& dy, const year_month& ym) noexcept;
4550b57cec5SDimitry Andricconstexpr year_month operator-(const year_month& ym, const years& dy) noexcept;
4560b57cec5SDimitry Andric
457*bdd1243dSDimitry Andrictemplate<class charT, class traits>
458*bdd1243dSDimitry Andric  basic_ostream<charT, traits>&
459*bdd1243dSDimitry Andric    operator<<(basic_ostream<charT, traits>& os, const year_month& ym);
460*bdd1243dSDimitry Andric
4610b57cec5SDimitry Andric// 25.8.14, class year_month_day class    // C++20
4620b57cec5SDimitry Andricyear_month_day;
4630b57cec5SDimitry Andric
4640b57cec5SDimitry Andricconstexpr bool operator==(const year_month_day& x, const year_month_day& y) noexcept;
465*bdd1243dSDimitry Andricconstexpr strong_ordering operator<=>(const year_month_day& x, const year_month_day& y) noexcept;
4660b57cec5SDimitry Andric
4670b57cec5SDimitry Andricconstexpr year_month_day operator+(const year_month_day& ymd, const months& dm) noexcept;
4680b57cec5SDimitry Andricconstexpr year_month_day operator+(const months& dm, const year_month_day& ymd) noexcept;
4690b57cec5SDimitry Andricconstexpr year_month_day operator+(const year_month_day& ymd, const years& dy) noexcept;
4700b57cec5SDimitry Andricconstexpr year_month_day operator+(const years& dy, const year_month_day& ymd) noexcept;
4710b57cec5SDimitry Andricconstexpr year_month_day operator-(const year_month_day& ymd, const months& dm) noexcept;
4720b57cec5SDimitry Andricconstexpr year_month_day operator-(const year_month_day& ymd, const years& dy) noexcept;
4730b57cec5SDimitry Andric
474*bdd1243dSDimitry Andrictemplate<class charT, class traits>
475*bdd1243dSDimitry Andric  basic_ostream<charT, traits>&
476*bdd1243dSDimitry Andric    operator<<(basic_ostream<charT, traits>& os, const year_month_day& ymd);
4770b57cec5SDimitry Andric
4780b57cec5SDimitry Andric// 25.8.15, class year_month_day_last    // C++20
4790b57cec5SDimitry Andricclass year_month_day_last;
4800b57cec5SDimitry Andric
481*bdd1243dSDimitry Andricconstexpr bool operator==(const year_month_day_last& x, const year_month_day_last& y) noexcept;
482*bdd1243dSDimitry Andricconstexpr strong_ordering operator<=>(const year_month_day_last_day& x, const year_month_day_last_day& y) noexcept;
4830b57cec5SDimitry Andric
4840b57cec5SDimitry Andricconstexpr year_month_day_last
4850b57cec5SDimitry Andric  operator+(const year_month_day_last& ymdl, const months& dm) noexcept;
4860b57cec5SDimitry Andricconstexpr year_month_day_last
4870b57cec5SDimitry Andric  operator+(const months& dm, const year_month_day_last& ymdl) noexcept;
4880b57cec5SDimitry Andricconstexpr year_month_day_last
4890b57cec5SDimitry Andric  operator+(const year_month_day_last& ymdl, const years& dy) noexcept;
4900b57cec5SDimitry Andricconstexpr year_month_day_last
4910b57cec5SDimitry Andric  operator+(const years& dy, const year_month_day_last& ymdl) noexcept;
4920b57cec5SDimitry Andricconstexpr year_month_day_last
4930b57cec5SDimitry Andric  operator-(const year_month_day_last& ymdl, const months& dm) noexcept;
4940b57cec5SDimitry Andricconstexpr year_month_day_last
4950b57cec5SDimitry Andric  operator-(const year_month_day_last& ymdl, const years& dy) noexcept;
4960b57cec5SDimitry Andric
497*bdd1243dSDimitry Andrictemplate<class charT, class traits>
498*bdd1243dSDimitry Andric  basic_ostream<charT, traits>&
499*bdd1243dSDimitry Andric    operator<<(basic_ostream<charT, traits>& os, const year_month_day_last& ymdl);
500*bdd1243dSDimitry Andric
5010b57cec5SDimitry Andric// 25.8.16, class year_month_weekday    // C++20
5020b57cec5SDimitry Andricclass year_month_weekday;
5030b57cec5SDimitry Andric
5040b57cec5SDimitry Andricconstexpr bool operator==(const year_month_weekday& x,
5050b57cec5SDimitry Andric                          const year_month_weekday& y) noexcept;
5060b57cec5SDimitry Andricconstexpr bool operator!=(const year_month_weekday& x,
5070b57cec5SDimitry Andric                          const year_month_weekday& y) noexcept;
5080b57cec5SDimitry Andric
5090b57cec5SDimitry Andricconstexpr year_month_weekday
5100b57cec5SDimitry Andric  operator+(const year_month_weekday& ymwd, const months& dm) noexcept;
5110b57cec5SDimitry Andricconstexpr year_month_weekday
5120b57cec5SDimitry Andric  operator+(const months& dm, const year_month_weekday& ymwd) noexcept;
5130b57cec5SDimitry Andricconstexpr year_month_weekday
5140b57cec5SDimitry Andric  operator+(const year_month_weekday& ymwd, const years& dy) noexcept;
5150b57cec5SDimitry Andricconstexpr year_month_weekday
5160b57cec5SDimitry Andric  operator+(const years& dy, const year_month_weekday& ymwd) noexcept;
5170b57cec5SDimitry Andricconstexpr year_month_weekday
5180b57cec5SDimitry Andric  operator-(const year_month_weekday& ymwd, const months& dm) noexcept;
5190b57cec5SDimitry Andricconstexpr year_month_weekday
5200b57cec5SDimitry Andric  operator-(const year_month_weekday& ymwd, const years& dy) noexcept;
5210b57cec5SDimitry Andric
522*bdd1243dSDimitry Andrictemplate<class charT, class traits>
523*bdd1243dSDimitry Andric  basic_ostream<charT, traits>&
524*bdd1243dSDimitry Andric    operator<<(basic_ostream<charT, traits>& os, const year_month_weekday& ymwd);
525*bdd1243dSDimitry Andric
5260b57cec5SDimitry Andric// 25.8.17, class year_month_weekday_last    // C++20
5270b57cec5SDimitry Andricclass year_month_weekday_last;
5280b57cec5SDimitry Andric
5290b57cec5SDimitry Andricconstexpr bool operator==(const year_month_weekday_last& x,
5300b57cec5SDimitry Andric                          const year_month_weekday_last& y) noexcept;
5310b57cec5SDimitry Andricconstexpr bool operator!=(const year_month_weekday_last& x,
5320b57cec5SDimitry Andric                          const year_month_weekday_last& y) noexcept;
5330b57cec5SDimitry Andricconstexpr year_month_weekday_last
5340b57cec5SDimitry Andric  operator+(const year_month_weekday_last& ymwdl, const months& dm) noexcept;
5350b57cec5SDimitry Andricconstexpr year_month_weekday_last
5360b57cec5SDimitry Andric  operator+(const months& dm, const year_month_weekday_last& ymwdl) noexcept;
5370b57cec5SDimitry Andricconstexpr year_month_weekday_last
5380b57cec5SDimitry Andric  operator+(const year_month_weekday_last& ymwdl, const years& dy) noexcept;
5390b57cec5SDimitry Andricconstexpr year_month_weekday_last
5400b57cec5SDimitry Andric  operator+(const years& dy, const year_month_weekday_last& ymwdl) noexcept;
5410b57cec5SDimitry Andricconstexpr year_month_weekday_last
5420b57cec5SDimitry Andric  operator-(const year_month_weekday_last& ymwdl, const months& dm) noexcept;
5430b57cec5SDimitry Andricconstexpr year_month_weekday_last
5440b57cec5SDimitry Andric  operator-(const year_month_weekday_last& ymwdl, const years& dy) noexcept;
5450b57cec5SDimitry Andric
546*bdd1243dSDimitry Andrictemplate<class charT, class traits>
547*bdd1243dSDimitry Andric  basic_ostream<charT, traits>&
548*bdd1243dSDimitry Andric    operator<<(basic_ostream<charT, traits>& os, const year_month_weekday_last& ymwdl);
549*bdd1243dSDimitry Andric
5500b57cec5SDimitry Andric// 25.8.18, civil calendar conventional syntax operators    // C++20
5510b57cec5SDimitry Andricconstexpr year_month
5520b57cec5SDimitry Andric  operator/(const year& y, const month& m) noexcept;
5530b57cec5SDimitry Andricconstexpr year_month
5540b57cec5SDimitry Andric  operator/(const year& y, int m) noexcept;
5550b57cec5SDimitry Andricconstexpr month_day
5560b57cec5SDimitry Andric  operator/(const month& m, const day& d) noexcept;
5570b57cec5SDimitry Andricconstexpr month_day
5580b57cec5SDimitry Andric  operator/(const month& m, int d) noexcept;
5590b57cec5SDimitry Andricconstexpr month_day
5600b57cec5SDimitry Andric  operator/(int m, const day& d) noexcept;
5610b57cec5SDimitry Andricconstexpr month_day
5620b57cec5SDimitry Andric  operator/(const day& d, const month& m) noexcept;
5630b57cec5SDimitry Andricconstexpr month_day
5640b57cec5SDimitry Andric  operator/(const day& d, int m) noexcept;
5650b57cec5SDimitry Andricconstexpr month_day_last
5660b57cec5SDimitry Andric  operator/(const month& m, last_spec) noexcept;
5670b57cec5SDimitry Andricconstexpr month_day_last
5680b57cec5SDimitry Andric  operator/(int m, last_spec) noexcept;
5690b57cec5SDimitry Andricconstexpr month_day_last
5700b57cec5SDimitry Andric  operator/(last_spec, const month& m) noexcept;
5710b57cec5SDimitry Andricconstexpr month_day_last
5720b57cec5SDimitry Andric  operator/(last_spec, int m) noexcept;
5730b57cec5SDimitry Andricconstexpr month_weekday
5740b57cec5SDimitry Andric  operator/(const month& m, const weekday_indexed& wdi) noexcept;
5750b57cec5SDimitry Andricconstexpr month_weekday
5760b57cec5SDimitry Andric  operator/(int m, const weekday_indexed& wdi) noexcept;
5770b57cec5SDimitry Andricconstexpr month_weekday
5780b57cec5SDimitry Andric  operator/(const weekday_indexed& wdi, const month& m) noexcept;
5790b57cec5SDimitry Andricconstexpr month_weekday
5800b57cec5SDimitry Andric  operator/(const weekday_indexed& wdi, int m) noexcept;
5810b57cec5SDimitry Andricconstexpr month_weekday_last
5820b57cec5SDimitry Andric  operator/(const month& m, const weekday_last& wdl) noexcept;
5830b57cec5SDimitry Andricconstexpr month_weekday_last
5840b57cec5SDimitry Andric  operator/(int m, const weekday_last& wdl) noexcept;
5850b57cec5SDimitry Andricconstexpr month_weekday_last
5860b57cec5SDimitry Andric  operator/(const weekday_last& wdl, const month& m) noexcept;
5870b57cec5SDimitry Andricconstexpr month_weekday_last
5880b57cec5SDimitry Andric  operator/(const weekday_last& wdl, int m) noexcept;
5890b57cec5SDimitry Andricconstexpr year_month_day
5900b57cec5SDimitry Andric  operator/(const year_month& ym, const day& d) noexcept;
5910b57cec5SDimitry Andricconstexpr year_month_day
5920b57cec5SDimitry Andric  operator/(const year_month& ym, int d) noexcept;
5930b57cec5SDimitry Andricconstexpr year_month_day
5940b57cec5SDimitry Andric  operator/(const year& y, const month_day& md) noexcept;
5950b57cec5SDimitry Andricconstexpr year_month_day
5960b57cec5SDimitry Andric  operator/(int y, const month_day& md) noexcept;
5970b57cec5SDimitry Andricconstexpr year_month_day
5980b57cec5SDimitry Andric  operator/(const month_day& md, const year& y) noexcept;
5990b57cec5SDimitry Andricconstexpr year_month_day
6000b57cec5SDimitry Andric  operator/(const month_day& md, int y) noexcept;
6010b57cec5SDimitry Andricconstexpr year_month_day_last
6020b57cec5SDimitry Andric  operator/(const year_month& ym, last_spec) noexcept;
6030b57cec5SDimitry Andricconstexpr year_month_day_last
6040b57cec5SDimitry Andric  operator/(const year& y, const month_day_last& mdl) noexcept;
6050b57cec5SDimitry Andricconstexpr year_month_day_last
6060b57cec5SDimitry Andric  operator/(int y, const month_day_last& mdl) noexcept;
6070b57cec5SDimitry Andricconstexpr year_month_day_last
6080b57cec5SDimitry Andric  operator/(const month_day_last& mdl, const year& y) noexcept;
6090b57cec5SDimitry Andricconstexpr year_month_day_last
6100b57cec5SDimitry Andric  operator/(const month_day_last& mdl, int y) noexcept;
6110b57cec5SDimitry Andricconstexpr year_month_weekday
6120b57cec5SDimitry Andric  operator/(const year_month& ym, const weekday_indexed& wdi) noexcept;
6130b57cec5SDimitry Andricconstexpr year_month_weekday
6140b57cec5SDimitry Andric  operator/(const year& y, const month_weekday& mwd) noexcept;
6150b57cec5SDimitry Andricconstexpr year_month_weekday
6160b57cec5SDimitry Andric  operator/(int y, const month_weekday& mwd) noexcept;
6170b57cec5SDimitry Andricconstexpr year_month_weekday
6180b57cec5SDimitry Andric  operator/(const month_weekday& mwd, const year& y) noexcept;
6190b57cec5SDimitry Andricconstexpr year_month_weekday
6200b57cec5SDimitry Andric  operator/(const month_weekday& mwd, int y) noexcept;
6210b57cec5SDimitry Andricconstexpr year_month_weekday_last
6220b57cec5SDimitry Andric  operator/(const year_month& ym, const weekday_last& wdl) noexcept;
6230b57cec5SDimitry Andricconstexpr year_month_weekday_last
6240b57cec5SDimitry Andric  operator/(const year& y, const month_weekday_last& mwdl) noexcept;
6250b57cec5SDimitry Andricconstexpr year_month_weekday_last
6260b57cec5SDimitry Andric  operator/(int y, const month_weekday_last& mwdl) noexcept;
6270b57cec5SDimitry Andricconstexpr year_month_weekday_last
6280b57cec5SDimitry Andric  operator/(const month_weekday_last& mwdl, const year& y) noexcept;
6290b57cec5SDimitry Andricconstexpr year_month_weekday_last
6300b57cec5SDimitry Andric  operator/(const month_weekday_last& mwdl, int y) noexcept;
6310b57cec5SDimitry Andric
632e40139ffSDimitry Andric// 26.9, class template hh_mm_ss
633e40139ffSDimitry Andrictemplate <class Duration>
634e40139ffSDimitry Andricclass hh_mm_ss
635e40139ffSDimitry Andric{
636e40139ffSDimitry Andric    bool            is_neg; // exposition only
637e40139ffSDimitry Andric    chrono::hours   h;      // exposition only
638e40139ffSDimitry Andric    chrono::minutes m;      // exposition only
639e40139ffSDimitry Andric    chrono::seconds s;      // exposition only
640e40139ffSDimitry Andric    precision       ss;     // exposition only
6410b57cec5SDimitry Andric
642e40139ffSDimitry Andricpublic:
643e40139ffSDimitry Andric    static unsigned constexpr fractional_width = see below;
644e40139ffSDimitry Andric    using precision                            = see below;
645e40139ffSDimitry Andric
646e40139ffSDimitry Andric    constexpr hh_mm_ss() noexcept : hh_mm_ss{Duration::zero()} {}
647e40139ffSDimitry Andric    constexpr explicit hh_mm_ss(Duration d) noexcept;
648e40139ffSDimitry Andric
649e40139ffSDimitry Andric    constexpr bool is_negative() const noexcept;
650e40139ffSDimitry Andric    constexpr chrono::hours hours() const noexcept;
651e40139ffSDimitry Andric    constexpr chrono::minutes minutes() const noexcept;
652e40139ffSDimitry Andric    constexpr chrono::seconds seconds() const noexcept;
653e40139ffSDimitry Andric    constexpr precision subseconds() const noexcept;
654e40139ffSDimitry Andric
655e40139ffSDimitry Andric    constexpr explicit operator  precision()   const noexcept;
656e40139ffSDimitry Andric    constexpr          precision to_duration() const noexcept;
657e40139ffSDimitry Andric};
658e40139ffSDimitry Andric
659e40139ffSDimitry Andric// 26.10, 12/24 hour functions
660e40139ffSDimitry Andricconstexpr bool is_am(hours const& h) noexcept;
661e40139ffSDimitry Andricconstexpr bool is_pm(hours const& h) noexcept;
662e40139ffSDimitry Andricconstexpr hours make12(const hours& h) noexcept;
663e40139ffSDimitry Andricconstexpr hours make24(const hours& h, bool is_pm) noexcept;
664e40139ffSDimitry Andric
6650b57cec5SDimitry Andric// 25.10.5, class time_zone    // C++20
6660b57cec5SDimitry Andricenum class choose {earliest, latest};
6670b57cec5SDimitry Andricclass time_zone;
6680b57cec5SDimitry Andricbool operator==(const time_zone& x, const time_zone& y) noexcept;
6690b57cec5SDimitry Andricbool operator!=(const time_zone& x, const time_zone& y) noexcept;
6700b57cec5SDimitry Andricbool operator<(const time_zone& x, const time_zone& y) noexcept;
6710b57cec5SDimitry Andricbool operator>(const time_zone& x, const time_zone& y) noexcept;
6720b57cec5SDimitry Andricbool operator<=(const time_zone& x, const time_zone& y) noexcept;
6730b57cec5SDimitry Andricbool operator>=(const time_zone& x, const time_zone& y) noexcept;
674*bdd1243dSDimitry Andric}  // chrono
6750b57cec5SDimitry Andric
676*bdd1243dSDimitry Andricnamespace std {
677*bdd1243dSDimitry Andric  template<class Rep, class Period, class charT>
678*bdd1243dSDimitry Andric    struct formatter<chrono::duration<Rep, Period>, charT>;                       // C++20
679*bdd1243dSDimitry Andric  template<class charT> struct formatter<chrono::day, charT>;                     // C++20
680*bdd1243dSDimitry Andric  template<class charT> struct formatter<chrono::month, charT>;                   // C++20
681*bdd1243dSDimitry Andric  template<class charT> struct formatter<chrono::year, charT>;                    // C++20
682*bdd1243dSDimitry Andric  template<class charT> struct formatter<chrono::weekday, charT>;                 // C++20
683*bdd1243dSDimitry Andric  template<class charT> struct formatter<chrono::weekday_indexed, charT>;         // C++20
684*bdd1243dSDimitry Andric  template<class charT> struct formatter<chrono::weekday_last, charT>;            // C++20
685*bdd1243dSDimitry Andric  template<class charT> struct formatter<chrono::month_day, charT>;               // C++20
686*bdd1243dSDimitry Andric  template<class charT> struct formatter<chrono::month_day_last, charT>;          // C++20
687*bdd1243dSDimitry Andric  template<class charT> struct formatter<chrono::month_weekday, charT>;           // C++20
688*bdd1243dSDimitry Andric  template<class charT> struct formatter<chrono::month_weekday_last, charT>;      // C++20
689*bdd1243dSDimitry Andric  template<class charT> struct formatter<chrono::year_month, charT>;              // C++20
690*bdd1243dSDimitry Andric  template<class charT> struct formatter<chrono::year_month_day, charT>;          // C++20
691*bdd1243dSDimitry Andric  template<class charT> struct formatter<chrono::year_month_day_last, charT>;     // C++20
692*bdd1243dSDimitry Andric  template<class charT> struct formatter<chrono::year_month_weekday, charT>;      // C++20
693*bdd1243dSDimitry Andric  template<class charT> struct formatter<chrono::year_month_weekday_last, charT>; // C++20
694*bdd1243dSDimitry Andric} // namespace std
695*bdd1243dSDimitry Andric
696*bdd1243dSDimitry Andricnamespace chrono {
6970b57cec5SDimitry Andric// calendrical constants
6980b57cec5SDimitry Andricinline constexpr last_spec                              last{};       // C++20
6990b57cec5SDimitry Andricinline constexpr chrono::weekday                        Sunday{0};    // C++20
7000b57cec5SDimitry Andricinline constexpr chrono::weekday                        Monday{1};    // C++20
7010b57cec5SDimitry Andricinline constexpr chrono::weekday                        Tuesday{2};   // C++20
7020b57cec5SDimitry Andricinline constexpr chrono::weekday                        Wednesday{3}; // C++20
7030b57cec5SDimitry Andricinline constexpr chrono::weekday                        Thursday{4};  // C++20
7040b57cec5SDimitry Andricinline constexpr chrono::weekday                        Friday{5};    // C++20
7050b57cec5SDimitry Andricinline constexpr chrono::weekday                        Saturday{6};  // C++20
7060b57cec5SDimitry Andric
7070b57cec5SDimitry Andricinline constexpr chrono::month                          January{1};   // C++20
7080b57cec5SDimitry Andricinline constexpr chrono::month                          February{2};  // C++20
7090b57cec5SDimitry Andricinline constexpr chrono::month                          March{3};     // C++20
7100b57cec5SDimitry Andricinline constexpr chrono::month                          April{4};     // C++20
7110b57cec5SDimitry Andricinline constexpr chrono::month                          May{5};       // C++20
7120b57cec5SDimitry Andricinline constexpr chrono::month                          June{6};      // C++20
7130b57cec5SDimitry Andricinline constexpr chrono::month                          July{7};      // C++20
7140b57cec5SDimitry Andricinline constexpr chrono::month                          August{8};    // C++20
7150b57cec5SDimitry Andricinline constexpr chrono::month                          September{9}; // C++20
7160b57cec5SDimitry Andricinline constexpr chrono::month                          October{10};  // C++20
7170b57cec5SDimitry Andricinline constexpr chrono::month                          November{11}; // C++20
7180b57cec5SDimitry Andricinline constexpr chrono::month                          December{12}; // C++20
7190b57cec5SDimitry Andric}  // chrono
7200b57cec5SDimitry Andric
7210b57cec5SDimitry Andricinline namespace literals {
7220b57cec5SDimitry Andric  inline namespace chrono_literals {
7230b57cec5SDimitry Andricconstexpr chrono::hours                                 operator ""h(unsigned long long); // C++14
7240b57cec5SDimitry Andricconstexpr chrono::duration<unspecified , ratio<3600,1>> operator ""h(long double); // C++14
7250b57cec5SDimitry Andricconstexpr chrono::minutes                               operator ""min(unsigned long long); // C++14
7260b57cec5SDimitry Andricconstexpr chrono::duration<unspecified , ratio<60,1>>   operator ""min(long double); // C++14
7270b57cec5SDimitry Andricconstexpr chrono::seconds                               operator ""s(unsigned long long); // C++14
7280b57cec5SDimitry Andricconstexpr chrono::duration<unspecified >                operator ""s(long double); // C++14
7290b57cec5SDimitry Andricconstexpr chrono::milliseconds                          operator ""ms(unsigned long long); // C++14
7300b57cec5SDimitry Andricconstexpr chrono::duration<unspecified , milli>         operator ""ms(long double); // C++14
7310b57cec5SDimitry Andricconstexpr chrono::microseconds                          operator ""us(unsigned long long); // C++14
7320b57cec5SDimitry Andricconstexpr chrono::duration<unspecified , micro>         operator ""us(long double); // C++14
7330b57cec5SDimitry Andricconstexpr chrono::nanoseconds                           operator ""ns(unsigned long long); // C++14
7340b57cec5SDimitry Andricconstexpr chrono::duration<unspecified , nano>          operator ""ns(long double); // C++14
7350b57cec5SDimitry Andricconstexpr chrono::day                                   operator ""d(unsigned long long d) noexcept; // C++20
7360b57cec5SDimitry Andricconstexpr chrono::year                                  operator ""y(unsigned long long y) noexcept; // C++20
7370b57cec5SDimitry Andric}  // chrono_literals
7380b57cec5SDimitry Andric}  // literals
7390b57cec5SDimitry Andric
7400b57cec5SDimitry Andric}  // std
7410b57cec5SDimitry Andric*/
7420b57cec5SDimitry Andric
74381ad6265SDimitry Andric#include <__assert> // all public C++ headers provide the assertion handler
74404eeddc0SDimitry Andric#include <__chrono/calendar.h>
74504eeddc0SDimitry Andric#include <__chrono/convert_to_timespec.h>
746*bdd1243dSDimitry Andric#include <__chrono/convert_to_tm.h>
74781ad6265SDimitry Andric#include <__chrono/day.h>
74804eeddc0SDimitry Andric#include <__chrono/duration.h>
74904eeddc0SDimitry Andric#include <__chrono/file_clock.h>
75081ad6265SDimitry Andric#include <__chrono/hh_mm_ss.h>
75104eeddc0SDimitry Andric#include <__chrono/high_resolution_clock.h>
75281ad6265SDimitry Andric#include <__chrono/literals.h>
75381ad6265SDimitry Andric#include <__chrono/month.h>
75481ad6265SDimitry Andric#include <__chrono/month_weekday.h>
75581ad6265SDimitry Andric#include <__chrono/monthday.h>
75604eeddc0SDimitry Andric#include <__chrono/steady_clock.h>
75704eeddc0SDimitry Andric#include <__chrono/system_clock.h>
75804eeddc0SDimitry Andric#include <__chrono/time_point.h>
75981ad6265SDimitry Andric#include <__chrono/weekday.h>
76081ad6265SDimitry Andric#include <__chrono/year.h>
76181ad6265SDimitry Andric#include <__chrono/year_month.h>
76281ad6265SDimitry Andric#include <__chrono/year_month_day.h>
76381ad6265SDimitry Andric#include <__chrono/year_month_weekday.h>
764fe6060f1SDimitry Andric#include <__config>
7650b57cec5SDimitry Andric#include <version>
7660b57cec5SDimitry Andric
767753f127fSDimitry Andric// standard-mandated includes
768*bdd1243dSDimitry Andric
769*bdd1243dSDimitry Andric// [time.syn]
770753f127fSDimitry Andric#include <compare>
771753f127fSDimitry Andric
772*bdd1243dSDimitry Andric#if !defined(_LIBCPP_HAS_NO_LOCALIZATION) && !defined(_LIBCPP_HAS_NO_INCOMPLETE_FORMAT) && _LIBCPP_STD_VER > 17
773*bdd1243dSDimitry Andric#  include <__chrono/formatter.h>
774*bdd1243dSDimitry Andric#  include <__chrono/ostream.h>
775*bdd1243dSDimitry Andric#  include <__chrono/parser_std_format_spec.h>
776*bdd1243dSDimitry Andric#  include <__chrono/statically_widen.h>
777*bdd1243dSDimitry Andric#endif
778*bdd1243dSDimitry Andric
779*bdd1243dSDimitry Andric
7800b57cec5SDimitry Andric#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
7810b57cec5SDimitry Andric#  pragma GCC system_header
7820b57cec5SDimitry Andric#endif
7830b57cec5SDimitry Andric
784*bdd1243dSDimitry Andric#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
785*bdd1243dSDimitry Andric#  include <concepts>
786*bdd1243dSDimitry Andric#endif
787*bdd1243dSDimitry Andric
7880b57cec5SDimitry Andric#endif // _LIBCPP_CHRONO
789