From 90246804d0b8e6fbcfddc7f99fb3b137239a8143 Mon Sep 17 00:00:00 2001 From: fallenoak Date: Sun, 1 Jan 2023 20:59:41 -0600 Subject: [PATCH] feat(handle): add handle functions --- common/Handle.cpp | 36 +++++++++++++++++++++++++++++++++ common/Handle.hpp | 24 ++++++++++++++++++++++ common/handle/CHandleObject.hpp | 15 ++++++++++++++ test/Handle.cpp | 15 ++++++++++++++ 4 files changed, 90 insertions(+) create mode 100644 common/Handle.cpp create mode 100644 common/Handle.hpp create mode 100644 common/handle/CHandleObject.hpp create mode 100644 test/Handle.cpp diff --git a/common/Handle.cpp b/common/Handle.cpp new file mode 100644 index 0000000..f12499b --- /dev/null +++ b/common/Handle.cpp @@ -0,0 +1,36 @@ +#include "common/Handle.hpp" +#include "common/handle/CHandleObject.hpp" +#include + +HOBJECT HandleCreate(CHandleObject* ptr) { + STORM_ASSERT(ptr); + STORM_VALIDATE(ptr, ERROR_INVALID_PARAMETER, nullptr); + + ptr->m_refcount++; + return reinterpret_cast(ptr); +} + +void HandleClose(HOBJECT handle) { + CHandleObject* ptr = HandleDereference(handle); + + STORM_ASSERT(ptr->m_refcount > 0); + + ptr->m_refcount--; + + if (ptr->m_refcount == 0) { + delete ptr; + } +} + +CHandleObject* HandleDereference(HOBJECT handle) { + return reinterpret_cast(handle); +} + +HOBJECT HandleDuplicate(HOBJECT handle) { + if (!handle) { + return nullptr; + } + + HandleDereference(handle)->m_refcount++; + return handle; +} diff --git a/common/Handle.hpp b/common/Handle.hpp new file mode 100644 index 0000000..b3b26ee --- /dev/null +++ b/common/Handle.hpp @@ -0,0 +1,24 @@ +#ifndef COMMON_HANDLE_HPP +#define COMMON_HANDLE_HPP + +#include "common/handle/CHandleObject.hpp" +#include +#include + +typedef void* HANDLE; + +#define DECLARE_HANDLE(name) \ + struct name##__; \ + typedef struct name##__* name + +DECLARE_HANDLE(HOBJECT); + +HOBJECT HandleCreate(CHandleObject* ptr); + +void HandleClose(HOBJECT handle); + +CHandleObject* HandleDereference(HOBJECT handle); + +HOBJECT HandleDuplicate(HOBJECT handle); + +#endif diff --git a/common/handle/CHandleObject.hpp b/common/handle/CHandleObject.hpp new file mode 100644 index 0000000..605adae --- /dev/null +++ b/common/handle/CHandleObject.hpp @@ -0,0 +1,15 @@ +#ifndef COMMON_HANDLE_C_HANDLE_OBJECT_HPP +#define COMMON_HANDLE_C_HANDLE_OBJECT_HPP + +#include + +class CHandleObject { + public: + // Member variables + int32_t m_refcount = 0; + + // Virtual member functions + virtual ~CHandleObject() = default; +}; + +#endif diff --git a/test/Handle.cpp b/test/Handle.cpp new file mode 100644 index 0000000..11fe70d --- /dev/null +++ b/test/Handle.cpp @@ -0,0 +1,15 @@ +#include "common/Handle.hpp" +#include "test/Test.hpp" + +class TestHandleObject : public CHandleObject {}; + +TEST_CASE("HandleCreate", "[handle]") { + SECTION("returns handle for subclass of CHandleObject") { + auto testObject = new TestHandleObject(); + + auto handle = HandleCreate(testObject); + CHECK(handle); + + HandleClose(handle); + } +}