Ajout de parser de règles

This commit is contained in:
Timothée Leclaire-Fournier 2024-01-18 21:41:13 -05:00
parent 7b06d3924c
commit 7c9c1bb210
4 changed files with 96 additions and 16 deletions

View File

@ -22,22 +22,30 @@ GOL::State GOLTeamH::state(int x, int y) const
std::string GOLTeamH::rule() const std::string GOLTeamH::rule() const
{ {
return mRule; return mRule.value_or(std::move(std::string()));
} }
GOL::BorderManagement GOLTeamH::borderManagement() const GOL::BorderManagement GOLTeamH::borderManagement() const
{ {
return BorderManagement(); return mBorderManagement.value_or(std::move(GOL::borderManagement()));
} }
GOL::Color GOLTeamH::color(State state) const GOL::Color GOLTeamH::color(State state) const
{ {
return Color(); return state == GOL::State::alive ? mAliveColor : mDeadColor;
} }
GOL::Statistics GOLTeamH::statistics() const GOL::Statistics GOLTeamH::statistics() const
{ {
return Statistics(); return GOL::Statistics{
.rule = mRule,
.borderManagement = mBorderManagement,
.width = width(),
.height = height(),
.totalCells = size(),
.iteration = mIteration,
//.totalDeadAbs = mData.totalDead()
};
} }
GOL::ImplementationInformation GOLTeamH::information() const GOL::ImplementationInformation GOLTeamH::information() const
@ -50,15 +58,50 @@ void GOLTeamH::resize(size_t width, size_t height, State defaultState)
mData.resize(width, height, defaultState); mData.resize(width, height, defaultState);
} }
// La performance n'est pas tant recherchée puisque cette fonction est appelée très rarement
bool GOLTeamH::setRule(std::string const& rule) bool GOLTeamH::setRule(std::string const& rule)
{ {
mRule = rule; mRule = rule;
return true; bool firstPart{ true };
// TODO: return false si parsing error; std::bitset<9> parsedRuleRevive, parsedRuleSurvive;
// On vérifie que la chaine de charactères contient un B au début.
// 5 = chaine minimale
if (rule.size() < 5 || !(rule[0] == 'B' || rule[0] == 'b'))
return false;
for (size_t i{ 1 }; i < rule.length(); i++) {
auto opt = convertCharToNumber(rule[i]);
// Si c'est un chiffre, on continue.
if (opt.has_value()) {
firstPart ? parsedRuleRevive.set(opt.value()) : parsedRuleSurvive.set(opt.value());
continue;
}
// On vérifie qu'il y ait un backslash avec un char après.
if (firstPart && rule[i] == '/' && rule.size() > i + 1
&& (rule[i + 1] == 'S' || rule[i + 1] == 's')) {
i++; // On saute le S
firstPart = false;
continue;
}
else // Aucun slash + s
return false;
}
if (parsedRuleRevive.any() && parsedRuleSurvive.any()) {
mParsedRuleRevive = parsedRuleRevive;
mParsedRuleSurvive = parsedRuleSurvive;
return true;
}
else
return false;
} }
void GOLTeamH::setBorderManagement(BorderManagement borderManagement) void GOLTeamH::setBorderManagement(BorderManagement borderManagement)
{ {
mBorderManagement = borderManagement;
} }
void GOLTeamH::setState(int x, int y, State state) void GOLTeamH::setState(int x, int y, State state)
@ -91,12 +134,23 @@ bool GOLTeamH::setFromPattern(std::string const& pattern)
void GOLTeamH::setSolidColor(State state, Color const& color) void GOLTeamH::setSolidColor(State state, Color const& color)
{ {
} }
void GOLTeamH::processOneStep() void GOLTeamH::processOneStep()
{ {
} }
void GOLTeamH::updateImage(uint32_t* buffer, size_t buffer_size) const void GOLTeamH::updateImage(uint32_t* buffer, size_t buffer_size) const
{ {
}
std::optional<unsigned char> GOLTeamH::convertCharToNumber(const char c)
{
if (c < 48 || c > 57)
return std::nullopt;
return (c - 48);
} }

View File

@ -1,6 +1,9 @@
#pragma once #pragma once
#include <string> #include <string>
#include <array>
#include <optional>
#include <bitset>
#include <GOL.h> #include <GOL.h>
#include "Grid.h" #include "Grid.h"
@ -30,7 +33,13 @@ public:
void processOneStep() override; void processOneStep() override;
void updateImage(uint32_t* buffer, size_t buffer_size) const override; void updateImage(uint32_t* buffer, size_t buffer_size) const override;
private: private:
Grid mData; std::optional<std::string> mRule;
std::string mRule; std::optional<GOL::BorderManagement> mBorderManagement;
}; std::optional<IterationType> mIteration;
Grid mData;
std::bitset<9> mParsedRuleRevive, mParsedRuleSurvive;
Color mDeadColor, mAliveColor;
std::optional<unsigned char> convertCharToNumber(const char c);
};

