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_YEAR_H
11 #define _LIBCPP___CHRONO_YEAR_H
13 #include <__chrono/duration.h>
14 #include <__compare/ordering.h>
18 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
19 # pragma GCC system_header
23 #include <__undef_macros>
25 #if _LIBCPP_STD_VER >= 20
27 _LIBCPP_BEGIN_NAMESPACE_STD
37 _LIBCPP_HIDE_FROM_ABI
explicit inline constexpr year(int __val
) noexcept
: __y_(static_cast<short>(__val
)) {}
39 _LIBCPP_HIDE_FROM_ABI
inline constexpr year
& operator++() noexcept
{
43 _LIBCPP_HIDE_FROM_ABI
inline constexpr year
operator++(int) noexcept
{
48 _LIBCPP_HIDE_FROM_ABI
inline constexpr year
& operator--() noexcept
{
52 _LIBCPP_HIDE_FROM_ABI
inline constexpr year
operator--(int) noexcept
{
57 _LIBCPP_HIDE_FROM_ABI
constexpr year
& operator+=(const years
& __dy
) noexcept
;
58 _LIBCPP_HIDE_FROM_ABI
constexpr year
& operator-=(const years
& __dy
) noexcept
;
59 _LIBCPP_HIDE_FROM_ABI
inline constexpr year
operator+() const noexcept
{ return *this; }
60 _LIBCPP_HIDE_FROM_ABI
inline constexpr year
operator-() const noexcept
{ return year
{-__y_
}; }
62 _LIBCPP_HIDE_FROM_ABI
inline constexpr bool is_leap() const noexcept
{
63 return __y_
% 4 == 0 && (__y_
% 100 != 0 || __y_
% 400 == 0);
65 _LIBCPP_HIDE_FROM_ABI
explicit inline constexpr operator int() const noexcept
{ return __y_
; }
66 _LIBCPP_HIDE_FROM_ABI
constexpr bool ok() const noexcept
;
67 _LIBCPP_HIDE_FROM_ABI
static inline constexpr year
min() noexcept
{ return year
{-32767}; }
68 _LIBCPP_HIDE_FROM_ABI
static inline constexpr year
max() noexcept
{ return year
{32767}; }
71 _LIBCPP_HIDE_FROM_ABI
inline constexpr bool operator==(const year
& __lhs
, const year
& __rhs
) noexcept
{
72 return static_cast<int>(__lhs
) == static_cast<int>(__rhs
);
75 _LIBCPP_HIDE_FROM_ABI
constexpr strong_ordering
operator<=>(const year
& __lhs
, const year
& __rhs
) noexcept
{
76 return static_cast<int>(__lhs
) <=> static_cast<int>(__rhs
);
79 _LIBCPP_HIDE_FROM_ABI
inline constexpr year
operator+(const year
& __lhs
, const years
& __rhs
) noexcept
{
80 return year(static_cast<int>(__lhs
) + __rhs
.count());
83 _LIBCPP_HIDE_FROM_ABI
inline constexpr year
operator+(const years
& __lhs
, const year
& __rhs
) noexcept
{
87 _LIBCPP_HIDE_FROM_ABI
inline constexpr year
operator-(const year
& __lhs
, const years
& __rhs
) noexcept
{
88 return __lhs
+ -__rhs
;
91 _LIBCPP_HIDE_FROM_ABI
inline constexpr years
operator-(const year
& __lhs
, const year
& __rhs
) noexcept
{
92 return years
{static_cast<int>(__lhs
) - static_cast<int>(__rhs
)};
95 _LIBCPP_HIDE_FROM_ABI
inline constexpr year
& year::operator+=(const years
& __dy
) noexcept
{
100 _LIBCPP_HIDE_FROM_ABI
inline constexpr year
& year::operator-=(const years
& __dy
) noexcept
{
101 *this = *this - __dy
;
105 _LIBCPP_HIDE_FROM_ABI
constexpr bool year::ok() const noexcept
{
106 static_assert(static_cast<int>(std::numeric_limits
<decltype(__y_
)>::max()) == static_cast<int>(max()));
107 return static_cast<int>(min()) <= __y_
;
110 } // namespace chrono
112 _LIBCPP_END_NAMESPACE_STD
114 #endif // _LIBCPP_STD_VER >= 20
118 #endif // _LIBCPP___CHRONO_YEAR_H