Added TritMatrix class
This commit is contained in:
parent
b64fa5b366
commit
2201f825c9
@ -159,6 +159,7 @@
|
||||
<ClInclude Include="pch.h" />
|
||||
<ClInclude Include="QRCode.hpp" />
|
||||
<ClInclude Include="Tables.hpp" />
|
||||
<ClInclude Include="TritMatrix.hpp" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="BitArray.cpp" />
|
||||
@ -172,6 +173,7 @@
|
||||
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Create</PrecompiledHeader>
|
||||
</ClCompile>
|
||||
<ClCompile Include="QRCode.cpp" />
|
||||
<ClCompile Include="TritMatrix.cpp" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||
<ImportGroup Label="ExtensionTargets">
|
||||
|
@ -39,6 +39,9 @@
|
||||
<ClInclude Include="DataBlocks.hpp">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="TritMatrix.hpp">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="pch.cpp">
|
||||
@ -59,5 +62,8 @@
|
||||
<ClCompile Include="DataBlocks.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="TritMatrix.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
</ItemGroup>
|
||||
</Project>
|
76
QRCodeLibrary/TritMatrix.cpp
Normal file
76
QRCodeLibrary/TritMatrix.cpp
Normal file
@ -0,0 +1,76 @@
|
||||
#include "pch.h"
|
||||
#include "TritMatrix.hpp"
|
||||
|
||||
#include <stdexcept>
|
||||
|
||||
Trit TritMatrix::get(unsigned y, unsigned x) const
|
||||
{
|
||||
return c[y][x];
|
||||
}
|
||||
|
||||
void TritMatrix::set(unsigned y, unsigned x, Trit val)
|
||||
{
|
||||
c[y][x] = val;
|
||||
}
|
||||
|
||||
void TritMatrix::set(unsigned y, unsigned x, int32_t val, unsigned char size)
|
||||
{
|
||||
if (x + size > c.at(0).size()) throw std::out_of_range("Value to write is out of matrix range");
|
||||
for (unsigned char i = 0; i < size; i++)
|
||||
set(y, x + i, ((val >> (size - 1 - i)) & 1) ? Trit::T : Trit::F);
|
||||
}
|
||||
|
||||
void TritMatrix::set(unsigned y, unsigned x, bool val)
|
||||
{
|
||||
set(y, x, val ? Trit::T : Trit::F);
|
||||
}
|
||||
|
||||
string TritMatrix::to_ascii() const
|
||||
{
|
||||
string res;
|
||||
|
||||
for (unsigned i = 0; i < c.size(); i++) {
|
||||
for (unsigned j = 0; j < c.at(0).size(); j++)
|
||||
switch (c[i][j])
|
||||
{
|
||||
case Trit::T:
|
||||
res.push_back('#');
|
||||
break;
|
||||
case Trit::F:
|
||||
res.push_back(' ');
|
||||
break;
|
||||
case Trit::EMPTY:
|
||||
res.push_back('E');
|
||||
break;
|
||||
}
|
||||
if (i != c.size() - 1)
|
||||
res.push_back('\n');
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
string TritMatrix::to_string() const
|
||||
{
|
||||
string res;
|
||||
|
||||
for (unsigned i = 0; i < c.size(); i++) {
|
||||
for (unsigned j = 0; j < c.at(0).size(); j++)
|
||||
switch (c[i][j])
|
||||
{
|
||||
case Trit::T:
|
||||
res.push_back('1');
|
||||
break;
|
||||
case Trit::F:
|
||||
res.push_back('0');
|
||||
break;
|
||||
case Trit::EMPTY:
|
||||
res.push_back('E');
|
||||
break;
|
||||
}
|
||||
if (i != c.size() - 1)
|
||||
res.push_back('\n');
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
31
QRCodeLibrary/TritMatrix.hpp
Normal file
31
QRCodeLibrary/TritMatrix.hpp
Normal file
@ -0,0 +1,31 @@
|
||||
#pragma once
|
||||
|
||||
#include <vector>
|
||||
#include <string>
|
||||
|
||||
using namespace std;
|
||||
|
||||
enum Trit {
|
||||
EMPTY = -1,
|
||||
F,
|
||||
T,
|
||||
};
|
||||
|
||||
class TritMatrix
|
||||
{
|
||||
public:
|
||||
TritMatrix(unsigned width, unsigned height) : c{ height, vector<Trit>(width, Trit::EMPTY) } {};
|
||||
|
||||
Trit get(unsigned y, unsigned x) const;
|
||||
|
||||
void set(unsigned y, unsigned x, Trit val);
|
||||
void set(unsigned y, unsigned x, bool val);
|
||||
void set(unsigned y, unsigned x, int32_t val, unsigned char size);
|
||||
|
||||
string to_ascii() const;
|
||||
string to_string() const;
|
||||
|
||||
private:
|
||||
vector<vector<Trit>> c;
|
||||
};
|
||||
|
87
tests/TritMatrix_test.cpp
Normal file
87
tests/TritMatrix_test.cpp
Normal file
@ -0,0 +1,87 @@
|
||||
#include "pch.h"
|
||||
|
||||
#define protected public
|
||||
#define private public
|
||||
|
||||
#include "../QRCodeLibrary/TritMatrix.hpp"
|
||||
|
||||
TEST(TritMatrixTests, CreatesVectorOfVectors) {
|
||||
TritMatrix m(5, 4);
|
||||
|
||||
ASSERT_EQ(m.c.size(), 4);
|
||||
|
||||
for (int i = 0; i < 4; i++)
|
||||
EXPECT_EQ(m.c[i].size(), 5);
|
||||
}
|
||||
|
||||
TEST(TritMatrixTests, GetsByCoordinates) {
|
||||
TritMatrix m(5, 4);
|
||||
|
||||
m.c[1][4] = Trit::F;
|
||||
|
||||
EXPECT_EQ(m.get(1, 4), Trit::F);
|
||||
EXPECT_EQ(m.get(1, 3), Trit::EMPTY);
|
||||
}
|
||||
|
||||
TEST(TritMatrixTests, SetsIndividualCell) {
|
||||
TritMatrix m(5, 4);
|
||||
|
||||
m.set(1, 3, Trit::T);
|
||||
|
||||
EXPECT_EQ(m.get(1, 3), Trit::T);
|
||||
EXPECT_EQ(m.get(1, 4), Trit::EMPTY);
|
||||
|
||||
m.set(1, 4, Trit::F);
|
||||
|
||||
EXPECT_EQ(m.get(1, 3), Trit::T);
|
||||
EXPECT_EQ(m.get(1, 4), Trit::F);
|
||||
}
|
||||
|
||||
TEST(TritMatrixTests, SetsIndividualCellWithBool) {
|
||||
TritMatrix m(5, 4);
|
||||
|
||||
m.set(1, 3, 1);
|
||||
|
||||
EXPECT_EQ(m.get(1, 3), Trit::T);
|
||||
EXPECT_EQ(m.get(1, 4), Trit::EMPTY);
|
||||
|
||||
m.set(1, 4, 0);
|
||||
|
||||
EXPECT_EQ(m.get(1, 3), Trit::T);
|
||||
EXPECT_EQ(m.get(1, 4), Trit::F);
|
||||
}
|
||||
|
||||
TEST(TritMatrixTests, ConvertsToString) {
|
||||
TritMatrix m(2, 2);
|
||||
|
||||
m.set(0, 0, 1);
|
||||
m.set(1, 0, 0);
|
||||
m.set(1, 1, 1);
|
||||
|
||||
EXPECT_EQ(m.to_string(), "1E\n01");
|
||||
}
|
||||
|
||||
TEST(TritMatrixTests, SetsMultipleCells) {
|
||||
TritMatrix m(5, 4);
|
||||
|
||||
m.set(1, 1, 0b101, 3);
|
||||
|
||||
ASSERT_EQ(m.to_string(), "EEEEE\nE101E\nEEEEE\nEEEEE");
|
||||
|
||||
m.set(2, 0, 0b11111, 5);
|
||||
|
||||
ASSERT_EQ(m.to_string(), "EEEEE\nE101E\n11111\nEEEEE");
|
||||
|
||||
m.set(2, 1, 0b010, 3);
|
||||
|
||||
EXPECT_EQ(m.to_string(), "EEEEE\nE101E\n10101\nEEEEE");
|
||||
}
|
||||
|
||||
TEST(TritMatrixTests, ConvertsToASCII) {
|
||||
TritMatrix m(2, 2);
|
||||
|
||||
m.set(0, 0, 0b10, 2);
|
||||
m.set(1, 0, 0b01, 2);
|
||||
|
||||
EXPECT_EQ(m.to_ascii(), "# \n #");
|
||||
}
|
@ -47,6 +47,7 @@
|
||||
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Create</PrecompiledHeader>
|
||||
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Create</PrecompiledHeader>
|
||||
</ClCompile>
|
||||
<ClCompile Include="TritMatrix_test.cpp" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\QRCodeLibrary\QRCodeLibrary.vcxproj">
|
||||
|
Loading…
x
Reference in New Issue
Block a user