ConfigAPI: release handle in move operator/constructor before overwriting it.

This commit is contained in:
Maschell 2024-12-30 14:15:28 +01:00
parent 5dc33a32ff
commit 6e1c40fc39
4 changed files with 72 additions and 35 deletions

View File

@ -4,7 +4,6 @@
#include "WUPSConfigItem.h" #include "WUPSConfigItem.h"
#include <optional> #include <optional>
#include <stdexcept>
#include <string> #include <string>
class WUPSConfigCategory { class WUPSConfigCategory {
@ -14,17 +13,11 @@ public:
WUPSConfigCategory(const WUPSConfigCategory &) = delete; WUPSConfigCategory(const WUPSConfigCategory &) = delete;
WUPSConfigCategory(WUPSConfigCategory &&src) noexcept : mHandle(src.mHandle) { WUPSConfigCategory(WUPSConfigCategory &&src) noexcept;
src.mHandle = {};
}
WUPSConfigCategory &operator=(WUPSConfigCategory &&src) noexcept { WUPSConfigCategory &operator=(WUPSConfigCategory &&src) noexcept;
if (this != &src) {
this->mHandle = src.mHandle; void releaseHandle() noexcept;
src.mHandle = {};
}
return *this;
}
static std::optional<WUPSConfigCategory> Create(std::string_view name, WUPSConfigAPIStatus &error) noexcept; static std::optional<WUPSConfigCategory> Create(std::string_view name, WUPSConfigAPIStatus &error) noexcept;
@ -38,13 +31,9 @@ public:
void add(WUPSConfigItem &&item); void add(WUPSConfigItem &&item);
[[nodiscard]] const WUPSConfigCategoryHandle &getHandle() const { [[nodiscard]] const WUPSConfigCategoryHandle &getHandle() const;
return mHandle;
}
void release() { void release();
mHandle = {};
}
private: private:
WUPSConfigCategoryHandle mHandle = {}; WUPSConfigCategoryHandle mHandle = {};

View File

@ -14,25 +14,15 @@ public:
WUPSConfigItem(const WUPSConfigItem &) = delete; WUPSConfigItem(const WUPSConfigItem &) = delete;
WUPSConfigItem(WUPSConfigItem &&src) noexcept : mHandle(src.mHandle) { WUPSConfigItem(WUPSConfigItem &&src) noexcept;
src.mHandle = {};
}
WUPSConfigItem &operator=(WUPSConfigItem &&src) noexcept { WUPSConfigItem &operator=(WUPSConfigItem &&src) noexcept;
if (this != &src) {
this->mHandle = src.mHandle;
src.mHandle = {};
}
return *this;
}
[[nodiscard]] const WUPSConfigItemHandle &getHandle() const { void releaseHandle() noexcept;
return mHandle;
}
void release() { [[nodiscard]] const WUPSConfigItemHandle &getHandle() const;
mHandle = {};
} void release();
private: private:
WUPSConfigItemHandle mHandle = {}; WUPSConfigItemHandle mHandle = {};

View File

@ -1,12 +1,34 @@
#include <wups/config/WUPSConfigCategory.h> #include <wups/config/WUPSConfigCategory.h>
#include <wups/config_api.h> #include <wups/config_api.h>
WUPSConfigCategory::WUPSConfigCategory(WUPSConfigCategoryHandle handle) noexcept : mHandle(handle) { #include <stdexcept>
WUPSConfigCategory::WUPSConfigCategory(const WUPSConfigCategoryHandle handle) noexcept : mHandle(handle) {
} }
WUPSConfigCategory::~WUPSConfigCategory() { WUPSConfigCategory::~WUPSConfigCategory() {
releaseHandle();
}
WUPSConfigCategory::WUPSConfigCategory(WUPSConfigCategory &&src) noexcept {
releaseHandle();
mHandle = src.mHandle;
src.mHandle = {};
}
WUPSConfigCategory &WUPSConfigCategory::operator=(WUPSConfigCategory &&src) noexcept {
if (this != &src) {
releaseHandle();
this->mHandle = src.mHandle;
src.mHandle = {};
}
return *this;
}
void WUPSConfigCategory::releaseHandle() noexcept {
if (mHandle.handle != nullptr) { if (mHandle.handle != nullptr) {
WUPSConfigAPI_Category_Destroy(mHandle); WUPSConfigAPI_Category_Destroy(mHandle);
mHandle.handle = nullptr;
} }
} }
@ -18,7 +40,7 @@ std::optional<WUPSConfigCategory> WUPSConfigCategory::Create(std::string_view na
return WUPSConfigCategory(catHandle); return WUPSConfigCategory(catHandle);
} }
WUPSConfigCategory WUPSConfigCategory::Create(std::string_view name) { WUPSConfigCategory WUPSConfigCategory::Create(const std::string_view name) {
WUPSConfigAPIStatus error; WUPSConfigAPIStatus error;
auto res = Create(name, error); auto res = Create(name, error);
if (!res) { if (!res) {
@ -62,4 +84,12 @@ void WUPSConfigCategory::add(WUPSConfigItem &&item) {
if (!add(std::move(item), err)) { if (!add(std::move(item), err)) {
throw std::runtime_error{"Failed to add item to category"}; throw std::runtime_error{"Failed to add item to category"};
} }
}
const WUPSConfigCategoryHandle &WUPSConfigCategory::getHandle() const {
return mHandle;
}
void WUPSConfigCategory::release() {
mHandle = {};
} }

View File

@ -2,7 +2,35 @@
#include <wups/config_api.h> #include <wups/config_api.h>
WUPSConfigItem::~WUPSConfigItem() { WUPSConfigItem::~WUPSConfigItem() {
releaseHandle();
}
WUPSConfigItem::WUPSConfigItem(WUPSConfigItem &&src) noexcept {
releaseHandle();
this->mHandle = src.mHandle;
src.mHandle = {};
}
WUPSConfigItem &WUPSConfigItem::operator=(WUPSConfigItem &&src) noexcept {
if (this != &src) {
releaseHandle();
this->mHandle = src.mHandle;
src.mHandle = {};
}
return *this;
}
void WUPSConfigItem::releaseHandle() noexcept {
if (mHandle.handle != nullptr) { if (mHandle.handle != nullptr) {
WUPSConfigAPI_Item_Destroy(mHandle); WUPSConfigAPI_Item_Destroy(mHandle);
mHandle.handle = nullptr;
} }
}
const WUPSConfigItemHandle &WUPSConfigItem::getHandle() const {
return mHandle;
}
void WUPSConfigItem::release() {
mHandle = {};
} }