diff options
Reorganized whole architecture
1 files changed, 74 insertions, 0 deletions
| -rw-r--r-- | src/Generic/Date/Date.cpp | 74 |
diff --git a/src/Generic/Date/Date.cpp b/src/Generic/Date/Date.cpp new file mode 100644 index 0000000..4732b0c --- /dev/null +++ b/src/Generic/Date/Date.cpp @@ -0,0 +1,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; +} |
