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// SPDX-FileCopyrightText: Copyright (C) 2023 Tobias Hienzsch
3
4#ifndef TETL_CHRONO_YEAR_MONTH_DAY_LAST_HPP
5#define TETL_CHRONO_YEAR_MONTH_DAY_LAST_HPP
6
7#include <etl/_chrono/local_t.hpp>
8#include <etl/_chrono/month_day_last.hpp>
9#include <etl/_chrono/system_clock.hpp>
10#include <etl/_chrono/year.hpp>
11
12namespace etl::chrono {
13
14namespace detail {
15
16[[nodiscard]] constexpr auto last_day_of_month(chrono::year const& y, chrono::month const& m) -> chrono::day
17{
18 constexpr chrono::day lastDays[] = {
19 chrono::day{31},
20 chrono::day{28},
21 chrono::day{31},
22 chrono::day{30},
23 chrono::day{31},
24 chrono::day{30},
25 chrono::day{31},
26 chrono::day{31},
27 chrono::day{30},
28 chrono::day{31},
29 chrono::day{30},
30 chrono::day{31},
31 };
32
33 if (m == chrono::month{2} and y.is_leap()) {
34 return chrono::day{29};
35 }
36 return lastDays[static_cast<unsigned>(m) - 1];
37}
38
39} // namespace detail
40
41/// \ingroup chrono
43 constexpr year_month_day_last(chrono::year const& y, chrono::month_day_last const& mdl) noexcept
44 : _y{y}
45 , _mdl{mdl}
46 {
47 }
48
49 constexpr auto operator+=(months const& m) noexcept -> year_month_day_last&;
50 constexpr auto operator-=(months const& m) noexcept -> year_month_day_last&;
51 constexpr auto operator+=(years const& y) noexcept -> year_month_day_last&;
52 constexpr auto operator-=(years const& y) noexcept -> year_month_day_last&;
53
54 [[nodiscard]] constexpr auto year() const noexcept -> chrono::year
55 {
56 return _y;
57 }
58
59 [[nodiscard]] constexpr auto month() const noexcept -> chrono::month
60 {
61 return _mdl.month();
62 }
63
64 [[nodiscard]] constexpr auto month_day_last() const noexcept -> chrono::month_day_last
65 {
66 return _mdl;
67 }
68
69 [[nodiscard]] constexpr auto day() const noexcept -> chrono::day
70 {
71 return detail::last_day_of_month(year(), month());
72 }
73
74 [[nodiscard]] constexpr operator sys_days() const noexcept;
75 [[nodiscard]] constexpr explicit operator local_days() const noexcept;
76
77 [[nodiscard]] constexpr auto ok() const noexcept -> bool
78 {
79 return _y.ok() and _mdl.ok();
80 }
81
82private:
83 chrono::year _y;
85};
86
87[[nodiscard]] constexpr auto operator+(chrono::year_month_day_last const& lhs, chrono::months const& rhs) noexcept
89{
90 auto const ym = year_month{lhs.year(), lhs.month()} + rhs;
91 return {ym.year(), month_day_last{ym.month()}};
92}
93
94[[nodiscard]] constexpr auto operator+(chrono::months const& lhs, chrono::year_month_day_last const& rhs) noexcept
96{
97 return rhs + lhs;
98}
99
100[[nodiscard]] constexpr auto operator-(chrono::year_month_day_last const& lhs, chrono::months const& rhs) noexcept
102{
103 return lhs + -rhs;
104}
105
106[[nodiscard]] constexpr auto operator+(chrono::year_month_day_last const& lhs, chrono::years const& rhs) noexcept
108{
109 return {lhs.year() + rhs, lhs.month_day_last()};
110}
111
112[[nodiscard]] constexpr auto operator+(chrono::years const& lhs, chrono::year_month_day_last const& rhs) noexcept
114{
115 return rhs + lhs;
116}
117
118[[nodiscard]] constexpr auto operator-(chrono::year_month_day_last const& lhs, chrono::years const& rhs) noexcept
120{
121 return lhs + -rhs;
122}
123
124constexpr auto year_month_day_last::operator+=(months const& m) noexcept -> year_month_day_last&
125{
126 *this = *this + m;
127 return *this;
128}
129
130constexpr auto year_month_day_last::operator-=(months const& m) noexcept -> year_month_day_last&
131{
132 *this = *this - m;
133 return *this;
134}
135
136constexpr auto year_month_day_last::operator+=(years const& y) noexcept -> year_month_day_last&
137{
138 *this = *this + y;
139 return *this;
140}
141
142constexpr auto year_month_day_last::operator-=(years const& y) noexcept -> year_month_day_last&
143{
144 *this = *this - y;
145 return *this;
146}
147
148[[nodiscard]] constexpr auto operator/(year_month const& ym, last_spec /*tag*/) noexcept -> year_month_day_last
149{
150 return {ym.year(), month_day_last(ym.month())};
151}
152
153[[nodiscard]] constexpr auto operator/(year const& y, month_day_last const& mdl) noexcept -> year_month_day_last
154{
155 return {y, mdl};
156}
157
158[[nodiscard]] constexpr auto operator/(int y, month_day_last const& mdl) noexcept -> year_month_day_last
159{
160 return {year(y), mdl};
161}
162
163[[nodiscard]] constexpr auto operator/(month_day_last const& mdl, year const& y) noexcept -> year_month_day_last
164{
165 return {y, mdl};
166}
167
168[[nodiscard]] constexpr auto operator/(month_day_last const& mdl, int y) noexcept -> year_month_day_last
169{
170 return {year(y), mdl};
171}
172
173} // namespace etl::chrono
174
175#endif // TETL_CHRONO_YEAR_MONTH_DAY_LAST_HPP
Definition abs.hpp:12
constexpr auto operator/(month_day_last const &mdl, int y) noexcept -> year_month_day_last
Definition year_month_day_last.hpp:168
constexpr auto operator+(chrono::years const &lhs, chrono::year_month_day_last const &rhs) noexcept -> chrono::year_month_day_last
Definition year_month_day_last.hpp:112
constexpr auto operator+(chrono::year_month_day_last const &lhs, chrono::months const &rhs) noexcept -> chrono::year_month_day_last
Definition year_month_day_last.hpp:87
constexpr auto operator+(chrono::year_month_day_last const &lhs, chrono::years const &rhs) noexcept -> chrono::year_month_day_last
Definition year_month_day_last.hpp:106
constexpr auto operator-(chrono::year_month_day_last const &lhs, chrono::years const &rhs) noexcept -> chrono::year_month_day_last
Definition year_month_day_last.hpp:118
constexpr auto operator/(year const &y, month_day_last const &mdl) noexcept -> year_month_day_last
Definition year_month_day_last.hpp:153
constexpr auto operator/(year const &y, int m) noexcept -> year_month
Definition year_month.hpp:120
constexpr auto operator-(chrono::year_month_day_last const &lhs, chrono::months const &rhs) noexcept -> chrono::year_month_day_last
Definition year_month_day_last.hpp:100
constexpr auto operator==(month lhs, month rhs) noexcept -> bool
Definition month.hpp:53
constexpr auto operator+(chrono::months const &lhs, chrono::year_month_day_last const &rhs) noexcept -> chrono::year_month_day_last
Definition year_month_day_last.hpp:94
constexpr auto operator/(int y, month_day_last const &mdl) noexcept -> year_month_day_last
Definition year_month_day_last.hpp:158
constexpr auto operator+(year const &lhs, years const &rhs) noexcept -> year
Definition year.hpp:120
constexpr auto operator/(month_day_last const &mdl, year const &y) noexcept -> year_month_day_last
Definition year_month_day_last.hpp:163
Definition adjacent_find.hpp:9
constexpr auto operator-() const -> etl::common_type_t< duration >
Implements unary plus and unary minus for the durations.
Definition duration.hpp:128
Definition month_day_last.hpp:12
constexpr auto ok() const noexcept -> bool
Definition month_day_last.hpp:23
constexpr auto month() const noexcept -> chrono::month
Definition month_day_last.hpp:18
The class month represents a month in a year.
Definition month.hpp:22
constexpr month(unsigned m) noexcept
Definition month.hpp:25
Definition year_month_day_last.hpp:42
constexpr auto ok() const noexcept -> bool
Definition year_month_day_last.hpp:77
constexpr auto month() const noexcept -> chrono::month
Definition year_month_day_last.hpp:59
constexpr auto operator-=(years const &y) noexcept -> year_month_day_last &
Definition year_month_day_last.hpp:142
constexpr auto operator+=(years const &y) noexcept -> year_month_day_last &
Definition year_month_day_last.hpp:136
constexpr auto year() const noexcept -> chrono::year
Definition year_month_day_last.hpp:54
constexpr auto month_day_last() const noexcept -> chrono::month_day_last
Definition year_month_day_last.hpp:64
constexpr year_month_day_last(chrono::year const &y, chrono::month_day_last const &mdl) noexcept
Definition year_month_day_last.hpp:43
constexpr operator sys_days() const noexcept
constexpr auto operator+=(months const &m) noexcept -> year_month_day_last &
Definition year_month_day_last.hpp:124
constexpr auto operator-=(months const &m) noexcept -> year_month_day_last &
Definition year_month_day_last.hpp:130
constexpr auto day() const noexcept -> chrono::day
Definition year_month_day_last.hpp:69
Definition year.hpp:14
constexpr auto ok() const noexcept -> bool
Definition year.hpp:76
constexpr year(int y) noexcept
Definition year.hpp:17
constexpr auto is_leap() const noexcept -> bool
Definition year.hpp:66