aboutsummaryrefslogtreecommitdiff
path: root/src/openvic/Date.hpp
blob: 15b7219c15f4881cda3abd11bfad0962d19fc805 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
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);
}