aboutsummaryrefslogtreecommitdiff
path: root/extension/src/openvic2/Date.hpp
diff options
context:
space:
mode:
author ClarkeCode <33846391+ClarkeCode@users.noreply.github.com>2023-04-14 22:16:23 +0200
committer GitHub <noreply@github.com>2023-04-14 22:16:23 +0200
commitf168c91ff266beda8066014257a30d93704882ee (patch)
tree2c49198c3cbbbb575dc14795132a20c7b9267a2c /extension/src/openvic2/Date.hpp
parent436b038c1806e326ff6458f1692e9009d3a54346 (diff)
parent48558fdfec509942515b0e2d92e3f1357b201400 (diff)
Merge pull request #73 from OpenVic2Project/in-game-date
Added in-game date
Diffstat (limited to 'extension/src/openvic2/Date.hpp')
-rw-r--r--extension/src/openvic2/Date.hpp83
1 files changed, 83 insertions, 0 deletions
diff --git a/extension/src/openvic2/Date.hpp b/extension/src/openvic2/Date.hpp
new file mode 100644
index 0000000..841b118
--- /dev/null
+++ b/extension/src/openvic2/Date.hpp
@@ -0,0 +1,83 @@
+#pragma once
+
+#include <cstdint>
+#include <cstddef>
+#include <tuple>
+#include <string>
+#include <iostream>
+
+namespace OpenVic2 {
+ //A relative period between points in time, measured in days
+ struct Timespan {
+ int64_t days;
+
+ Timespan() : days(0) {}
+ Timespan(int64_t const& value) : days(value) {}
+
+ bool operator< (Timespan const& other) const;
+ bool operator> (Timespan const& other) const;
+ bool operator<= (Timespan const& other) const;
+ bool operator>= (Timespan const& other) const;
+ bool operator== (Timespan const& other) const;
+ bool operator!= (Timespan const& other) const;
+
+ Timespan operator+ (Timespan const& other) const;
+ Timespan operator- (Timespan const& other) const;
+ Timespan operator* (int64_t const& factor) const;
+ Timespan operator/ (int64_t const& factor) const;
+
+ Timespan& operator+= (Timespan const& other);
+ Timespan& operator-= (Timespan const& other);
+ };
+
+ static constexpr size_t MONTHS_IN_YEAR = 12;
+ static constexpr size_t DAYS_IN_YEAR = 365;
+ static constexpr size_t DAYS_IN_MONTH[MONTHS_IN_YEAR] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
+
+ using date_t = uint8_t;
+ using month_t = uint8_t;
+ using year_t = uint16_t;
+ using YearMonthDayBundle = std::tuple<year_t, month_t, date_t>;
+
+ //Represents an in-game date
+ //Note: Current implementation does not account for leap-years, or dates before Year 0
+ struct Date {
+ private:
+ YearMonthDayBundle gregorianDate;
+ //Number of days since Jan 1st, Year 0
+ Timespan ts;
+
+ public:
+ //The Timespan is considered to be the number of days since Jan 1st, Year 0
+ Date(Timespan const& timespan);
+
+ //Year month day specification
+ Date(year_t year = 1836, month_t month = 1, date_t day = 1);
+
+ private:
+ void updateDate(Timespan const& timespan);
+
+ public:
+ size_t getDay() const;
+ size_t getMonth() const;
+ size_t getYear() const;
+
+ bool operator< (Date const& other) const;
+ bool operator> (Date const& other) const;
+ bool operator<= (Date const& other) const;
+ bool operator>= (Date const& other) const;
+ bool operator== (Date const& other) const;
+ bool operator!= (Date const& other) const;
+
+ Date operator+ (Timespan timespan) const;
+ Timespan operator- (Date const& other) const;
+
+ Date& operator+= (Timespan const& timespan);
+ Date& operator-= (Timespan const& timespan);
+ //Postfix increment
+ Date operator++ (int);
+
+ explicit operator std::string() const;
+ friend std::ostream& operator<< (std::ostream& out, Date const& date);
+ };
+}