comparison src/core/date.cc @ 81:9b2b41f83a5e

boring: mass rename to cc because this is a very unix-y project, it makes more sense to use the 'cc' extension
author Paper <mrpapersonic@gmail.com>
date Mon, 23 Oct 2023 12:07:27 -0400
parents src/core/date.cpp@6f7385bd334c
children f88eda79c60a
comparison
equal deleted inserted replaced
80:825506f0e221 81:9b2b41f83a5e
1 #include "core/date.h"
2 #include "core/json.h"
3 #include <QDate>
4 #include <QDebug>
5 #include <algorithm>
6 #include <cstdint>
7 #include <tuple>
8
9 /* An implementation of AniList's "fuzzy date" */
10
11 #define CLAMP(x, low, high) (std::max(low, std::min(high, x)))
12
13 Date::Date() {
14 }
15
16 Date::Date(unsigned int y) {
17 SetYear(y);
18 }
19
20 Date::Date(unsigned int y, unsigned int m, unsigned int d) {
21 SetYear(y);
22 SetMonth(m);
23 SetDay(d);
24 }
25
26 Date::Date(const QDate& date) {
27 SetYear(date.year());
28 SetMonth(date.month());
29 SetDay(date.day());
30 }
31
32 void Date::VoidYear() {
33 year.reset();
34 }
35
36 void Date::VoidMonth() {
37 month.reset();
38 }
39
40 void Date::VoidDay() {
41 day.reset();
42 }
43
44 void Date::SetYear(unsigned int y) {
45 year.reset(new unsigned int(y));
46 }
47
48 void Date::SetMonth(unsigned int m) {
49 month.reset(new unsigned int(CLAMP(m, 1U, 12U)));
50 }
51
52 void Date::SetDay(unsigned int d) {
53 day.reset(new unsigned int(CLAMP(d, 1U, 31U)));
54 }
55
56 unsigned int Date::GetYear() const {
57 unsigned int* ptr = year.get();
58 if (ptr != nullptr)
59 return *year;
60 return -1;
61 }
62
63 unsigned int Date::GetMonth() const {
64 unsigned int* ptr = month.get();
65 if (ptr != nullptr)
66 return *month;
67 return -1;
68 }
69
70 unsigned int Date::GetDay() const {
71 unsigned int* ptr = day.get();
72 if (ptr != nullptr)
73 return *day;
74 return -1;
75 }
76
77 bool Date::IsValid() const {
78 return year.get() && month.get() && day.get();
79 }
80
81 bool Date::operator<(const Date& other) const {
82 unsigned int y = GetYear(), m = GetMonth(), d = GetDay();
83 unsigned int o_y = other.GetYear(), o_m = other.GetMonth(), o_d = other.GetDay();
84 return std::tie(y, m, d) < std::tie(o_y, o_m, o_d);
85 }
86
87 bool Date::operator>(const Date& other) const {
88 return other < (*this);
89 }
90
91 bool Date::operator<=(const Date& other) const {
92 return !((*this) > other);
93 }
94
95 bool Date::operator>=(const Date& other) const {
96 return !((*this) < other);
97 }
98
99 QDate Date::GetAsQDate() const {
100 /* QDates don't support "missing" values, for good reason. */
101 if (IsValid())
102 return QDate(*year, *month, *day);
103 else
104 return QDate();
105 }
106
107 nlohmann::json Date::GetAsAniListJson() const {
108 nlohmann::json result = {};
109 if (year.get())
110 result["year"] = *year;
111 else
112 result["year"] = nullptr;
113 if (month.get())
114 result["month"] = *month;
115 else
116 result["month"] = nullptr;
117 if (day.get())
118 result["day"] = *day;
119 else
120 result["day"] = nullptr;
121 return result;
122 }