Added reference and const modifiers to improve speed. Added DataBlocks class

This commit is contained in:
Dmitriy Shishkov 2021-12-12 00:24:04 +03:00
parent 77baa030c9
commit 8c464edb2e
12 changed files with 65 additions and 16 deletions

View File

@ -0,0 +1,7 @@
#include "pch.h"
#include "DataBlocks.hpp"
vector<unsigned char>& DataBlocks::compose_data_and_EC_blocks()
{
return data;
}

View File

@ -0,0 +1,24 @@
#pragma once
#include <vector>
#include "BitArray.hpp"
#include "Method.hpp"
using namespace std;
class DataBlocks
{
public:
DataBlocks(const BitArray& e_data_, CorrectionLevel corr_lvl_, unsigned char version_) : e_data{ e_data_ }, corr_lvl{ corr_lvl_ }, version{ version_ } {};
vector<unsigned char>& compose_data_and_EC_blocks();
private:
const BitArray& e_data;
CorrectionLevel corr_lvl;
unsigned char version;
vector<unsigned char> data;
};

View File

@ -5,7 +5,7 @@
#include <stdexcept>
BitArray Encoder::encode()
BitArray& Encoder::encode()
{
unsigned encoded_bit_num = calculate_encoded_input_size(input.size(), method);
unsigned metadata_bit_num = calculate_metadata_size(method, ((version < 0) ? 0 : version));
@ -138,14 +138,14 @@ void Encoder::pad_data(BitArray& arr, unsigned bits_written)
arr.v[i] = ((i - encoded_bytes) % 2 == 0) ? 0b11101100 : 0b00010001;
}
unsigned char Encoder::get_version()
unsigned char Encoder::get_version() const
{
if (version < 0) throw std::runtime_error("Determite version before getting it");
return version;
}
BitArray Encoder::get_data()
BitArray Encoder::get_data() const
{
if (e.size == 0) throw std::runtime_error("Data is not calculated yet");

View File

@ -13,7 +13,7 @@ class Encoder
public:
Encoder(const string& input_, CorrectionLevel corr_lvl_ = CorrectionLevel::M, QRCodeMethod method_ = QRCodeMethod::Dynamic, char version_ = -1) : input{ input_ }, corr_lvl{ corr_lvl_ }, method{ method_ }, version{ version_ } {};
BitArray encode();
BitArray& encode();
static unsigned char determite_version(unsigned size, CorrectionLevel corr_lvl);
@ -44,8 +44,8 @@ public:
static void pad_data(BitArray& arr, unsigned bits_written);
unsigned char get_version();
BitArray get_data();
unsigned char get_version() const;
BitArray get_data() const;
private:
const string input;

View File

@ -3,7 +3,7 @@
#include "Method.hpp"
#include "Tables.hpp"
QRCodeMethod Method::determite_method(string input)
QRCodeMethod Method::determite_method(string& input)
{
QRCodeMethod type = QRCodeMethod::Numeric;

View File

@ -1,9 +1,19 @@
#include "pch.h"
#include "QRCode.hpp"
QRCode::QRCode(string input_, CorrectionLevel corr_lvl_, QRCodeMethod method_, unsigned char version_) :
input{ input_ }, corr_lvl{ corr_lvl_ }, method{ method_ }, version{ version_ }
#include "QRCode.hpp"
#include "Encoder.hpp"
#include "DataBlocks.hpp"
QRCode::QRCode(string& input_, CorrectionLevel corr_lvl_, QRCodeMethod method_, unsigned char version_) :
input{ input_ }, corr_lvl{ corr_lvl_ }, method{ method_ }, version{ version_ }
{
if (method == QRCodeMethod::Dynamic)
method = Method::determite_method(input);
Encoder encoder(input, corr_lvl, method, version);
version = encoder.get_version();
const BitArray& encoded_data = encoder.encode();
DataBlocks data_blocks(encoded_data, corr_lvl, version);
vector<unsigned char>& blocked_data = data_blocks.compose_data_and_EC_blocks();
}

View File

@ -9,7 +9,7 @@ using namespace std;
class QRCode
{
public:
QRCode(string input_, CorrectionLevel corr_lvl_ = CorrectionLevel::Q, QRCodeMethod method_ = QRCodeMethod::Dynamic, unsigned char version_ = 0);
QRCode(string& input_, CorrectionLevel corr_lvl_ = CorrectionLevel::Q, QRCodeMethod method_ = QRCodeMethod::Dynamic, unsigned char version_ = 0);
protected:
string input;

View File

@ -152,6 +152,7 @@
</ItemDefinitionGroup>
<ItemGroup>
<ClInclude Include="BitArray.hpp" />
<ClInclude Include="DataBlocks.hpp" />
<ClInclude Include="Encoder.hpp" />
<ClInclude Include="framework.h" />
<ClInclude Include="Method.hpp" />
@ -161,6 +162,7 @@
</ItemGroup>
<ItemGroup>
<ClCompile Include="BitArray.cpp" />
<ClCompile Include="DataBlocks.cpp" />
<ClCompile Include="Encoder.cpp" />
<ClCompile Include="Method.cpp" />
<ClCompile Include="pch.cpp">

View File

@ -36,6 +36,9 @@
<ClInclude Include="BitArray.hpp">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="DataBlocks.hpp">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<ClCompile Include="pch.cpp">
@ -56,5 +59,8 @@
<ClCompile Include="BitArray.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="DataBlocks.cpp">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup>
</Project>

View File

@ -20,7 +20,7 @@ enum class CorrectionLevel {
class Method {
public:
static QRCodeMethod determite_method(string input);
static QRCodeMethod determite_method(string& input);
static constexpr bool is_num(char ch) { return ch >= '0' && ch <= '9'; };
static bool is_alphabetic(char ch);

View File

@ -6,9 +6,9 @@
#include "../QRCodeLibrary/Method.hpp"
TEST(MethodTests, DetermitesStringMethod) {
EXPECT_EQ(Method::determite_method("123"), QRCodeMethod::Numeric);
EXPECT_EQ(Method::determite_method("ABC"), QRCodeMethod::Alphabetic);
EXPECT_EQ(Method::determite_method("ghfjghfj gfjhgd"), QRCodeMethod::Byte);
EXPECT_EQ(Method::determite_method(std::string("123")), QRCodeMethod::Numeric);
EXPECT_EQ(Method::determite_method(std::string("ABC")), QRCodeMethod::Alphabetic);
EXPECT_EQ(Method::determite_method(std::string("ghfjghfj gfjhgd")), QRCodeMethod::Byte);
}
TEST(MethodTests, ChecksNumber) {

View File

@ -11,7 +11,7 @@ public:
QRCodeConstructorMock(Parameters ...params) {};
};
TEST(QRCodeTests, ConstructsClass) {
QRCode qr("TEST");
QRCode qr(std::string("TEST"));
EXPECT_EQ(qr.input, "TEST");
EXPECT_EQ(qr.corr_lvl, CorrectionLevel::Q);