aboutsummaryrefslogtreecommitdiff
path: root/Parser.cpp
blob: 4597a764a4dc1bd51949eaafa1cdec1312572281 (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(FileStrategy & 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);
}