Automate.h 6.77 KB
Newer Older
1
2
3
4
#ifndef _AUTOMATE_H
#define _AUTOMATE_H

#include <memory>
5
6
#include <Fonction.h>
#include <voisinage.h>
7
#include <QObject>
Romain De Laage De Bellefaye's avatar
Romain De Laage De Bellefaye committed
8
#include <autocell.h>
9

10
11
12
/// La classe automate se charge de gérer les informations d'un automate (fonction de transition, règle de voisinage, réseau, ...) et joue également le rôle de simulateur
///
/// Cette classe est un singletion est l'objet unique n'est disponible qu'avec la méthode statique getInstance(). Ainsi, il est impossible de créer des objets de cette classe. La classe agrège une fonction et une règle de voisinage dont l'utilisateur a la responsabilité. Il est également possible de laisser l'automate simuler avec un délai réglable.
13
14
15
class Automate {
	private:
		static std::unique_ptr<Automate> instance;
16
		std::string title;
17
		unsigned int delai;
18
19
		std::unique_ptr<Fonction> fonction;
		std::unique_ptr<RegleVoisinage> regleVoisinage;
20
21
22
23
		std::list<Reseau> buffer;
		std::list<Reseau>::iterator itBuffer;
		unsigned int h;
		unsigned int l;
24
		Reseau reseauInit;
25
26
27
		int year;
		std::string author;
		std::string desc;
28
		EnsembleEtat ensemble;
29
30
		int nbStep;
		int nbCycle;
31

32
		Automate(): title(""), delai(500), fonction(nullptr), regleVoisinage(nullptr), itBuffer(buffer.begin()), h(0), l(0), reseauInit(Reseau(0, 0)), year(2000), author("Anonym"), desc(""), nbStep(0), nbCycle(0) { timer.automate = this; }
33
34
		Automate(const Automate& a) = delete;
		Automate& operator=(const Automate& a) = delete;
35
36
37
38
		class Timer: public QObject {
			private:
				int timerID;
				Automate *automate;
39
				Timer(): timerID(0) {}
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
				~Timer() { destroy(); }

			protected:
				void timerEvent(QTimerEvent *event) { automate->step(); }

			public:
				void install(const int delai) {
					if(timerID != 0)
						destroy();

					timerID = startTimer(delai);
					if(timerID == 0)
						throw "Unable to install timer";
				}
				void destroy() {
					if(timerID != 0)
						killTimer(timerID);
				}

			friend class Automate;
		};
61
		Timer timer;
62
63

	public:
64
		~Automate() = default;
65
		/// récupérer une référence sur l'instance unique du singleton Automate
66
67
68
69
70
71
72
		static Automate& getInstance() {
			if(instance == nullptr) {
				instance.reset(new Automate);
			}

			return *instance;
		}
Romain De Laage De Bellefaye's avatar
Romain De Laage De Bellefaye committed
73
74
75
		/// Définir la fonction de transition de l'automate
		///
		/// L'objet est géré dynamiquement par l'utilisateur mais une fois donnné à l'automate il gère son cycle de vie
76
		/// @param[in] f pointeur vers la Fonction à associer
77
		void setFonction(Fonction* f) { fonction.reset(f); }
78
		/// Récupérer la fonction de transition
Leon Do Castelo's avatar
Leon Do Castelo committed
79
		Fonction& getFonction() const { return *fonction; }
Romain De Laage De Bellefaye's avatar
Romain De Laage De Bellefaye committed
80
81
82
		/// Définir une règle de voisinage
		///
		/// L'objet est géré dynamiquement par l'utilisateur mais une fois donnné à l'automate il gère son cycle de vie
83
		/// @param[in] r pointeur vers la RegleVoisinga à associer
84
		void setRegleVoisinage(RegleVoisinage* r) { regleVoisinage.reset(r); }
85
		/// Récupérer la règle de voisinage
Romain De Laage De Bellefaye's avatar
Revert  
Romain De Laage De Bellefaye committed
86
		const RegleVoisinage& getRegleVoisinage() const { return *regleVoisinage; }
87
		/// Définir le délai entre 2 itérations de l'automate en mode Timer
88
		/// @param[in] d nouveau délai
89
		void setDelai(const unsigned int d) { delai = d; }
90

91
92
93
94
		/// Accesseur ensemble états
		EnsembleEtat& getEnsemble() { return ensemble; }
		/// Accesseur ensemble états
		const EnsembleEtat& getEnsemble() const { return ensemble; }
95
		/// définir la hauteur de la grille
96
		/// @param[in] hauteur Définir la hauteur des Reseau de la simulation
97
98
		void setHauteur(unsigned int hauteur) { h = hauteur; }
		/// définir la largheur de la grille
99
		/// @param[in] largeur Définir la largeur des Reseau de la simulation
100
101
102
		void setLargeur(unsigned int largeur) { l = largeur; }

