diff options
Diffstat (limited to 'NodeFactory.cpp')
-rw-r--r-- | NodeFactory.cpp | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/NodeFactory.cpp b/NodeFactory.cpp new file mode 100644 index 0000000..c9d4f20 --- /dev/null +++ b/NodeFactory.cpp @@ -0,0 +1,48 @@ +#include <locale> +#include <ranges> +#include <algorithm> + +#include "NodeFactory.h" + +string NodeFactory::normalize_type(string type) { + std::ranges::transform(type, type.begin(), [] (unsigned char c) { return std::tolower(c); }); + return type; +} + +bool NodeFactory::has_type(const char * type) { + return has_type(string(type)); +} + +bool NodeFactory::has_type(string type) { + return find_type(type) != nullptr; +} + +void NodeFactory::assign(const char * _type, const Node * node) { + static NodeFactoryMap & map = get_map(); + string type = _type; + type = normalize_type(type); + + if (has_type(type)) return; // TODO: exception? + + // printf("map[\"%s\"] = %p\n", type.c_str(), node); + map[type] = node; +} + +NodeFactoryMap & NodeFactory::get_map() { + static NodeFactoryMap map; + return map; +} + +const Node * NodeFactory::find_type(string type) { + static NodeFactoryMap & map = get_map(); + type = normalize_type(type); + if (!map.contains(type)) return nullptr; + return map.find(type)->second; +} + +Node * NodeFactory::create(string type) { + const Node * prototype = find_type(type); + if (prototype == nullptr) return nullptr; + return prototype->clone(); +} + |