From 4e99dc1c02eb69b906325c8f0146455061e8c14e Mon Sep 17 00:00:00 2001
From: Zandor Smith <info@zsinfo.nl>
Date: Wed, 20 Feb 2019 11:46:06 +0100
Subject: [PATCH] Add Redoable, Undoable, UndoRedoValue, Location2D.

---
 HelloTemplate.vcxproj         |  7 +++++++
 HelloTemplate.vcxproj.filters | 17 +++++++++++++++++
 Location2D.h                  | 20 ++++++++++++++++++++
 RedoableValue.h               | 17 +++++++++++++++++
 UndoRedoValue.h               | 31 +++++++++++++++++++++++++++++++
 UndoableValue.h               | 17 +++++++++++++++++
 main.cpp                      | 19 +++++++++++++++++++
 7 files changed, 128 insertions(+)
 create mode 100644 Location2D.h
 create mode 100644 RedoableValue.h
 create mode 100644 UndoRedoValue.h
 create mode 100644 UndoableValue.h

diff --git a/HelloTemplate.vcxproj b/HelloTemplate.vcxproj
index a7db817..acdd3da 100644
--- a/HelloTemplate.vcxproj
+++ b/HelloTemplate.vcxproj
@@ -117,6 +117,13 @@
   <ItemGroup>
     <ClCompile Include="main.cpp" />
   </ItemGroup>
+  <ItemGroup>
+    <ClInclude Include="Location2D.h" />
+    <ClInclude Include="Pair.h" />
+    <ClInclude Include="RedoableValue.h" />
+    <ClInclude Include="UndoableValue.h" />
+    <ClInclude Include="UndoRedoValue.h" />
+  </ItemGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
   <ImportGroup Label="ExtensionTargets">
   </ImportGroup>
diff --git a/HelloTemplate.vcxproj.filters b/HelloTemplate.vcxproj.filters
index a91ad0e..775520f 100644
--- a/HelloTemplate.vcxproj.filters
+++ b/HelloTemplate.vcxproj.filters
@@ -19,4 +19,21 @@
       <Filter>Source Files</Filter>
     </ClCompile>
   </ItemGroup>
+  <ItemGroup>
+    <ClInclude Include="Pair.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+    <ClInclude Include="Location2D.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+    <ClInclude Include="RedoableValue.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+    <ClInclude Include="UndoableValue.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+    <ClInclude Include="UndoRedoValue.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+  </ItemGroup>
 </Project>
\ No newline at end of file
diff --git a/Location2D.h b/Location2D.h
new file mode 100644
index 0000000..c8a7959
--- /dev/null
+++ b/Location2D.h
@@ -0,0 +1,20 @@
+#pragma once
+#include "UndoRedoValue.h"
+
+template<typename valueType>
+struct Location2D
+{
+	Location2D(valueType x, valueType y)
+	{
+		this->x = UndoRedoValue<valueType>(x);
+		this->y = UndoRedoValue<valueType>(y);
+	}
+
+	UndoRedoValue<valueType> x = NULL;
+	UndoRedoValue<valueType> y = NULL;
+
+	void print()
+	{
+		printf((std::string("(") + std::to_string(x.value) + std::string(" ") + std::to_string(y.value) + std::string(")")).c_str());
+	}
+};
diff --git a/RedoableValue.h b/RedoableValue.h
new file mode 100644
index 0000000..d979f4a
--- /dev/null
+++ b/RedoableValue.h
@@ -0,0 +1,17 @@
+#pragma once
+
+template<typename valueType>
+struct RedoableValue
+{
+	void updateRedoableValue(valueType& valueToSet, valueType value)
+	{
+		this->lastSet = value;
+	}
+
+	void redoSet(valueType& valueToSet)
+	{
+		valueToSet = this->lastSet;
+	}
+
+	valueType lastSet;
+};
\ No newline at end of file
diff --git a/UndoRedoValue.h b/UndoRedoValue.h
new file mode 100644
index 0000000..c2b60e4
--- /dev/null
+++ b/UndoRedoValue.h
@@ -0,0 +1,31 @@
+#pragma once
+#include "UndoableValue.h"
+#include "RedoableValue.h"
+
+template<typename valueType>
+struct UndoRedoValue : UndoableValue<valueType>, RedoableValue<valueType>
+{
+	UndoRedoValue(valueType startingValue)
+	{
+		this->value = startingValue;
+	}
+
+	void setValue(valueType value)
+	{
+		this->updateUndoableValue(this->value, value);
+		this->value = value;
+		this->updateRedoableValue(this->value, value);
+	}
+
+	void redoSet()
+	{
+		this->RedoableValue<valueType>::redoSet(this->value);
+	}
+
+	void undoSet()
+	{
+		this->UndoableValue<valueType>::undoSet(this->value);
+	}
+
+	valueType value;
+};
diff --git a/UndoableValue.h b/UndoableValue.h
new file mode 100644
index 0000000..5ccd654
--- /dev/null
+++ b/UndoableValue.h
@@ -0,0 +1,17 @@
+#pragma once
+
+template<typename valueType>
+struct UndoableValue
+{
+	void updateUndoableValue(valueType& valueToSet, valueType value)
+	{
+		this->previousValue = valueToSet;
+	}
+
+	void undoSet(valueType& valueToSet)
+	{
+		valueToSet = this->previousValue;
+	}
+
+	valueType previousValue;
+};
\ No newline at end of file
diff --git a/main.cpp b/main.cpp
index bfc11bd..e522b30 100644
--- a/main.cpp
+++ b/main.cpp
@@ -1,5 +1,6 @@
 #include <vector>
 #include <string>
+#include "Location2D.h"
 
 template<typename vectorType>
 bool inVector(const std::vector<vectorType>& haystack, const vectorType& needle)
@@ -50,6 +51,24 @@ int main()
 
 	// ==============
 
+	// TODO: Add test for Pair.
+
+	// ==============
+
+	{
+		Location2D<int> location = Location2D<int>(10, 20);
+
+		location.print();
+		location.y.setValue(10);
+		location.print();
+		location.y.undoSet();
+		location.print();
+		location.y.redoSet();
+		location.print();
+	}
+
+	// ==============
+
 	while(true) {}
 
 	return 0;
-- 
GitLab