#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(const char* str) : Date(0, 0, 0) { for (unsigned i = 0; str[i] != '\0' && year == 0; i++) { if (str[i] != ' ') { unsigned temp = atoi(str + i); if (temp == 0) return; // can only happen with incorrect input if (day == 0) day = temp; else if (month == 0) month = temp; else year = temp; i++; } } } Date::Date(unsigned short day, unsigned short month, unsigned short year) { this->day = day; this->month = month; this->year = year; } 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; } void Date::read(std::istream& istr) { istr.read((char*)&day, sizeof(day)); istr.read((char*)&month, sizeof(month)); istr.read((char*)&year, sizeof(year)); } void Date::write(std::ostream& ostr) { ostr.write((char*)&day, sizeof(day)); ostr.write((char*)&month, sizeof(month)); ostr.write((char*)&year, sizeof(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; } /* 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; }