		/// Se placer sur l'état précédent si disponible
Romain De Laage De Bellefaye's avatar
Romain De Laage De Bellefaye committed
103
		void previous() {
104
			if(itBuffer!=buffer.begin()) {
Romain De Laage De Bellefaye's avatar
Romain De Laage De Bellefaye committed
105
				itBuffer--;
106
107
108
109
				AutoCell::getInstance().afficherGrille(&*itBuffer);
			}
			else
				throw "No more state available before in the buffer (max: 15)";
Romain De Laage De Bellefaye's avatar
Romain De Laage De Bellefaye committed
110
		}
111
		/// Se placer sur l'état suivant si disponible
Romain De Laage De Bellefaye's avatar
Romain De Laage De Bellefaye committed
112
		void next() { if(itBuffer!=(--buffer.end())) itBuffer++; }
113
		/// On vide la buffer et on l'initialise avec une première grille
Leon Do Castelo's avatar
Leon Do Castelo committed
114
		void reset() { buffer.clear(); buffer.push_back(reseauInit); nbStep = 0 ; nbCycle = 0;}
115
116

		/// Se placer sur l'état suivant du buffer et le calculer s'il n'y en a plus de disponible
117
		void step();
118
		/// Execution multiple de la méthode step
119
		/// @param[in] n nombre de fois à exécuter
120
121
122
123
		void run(int n) {
			for(int i=0;i<n;i++)
				step();
		}
124

125
		/// Calcule d'une nouvelle étape à partir de la dernière
Leon Do Castelo's avatar
Leon Do Castelo committed
126
		void nextTimer();
127

128
129
130
131
		/// Démarre l'exécution automatique de l'automate avec une vitesse selon l'attribut delai s'il n'est pas déjà en route
		void start() { timer.install(delai); }
		/// Supprime le timer s'il est en route
		void pause() { timer.destroy(); }
Leon Do Castelo's avatar
Leon Do Castelo committed
132

133
		/// Récupérer un réseau correspondant à l'état courant de l'automate
Leon Do Castelo's avatar
Leon Do Castelo committed
134
		Reseau getReseauCourant() { return *itBuffer; }
135

136
		/// initialiser le buffer s'il est vide avec un réseau
137
		void initialiserBuffer() { buffer.clear(); buffer.push_front(reseauInit); itBuffer = buffer.begin(); }
138

139
		/// Définir le réseau initial de l'automate
140
		/// @param[in] r nouveau Reseau initial
Romain De Laage De Bellefaye's avatar
Romain De Laage De Bellefaye committed
141
		void setReseauInit(Reseau& r) { reseauInit = r; h = r.getHauteur(); l = r.getLargeur(); }
142
		/// Récupérer le réseau initial de l'automate
143
		const Reseau& getReseauInit() const { return reseauInit; }
144
145
146
		/// Récupérer le nom de l'automate
		std::string getTitle() const { return title; }
		/// Redéfinir le nom de l'automate
147
		/// @param[in] t nouveau titre
148
149
150
151
		void setTitle(const std::string& t) { title = t; }
		/// Récupérer le nom de l'auteur
		std::string getAuthor() const { return author; }
		/// Redéfinir le nom de l'auteur
152
		/// @param[in] a nouvel auteur
153
154
155
156
		void setAuthor(const std::string& a) { author = a; }
		/// Récupérer la description
		std::string getDesc() const { return desc; }
		/// Redéfinir la description
157
		/// @param[in] d description
158
159
160
		void setDesc(const std::string& d) { desc = d; }
		/// Récupérer l'année
		int getYear() const { return year; }
161
162
		/// Redéfinir l'année de l'Automate
		/// @param[in] y année
163
		void setYear(const int y) { year = y; }
Leon Do Castelo's avatar
Leon Do Castelo committed
164

Romain De Laage De Bellefaye's avatar
Romain De Laage De Bellefaye committed
165
		/// Réinitialiser totalement la configuration de l'automate
Leon Do Castelo's avatar
Leon Do Castelo committed
166
		void reinitialiserAutomate();
167
168

		/// Définir le comportement aux frontières
169
		/// @param[in] val valeur du comportement aux frontière (true = matrice torique, false = ignorer)
170
		void setMatriceTorique(const bool val) { regleVoisinage->setMatriceTorique(val); }
Romain De Laage De Bellefaye's avatar
Romain De Laage De Bellefaye committed
171
		/// Obtenir le comportement aux frontières
172
		bool getMatriceTorique() { return regleVoisinage->getMatriceTorique(); }
173

Romain De Laage De Bellefaye's avatar
Romain De Laage De Bellefaye committed
174
		/// Obtenir le nombre d'étapes effectuées
175
		int getNbStep() const { return nbStep; }
Romain De Laage De Bellefaye's avatar
Romain De Laage De Bellefaye committed
176
177
178
		/// Obtenir le nombre d'étapes nécessaires pour effectuer un cycle
		///
		/// Retourne 0 s'il n'a pas encore pu être calculé
179
		int getNbCycle() const { return nbCycle; }
180
181
182
};

#endif