-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathRegistro.cpp
152 lines (135 loc) · 4.87 KB
/
Registro.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
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
#include "Registro.h"
using namespace tp3;
//Constructor
Registro::Registro(){}
Registro::Registro(const aed2::NombreCampo& nombre, const Dato& dato){reg.Definir(nombre,dato);}
Registro::Registro(const aed2::Conj<aed2::NombreCampo>& conjNombres, const aed2::Conj<Dato>& conjDatos){
aed2::Conj<aed2::NombreCampo>::const_Iterador itConjNombres = conjNombres.CrearIt();
aed2::Conj<Dato>::const_Iterador itConjDatos = conjDatos.CrearIt();
while(itConjNombres.HaySiguiente()){
reg.Definir(itConjNombres.Siguiente(), itConjDatos.Siguiente() );
itConjNombres.Avanzar();
itConjDatos.Avanzar();
}
}
// Devuelve el conjunto de campos del registro
aed2::Conj<aed2::NombreCampo> Registro::campos() const{
aed2::Dicc<aed2::NombreCampo, Dato>::const_Iterador itReg = reg.CrearIt();
aed2::Conj<aed2::NombreCampo> conj;
while(itReg.HaySiguiente()){
conj.AgregarRapido(itReg.SiguienteClave());
itReg.Avanzar();
}
return conj;
}
// Borro los datos del registro para los cuales coinciden los campos con criterio
bool Registro::puedoBorrar(const Registro& criterio) const{
aed2::Dicc<aed2::NombreCampo, Dato>::const_Iterador itReg = reg.CrearIt();
// la cantidad de campos de Criterio es 1
aed2::Conj<aed2::NombreCampo>::Iterador itCamCrit = criterio.campos().CrearIt();
while(itReg.HaySiguiente()){
if(itReg.SiguienteClave() == itCamCrit.Siguiente())return true;
itReg.Avanzar();
}
return false;
}
// Agrego campos del registro que me pasan al registro
Registro& Registro::agregarCampos(const Registro& rCrit){
aed2::Conj<aed2::NombreCampo> camposrCrit = rCrit.campos();
aed2::Conj<aed2::NombreCampo>::Iterador itCamposrCrit = camposrCrit.CrearIt();
//~ std::cout << camposrCrit << std::endl;
//~ std::cout << itrCrit.Siguiente() << std::endl;
while(itCamposrCrit.HaySiguiente()){
if(!reg.Definido(itCamposrCrit.Siguiente()) ){
//~ std::cout << "AgregarCampos" << std::endl;
//~ std::cout << itCamposrCrit.Siguiente() << std::endl;
//~ std::cout << rCrit.Significado(rCrit.campos()) << std::endl;
aed2::NombreCampo clave = itCamposrCrit.Siguiente();
//~ std::cout << clave << std::endl;
Dato dato = rCrit.Significado(clave);
//~ std::cout << "AgregarCampos" << std::endl;
reg.Definir( clave, dato);
}
itCamposrCrit.Avanzar();
}
return *this;
}
// copio los campos que estan en el conjunto al registro r2
Registro& Registro::copiarCampos(const aed2::Conj<aed2::NombreCampo>& cc, const Registro& rCrit){
aed2::Conj<aed2::NombreCampo>::const_Iterador itConj = cc.CrearIt();
if(itConj.HaySiguiente()){
while(itConj.HaySiguiente()){
reg.Definir(itConj.Siguiente(), rCrit.Significado( itConj.Siguiente() ));
itConj.Avanzar();
}
}
return *this;
}
// Devuelve True si conincide alguno
bool Registro::coincideAlguno(const aed2::Conj<aed2::NombreCampo>& cc, const Registro& rRef) const{
aed2::Conj<aed2::NombreCampo>::const_Iterador itConj = cc.CrearIt();
bool res = false;
if(itConj.HaySiguiente()){
while(itConj.HaySiguiente()){
if(rRef.Significado(itConj.Siguiente() ) == reg.Significado( itConj.Siguiente() )){
res = true;
}
itConj.Avanzar();
}
}
return res;
}
//Devuelve True si conincide Todos
bool Registro::coincidenTodos(const aed2::Conj<aed2::NombreCampo>& cc, const Registro& rRef) const{
aed2::Conj<aed2::NombreCampo>::const_Iterador itConj = cc.CrearIt();
bool res = true;
if(itConj.HaySiguiente()){
while(itConj.HaySiguiente()){
if(!(rRef.Significado(itConj.Siguiente() ) == reg.Significado( itConj.Siguiente() ))){
res = false;
}
itConj.Avanzar();
}
}
return res;
}
//Devuelve True si el campo esta en todos los registros
bool Registro::enTodos(const aed2::NombreCampo& c, const aed2::Conj< Registro >& cr){
aed2::Conj< Registro >::const_Iterador itConj = cr.CrearIt();
bool res = true;
if(itConj.HaySiguiente()){
while(itConj.HaySiguiente()){
if( !(itConj.Siguiente().estaDefinido(c)) ){
res = false;
}
itConj.Avanzar();
}
}
return res;
}
//Devuelve un conjunto del cr, de forma que el valor de el campo c en r vale lo mismo para todos los reg
aed2::Conj<Registro> Registro::combinarTodos(const aed2::NombreCampo& c,const aed2::Conj<Registro> cr){
aed2::Conj<Registro> ConjRes;
aed2::Conj<Registro>::const_Iterador itConj = cr.CrearIt();
if(itConj.HaySiguiente()){
while(itConj.HaySiguiente()){
if( reg.Significado(c) == (itConj.Siguiente().Significado(c)) ){
ConjRes.AgregarRapido(itConj.Siguiente());
}
itConj.Avanzar();
}
}
return ConjRes;
}
// Devuelvo el significado del campo
const tp3::Dato Registro::Significado(const aed2::NombreCampo c) const{
//~ std::cout << "Significado" << std::endl;
//~ std::cout << c << std::endl;
//~ bool def = reg.Definido(c);
//~ std::cout << "DefinidoRegistro: "<< def << std::endl;
return reg.Significado(c);
}
// Devuelvo True si esta definido el campo
bool Registro::estaDefinido(const aed2::NombreCampo c) const{
return reg.Definido(c);
}