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

Make EnsembleEtat not singleton

parent a1fdc1f5
......@@ -24,6 +24,7 @@ class Automate {
int year;
std::string author;
std::string desc;
EnsembleEtat ensemble;
Automate(): title(""), delai(500), fonction(nullptr), regleVoisinage(nullptr), itBuffer(buffer.begin()), h(0), l(0), reseauInit(Reseau(0, 0)), year(2000), author("Anonym"), desc("") { timer.automate = this; }
Automate(const Automate& a) = delete;
......@@ -77,6 +78,10 @@ class Automate {
/// Définir le délai entre 2 itérations de l'automate en mode Timer
void setDelai(const unsigned int d) { delai = d; }
/// Accesseur ensemble états
EnsembleEtat& getEnsemble() { return ensemble; }
/// Accesseur ensemble états
const EnsembleEtat& getEnsemble() const { return ensemble; }
/// définir la hauteur de la grille
void setHauteur(unsigned int hauteur) { h = hauteur; }
/// définir la largheur de la grille
......
......@@ -23,8 +23,6 @@
using namespace std;
extern EnsembleEtat& enseEtats;
class AutoCell : public QWidget
{
......
......@@ -20,15 +20,16 @@ class Database {
Database(std::string path);
~Database() { db.close(); }
std::vector<QString> getAutomates() const;
Fonction* getFonction(const QString& name) const;
Fonction* getFonction(Automate& a) const;
RegleVoisinage* getRegleVoisinage(const QString& name) const;
std::vector<QString> getListeReseaux(const QString& name) const;
Reseau& getReseau(int idReseau) const;
void stockerReseau(const Reseau& reseau, const QString& nomReseau, const QString& nomAutomate) const;
void initEnsEtat(const QString& name) const;
void initEnsEtat(Automate& a) const;
void saveAutomaton(const Automate& a) const;
void saveFunction(const QString& name, const Fonction& f) const;
void saveVoisinage(const QString& name, const RegleVoisinage& r) const;
void saveEnsemble(Automate& a) const;
};
#endif
......@@ -47,22 +47,14 @@ private: //permet d'éviter que chaque cellule inclue une instance d'Et
size_t nbEtats = 0;
static const size_t nbEtatsMax = 10;
Etat* ensEtats[nbEtatsMax];
struct Handler {
EnsembleEtat* instance=nullptr;
~Handler() { delete instance; }
};
static Handler handler;
friend struct Handler;
EnsembleEtat();
~EnsembleEtat();
EnsembleEtat(const EnsembleEtat&) = delete;
EnsembleEtat operator=(const EnsembleEtat&) = delete;
public:
EnsembleEtat();
~EnsembleEtat();
void ajouterEtat(unsigned int ind, std::string lab,int r = 0, int g = 0, int b = 0);
void supprimerEtat(const unsigned int ind);
static EnsembleEtat& getInstance();
static void libererInstance();
void initEtat(const Etat* init_etats = nullptr);//initialisation du tableau d'Etats à partir d'un tableau externe
Etat& getEtat(const unsigned int &ind){return *ensEtats[ind];}
unsigned int getNbEtats() const {return nbEtats;};
......@@ -83,5 +75,4 @@ public:
Reseau(const unsigned int &h, const unsigned int &l);
Reseau(const Reseau&);
~Reseau();
void affiche();
};
......@@ -263,7 +263,6 @@ INSERT INTO reseaux VALUES(
INSERT INTO Cellules VALUES(
2,
3,
0,
0,
0
......@@ -271,7 +270,6 @@ INSERT INTO Cellules VALUES(
INSERT INTO Cellules VALUES(
2,
3,
2,
1,
0
......@@ -279,7 +277,6 @@ INSERT INTO Cellules VALUES(
INSERT INTO Cellules VALUES(
2,
3,
1,
2,
0
......@@ -287,7 +284,6 @@ INSERT INTO Cellules VALUES(
INSERT INTO Cellules VALUES(
2,
3,
1,
3,
0
......@@ -295,7 +291,6 @@ INSERT INTO Cellules VALUES(
INSERT INTO Cellules VALUES(
2,
3,
0,
4,
0
......@@ -303,7 +298,6 @@ INSERT INTO Cellules VALUES(
INSERT INTO Cellules VALUES(
2,
3,
2,
0,
1
......@@ -312,14 +306,12 @@ INSERT INTO Cellules VALUES(
INSERT INTO Cellules VALUES(
2,
3,
3,
1,
1
);
INSERT INTO Cellules VALUES(
2,
3,
1,
2,
1
......@@ -329,13 +321,11 @@ INSERT INTO Cellules VALUES(
2,
3,
3,
3,
1
);
INSERT INTO Cellules VALUES(
2,
3,
2,
4,
1
......@@ -343,7 +333,6 @@ INSERT INTO Cellules VALUES(
INSERT INTO Cellules VALUES(
2,
3,
2,
0,
2
......@@ -351,7 +340,6 @@ INSERT INTO Cellules VALUES(
INSERT INTO Cellules VALUES(
2,
3,
1,
1,
2
......@@ -359,7 +347,6 @@ INSERT INTO Cellules VALUES(
INSERT INTO Cellules VALUES(
2,
3,
1,
2,
2
......@@ -367,7 +354,6 @@ INSERT INTO Cellules VALUES(
INSERT INTO Cellules VALUES(
2,
3,
2,
3,
2
......@@ -375,7 +361,6 @@ INSERT INTO Cellules VALUES(
INSERT INTO Cellules VALUES(
2,
3,
2,
4,
2
......@@ -384,14 +369,12 @@ INSERT INTO Cellules VALUES(
INSERT INTO Cellules VALUES(
2,
3,
3,
0,
3
);
INSERT INTO Cellules VALUES(
2,
3,
0,
1,
3
......@@ -399,7 +382,6 @@ INSERT INTO Cellules VALUES(
INSERT INTO Cellules VALUES(
2,
3,
1,
2,
3
......@@ -407,7 +389,6 @@ INSERT INTO Cellules VALUES(
INSERT INTO Cellules VALUES(
2,
3,
1,
3,
3
......@@ -416,14 +397,12 @@ INSERT INTO Cellules VALUES(
INSERT INTO Cellules VALUES(
2,
3,
3,
4,
3
);
INSERT INTO Cellules VALUES(
2,
3,
0,
0,
4
......@@ -431,7 +410,6 @@ INSERT INTO Cellules VALUES(
INSERT INTO Cellules VALUES(
2,
3,
1,
1,
4
......@@ -439,7 +417,6 @@ INSERT INTO Cellules VALUES(
INSERT INTO Cellules VALUES(
2,
3,
0,
2,
4
......@@ -447,7 +424,6 @@ INSERT INTO Cellules VALUES(
INSERT INTO Cellules VALUES(
2,
3,
2,
3,
4
......@@ -457,6 +433,5 @@ INSERT INTO Cellules VALUES(
2,
3,
3,
3,
4
);
......@@ -101,7 +101,6 @@ INSERT INTO reseaux VALUES(
INSERT INTO Cellules VALUES(
1,
2,
0,
0,
0
......@@ -109,7 +108,6 @@ INSERT INTO Cellules VALUES(
INSERT INTO Cellules VALUES(
1,
2,
0,
1,
0
......@@ -117,7 +115,6 @@ INSERT INTO Cellules VALUES(
INSERT INTO Cellules VALUES(
1,
2,
0,
2,
0
......@@ -125,7 +122,6 @@ INSERT INTO Cellules VALUES(
INSERT INTO Cellules VALUES(
1,
2,
1,
0,
1
......@@ -133,7 +129,6 @@ INSERT INTO Cellules VALUES(
INSERT INTO Cellules VALUES(
1,
2,
1,
1,
1
......@@ -141,7 +136,6 @@ INSERT INTO Cellules VALUES(
INSERT INTO Cellules VALUES(
1,
2,
1,
2,
1
......@@ -149,7 +143,6 @@ INSERT INTO Cellules VALUES(
INSERT INTO Cellules VALUES(
1,
2,
0,
0,
2
......@@ -157,7 +150,6 @@ INSERT INTO Cellules VALUES(
INSERT INTO Cellules VALUES(
1,
2,
0,
1,
2
......@@ -165,7 +157,6 @@ INSERT INTO Cellules VALUES(
INSERT INTO Cellules VALUES(
1,
2,
0,
2,
2
......
......@@ -303,7 +303,6 @@ INSERT INTO reseaux VALUES(
);
INSERT INTO Cellules VALUES(
1,
1,
2,
0,
......@@ -311,7 +310,6 @@ INSERT INTO Cellules VALUES(
);
INSERT INTO Cellules VALUES(
1,
1,
2,
0,
......@@ -319,7 +317,6 @@ INSERT INTO Cellules VALUES(
);
INSERT INTO Cellules VALUES(
1,
1,
2,
0,
......@@ -327,7 +324,6 @@ INSERT INTO Cellules VALUES(
);
INSERT INTO Cellules VALUES(
1,
1,
2,
0,
......@@ -335,7 +331,6 @@ INSERT INTO Cellules VALUES(
);
INSERT INTO Cellules VALUES(
1,
1,
2,
1,
......@@ -343,7 +338,6 @@ INSERT INTO Cellules VALUES(
);
INSERT INTO Cellules VALUES(
1,
1,
0,
1,
......@@ -352,7 +346,6 @@ INSERT INTO Cellules VALUES(
INSERT INTO Cellules VALUES(
1,
1,
0,
1,
2
......@@ -360,7 +353,6 @@ INSERT INTO Cellules VALUES(
INSERT INTO Cellules VALUES(
1,
1,
2,
1,
3
......@@ -368,7 +360,6 @@ INSERT INTO Cellules VALUES(
INSERT INTO Cellules VALUES(
1,
1,
2,
2,
0
......@@ -376,7 +367,6 @@ INSERT INTO Cellules VALUES(
INSERT INTO Cellules VALUES(
1,
1,
0,
2,
1
......@@ -384,7 +374,6 @@ INSERT INTO Cellules VALUES(
INSERT INTO Cellules VALUES(
1,
1,
0,
2,
2
......@@ -392,7 +381,6 @@ INSERT INTO Cellules VALUES(
INSERT INTO Cellules VALUES(
1,
1,
2,
2,
3
......@@ -400,7 +388,6 @@ INSERT INTO Cellules VALUES(
INSERT INTO Cellules VALUES(
1,
1,
2,
3,
0
......@@ -408,7 +395,6 @@ INSERT INTO Cellules VALUES(
INSERT INTO Cellules VALUES(
1,
1,
2,
3,
1
......@@ -416,7 +402,6 @@ INSERT INTO Cellules VALUES(
INSERT INTO Cellules VALUES(
1,
1,
2,
3,
2
......@@ -424,7 +409,6 @@ INSERT INTO Cellules VALUES(
INSERT INTO Cellules VALUES(
1,
1,
2,
3,
3
......
......@@ -42,7 +42,6 @@ CREATE TABLE IF NOT EXISTS Etats (
CREATE TABLE IF NOT EXISTS Cellules (
reseau INTEGER NOT NULL,
ensemble INTEGER NOT NULL,
etat INTEGER NOT NULL,
x INTEGER NOT NULL,
y INTEGER NOT NULL,
......
#include "autocell.h"
#include "reseau_cellule_etats.h"
#include "autosql.h"
#include "Automate.h"
#include "parametragemodele.h"
#include <autocell.h>
#include <reseau_cellule_etats.h>
#include <autosql.h>
#include <Automate.h>
#include <parametragemodele.h>
#include <QApplication>
#include <QPushButton>
......@@ -30,8 +30,6 @@
#include <iostream>
#include <iomanip>
extern EnsembleEtat& enseEtats;
using namespace std;
std::unique_ptr<AutoCell> AutoCell::instance = nullptr;
......@@ -233,14 +231,14 @@ void AutoCell::afficherGrille(Reseau* Grille)
//vérifier si les cellules ont ou non été générés (!= nullptr)
QString indice; indice.setNum(Grille->getReseau()[i][j].getIndEtat());
QString label; label = QString::fromStdString(enseEtats.getEtat(indice.toInt()).getLabel()); //label de la cellule
QString label; label = QString::fromStdString(Automate::getInstance().getEnsemble().getEtat(indice.toInt()).getLabel()); //label de la cellule
grid->setItem(i, j, new QTableWidgetItem(indice));
grid->item(i,j)->setFlags(Qt::ItemIsEnabled);
//afficherCellule
QColor color; color = enseEtats.getEtat(indice.toInt()).getColor();
QColor color; color = Automate::getInstance().getEnsemble().getEtat(indice.toInt()).getColor();
QBrush brush_color;
brush_color.setColor(color);
......@@ -322,7 +320,7 @@ void AutoCell::modifierCellule(const QModelIndex& index) {
QString str_indice ; str_indice.setNum(indice, 10);
QColor color; color = enseEtats.getEtat(indice).getColor();
QColor color; color = Automate::getInstance().getEnsemble().getEtat(indice).getColor();
QBrush brush_color;
brush_color.setColor(color);
......
#include <iostream>
#include <autosql.h>
extern EnsembleEtat& enseEtats;
Database::Database(std::string path): db(QSqlDatabase::addDatabase("QSQLITE")) {
db.setDatabaseName(path.c_str());
if (!db.open()) {
......@@ -40,17 +38,17 @@ std::vector<QString> Database::getAutomates() const {
return names;
}
void Database::initEnsEtat(const QString& name) const {
void Database::initEnsEtat(Automate& a) const {
QSqlQuery query(db);
query.prepare("SELECT indice, label, r, g, b FROM Etats INNER JOIN EnsembleEtats ON Etats.ensemble = EnsembleEtats.id WHERE automate = :nom");
query.bindValue(":nom", name);
query.bindValue(":nom", a.getTitle().c_str());
query.exec();
if(!query.first())
throw "Unable to select this object";
EnsembleEtat& ens = EnsembleEtat::getInstance();
EnsembleEtat& ens = a.getEnsemble();
ens.reset();
do {
......@@ -67,20 +65,20 @@ void Database::initEnsEtat(const QString& name) const {
/// Retourne la fonction de transition d'un automate par son nom
///
/// Une règle prend en compte l'état courant seulement s'il est défini à non nul dans la BDD
Fonction* Database::getFonction(const QString& name) const {
Fonction* Database::getFonction(Automate& a) const {
QSqlQuery query(db);
query.prepare("SELECT defaut FROM automates WHERE nom = :nom");
query.bindValue(":nom", name);
query.bindValue(":nom", a.getTitle().c_str());
query.exec();
if(!query.first())
throw "Unable to select this object";
Fonction* fonction = new Fonction(enseEtats.getEtat(query.value("defaut").toInt()));
Fonction* fonction = new Fonction(a.getEnsemble().getEtat(query.value("defaut").toInt()));
query.prepare("SELECT * FROM regles_transition WHERE id = :id");
query.bindValue(":id", name);
query.bindValue(":id", a.getTitle().c_str());
query.exec();
if(!query.first())
......@@ -140,9 +138,9 @@ Fonction* Database::getFonction(const QString& name) const {
}
if(query.isNull("courant")) { // on ne prend pas en compte l'état courant
fonction->ajouterRegle(enseEtats.getEtat(query.value("destination").toInt()), min, max);
fonction->ajouterRegle(a.getEnsemble().getEtat(query.value("destination").toInt()), min, max);
} else {
fonction->ajouterRegle(enseEtats.getEtat(query.value("destination").toInt()), min, max, query.value("courant").toInt());
fonction->ajouterRegle(a.getEnsemble().getEtat(query.value("destination").toInt()), min, max, query.value("courant").toInt());
}
} while (query.next());
......@@ -228,31 +226,7 @@ std::vector<QString> Database::getListeReseaux(const QString& name) const
/// Cette fonction réinitialise le singleton EnsembleEtat avec des valeurs contenues dans la BDD, afin de retourner un réseau à partir des valeurs stockées dans la BDD.
/// @param idReseau correspond à la clé primaire du réseau dans la BDD, il est conseillé de l'avoir récupérée avec getListeReseaux() auparavant
Reseau& Database::getReseau(int idReseau) const
{
QSqlQuery ensemble(db);
ensemble.prepare("SELECT * FROM EnsembleEtats WHERE reseau = :id");
ensemble.bindValue(":id", idReseau);
ensemble.exec();
//récuperation de l'identifiant de l'ensemble d'états lié au réseau
int idEnsemble = ensemble.value("id").toInt();
//récupération des états de l'ensemble
QSqlQuery etats(db);
etats.prepare("SELECT * FROM Etats WHERE ensemble = :id");
etats.bindValue(":id", idEnsemble);
etats.exec();
//reset et remplissage du singleton de l'ensemble d'état
enseEtats.reset();
if(etats.first()) {
enseEtats.ajouterEtat(etats.value("indice").toUInt(), etats.value("label").toString().toStdString(), etats.value("r").toInt(), etats.value("g").toInt(), etats.value("b").toInt());
}
while(etats.next()) {
enseEtats.ajouterEtat(etats.value("indice").toUInt(), etats.value("label").toString().toStdString(), etats.value("r").toInt(), etats.value("g").toInt(), etats.value("b").toInt());
}
Reseau& Database::getReseau(int idReseau) const {
//initialisation du réseau de retour
QSqlQuery reseau(db);
reseau.prepare("SELECT * FROM reseaux WHERE id = :id");
......@@ -266,9 +240,8 @@ Reseau& Database::getReseau(int idReseau) const
for(size_t j = 0; j<reseau.value("l").toUInt(); j++)
{
QSqlQuery cellule(db);
cellule.prepare("SELECT etat FROM Cellules WHERE (reseau = :id AND ensemble = :idE AND x = :i AND y = :j)");
cellule.prepare("SELECT etat FROM Cellules WHERE (reseau = :id AND x = :i AND y = :j)");
cellule.bindValue(":id", idReseau);
cellule.bindValue(":idE", idEnsemble);
cellule.bindValue(":i", static_cast<int>(i));
cellule.bindValue(":j", static_cast<int>(j));
cellule.exec();
......@@ -430,36 +403,13 @@ void Database::saveVoisinage(const QString& name, const RegleVoisinage& r) const
}
}
///Cette fonction permet de stocker un réseau dans la BDD
///@param reseau est le réseau à stocker
///@param nomReseau est le nom du réseau à stocker
///@param nomAutomate est le nom de l'automate en cours
void Database::stockerReseau(const Reseau& reseau, const QString& nomReseau, const QString& nomAutomate) const
{
//Tout d'abord, on a besoin de créer un tuple dans la table reseaux :
//toutes les autres tables l'ont en clé étrangère !
//Il nous faut donc : id, nom, h, l, automate --> tout est en paramètre ou dans reseau (avec getH, getL) sauf l'id à recréer
//Création de l'id du nouveau réseau
QSqlQuery query(db);
query.prepare("SELECT COUNT(*) FROM reseaux");
query.exec();
int idReseau = query.value(0).toInt() + 1;
//Insertion du tuple dans reseaux
query.prepare("INSERT INTO reseaux VALUES (:id, ':nom', :h, :l, ':automate')");
query.bindValue(":id", idReseau);
query.bindValue(":nom", nomReseau);
query.bindValue(":h", reseau.getHauteur());
query.bindValue(":l", reseau.getLargeur());
query.bindValue(":automate", nomAutomate);