aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSanJacobs2022-04-18 21:56:15 +0200
committerSanJacobs2022-04-18 22:05:49 +0200
commitcbfe467aa2b4bc3b12bd3ab0e31fe6ef74843c64 (patch)
tree0f96b38c8a4bb4f8ff7d37ef94521df43fe6ad36
parent74ff7c3a783e3c111a48715108a5b6a3d25e49b8 (diff)
downloadsatscalc-cbfe467aa2b4bc3b12bd3ab0e31fe6ef74843c64.tar.gz
satscalc-cbfe467aa2b4bc3b12bd3ab0e31fe6ef74843c64.tar.bz2
satscalc-cbfe467aa2b4bc3b12bd3ab0e31fe6ef74843c64.zip
Implemented delta struct and -operator for momentscpp
THIS IS COMPLETELY UNTESTED THO
-rwxr-xr-xsrc/time.cpp57
-rwxr-xr-xsrc/time.h9
2 files changed, 66 insertions, 0 deletions
diff --git a/src/time.cpp b/src/time.cpp
index 384eb83..29af5be 100755
--- a/src/time.cpp
+++ b/src/time.cpp
@@ -2,6 +2,8 @@
// Look. listen here. There's no way I'm going to start taking DST into account.
// I have to draw the line somewhere, and frankly, once you start doing "Change an hour on the 4th moon of the 2nd week of March in France, but only if the tulips haven't sprung... etc... etc.." I'm out.
+// The fact that DST is designed this way, though, luckily makes it so you are unlikely to be on the clock during a DST transition.
+
//
// --- OPERATOR OVERLOADS ---
@@ -31,6 +33,61 @@ bool moment::operator==(const moment& other) const {
minutes==other.minutes);
}
+bool moment::operator!=(const moment& other) const {
+ return bool(year!=other.year ||
+ month!=other.month ||
+ day!=other.day ||
+ hours!=other.hours ||
+ minutes!=other.minutes);
+}
+
+delta moment::operator-(const moment& other) const {
+ // Uses what I call an accumulator-decumulator design
+ // Count how long it takes to approach a benchmark,
+ // and that's the difference
+ //
+ if(*this==other) return{0,0,0};
+ delta accumulator{0,0,0};
+
+ // smallest operand becomes benchmark to approach
+ const bool reverse{*this<other};
+ const moment& benchmark = reverse? *this : other;
+ moment decumulator = reverse? other : *this;
+
+ // It is possible to write something that does this in months at a time, instead of days,
+ // which would be faster, but I am not expecting to have to do this with such
+ // long periods of time, so screw that.
+ while(decumulator.year - benchmark.year > 1 ||
+ decumulator.month - benchmark.month > 1 ||
+ decumulator.day - benchmark.day > 1) {
+ wind(decumulator, 0, 0, 1);
+ accumulator.days++;
+ }
+ while(decumulator.hours - benchmark.hours > 1) {
+ wind(decumulator, 0, 1, 0);
+ accumulator.hours++;
+ }
+ while(decumulator != benchmark) {
+ wind(decumulator, 1, 0, 0);
+ accumulator.minutes++;
+ }
+ return accumulator;
+}
+
+
+
+//
+// --- METHODS ---
+//
+
+double timeblock::hourcount() {
+ delta timedelta = end-start;
+ return (timedelta.minutes/60.0f +
+ timedelta.hours +
+ timedelta.days*24);
+}
+
+
//
// --- FUNCTIONS ---
diff --git a/src/time.h b/src/time.h
index 213615f..b512e91 100755
--- a/src/time.h
+++ b/src/time.h
@@ -6,6 +6,12 @@
#include <string.h>
#include <vector>
+struct delta{
+ signed int minutes;
+ signed int hours;
+ signed int days;
+};
+
struct moment{
signed int minutes;
signed int hours; // 24-hour format. 23:59 progresses to 00:00
@@ -16,11 +22,14 @@ struct moment{
bool operator<(const moment& other) const;
bool operator>(const moment& other) const;
bool operator==(const moment& other) const;
+ bool operator!=(const moment& other) const;
+ delta operator-(const moment& other) const;
};
struct timeblock{
moment start;
moment end;
+ double hourcount();
};
struct workday{