Website Summary Files Commits Branches @commit @diff @stats
path: root / src / Generic / Date / Date.cpp
blob: 4732b0cfed429e3ebee7ef5937814e380bc65cfd (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#include "Date.h"

/* Private */

bool Date::isLeapYear() {
	// Implements https://en.wikipedia.org/wiki/Leap_year#Gregorian_calendar
	return year % 400 == 0 || year % 100 != 0 || year % 4 == 0;
}

unsigned short Date::daysInMonth() {
	if (month == 2)
		return 28 + isLeapYear();
	if (month <= 7)
		return 30 + month % 2;
	return 31 - month % 2;
}

/* Public */

Date::Date() : Date(01, 05, 2022) {}

Date::Date(unsigned short day, unsigned short month, unsigned short year) {
	this->day = day;
	this->month = month;
	this->year = year;
}

int Date::compare(const Date& other) const {
	if (year < other.year || month < other.month || day < other.day)
		return -1;
	return year > other.year || month > other.month || day > other.day;
}

unsigned short Date::get_day() const {
	return day;
}
bool Date::set_day(unsigned short newDay) {
	if (newDay == 0 || newDay > daysInMonth())
		return false;
	day = newDay;
	return true;
}

unsigned short Date::get_month() const {
	return month;
}
bool Date::set_month(unsigned short newMonth) {
	if (newMonth == 0 || newMonth > 12)
		return false;
	month = newMonth;
	return true;
}

unsigned short Date::get_year() const {
	return year;
}
bool Date::set_year(unsigned short newYear) {
	year = newYear;
	return true;
}

/* Outside of class */

std::istream& operator>>(std::istream& istr, Date& dt) {
	unsigned short d, M, y;
	istr >> d >> M >> y;
	dt = Date(d, M, y);
	return istr;
}

std::ostream& operator<<(std::ostream& ostr, const Date& dt) {
	ostr << dt.get_day() << "." << dt.get_month() << "." << dt.get_year();
	return ostr;
}