aboutsummaryrefslogtreecommitdiff
path: root/ParserFactory.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'ParserFactory.cpp')
-rw-r--r--ParserFactory.cpp32
1 files changed, 32 insertions, 0 deletions
diff --git a/ParserFactory.cpp b/ParserFactory.cpp
new file mode 100644
index 0000000..49c4d00
--- /dev/null
+++ b/ParserFactory.cpp
@@ -0,0 +1,32 @@
+#include <algorithm>
+
+#include "ParserFactory.h"
+#include "Exception.h"
+
+void ParserFactory::parse(FileReader & file, MuseumDeserializer & deserializer) {
+ auto & col = ParserFactory::get_collection();
+ if (col.size() < 1)
+ throw Exception("no parsers registered");
+
+ unsigned int best_score = 0;
+ Parser * best_strategy = nullptr;
+ for (Parser * strategy : col) {
+ unsigned int score = strategy->heuristic(file);
+ if (score <= best_score) continue;
+
+ best_score = score;
+ best_strategy = strategy;
+ }
+
+ if (best_strategy == nullptr)
+ throw Exception("unknown file type");
+
+ best_strategy->parse(file, deserializer);
+}
+
+void ParserFactory::register_strategy(Parser * ps) {
+ auto & col = ParserFactory::get_collection();
+ if (std::find(col.begin(), col.end(), ps) != col.end()) return;
+ col.push_back(ps);
+}
+