From 5647efab062ac32328602d886fca609602a87810 Mon Sep 17 00:00:00 2001
From: Tobias Frisch <tfrisch@uni-koblenz.de>
Date: Fri, 8 Jul 2022 11:38:57 +0200
Subject: [PATCH] Updated last manager for windows

Signed-off-by: Tobias Frisch <tfrisch@uni-koblenz.de>
---
 src/vkcv/WindowManager.cpp | 62 ++++++++++++++++++++------------------
 src/vkcv/WindowManager.hpp | 43 +++++++++++---------------
 2 files changed, 50 insertions(+), 55 deletions(-)

diff --git a/src/vkcv/WindowManager.cpp b/src/vkcv/WindowManager.cpp
index 3179b219..4a367bd7 100644
--- a/src/vkcv/WindowManager.cpp
+++ b/src/vkcv/WindowManager.cpp
@@ -2,26 +2,40 @@
 
 namespace vkcv {
 	
-	WindowManager::WindowManager() noexcept {
+	uint64_t WindowManager::getIdFrom(const WindowHandle &handle) const {
+		return handle.getId();
 	}
+	
+	WindowHandle WindowManager::createById(uint64_t id, const HandleDestroyFunction &destroy) {
+		return WindowHandle(id, destroy);
+	}
+	
+	void WindowManager::destroyById(uint64_t id) {
+		auto& window = getById(id);
 
-	WindowManager::~WindowManager() noexcept {
-		for (uint64_t id = 0; id < m_windows.size(); id++) {
-			destroyWindowById(id);
+		if (window) {
+			delete window;
+			window = nullptr;
 		}
-		
-		m_windows.clear();
 	}
+	
+	WindowManager::WindowManager() noexcept : HandleManager<Window *, WindowHandle>() {}
 
-	WindowHandle WindowManager::createWindow(
-			SwapchainManager &swapchainManager,
-			const char *applicationName,
-			uint32_t windowWidth,
-			uint32_t windowHeight,
-			bool resizeable) {
-		const uint64_t id = m_windows.size();
+	WindowManager::~WindowManager() noexcept {
+		clear();
+	}
 
-		auto window = new Window(applicationName, windowWidth, windowHeight, resizeable);
+	WindowHandle WindowManager::createWindow(SwapchainManager &swapchainManager,
+											 const char *applicationName,
+											 uint32_t windowWidth,
+											 uint32_t windowHeight,
+											 bool resizeable) {
+		auto window = new Window(
+				applicationName,
+				static_cast<int>(windowWidth),
+				static_cast<int>(windowHeight),
+				resizeable
+		);
 
 		SwapchainHandle swapchainHandle = swapchainManager.createSwapchain(*window);
 
@@ -30,27 +44,15 @@ namespace vkcv {
 				// copy handle because it would run out of scope and be invalid
 				swapchainManager.signalRecreation(handle);
 			});
+			
 			window->m_resizeHandle = resizeHandle;
 		}
 
-		m_windows.push_back(window);
-		return WindowHandle(id, [&](uint64_t id) { destroyWindowById(id); });
+		return add(window);
 	}
 
-	Window &WindowManager::getWindow(const WindowHandle handle) const {
-		return *m_windows[handle.getId()];
+	Window &WindowManager::getWindow(const WindowHandle& handle) const {
+		return *(*this)[handle];
 	}
 
-	void WindowManager::destroyWindowById(uint64_t id) {
-
-		if (id >= m_windows.size()) {
-			vkcv_log(LogLevel::ERROR, "Invalid id");
-			return;
-		}
-
-		if (m_windows[id] != nullptr) {
-			delete m_windows[id];
-			m_windows[id] = nullptr;
-		}
-	}
 }
\ No newline at end of file
diff --git a/src/vkcv/WindowManager.hpp b/src/vkcv/WindowManager.hpp
index 81658c24..4ffa4cc5 100644
--- a/src/vkcv/WindowManager.hpp
+++ b/src/vkcv/WindowManager.hpp
@@ -5,32 +5,31 @@
 #include <GLFW/glfw3.h>
 
 #include "vkcv/Window.hpp"
-#include "vkcv/Handles.hpp"
+
+#include "HandleManager.hpp"
 #include "SwapchainManager.hpp"
 
 namespace vkcv {
-	
-	class Context;
-
-	class SwapchainManager;
 
 	/**
 	 * @brief Class to manage the windows of applications.
 	 */
-	class WindowManager {
+	class WindowManager : public HandleManager<Window*, WindowHandle> {
 		friend class Core;
 
 	private:
+		[[nodiscard]]
+		uint64_t getIdFrom(const WindowHandle& handle) const override;
+		
+		[[nodiscard]]
+		WindowHandle createById(uint64_t id, const HandleDestroyFunction& destroy) override;
+		
 		/**
-		 * vector of all managed windows
-		 */
-		std::vector<Window*> m_windows;
-
-		/**
-		 * destroys a specific window by a given id
-		 * @param id of the window to be destroyed
+		 * Destroys a specific window by a given id.
+		 *
+		 * @param[in] id ID of the window to be destroyed
 		 */
-		void destroyWindowById(uint64_t id);
+		void destroyById(uint64_t id) override;
 
 	public:
 		WindowManager() noexcept;
@@ -38,15 +37,7 @@ namespace vkcv {
 		/**
 		 * destroys every window
 		 */
-		~WindowManager() noexcept;
-
-		WindowManager(WindowManager &&other) = delete;
-
-		WindowManager(const WindowManager &other) = delete;
-
-		WindowManager &operator=(WindowManager &&other) = delete;
-
-		WindowManager &operator=(const WindowManager &other) = delete;
+		~WindowManager() noexcept override;
 
 		/**
 		 * creates a window and returns it's  handle
@@ -57,7 +48,9 @@ namespace vkcv {
 		 * @param resizeable if the window is resizable
 		 * @return window handle
 		 */
-		WindowHandle createWindow(SwapchainManager &swapchainManager, const char *applicationName, uint32_t windowWidth,
+		WindowHandle createWindow(SwapchainManager &swapchainManager,
+								  const char *applicationName,
+								  uint32_t windowWidth,
 								  uint32_t windowHeight,
 								  bool resizeable);
 
@@ -66,7 +59,7 @@ namespace vkcv {
 		 * @return the reference of the window
 		 */
 		[[nodiscard]]
-		Window &getWindow(const WindowHandle handle) const;
+		Window &getWindow(const WindowHandle& handle) const;
 
 	};
 	
-- 
GitLab