aboutsummaryrefslogtreecommitdiff
path: root/NodeFactory.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'NodeFactory.cpp')
-rw-r--r--NodeFactory.cpp48
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();
+}
+