symbol_distribution::symbol_distribution(const symbol &s)
: total_frequencies(1) {
	for (int i = 0; i < ARITHMETIC_SYMBOL_COUNT; i++) {
		frequencies[i] = 0u;
	}
	frequencies[s.get_sequential_code()] = 1u;
}
double symbol_distribution::get_accumulated_probability(const symbol &s) const {
	double result = 0.0;
	for (unsigned int i = 0; i < s.get_sequential_code(); i++) {
		result +=
				static_cast<double>(frequencies[i]) /
				static_cast<double>(total_frequencies);
	}
	return result;
}
unsigned int symbol_distribution::get_emissions(const symbol &s) const {
	return frequencies[s.get_sequential_code()];
}
bool symbol_distribution::has_only_the_symbol(const symbol &s) const {
	return frequencies[s.get_sequential_code()] == 1 && total_frequencies == 1;
}
double symbol_distribution::get_probability_of(const symbol &s) const {
	int index = s.get_sequential_code();
	return
		static_cast<double>(frequencies[index]) /
		static_cast<double>(total_frequencies);
}
bool symbol_distribution::has_symbol(const symbol &s) const {
	return 0 != frequencies[s.get_sequential_code()];
}
void symbol_distribution::register_symbol_emision(const symbol &s) {
	frequencies[s.get_sequential_code()]++;
	total_frequencies++;
}