std::string* Huffman::decompress(const std::vector<bool>* input) { encode = false; if(encoding == NULL || encoding->data == NULL || encoding->freqs == NULL) throw "no encoding set"; encoded = (void*)(new std::string()); LL* linkedlist = new LL(); unsigned int ll_size = 0; for(unsigned int i = 0; i < encoding->data->size(); i++) { linkedlist->insert(new Node(new char(encoding->data->at(i)), encoding->freqs->at(i))); ll_size++; } BinaryTree* bst = new BinaryTree(linkedlist, ll_size); Node* curr_node = bst->getFirst(); for(unsigned int i = 0; i < input->size() - overflow; i++) { if(!input->at(i)) { if(curr_node->left != NULL) curr_node = curr_node->left; }else if(input->at(i)) { if(curr_node->right != NULL) curr_node = curr_node->right; } if(curr_node->left == NULL && curr_node->right == NULL) { if(curr_node->character != NULL) { const char tmp[] = {*(curr_node->character), '\0'}; *((std::string*)encoded) += std::string(tmp); } curr_node = bst->getFirst(); } } delete linkedlist; delete bst; return (std::string*)encoded; }
std::vector<bool>* Huffman::compress(const char* input, const size_t& size) { encode = true; LL* linkedlist = new LL(); unsigned int ll_size = 0; for(unsigned int i = 0; i < size; i++) { int* freq = linkedlist->getFreq(input[i]); if(freq == NULL) { linkedlist->insert(new Node(new char(input[i]))); ll_size++; }else{ (*freq)++; } } // sort linked list // I will use bubblesort, because we will have not so many Node* t0; for(int j = ll_size - 1; j > 0; j--) { for(int i = 0; i < j; i++) { LL* ll_f = linkedlist->get(i); LL* ll_s = linkedlist->get(i+1); if(ll_f->tree->freq > ll_s->tree->freq) { t0 = ll_f->tree; ll_f->tree = ll_s->tree; ll_s->tree = t0; } } } BinaryTree* bst = new BinaryTree(linkedlist, ll_size); std::unordered_map<char, std::vector<bool> >* map = new std::unordered_map<char, std::vector<bool> >(); bst->generateMapping(map); encoded = (void*)(new std::vector<bool>()); for(unsigned int i = 0; i < size; i++) { std::vector<bool>::iterator iter = map->at(input[i]).begin(); while(iter != map->at(input[i]).end()) { ((std::vector<bool>*)encoded)->push_back(*iter); iter++; } } delete map; this->encoding = new Huffman::Encoding(); this->encoding->data = new std::vector<char>(); this->encoding->freqs = new std::vector<int>(); for(int i = ll_size - 1; i >= 0 ; i--) { this->encoding->data->push_back(*(linkedlist->get(i)->tree->character)); this->encoding->freqs->push_back(linkedlist->get(i)->tree->freq); } delete linkedlist; delete bst; return (std::vector<bool>*)encoded; }