]> git.llucax.com Git - z.facultad/75.68/celdas.git/blob - trunk/src/indicemagico.h
(no commit message)
[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_datos[i]!=valor)
88                                 m_datos[i] ;
89         }
90
91
92         void clear()
93         {
94                 m_cant = 0 ;
95         }
96
97         void remove(const unsigned long index)
98         {
99                 for (unsigned i=index+1u; i<m_cant; i++)
100                 {
101                         m_nombres[i-1] = m_nombres[i] ; 
102                         m_datos[i-1] = m_datos[i] ; 
103                 }
104
105                 m_cant-- ;
106         }
107
108         void remove(const char* nombre)
109         {
110                 bool exito = false ;
111                 unsigned i;
112
113                 for (i=0; !exito && i<m_cant; i++)
114                         exito = m_nombres[i]==nombre ;
115
116                 if (exito)
117                         remove(i) ;
118         }
119
120         T& operator [] (unsigned i) { return m_datos[i]; }
121
122         T& items (unsigned i) { return m_datos[i]; }
123
124         char* keys (unsigned i) const { return (char*)(m_nombres[i].c_str()); }
125
126         unsigned count() { return m_cant ; }
127
128 } ;
129
130
131
132 #endif