#include #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); }