* Puede copiar, modificar y distribuir este programa bajo los términos de
* la licencia GPL (http://www.gnu.org/).
*
- * Creado: Mon Sep 22 21:00:15 ART 2003
+ * Creado: sáb sep 27 15:38:29 ART 2003
*
* $Id$
*/
#include <istream>
#include <iterator>
#include <vector>
+#include <cctype>
#ifdef DEBUG
# include <iostream>
#endif
/// String Universal.
-template <class T>
+template < class T >
class UniversalString {
/// Cadena de caracteres.
- std::vector<T> string;
+ std::vector< T > string;
public:
/// Constructor a partir de un string C.
UniversalString(const char* str) {
#ifdef DEBUG
- std::cerr << "En constructor de UniversalString a partir de string C."
+ std::cerr << "En constructor de UniversalString desde string C."
<< std::endl;
#endif
int len = strlen(str);
+ // Limpio cadena de caracteres anterior.
string.clear();
+ // Reservo nuevo espacio.
string.reserve(len);
+ // Agrego cada caracter.
for (int i = 0; i < len; i++) {
string.push_back(str[i]);
}
}
+ /// Constructor a partir de otro UniversalString.
+ template < class T2 >
+ UniversalString(const UniversalString< T2 >& str) {
+#ifdef DEBUG
+ std::cerr << "En constructor de UniversalString a partir de otro."
+ << std::endl;
+#endif
+ *this = str;
+ }
+
/// Constructor de copia.
UniversalString(const UniversalString& str) {
#ifdef DEBUG
std::cerr << "En constructor de copia de UniversalString."
<< std::endl;
#endif
+ string = str.string;
}
/// Destructor.
#ifdef DEBUG
std::cerr << "En operator= de UniversalString." << std::endl;
#endif
+ // Asigno la cadena de caracteres del string str.
string = str.string;
return *this;
}
+ /// Asignación de una instancia a otra de distinto tipo.
+ template < class T2 >
+ UniversalString& operator=(const UniversalString< T2 >& str) {
+#ifdef DEBUG
+ std::cerr << "En operator= de UniversalString de tipos distintos."
+ << std::endl;
+#endif
+ // Obtengo un vector con los caracteres del string str.
+ std::vector< T2 > v = str.to_vector();
+ // Limpio mi cadena de caracteres.
+ string.clear();
+ // Reservo el nuevo espacio para mi cadena.
+ string.reserve(v.size());
+ // Voy agregando caracter a caracter.
+ for (size_t i = 0; i < v.size(); i++) {
+ string.push_back(T(v[i]));
+ }
+ return *this;
+ }
+
/// Comparación por menor de dos instancias.
bool operator<(const UniversalString& str) {
#ifdef DEBUG
return string == str.string;
}
- /// Cast a string C.
- //operator char*(void);
+ /// Devuelve un vector de caracteres T.
+ std::vector< T > to_vector(void) const {
+ return string;
+ }
/// Volcado a un stream de salida.
friend std::ostream& operator<<(std::ostream& out,
- const UniversalString<T>& str) {
+ const UniversalString< T >& str) {
#ifdef DEBUG
std::cerr << "En operator<< de UniversalString." << std::endl;
#endif
// Copio el vector de caracteres al stream de salida.
std::copy(str.string.begin(), str.string.end(),
- std::ostream_iterator<T>(out, ""));
+ std::ostream_iterator< T >(out, ""));
return out;
}
/// Captura desde un stream de entrada.
friend std::istream& operator>>(std::istream& in,
- UniversalString<T>& str) {
+ UniversalString< T >& str) {
#ifdef DEBUG
std::cerr << "En operator>> de UniversalString." << std::endl;
#endif
// Limpio la cadena actual.
str.string.clear();
- T c;
// Obtengo primer caracter, incluyendo espacios.
+ T c;
in >> std::noskipws >> c;
- // Mientras que no sea el fin de línea, sigo leyendo caracteres.
- while (!c.is_endl()) {
+ // Mientras que no sea un fin de línea, sigo leyendo caracteres.
+ while (c != '\n') {
str.string.push_back(c);
in >> std::noskipws >> c;
}
+ // Vuelvo a setear que ignore espacios.
+ in >> std::skipws;
return in;
}