21 explicit constexpr quarter(date::month m) noexcept :
22 q(((
static_cast<unsigned>(m) - 1) / 3) + 1) {}
24 [[nodiscard]]
explicit constexpr operator unsigned ()
const noexcept {
28 [[nodiscard]]
constexpr date::month first_month()
const noexcept {
29 return date::month{((q-1) * 3) + 1};
32 [[nodiscard]]
constexpr date::month last_month()
const noexcept {
33 return first_month() + date::months{2};
36 [[nodiscard]]
constexpr date::month_day first()
const noexcept {
37 return date::month_day{first_month(), date::day{1}};
40 [[nodiscard]]
constexpr date::month_day last()
const noexcept {
42 case 1:
return date::month_day{last_month(), date::day{31}};
43 case 2:
return date::month_day{last_month(), date::day{30}};
44 case 3:
return date::month_day{last_month(), date::day{30}};
45 case 4:
return date::month_day{last_month(), date::day{31}};
46 default: tt_no_default;
50 [[nodiscard]]
constexpr bool increment_carry()
noexcept {
59 [[nodiscard]]
bool contains(date::month_day
const &md)
const noexcept {
60 return md >= first() && md <= last();
63 [[nodiscard]]
friend constexpr bool operator==(
quarter const &lhs,
quarter const &rhs)
noexcept {
return lhs.q == rhs.q; }
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; }
71 return fmt::format(
"{}", rhs.q);
75 return lhs << to_string(rhs);
85 explicit constexpr year_quarter(date::year_month
const &ym) :
86 y(ym.year()), q(ym.month()) {}
88 explicit constexpr year_quarter(date::year_month_day
const &ymd) :
89 year_quarter(date::year_month{ymd.year(), ymd.month()}) {}
92 if (q.increment_carry()) {
98 [[nodiscard]]
constexpr date::year_month first_year_month()
noexcept {
99 return date::year_month{y, q.first_month()};
102 [[nodiscard]]
constexpr date::year_month last_year_month()
noexcept {
103 return date::year_month{y, q.last_month()};
106 [[nodiscard]]
constexpr date::year_month_day first()
noexcept {
107 ttlet md = q.first();
108 return date::year_month_day{y, md.month(), md.day()};
111 [[nodiscard]]
constexpr date::year_month_day last()
noexcept {
113 return date::year_month_day{y, md.month(), md.day()};
116 [[nodiscard]]
bool contains(date::year_month_day
const &ymd)
const noexcept {
117 return y == ymd.year() && q.contains(date::month_day(ymd.month(), ymd.day()));
121 return lhs.y == rhs.y && lhs.q == rhs.q;
125 if (lhs.y == rhs.y) {
126 return lhs.q < rhs.q;
128 return lhs.y < rhs.y;
132 [[nodiscard]]
friend constexpr bool operator!=(
year_quarter const &lhs,
year_quarter const &rhs)
noexcept {
return !(lhs == rhs); }
133 [[nodiscard]]
friend constexpr bool operator>(
year_quarter const &lhs,
year_quarter const &rhs)
noexcept {
return rhs < lhs; }
134 [[nodiscard]]
friend constexpr bool operator<=(
year_quarter const &lhs,
year_quarter const &rhs)
noexcept {
return !(lhs > rhs); }
135 [[nodiscard]]
friend constexpr bool operator>=(
year_quarter const &lhs,
year_quarter const &rhs)
noexcept {
return !(lhs < rhs); }
138 return fmt::format(
"{}Q{}", rhs.y, rhs.q);
142 return lhs << to_string(rhs);