diff src/core/date.cc @ 187:9613d72b097e

*: multiple performance improvements like marking `static const` when it makes sense... date: change old stupid heap-based method to a structure which should make copying the thing actually make a copy. also many performance-based changes, like removing the std::tie dependency and forward-declaring nlohmann json *: replace every instance of QString::fromUtf8 to Strings::ToQString. the main difference is that our function will always convert exactly what is in the string, while some other times it would only convert up to the nearest NUL byte
author Paper <mrpapersonic@gmail.com>
date Wed, 06 Dec 2023 13:43:54 -0500
parents 9b10175be389
children f0ff06a45c42
line wrap: on
line diff
--- a/src/core/date.cc	Wed Dec 06 11:47:59 2023 -0500
+++ b/src/core/date.cc	Wed Dec 06 13:43:54 2023 -0500
@@ -1,14 +1,17 @@
 #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)))
+template<typename T>
+bool CLAMP(T x, T low, T high) {
+	return std::max(low, std::min(high, x));
+}
 
 Date::Date() {
 }
@@ -31,7 +34,7 @@
 
 Date::Date(const nlohmann::json& json) {
 	/* NOTE: this constructor is made for use with
-	   AniList FussyDate-style JSON. In the future, some other
+	   AniList FuzzyDate-style JSON. In the future, some other
 	   methods may be parsed and whatnot if necessary. */
 	if (json.contains("year") && json.at("year").is_number())
 		SetYear(json.at("year").get<unsigned int>());
@@ -42,58 +45,50 @@
 }
 
 void Date::VoidYear() {
-	year.reset();
+	year.Void();
 }
 
 void Date::VoidMonth() {
-	month.reset();
+	month.Void();
 }
 
 void Date::VoidDay() {
-	day.reset();
+	day.Void();
 }
 
 void Date::SetYear(unsigned int y) {
-	year.reset(new unsigned int(y));
+	year.Set(y);
 }
 
 void Date::SetMonth(unsigned int m) {
-	month.reset(new unsigned int(CLAMP(m, 1U, 12U)));
+	month.Set(CLAMP(m, 1U, 12U));
 }
 
 void Date::SetDay(unsigned int d) {
-	day.reset(new unsigned int(CLAMP(d, 1U, 31U)));
+	day.Set(CLAMP(d, 1U, 31U));
 }
 
 unsigned int Date::GetYear() const {
-	unsigned int* ptr = year.get();
-	if (ptr != nullptr)
-		return *year;
-	return -1;
+	return year.Get();
 }
 
 unsigned int Date::GetMonth() const {
-	unsigned int* ptr = month.get();
-	if (ptr != nullptr)
-		return *month;
-	return -1;
+	return month.Get();
 }
 
 unsigned int Date::GetDay() const {
-	unsigned int* ptr = day.get();
-	if (ptr != nullptr)
-		return *day;
-	return -1;
+	return day.Get();
 }
 
 bool Date::IsValid() const {
-	return year.get() && month.get() && day.get();
+	return year.Enabled() && month.Enabled() && day.Enabled();
 }
 
 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);
+	const unsigned int y = GetYear(), m = GetMonth(), d = GetDay();
+	const unsigned int o_y = other.GetYear(), o_m = other.GetMonth(), o_d = other.GetDay();
+
+	return (y < o_y && m < o_m && d < o_d);
 }
 
 bool Date::operator>(const Date& other) const {
@@ -109,26 +104,30 @@
 }
 
 QDate Date::GetAsQDate() const {
-	/* QDates don't support "missing" values, for good reason. */
-	if (IsValid())
-		return QDate(*year, *month, *day);
-	else
-		return QDate();
+	/* QDate doesn't support "missing" values (for good reason),
+	 * so we do our best and return what we can.
+	*/
+
+	return QDate(year.Enabled() ? year.Get() : 2000, month.Enabled() ? month.Get() : 1, day.Enabled() ? day.Get() : 1);
 }
 
 nlohmann::json Date::GetAsAniListJson() const {
 	nlohmann::json result = {};
-	if (year.get())
-		result["year"] = *year;
+
+	if (year.Enabled())
+		result["year"] = year.Get();
 	else
 		result["year"] = nullptr;
-	if (month.get())
-		result["month"] = *month;
+
+	if (month.Enabled())
+		result["month"] = month.Get();
 	else
 		result["month"] = nullptr;
-	if (day.get())
-		result["day"] = *day;
+
+	if (day.Enabled())
+		result["day"] = day.Get();
 	else
 		result["day"] = nullptr;
+
 	return result;
 }