Documenting and optimization

This commit is contained in:
Phuntsok Drak-pa 2018-04-29 14:13:14 +02:00
parent aaf8c09319
commit e0b869a844
4 changed files with 31 additions and 28 deletions

View File

@ -22,10 +22,10 @@ using dic_t = std::map<std::pair<uint32_t, uint8_t>, uint32_t>;
* ajoutée dans le dictionnaire ou non, et le uint32_t indiquant la valeur * ajoutée dans le dictionnaire ou non, et le uint32_t indiquant la valeur
* numérique de la chaîne dans le dictionnaire. * numérique de la chaîne dans le dictionnaire.
* *
* \param dictionary Dictionnaire * \param t_dictionary Dictionnaire
* \param nr_chaine Numéro de la chaine précédant le caractères \p c dans \p dictionary * \param t_nr_chaine Numéro de la chaine précédant le caractères \p t_c dans \p t_dictionary
* \param c Caractère suivant la chaine de caractères \p nr_chaine * \param t_c Caractère suivant la chaine de caractères \p t_nr_chaine
* \return std::pair<bool, uint32_t> * \return const std::pair<bool, uint32_t>
*/ */
const std::pair<bool, uint32_t> const std::pair<bool, uint32_t>
dico(std::map<std::pair<uint32_t, uint8_t>, uint32_t> &t_dictionary, dico(std::map<std::pair<uint32_t, uint8_t>, uint32_t> &t_dictionary,

View File

@ -9,19 +9,21 @@
#include <cstdlib> #include <cstdlib>
#include <fstream> #include <fstream>
#include <iostream> #include <iostream>
#include <thread>
#ifdef Debug
constexpr bool debug_mode = true;
#else
constexpr bool debug_mode = false;
#endif
using dict_t = std::map<std::pair<uint32_t, uint8_t>, uint32_t>; using dict_t = std::map<std::pair<uint32_t, uint8_t>, uint32_t>;
using ustring = std::basic_string<uint8_t>; // chaîne non encodée using ustring = std::basic_string<uint8_t>; // chaîne non encodée
using uvec = std::vector<uint32_t>; // chaîne encodée using uvec = std::vector<uint32_t>; // chaîne encodée
using std::printf; using std::printf;
/**
*
* Reçoit une liste de paires std::thread/vecteurs, le premier étant le
* processus dont sa sortie est stockée dans le second. La sortie, une liste
* de caractères uint32_t, est écrite dans le fichier de sortie \p out.
*
* \param[in] t_threads
* \param[out] t_out
*/
void join_and_write( void join_and_write(
std::vector<std::pair<std::unique_ptr<std::thread>, uvec>> &t_threads, std::vector<std::pair<std::unique_ptr<std::thread>, uvec>> &t_threads,
FILE *t_out) { FILE *t_out) {
@ -43,8 +45,8 @@ void join_and_write(
* de caractères UTF-8 représentant des mots de chars compressés. La fonction * de caractères UTF-8 représentant des mots de chars compressés. La fonction
* renvoie ledit vecteur de uint32_t via le paramètre \p t_res. * renvoie ledit vecteur de uint32_t via le paramètre \p t_res.
* *
* \param[in] t_text Chaîne de caractères uint8_t représentant le fichier * \param[in] t_text Chaîne de caractères uint8_t représentant le fichier d'entrée
* d'entrée \param[out] t_res Chaîne de caractères de sortie * \param[out] t_res Chaîne de caractères de sortie
*/ */
void lzw_compress(const std::vector<char> &t_text, uvec &t_res) { void lzw_compress(const std::vector<char> &t_text, uvec &t_res) {
dict_t dictionary{}; dict_t dictionary{};
@ -69,15 +71,13 @@ void lzw_compress(const std::vector<char> &t_text, uvec &t_res) {
} }
/** /**
* \brief function description
*
* Wrapper de la fonction \ref lzw_compress gérant l'ouverture, la lecture, * Wrapper de la fonction \ref lzw_compress gérant l'ouverture, la lecture,
* l'écriture et la fermeture des fichiers dentrée et de sortie. Si \p * l'écriture et la fermeture des fichiers dentrée et de sortie. Si \p
* t_out_file est nul (chemin non spécifié), il prendra alors la valeur de * t_out_file est nul (chemin non spécifié), il prendra alors la valeur de
* \p t_in_file à laquelle sera annexé lextension `.lzw`. * \p t_in_file à laquelle sera annexé lextension `.lzw`.
* *
* \param t_in_file Chemin vers le fichier dentrée * \param[in] t_in_file Chemin vers le fichier dentrée
* \param t_out_file Chemin vers le fichier de sortie * \param[in] t_out_file Chemin vers le fichier de sortie
*/ */
void compress(const std::string &t_in_file, const char *t_out_file) { void compress(const std::string &t_in_file, const char *t_out_file) {
// Fichier dentrée // Fichier dentrée
@ -90,12 +90,11 @@ void compress(const std::string &t_in_file, const char *t_out_file) {
} }
// Fichier de sortie // Fichier de sortie
const char *filename = (t_out_file) ? t_out_file : "output.lzw"; FILE *out =
FILE *out = fopen(filename, "wb"); (t_out_file) ? fopen(t_out_file, "wb") : fopen("output.lzw", "wb");
if (!out) { if (!out) {
std::cerr << "Error at " << __FILE__ << ":" << __LINE__ - 4 std::cerr << "Error at " << __FILE__ << ":" << __LINE__ - 4
<< ": could not open output file \"" << filename << ": could not open output file. Aborting...\n";
<< "\". Aborting...\n";
input_file.close(); input_file.close();
exit(1); exit(1);
} }
@ -108,8 +107,8 @@ void compress(const std::string &t_in_file, const char *t_out_file) {
while (input_file.read(chunk.data(), while (input_file.read(chunk.data(),
static_cast<std::streamsize>(chunk.size()))) { static_cast<std::streamsize>(chunk.size()))) {
threads.emplace_back(nullptr, uvec{}); threads.emplace_back(nullptr, uvec{});
threads.back().first = std::unique_ptr<std::thread>( threads.back().first = std::make_unique<std::thread>(
new std::thread{lzw_compress, chunk, ref(threads.back().second)}); std::thread{lzw_compress, chunk, ref(threads.back().second)});
assert(threads.back().first); assert(threads.back().first);
if (threads.size() >= 8) { if (threads.size() >= 8) {
join_and_write(threads, out); join_and_write(threads, out);
@ -135,9 +134,6 @@ void compress(const std::string &t_in_file, const char *t_out_file) {
uvec ret{}; uvec ret{};
lzw_compress(chunk, ret); lzw_compress(chunk, ret);
for (const auto c : ret) { for (const auto c : ret) {
if constexpr (debug_mode) {
printf("%c\t", c);
}
write_utf8(out, c); write_utf8(out, c);
} }
} }

View File

@ -9,6 +9,13 @@
#include "common.hh" #include "common.hh"
#include <vector> #include <vector>
#include <iostream> #include <iostream>
#include <thread>
/// \brief Exécution des threads et écriture de leur résultat dans le fichier de sortie
void join_and_write(
std::vector<std::pair<std::unique_ptr<std::thread>, std::vector<uint32_t>>>
&,
FILE *);
/// \brief Compression d'une chaine de caractères /// \brief Compression d'une chaine de caractères
void lzw_compress(const std::vector<char> &, std::vector<std::uint32_t> &); void lzw_compress(const std::vector<char> &, std::vector<std::uint32_t> &);

View File

@ -15,8 +15,8 @@ using ustring = std::basic_string<uint8_t>; // chaine non encodée
* Les caractères \c passés en argument sont écrit dans le fichier de sortie au * Les caractères \c passés en argument sont écrit dans le fichier de sortie au
* format UTF-8 * format UTF-8
* *
* \param out Fichier de sortie * \param[in] out Fichier de sortie
* \param c Caractères à écrire dans \p out * \param[in] c Caractères à écrire dans \p out
*/ */
void write_utf8(FILE* t_out, uint32_t t_c) { void write_utf8(FILE* t_out, uint32_t t_c) {
if(t_c < 128) { if(t_c < 128) {