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
31 class UniversalString {
33 /// Cadena de caracteres.
34 std::vector< T > string;
39 UniversalString(void) {
41 std::cerr << "En constructor de UniversalString." << std::endl;
45 /// Constructor a partir de un string C.
46 UniversalString(const char* str) {
48 std::cerr << "En constructor de UniversalString desde string C."
51 int len = strlen(str);
52 // Limpio cadena de caracteres anterior.
54 // Reservo nuevo espacio.
56 // Agrego cada caracter.
57 for (int i = 0; i < len; i++) {
58 string.push_back(str[i]);
62 /// Constructor de copia.
63 UniversalString(const UniversalString& str) {
65 std::cerr << "En constructor de copia de UniversalString."
72 virtual ~UniversalString(void) {
74 std::cerr << "En destructor de UniversalString." << std::endl;
78 /// Asignación de una instancia a otra.
79 UniversalString& operator=(const UniversalString& str) {
81 std::cerr << "En operator= de UniversalString." << std::endl;
83 // Asigno la cadena de caracteres del string str.
88 /// Asignación de una instancia a otra de distinto tipo.
90 UniversalString& operator=(const UniversalString< T2 >& str) {
92 std::cerr << "En operator= de UniversalString de tipos distintos."
95 // Obtengo un vector con los caracteres del string str.
96 std::vector< T2 > v = str.to_vector();
97 // Limpio mi cadena de caracteres.
99 // Reservo el nuevo espacio para mi cadena.
100 string.reserve(v.size());
101 // Voy agregando caracter a caracter.
102 for (size_t i = 0; i < v.size(); i++) {
103 string.push_back(T(v[i]));
108 /// Comparación por menor de dos instancias.
109 bool operator<(const UniversalString& str) {
111 std::cerr << "En operator< de UniversalString." << std::endl;
113 return string < str.string;
116 /// Comparación por igual de dos instancias.
117 bool operator==(const UniversalString& str) {
119 std::cerr << "En operator== de UniversalString." << std::endl;
121 return string == str.string;
124 /// Devuelve un vector de caracteres T.
125 std::vector< T > to_vector(void) const {
129 /// Volcado a un stream de salida.
130 friend std::ostream& operator<<(std::ostream& out,
131 const UniversalString< T >& str) {
133 std::cerr << "En operator<< de UniversalString." << std::endl;
135 // Copio el vector de caracteres al stream de salida.
136 std::copy(str.string.begin(), str.string.end(),
137 std::ostream_iterator< T >(out, ""));
141 /// Captura desde un stream de entrada.
142 friend std::istream& operator>>(std::istream& in,
143 UniversalString< T >& str) {
145 std::cerr << "En operator>> de UniversalString." << std::endl;
147 // Limpio la cadena actual.
149 // Obtengo primer caracter, incluyendo espacios.
151 in >> std::noskipws >> c;
152 // Mientras que no sea el fin de línea, sigo leyendo caracteres.
153 while (!c.is_endl()) {
154 str.string.push_back(c);
155 in >> std::noskipws >> c;
162 #endif // UNIVERSALSTRING_H