1#pragma once
2
3#include <basis/seadTypes.h>
4
5#include "Library/Base/StringUtil.h"
6
7namespace al {
8template <typename T>
9struct NameToCreator {
10 const char* name;
11 T creationFunction;
12};
13
14template <typename T>
15class Factory {
16public:
17 inline Factory(const char* factoryName)
18 : mFactoryName(factoryName), mFactoryEntries(nullptr), mNumFactoryEntries(0) {}
19
20 template <s32 N>
21 inline Factory(const char* factoryName, const NameToCreator<T> (&entries)[N])
22 : mFactoryName(factoryName) {
23 initFactory(entries);
24 }
25
26 template <s32 N>
27 inline void initFactory(const NameToCreator<T> (&entries)[N]) {
28 mFactoryEntries = entries;
29 mNumFactoryEntries = N;
30 }
31
32 virtual const char* convertName(const char* name) const { return name; }
33
34 s32 getNumFactoryEntries() const { return mNumFactoryEntries; }
35
36 s32 getEntryIndex(T* creationPtr, const char* entryName) const {
37 const char* name = convertName(name: entryName);
38 s32 nFactoryEntries = mNumFactoryEntries;
39 const NameToCreator<T>* entries = mFactoryEntries;
40 for (s32 i = 0; i < nFactoryEntries; i++) {
41 if (isEqualString(name, entries[i].name)) {
42 *creationPtr = entries[i].creationFunction;
43 return i;
44 }
45 }
46 return -1;
47 }
48
49private:
50 const char* mFactoryName;
51 const NameToCreator<T>* mFactoryEntries;
52 s32 mNumFactoryEntries;
53};
54
55} // namespace al
56