Skip to content

Commit

Permalink
Group related classes into folders
Browse files Browse the repository at this point in the history
  • Loading branch information
OmarBazaraa committed May 8, 2017
1 parent b332ff5 commit 7deaaad
Show file tree
Hide file tree
Showing 17 changed files with 193 additions and 9 deletions.
File renamed without changes.
File renamed without changes.
127 changes: 127 additions & 0 deletions Compressor/Compressors/BitConcatenatorBeta.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,127 @@
#include "BitConcatenatorBeta.h"

//
// Concatenation functions
//

void BitConcatenatorBeta::concatenate(const vector<int>& data, vector<uchar>& outputData) {
// Clear previous data
dataBitStr.clear();
dataSizesBitStr.clear();
compressedBytes.clear();

// Concatenate data
for (int i = 0; i < data.size(); ++i) {
encodeBinary(data[i]);
}

encodeBitString(dataBitStr + dataSizesBitStr);

// Swap the two vectors to return concatenated data to function caller
outputData.swap(compressedBytes);
}

void BitConcatenatorBeta::encodeBitString(const string& str) {
uchar byte = 0;
int bitsCount = 0;

for (int i = 0; i < dataBitStr.size(); ++i) {
byte |= (dataBitStr[i] - '0') << bitsCount++;

if (bitsCount >= 8) {
compressedBytes.push_back(byte);
byte = 0;
bitsCount = 0;
}
}

if (bitsCount > 0) {
compressedBytes.push_back(byte);
}
}

void BitConcatenatorBeta::encodeBinary(int number) {
string bitStr = toBinary(number);
string bitsCountStr = toBinary(bitStr.size() - 1);

if (bitsCountStr.size() > 5) {
throw exception("Bits concatenation fialed");
}

dataBitStr += bitStr;
dataSizesBitStr += bitsCountStr + string(5 - bitsCountStr.size(), '0');
}

// ==============================================================================
//
// Deconcatenation functions
//

void BitConcatenatorBeta::deconcatenate(const vector<uchar>& data, vector<int>& outputData) {
// Clear previous data
dataBitStr.clear();
dataSizesBitStr.clear();
compressedBytes.clear();

// Concatenate data
for (int i = 0; i < data.size(); ++i) {
dataBitStr += toBinary(data[i]);
}

decodeDataSizes();
decodeBitString(outputData);
}

void BitConcatenatorBeta::decodeBitString(vector<int>& outputData) {
int i = 0;

while (!dataSizes.empty()) {
int size = dataSizes.top();
int data = toDecimal(dataBitStr.substr(i, size));
outputData.push_back(data);
dataSizes.pop();
i += size;
}
}

void BitConcatenatorBeta::decodeDataSizes() {
int n = dataBitStr.size();
int dataBitsCount = 0;

while (n > dataBitsCount) {
int size = toDecimal(dataBitStr.substr(n - 5));
dataBitsCount += size;
dataSizes.push(size);
dataBitStr.erase(n -= 5, n);
}
}

// ==============================================================================
//
// Helper functions
//

string BitConcatenatorBeta::toBinary(int number) {
if (number == 0) {
return "0";
}

string bitStr;

while (number > 0) {
bitStr += '0' + (number & 1);
number >>= 1;
}

return bitStr;
}

int BitConcatenatorBeta::toDecimal(string& binary) {
int num = 0;

for (int i = 0; i < binary.size(); ++i) {
num |= (binary[i] - '0') << i;
}

return num;
}
49 changes: 49 additions & 0 deletions Compressor/Compressors/BitConcatenatorBeta.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
#pragma once
#include <vector>
#include <stack>
using namespace std;

typedef unsigned char uchar;

class BitConcatenatorBeta
{
private:
string dataBitStr;
string dataSizesBitStr;

vector<uchar> compressedBytes;
stack<int> dataSizes;

// ==============================================================================
//
// Concatenation functions
//
public:
void concatenate(const vector<int>& data, vector<uchar>& outputData);

private:
void encodeBitString(const string& str);

void encodeBinary(int number);

// ==============================================================================
//
// Deconcatenation functions
//
public:
void deconcatenate(const vector<uchar>& data, vector<int>& outputData);

private:
void decodeBitString(vector<int>& outputData);

void decodeDataSizes();

// ==============================================================================
//
// Helper functions
//
private:
string toBinary(int number);

int toDecimal(string& binary);
};
File renamed without changes.
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@

// Custom libraries
#include "BitConcatenator.h"
#include "BitConcatenatorBeta.h"
#include "Huffman.h"
#include "LZW.h"

Expand Down
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
17 changes: 11 additions & 6 deletions Compressor/Source.cpp
Original file line number Diff line number Diff line change
@@ -1,14 +1,19 @@
// STL libraries
#include <iostream>
#include <string>
#include <ctime>
#include <iomanip>
#include "Directory.h"
#include "Utility.h"
#include "Compressor.h"

// Custom libraries
#include "Utilities\Directory.h"
#include "Utilities\Utility.h"
#include "Compressors\Compressor.h"
using namespace std;

#define PATH_SAMPLE_DATA "DataSet/"
#define PATH_COMPRESSED_DATA "Compressed/"
#define PATH_UNCOMPRESSED_DATA "Uncompressed/"
// Pathes
#define PATH_SAMPLE_DATA "Data\\Raw\\"
#define PATH_COMPRESSED_DATA "Data\\Compressed\\"
#define PATH_UNCOMPRESSED_DATA "Data\\Uncompressed\\"
#define EXT_SAMPLE_FILE "jpg"
#define EXT_COMPRESSED_FILE "cpr"

Expand Down
8 changes: 5 additions & 3 deletions Compressor/Directory.h → Compressor/Utilities/Directory.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,16 +10,18 @@ using namespace std;
inline void getFilesInDirectory(const string& directory, vector<pair<string, string>>& files) {
// Make sure to change the following command to the corresponding
// one on your operating system when using Linux or MAC
string s = "dir " + directory + "b > dirs.txt";
string txtPath = "Data\\dirs.txt";

string s = "dir " + directory + "/b > " + txtPath;
system(s.c_str());

ifstream fin("dirs.txt");
ifstream fin(txtPath);

while (getline(fin, s)) {
int idx = (int)s.size() - 1;
while (idx >= 0 && s[idx] != '.') --idx;
files.push_back({ s.substr(0, idx), s.substr(idx + 1) });
}

remove("dirs.txt");
remove(txtPath.c_str());
}
File renamed without changes.

0 comments on commit 7deaaad

Please sign in to comment.