]> git.llucax.com Git - z.facultad/75.68/celdas.git/blob - trunk/src/indicemagico.h
Subo la versión 1.0.3 con correcciones para que compile y no tire warnings.
[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 = (std::string*)calloc(sizeof(std::string), MAX_ELEMENTOS) ;
28                 m_datos = (T*)calloc(sizeof(m_datos), 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 public:
40         void add(const char* nombre, const T dato)
41         {
42                 //Si ya existía, lo borro
43                 if (exist(nombre))
44                         remove(nombre) ;
45
46
47                 m_nombres[m_cant] = nombre ;
48                 m_datos[m_cant++] = dato ;
49         }
50
51
52         void add(CIndiceMagico<T>& indice)
53         {
54                 for (unsigned i=0; i<indice.m_cant; i++)
55                         add(indice.m_nombres[i].c_str(), indice.m_datos[i]) ;
56         }
57
58
59         bool exist(const char* nombre)
60         {
61                 for (unsigned i=0; i<m_cant; i++)
62                         if (m_nombres[i]==nombre)
63                                 return true ;
64
65                 return false ;
66         }
67
68         //PRE: Existe un elemento con la clave <nombre>.
69         //POS: Retorna el elemento.
70         T& find(const char* nombre)
71         {
72                 unsigned i;
73                 for (i=0; i<m_cant && m_nombres[i]!=nombre; i++) ;
74                 return m_datos[i] ;
75         }
76
77
78         void set_val(const std::string nombre, T valor)
79         {
80                 for (unsigned i=0; i<m_cant; i++)
81                         if (m_datos[i]!=valor)
82                                 m_datos[i] ;
83         }
84
85
86         void clear()
87         {
88                 m_cant = 0 ;
89         }
90
91         void remove(const unsigned long index)
92         {
93                 for (unsigned i=index+1u; i<m_cant; i++)
94                 {
95                         m_nombres[i-1] = m_nombres[i] ; 
96                         m_datos[i-1] = m_datos[i] ; 
97                 }
98
99                 m_cant-- ;
100         }
101
102         void remove(const char* nombre)
103         {
104                 bool exito = false ;
105                 unsigned i;
106
107                 for (i=0; !exito && i<m_cant; i++)
108                         exito = m_nombres[i]==nombre ;
109
110                 if (exito)
111                         remove(i) ;
112         }
113
114         T& operator [] (unsigned i) { return m_datos[i]; }
115
116         T& items (unsigned i) { return m_datos[i]; }
117
118         char* keys (unsigned i) const { return (char*)(m_nombres[i].c_str()); }
119
120         unsigned count() { return m_cant ; }
121
122 } ;
123
124
125
126 #endif