22 explicit constexpr quarter(date::month m) noexcept :
23 q(((
static_cast<unsigned>(m) - 1) / 3) + 1) {}
25 [[nodiscard]]
explicit constexpr operator unsigned ()
const noexcept {
29 [[nodiscard]]
constexpr date::month first_month()
const noexcept {
30 return date::month{((q-1) * 3) + 1};
33 [[nodiscard]]
constexpr date::month last_month()
const noexcept {
34 return first_month() + date::months{2};
37 [[nodiscard]]
constexpr date::month_day first()
const noexcept {
38 return date::month_day{first_month(), date::day{1}};
41 [[nodiscard]]
constexpr date::month_day last()
const noexcept {
43 case 1:
return date::month_day{last_month(), date::day{31}};
44 case 2:
return date::month_day{last_month(), date::day{30}};
45 case 3:
return date::month_day{last_month(), date::day{30}};
46 case 4:
return date::month_day{last_month(), date::day{31}};
47 default: tt_no_default();
51 [[nodiscard]]
constexpr bool increment_carry()
noexcept {
60 [[nodiscard]]
bool contains(date::month_day
const &md)
const noexcept {
61 return md >= first() && md <= last();
64 [[nodiscard]]
friend constexpr bool operator==(
quarter const &lhs,
quarter const &rhs)
noexcept {
return lhs.q == rhs.q; }
65 [[nodiscard]]
friend constexpr bool operator!=(
quarter const &lhs,
quarter const &rhs)
noexcept {
return lhs.q != rhs.q; }
66 [[nodiscard]]
friend constexpr bool operator<(
quarter const &lhs,
quarter const &rhs)
noexcept {
return lhs.q < rhs.q; }
67 [[nodiscard]]
friend constexpr bool operator>(
quarter const &lhs,
quarter const &rhs)
noexcept {
return lhs.q > rhs.q; }
68 [[nodiscard]]
friend constexpr bool operator<=(
quarter const &lhs,
quarter const &rhs)
noexcept {
return lhs.q <= rhs.q; }
69 [[nodiscard]]
friend constexpr bool operator>=(
quarter const &lhs,
quarter const &rhs)
noexcept {
return lhs.q >= rhs.q; }
72 return fmt::format(
"{}", rhs.q);
76 return lhs << to_string(rhs);
86 explicit constexpr year_quarter(date::year_month
const &ym) :
87 y(ym.year()), q(ym.month()) {}
89 explicit constexpr year_quarter(date::year_month_day
const &ymd) :
90 year_quarter(date::year_month{ymd.year(), ymd.month()}) {}
93 if (q.increment_carry()) {
99 [[nodiscard]]
constexpr date::year_month first_year_month()
noexcept {
100 return date::year_month{y, q.first_month()};
103 [[nodiscard]]
constexpr date::year_month last_year_month()
noexcept {
104 return date::year_month{y, q.last_month()};
107 [[nodiscard]]
constexpr date::year_month_day first()
noexcept {
108 ttlet md = q.first();
109 return date::year_month_day{y, md.month(), md.day()};
112 [[nodiscard]]
constexpr date::year_month_day last()
noexcept {
114 return date::year_month_day{y, md.month(), md.day()};
117 [[nodiscard]]
bool contains(date::year_month_day
const &ymd)
const noexcept {
118 return y == ymd.year() && q.contains(date::month_day(ymd.month(), ymd.day()));
122 return lhs.y == rhs.y && lhs.q == rhs.q;
126 if (lhs.y == rhs.y) {
127 return lhs.q < rhs.q;
129 return lhs.y < rhs.y;
133 [[nodiscard]]
friend constexpr bool operator!=(
year_quarter const &lhs,
year_quarter const &rhs)
noexcept {
return !(lhs == rhs); }
134 [[nodiscard]]
friend constexpr bool operator>(
year_quarter const &lhs,
year_quarter const &rhs)
noexcept {
return rhs < lhs; }
135 [[nodiscard]]
friend constexpr bool operator<=(
year_quarter const &lhs,
year_quarter const &rhs)
noexcept {
return !(lhs > rhs); }
136 [[nodiscard]]
friend constexpr bool operator>=(
year_quarter const &lhs,
year_quarter const &rhs)
noexcept {
return !(lhs < rhs); }
139 return fmt::format(
"{}Q{}", rhs.y, rhs.q);
143 return lhs << to_string(rhs);