1 /* vim: set et sts=4 sw=4 fdm=marker fmr={,} fdn=1 fo+=t tw=80:
3 * Taller de Programación (75.42).
6 * Ordena texto ASCII o Unicode.
8 * Copyleft 2003 - Leandro Lucarella <llucare@fi.uba.ar>
9 * Puede copiar, modificar y distribuir este programa bajo los términos de
10 * la licencia GPL (http://www.gnu.org/).
12 * Creado: sáb sep 27 15:38:29 ART 2003
17 #ifndef UNIVERSALSTRING_H
18 #define UNIVERSALSTRING_H
32 class UniversalString {
34 /// Cadena de caracteres.
35 std::vector< T > string;
40 UniversalString(void) {
42 std::cerr << "En constructor de UniversalString." << std::endl;
46 /// Constructor a partir de un string C.
47 UniversalString(const char* str) {
49 std::cerr << "En constructor de UniversalString desde string C."
52 int len = strlen(str);
53 // Limpio cadena de caracteres anterior.
55 // Reservo nuevo espacio.
57 // Agrego cada caracter.
58 for (int i = 0; i < len; i++) {
59 string.push_back(str[i]);
63 /// Constructor a partir de otro UniversalString.
65 UniversalString(const UniversalString< T2 >& str) {
67 std::cerr << "En constructor de UniversalString a partir de otro."
73 /// Constructor de copia.
74 UniversalString(const UniversalString& str) {
76 std::cerr << "En constructor de copia de UniversalString."
83 virtual ~UniversalString(void) {
85 std::cerr << "En destructor de UniversalString." << std::endl;
89 /// Asignación de una instancia a otra.
90 UniversalString& operator=(const UniversalString& str) {
92 std::cerr << "En operator= de UniversalString." << std::endl;
94 // Asigno la cadena de caracteres del string str.
99 /// Asignación de una instancia a otra de distinto tipo.
100 template < class T2 >
101 UniversalString& operator=(const UniversalString< T2 >& str) {
103 std::cerr << "En operator= de UniversalString de tipos distintos."
106 // Obtengo un vector con los caracteres del string str.
107 std::vector< T2 > v = str.to_vector();
108 // Limpio mi cadena de caracteres.
110 // Reservo el nuevo espacio para mi cadena.
111 string.reserve(v.size());
112 // Voy agregando caracter a caracter.
113 for (size_t i = 0; i < v.size(); i++) {
114 string.push_back(T(v[i]));
119 /// Comparación por menor de dos instancias.
120 bool operator<(const UniversalString& str) {
122 std::cerr << "En operator< de UniversalString." << std::endl;
124 return string < str.string;
127 /// Comparación por igual de dos instancias.
128 bool operator==(const UniversalString& str) {
130 std::cerr << "En operator== de UniversalString." << std::endl;
132 return string == str.string;
135 /// Devuelve un vector de caracteres T.
136 std::vector< T > to_vector(void) const {
140 /// Volcado a un stream de salida.
141 friend std::ostream& operator<<(std::ostream& out,
142 const UniversalString< T >& str) {
144 std::cerr << "En operator<< de UniversalString." << std::endl;
146 // Copio el vector de caracteres al stream de salida.
147 std::copy(str.string.begin(), str.string.end(),
148 std::ostream_iterator< T >(out, ""));
152 /// Captura desde un stream de entrada.
153 friend std::istream& operator>>(std::istream& in,
154 UniversalString< T >& str) {
156 std::cerr << "En operator>> de UniversalString." << std::endl;
158 // Limpio la cadena actual.
160 // Obtengo primer caracter, incluyendo espacios.
162 in >> std::noskipws >> c;
163 // Mientras que no sea un fin de línea, sigo leyendo caracteres.
165 str.string.push_back(c);
166 in >> std::noskipws >> c;
168 // Vuelvo a setear que ignore espacios.
175 #endif // UNIVERSALSTRING_H