21#include <unordered_map>
39 std::function<std::string(
const std::string&)>
41 std::function<std::string(
const std::string&)>
43 std::function<std::vector<std::string>()>
60 using LookupTable = std::unordered_map<std::string, BaseClassData>;
75 static std::string
doc(
const std::string& baseClassName,
const std::string& derivedClassName)
77 return docTable().at(baseClassName).doc(derivedClassName);
87 static std::string
schema(
const std::string& baseClassName,
const std::string& derivedClassName)
90 return docTable().at(baseClassName).schema(derivedClassName);
99 static std::vector<std::string>
entries(
const std::string& baseClassName)
101 return docTable().at(baseClassName).entries();
122template<
class baseClass>
143 BaseClassData data = {baseClass::doc, baseClass::schema, baseClass::entries};
156template<
class baseClass>
168 std::function<std::string()>
doc;
173template<
typename... Args>
179template<
typename Base,
typename Params>
195template<
typename Base,
typename... Args>
202 using CreatorFunc = std::function<std::unique_ptr<Base>(Args...)>;
204 using ClassDocTable = std::unordered_map<std::string, DerivedClassDocumentation>;
212 static std::string
doc(
const std::string& derivedClassName)
215 return docTable().at(derivedClassName).doc();
224 static std::string
schema(
const std::string& derivedClassName)
227 return docTable().at(derivedClassName).schema();
240 auto k = table() | std::views::keys;
241 return {k.begin(), k.end()};
258 static std::unique_ptr<Base>
create(
const std::string& key, Args... args)
260 keyExistsOrError(key);
261 auto ptr = table().at(key)(std::forward<Args>(args)...);
273 const auto& tbl = table();
274 os << Base::name() <<
" " << tbl.size() << std::endl;
275 for (
const auto& it : tbl)
277 os <<
" - " << it.first << std::endl;
291 template<
class derivedClass>
301 static_assert((bool)®ISTERED);
316 CreatorFunc func = [](Args... args) -> std::unique_ptr<Base> {
317 return static_cast<std::unique_ptr<Base>
>(
new derivedClass(std::forward<Args>(args
320 RuntimeSelectionFactory::table()[derivedClass::name()] = func;
323 childData.
doc = []() -> std::string {
return derivedClass::doc(); };
324 childData.
schema = []() -> std::string {
return derivedClass::schema(); };
325 RuntimeSelectionFactory::docTable()[derivedClass::name()] = childData;
334 const auto& tbl = RuntimeSelectionFactory::table();
335 const auto it = tbl.find(derivedClass::name());
336 REGISTERED = (it != tbl.end());
349 static std::size_t
size() {
return table().size(); }
387 static void keyExistsOrError(
const std::string&
name)
389 const auto& tbl = table();
390 if (!tbl.contains(
name))
392 auto msg = std::string {
" Could not find constructor for "} +
name +
"\n";
393 msg +=
"valid constructors are: \n";
394 for (
const auto& it : tbl)
396 msg +=
" - " + it.first +
"\n";
402 RuntimeSelectionFactory() =
default;
406template<
class Base,
class... Args>
407template<
class derivedClass>
Represents the data for a base class.
std::function< std::string(const std::string &)> schema
std::function< std::string(const std::string &)> doc
std::function< std::vector< std::string >()> entries
Provides a mechanism for registering and retrieving documentation for base and derived classes.
static LookupTable & docTable()
static std::string schema(const std::string &baseClassName, const std::string &derivedClassName)
static std::string doc(const std::string &baseClassName, const std::string &derivedClassName)
static std::vector< std::string > entries(const std::string &baseClassName)
std::unordered_map< std::string, BaseClassData > LookupTable
static void registerClass(std::string name, BaseClassData data)
Class representing the documentation for a derived class.
std::function< std::string()> schema
std::function< std::string()> doc
static bool addSubType()
Adds the derived class as a sub type.
static std::string schema(const std::string &derivedClassName)
static void print(std::ostream &os)
static std::string doc(const std::string &derivedClassName)
static std::unique_ptr< Base > create(const std::string &key, Args... args)
Creates an instance of a derived class based on the provided key.
static LookupTable & table()
Returns the lookup table for runtime selection.
static std::size_t size()
std::function< std::unique_ptr< Base >(Args...)> CreatorFunc
virtual ~RuntimeSelectionFactory()=default
std::unordered_map< std::string, CreatorFunc > LookupTable
static std::vector< std::string > entries()
Get a vector of all entries in the runtime selection factory.
static ClassDocTable & docTable()
Returns the documentation table for runtime selection.
std::unordered_map< std::string, DerivedClassDocumentation > ClassDocTable
A factory class for runtime selection of derived classes.
A template class for registering derived classes with a base class.
#define NF_ERROR_EXIT(message)
Macro for printing an error message and aborting the program.
Integer types used throughout NeoN.
const std::string & name(const NeoN::Document &doc)
Retrieves the name of a Document.
Template struct for registering documentation of a base class.
static bool init()
Static function to initialize the registration of the class documentation.