Fonction.cpp 2.05 KB
Newer Older
1
#include <Fonction.h>
2
3

bool RegleAvecEtatCourant::verify(const Voisinage& voisins, const Cellule& cellule) const {
4
	if(cellule.getIndEtat() != etatCourant)
5
6
		return false;

7
	int nb[8] = {0};
8

9
10
	auto *cellules = voisins.creerIterator();
	cellules->first();
11

12
	while(!cellules->isDone())
Romain De Laage De Bellefaye's avatar
Romain De Laage De Bellefaye committed
13
	{
14
		nb[cellules->currentItem()->getIndEtat()]++;
Romain De Laage De Bellefaye's avatar
Romain De Laage De Bellefaye committed
15
16
		cellules->next();
	}
17
18
19
20

	delete cellules;

	for(int i = 0; i < 8; ++i)
21
		if((seuilsMin[i] != -1 && nb[i] < seuilsMin[i]) || (seuilsMax[i] != -1 && nb[i] > seuilsMax[i]))
22
23
24
25
26
			return false;

	return true;
}

27
28
bool Regle::verify(const Voisinage& voisins, const Cellule& cellule) const {
	int nb[8] = {0};
29

30
31
	auto *cellules = voisins.creerIterator();
	cellules->first();
32

33
	while(!cellules->isDone())
Romain De Laage De Bellefaye's avatar
Romain De Laage De Bellefaye committed
34
	{
35
		nb[cellules->currentItem()->getIndEtat()]++;
Romain De Laage De Bellefaye's avatar
Romain De Laage De Bellefaye committed
36
37
		cellules->next();
	}
38
39
40
41

	delete cellules;

	for(int i = 0; i < 8; i++)
42
		if((seuilsMin[i] != -1 && nb[i] < seuilsMin[i]) || (seuilsMax[i] != -1 && nb[i] > seuilsMax[i]))
43
44
45
46
47
			return false;

	return true;
}

48
49
50
51
const Etat& Fonction::getEtatSuivant(const Voisinage& voisins, const Cellule& cellule) const {
	for(const auto& regle: regles)
		if (regle->verify(voisins, cellule))
			return regle->getDestination();
52
53
54

	return etatDefaut;
}
55

56
void Fonction::ajouterRegle(const Etat& destination, const int seuilsMin[8], const int seuilsMax[8]) {
57
	regles.push_back(new Regle(destination, seuilsMin, seuilsMax));
58
59
}

60
61
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));
62
63
64
}

Fonction::~Fonction() {
65
66
	for(auto& regle: regles)
		delete regle;
67
68
}

69
Regle::Regle(const Etat& nDestination, const int nSeuilsMin[8], const int nSeuilsMax[8]): destination(nDestination) {
70
71
72
73
74
75
76
	for(int i = 0; i < 8; ++i)
		seuilsMin[i] = nSeuilsMin[i];

	for(int i = 0; i < 8; ++i)
		seuilsMax[i] = nSeuilsMax[i];
}

77
RegleAvecEtatCourant::RegleAvecEtatCourant(const Etat& nDestination, const int nSeuilsMin[8], const int nSeuilsMax[8], const int nEtat): Regle(nDestination, nSeuilsMin, nSeuilsMax), etatCourant(nEtat) {
78
}