Mario Kart 64
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 int32_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 int32_t Id;
22 std::string ResourceName;
23 std::string Name;
24 std::set<std::string> Tags; // Category for filtering
25};
26
51
52template<typename TInfo, typename... TArgs>
53// ^ Scary template key word
54class Registry {
55public:
63 using Callback = std::function<void(TArgs...)>;
64
65 void Add(TInfo& info, Callback func) {
66 info.Id = mCounter++;
67 // Needs to allow overwriting to support mod hot-reloading
68 mMap[info.ResourceName] = Entry{info, std::move(func)};
69 }
70
71 const TInfo* GetInfo(const std::string& resourceName) const {
72 auto it = mMap.find(resourceName);
73 return (it != mMap.end()) ? &it->second.Info : nullptr;
74 }
75
76 void Invoke(const std::string& resourceName, TArgs... args) {
77 auto it = mMap.find(resourceName);
78 if (it != mMap.end() && it->second.Func) {
79 // Using C++ variadic template expansion to call the function
80 printf("[Registry] Invoking %s\n", resourceName.c_str());
81 it->second.Func(std::forward<TArgs>(args)...);
82 } else {
83 printf("[Registry] Error: %s not found or function is null.\n", resourceName.c_str());
84 }
85 }
86
87 bool Find(const std::string& resourceName) const {
88 return mMap.find(resourceName) != mMap.end();
89 }
90
91 std::vector<const TInfo*> GetAllInfo() const {
92 std::vector<const TInfo*> list;
93 list.reserve(mMap.size());
94 for (auto& pair : mMap) {
95 list.push_back(&pair.second.Info);
96 }
97 return list;
98 }
99
100 void Clear() {
101 mMap.clear();
102 mCounter = 0;
103 }
104
105private:
106 int32_t mCounter;
107 struct Entry {
108 TInfo Info;
110 };
111
112 // key: str, value: lambda function
113 std::unordered_map<std::string, Registry::Entry> mMap;
114};
Definition Registry.h:54
std::vector< const TInfo * > GetAllInfo() const
Definition Registry.h:91
int32_t mCounter
Definition Registry.h:106
const TInfo * GetInfo(const std::string &resourceName) const
Definition Registry.h:71
void Add(TInfo &info, Callback func)
Definition Registry.h:65
std::unordered_map< std::string, Registry::Entry > mMap
Definition Registry.h:113
bool Find(const std::string &resourceName) const
Definition Registry.h:87
void Clear()
Definition Registry.h:100
void Invoke(const std::string &resourceName, TArgs... args)
Definition Registry.h:76
std::function< void(TArgs...)> Callback
Definition Registry.h:63
Definition Registry.h:20
std::string Name
Definition Registry.h:23
std::set< std::string > Tags
Definition Registry.h:24
std::string ResourceName
Definition Registry.h:22
int32_t Id
Definition Registry.h:21
Definition Registry.h:107
Callback Func
Definition Registry.h:109
TInfo Info
Definition Registry.h:108
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
int32_t Id
Definition Registry.h:10