]> git.llucax.com Git - z.facultad/75.68/celdas.git/blob - trunk/src/indicemagico.h
Bugfix de set_val() (no verifiqué que ande).
[z.facultad/75.68/celdas.git] / trunk / src / indicemagico.h
1
2
3 #ifndef __INDICEMAGICO__
4 #define __INDICEMAGICO__
5
6 #define MAX_ELEMENTOS 500
7
8
9
10 #include <string>
11 #include <map>
12 #include <iostream>
13
14
15 template <class T>
16 class CIndiceMagico
17 {
18 public:
19         std::string*    m_nombres ;
20         T*                              m_datos ;
21         unsigned                m_cant ;
22
23 public:
24         CIndiceMagico() 
25         { 
26                 m_cant = 0 ; 
27                 m_nombres = new std::string[MAX_ELEMENTOS];
28                 m_datos = new T[MAX_ELEMENTOS];
29
30
31                 if (!m_nombres)
32                         std::cerr << "No se pudo allocar el arreglo CIndiceMagico::m_nombres.\n";
33
34                 if (!m_datos)
35                         std::cerr << "No se pudo allocar el arreglo CIndiceMagico::m_datos.\n";
36
37         }
38
39         ~CIndiceMagico()
40         {
41                 delete m_nombres;
42                 delete m_datos;
43         }
44
45 public:
46         void add(const char* nombre, const T dato)
47         {
48                 //Si ya existía, lo borro
49                 if (exist(nombre))
50                         remove(nombre) ;
51
52
53                 m_nombres[m_cant] = nombre ;
54                 m_datos[m_cant++] = dato ;
55         }
56
57
58         void add(CIndiceMagico<T>& indice)
59         {
60                 for (unsigned i=0; i<indice.m_cant; i++)
61                         add(indice.m_nombres[i].c_str(), indice.m_datos[i]) ;
62         }
63
64
65         bool exist(const char* nombre)
66         {
67                 for (unsigned i=0; i<m_cant; i++)
68                         if (m_nombres[i]==nombre)
69                                 return true ;
70
71                 return false ;
72         }
73
74         //PRE: Existe un elemento con la clave <nombre>.
75         //POS: Retorna el elemento.
76         T& find(const char* nombre)
77         {
78                 unsigned i;
79                 for (i=0; i<m_cant && m_nombres[i]!=nombre; i++) ;
80                 return m_datos[i] ;
81         }
82
83
84         void set_val(const std::string& nombre, T valor)
85         {
86                 for (unsigned i=0; i<m_cant; i++)
87                         if (m_nombres[i] == nombre)
88                         {
89                                 m_datos[i] = valor;
90                                 return;
91                         }
92                 add(nombre.c_str(), valor);
93         }
94
95
96         void clear()
97         {
98                 m_cant = 0 ;
99         }
100
101         void remove(const unsigned long index)
102         {
103                 for (unsigned i=index+1u; i<m_cant; i++)
104                 {
105                         m_nombres[i-1] = m_nombres[i] ; 
106                         m_datos[i-1] = m_datos[i] ; 
107                 }
108
109                 m_cant-- ;
110         }
111
112         void remove(const char* nombre)
113         {
114                 bool exito = false ;
115                 unsigned i;
116
117                 for (i=0; !exito && i<m_cant; i++)
118                         exito = m_nombres[i]==nombre ;
119
120                 if (exito)
121                         remove(i) ;
122         }
123
124         T& operator [] (unsigned i) { return m_datos[i]; }
125
126         T& items (unsigned i) { return m_datos[i]; }
127
128         char* keys (unsigned i) const { return (char*)(m_nombres[i].c_str()); }
129
130         unsigned count() { return m_cant ; }
131
132 } ;
133
134
135
136 #endif