Puisque demandé, switch à un tableau manuel.
This commit is contained in:
parent
4095ffba07
commit
8fcd5630fb
@ -99,6 +99,7 @@ GOL::ImplementationInformation GOLTeamH::information() const
|
|||||||
void GOLTeamH::resize(size_t width, size_t height, State defaultState)
|
void GOLTeamH::resize(size_t width, size_t height, State defaultState)
|
||||||
{
|
{
|
||||||
mData.resize(width, height, defaultState);
|
mData.resize(width, height, defaultState);
|
||||||
|
drawBorder();
|
||||||
}
|
}
|
||||||
|
|
||||||
//! \brief Mutateur modifiant la règle de la simulation.
|
//! \brief Mutateur modifiant la règle de la simulation.
|
||||||
@ -215,8 +216,12 @@ void GOLTeamH::setBorderManagement(BorderManagement borderManagement)
|
|||||||
{
|
{
|
||||||
mBorderManagement = borderManagement;
|
mBorderManagement = borderManagement;
|
||||||
mIteration = 0;
|
mIteration = 0;
|
||||||
|
drawBorder();
|
||||||
|
}
|
||||||
|
|
||||||
switch (borderManagement) {
|
void GOLTeamH::drawBorder()
|
||||||
|
{
|
||||||
|
switch (mBorderManagement.value_or(GOL::BorderManagement::foreverDead)) {
|
||||||
case GOL::BorderManagement::foreverDead:
|
case GOL::BorderManagement::foreverDead:
|
||||||
mData.fillBorder(GridTeamH::CellType::dead);
|
mData.fillBorder(GridTeamH::CellType::dead);
|
||||||
break;
|
break;
|
||||||
@ -389,10 +394,10 @@ void GOLTeamH::processOneStep()
|
|||||||
|
|
||||||
// On commence à la première case qui n'est pas dans le border
|
// On commence à la première case qui n'est pas dans le border
|
||||||
// Pointeur du tableau intermédiaire.
|
// Pointeur du tableau intermédiaire.
|
||||||
auto* ptrGridInt{ reinterpret_cast<uint8_t*>(&(mData.intData()[0])) + (offset + 1) };
|
auto* ptrGridInt{ reinterpret_cast<uint8_t*>(mData.intData()) + (offset + 1) };
|
||||||
|
|
||||||
// Pointeur qui se promène en mémoire.
|
// Pointeur qui se promène en mémoire.
|
||||||
auto* ptrGrid{ reinterpret_cast<uint8_t*>(&(mData.data()[0])) };
|
auto* ptrGrid{ reinterpret_cast<uint8_t*>(mData.data()) };
|
||||||
|
|
||||||
for (size_t j{ 1 }; j < heightNoBorder + 1; ++j) {
|
for (size_t j{ 1 }; j < heightNoBorder + 1; ++j) {
|
||||||
for (size_t i{ 1 }; i < widthNoBorder + 1; ++i) {
|
for (size_t i{ 1 }; i < widthNoBorder + 1; ++i) {
|
||||||
@ -495,7 +500,7 @@ void GOLTeamH::updateImage(uint32_t* buffer, size_t buffer_size) const
|
|||||||
auto* s_ptr{ buffer }, * e_ptr{ buffer + buffer_size };
|
auto* s_ptr{ buffer }, * e_ptr{ buffer + buffer_size };
|
||||||
|
|
||||||
// Pointeur qui se promène en mémoire.
|
// Pointeur qui se promène en mémoire.
|
||||||
auto* ptrGrid{ reinterpret_cast<const uint8_t*>(&mData.data()[0]) };
|
auto* ptrGrid{ reinterpret_cast<const uint8_t*>(mData.data()) };
|
||||||
|
|
||||||
// On itère sur chaque éléments du tableau et on associe la couleur.
|
// On itère sur chaque éléments du tableau et on associe la couleur.
|
||||||
while (s_ptr < e_ptr) {
|
while (s_ptr < e_ptr) {
|
||||||
|
@ -27,6 +27,7 @@ public:
|
|||||||
void resize(size_t width, size_t height, State defaultState) override;
|
void resize(size_t width, size_t height, State defaultState) override;
|
||||||
bool setRule(std::string const& rule) override;
|
bool setRule(std::string const& rule) override;
|
||||||
void setBorderManagement(BorderManagement borderManagement) override;
|
void setBorderManagement(BorderManagement borderManagement) override;
|
||||||
|
void drawBorder();
|
||||||
void setState(int x, int y, State state) override;
|
void setState(int x, int y, State state) override;
|
||||||
void fill(State state) override;
|
void fill(State state) override;
|
||||||
void fillAlternately(State firstCell) override;
|
void fillAlternately(State firstCell) override;
|
||||||
|
@ -11,6 +11,7 @@ GridTeamH::GridTeamH()
|
|||||||
|
|
||||||
GridTeamH::GridTeamH(size_t width, size_t height, CellType initValue)
|
GridTeamH::GridTeamH(size_t width, size_t height, CellType initValue)
|
||||||
:mWidth{ width }, mHeight{ height }, mEngine(mRandomDevice()), mDistribution(0.0, 1.0), mAliveCount{}
|
:mWidth{ width }, mHeight{ height }, mEngine(mRandomDevice()), mDistribution(0.0, 1.0), mAliveCount{}
|
||||||
|
, mData{}, mIntermediateData{}
|
||||||
{
|
{
|
||||||
resize(width, height, initValue);
|
resize(width, height, initValue);
|
||||||
}
|
}
|
||||||
@ -18,20 +19,30 @@ GridTeamH::GridTeamH(size_t width, size_t height, CellType initValue)
|
|||||||
// Destructeur Grid
|
// Destructeur Grid
|
||||||
GridTeamH::~GridTeamH()
|
GridTeamH::~GridTeamH()
|
||||||
{
|
{
|
||||||
|
dealloc();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Mutateur modifiant la taille de la grille et initialise le contenu par la valeur spécifiée.
|
// Mutateur modifiant la taille de la grille et initialise le contenu par la valeur spécifiée.
|
||||||
void GridTeamH::resize(size_t width, size_t height, CellType initValue)
|
void GridTeamH::resize(size_t width, size_t height, CellType initValue)
|
||||||
{
|
{
|
||||||
|
if (mData)
|
||||||
|
dealloc();
|
||||||
|
|
||||||
mWidth = width;
|
mWidth = width;
|
||||||
mHeight = height;
|
mHeight = height;
|
||||||
mData.resize(width * height);
|
|
||||||
mIntermediateData.resize(width * height);
|
mData = new CellType[width * height];
|
||||||
|
mIntermediateData = new CellType[width * height];
|
||||||
|
|
||||||
fill(initValue, true);
|
fill(initValue, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void GridTeamH::dealloc()
|
||||||
|
{
|
||||||
|
delete[] mData;
|
||||||
|
delete[] mIntermediateData;
|
||||||
|
}
|
||||||
|
|
||||||
// Accesseur retournant la valeur d'une cellule à une certaine coordonnée.
|
// Accesseur retournant la valeur d'une cellule à une certaine coordonnée.
|
||||||
GridTeamH::CellType GridTeamH::value(int column, int row) const
|
GridTeamH::CellType GridTeamH::value(int column, int row) const
|
||||||
{
|
{
|
||||||
@ -114,15 +125,14 @@ float GridTeamH::totalAliveRel() const
|
|||||||
void GridTeamH::fill(CellType value, bool fillBorder)
|
void GridTeamH::fill(CellType value, bool fillBorder)
|
||||||
{
|
{
|
||||||
if (fillBorder) {
|
if (fillBorder) {
|
||||||
for (auto& i : mData)
|
for (size_t i{}; i < mWidth; i++)
|
||||||
i = value;
|
for (size_t j{}; j < mHeight; ++j)
|
||||||
}
|
|
||||||
else {
|
|
||||||
for (size_t i{ 1 }; i < mWidth - 1; i++) {
|
|
||||||
for (size_t j{ 1 }; j < mHeight - 1; ++j) {
|
|
||||||
mData[i + (j * mWidth)] = value;
|
mData[i + (j * mWidth)] = value;
|
||||||
}
|
}
|
||||||
}
|
else {
|
||||||
|
for (size_t i{ 1 }; i < mWidth - 1; i++)
|
||||||
|
for (size_t j{ 1 }; j < mHeight - 1; ++j)
|
||||||
|
mData[i + (j * mWidth)] = value;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -133,24 +143,23 @@ void GridTeamH::fillAternately(CellType initValue, bool fillBorder)
|
|||||||
auto otherValue = (initValue == CellType::alive) ? CellType::dead : CellType::alive;
|
auto otherValue = (initValue == CellType::alive) ? CellType::dead : CellType::alive;
|
||||||
|
|
||||||
if (fillBorder) {
|
if (fillBorder) {
|
||||||
for (size_t i{}; i < mData.size(); i++)
|
for (size_t i{}; i < mWidth; i++)
|
||||||
mData[i] = !(i % 2) ? initValue : otherValue;
|
for (size_t j{}; j < mHeight; ++j)
|
||||||
}
|
|
||||||
else {
|
|
||||||
for (size_t i{ 1 }; i < mWidth - 1; i++) {
|
|
||||||
for (size_t j{ 1 }; j < mHeight - 1; ++j) {
|
|
||||||
mData[i + (j * mWidth)] = !(i % 2) ? initValue : otherValue;
|
mData[i + (j * mWidth)] = !(i % 2) ? initValue : otherValue;
|
||||||
}
|
}
|
||||||
}
|
else {
|
||||||
|
for (size_t i{ 1 }; i < mWidth - 1; i++)
|
||||||
|
for (size_t j{ 1 }; j < mHeight - 1; ++j)
|
||||||
|
mData[i + (j * mWidth)] = !(i % 2) ? initValue : otherValue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void GridTeamH::randomize(double percentAlive, bool fillBorder)
|
void GridTeamH::randomize(double percentAlive, bool fillBorder)
|
||||||
{
|
{
|
||||||
if (fillBorder) {
|
if (fillBorder) {
|
||||||
for (auto& i : mData) {
|
for (size_t i{}; i < mWidth; i++)
|
||||||
i = static_cast<GridTeamH::CellType>(mDistribution(mEngine) < percentAlive);
|
for (size_t j{}; j < mHeight; ++j)
|
||||||
}
|
mData[i + (j * mWidth)] = static_cast<GridTeamH::CellType>(mDistribution(mEngine) < percentAlive);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
for (size_t i{ 1 }; i < mWidth - 1; i++) {
|
for (size_t i{ 1 }; i < mWidth - 1; i++) {
|
||||||
@ -163,11 +172,11 @@ void GridTeamH::randomize(double percentAlive, bool fillBorder)
|
|||||||
|
|
||||||
void GridTeamH::fillBorder(CellType value)
|
void GridTeamH::fillBorder(CellType value)
|
||||||
{
|
{
|
||||||
fillBorderManipulations(&mData.front(), value);
|
fillBorderManipulations(mData, value);
|
||||||
fillBorderManipulations(&mIntermediateData.front(), value);
|
fillBorderManipulations(mIntermediateData, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
void GridTeamH::fillBorderManipulations(CellType* ptr, CellType value) const
|
void GridTeamH::fillBorderManipulations(DataType ptr, CellType value) const
|
||||||
{
|
{
|
||||||
auto* e_ptr = ptr + (mWidth - 1);
|
auto* e_ptr = ptr + (mWidth - 1);
|
||||||
|
|
||||||
@ -214,7 +223,9 @@ void GridTeamH::fillBorderMirror()
|
|||||||
void GridTeamH::switchToIntermediate()
|
void GridTeamH::switchToIntermediate()
|
||||||
{
|
{
|
||||||
// Swap pour la performance.
|
// Swap pour la performance.
|
||||||
mData.swap(mIntermediateData);
|
auto* temp{ mData };
|
||||||
|
mData = mIntermediateData;
|
||||||
|
mIntermediateData = temp;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -15,7 +15,7 @@ class GridTeamH
|
|||||||
public:
|
public:
|
||||||
// Définition des types
|
// Définition des types
|
||||||
using CellType = GOL::State;
|
using CellType = GOL::State;
|
||||||
using DataType = std::vector<CellType>;
|
using DataType = CellType *;
|
||||||
|
|
||||||
// Définition des constructeurs / destructeur
|
// Définition des constructeurs / destructeur
|
||||||
GridTeamH();
|
GridTeamH();
|
||||||
@ -34,6 +34,7 @@ public:
|
|||||||
size_t aliveCount() const { return mAliveCount; }
|
size_t aliveCount() const { return mAliveCount; }
|
||||||
|
|
||||||
void resize(size_t width, size_t height, CellType initValue = CellType{});
|
void resize(size_t width, size_t height, CellType initValue = CellType{});
|
||||||
|
void dealloc();
|
||||||
|
|
||||||
// Accesseurs et mutateurs des cellules
|
// Accesseurs et mutateurs des cellules
|
||||||
CellType value(int column, int row) const;
|
CellType value(int column, int row) const;
|
||||||
@ -76,5 +77,5 @@ private:
|
|||||||
std::mt19937 mEngine;
|
std::mt19937 mEngine;
|
||||||
std::uniform_real_distribution<> mDistribution;
|
std::uniform_real_distribution<> mDistribution;
|
||||||
|
|
||||||
void fillBorderManipulations(CellType* ptr, CellType value) const;
|
void fillBorderManipulations(DataType ptr, CellType value) const;
|
||||||
};
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user