Huffman Zipper  v-1.0
Data Compression and Decompression using Greedy Huffman Algorithm
Compressor Class Reference

This class compresses files and folders using Huffman Compression Algorithm. More...

#include <Compressor.h>

Public Member Functions

 Compressor ()
 
 ~Compressor ()
 
void compressFile (const std::string &infileName)
 Compresses a single input file. More...
 
void compressFolder (const std::string &directoryName)
 Compresses a directory and its entire content recursively. More...
 
void compressFiles (std::initializer_list< std::string > infileNames)
 Compresses multiple source files into single compressed(.huf) file. More...
 

Private Member Functions

BinNodecreateHuffmanTree ()
 Creates a Huffman Tree form unique characters along with their frequency of occurrences. More...
 
void generateHuffmanCode (BinNode *rootNode, std::string codeString)
 Generates prefix code for each unique characters in the source. More...
 
void clear ()
 Resets all the attributes for next compression operation. More...
 
void deleteTree (BinNode *node)
 Frees all heap storage associated with the Huffman Tree. More...
 
void readFrequency ()
 Reads entire input file and finds frequency of each unique characters. More...
 
void scanFile (const fs::path &infilePath)
 Validates input file path and proceeds on reading frequency. More...
 
void writeTree (std::ofstream &writer, BinNode *head)
 Write the entire Huffman tree in to the file header section using a pre-order traversal algorithm. More...
 
void writeHeader (const std::string &inputName, std::ofstream &writer)
 Write the header section to compressed file. More...
 
void writeBody (char &chr, int &bufferSize, const std::string &infileName, std::ofstream &writer)
 Write the body section to compressed file. More...
 
fs::path writeIntoFile (const std::string &infileName)
 Write the header and body section to compressed file. More...
 
void compress (const std::string &infileName)
 Utility function to compress file. More...
 

Private Attributes

HashMap< char, int > frequency
 Frequency of occurrence for each unique symbol in the source. More...
 
HashMap< char, std::string > codeMap
 Prefix-free binary code for each value of the source symbol. More...
 
BinNoderootNode
 Root node for Huffman tree. More...
 
std::vector< fs::path > inputFiles
 List of input files given by the user. More...
 
std::ifstream infile
 Instance of ifstream class for reading characters from source. More...
 

Detailed Description

This class compresses files and folders using Huffman Compression Algorithm.

It can compress single file or multiple files or an entire directory recursively into a compressed file (.huf file).

Definition at line 24 of file Compressor.h.

Constructor & Destructor Documentation

◆ Compressor()

Compressor::Compressor ( )

Definition at line 3 of file Compressor.cpp.

◆ ~Compressor()

Compressor::~Compressor ( )

Definition at line 5 of file Compressor.cpp.

Member Function Documentation

◆ clear()

void Compressor::clear ( )
private

Resets all the attributes for next compression operation.


Definition at line 18 of file Compressor.cpp.

◆ compress()

void Compressor::compress ( const std::string &  infileName)
private

Utility function to compress file.

Definition at line 152 of file Compressor.cpp.

◆ compressFile()

void Compressor::compressFile ( const std::string &  infileName)

Compresses a single input file.

Parameters
infileNamesource file path to be compressed.

Definition at line 204 of file Compressor.cpp.

◆ compressFiles()

void Compressor::compressFiles ( std::initializer_list< std::string >  infileNames)

Compresses multiple source files into single compressed(.huf) file.

Parameters
infileNameslist of source files to be compressed.

Definition at line 226 of file Compressor.cpp.

◆ compressFolder()

void Compressor::compressFolder ( const std::string &  directoryName)

Compresses a directory and its entire content recursively.

Parameters
directoryNamesource directory path to be compressed.

Definition at line 213 of file Compressor.cpp.

◆ createHuffmanTree()

BinNode * Compressor::createHuffmanTree ( )
private

Creates a Huffman Tree form unique characters along with their frequency of occurrences.

create the Huffman's tree out of frequency map

Returns
root node of the Huffman Tree.

Definition at line 27 of file Compressor.cpp.

◆ deleteTree()

void Compressor::deleteTree ( BinNode node)
private

Frees all heap storage associated with the Huffman Tree.


Definition at line 9 of file Compressor.cpp.

◆ generateHuffmanCode()

void Compressor::generateHuffmanCode ( BinNode rootNode,
std::string  codeString 
)
private

Generates prefix code for each unique characters in the source.

Parameters
rootNoderoot node of the Huffman Tree.
codeStringstring which is recursively populated with prefix code.

Create a CodeMap (Key/ Value pair) with character as key and its Huffman code as value by assigning each symbol with its path from root node to its node, with left being 0 and right being 1.

Definition at line 44 of file Compressor.cpp.

◆ readFrequency()

void Compressor::readFrequency ( )
private

Reads entire input file and finds frequency of each unique characters.

Populates HashMap<char, int> frequency.

Definition at line 55 of file Compressor.cpp.

◆ scanFile()

void Compressor::scanFile ( const fs::path &  infilePath)
private

Validates input file path and proceeds on reading frequency.

See also
readFrequency()

Definition at line 62 of file Compressor.cpp.

◆ writeBody()

void Compressor::writeBody ( char &  chr,
int &  bufferSize,
const std::string &  infileName,
std::ofstream &  writer 
)
private

Write the body section to compressed file.

Body section of compressed file contains corresponding prefix code of each unique characters in the source. Prefix code are grouped into 8 and its corresponding character code is written to the file

Definition at line 104 of file Compressor.cpp.

◆ writeHeader()

void Compressor::writeHeader ( const std::string &  inputName,
std::ofstream &  writer 
)
private

Write the header section to compressed file.

Header section of compressed file contains tree and other metaData required during decompression. Meta data includes number of input files, each file size and file path

Definition at line 81 of file Compressor.cpp.

◆ writeIntoFile()

fs::path Compressor::writeIntoFile ( const std::string &  infileName)
private

Write the header and body section to compressed file.

See also
writeHeader()
writeBody()

possibility of extra 8-bits

Definition at line 124 of file Compressor.cpp.

◆ writeTree()

void Compressor::writeTree ( std::ofstream &  writer,
BinNode head 
)
private

Write the entire Huffman tree in to the file header section using a pre-order traversal algorithm.

When we visit a leaf node, write bit 1 followed by the symbol in 8 bits. And when we visit an internal node (or the root node), simply write bit 0 only.

Definition at line 70 of file Compressor.cpp.

Member Data Documentation

◆ codeMap

HashMap<char, std::string> Compressor::codeMap
private

Prefix-free binary code for each value of the source symbol.


Definition at line 30 of file Compressor.h.

◆ frequency

HashMap<char, int> Compressor::frequency
private

Frequency of occurrence for each unique symbol in the source.


Definition at line 27 of file Compressor.h.

◆ infile

std::ifstream Compressor::infile
private

Instance of ifstream class for reading characters from source.


Definition at line 39 of file Compressor.h.

◆ inputFiles

std::vector<fs::path> Compressor::inputFiles
private

List of input files given by the user.


Definition at line 36 of file Compressor.h.

◆ rootNode

BinNode* Compressor::rootNode
private

Root node for Huffman tree.


Definition at line 33 of file Compressor.h.