aboutsummaryrefslogtreecommitdiff
path: root/src/openvic/Date.hpp
diff options
context:
space:
mode:
author Hop311 <Hop3114@gmail.com>2023-05-16 21:25:14 +0200
committer GitHub <noreply@github.com>2023-05-16 21:25:14 +0200
commitcedac2d020ae7e54d8fc5c21e390a306050bc220 (patch)
tree440634772615531e704a5554aa59c9890cd9cd85 /src/openvic/Date.hpp
parent339e0278a2064f7eeb152fe8c5778840b609e9f3 (diff)
parent42d9d1d5417deb5979a9d5775cfe97dcff4b77ba (diff)
Merge pull request #3 from OpenVicProject/openvic-rename
Changed from OpenVic2 to OpenVic
Diffstat (limited to 'src/openvic/Date.hpp')
-rw-r--r--src/openvic/Date.hpp83
1 files changed, 83 insertions, 0 deletions
diff --git a/src/openvic/Date.hpp b/src/openvic/Date.hpp
new file mode 100644
index 0000000..15b7219
--- /dev/null
+++ b/src/openvic/Date.hpp
@@ -0,0 +1,83 @@
+#pragma once
+
+#include <cstdint>
+#include <string>
+#include <ostream>
+
+namespace OpenVic {
+ // A relative period between points in time, measured in days
+ struct Timespan {
+ using day_t = int64_t;
+ private:
+ day_t days;
+ public:
+ Timespan(day_t value = 0);
+
+ bool operator<(Timespan other) const;
+ bool operator>(Timespan other) const;
+ bool operator<=(Timespan other) const;
+ bool operator>=(Timespan other) const;
+ bool operator==(Timespan other) const;
+ bool operator!=(Timespan other) const;
+
+ Timespan operator+(Timespan other) const;
+ Timespan operator-(Timespan other) const;
+ Timespan operator*(day_t factor) const;
+ Timespan operator/(day_t factor) const;
+ Timespan& operator+=(Timespan other);
+ Timespan& operator-=(Timespan other);
+ Timespan& operator++();
+ Timespan operator++(int);
+
+ explicit operator day_t() const;
+ explicit operator double() const;
+ explicit operator std::string() const;
+ };
+ std::ostream& operator<< (std::ostream& out, Timespan timespan);
+
+ // Represents an in-game date
+ // Note: Current implementation does not account for leap-years, or dates before Year 0
+ struct Date {
+ using year_t = uint16_t;
+ using month_t = uint8_t;
+ using day_t = uint8_t;
+
+ static constexpr Timespan::day_t MONTHS_IN_YEAR = 12;
+ static constexpr Timespan::day_t DAYS_IN_YEAR = 365;
+ static constexpr Timespan::day_t DAYS_IN_MONTH[MONTHS_IN_YEAR] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
+ static constexpr Timespan::day_t DAYS_UP_TO_MONTH[MONTHS_IN_YEAR] = { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 };
+ private:
+ // Number of days since Jan 1st, Year 0
+ Timespan timespan;
+
+ static Timespan _dateToTimespan(year_t year, month_t month, day_t day);
+ public:
+ // The Timespan is considered to be the number of days since Jan 1st, Year 0
+ Date(Timespan total_days);
+ // Year month day specification
+ Date(year_t year = 0, month_t month = 1, day_t day = 1);
+
+ year_t getYear() const;
+ month_t getMonth() const;
+ day_t getDay() const;
+
+ bool operator<(Date other) const;
+ bool operator>(Date other) const;
+ bool operator<=(Date other) const;
+ bool operator>=(Date other) const;
+ bool operator==(Date other) const;
+ bool operator!=(Date other) const;
+
+ Date operator+(Timespan other) const;
+ Timespan operator-(Date other) const;
+ Date& operator+=(Timespan other);
+ Date& operator-=(Timespan other);
+ Date& operator++();
+ Date operator++(int);
+
+ explicit operator std::string() const;
+ // Parsed from string of the form YYYY.MM.DD
+ static Date from_string(std::string const& date);
+ };
+ std::ostream& operator<< (std::ostream& out, Date date);
+}