-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathfabriquedonnee.cpp
84 lines (68 loc) · 2.45 KB
/
fabriquedonnee.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
#include "fabriquedonnee.h"
#include <QStringList>
#include <QMessageBox>
#include <typeinfo>
#include "logsystem.h"
// Initialisation du membre statique du singleton
FabriqueDonnee* FabriqueDonnee::instance = 0;
FabriqueDonnee* FabriqueDonnee::getInstance()
{
if (!instance) instance = new FabriqueDonnee;
return instance;
}
void FabriqueDonnee::libereInstance()
{
if (instance) delete instance;
}
Donnee* FabriqueDonnee::creerDonnee(const QString& terme)
{
if(Donnee::isExpression(terme)){
return new ConstanteExp(terme);}
if(Donnee::isComplexe(terme))
{
QStringList nombres = terme.split("$");
// Static cast car on est SUR que l'on n'obtiendra jamais une ConstanteExp, et donc que le résultat sera toujours de type Constante!
Constante* pRe = static_cast<Constante*>(creerDonnee(nombres[0]));
Constante* pIm = static_cast<Constante*>(creerDonnee(nombres[1]));
return new Complexe(pRe, pIm);
}
if(Donnee::isEntier(terme)){
return new Entier(terme);}
if(Donnee::isReel(terme)){
return new Reel(terme);}
if(Donnee::isRationnel(terme))
{
try{
return new Rationnel(terme);
}
catch (ExceptionCooCoo &e) {
QMessageBox msgBox;
msgBox.setText(e.GetInfos());
msgBox.exec();
LogSystem::imprim(LogMessage("Construction de rationnel impossible", 3));
}
return NULL;
}
if(Donnee::isComplexe(terme))
{
return new Complexe(terme);
}
else
return NULL;
}
Donnee* FabriqueDonnee::creerDonnee(const Donnee* donneeDepart, int typeSouhaite, int complexe)
{
if (typeid(*donneeDepart)==typeid(Entier))
return creerDonneeStatic(static_cast<const Entier*>(donneeDepart), typeSouhaite, complexe);
if (typeid(*donneeDepart)==typeid(Reel))
return creerDonneeStatic(static_cast<const Reel*>(donneeDepart), typeSouhaite, complexe);
if (typeid(*donneeDepart)==typeid(Rationnel))
return creerDonneeStatic(static_cast<const Rationnel*>(donneeDepart), typeSouhaite, complexe);
if (typeid(*donneeDepart)==typeid(Complexe))
return creerDonneeStatic(static_cast<const Complexe*>(donneeDepart), typeSouhaite, complexe);
if (typeid(*donneeDepart)==typeid(ConstanteExp)){
Donnee * d= new ConstanteExp(static_cast<const ConstanteExp *>(donneeDepart)->getChaine() );
delete donneeDepart;
return d;
}
}