From 9f70b01886d9d98a74c92bccff077b58eb99d67b Mon Sep 17 00:00:00 2001 From: Phuntsok Drak-pa Date: Sat, 9 Jun 2018 23:11:27 +0200 Subject: [PATCH] Moved ipow function --- src/bitpack.cc | 20 +++----------------- src/common.cc | 15 +++++++++++++++ src/common.hh | 2 ++ src/compress.cc | 18 ++---------------- 4 files changed, 22 insertions(+), 33 deletions(-) diff --git a/src/bitpack.cc b/src/bitpack.cc index 8e57eb6..cae8177 100644 --- a/src/bitpack.cc +++ b/src/bitpack.cc @@ -1,4 +1,5 @@ #include "bitpack.hh" +#include "common.hh" #include #include @@ -8,28 +9,13 @@ using uchar = unsigned char; using vuint16 = vector; using vuchar = vector; -constexpr int ipow(int base, int exp) { - int result = 1; - for (;;) { - if (exp & 1) { - result *= base; - } - exp >>= 1; - if (exp == 0) { - break; - } - base *= base; - } - return result; -} - /////////////////////////////////////////////////////////////////////////////// // packing // /////////////////////////////////////////////////////////////////////////////// [[nodiscard]] vuchar pack(const vuint16 &t_input) { vuchar ret{}; - constexpr int max_value = ipow(2, 8); + const int max_value = ipow(2, 8); for (auto it = t_input.begin(); it != t_input.end(); ++it) { if (*it >= max_value) { const auto next_vec = @@ -125,7 +111,7 @@ constexpr int ipow(int base, int exp) { [[nodiscard]] vuint16 unpack(const vuchar &t_input) { vuint16 ret{}; - constexpr int max_value = ipow(2, 8) - 1; + const int max_value = ipow(2, 8) - 1; // begin with 8bits for (auto it = t_input.begin(); it != t_input.end(); ++it) { diff --git a/src/common.cc b/src/common.cc index 430d8ea..542ceb2 100644 --- a/src/common.cc +++ b/src/common.cc @@ -11,6 +11,21 @@ using dic_comp_t = std::map, uint16_t>; using dic_un_t = std::map>>; using ustring = std::basic_string; +int ipow(int base, int exp) { + int result = 1; + for (;;) { + if (exp & 1) { + result *= base; + } + exp >>= 1; + if (exp == 0) { + break; + } + base *= base; + } + return result; +} + /** * Cette fonction a pour double usage la recherche d’une chaine de caractères * dans le dictionnaire, ou bien l’ajout d’une nouvelle chaîne si celle-ci n’est diff --git a/src/common.hh b/src/common.hh index 0d592c9..4c3a9ac 100644 --- a/src/common.hh +++ b/src/common.hh @@ -10,6 +10,8 @@ #include #include +int ipow(int, int); + /// \brief Recherche ou ajout de chaine dans le dictionnaire std::pair dico(std::map, std::uint16_t> &, diff --git a/src/compress.cc b/src/compress.cc index 26bef85..a8ea9cf 100644 --- a/src/compress.cc +++ b/src/compress.cc @@ -5,6 +5,7 @@ #include "compress.hh" #include "io.hh" +#include "common.hh" #include #include #include @@ -19,22 +20,7 @@ using std::string; using dict_t = std::map, uint16_t>; using std::printf; -constexpr int ipow(int base, int exp) { - int result = 1; - for (;;) { - if (exp & 1) { - result *= base; - } - exp >>= 1; - if (exp == 0) { - break; - } - base *= base; - } - return result; -} - -constexpr size_t DICT_MAX = ipow(2, 13) - 256; /* 12 bits */ +const size_t DICT_MAX = static_cast(ipow(2, 17) - 256); /* 16 bits */ /** * La chaîne de caractères \p t_text est lue caractère par caractère, et est