SpaghettiKart
Loading...
Searching...
No Matches
Registry.h
Go to the documentation of this file.
1#pragma once
2
3#include <libultraship.h>
4#include <string>
5#include <unordered_map>
6#include <functional>
7#include <set>
8
9struct TrackInfo {
10 uint32_t Id;
11 std::string Path; // Path to the custom track
12 std::string ResourceName;
13 std::string Name;
14 std::string DebugName;
15 std::string Length;
16 const char* MinimapTexture;
17 // std::string PreviewTexture;
18};
19
20struct ActorInfo {
21 uint32_t Id;
22 std::string ResourceName;
23 std::string Name;
24 std::set<std::string> Tags; // Category for filtering
25};
26
27struct ItemInfo {
28 uint32_t Id;
29 std::string ResourceName;
30 std::string Name;
31};
32
57
58template<typename TInfo, typename... TArgs>
59// ^ Scary template key word
60class Registry {
61public:
69 using Callback = std::function<void(TArgs...)>;
70
71 void Add(TInfo& info, Callback func) {
72 info.Id = mCounter++;
73 // Needs to allow overwriting to support mod hot-reloading
74 mMap[info.ResourceName] = Entry{info, std::move(func)};
75 }
76
77 const TInfo* GetInfo(const std::string& resourceName) const {
78 auto it = mMap.find(resourceName);
79 return (it != mMap.end()) ? &it->second.Info : nullptr;
80 }
81
82 void Invoke(const std::string& resourceName, TArgs... args) {
83 auto it = mMap.find(resourceName);
84 if (it != mMap.end() && it->second.Func) {
85 // Using C++ variadic template expansion to call the function
86 printf("[Registry] Invoking %s\n", resourceName.c_str());
87 it->second.Func(std::forward<TArgs>(args)...);
88 } else {
89 printf("[Registry] Error: %s not found or function is null.\n", resourceName.c_str());
90 }
91 }
92
93 bool Find(const std::string& resourceName) const {
94 return mMap.find(resourceName) != mMap.end();
95 }
96
97 size_t Size() {
98 return mMap.size();
99 }
100
101 std::vector<const TInfo*> GetAllInfo() const {
102 std::vector<const TInfo*> list;
103 list.reserve(mMap.size());
104 for (auto& pair : mMap) {
105 list.push_back(&pair.second.Info);
106 }
107 return list;
108 }
109
110 // Returns true if item succesfully removed
111 // Note that mCounter is not decremented on remove
112 bool Remove(const std::string& resourceName) {
113 auto it = mMap.find(resourceName);
114 if (it != mMap.end()) {
115 mMap.erase(it);
116 return true;
117 }
118 return false;
119 }
120
121 void Clear() {
122 mMap.clear();
123 mCounter = 0;
124 }
125
126private:
127 int32_t mCounter;
128 struct Entry {
129 TInfo Info;
131 };
132
133 // key: str, value: lambda function
134 std::unordered_map<std::string, Registry::Entry> mMap;
135};
Definition Registry.h:60
size_t Size()
Definition Registry.h:97
std::vector< const TInfo * > GetAllInfo() const
Definition Registry.h:101
bool Remove(const std::string &resourceName)
Definition Registry.h:112
int32_t mCounter
Definition Registry.h:127
const TInfo * GetInfo(const std::string &resourceName) const
Definition Registry.h:77
void Add(TInfo &info, Callback func)
Definition Registry.h:71
std::unordered_map< std::string, Registry::Entry > mMap
Definition Registry.h:134
bool Find(const std::string &resourceName) const
Definition Registry.h:93
void Clear()
Definition Registry.h:121
void Invoke(const std::string &resourceName, TArgs... args)
Definition Registry.h:82
std::function< void(TArgs...)> Callback
Definition Registry.h:69
Definition Registry.h:20
std::string Name
Definition Registry.h:23
std::set< std::string > Tags
Definition Registry.h:24
uint32_t Id
Definition Registry.h:21
std::string ResourceName
Definition Registry.h:22
Definition Registry.h:27
std::string Name
Definition Registry.h:30
std::string ResourceName
Definition Registry.h:29
uint32_t Id
Definition Registry.h:28
Definition Registry.h:128
Callback Func
Definition Registry.h:130
TInfo Info
Definition Registry.h:129
Definition Registry.h:9
std::string Name
Definition Registry.h:13
const char * MinimapTexture
Definition Registry.h:16
std::string DebugName
Definition Registry.h:14
std::string ResourceName
Definition Registry.h:12
std::string Path
Definition Registry.h:11
std::string Length
Definition Registry.h:15
uint32_t Id
Definition Registry.h:10