lzw-assignment/src/common.cc
2018-04-10 11:25:11 +02:00

44 lines
1.9 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* \file common.cc
* \brief Implementation for functions in common
*/
#include "common.hh"
using uint8_t = std::uint8_t;
using uint32_t = std::uint32_t;
using dic_t = std::map<std::pair<uint32_t, uint8_t>, uint32_t>;
/**
* Cette fonction a pour double usage la recherche dune chaine de caractères
* dans le dictionnaire, ou bien lajout dune nouvelle chaîne si celle-ci nest
* pas déjà présente. Une chaine de caractères est représentée par un couple
* numéro de chaine / caractère, le numéro de chaine renvoyant au caractère
* précédent (soit son code ASCII, soit son indice dans le dictionnaire) et le
* caractère se référant au dernier caractère de la chaine courante. Si le
* numéro de chaine est -1, alors il sagit du premier caractère de la chaine,
* et la valeur renvoyée sera la valeur ASCII du caractère. La fonction renvoie
* une paire bool/uint16_t, la valeur booléene indiquant si une nouvelle fut
* ajoutée dans le dictionnaire ou non, et le uint16_t indiquant la valeur
* numérique de la chaîne dans le dictionnaire.
*
* \param dictionary Dictionnaire
* \param nr_chaine Numéro de la chaine précédant le caractères \p c dans \p dictionary
* \param c Caractère suivant la chaine de caractères \p nr_chaine
* \return std::pair<bool, uint16_t>
*/
const std::pair<bool, uint32_t>
dico(std::map<std::pair<uint32_t, uint8_t>, uint32_t> &t_dictionary,
uint32_t t_nr_chaine, uint8_t t_c) {
if (t_nr_chaine == 0xFFFFFFFF)
return std::make_pair(true, t_c);
auto &e = t_dictionary[std::make_pair(t_nr_chaine, t_c)];
return (e) ? std::make_pair(true, e)
: std::make_pair(
false,
(e = static_cast<
typename std::remove_reference<decltype(e)>::type>(
t_dictionary.size()) +
255));
}