]> git.llucax.com Git - z.facultad/75.42/string.git/blob - universalstring.h
Se corrige y prueba la entrada y salida de datos por streams.
[z.facultad/75.42/string.git] / universalstring.h
1 /* vim: set et sts=4 sw=4 fdm=marker fmr={,} fdn=1 fo+=t tw=80:
2  *
3  * Taller de Programación (75.42).
4  *
5  * Ejercicio Número 4:
6  * Ordena texto ASCII o Unicode.
7  *
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/).
11  *
12  * Creado: Mon Sep 22 21:00:15 ART 2003
13  *
14  * $Id$
15  */
16
17 #ifndef UNIVERSALSTRING_H
18 #define UNIVERSALSTRING_H
19
20 #include <ostream>
21 #include <istream>
22 #include <iterator>
23 #include <vector>
24
25 #ifdef DEBUG
26 #   include <iostream>
27 #endif
28
29 /// String Universal.
30 template <class T>
31 class UniversalString {
32
33         /// Cadena de caracteres.
34         std::vector<T> string;
35
36     public:
37
38         /// Constructor.
39         UniversalString(void) {
40 #ifdef DEBUG
41             std::cerr << "En constructor de UniversalString." << std::endl;
42 #endif
43         }
44
45         /// Constructor a partir de un string C.
46         UniversalString(const char* str) {
47 #ifdef DEBUG
48             std::cerr << "En constructor de UniversalString a partir de string C."
49                 << std::endl;
50 #endif
51             int len = strlen(str);
52             string.clear();
53             string.reserve(len);
54             for (int i = 0; i < len; i++) {
55                 string.push_back(str[i]);
56             }
57         }
58
59         /// Constructor de copia.
60         UniversalString(const UniversalString& str) {
61 #ifdef DEBUG
62             std::cerr << "En constructor de copia de UniversalString."
63                 << std::endl;
64 #endif
65         }
66
67         /// Destructor.
68         virtual ~UniversalString(void) {
69 #ifdef DEBUG
70             std::cerr << "En destructor de UniversalString." << std::endl;
71 #endif
72         }
73
74         /// Asignación de una instancia a otra.
75         UniversalString& operator=(const UniversalString& str) {
76 #ifdef DEBUG
77             std::cerr << "En operator= de UniversalString." << std::endl;
78 #endif
79             string = str.string;
80             return *this;
81         }
82
83         /// Comparación por menor de dos instancias.
84         bool operator<(const UniversalString& str) {
85 #ifdef DEBUG
86             std::cerr << "En operator< de UniversalString." << std::endl;
87 #endif
88             return string < str.string;
89         }
90
91         /// Comparación por igual de dos instancias.
92         bool operator==(const UniversalString& str) {
93 #ifdef DEBUG
94             std::cerr << "En operator== de UniversalString." << std::endl;
95 #endif
96             return string == str.string;
97         }
98
99         /// Cast a string C.
100         //operator char*(void);
101
102         /// Volcado a un stream de salida.
103         friend std::ostream& operator<<(std::ostream& out,
104                 const UniversalString<T>& str) {
105 #ifdef DEBUG
106             std::cerr << "En operator<< de UniversalString." << std::endl;
107 #endif
108             // Copio el vector de caracteres al stream de salida.
109             std::copy(str.string.begin(), str.string.end(),
110                     std::ostream_iterator<T>(out, ""));
111             return out;
112         }
113
114         /// Captura desde un stream de entrada.
115         friend std::istream& operator>>(std::istream& in,
116                 UniversalString<T>& str) {
117 #ifdef DEBUG
118             std::cerr << "En operator>> de UniversalString." << std::endl;
119 #endif
120             // Limpio la cadena actual.
121             str.string.clear();
122             T c;
123             // Obtengo primer caracter, incluyendo espacios.
124             in >> std::noskipws >> c;
125             // Mientras que no sea el fin de línea, sigo leyendo caracteres.
126             while (!c.is_endl()) {
127                 str.string.push_back(c);
128                 in >> std::noskipws >> c;
129             }
130             return in;
131         }
132
133 };
134
135 #endif // UNIVERSALSTRING_H