Huffman Zipper  v-1.0
Data Compression and Decompression using Greedy Huffman Algorithm
Compressor.h
Go to the documentation of this file.
1 #pragma once
2 #include <iostream>
3 #include <iomanip>
4 #include <stdexcept>
5 #include <fstream>
6 #include <string>
7 #include <chrono>
8 #include <filesystem>
9 #include <initializer_list>
10 
11 #include "BinNode.h"
12 #include "HashMap.h"
13 #include "PriorityQueue.h"
14 #include "Constants.h"
15 
16 namespace fs = std::filesystem;
17 
24 class Compressor {
25 private:
28 
31 
34 
36  std::vector<fs::path> inputFiles;
37 
39  std::ifstream infile;
40 
41 private:
48 
59  void generateHuffmanCode(BinNode* rootNode, std::string codeString);
60 
62  void clear();
63 
65  void deleteTree(BinNode* node);
66 
70  void readFrequency();
71 
72 
76  void scanFile(const fs::path& infilePath);
77 
86  void writeTree(std::ofstream& writer, BinNode* head);
87 
95  void writeHeader(const std::string& inputName, std::ofstream& writer);
96 
105  void writeBody(char& chr, int& bufferSize, const std::string& infileName, std::ofstream& writer);
106 
112  fs::path writeIntoFile(const std::string& infileName);
113 
117  void compress(const std::string& infileName);
118 
119 public:
120  Compressor();
121  ~Compressor();
122 
128  void compressFile(const std::string& infileName);
129 
135  void compressFolder(const std::string& directoryName);
136 
142  void compressFiles(std::initializer_list<std::string> infileNames);
143 };
This file exports the constants used in throughout the project.
This class models a node structure used for building Huffman Binary Tree.
Definition: BinNode.h:9
This class compresses files and folders using Huffman Compression Algorithm.
Definition: Compressor.h:24
void deleteTree(BinNode *node)
Frees all heap storage associated with the Huffman Tree.
Definition: Compressor.cpp:9
fs::path writeIntoFile(const std::string &infileName)
Write the header and body section to compressed file.
Definition: Compressor.cpp:124
void compressFolder(const std::string &directoryName)
Compresses a directory and its entire content recursively.
Definition: Compressor.cpp:213
BinNode * rootNode
Root node for Huffman tree.
Definition: Compressor.h:33
void clear()
Resets all the attributes for next compression operation.
Definition: Compressor.cpp:18
void readFrequency()
Reads entire input file and finds frequency of each unique characters.
Definition: Compressor.cpp:55
HashMap< char, std::string > codeMap
Prefix-free binary code for each value of the source symbol.
Definition: Compressor.h:30
void compressFile(const std::string &infileName)
Compresses a single input file.
Definition: Compressor.cpp:204
HashMap< char, int > frequency
Frequency of occurrence for each unique symbol in the source.
Definition: Compressor.h:27
void compress(const std::string &infileName)
Utility function to compress file.
Definition: Compressor.cpp:152
BinNode * createHuffmanTree()
Creates a Huffman Tree form unique characters along with their frequency of occurrences.
Definition: Compressor.cpp:27
void compressFiles(std::initializer_list< std::string > infileNames)
Compresses multiple source files into single compressed(.huf) file.
Definition: Compressor.cpp:226
void scanFile(const fs::path &infilePath)
Validates input file path and proceeds on reading frequency.
Definition: Compressor.cpp:62
void writeBody(char &chr, int &bufferSize, const std::string &infileName, std::ofstream &writer)
Write the body section to compressed file.
Definition: Compressor.cpp:104
std::ifstream infile
Instance of ifstream class for reading characters from source.
Definition: Compressor.h:39
std::vector< fs::path > inputFiles
List of input files given by the user.
Definition: Compressor.h:36
void writeHeader(const std::string &inputName, std::ofstream &writer)
Write the header section to compressed file.
Definition: Compressor.cpp:81
void writeTree(std::ofstream &writer, BinNode *head)
Write the entire Huffman tree in to the file header section using a pre-order traversal algorithm.
Definition: Compressor.cpp:70
void generateHuffmanCode(BinNode *rootNode, std::string codeString)
Generates prefix code for each unique characters in the source.
Definition: Compressor.cpp:44