diff options
| author | robojumper <robojumper@gmail.com> | 2025-08-21 12:16:10 +0200 |
|---|---|---|
| committer | robojumper <robojumper@gmail.com> | 2025-08-21 12:16:10 +0200 |
| commit | da63feb111ea145e33be6d6bf108e6d8f559e77b (patch) | |
| tree | b489f48d55cb80423a5958a7168e40788bcce848 /src | |
| parent | 816086d764f95400ae44a72d5f83bdaa968e3456 (diff) | |
Fix a bunch of splits and implement LayoutArc/ObjectArcControl
Diffstat (limited to 'src')
| -rw-r--r-- | src/toBeSorted/arc_managers/layout_arc_manager.cpp | 66 | ||||
| -rw-r--r-- | src/toBeSorted/arc_managers/oarc_manager.cpp | 49 |
2 files changed, 114 insertions, 1 deletions
diff --git a/src/toBeSorted/arc_managers/layout_arc_manager.cpp b/src/toBeSorted/arc_managers/layout_arc_manager.cpp index ce329680..091fe504 100644 --- a/src/toBeSorted/arc_managers/layout_arc_manager.cpp +++ b/src/toBeSorted/arc_managers/layout_arc_manager.cpp @@ -2,7 +2,6 @@ #include "d/d_heap.h" - LayoutArcManager *LayoutArcManager::sInstance; LayoutArcManager::LayoutArcManager() { @@ -57,3 +56,68 @@ bool LayoutArcManager::create(EGG::Heap *heap) { GetInstance()->init(heap); return true; } + +LayoutArcControl::~LayoutArcControl() { + if (mLayoutArcs != nullptr) { + release(); + } +} + +void LayoutArcControl::set(const char *const *layoutArcs, s32 numArcs) { + mLayoutArcs = layoutArcs; + mNumArcs = numArcs; +} + +bool LayoutArcControl::load(EGG::Heap *heap) const { + if (mLayoutArcs == nullptr) { + return true; + } + + const char *const *ptr = mLayoutArcs; + for (int i = 0; i < mNumArcs; i++) { + LayoutArcManager::GetInstance()->loadLayoutArcFromDisk(*ptr, heap); + ptr++; + } + + return true; +} + +bool LayoutArcControl::allLoaded() const { + if (mLayoutArcs == nullptr) { + return true; + } + + const char *const *ptr = mLayoutArcs; + for (int i = 0; i < mNumArcs; i++) { + dArcResult_e res = LayoutArcManager::GetInstance()->ensureLoaded1(*ptr); + if (res != D_ARC_RESULT_OK) { + return false; + } + ptr++; + } + return true; +} + +bool LayoutArcControl::release() { + if (mLayoutArcs == nullptr) { + return true; + } + + const char *const *ptr = mLayoutArcs; + for (int i = 0; i < mNumArcs; i++) { + dArcResult_e res = LayoutArcManager::GetInstance()->ensureLoaded2(*ptr); + if (res != D_ARC_RESULT_ERROR_NOT_FOUND && res != D_ARC_RESULT_OK) { + return false; + } + ptr++; + } + + ptr = mLayoutArcs; + for (int i = 0; i < mNumArcs; i++) { + LayoutArcManager::GetInstance()->decrement(*ptr); + ptr++; + } + mLayoutArcs = nullptr; + + return true; +} diff --git a/src/toBeSorted/arc_managers/oarc_manager.cpp b/src/toBeSorted/arc_managers/oarc_manager.cpp index 784f88db..aa284e3f 100644 --- a/src/toBeSorted/arc_managers/oarc_manager.cpp +++ b/src/toBeSorted/arc_managers/oarc_manager.cpp @@ -89,3 +89,52 @@ bool OarcManager::create(EGG::Heap *heap) { GetInstance()->init(heap); return true; } + +ObjectArcControl::~ObjectArcControl() { + if (mObjectArcs != nullptr) { + release(); + } +} + +void ObjectArcControl::set(const char *const *objectArcs, s32 numArcs) { + mObjectArcs = objectArcs; + mNumArcs = numArcs; +} + +bool ObjectArcControl::load(EGG::Heap *heap) const { + if (mObjectArcs == nullptr) { + return true; + } + + const char *const *ptr = mObjectArcs; + for (int i = 0; i < mNumArcs; i++) { + OarcManager::GetInstance()->loadObjectArcFromDisk(*ptr, heap); + ptr++; + } + + return true; +} + +bool ObjectArcControl::release() { + if (mObjectArcs == nullptr) { + return true; + } + + const char *const *ptr = mObjectArcs; + for (int i = 0; i < mNumArcs; i++) { + dArcResult_e res = OarcManager::GetInstance()->ensureLoaded2(*ptr); + if (res != D_ARC_RESULT_ERROR_NOT_FOUND && res != D_ARC_RESULT_OK) { + return false; + } + ptr++; + } + + ptr = mObjectArcs; + for (int i = 0; i < mNumArcs; i++) { + OarcManager::GetInstance()->decrement(*ptr); + ptr++; + } + mObjectArcs = nullptr; + + return true; +} |
