]> git.llucax.com Git - z.facultad/75.68/celdas.git/blob - trunk/src/indicemagico.h
Se mejora el demo, se agrega una rueda más (central) al robot para que sea más
[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 <iostream>
12
13
14 template <class T>
15 class CIndiceMagico
16 {
17 public:
18         std::string*    m_nombres ;
19         T*                              m_datos ;
20         unsigned                m_cant ;
21
22 public:
23         CIndiceMagico() 
24         { 
25                 using std::cerr;
26                 using std::endl;
27                 m_cant = 0 ; 
28                 m_nombres = (std::string*)calloc(sizeof(std::string), MAX_ELEMENTOS) ;
29                 m_datos = (T*)calloc(sizeof(m_datos), MAX_ELEMENTOS) ;
30
31
32                 if (!m_nombres)
33                         cerr << "No se pudo allocar el arreglo CIndiceMagico::m_nombres." << endl ;
34
35                 if (!m_datos)
36                         cerr << "No se pudo allocar el arreglo CIndiceMagico::m_datos." << endl ;
37
38         }
39
40 public:
41         void add(const char* nombre, const T dato)
42         {
43                 //Si ya existía, lo borro
44                 if (exist(nombre))
45                         remove(nombre) ;
46
47
48                 m_nombres[m_cant] = nombre ;
49                 m_datos[m_cant++] = dato ;
50         }
51
52
53         void add(CIndiceMagico<T>& indice)
54         {
55                 for (int i=0; i<indice.m_cant; i++)
56                         add(indice.m_nombres[i], indice.m_datos[i]) ;
57         }
58
59
60         bool exist(const char* nombre)
61         {
62                 for (int i=0; i<m_cant; i++)
63                         if (m_nombres[i]==nombre)
64                                 return true ;
65
66                 return false ;
67         }
68
69         //PRE: Existe un elemento con la clave <nombre>.
70         //POS: Retorna el elemento.
71         T& find(const char* nombre)
72         {
73                 int i;
74                 for (i=0; i<m_cant && m_nombres[i]!=nombre; i++) ;
75                 return m_datos[i] ;
76         }
77
78
79         void set_val(const std::string nombre, T valor)
80         {
81                 for (int i=0; i<m_cant; i++)
82                         if (m_datos[i]!=valor)
83                                 m_datos[i] ;
84         }
85
86
87         void clear()
88         {
89                 m_cant = 0 ;
90         }
91
92         void remove(const unsigned long index)
93         {
94                 for (int i=index+1; i<m_cant; i++)
95                 {
96                         m_nombres[i-1] = m_nombres[i] ; 
97                         m_datos[i-1] = m_datos[i] ; 
98                 }
99
100                 m_cant-- ;
101         }
102
103         void remove(const char* nombre)
104         {
105                 bool exito = false ;
106                 int i;
107
108                 for (i=0; !exito && i<m_cant; i++)
109                         exito = m_nombres[i]==nombre ;
110
111                 if (exito)
112                         remove(i) ;
113         }
114
115         T& operator [] (unsigned i) { return m_datos[i]; }
116
117         T& items (unsigned i) { return m_datos[i]; }
118
119         char* keys (unsigned i) const { return (char*)(m_nombres[i].c_str()); }
120
121         unsigned count() { return m_cant ; }
122
123 } ;
124
125
126
127 #endif