From f5bacf193a77a10b9d69c9e2e8842d0dac34ee56 Mon Sep 17 00:00:00 2001 From: Edward O'Callaghan Date: Tue, 7 Feb 2017 22:03:40 +1100 Subject: src/res_mgmr.hcpp: Add RAII helper class Signed-off-by: Edward O'Callaghan --- src/res_mgmr.hcpp | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 src/res_mgmr.hcpp diff --git a/src/res_mgmr.hcpp b/src/res_mgmr.hcpp new file mode 100644 index 0000000..3827302 --- /dev/null +++ b/src/res_mgmr.hcpp @@ -0,0 +1,57 @@ +template +class VDeleter { +public: + VDeleter() : VDeleter([](T, VkAllocationCallbacks*) {}) {} + + VDeleter(std::function deletef) { + this->deleter = [=](T obj) { deletef(obj, nullptr); }; + } + + VDeleter(const VDeleter& instance, std::function deletef) { + this->deleter = [&instance, deletef](T obj) { deletef(instance, obj, nullptr); }; + } + + VDeleter(const VDeleter& device, std::function deletef) { + this->deleter = [&device, deletef](T obj) { deletef(device, obj, nullptr); }; + } + + ~VDeleter() { + cleanup(); + } + + const T* operator &() const { + return &object; + } + + T* replace() { + cleanup(); + return &object; + } + + operator T() const { + return object; + } + + void operator=(T rhs) { + if (rhs != object) { + cleanup(); + object = rhs; + } + } + + template + bool operator==(V rhs) { + return object == T(rhs); + } + +private: + T object{VK_NULL_HANDLE}; + std::function deleter; + + void cleanup() { + if (object != VK_NULL_HANDLE) { + deleter(object); + } + object = VK_NULL_HANDLE; + } +}; -- cgit v1.2.3