#include <string>
-#include <map>
-#include <iostream>
+#include <vector>
+#include <ostream>
template <class T>
class CIndiceMagico
{
public:
- std::string* m_nombres ;
- T* m_datos ;
- unsigned m_cant ;
- typedef T* iterator;
+ std::vector< std::string > m_nombres ;
+ std::vector< T > m_datos ;
+ typedef typename std::vector< T >::iterator iterator;
public:
- CIndiceMagico()
- {
- m_cant = 0 ;
- m_nombres = new std::string[MAX_ELEMENTOS];
- m_datos = new T[MAX_ELEMENTOS];
+ iterator begin() { return m_datos.begin(); }
- if (!m_nombres)
- std::cerr << "No se pudo allocar el arreglo CIndiceMagico::m_nombres.\n";
+ iterator end() { return m_datos.end(); }
- if (!m_datos)
- std::cerr << "No se pudo allocar el arreglo CIndiceMagico::m_datos.\n";
-
- }
-
- ~CIndiceMagico()
- {
- delete m_nombres;
- delete m_datos;
- }
-
-public:
- iterator begin() { return m_datos; }
- iterator end() { return m_datos + m_cant; }
- void add(const char* nombre, const T dato)
+ void add(const std::string& nombre, const T& dato)
{
//Si ya existía, lo borro
if (exist(nombre))
remove(nombre) ;
-
- m_nombres[m_cant] = nombre ;
- m_datos[m_cant++] = dato ;
+ m_nombres.push_back(nombre);
+ m_datos.push_back(dato);
}
void add(CIndiceMagico<T>& indice)
{
- for (unsigned i=0; i<indice.m_cant; i++)
- add(indice.m_nombres[i].c_str(), indice.m_datos[i]) ;
+ for (unsigned i = 0; i < indice.m_nombres.size(); ++i)
+ add(indice.m_nombres[i], indice.m_datos[i]) ;
}
- bool exist(const char* nombre)
+ bool exist(const std::string& nombre)
{
- for (unsigned i=0; i<m_cant; i++)
+ for (unsigned i = 0; i < m_nombres.size(); ++i)
if (m_nombres[i]==nombre)
return true ;
//PRE: Existe un elemento con la clave <nombre>.
//POS: Retorna el elemento.
- T& find(const char* nombre)
+ T& find(const std::string& nombre)
{
unsigned i;
- for (i=0; i<m_cant && m_nombres[i]!=nombre; i++) ;
- return m_datos[i] ;
+ for (i = 0; i < m_nombres.size() && m_nombres[i] != nombre; ++i);
+ return m_datos[i];
}
- void set_val(const std::string& nombre, T valor)
+ void set_val(const std::string& nombre, const T& valor)
{
- for (unsigned i=0; i<m_cant; i++)
+ for (unsigned i = 0; i < m_nombres.size(); ++i)
+ {
if (m_nombres[i] == nombre)
{
m_datos[i] = valor;
return;
}
- add(nombre.c_str(), valor);
+ }
+ add(nombre, valor);
}
void clear()
{
- m_cant = 0 ;
+ m_nombres.clear();
+ m_datos.clear();
}
- void remove(const unsigned long index)
+ void remove(unsigned long index)
{
- for (unsigned i=index+1u; i<m_cant; i++)
- {
- m_nombres[i-1] = m_nombres[i] ;
- m_datos[i-1] = m_datos[i] ;
- }
-
- m_cant-- ;
+ m_nombres.erase(m_nombres.begin() + index);
+ m_datos.erase(m_datos.begin() + index);
}
- void remove(const char* nombre)
+ void remove(const std::string& nombre)
{
bool exito = false ;
unsigned i;
- for (i=0; !exito && i<m_cant; i++)
- exito = m_nombres[i]==nombre ;
+ for (i = 0; !exito && i < m_nombres.size(); ++i)
+ exito = m_nombres[i]==nombre;
if (exito)
- remove(i) ;
+ remove(i);
}
+
T& operator [] (unsigned i) { return m_datos[i]; }
T& items (unsigned i) { return m_datos[i]; }
- char* keys (unsigned i) const { return (char*)(m_nombres[i].c_str()); }
-
- unsigned count() { return m_cant ; }
+ std::string keys (unsigned i) const { return m_nombres[i]; }
-} ;
+ unsigned count() { return m_nombres.size(); }
+};
+template < typename T >
+std::ostream& operator<< (std::ostream& os, CIndiceMagico<T>& im)
+{
+ unsigned c = im.count();
+ if (c == 0) return os << "\t\tvacío\n";
+ for (unsigned i = 0; i < c; ++i)
+ os << "\t\t" << im.keys(i) << ":\t" << im[i] << "\n";
+ return os;
+}
+
+template < typename T >
+std::ostream& operator<< (std::ostream& os, CIndiceMagico<T*>& im)
+{
+ unsigned c = im.count();
+ if (c == 0) return os << "\t\tvacío\n";
+ for (unsigned i = 0; i < c; ++i)
+ os << "\t\t" << im.keys(i) << ":\t" << *im[i] << "\n";
+ return os;
+}
#endif