16#include <unordered_map>
36 std::function<std::string(
const std::string&)>
38 std::function<std::string(
const std::string&)>
40 std::function<std::vector<std::string>()>
57 using LookupTable = std::unordered_map<std::string, BaseClassData>;
72 static std::string
doc(
const std::string& baseClassName,
const std::string& derivedClassName)
74 return docTable().at(baseClassName).doc(derivedClassName);
84 static std::string
schema(
const std::string& baseClassName,
const std::string& derivedClassName)
87 return docTable().at(baseClassName).schema(derivedClassName);
96 static std::vector<std::string>
entries(
const std::string& baseClassName)
98 return docTable().at(baseClassName).entries();
119template<
class baseClass>
140 BaseClassData data = {baseClass::doc, baseClass::schema, baseClass::entries};
153template<
class baseClass>
165 std::function<std::string()>
doc;
170template<
typename... Args>
176template<
typename Base,
typename Params>
192template<
typename Base,
typename... Args>
199 using CreatorFunc = std::function<std::unique_ptr<Base>(Args...)>;
201 using ClassDocTable = std::unordered_map<std::string, DerivedClassDocumentation>;
209 static std::string
doc(
const std::string& derivedClassName)
212 return docTable().at(derivedClassName).doc();
221 static std::string
schema(
const std::string& derivedClassName)
224 return docTable().at(derivedClassName).schema();
237 std::vector<std::string> entries;
238 for (
const auto& it : table())
240 entries.push_back(it.first);
259 static std::unique_ptr<Base>
create(
const std::string& key, Args... args)
261 keyExistsOrError(key);
262 auto ptr = table().at(key)(std::forward<Args>(args)...);
274 const auto& tbl = table();
275 os << Base::name() <<
" " << tbl.size() << std::endl;
276 for (
const auto& it : tbl)
278 os <<
" - " << it.first << std::endl;
292 template<
class derivedClass>
302 static_assert((bool)®ISTERED);
317 CreatorFunc func = [](Args... args) -> std::unique_ptr<Base> {
318 return static_cast<std::unique_ptr<Base>
>(
new derivedClass(std::forward<Args>(args
321 RuntimeSelectionFactory::table()[derivedClass::name()] = func;
324 childData.
doc = []() -> std::string {
return derivedClass::doc(); };
325 childData.
schema = []() -> std::string {
return derivedClass::schema(); };
326 RuntimeSelectionFactory::docTable()[derivedClass::name()] = childData;
335 const auto& tbl = RuntimeSelectionFactory::table();
336 const auto it = tbl.find(derivedClass::name());
337 REGISTERED = (it != tbl.end());
350 static std::size_t
size() {
return table().size(); }
388 static void keyExistsOrError(
const std::string&
name)
390 const auto& tbl = table();
391 if (tbl.find(
name) == tbl.end())
393 auto msg = std::string(
" Could not find constructor for ") +
name +
"\n";
394 msg +=
"valid constructors are: \n";
395 for (
const auto& it : tbl)
397 msg +=
" - " + it.first +
"\n";
403 RuntimeSelectionFactory() =
default;
407template<
class Base,
class... Args>
408template<
class derivedClass>
409bool RuntimeSelectionFactory<Base, Parameters<Args...>>::template
Register<
410 derivedClass>::REGISTERED =
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 std::vector< std::string > entries(const std::string &baseClassName)
static LookupTable & docTable()
static void registerClass(std::string name, BaseClassData data)
std::unordered_map< std::string, BaseClassData > LookupTable
static std::string schema(const std::string &baseClassName, const std::string &derivedClassName)
static std::string doc(const std::string &baseClassName, const std::string &derivedClassName)
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.
std::unordered_map< std::string, DerivedClassDocumentation > ClassDocTable
std::unordered_map< std::string, CreatorFunc > LookupTable
virtual ~RuntimeSelectionFactory()=default
static void print(std::ostream &os)
std::function< std::unique_ptr< Base >(Args...)> CreatorFunc
static LookupTable & table()
Returns the lookup table for runtime selection.
static ClassDocTable & docTable()
Returns the documentation table for runtime selection.
static std::string doc(const std::string &derivedClassName)
static std::string schema(const std::string &derivedClassName)
static std::vector< std::string > entries()
Get a vector of all entries in the runtime selection factory.
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 std::size_t size()
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 NeoFOAM::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.