HikoGUI
A low latency retained GUI
Loading...
Searching...
No Matches
date.hpp
1// Copyright Take Vos 2019.
2// Distributed under the Boost Software License, Version 1.0.
3// (See accompanying file LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt)
4
5#pragma once
6
7#include "assert.hpp"
8#include <date/date.h>
9#include <format>
10#include <string>
11
12namespace tt {
13
14[[nodiscard]] std::string to_string(std::chrono::year y) noexcept
15{
16 return std::format("{}", static_cast<int>(y));
17}
18
19class quarter {
20 unsigned int q;
21
22public:
23 explicit constexpr quarter(std::chrono::month m) noexcept :
24 q(((static_cast<unsigned>(m) - 1) / 3) + 1) {}
25
26 [[nodiscard]] explicit constexpr operator unsigned () const noexcept {
27 return q;
28 }
29
30 [[nodiscard]] constexpr std::chrono::month first_month() const noexcept
31 {
32 return std::chrono::month{((q - 1) * 3) + 1};
33 }
34
35 [[nodiscard]] constexpr std::chrono::month last_month() const noexcept
36 {
37 return first_month() + std::chrono::months{2};
38 }
39
40 [[nodiscard]] constexpr std::chrono::month_day first() const noexcept
41 {
42 return std::chrono::month_day{first_month(), std::day{1}};
43 }
44
45 [[nodiscard]] constexpr std::chrono::month_day last() const noexcept
46 {
47 switch (q) {
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();
53 }
54 }
55
56 [[nodiscard]] constexpr bool increment_carry() noexcept {
57 if (++q > 4) {
58 q = 1;
59 return true;
60 } else {
61 return false;
62 }
63 }
64
65 [[nodiscard]] bool contains(std::chrono::month_day const &md) const noexcept
66 {
67 return md >= first() && md <= last();
68 }
69
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; }
76
77 [[nodiscard]] friend std::string to_string(quarter const &rhs) noexcept {
78 return std::format("{}", rhs.q);
79 }
80
81 friend std::ostream &operator<<(std::ostream &lhs, quarter const &rhs) noexcept {
82 return lhs << to_string(rhs);
83 }
84
85};
86
88 std::chrono::year y;
89 quarter q;
90
91public:
92 explicit constexpr year_quarter(std::chrono::year_month const &ym) :
93 y(ym.year()), q(ym.month()) {}
94
95 explicit constexpr year_quarter(std::chrono::year_month_day const &ymd) :
96 year_quarter(std::chrono::year_month{ymd.year(), ymd.month()})
97 {
98 }
99
100 constexpr year_quarter &operator++() noexcept {
101 if (q.increment_carry()) {
102 ++y;
103 }
104 return *this;
105 }
106
107 [[nodiscard]] constexpr std::chrono::year_month first_year_month() noexcept
108 {
109 return std::chrono::year_month{y, q.first_month()};
110 }
111
112 [[nodiscard]] constexpr std::chrono::year_month last_year_month() noexcept
113 {
114 return std::chrono::year_month{y, q.last_month()};
115 }
116
117 [[nodiscard]] constexpr std::chrono::year_month_day first() noexcept
118 {
119 ttlet md = q.first();
120 return std::chrono::year_month_day{y, md.month(), md.day()};
121 }
122
123 [[nodiscard]] constexpr std::chrono::year_month_day last() noexcept
124 {
125 ttlet md = q.last();
126 return std::chrono::year_month_day{y, md.month(), md.day()};
127 }
128
129 [[nodiscard]] bool contains(std::chrono::year_month_day const &ymd) const noexcept
130 {
131 return y == ymd.year() && q.contains(std::chrono::month_day(ymd.month(), ymd.day()));
132 }
133
134 [[nodiscard]] friend constexpr bool operator==(year_quarter const &lhs, year_quarter const &rhs) noexcept {
135 return lhs.y == rhs.y && lhs.q == rhs.q;
136 }
137
138 [[nodiscard]] friend constexpr bool operator<(year_quarter const &lhs, year_quarter const &rhs) noexcept {
139 if (lhs.y == rhs.y) {
140 return lhs.q < rhs.q;
141 } else {
142 return lhs.y < rhs.y;
143 }
144 }
145
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); }
150
151 [[nodiscard]] friend std::string to_string(year_quarter const &rhs) noexcept {
152 return std::format("{}Q{}", rhs.y, rhs.q);
153 }
154
155 friend std::ostream &operator<<(std::ostream &lhs, year_quarter const &rhs) noexcept {
156 return lhs << to_string(rhs);
157 }
158};
159
160
161}
Definition date.hpp:19
Definition date.hpp:87
T to_string(T... args)