diff 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
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/core/date.cc	Mon Oct 23 12:07:27 2023 -0400
@@ -0,0 +1,122 @@
+#include "core/date.h"
+#include "core/json.h"
+#include <QDate>
+#include <QDebug>
+#include <algorithm>
+#include <cstdint>
+#include <tuple>
+
+/* An implementation of AniList's "fuzzy date" */
+
+#define CLAMP(x, low, high) (std::max(low, std::min(high, x)))
+
+Date::Date() {
+}
+
+Date::Date(unsigned int y) {
+	SetYear(y);
+}
+
+Date::Date(unsigned int y, unsigned int m, unsigned int d) {
+	SetYear(y);
+	SetMonth(m);
+	SetDay(d);
+}
+
+Date::Date(const QDate& date) {
+	SetYear(date.year());
+	SetMonth(date.month());
+	SetDay(date.day());
+}
+
+void Date::VoidYear() {
+	year.reset();
+}
+
+void Date::VoidMonth() {
+	month.reset();
+}
+
+void Date::VoidDay() {
+	day.reset();
+}
+
+void Date::SetYear(unsigned int y) {
+	year.reset(new unsigned int(y));
+}
+
+void Date::SetMonth(unsigned int m) {
+	month.reset(new unsigned int(CLAMP(m, 1U, 12U)));
+}
+
+void Date::SetDay(unsigned int d) {
+	day.reset(new unsigned int(CLAMP(d, 1U, 31U)));
+}
+
+unsigned int Date::GetYear() const {
+	unsigned int* ptr = year.get();
+	if (ptr != nullptr)
+		return *year;
+	return -1;
+}
+
+unsigned int Date::GetMonth() const {
+	unsigned int* ptr = month.get();
+	if (ptr != nullptr)
+		return *month;
+	return -1;
+}
+
+unsigned int Date::GetDay() const {
+	unsigned int* ptr = day.get();
+	if (ptr != nullptr)
+		return *day;
+	return -1;
+}
+
+bool Date::IsValid() const {
+	return year.get() && month.get() && day.get();
+}
+
+bool Date::operator<(const Date& other) const {
+	unsigned int y = GetYear(), m = GetMonth(), d = GetDay();
+	unsigned int o_y = other.GetYear(), o_m = other.GetMonth(), o_d = other.GetDay();
+	return std::tie(y, m, d) < std::tie(o_y, o_m, o_d);
+}
+
+bool Date::operator>(const Date& other) const {
+	return other < (*this);
+}
+
+bool Date::operator<=(const Date& other) const {
+	return !((*this) > other);
+}
+
+bool Date::operator>=(const Date& other) const {
+	return !((*this) < other);
+}
+
+QDate Date::GetAsQDate() const {
+	/* QDates don't support "missing" values, for good reason. */
+	if (IsValid())
+		return QDate(*year, *month, *day);
+	else
+		return QDate();
+}
+
+nlohmann::json Date::GetAsAniListJson() const {
+	nlohmann::json result = {};
+	if (year.get())
+		result["year"] = *year;
+	else
+		result["year"] = nullptr;
+	if (month.get())
+		result["month"] = *month;
+	else
+		result["month"] = nullptr;
+	if (day.get())
+		result["day"] = *day;
+	else
+		result["day"] = nullptr;
+	return result;
+}