tetl 0.1.0
Embedded Template Library
Loading...
Searching...
No Matches
year_month_day_last.hpp
Go to the documentation of this file.
1// SPDX-License-Identifier: BSL-1.0
2
3#ifndef TETL_CHRONO_YEAR_MONTH_DAY_LAST_HPP
4#define TETL_CHRONO_YEAR_MONTH_DAY_LAST_HPP
5
10
11namespace etl::chrono {
12
13namespace detail {
14
15[[nodiscard]] constexpr auto last_day_of_month(chrono::year const& y, chrono::month const& m) -> chrono::day
16{
17 constexpr chrono::day lastDays[] = {
18 chrono::day{31},
19 chrono::day{28},
20 chrono::day{31},
21 chrono::day{30},
22 chrono::day{31},
23 chrono::day{30},
24 chrono::day{31},
25 chrono::day{31},
26 chrono::day{30},
27 chrono::day{31},
28 chrono::day{30},
29 chrono::day{31},
30 };
31
32 if (m == chrono::month{2} and y.is_leap()) {
33 return chrono::day{29};
34 }
35 return lastDays[static_cast<unsigned>(m) - 1];
36}
37
38} // namespace detail
39
42 constexpr year_month_day_last(chrono::year const& y, chrono::month_day_last const& mdl) noexcept
43 : _y{y}
44 , _mdl{mdl}
45 {
46 }
47
48 constexpr auto operator+=(months const& m) noexcept -> year_month_day_last&;
49 constexpr auto operator-=(months const& m) noexcept -> year_month_day_last&;
50 constexpr auto operator+=(years const& y) noexcept -> year_month_day_last&;
51 constexpr auto operator-=(years const& y) noexcept -> year_month_day_last&;
52
53 [[nodiscard]] constexpr auto year() const noexcept -> chrono::year { return _y; }
54
55 [[nodiscard]] constexpr auto month() const noexcept -> chrono::month { return _mdl.month(); }
56
57 [[nodiscard]] constexpr auto month_day_last() const noexcept -> chrono::month_day_last { return _mdl; }
58
59 [[nodiscard]] constexpr auto day() const noexcept -> chrono::day
60 {
61 return detail::last_day_of_month(year(), month());
62 }
63
64 [[nodiscard]] constexpr operator sys_days() const noexcept;
65 [[nodiscard]] constexpr explicit operator local_days() const noexcept;
66
67 [[nodiscard]] constexpr auto ok() const noexcept -> bool { return _y.ok() and _mdl.ok(); }
68
69private:
70 chrono::year _y;
72};
73
74[[nodiscard]] constexpr auto operator+(chrono::year_month_day_last const& lhs, chrono::months const& rhs) noexcept
76{
77 auto const ym = year_month{lhs.year(), lhs.month()} + rhs;
78 return {ym.year(), month_day_last{ym.month()}};
79}
80
81[[nodiscard]] constexpr auto operator+(chrono::months const& lhs, chrono::year_month_day_last const& rhs) noexcept
83{
84 return rhs + lhs;
85}
86
87[[nodiscard]] constexpr auto operator-(chrono::year_month_day_last const& lhs, chrono::months const& rhs) noexcept
89{
90 return lhs + -rhs;
91}
92
93[[nodiscard]] constexpr auto operator+(chrono::year_month_day_last const& lhs, chrono::years const& rhs) noexcept
95{
96 return {lhs.year() + rhs, lhs.month_day_last()};
97}
98
99[[nodiscard]] constexpr auto operator+(chrono::years const& lhs, chrono::year_month_day_last const& rhs) noexcept
101{
102 return rhs + lhs;
103}
104
105[[nodiscard]] constexpr auto operator-(chrono::year_month_day_last const& lhs, chrono::years const& rhs) noexcept
107{
108 return lhs + -rhs;
109}
110
111constexpr auto year_month_day_last::operator+=(months const& m) noexcept -> year_month_day_last&
112{
113 *this = *this + m;
114 return *this;
115}
116
117constexpr auto year_month_day_last::operator-=(months const& m) noexcept -> year_month_day_last&
118{
119 *this = *this - m;
120 return *this;
121}
122
123constexpr auto year_month_day_last::operator+=(years const& y) noexcept -> year_month_day_last&
124{
125 *this = *this + y;
126 return *this;
127}
128
129constexpr auto year_month_day_last::operator-=(years const& y) noexcept -> year_month_day_last&
130{
131 *this = *this - y;
132 return *this;
133}
134
135[[nodiscard]] constexpr auto operator/(year_month const& ym, last_spec /*tag*/) noexcept -> year_month_day_last
136{
137 return {ym.year(), month_day_last(ym.month())};
138}
139
140[[nodiscard]] constexpr auto operator/(year const& y, month_day_last const& mdl) noexcept -> year_month_day_last
141{
142 return {y, mdl};
143}
144
145[[nodiscard]] constexpr auto operator/(int y, month_day_last const& mdl) noexcept -> year_month_day_last
146{
147 return {year(y), mdl};
148}
149
150[[nodiscard]] constexpr auto operator/(month_day_last const& mdl, year const& y) noexcept -> year_month_day_last
151{
152 return {y, mdl};
153}
154
155[[nodiscard]] constexpr auto operator/(month_day_last const& mdl, int y) noexcept -> year_month_day_last
156{
157 return {year(y), mdl};
158}
159
160} // namespace etl::chrono
161
162#endif // TETL_CHRONO_YEAR_MONTH_DAY_LAST_HPP
local_time< etl::chrono::days > local_days
Definition local_t.hpp:27
Definition abs.hpp:11
constexpr auto operator+(day const &d, days const &ds) noexcept -> day
Definition day.hpp:92
duration< int_least32_t, ratio< 31556952 > > months
Signed integer type of at least 20 bits.
Definition duration.hpp:371
sys_time< chrono::days > sys_days
Definition system_clock.hpp:39
constexpr auto operator/(duration< Rep1, Period1 > const &lhs, duration< Rep2, Period2 > const &rhs) -> common_type_t< Rep1, Rep2 >
Performs basic arithmetic operations between two durations or between a duration and a tick count.
Definition duration.hpp:272
duration< int_least32_t, ratio< 2629746 > > years
Signed integer type of at least 17 bits.
Definition duration.hpp:374
constexpr auto operator-(day const &d, days const &ds) noexcept -> day
Definition day.hpp:102
last_spec is an empty tag type that is used in conjunction with other calendar types to indicate the ...
Definition last_spec.hpp:19
Definition month_day_last.hpp:11
Definition year_month_day_last.hpp:41
constexpr auto ok() const noexcept -> bool
Definition year_month_day_last.hpp:67
constexpr auto month() const noexcept -> chrono::month
Definition year_month_day_last.hpp:55
constexpr auto year() const noexcept -> chrono::year
Definition year_month_day_last.hpp:53
constexpr auto month_day_last() const noexcept -> chrono::month_day_last
Definition year_month_day_last.hpp:57
constexpr year_month_day_last(chrono::year const &y, chrono::month_day_last const &mdl) noexcept
Definition year_month_day_last.hpp:42
constexpr auto operator+=(months const &m) noexcept -> year_month_day_last &
Definition year_month_day_last.hpp:111
constexpr auto operator-=(months const &m) noexcept -> year_month_day_last &
Definition year_month_day_last.hpp:117
constexpr auto day() const noexcept -> chrono::day
Definition year_month_day_last.hpp:59
Definition year_month.hpp:11
Definition year.hpp:13