24 explicit constexpr quarter(std::chrono::month m) noexcept : q(((
static_cast<unsigned>(m) - 1) / 3) + 1) {}
26 [[nodiscard]]
explicit constexpr operator unsigned()
const noexcept
31 [[nodiscard]]
constexpr std::chrono::month first_month()
const noexcept
33 return std::chrono::month{((q - 1) * 3) + 1};
36 [[nodiscard]]
constexpr std::chrono::month last_month()
const noexcept
38 return first_month() + std::chrono::months{2};
41 [[nodiscard]]
constexpr std::chrono::month_day first()
const noexcept
43 return std::chrono::month_day{first_month(), std::day{1}};
46 [[nodiscard]]
constexpr std::chrono::month_day last()
const noexcept
49 case 1:
return std::chrono::month_day{last_month(), std::day{31}};
50 case 2:
return std::chrono::month_day{last_month(), std::day{30}};
51 case 3:
return std::chrono::month_day{last_month(), std::day{30}};
52 case 4:
return std::chrono::month_day{last_month(), std::day{31}};
53 default: hi_no_default();
57 [[nodiscard]]
constexpr bool increment_carry()
noexcept
67 [[nodiscard]]
bool contains(std::chrono::month_day
const &md)
const noexcept
69 return md >= first() && md <= last();
72 [[nodiscard]]
friend constexpr bool operator==(
quarter const &lhs,
quarter const &rhs)
noexcept
74 return lhs.q == rhs.q;
77 [[nodiscard]]
friend constexpr auto operator<=>(
quarter const &lhs,
quarter const &rhs)
noexcept
79 return lhs.q <=> rhs.q;
84 return std::format(
"{}", rhs.q);
89 return lhs << to_string(rhs);
98 explicit constexpr year_quarter(std::chrono::year_month
const &ym) : y(ym.year()), q(ym.month()) {}
100 explicit constexpr year_quarter(std::chrono::year_month_day
const &ymd) :
101 year_quarter(std::chrono::year_month{ymd.year(), ymd.month()})
107 if (q.increment_carry()) {
113 [[nodiscard]]
constexpr std::chrono::year_month first_year_month()
noexcept
115 return std::chrono::year_month{y, q.first_month()};
118 [[nodiscard]]
constexpr std::chrono::year_month last_year_month()
noexcept
120 return std::chrono::year_month{y, q.last_month()};
123 [[nodiscard]]
constexpr std::chrono::year_month_day first()
noexcept
125 hilet md = q.first();
126 return std::chrono::year_month_day{y, md.month(), md.day()};
129 [[nodiscard]]
constexpr std::chrono::year_month_day last()
noexcept
132 return std::chrono::year_month_day{y, md.month(), md.day()};
135 [[nodiscard]]
bool contains(std::chrono::year_month_day
const &ymd)
const noexcept
137 return y == ymd.year() && q.contains(std::chrono::month_day(ymd.month(), ymd.day()));
140 [[nodiscard]]
friend constexpr bool operator==(
year_quarter const &lhs,
year_quarter const &rhs)
noexcept =
default;
141 [[nodiscard]]
friend constexpr std::strong_ordering operator<=>(
year_quarter const &lhs,
year_quarter const &rhs)
noexcept =
default;
146 return std::format(
"{}Q{}", rhs.y, rhs.q);
151 return lhs << to_string(rhs);