ksys/res: Implement EntryFactory (base class and template)

Also adds a heap-related function that's used by EntryFactory
(and many other functions)
This commit is contained in:
Léo Lam
2020-09-04 22:01:52 +02:00
parent 578955f4e9
commit 3d371999a4
8 changed files with 127 additions and 16 deletions
@@ -0,0 +1,20 @@
#include "KingSystem/Resource/resEntryFactory.h"
namespace ksys::res {
static EntryFactory<Resource> sDefaultEntryFactory;
u32 EntryFactoryBase::getResourceSize() const {
KSYS_CHECK_SIZE_NX150(sead::DirectResource, 0x20);
return sizeof(sead::DirectResource);
}
u32 EntryFactoryBase::getLoadDataAlignment() const {
return sizeof(void*);
}
EntryFactory<Resource>& getDefaultResourceFactory() {
return sDefaultEntryFactory;
}
} // namespace ksys::res
+53
View File
@@ -0,0 +1,53 @@
#pragma once
#include <basis/seadNew.h>
#include <heap/seadHeapMgr.h>
#include <resource/seadResource.h>
#include "KingSystem/Resource/resResource.h"
#include "KingSystem/Utils/HeapUtil.h"
#include "KingSystem/Utils/Types.h"
namespace ksys::res {
class EntryFactoryBase : public sead::DirectResourceFactoryBase {
SEAD_RTTI_OVERRIDE(EntryFactoryBase, sead::DirectResourceFactoryBase)
public:
explicit EntryFactoryBase(f32 size_multiplier = 1.0, u32 size_constant = 0)
: mSizeMultiplier(size_multiplier), mSizeConstant(size_constant) {}
~EntryFactoryBase() override { ; }
virtual u32 getResourceSize() const;
virtual u32 getLoadDataAlignment() const;
f32 getSizeMultiplier() const { return mSizeMultiplier; }
u32 getSizeConstant() const { return mSizeConstant; }
protected:
f32 mSizeMultiplier;
u32 mSizeConstant;
};
KSYS_CHECK_SIZE_NX150(EntryFactoryBase, 0x80);
template <typename T>
class EntryFactory : public EntryFactoryBase {
SEAD_RTTI_OVERRIDE(EntryFactory<T>, EntryFactoryBase)
public:
using EntryFactoryBase::EntryFactoryBase;
u32 getResourceSize() const override { return sizeof(T); }
u32 getLoadDataAlignment() const override { return T::cLoadDataAlignment; }
T* newResource_(sead::Heap* heap_, s32 alignment) override {
sead::Heap* heap = util::getHeapOrCurrentHeap(heap_);
sead::ScopedCurrentHeapSetter setter{heap};
return new (heap, alignment, std::nothrow_t{}) T{};
}
protected:
// XXX: What is this used for?
T mResource;
};
EntryFactory<Resource>& getDefaultResourceFactory();
} // namespace ksys::res
+2
View File
@@ -34,6 +34,8 @@ public:
bool finishParsing();
bool m7();
static constexpr size_t cLoadDataAlignment = 4;
protected:
virtual void onDestroy_() {}
virtual bool parse_(u8* data, size_t size, sead::Heap* heap);
+17
View File
@@ -0,0 +1,17 @@
#include "KingSystem/Utils/HeapUtil.h"
#include <heap/seadHeapMgr.h>
#include <thread/seadThread.h>
namespace ksys::util {
sead::Heap* getHeapOrCurrentHeap(sead::Heap* heap) {
if (heap)
return heap;
if (!sead::ThreadMgr::instance())
return nullptr;
return sead::HeapMgr::instance()->getCurrentHeap();
}
} // namespace ksys::util
+14
View File
@@ -0,0 +1,14 @@
#pragma once
#include <basis/seadTypes.h>
namespace sead {
class Heap;
}
namespace ksys::util {
/// Returns the specified heap if it is not null. Otherwise, this returns the current heap.
sead::Heap* getHeapOrCurrentHeap(sead::Heap* heap);
} // namespace ksys::util