18#include <unordered_map>
38 std::function<std::string(
const std::string&)>
40 std::function<std::string(
const std::string&)>
42 std::function<std::vector<std::string>()>
59 using LookupTable = std::unordered_map<std::string, BaseClassData>;
74 static std::string
doc(
const std::string& baseClassName,
const std::string& derivedClassName)
76 return docTable().at(baseClassName).doc(derivedClassName);
86 static std::string
schema(
const std::string& baseClassName,
const std::string& derivedClassName)
89 return docTable().at(baseClassName).schema(derivedClassName);
98 static std::vector<std::string>
entries(
const std::string& baseClassName)
100 return docTable().at(baseClassName).entries();
121template<
class baseClass>
142 BaseClassData data = {baseClass::doc, baseClass::schema, baseClass::entries};
155template<
class baseClass>
167 std::function<std::string()>
doc;
172template<
typename... Args>
178template<
typename Base,
typename Params>
194template<
typename Base,
typename... Args>
201 using CreatorFunc = std::function<std::unique_ptr<Base>(Args...)>;
203 using ClassDocTable = std::unordered_map<std::string, DerivedClassDocumentation>;
211 static std::string
doc(
const std::string& derivedClassName)
214 return docTable().at(derivedClassName).doc();
223 static std::string
schema(
const std::string& derivedClassName)
226 return docTable().at(derivedClassName).schema();
239 std::vector<std::string> entries;
240 for (
const auto& it : table())
242 entries.push_back(it.first);
261 static std::unique_ptr<Base>
create(
const std::string& key, Args... args)
263 keyExistsOrError(key);
264 auto ptr = table().at(key)(std::forward<Args>(args)...);
276 const auto& tbl = table();
277 os << Base::name() <<
" " << tbl.size() << std::endl;
278 for (
const auto& it : tbl)
280 os <<
" - " << it.first << std::endl;
294 template<
class derivedClass>
304 static_assert((bool)®ISTERED);
319 CreatorFunc func = [](Args... args) -> std::unique_ptr<Base> {
320 return static_cast<std::unique_ptr<Base>
>(
new derivedClass(std::forward<Args>(args
323 RuntimeSelectionFactory::table()[derivedClass::name()] = func;
326 childData.
doc = []() -> std::string {
return derivedClass::doc(); };
327 childData.
schema = []() -> std::string {
return derivedClass::schema(); };
328 RuntimeSelectionFactory::docTable()[derivedClass::name()] = childData;
337 const auto& tbl = RuntimeSelectionFactory::table();
338 const auto it = tbl.find(derivedClass::name());
339 REGISTERED = (it != tbl.end());
352 static std::size_t
size() {
return table().size(); }
390 static void keyExistsOrError(
const std::string&
name)
392 const auto& tbl = table();
393 if (tbl.find(
name) == tbl.end())
395 auto msg = std::string {
" Could not find constructor for "} +
name +
"\n";
396 msg +=
"valid constructors are: \n";
397 for (
const auto& it : tbl)
399 msg +=
" - " + it.first +
"\n";
405 RuntimeSelectionFactory() =
default;
409template<
class Base,
class... Args>
410template<
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.
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.