view src/core/date.cc @ 101:c537996cf67b

*: multitude of config changes 1. theme is now configurable from the settings menu (but you have to restart for it to apply) 2. config is now stored in an INI file, with no method of conversion from json (this repo is private-ish anyway)
author Paper <mrpapersonic@gmail.com>
date Fri, 03 Nov 2023 14:06:02 -0400
parents 9b2b41f83a5e
children f88eda79c60a
line wrap: on
line source

#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;
}