View File

@ -11,25 +11,30 @@ Grid::Grid(size_t width, size_t height, CellType initValue)
resize(width, height, initValue); resize(width, height, initValue);
} }
// Destructeur Grid
Grid::~Grid() Grid::~Grid()
{ {
} }
// Accesseur retournant la largeur de la grille.
size_t Grid::width() const size_t Grid::width() const
{ {
return mWidth; return mWidth;
} }
// Accesseur retournant la hauteur de la grille.
size_t Grid::height() const size_t Grid::height() const
{ {
return mHeight; return mHeight;
} }
// Accesseur retournant le nombre de cellule de la grille (la taille de la grille).
size_t Grid::size() const size_t Grid::size() const
{ {
return mWidth * mHeight; return mWidth * mHeight;
} }
// Mutateur modifiant la taille de la grille et initialise le contenu par la valeur spécifiée.
void Grid::resize(size_t width, size_t height, CellType initValue) void Grid::resize(size_t width, size_t height, CellType initValue)
{ {
mData.reserve(width * height); mData.reserve(width * height);
@ -37,16 +42,19 @@ void Grid::resize(size_t width, size_t height, CellType initValue)
mHeight = height; mHeight = height;
} }
// Accesseur retournant la valeur d'une cellule à une certaine coordonnée.
Grid::CellType Grid::value(int column, int row) const Grid::CellType Grid::value(int column, int row) const
{ {
return mData[(column - 1) * (row - 1)]; return mData[(column - 1) * (row - 1)];
} }
// Mutateur modifiant la valeur d'une cellule à une certaine coordonnée.
void Grid::setValue(int column, int row, CellType value) void Grid::setValue(int column, int row, CellType value)
{ {
mData[(column - 1) * (row - 1)] = value; mData[(column - 1) * (row - 1)] = value;
} }
// Accesseur retournant la valeur d'une cellule à une certaine coordonnée.
std::optional<Grid::CellType> Grid::at(int column, int row) const std::optional<Grid::CellType> Grid::at(int column, int row) const
{ {
if (column > mWidth || row > mHeight) if (column > mWidth || row > mHeight)
@ -55,6 +63,7 @@ std::optional<Grid::CellType> Grid::at(int column, int row) const
return mData[(column - 1) * (row - 1)]; return mData[(column - 1) * (row - 1)];
} }
// Mutateur modifiant la valeur d'une cellule à une certaine coordonn<6E>e.
void Grid::setAt(int column, int row, CellType value) void Grid::setAt(int column, int row, CellType value)
{ {
if (column > mWidth || row > mHeight) if (column > mWidth || row > mHeight)
@ -62,13 +71,20 @@ void Grid::setAt(int column, int row, CellType value)
mData[(column - 1) * (row - 1)] = value; mData[(column - 1) * (row - 1)] = value;
} }
// Accesseur en lecture seule sur le "buffer" de la grille.
Grid::DataType const& Grid::data() const Grid::DataType const& Grid::data() const
{ {
return mData; return mData;
} }
// Accesseur en lecture/écriture sur le "buffer" de la grille.
Grid::DataType& Grid::data() Grid::DataType& Grid::data()
{ {
return mData; return mData;
} }
// TODO
Grid::DataType Grid::totalDead()
{
return DataType();
}

View File

@ -34,9 +34,10 @@ public: //
void setAt(int column, int row, CellType value); // Mutateur modifiant la valeur d'une cellule à une certaine coordonnée. Cette fonction VALIDE ses entrées et ne fait rien si la coordonnée est invalide. void setAt(int column, int row, CellType value); // Mutateur modifiant la valeur d'une cellule à une certaine coordonnée. Cette fonction VALIDE ses entrées et ne fait rien si la coordonnée est invalide.
// //
// Accesseurs du "buffer" de la grille. // // Accesseurs du "buffer" de la grille. //
DataType const & data() const; // Accesseur en lecture seule sur le "buffer" de la grille. DataType const& data() const; // Accesseur en lecture seule sur le "buffer" de la grille.
DataType & data(); // Accesseur en lecture/écriture sur le "buffer" de la grille. DataType& data(); // Accesseur en lecture/écriture sur le "buffer" de la grille.
//
DataType totalDead();
private: // private: //
DataType mData; // Il y a des attributs essentiels au fonctionnement de cette classe. DataType mData; // Il y a des attributs essentiels au fonctionnement de cette classe.
size_t mWidth, mHeight; // À vous de les déterminer. size_t mWidth, mHeight; // À vous de les déterminer.