2 //===----------------------------------------------------------------------===//
4 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
5 // See https://llvm.org/LICENSE.txt for license information.
6 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
8 //===----------------------------------------------------------------------===//
10 #ifndef _LIBCPP___CHRONO_WEEKDAY_H
11 #define _LIBCPP___CHRONO_WEEKDAY_H
13 #include <__chrono/calendar.h>
14 #include <__chrono/duration.h>
15 #include <__chrono/system_clock.h>
16 #include <__chrono/time_point.h>
19 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
20 # pragma GCC system_header
23 #if _LIBCPP_STD_VER >= 20
25 _LIBCPP_BEGIN_NAMESPACE_STD
29 class weekday_indexed
;
35 _LIBCPP_HIDE_FROM_ABI
static constexpr unsigned char __weekday_from_days(int __days
) noexcept
;
39 _LIBCPP_HIDE_FROM_ABI
inline explicit constexpr weekday(unsigned __val
) noexcept
40 : __wd_(static_cast<unsigned char>(__val
== 7 ? 0 : __val
)) {}
41 _LIBCPP_HIDE_FROM_ABI
inline constexpr weekday(const sys_days
& __sysd
) noexcept
42 : __wd_(__weekday_from_days(__sysd
.time_since_epoch().count())) {}
43 _LIBCPP_HIDE_FROM_ABI
inline explicit constexpr weekday(const local_days
& __locd
) noexcept
44 : __wd_(__weekday_from_days(__locd
.time_since_epoch().count())) {}
46 _LIBCPP_HIDE_FROM_ABI
inline constexpr weekday
& operator++() noexcept
{
47 __wd_
= (__wd_
== 6 ? 0 : __wd_
+ 1);
50 _LIBCPP_HIDE_FROM_ABI
inline constexpr weekday
operator++(int) noexcept
{
51 weekday __tmp
= *this;
55 _LIBCPP_HIDE_FROM_ABI
inline constexpr weekday
& operator--() noexcept
{
56 __wd_
= (__wd_
== 0 ? 6 : __wd_
- 1);
59 _LIBCPP_HIDE_FROM_ABI
inline constexpr weekday
operator--(int) noexcept
{
60 weekday __tmp
= *this;
64 _LIBCPP_HIDE_FROM_ABI
constexpr weekday
& operator+=(const days
& __dd
) noexcept
;
65 _LIBCPP_HIDE_FROM_ABI
constexpr weekday
& operator-=(const days
& __dd
) noexcept
;
66 _LIBCPP_HIDE_FROM_ABI
inline constexpr unsigned c_encoding() const noexcept
{ return __wd_
; }
67 _LIBCPP_HIDE_FROM_ABI
inline constexpr unsigned iso_encoding() const noexcept
{ return __wd_
== 0u ? 7 : __wd_
; }
68 _LIBCPP_HIDE_FROM_ABI
inline constexpr bool ok() const noexcept
{ return __wd_
<= 6; }
69 _LIBCPP_HIDE_FROM_ABI
constexpr weekday_indexed
operator[](unsigned __index
) const noexcept
;
70 _LIBCPP_HIDE_FROM_ABI
constexpr weekday_last
operator[](last_spec
) const noexcept
;
73 // https://howardhinnant.github.io/date_algorithms.html#weekday_from_days
74 _LIBCPP_HIDE_FROM_ABI
inline constexpr unsigned char weekday::__weekday_from_days(int __days
) noexcept
{
75 return static_cast<unsigned char>(static_cast<unsigned>(__days
>= -4 ? (__days
+ 4) % 7 : (__days
+ 5) % 7 + 6));
78 _LIBCPP_HIDE_FROM_ABI
inline constexpr bool operator==(const weekday
& __lhs
, const weekday
& __rhs
) noexcept
{
79 return __lhs
.c_encoding() == __rhs
.c_encoding();
82 // TODO(LLVM 20): Remove the escape hatch
83 # ifdef _LIBCPP_ENABLE_REMOVED_WEEKDAY_RELATIONAL_OPERATORS
84 _LIBCPP_HIDE_FROM_ABI
inline constexpr bool operator<(const weekday
& __lhs
, const weekday
& __rhs
) noexcept
{
85 return __lhs
.c_encoding() < __rhs
.c_encoding();
88 _LIBCPP_HIDE_FROM_ABI
inline constexpr bool operator>(const weekday
& __lhs
, const weekday
& __rhs
) noexcept
{
92 _LIBCPP_HIDE_FROM_ABI
inline constexpr bool operator<=(const weekday
& __lhs
, const weekday
& __rhs
) noexcept
{
93 return !(__rhs
< __lhs
);
96 _LIBCPP_HIDE_FROM_ABI
inline constexpr bool operator>=(const weekday
& __lhs
, const weekday
& __rhs
) noexcept
{
97 return !(__lhs
< __rhs
);
99 # endif // _LIBCPP_ENABLE_REMOVED_WEEKDAY_RELATIONAL_OPERATORS
101 _LIBCPP_HIDE_FROM_ABI
inline constexpr weekday
operator+(const weekday
& __lhs
, const days
& __rhs
) noexcept
{
102 auto const __mu
= static_cast<long long>(__lhs
.c_encoding()) + __rhs
.count();
103 auto const __yr
= (__mu
>= 0 ? __mu
: __mu
- 6) / 7;
104 return weekday
{static_cast<unsigned>(__mu
- __yr
* 7)};
107 _LIBCPP_HIDE_FROM_ABI
inline constexpr weekday
operator+(const days
& __lhs
, const weekday
& __rhs
) noexcept
{
108 return __rhs
+ __lhs
;
111 _LIBCPP_HIDE_FROM_ABI
inline constexpr weekday
operator-(const weekday
& __lhs
, const days
& __rhs
) noexcept
{
112 return __lhs
+ -__rhs
;
115 _LIBCPP_HIDE_FROM_ABI
inline constexpr days
operator-(const weekday
& __lhs
, const weekday
& __rhs
) noexcept
{
116 const int __wdu
= __lhs
.c_encoding() - __rhs
.c_encoding();
117 const int __wk
= (__wdu
>= 0 ? __wdu
: __wdu
- 6) / 7;
118 return days
{__wdu
- __wk
* 7};
121 _LIBCPP_HIDE_FROM_ABI
inline constexpr weekday
& weekday::operator+=(const days
& __dd
) noexcept
{
122 *this = *this + __dd
;
126 _LIBCPP_HIDE_FROM_ABI
inline constexpr weekday
& weekday::operator-=(const days
& __dd
) noexcept
{
127 *this = *this - __dd
;
131 class weekday_indexed
{
133 chrono::weekday __wd_
;
134 unsigned char __idx_
;
137 weekday_indexed() = default;
138 _LIBCPP_HIDE_FROM_ABI
inline constexpr weekday_indexed(const chrono::weekday
& __wdval
, unsigned __idxval
) noexcept
139 : __wd_
{__wdval
}, __idx_(__idxval
) {}
140 _LIBCPP_HIDE_FROM_ABI
inline constexpr chrono::weekday
weekday() const noexcept
{ return __wd_
; }
141 _LIBCPP_HIDE_FROM_ABI
inline constexpr unsigned index() const noexcept
{ return __idx_
; }
142 _LIBCPP_HIDE_FROM_ABI
inline constexpr bool ok() const noexcept
{ return __wd_
.ok() && __idx_
>= 1 && __idx_
<= 5; }
145 _LIBCPP_HIDE_FROM_ABI
inline constexpr bool
146 operator==(const weekday_indexed
& __lhs
, const weekday_indexed
& __rhs
) noexcept
{
147 return __lhs
.weekday() == __rhs
.weekday() && __lhs
.index() == __rhs
.index();
152 chrono::weekday __wd_
;
155 _LIBCPP_HIDE_FROM_ABI
explicit constexpr weekday_last(const chrono::weekday
& __val
) noexcept
: __wd_
{__val
} {}
156 _LIBCPP_HIDE_FROM_ABI
constexpr chrono::weekday
weekday() const noexcept
{ return __wd_
; }
157 _LIBCPP_HIDE_FROM_ABI
constexpr bool ok() const noexcept
{ return __wd_
.ok(); }
160 _LIBCPP_HIDE_FROM_ABI
inline constexpr bool operator==(const weekday_last
& __lhs
, const weekday_last
& __rhs
) noexcept
{
161 return __lhs
.weekday() == __rhs
.weekday();
164 _LIBCPP_HIDE_FROM_ABI
inline constexpr weekday_indexed
weekday::operator[](unsigned __index
) const noexcept
{
165 return weekday_indexed
{*this, __index
};
168 _LIBCPP_HIDE_FROM_ABI
inline constexpr weekday_last
weekday::operator[](last_spec
) const noexcept
{
169 return weekday_last
{*this};
172 inline constexpr weekday Sunday
{0};
173 inline constexpr weekday Monday
{1};
174 inline constexpr weekday Tuesday
{2};
175 inline constexpr weekday Wednesday
{3};
176 inline constexpr weekday Thursday
{4};
177 inline constexpr weekday Friday
{5};
178 inline constexpr weekday Saturday
{6};
180 } // namespace chrono
182 _LIBCPP_END_NAMESPACE_STD
184 #endif // _LIBCPP_STD_VER >= 20
186 #endif // _LIBCPP___CHRONO_WEEKDAY_H