// IG17 2004-05, II17 2005-06 // Cadena.cpp // 16-11-2004 #include #include // Para usar strlen, strcpy, strcat, strcmp using namespace std; #include "Cadena.h" void Cadena::Vaciar () { if (caracteres != NULL) { delete [] caracteres; caracteres = NULL; talla = 0; } } Cadena::~Cadena() { Vaciar(); } bool Cadena::EsVacia() const { return talla == 0; } int Cadena::Talla() const { return talla; } void Cadena::Copiar(const char *c) { Vaciar(); if (c != NULL) { talla = strlen(c); if (talla > 0) { caracteres = new char[talla+1]; // +1 para el '\0' final strcpy (caracteres, c); } } } void Cadena::Copiar(const Cadena &c) { Copiar(c.caracteres); } Cadena::Cadena () : talla(0), caracteres(NULL) { } Cadena::Cadena (const char *c) : talla(0), caracteres(NULL) { Copiar(c); } Cadena::Cadena (const Cadena & c) : talla(0), caracteres(NULL) { Copiar(c); } Cadena & Cadena::operator= (const Cadena &c) { if (this != &c) Copiar(c); return *this; } Cadena operator+ (const Cadena & c1, const Cadena & c2) { if (c2.talla == 0) return c1; if (c1.talla == 0) return c2; Cadena resultado; resultado.talla = c1.talla + c2.talla; resultado.caracteres = new char[resultado.talla + 1]; strcpy(resultado.caracteres, c1.caracteres); strcat(resultado.caracteres, c2.caracteres); return resultado; } Cadena & Cadena::operator+= (const Cadena & c) { return *this = *this + c; } bool operator== (const Cadena &c1, const Cadena &c2) { if (c1.talla == 0 && c2.talla == 0) return true; else if (c1.talla == 0 || c2.talla == 0) return false; else return (strcmp(c1.caracteres, c2.caracteres) == 0); } bool operator<= (const Cadena &c1, const Cadena &c2) { if (c1.talla == 0 && c2.talla == 0) return true; else if (c1.talla == 0) return true; else if (c2.talla == 0) return false; else return (strcmp(c1.caracteres, c2.caracteres) <= 0); } ostream & operator<< (ostream & flujo, const Cadena & c) { if (c.talla == 0) flujo << ""; else flujo << c.caracteres; return flujo; }