]> git.llucax.com Git - z.facultad/75.68/celdas.git/blob - trunk/src/indicemagico.h
Evitamos memory leaks.
[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 <vector>
12 #include <ostream>
13
14
15 template <class T>
16 class CIndiceMagico
17 {
18 public:
19         std::vector< std::string >                      m_nombres ;
20         std::vector< T >                                m_datos ;
21         typedef typename std::vector< T >::iterator     iterator;
22
23 public:
24
25         iterator begin() { return m_datos.begin(); }
26
27         iterator end() { return m_datos.end(); }
28
29         void add(const std::string& nombre, const T& dato)
30         {
31                 //Si ya existía, lo borro
32                 if (exist(nombre))
33                         remove(nombre) ;
34
35                 m_nombres.push_back(nombre);
36                 m_datos.push_back(dato);
37         }
38
39
40         void add(CIndiceMagico<T>& indice)
41         {
42                 for (unsigned i = 0; i < indice.m_nombres.size(); ++i)
43                         add(indice.m_nombres[i], indice.m_datos[i]) ;
44         }
45
46
47         bool exist(const std::string& nombre)
48         {
49                 for (unsigned i = 0; i < m_nombres.size(); ++i)
50                         if (m_nombres[i]==nombre)
51                                 return true ;
52
53                 return false ;
54         }
55
56         //PRE: Existe un elemento con la clave <nombre>.
57         //POS: Retorna el elemento.
58         T& find(const std::string& nombre)
59         {
60                 unsigned i;
61                 for (i = 0; i < m_nombres.size() && m_nombres[i] != nombre; ++i);
62                 return m_datos[i];
63         }
64
65
66         void set_val(const std::string& nombre, const T& valor)
67         {
68                 for (unsigned i = 0; i < m_nombres.size(); ++i)
69                 {
70                         if (m_nombres[i] == nombre)
71                         {
72                                 m_datos[i] = valor;
73                                 return;
74                         }
75                 }
76                 add(nombre, valor);
77         }
78
79
80         void clear()
81         {
82                 m_nombres.clear();
83                 m_datos.clear();
84         }
85
86         void remove(unsigned long index)
87         {
88                 m_nombres.erase(m_nombres.begin() + index);
89                 m_datos.erase(m_datos.begin() + index);
90         }
91
92         void remove(const std::string& nombre)
93         {
94                 bool exito = false ;
95                 unsigned i;
96
97                 for (i = 0; !exito && i < m_nombres.size(); ++i)
98                         exito = m_nombres[i]==nombre;
99
100                 if (exito)
101                         remove(i);
102         }
103
104
105         T& operator [] (unsigned i) { return m_datos[i]; }
106
107         T& items (unsigned i) { return m_datos[i]; }
108
109         std::string keys (unsigned i) const { return m_nombres[i]; }
110
111         unsigned count() { return m_nombres.size(); }
112
113 };
114
115 template < typename T >
116 std::ostream& operator<< (std::ostream& os, CIndiceMagico<T>& im)
117 {
118         unsigned c = im.count();
119         if (c == 0) return os << "\t\tvacío\n";
120         for (unsigned i = 0; i < c; ++i)
121                 os << "\t\t" << im.keys(i) << ":\t" << im[i] << "\n";
122         return os;
123 }
124
125 template < typename T >
126 std::ostream& operator<< (std::ostream& os, CIndiceMagico<T*>& im)
127 {
128         unsigned c = im.count();
129         if (c == 0) return os << "\t\tvacío\n";
130         for (unsigned i = 0; i < c; ++i)
131                 os << "\t\t" << im.keys(i) << ":\t" << *im[i] << "\n";
132         return os;
133 }
134
135 #endif