lzw-assignment/src/common.cc

45 lines
1.9 KiB
C++
Raw Normal View History

2018-04-05 16:47:07 +00:00
/**
* \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>;
2018-04-05 16:47:07 +00:00
/**
* 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/uint32_t, la valeur booléene indiquant si une nouvelle fut
* ajoutée dans le dictionnaire ou non, et le uint32_t indiquant la valeur
2018-04-05 16:47:07 +00:00
* numérique de la chaîne dans le dictionnaire.
*
2018-04-29 12:13:14 +00:00
* \param t_dictionary Dictionnaire
* \param t_nr_chaine Numéro de la chaine précédant le caractères \p t_c dans \p t_dictionary
* \param t_c Caractère suivant la chaine de caractères \p t_nr_chaine
* \return const std::pair<bool, uint32_t>
2018-04-05 16:47:07 +00:00
*/
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) {
2018-05-23 14:27:54 +00:00
if (t_nr_chaine == 0xFFFF) {
2018-04-05 16:47:07 +00:00
return std::make_pair(true, t_c);
2018-05-23 14:27:54 +00:00
}
2018-04-05 16:47:07 +00:00
auto &e = t_dictionary[std::make_pair(t_nr_chaine, t_c)];
2018-05-23 14:27:54 +00:00
return (e != 0) ? std::make_pair(true, e)
2018-04-05 16:47:07 +00:00
: std::make_pair(
false,
(e = static_cast<
typename std::remove_reference<decltype(e)>::type>(
t_dictionary.size()) +
255));
}