add compression
All checks were successful
Linux arm64 / Build (push) Successful in 1m58s

This commit is contained in:
2025-06-12 21:28:46 +02:00
parent dd8314f76c
commit 3e40ff7252
6 changed files with 519 additions and 21 deletions

View File

@@ -10,6 +10,8 @@
#include <filesystem>
#include <algorithm>
#include "../Common/Compression.h"
PiecesFiles::PiecesFiles() {
}
@@ -19,10 +21,6 @@ bool PiecesFiles::savePieces(int polyominoSize) const {
if (!this->getFilePath(polyominoSize, filePath)) {
return false;
}
std::ofstream piecesFile(filePath, std::ios::trunc | std::ios::binary);
if (!piecesFile.good()) {
return false;
}
Generator generator;
std::vector<Polyomino> polyominoes = generator.generatePolyominoes(polyominoSize);
@@ -35,10 +33,9 @@ bool PiecesFiles::savePieces(int polyominoSize, std::vector<Polyomino>& polyomin
if (!this->getFilePath(polyominoSize, filePath)) {
return false;
}
std::ofstream piecesFile(filePath, std::ios::trunc | std::ios::binary);
if (!piecesFile.good()) {
return false;
}
constexpr std::size_t INITIAL_CAPACITY = 2048;
DataBuffer buffer(INITIAL_CAPACITY);
// sorting the polyominoes is done after setting spawn position to ensure the order is always the same
for (Polyomino& nMino : polyominoes) {
@@ -50,18 +47,20 @@ bool PiecesFiles::savePieces(int polyominoSize, std::vector<Polyomino>& polyomin
// write the characteristics of the piece
bool isConvex = polyomino.isConvex();
bool hasHole = (isConvex) ? false : polyomino.hasHole();
char infoByte = (isConvex << 7) + (hasHole << 6) + polyomino.getLength();
piecesFile.write(&infoByte, 1);
std::uint8_t infoByte = (isConvex << 7) + (hasHole << 6) + polyomino.getLength();
buffer << infoByte;
// write the positions of the piece
char positionByte;
std::uint8_t positionByte;
for (const Position position : polyomino.getPositions()) {
positionByte = (position.x << 4) + position.y;
piecesFile.write(&positionByte, 1);
buffer << positionByte;
}
}
return true;
DataBuffer compressed = Compress(buffer);
return compressed.WriteFile(filePath);
}
bool PiecesFiles::loadPieces(int polyominoSize, std::vector<Piece>& pieces, std::vector<int>& convexPieces, std::vector<int>& holelessPieces, std::vector<int>& otherPieces) const {
@@ -69,6 +68,13 @@ bool PiecesFiles::loadPieces(int polyominoSize, std::vector<Piece>& pieces, std:
if (!this->getFilePath(polyominoSize, filePath)) {
return false;
}
DataBuffer compressed;
if(!compressed.ReadFile(filePath))
return false;
DataBuffer buffer = Decompress(compressed);
std::ifstream piecesFile(filePath, std::ios::binary);
if (!piecesFile.good()) {
return false;
@@ -91,10 +97,11 @@ bool PiecesFiles::loadPieces(int polyominoSize, std::vector<Piece>& pieces, std:
char xMask = 0b1111'0000;
char yMask = 0b0000'1111;
char infoByte;
std::uint8_t infoByte;
int i = 0;
while (piecesFile.get(infoByte)) {
if (piecesFile.eof()) break;
while (!buffer.IsFinished()) {
// if (piecesFile.eof()) break;
buffer >> infoByte;
// read piece infos
bool isConvex = (infoByte & convexMask) >> 7;
@@ -103,9 +110,9 @@ bool PiecesFiles::loadPieces(int polyominoSize, std::vector<Piece>& pieces, std:
// read positions
std::set<Position> piecePositions;
char positionByte;
std::uint8_t positionByte;
for (int i = 0; i < polyominoSize; i++) {
piecesFile.get(positionByte);
buffer >> positionByte;
int x = ((unsigned char) positionByte & xMask) >> 4;
int y = positionByte & yMask;
piecePositions.insert(Position{x, y});