Verified Commit e224a87c authored by Romain De Laage De Bellefaye's avatar Romain De Laage De Bellefaye 🌳
Browse files

Use virtual method and heritage for Function (no more FonctionAvecEtatCourant)

parent 109ea27a
......@@ -4,7 +4,7 @@ bool RegleAvecEtatCourant::verify(const Voisinage& voisins, const Cellule& cellu
if(cellule.getIndEtat() != etatCourant)
return false;
int nb[8];
int nb[8] = {0};
auto *cellules = voisins.creerIterator();
cellules->first();
......@@ -21,8 +21,8 @@ bool RegleAvecEtatCourant::verify(const Voisinage& voisins, const Cellule& cellu
return true;
}
bool Regle::verify(const Voisinage& voisins) const {
int nb[8];
bool Regle::verify(const Voisinage& voisins, const Cellule& cellule) const {
int nb[8] = {0};
auto *cellules = voisins.creerIterator();
cellules->first();
......@@ -39,58 +39,25 @@ bool Regle::verify(const Voisinage& voisins) const {
return true;
}
const Etat& Fonction::getEtatSuivant(const Voisinage& voisins) const {
for(int i = 0; i < nbRegles; ++i)
if (regles[i]->verify(voisins))
return regles[i]->getDestination();
return etatDefaut;
}
const Etat& FonctionAvecEtatCourant::getEtatSuivant(const Voisinage& voisins, const Cellule& cellule) const {
for(int i = 0; i < nbRegles; ++i)
if (regles[i]->verify(voisins, cellule))
return regles[i]->getDestination();
const Etat& Fonction::getEtatSuivant(const Voisinage& voisins, const Cellule& cellule) const {
for(const auto& regle: regles)
if (regle->verify(voisins, cellule))
return regle->getDestination();
return etatDefaut;
}
void Fonction::ajouterRegle(const Etat& destination, const int seuilsMin[8], const int seuilsMax[8]) {
Regle** nouveau = new Regle*[nbRegles + 1];
for(int i = 0; i < nbRegles; ++i)
nouveau[i] = regles[i];
nouveau[nbRegles] = new Regle(destination, seuilsMin, seuilsMax);
++nbRegles;
delete[] regles;
regles = nouveau;
regles.push_back(new Regle(destination, seuilsMin, seuilsMax));
}
void FonctionAvecEtatCourant::ajouterRegle(const Etat& destination, const int seuilsMin[8], const int seuilsMax[8], const int etat) {
RegleAvecEtatCourant** nouveau = new RegleAvecEtatCourant*[nbRegles + 1];
for(int i = 0; i < nbRegles; ++i)
nouveau[i] = regles[i];
nouveau[nbRegles] = new RegleAvecEtatCourant(destination, seuilsMin, seuilsMax, etat);
++nbRegles;
delete[] regles;
regles = nouveau;
void Fonction::ajouterRegle(const Etat& destination, const int seuilsMin[8], const int seuilsMax[8], const int etat) {
regles.push_back(new RegleAvecEtatCourant(destination, seuilsMin, seuilsMax, etat));
}
Fonction::~Fonction() {
for(int i = 0; i < nbRegles; ++i)
delete regles[i];
delete[] regles;
}
FonctionAvecEtatCourant::~FonctionAvecEtatCourant() {
for(int i = 0; i < nbRegles; ++i)
delete regles[i];
delete[] regles;
for(auto& regle: regles)
delete regle;
}
Regle::Regle(const Etat& nDestination, const int nSeuilsMin[8], const int nSeuilsMax[8]): destination(nDestination) {
......
#ifndef _FONCTION_H
#define _FONCTION_H
#include <memory>
#include "../Reseau_Cellule_Etat/reseau_cellule_etats.h"
#include "../Voisinage/voisinage.hpp"
......@@ -14,13 +15,14 @@ class Regle {
public:
Regle(const Etat& nDestination, const int nSeuilsMax[8], const int nSeuilsMin[8]);
virtual ~Regle() = default;
const Etat& getDestination() const { return destination; }
bool verify(const Voisinage& voisins) const;
virtual bool verify(const Voisinage& voisins, const Cellule& cellule) const;
};
class RegleAvecEtatCourant: public Regle {
private:
int etatCourant;
unsigned int etatCourant;
public:
RegleAvecEtatCourant(const Etat& nDestination, const int nSeuilsMax[8], const int nSeuilsMin[8], const int nEtat);
......@@ -29,32 +31,17 @@ class RegleAvecEtatCourant: public Regle {
class Fonction {
private:
std::list<Regle*> regles;
Etat etatDefaut;
Regle** regles;
int nbRegles;
public:
Fonction(const Etat& etat):regles(nullptr),nbRegles(0),etatDefaut(etat){}
~Fonction();
Fonction(const Etat& etat):etatDefaut(etat){}
virtual ~Fonction();
const Etat& getEtatDefaut() const { return etatDefaut; }
void setEtatDefaut(const Etat& nouveau) { etatDefaut = nouveau; }
void ajouterRegle(const Etat& destination, const int seuilsMin[8], const int seuilsMax[8]);
const Etat& getEtatSuivant(const Voisinage& voisins) const;
};
class FonctionAvecEtatCourant {
private:
Etat etatDefaut;
RegleAvecEtatCourant** regles;
int nbRegles;
public:
FonctionAvecEtatCourant(const Etat& etat):regles(nullptr),nbRegles(0),etatDefaut(etat){}
~FonctionAvecEtatCourant();
const Etat& getEtatDefaut() const { return etatDefaut; }
void setEtatDefaut(const Etat& nouveau) { etatDefaut = nouveau; }
void ajouterRegle(const Etat& destination, const int seuilsMin[8], const int seuilsMax[8], const int etat);
const Etat& getEtatSuivant(const Voisinage& voisins, const Cellule& cellule) const;
virtual const Etat& getEtatSuivant(const Voisinage& voisins, const Cellule& cellule) const;
};
#endif
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment