blob: 83172167a0620a61e85b48f6eb2d0eb4a22452bf (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
#include <algorithm>
#include "Parser.h"
#include "Exception.h"
void Parser::parse(File & file, Deserializer & deserializer) {
auto & col = Parser::get_collection();
if (col.size() < 1)
throw Exception("no parsers registered");
unsigned int best_score = 0;
ParserStrategy * best_strategy = nullptr;
for (ParserStrategy * 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 Parser::register_strategy(ParserStrategy * ps) {
auto & col = Parser::get_collection();
if (std::find(col.begin(), col.end(), ps) != col.end()) return;
col.push_back(ps);
}
|