WiiUPluginLoaderBackend/source/utils/storage/StorageSubItem.cpp

85 lines
2.2 KiB
C++
Raw Normal View History

2023-10-07 22:38:27 +02:00
#include "StorageSubItem.h"
2023-12-16 12:44:20 +01:00
StorageSubItem *StorageSubItem::getSubItem(wups_storage_item item) {
2023-10-07 22:38:27 +02:00
// Try to find the sub-item based on item handle.
2023-12-16 12:44:20 +01:00
for (auto &cur : mSubCategories) {
if (cur.getHandle() == (uint32_t) item) {
return &cur;
2023-10-07 22:38:27 +02:00
}
}
// If not found in current category, recursively search in sub-categories.
2023-12-16 12:44:20 +01:00
for (auto &cur : mSubCategories) {
auto res = cur.getSubItem(item);
2023-10-07 22:38:27 +02:00
if (res) {
return res;
}
}
return nullptr;
}
const StorageSubItem *StorageSubItem::getSubItem(const char *key) const {
// Try to find the sub-item based on key.
for (const auto &cur : mSubCategories) {
2023-12-16 12:44:20 +01:00
if (cur.getKey() == key) {
return &cur;
2023-10-07 22:38:27 +02:00
}
}
return nullptr;
}
bool StorageSubItem::deleteItem(const char *key) {
2023-12-16 12:44:20 +01:00
if (remove_first_if(mSubCategories, [key](auto &cur) { return cur.getKey() == key; })) {
2023-10-07 22:38:27 +02:00
return true;
}
auto itemItr = mItems.find(key);
if (itemItr != mItems.end()) {
mItems.erase(itemItr);
return true; // Item found and deleted.
}
return false;
}
StorageItem *StorageSubItem::createItem(const char *key, StorageSubItem::StorageSubItemError &error) {
for (const auto &cur : mSubCategories) {
2023-12-16 12:44:20 +01:00
if (cur.getKey() == key) {
2023-10-07 22:38:27 +02:00
error = STORAGE_SUB_ITEM_KEY_ALREADY_IN_USE;
return nullptr;
}
}
2023-12-16 12:44:20 +01:00
auto result = mItems.insert({key, StorageItem(key)});
if (result.second) {
return &result.first->second;
2023-10-07 22:38:27 +02:00
}
2023-12-16 12:44:20 +01:00
return nullptr;
2023-10-07 22:38:27 +02:00
}
StorageSubItem *StorageSubItem::createSubItem(const char *key, StorageSubItem::StorageSubItemError &error) {
auto resItr = mItems.find(key);
if (resItr != mItems.end()) {
error = STORAGE_SUB_ITEM_KEY_ALREADY_IN_USE;
return nullptr;
}
for (const auto &cur : mSubCategories) {
2023-12-16 12:44:20 +01:00
if (cur.getKey() == key) {
2023-10-07 22:38:27 +02:00
error = STORAGE_SUB_ITEM_KEY_ALREADY_IN_USE;
return nullptr;
}
}
2023-12-16 12:44:20 +01:00
mSubCategories.emplace_front(key);
return &mSubCategories.front();
2023-10-07 22:38:27 +02:00
}
StorageItem *StorageSubItem::getItem(const char *name) {
auto resItr = mItems.find(name);
if (resItr != mItems.end()) {
2023-12-16 12:44:20 +01:00
return &resItr->second;
2023-10-07 22:38:27 +02:00
}
return nullptr;
}