23 explicit constexpr quarter(std::chrono::month m) noexcept :
24 q(((
static_cast<unsigned>(m) - 1) / 3) + 1) {}
26 [[nodiscard]]
explicit constexpr operator unsigned ()
const noexcept {
30 [[nodiscard]]
constexpr std::chrono::month first_month()
const noexcept
32 return std::chrono::month{((q - 1) * 3) + 1};
35 [[nodiscard]]
constexpr std::chrono::month last_month()
const noexcept
37 return first_month() + std::chrono::months{2};
40 [[nodiscard]]
constexpr std::chrono::month_day first()
const noexcept
42 return std::chrono::month_day{first_month(), std::day{1}};
45 [[nodiscard]]
constexpr std::chrono::month_day last()
const noexcept
48 case 1:
return std::chrono::month_day{last_month(), std::day{31}};
49 case 2:
return std::chrono::month_day{last_month(), std::day{30}};
50 case 3:
return std::chrono::month_day{last_month(), std::day{30}};
51 case 4:
return std::chrono::month_day{last_month(), std::day{31}};
52 default: tt_no_default();
56 [[nodiscard]]
constexpr bool increment_carry()
noexcept {
65 [[nodiscard]]
bool contains(std::chrono::month_day
const &md)
const noexcept
67 return md >= first() && md <= last();
70 [[nodiscard]]
friend constexpr bool operator==(
quarter const &lhs,
quarter const &rhs)
noexcept {
return lhs.q == rhs.q; }
71 [[nodiscard]]
friend constexpr bool operator!=(
quarter const &lhs,
quarter const &rhs)
noexcept {
return lhs.q != rhs.q; }
72 [[nodiscard]]
friend constexpr bool operator<(
quarter const &lhs,
quarter const &rhs)
noexcept {
return lhs.q < rhs.q; }
73 [[nodiscard]]
friend constexpr bool operator>(
quarter const &lhs,
quarter const &rhs)
noexcept {
return lhs.q > rhs.q; }
74 [[nodiscard]]
friend constexpr bool operator<=(
quarter const &lhs,
quarter const &rhs)
noexcept {
return lhs.q <= rhs.q; }
75 [[nodiscard]]
friend constexpr bool operator>=(
quarter const &lhs,
quarter const &rhs)
noexcept {
return lhs.q >= rhs.q; }
78 return std::format(
"{}", rhs.q);
82 return lhs << to_string(rhs);
92 explicit constexpr year_quarter(std::chrono::year_month
const &ym) :
93 y(ym.year()), q(ym.month()) {}
95 explicit constexpr year_quarter(std::chrono::year_month_day
const &ymd) :
96 year_quarter(std::chrono::year_month{ymd.year(), ymd.month()})
101 if (q.increment_carry()) {
107 [[nodiscard]]
constexpr std::chrono::year_month first_year_month()
noexcept
109 return std::chrono::year_month{y, q.first_month()};
112 [[nodiscard]]
constexpr std::chrono::year_month last_year_month()
noexcept
114 return std::chrono::year_month{y, q.last_month()};
117 [[nodiscard]]
constexpr std::chrono::year_month_day first()
noexcept
119 ttlet md = q.first();
120 return std::chrono::year_month_day{y, md.month(), md.day()};
123 [[nodiscard]]
constexpr std::chrono::year_month_day last()
noexcept
126 return std::chrono::year_month_day{y, md.month(), md.day()};
129 [[nodiscard]]
bool contains(std::chrono::year_month_day
const &ymd)
const noexcept
131 return y == ymd.year() && q.contains(std::chrono::month_day(ymd.month(), ymd.day()));
135 return lhs.y == rhs.y && lhs.q == rhs.q;
139 if (lhs.y == rhs.y) {
140 return lhs.q < rhs.q;
142 return lhs.y < rhs.y;
146 [[nodiscard]]
friend constexpr bool operator!=(
year_quarter const &lhs,
year_quarter const &rhs)
noexcept {
return !(lhs == rhs); }
147 [[nodiscard]]
friend constexpr bool operator>(
year_quarter const &lhs,
year_quarter const &rhs)
noexcept {
return rhs < lhs; }
148 [[nodiscard]]
friend constexpr bool operator<=(
year_quarter const &lhs,
year_quarter const &rhs)
noexcept {
return !(lhs > rhs); }
149 [[nodiscard]]
friend constexpr bool operator>=(
year_quarter const &lhs,
year_quarter const &rhs)
noexcept {
return !(lhs < rhs); }
152 return std::format(
"{}Q{}", rhs.y, rhs.q);
156 return lhs << to_string(rhs);