]> git.llucax.com Git - z.facultad/75.42/string.git/blob - unicode.cpp
398f82c090fb36fddc95f083c7bd4d31e3935729
[z.facultad/75.42/string.git] / unicode.cpp
1 /* vim: set et sts=4 sw=4 fdm=indent 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:07 ART 2003
13  *
14  * $Id$
15  */
16
17 #include "unicode.h"
18
19 #ifdef DEBUG
20 #   include <iostream>
21 #endif
22
23 Unicode::Unicode(short c): caracter(c) {
24 #ifdef DEBUG
25     std::cerr << "En constructor de Unicode." << std::endl;
26 #endif
27 }
28
29 Unicode::Unicode(const Unicode& unicode): caracter(unicode.caracter) {
30 #ifdef DEBUG
31     std::cerr << "En constructor de copia de Unicode." << std::endl;
32 #endif
33 }
34
35 Unicode::~Unicode(void) {
36 #ifdef DEBUG
37     std::cerr << "En destructor de Unicode." << std::endl;
38 #endif
39 }
40
41 bool Unicode::is_endl(void) const {
42 #ifdef DEBUG
43     std::cerr << "En Unicode::is_endl()." << std::endl;
44 #endif
45     // Si los primeros o últimos 8 bits son 0xA = 10 = '\n' devuelve true.
46     return (static_cast<char>(caracter) == '\n')
47         || (static_cast<char>(caracter >> 8) == '\n');
48 }
49
50 Unicode& Unicode::operator=(const Unicode& unicode) {
51 #ifdef DEBUG
52     std::cerr << "En operator= de Unicode." << std::endl;
53 #endif
54     caracter = unicode.caracter;
55     return *this;
56 }
57
58 Unicode& Unicode::operator=(short c) {
59 #ifdef DEBUG
60     std::cerr << "En operator= de Unicode (short)." << std::endl;
61 #endif
62     caracter = c;
63     return *this;
64 }
65
66 bool Unicode::operator<(const Unicode& unicode) const {
67 #ifdef DEBUG
68     std::cerr << "En operator< de Unicode." << std::endl;
69 #endif
70     return caracter < unicode.caracter;
71 }
72
73 bool Unicode::operator==(const Unicode& unicode) const {
74 #ifdef DEBUG
75     std::cerr << "En operator== de Unicode." << std::endl;
76 #endif
77     return caracter == unicode.caracter;
78 }
79
80 Unicode::operator short(void) const {
81 #ifdef DEBUG
82     std::cerr << "En cast de Unicode a char." << std::endl;
83 #endif
84     return static_cast<short>(caracter);
85 }
86
87 Unicode::operator char(void) const {
88 #ifdef DEBUG
89     std::cerr << "En cast de Unicode a char." << std::endl;
90 #endif
91     return static_cast<char>(caracter);
92 }
93
94 std::ostream& operator<<(std::ostream& out, const Unicode& unicode) {
95 #ifdef DEBUG
96     std::cerr << "En operator<< de Unicode." << std::endl;
97 #endif
98     // Imprime el caracter como 2 caracteres ASCII.
99     // Si el primer caracter (bits mas significativos) es cero, entonces no lo
100     // imprime (es ASCII "puro").
101     if (unicode.caracter >> 8) {
102         out << static_cast<char>(unicode.caracter >> 8);
103     }
104     return out << static_cast<char>(unicode.caracter);
105 }
106
107 std::istream& operator>>(std::istream& in, Unicode& unicode) {
108 #ifdef DEBUG
109     std::cerr << "En operator>> de Unicode." << std::endl;
110 #endif
111     char c1;
112     char c2;
113     // Lee los 2 primeros caracteres que no sean espacio.
114     in >> c1 >> std::noskipws >> c2 >> std::skipws;
115     // Los asigno como un short cuyos bits mas significativos corresponden al
116     // caracter 1 y los menos significativos al caracter 2.
117     unicode.caracter = (static_cast<short>(c1) << 8) + c2;
118     return in;
119 }
120