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