blob: 071f70e330bb4f144c97b268a7559d976ce7e659 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
|
#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:
explicit EntryFactory(f32 size_multiplier = 1.0, u32 size_constant = 0)
: EntryFactoryBase(size_multiplier, size_constant) {}
u32 getResourceSize() const override { return sizeof(T); }
u32 getLoadDataAlignment() const override { return T::cLoadDataAlignment; }
sead::DirectResource* 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
|