From 345a799031560947445e404e79ce88c1f21fffb1 Mon Sep 17 00:00:00 2001
From: Robin Mueller <muellerr@irs.uni-stuttgart.de>
Date: Wed, 9 Mar 2022 19:05:07 +0100
Subject: [PATCH] improved version.h

---
 src/fsfw/FSFWVersion.h.in |  6 +++---
 src/fsfw/version.cpp      | 13 ++++++++-----
 src/fsfw/version.h        | 25 +++++++++++++++++++++++--
 3 files changed, 34 insertions(+), 10 deletions(-)

diff --git a/src/fsfw/FSFWVersion.h.in b/src/fsfw/FSFWVersion.h.in
index 7935b2f6..19a56214 100644
--- a/src/fsfw/FSFWVersion.h.in
+++ b/src/fsfw/FSFWVersion.h.in
@@ -2,8 +2,8 @@
 #define FSFW_VERSION_H_
 
 // Versioning is kept in project CMakeLists.txt file
-#define FSFW_VERSION @FSFW_VERSION@
-#define FSFW_SUBVERSION @FSFW_SUBVERSION@
-#define FSFW_REVISION @FSFW_REVISION@
+#define FSFW_VERSION_MAJOR @FSFW_VERSION@
+#define FSFW_VERSION_MINOR @FSFW_SUBVERSION@
+#define FSFW_VERSION_REVISION @FSFW_REVISION@
 
 #endif /* FSFW_VERSION_H_ */
diff --git a/src/fsfw/version.cpp b/src/fsfw/version.cpp
index 1bdd6cc7..e1fc32c9 100644
--- a/src/fsfw/version.cpp
+++ b/src/fsfw/version.cpp
@@ -1,8 +1,11 @@
 #include "version.h"
+
 #include "fsfw/FSFWVersion.h"
 
-void fsfw::getVersion(Version& v) {
-  v.major = FSFW_VERSION;
-  v.minor = FSFW_SUBVERSION;
-  v.revision = FSFW_REVISION;
-}
+const fsfw::Version fsfw::FSFW_VERSION = {FSFW_VERSION_MAJOR, FSFW_VERSION_MINOR,
+                                          FSFW_VERSION_REVISION};
+
+fsfw::Version::Version(uint32_t major, uint32_t minor, uint32_t revision)
+    : major(major), minor(minor), revision(revision) {}
+
+void fsfw::getVersion(Version& version) {}
diff --git a/src/fsfw/version.h b/src/fsfw/version.h
index 04b7e3ce..8340fc9d 100644
--- a/src/fsfw/version.h
+++ b/src/fsfw/version.h
@@ -5,14 +5,35 @@
 
 namespace fsfw {
 
-struct Version {
+class Version {
+ public:
+  Version(uint32_t major, uint32_t minor, uint32_t revision);
   uint32_t major = 0;
   uint32_t minor = 0;
   uint32_t revision = 0;
+
+  friend bool operator==(const Version& v1, const Version& v2) {
+    return (v1.major == v2.major and v1.minor == v2.minor and v1.revision == v2.revision);
+  }
+
+  friend bool operator!=(const Version& v1, const Version& v2) { return not(v1 == v2); }
+
+  friend bool operator<(const Version& v1, const Version& v2) {
+    return ((v1.major < v2.major) or (v1.major == v2.major and v1.minor < v2.minor) or
+            (v1.major == v2.major and v1.minor == v2.minor and v1.revision < v2.revision));
+  }
+
+  friend bool operator>(const Version& v1, const Version& v2) { return not(v1 < v2); }
+
+  friend bool operator<=(const Version& v1, const Version& v2) { return ((v1 == v2) or (v1 < v2)); }
+
+  friend bool operator>=(const Version& v1, const Version& v2) { return ((v1 == v2) or (v1 > v2)); }
 };
 
+extern const fsfw::Version FSFW_VERSION;
+
 void getVersion(Version& version);
 
-}
+}  // namespace fsfw
 
 #endif /* FSFW_SRC_FSFW_VERSION_H_ */