Merge branch 'master' of labs.phundrak.fr:phundrak/lzw-assignment
This commit is contained in:
commit
bbfb669781
@ -10,9 +10,9 @@ using vuint16 = vector<uint16_t>;
|
||||
using vuchar = vector<uchar>;
|
||||
using ustring = std::basic_string<unsigned char>;
|
||||
|
||||
int max(const int t_n) { return ipow(2, t_n) - 1; }
|
||||
[[nodiscard]] int max(const int t_n) { return ipow(2, t_n) - 1; }
|
||||
|
||||
constexpr uint16_t mask_n(int t_nb_bits) {
|
||||
[[nodiscard]] constexpr uint16_t mask_n(int t_nb_bits) {
|
||||
if (t_nb_bits == 0) {
|
||||
return 0;
|
||||
}
|
||||
@ -31,14 +31,14 @@ constexpr uint16_t masks[17] = {
|
||||
// packing //
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
vuchar pack(const vuint16 &t_input) {
|
||||
[[nodiscard]] vuchar pack(const vuint16 &t_input) {
|
||||
vuchar vec{};
|
||||
return pack_n(t_input.begin(), t_input.end(), vec, 9);
|
||||
}
|
||||
|
||||
vuchar pack_n(const vuint16::const_iterator t_input_begin,
|
||||
const vuint16::const_iterator t_input_end, vuchar &t_res,
|
||||
int t_n) {
|
||||
[[nodiscard]] vuchar pack_n(const vuint16::const_iterator t_input_begin,
|
||||
const vuint16::const_iterator t_input_end,
|
||||
vuchar &t_res, int t_n) {
|
||||
if (t_n == 16) {
|
||||
return pack_16(t_input_begin, t_input_end, t_res);
|
||||
}
|
||||
@ -107,8 +107,9 @@ vuchar pack_n(const vuint16::const_iterator t_input_begin,
|
||||
return t_res;
|
||||
}
|
||||
|
||||
vuchar pack_16(const vuint16::const_iterator t_input_begin,
|
||||
const vuint16::const_iterator t_input_end, vuchar &t_res) {
|
||||
[[nodiscard]] vuchar pack_16(const vuint16::const_iterator t_input_begin,
|
||||
const vuint16::const_iterator t_input_end,
|
||||
vuchar &t_res) {
|
||||
std::for_each(t_input_begin, t_input_end, [&t_res](const auto value) {
|
||||
t_res.push_back(static_cast<uchar>(value >> 8 & 0xFFU));
|
||||
t_res.push_back(static_cast<uchar>(value & 0xFFU));
|
||||
@ -120,13 +121,14 @@ vuchar pack_16(const vuint16::const_iterator t_input_begin,
|
||||
// unpacking //
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
vuint16 unpack(ustring &&t_input) {
|
||||
[[nodiscard]] vuint16 unpack(ustring &&t_input) {
|
||||
vuint16 vec{};
|
||||
return unpack_n(t_input.begin(), t_input.end(), vec, 9);
|
||||
}
|
||||
|
||||
vuint16 unpack_n(const ustring::const_iterator t_begin,
|
||||
const ustring::const_iterator t_end, vuint16 &t_res, int t_n) {
|
||||
[[nodiscard]] vuint16 unpack_n(const ustring::const_iterator t_begin,
|
||||
const ustring::const_iterator t_end,
|
||||
vuint16 &t_res, int t_n) {
|
||||
if (t_n == 16) {
|
||||
return unpack_16(t_begin, t_end, t_res);
|
||||
}
|
||||
@ -165,8 +167,9 @@ vuint16 unpack_n(const ustring::const_iterator t_begin,
|
||||
return t_res;
|
||||
}
|
||||
|
||||
vuint16 unpack_16(const ustring::const_iterator t_begin,
|
||||
const ustring::const_iterator t_end, vuint16 &t_res) {
|
||||
[[nodiscard]] vuint16 unpack_16(const ustring::const_iterator t_begin,
|
||||
const ustring::const_iterator t_end,
|
||||
vuint16 &t_res) {
|
||||
for (auto it = t_begin; it < t_end; ++it) {
|
||||
t_res.push_back(static_cast<uint16_t>(*it << 8 | *++it));
|
||||
}
|
||||
|
@ -5,24 +5,28 @@
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
std::vector<unsigned char> pack(const std::vector<std::uint16_t> &);
|
||||
[[nodiscard]] std::vector<unsigned char>
|
||||
pack(const std::vector<std::uint16_t> &);
|
||||
|
||||
std::vector<unsigned char> pack_n(std::vector<std::uint16_t>::const_iterator,
|
||||
std::vector<std::uint16_t>::const_iterator,
|
||||
std::vector<unsigned char> &, int);
|
||||
[[nodiscard]] std::vector<unsigned char>
|
||||
pack_n(std::vector<std::uint16_t>::const_iterator,
|
||||
std::vector<std::uint16_t>::const_iterator, std::vector<unsigned char> &,
|
||||
int);
|
||||
|
||||
std::vector<unsigned char> pack_16(std::vector<std::uint16_t>::const_iterator,
|
||||
[[nodiscard]] std::vector<unsigned char>
|
||||
pack_16(std::vector<std::uint16_t>::const_iterator,
|
||||
std::vector<std::uint16_t>::const_iterator,
|
||||
std::vector<unsigned char> &);
|
||||
|
||||
std::vector<std::uint16_t> unpack(std::basic_string<unsigned char> &&);
|
||||
[[nodiscard]] std::vector<std::uint16_t>
|
||||
unpack(std::basic_string<unsigned char> &&);
|
||||
|
||||
std::vector<std::uint16_t>
|
||||
[[nodiscard]] std::vector<std::uint16_t>
|
||||
unpack_n(std::basic_string<unsigned char>::const_iterator t_begin,
|
||||
std::basic_string<unsigned char>::const_iterator t_end,
|
||||
std::vector<std::uint16_t> &, int t_n);
|
||||
|
||||
std::vector<std::uint16_t>
|
||||
[[nodiscard]] std::vector<std::uint16_t>
|
||||
unpack_16(std::basic_string<unsigned char>::const_iterator,
|
||||
std::basic_string<unsigned char>::const_iterator,
|
||||
std::vector<std::uint16_t> &);
|
||||
|
@ -6,7 +6,7 @@ using dic_comp_t = std::map<std::pair<uint16_t, uint8_t>, uint16_t>;
|
||||
using ustring = std::basic_string<unsigned char>;
|
||||
using p_ustring = std::shared_ptr<ustring>;
|
||||
|
||||
int ipow(int base, int exp) {
|
||||
[[nodiscard]] int ipow(int base, int exp) {
|
||||
int result = 1;
|
||||
for (;;) {
|
||||
if (exp & 1) {
|
||||
@ -21,20 +21,21 @@ int ipow(int base, int exp) {
|
||||
return result;
|
||||
}
|
||||
|
||||
std::pair<bool, uint16_t> dico(dic_comp_t &t_dictionary,
|
||||
const uint16_t t_nr_chaine, const uint8_t t_c) {
|
||||
[[nodiscard]] std::pair<bool, uint16_t>
|
||||
dico(dic_comp_t &t_dictionary, const uint16_t t_nr_chaine, const uint8_t t_c) {
|
||||
if (t_nr_chaine == 0xFFFF) {
|
||||
return std::make_pair(true, t_c);
|
||||
}
|
||||
auto &e = t_dictionary[std::make_pair(t_nr_chaine, t_c)];
|
||||
if(e != 0)
|
||||
if (e != 0)
|
||||
return std::make_pair(true, e);
|
||||
e = static_cast<uint16_t>(t_dictionary.size() + 255);
|
||||
return std::make_pair(false, e);
|
||||
}
|
||||
|
||||
ustring dico_uncompress(std::map<uint16_t, ustring> &t_dict,
|
||||
const uint16_t t_code, const uint16_t t_old) {
|
||||
[[nodiscard]] ustring dico_uncompress(std::map<uint16_t, ustring> &t_dict,
|
||||
const uint16_t t_code,
|
||||
const uint16_t t_old) {
|
||||
// le code existe dans le dictionnaire s’il est < 256
|
||||
if (t_code < 256) {
|
||||
ustring e{static_cast<unsigned char>(t_code)};
|
||||
|
@ -5,13 +5,13 @@
|
||||
#include <map>
|
||||
#include <memory>
|
||||
|
||||
int ipow(int, int);
|
||||
[[nodiscard]] int ipow(int, int);
|
||||
|
||||
std::pair<bool, std::uint16_t>
|
||||
[[nodiscard]] std::pair<bool, std::uint16_t>
|
||||
dico(std::map<std::pair<std::uint16_t, std::uint8_t>, std::uint16_t> &,
|
||||
const std::uint16_t, const std::uint8_t);
|
||||
|
||||
std::basic_string<unsigned char>
|
||||
[[nodiscard]] std::basic_string<unsigned char>
|
||||
dico_uncompress(std::map<std::uint16_t, std::basic_string<unsigned char>> &,
|
||||
const std::uint16_t, const std::uint16_t);
|
||||
|
||||
|
@ -17,7 +17,7 @@ using ustring = std::basic_string<unsigned char>;
|
||||
using dict_t = std::map<std::pair<uint16_t, uint8_t>, uint16_t>;
|
||||
using std::printf;
|
||||
|
||||
ustring read_file(const string &filename) {
|
||||
[[nodiscard]] ustring read_file(const string &filename) {
|
||||
std::ifstream file{filename, ios::binary};
|
||||
assert(file);
|
||||
file.unsetf(ios::skipws);
|
||||
@ -32,7 +32,7 @@ ustring read_file(const string &filename) {
|
||||
return res;
|
||||
}
|
||||
|
||||
vvuint16 lzw_compress(ustring &&t_text) {
|
||||
[[nodiscard]] vvuint16 lzw_compress(ustring &&t_text) {
|
||||
vvuint16 res{};
|
||||
const auto DICT_MAX = static_cast<size_t>(ipow(2, 14) - 256); /* 16 bits */
|
||||
uint16_t w = 0xFFFF;
|
||||
|
@ -6,7 +6,7 @@
|
||||
#include <thread>
|
||||
#include <vector>
|
||||
|
||||
std::vector<std::vector<std::uint16_t>>
|
||||
[[nodiscard]] std::vector<std::vector<std::uint16_t>>
|
||||
lzw_compress(std::basic_string<unsigned char> &&);
|
||||
|
||||
void compress(const std::string &, const char *);
|
||||
|
@ -37,7 +37,8 @@ Options available:\n\
|
||||
\t\"_uncompresed\" will be added");
|
||||
}
|
||||
|
||||
std::tuple<string, string, bool> process_args(int t_argc, char *t_argv[]) {
|
||||
[[nodiscard]] std::tuple<string, string, bool> process_args(int t_argc,
|
||||
char *t_argv[]) {
|
||||
auto ret = std::make_tuple(string{}, string{}, true);
|
||||
while (true) {
|
||||
int option_index = 0;
|
||||
@ -82,7 +83,7 @@ std::tuple<string, string, bool> process_args(int t_argc, char *t_argv[]) {
|
||||
|
||||
int main(int argc, char *argv[]) {
|
||||
const auto [input_path, output_path, compressing] = process_args(argc, argv);
|
||||
if(input_path.empty()) {
|
||||
if (input_path.empty()) {
|
||||
help();
|
||||
return 0;
|
||||
}
|
||||
|
@ -16,7 +16,7 @@ using std::vector;
|
||||
using ustring = std::basic_string<unsigned char>;
|
||||
using vuint16 = vector<uint16_t>;
|
||||
|
||||
ustring lzw_uncompress(vuint16 &&t_compressed) {
|
||||
[[nodiscard]] ustring lzw_uncompress(vuint16 &&t_compressed) {
|
||||
ustring ret{};
|
||||
uint16_t old = 0;
|
||||
std::map<uint16_t, ustring> dict{};
|
||||
|
@ -6,10 +6,11 @@
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
std::basic_string<unsigned char> lzw_uncompress(std::vector<std::uint16_t> &&);
|
||||
[[nodiscard]] std::basic_string<unsigned char>
|
||||
lzw_uncompress(std::vector<std::uint16_t> &&);
|
||||
|
||||
void uncompress(const std::string &, const char *);
|
||||
|
||||
void uncompress_chunk(FILE *, std::ofstream&);
|
||||
void uncompress_chunk(FILE *, std::ofstream &);
|
||||
|
||||
#endif /* LZW_SRC_UNCOMPRESS_H_ */
|
||||
|
Loading…
Reference in New Issue
Block a user