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

View File

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

View File

@ -1,12 +1,34 @@
#include <wups/config/WUPSConfigCategory.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() {
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) {
WUPSConfigAPI_Category_Destroy(mHandle);
mHandle.handle = nullptr;
}
}
@ -18,7 +40,7 @@ std::optional<WUPSConfigCategory> WUPSConfigCategory::Create(std::string_view na
return WUPSConfigCategory(catHandle);
}
WUPSConfigCategory WUPSConfigCategory::Create(std::string_view name) {
WUPSConfigCategory WUPSConfigCategory::Create(const std::string_view name) {
WUPSConfigAPIStatus error;
auto res = Create(name, error);
if (!res) {
@ -62,4 +84,12 @@ void WUPSConfigCategory::add(WUPSConfigItem &&item) {
if (!add(std::move(item), err)) {
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>
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) {
WUPSConfigAPI_Item_Destroy(mHandle);
mHandle.handle = nullptr;
}
}
const WUPSConfigItemHandle &WUPSConfigItem::getHandle() const {
return mHandle;
}
void WUPSConfigItem::release() {
mHandle = {};
}