Minecraft Community Edition 0.1.0
Loading...
Searching...
No Matches
FunctionContainer.hpp
1#pragma once
2#include "EASTL/initializer_list.h"
3#include "EASTL/string.h"
4#include "EASTL/any.h"
5#include "EASTL/unordered_map.h"
6#include "EASTL/functional.h"
7#include "..\IO\Logger.hpp"
8#include <source_location>
9
10namespace mce::core {
33 public:
37 FunctionContainer() = default;
38
47 FunctionContainer(QEventBus& qBus, std::initializer_list<std::pair<eastl::string, eastl::any>> initlist);
48
60 template<typename Functor>
61 void addFunction(const eastl::string& name, Functor functor);
62
78 template<typename Return, typename... Arguments>
79 Return callFunction(const eastl::string& name, Arguments&&... args);
80
87 bool findFunction(const eastl::string& name);
88
102 template<typename Return, typename... Arguments>
103 eastl::function<Return(Arguments...)> operator[](const eastl::string& name);
104
116 template<typename Return, typename... Arguments>
117 eastl::function<Return(Arguments...)> getFunction(const eastl::string& name);
118 private:
120 eastl::unordered_map<eastl::string, eastl::any> functions;
121 QEventBus& qBus;
122 };
123
124 // Template implementations
130 template<typename Functor>
131 inline void FunctionContainer::addFunction(const eastl::string& name, Functor functor) {
132 FunctionContainer::functions[name] = functor;
133 }
134
140 template<typename Return, typename ...Arguments>
141 inline Return FunctionContainer::callFunction(const eastl::string& name, Arguments && ...args) {
142 if (FunctionContainer::functions.find(name) != FunctionContainer::functions.end()) {
143 auto& func = FunctionContainer::functions[name];
144 auto castedFunc = eastl::any_cast<eastl::function<Return(Arguments...)>>(func);
145 return castedFunc(eastl::forward<Arguments>(args)...);
146 }
147 else {
148 MCE_ERROR("Function \"{}\" not found! File:", name);
149 }
150 }
151
157 template<typename Return, typename ...Arguments>
158 inline eastl::function<Return(Arguments...)> FunctionContainer::operator[](const eastl::string& name) {
159 if (FunctionContainer::functions.find(name) != FunctionContainer::functions.end()) {
160 return eastl::any_cast<eastl::function<Return(Arguments...)>>(FunctionContainer::functions[name]);
161 }
162 else {
163 MCE_ERROR("Function \"{}\" not found! File:", name);
164 return nullptr;
165 }
166 }
167
173 template<typename Return, typename ...Arguments>
174 inline eastl::function<Return(Arguments...)> FunctionContainer::getFunction(const eastl::string& name) {
175 if (FunctionContainer::functions.find(name) != FunctionContainer::functions.end()) {
176 return eastl::any_cast<eastl::function<Return(Arguments...)>>(FunctionContainer::functions[name]);
177 }
178 else {
179 MCE_ERROR("Function \"{}\" not found! File:", name);
180 return nullptr;
181 }
182 }
183}
bool findFunction(const eastl::string &name)
Check whether a function with the given name exists in the container.
Definition FunctionContainer.cpp:10
eastl::function< Return(Arguments...)> getFunction(const eastl::string &name)
Retrieve a stored function as an eastl::function.
Definition FunctionContainer.hpp:174
eastl::function< Return(Arguments...)> operator[](const eastl::string &name)
Retrieve a stored function as an eastl::function via operator[].
Definition FunctionContainer.hpp:158
Return callFunction(const eastl::string &name, Arguments &&... args)
Call a stored function by name with the provided arguments.
Definition FunctionContainer.hpp:141
void addFunction(const eastl::string &name, Functor functor)
Add a function to the container.
Definition FunctionContainer.hpp:131
FunctionContainer()=default
Default constructor.
Thread-safe event bus.
Definition QEventBus.hpp:58