-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathInstancia.h
180 lines (154 loc) · 5.77 KB
/
Instancia.h
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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
#ifndef Instancia_H_
#define Instancia_H_
#include "Clase.h"
/**
En esta clase se define la estructura de una instancia de una clase
**/
class Instancia{
private:
string nombre;//Nombre de la clase junto con el de la instancia, ejemplo: NombreInstancia_NombreClase
string nombre_puro; //Nombre de la instancia, ejemplo: NombreInstancia
Clase *clase; //Apuntador a la clase a la que pertenece la instancia
struct vartable *vt; //Tabla de propiedades de la instancia, aqui se comprueba la expresion
struct val *(valores[P]);//Tabla de los valores de cada propiedad de la instancia
int num_var;//Numero de propiedades con valor asignado por el usuario
public:
//Constructor
Instancia(string nombre_instancia, Clase *c);
//Destructor
~Instancia();
//Consultores
string get_nombre();
string get_nombre_puro();
Clase* get_clase();
struct var * get_valor_propiedad(string nom_propiedad);
//Existencia
bool existe_propiedad(string nom_propiedad);
//Validacion
bool validar_expresion(string exp);
//Agregar
bool agregar_valor_propiedad(string propiedad, int tipo, int valor);
bool agregar_valor_propiedad(string propiedad, int tipo, double valor);
bool agregar_valor_propiedad(string propiedad, int tipo, string valor);
};
//Constructor
Instancia::Instancia(string nombre_instancia, Clase *c){
num_var = 0;
nombre = nombre_instancia + "_" + c->get_nombre();
nombre_puro = nombre_instancia;
clase = c;
vt = create_vartable();
}
//Destructor
Instancia::~Instancia(){
}
//Consultar nombre de la instancia junto con el de la clase
string Instancia::get_nombre(){
return nombre;
}
//Consultar nombre de la instancia
string Instancia::get_nombre_puro(){
return nombre_puro;
}
//Consultar clase a la cual pertenece la instancia
Clase* Instancia::get_clase(){
return clase;
}
//Consultar valor de una propiedad de la instancia
struct var * Instancia::get_valor_propiedad(string nom_propiedad){
struct var *v;
v = get_var(vt, StringAChar(nom_propiedad) );
return v;
}
//Averiguar si la instancia posee alguna propiedad dada
bool Instancia::existe_propiedad(string nom_propiedad){
struct var *v;
if ((v = get_var(vt, StringAChar(nom_propiedad) ))) {
return true;
}
return false;
}
//Saber si la expresion de una evento se cumple con los valores de las propiedades de la instancia
bool Instancia::validar_expresion(string exp){
bool band = false;
struct val result;
if( evaluate(StringAChar(exp), &result, vt)==0 ){//Si, no hubo errores de sintaxis
if(result.ival == 1){//Si la expresion devuelve verdadero
band = true;
}
}
return band;
}
//Agrega valor a una propiedad de tipo ENTERO
bool Instancia::agregar_valor_propiedad(string propiedad, int tipo, int valor){
struct var *v;
bool band = false;
if( get_var(vt, StringAChar(propiedad) ) ){//Si la propiedad ya existe (ya ha obtenido su primer valor) actualizo su valor
v = get_var(vt, StringAChar(propiedad));
v->val.ival = valor;
band = true;
}
else{
if( clase->existe_propiedad(propiedad) ){ //Si la propiedad pertenece a la clase, se agrega valor por primera vez
valores[num_var] = new val(); //Se crea el registro del valor
valores[num_var]->type = tipo; //Se asigna el tipo de dato
valores[num_var]->ival = valor; //Se guarda el valor
put_var(vt, StringAChar(propiedad), valores[num_var]);//Se introduce el registro en la tabla de valores
num_var = num_var + 1; //Se incrementa el contador de valores
band = true;
}
else{
cout << "La propiedad " << propiedad << " no pertenece a la clase de la instancia" << endl;
}
}
return band;
}
//Agrega valor a una propiedad de tipo DOUBLE
bool Instancia::agregar_valor_propiedad(string propiedad, int tipo, double valor){
struct var *v;
bool band = false;
if( get_var(vt, StringAChar(propiedad) ) ){//Si la propiedad ya existe (ya ha obtenido su primer valor) actualizo su valor
v = get_var(vt, StringAChar(propiedad)); //Se consulta la propiedad
v->val.rval = valor;//Se cambia su valor
band = true;
}
else{
if( clase->existe_propiedad(propiedad) ){ //Si la propiedad pertenece a la clase, se agrega valor por primera vez
valores[num_var] = new val(); //Se crea el registro del valor
valores[num_var]->type = tipo; //Se asigna el tipo de dato
valores[num_var]->rval = valor; //Se guarda el valor
put_var(vt, StringAChar(propiedad), valores[num_var]);//Se introduce el registro en la tabla de valores
num_var = num_var + 1; //Se incrementa el contador de valores
band = true;
}
else{
cout << "La propiedad " << propiedad << " no pertenece a la clase de la instancia" << endl;
}
}
return band;
}
//Agrega valor a una propiedad de tipo STRING
bool Instancia::agregar_valor_propiedad(string propiedad, int tipo, string valor){
struct var *v;
bool band = false;
if( get_var(vt, StringAChar(propiedad) ) ){//Si la propiedad ya existe (ya ha obtenido su primer valor) actualizo su valor
v = get_var(vt, StringAChar(propiedad));//Se consulta la propiedad
(v->val).cval = StringAChar(valor);//Se cambia su valor
band = true;
}
else{
if( clase->existe_propiedad(propiedad) ){ //Si la propiedad pertenece a la clase, se agrega valor por primera vez
valores[num_var] = new val(); //Se crea el registro del valor
valores[num_var]->type = tipo; //Se asigna el tipo de dato
(valores[num_var])->cval = StringAChar(valor); //Se guarda el valor
put_var(vt, StringAChar(propiedad), valores[num_var]);//Se introduce el registro en la tabla de valores
num_var = num_var + 1; //Se incrementa el contador de valores
band = true;
}
else{
cout << "La propiedad " << propiedad << " no pertenece a la clase de la instancia" << endl;
}
}
return band;
}
#endif