1#ifndef SEAD_RESOURCE_H_
2#define SEAD_RESOURCE_H_
3
4#include <basis/seadNew.h>
5#include <basis/seadTypes.h>
6#include <container/seadTList.h>
7#include <heap/seadDisposer.h>
8#include <heap/seadHeap.h>
9#include <prim/seadBitFlag.h>
10#include <resource/seadDecompressor.h>
11#include <resource/seadResourceMgr.h>
12
13namespace sead
14{
15class Resource
16{
17public:
18 SEAD_RTTI_BASE(Resource)
19
20 Resource();
21 virtual ~Resource();
22};
23
24class DirectResource : public Resource
25{
26 SEAD_RTTI_OVERRIDE(DirectResource, Resource)
27
28public:
29 DirectResource();
30 ~DirectResource() override;
31
32 virtual s32 getLoadDataAlignment() const;
33 virtual void doCreate_(u8* buffer, u32 bufferSize, Heap* heap);
34
35 void create(u8* buffer, u32 bufferSize, u32 allocSize, bool allocated, Heap* heap);
36
37 u8* getRawData() const { return mRawData; }
38 u32 getRawSize() const { return mRawSize; }
39 u32 getBufferSize() const { return mBufferSize; }
40
41 static constexpr size_t cLoadDataAlignment = 4;
42
43protected:
44 u8* mRawData = 0;
45 u32 mRawSize = 0;
46 u32 mBufferSize = 0;
47 BitFlag32 mSettingFlag;
48};
49
50class ResourceFactory : public TListNode<ResourceFactory*>, public IDisposer
51{
52 SEAD_RTTI_BASE(ResourceFactory)
53public:
54 ResourceFactory() : TListNode<ResourceFactory*>(this), IDisposer(), mExt() {}
55
56 virtual ~ResourceFactory();
57
58 virtual Resource* tryCreate(const ResourceMgr::LoadArg& loadArg) = 0;
59 virtual Resource* tryCreateWithDecomp(const ResourceMgr::LoadArg& loadArg,
60 Decompressor* decompressor) = 0;
61 virtual Resource* create(const ResourceMgr::CreateArg& createArg) = 0;
62
63 const SafeString& getExt() const { return mExt; }
64 void setExt(const SafeString& ext) { mExt = ext; }
65
66protected:
67 FixedSafeString<32> mExt;
68};
69
70class DirectResourceFactoryBase : public ResourceFactory
71{
72 SEAD_RTTI_OVERRIDE(DirectResourceFactoryBase, ResourceFactory)
73public:
74 DirectResourceFactoryBase() : ResourceFactory() {}
75
76 ~DirectResourceFactoryBase() override {}
77
78 Resource* create(const ResourceMgr::CreateArg& createArg) override;
79 Resource* tryCreate(const ResourceMgr::LoadArg& loadArg) override;
80 Resource* tryCreateWithDecomp(const ResourceMgr::LoadArg& loadArg,
81 Decompressor* decompressor) override;
82 virtual DirectResource* newResource_(Heap* heap, s32 alignment) = 0;
83};
84
85template <typename T>
86class DirectResourceFactory : public DirectResourceFactoryBase
87{
88 SEAD_RTTI_OVERRIDE(DirectResourceFactory<T>, DirectResourceFactoryBase)
89public:
90 DirectResourceFactory() : DirectResourceFactoryBase() {}
91
92 ~DirectResourceFactory() override {}
93
94 DirectResource* newResource_(Heap* heap, s32 alignment) override
95 {
96 return new (heap, alignment) T;
97 }
98};
99
100} // namespace sead
101
102#endif // SEAD_RESOURCE_H_
103