diff options
Reorganized whole architecture
2 files changed, 107 insertions, 0 deletions
| -rw-r--r-- | src/Generic/Date/Date.cpp | 74 | ||||
| -rw-r--r-- | src/Generic/Date/Date.h | 33 |
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; +} diff --git a/src/Generic/Date/Date.h b/src/Generic/Date/Date.h new file mode 100644 index 0000000..5d1ff62 --- /dev/null +++ b/src/Generic/Date/Date.h @@ -0,0 +1,33 @@ +#ifndef HEADER_DATETIME +#define HEADER_DATETIME + +#include <istream> +#include <ostream> + +class Date { + unsigned short day; + unsigned short month; + unsigned short year; + + bool isLeapYear(); + unsigned short daysInMonth(); + +public: + Date(); + Date(unsigned short day, unsigned short month, unsigned short year); + int compare(const Date& other) const; + + unsigned short get_day() const; + bool set_day(unsigned short newDay); + + unsigned short get_month() const; + bool set_month(unsigned short newMonth); + + unsigned short get_year() const; + bool set_year(unsigned short newYear); +}; + +std::istream& operator>>(std::istream& istr, Date& dt); +std::ostream& operator<<(std::ostream& ostr, const Date& dt); + +#endif |
