From 1ce278d3ba26b7278fa5a5adcd348ab7558fbe0f Mon Sep 17 00:00:00 2001
From: Nicolas Pope <nwpope@utu.fi>
Date: Wed, 11 Nov 2020 19:37:18 +0200
Subject: [PATCH] Use RAII

---
 SDK/CPP/public/include/voltu/initialise.hpp   |  2 ++
 SDK/CPP/public/include/voltu/voltu.hpp        | 20 +++++++++++++++++++
 .../public/samples/fusion_evaluator/main.cpp  |  2 +-
 SDK/CPP/public/voltu.cpp                      | 13 +++++++++---
 4 files changed, 33 insertions(+), 4 deletions(-)

diff --git a/SDK/CPP/public/include/voltu/initialise.hpp b/SDK/CPP/public/include/voltu/initialise.hpp
index 5d34a1e69..7c72189dc 100644
--- a/SDK/CPP/public/include/voltu/initialise.hpp
+++ b/SDK/CPP/public/include/voltu/initialise.hpp
@@ -43,4 +43,6 @@ namespace voltu
 	 * @return Singleton VolTu runtime instance.
 	 */
 	std::shared_ptr<voltu::System> instance();
+
+	void release();
 }
diff --git a/SDK/CPP/public/include/voltu/voltu.hpp b/SDK/CPP/public/include/voltu/voltu.hpp
index c59518dcf..2bd0ff0a0 100644
--- a/SDK/CPP/public/include/voltu/voltu.hpp
+++ b/SDK/CPP/public/include/voltu/voltu.hpp
@@ -15,3 +15,23 @@
 
 #include <voltu/system.hpp>
 #include <voltu/initialise.hpp>
+
+namespace voltu
+{
+
+class Voltu
+{
+public:
+	inline Voltu() : instance_(voltu::instance()) {}
+	inline ~Voltu() { instance_.reset(); voltu::release(); }
+
+	inline voltu::System* operator->()
+	{
+		return instance_.get();
+	}
+
+private:
+	std::shared_ptr<voltu::System> instance_;
+};
+
+}
diff --git a/SDK/CPP/public/samples/fusion_evaluator/main.cpp b/SDK/CPP/public/samples/fusion_evaluator/main.cpp
index f9b96468c..40db29fe5 100644
--- a/SDK/CPP/public/samples/fusion_evaluator/main.cpp
+++ b/SDK/CPP/public/samples/fusion_evaluator/main.cpp
@@ -74,7 +74,7 @@ int main(int argc, char **argv)
 		}
 	}
 
-	auto vtu = voltu::instance();
+	voltu::Voltu vtu;
 
 	for (const auto &p : paths)
 	{
diff --git a/SDK/CPP/public/voltu.cpp b/SDK/CPP/public/voltu.cpp
index d558ff7b0..9c9767b30 100644
--- a/SDK/CPP/public/voltu.cpp
+++ b/SDK/CPP/public/voltu.cpp
@@ -25,14 +25,15 @@
 #include <cstdlib>
 #include <iostream>
 
+typedef void* Library;
+
 static bool g_init = false;
+static Library handle = nullptr;
 
 #ifdef WITH_OPENCV
 voltu::GpuUtilities voltu::gpu;
 #endif
 
-typedef void* Library;
-
 static Library loadLibrary(const char *file)
 {
 #if defined(WIN32)
@@ -116,7 +117,7 @@ std::shared_ptr<voltu::System> voltu::instance()
 	
 	std::string name = locateLibrary();
 	std::cout << "Loading VolTu Runtime: " << name << std::endl;
-	Library handle = loadLibrary(name.c_str());
+	handle = loadLibrary(name.c_str());
 
 	if (handle)
 	{
@@ -166,3 +167,9 @@ std::shared_ptr<voltu::System> voltu::instance()
 
 	return nullptr;
 }
+
+void voltu::release()
+{
+	// TODO: Call a finalise function
+	if (handle) unloadLibrary(handle);
+}
-- 
GitLab