#include "String.h"
#include <cstring>
#include <cstdlib>

String::String(const char* str)
	: str( strdup(str) )
	, len( strlen(str) )
{
}

String::String(size_t capacity)
	: str( (char*) malloc(capacity ? capacity : 1) )
	, len(0)
{
	*str = '\0';
}

String::String(const String &other)
	: str( strdup(other.str) )
	, len( other.len )
{
}

const String& String::operator =(const String &other)
{
	// Evita fugas de memoria si se asgina el objeto a si mismo
	if ( this != &other )
	{
		free(str);
		str = strdup(other.str);
		len = other.len;
	}
	return *this;
}

String::~String()
{
	free(str);
}

std::ostream& operator<<(std::ostream& output, const String& str)
{
	return output << str.str;
}

String operator+(const String& a, const String& b)
{
	size_t newLen = a.len + b.len;
	String resultado( newLen + 1 );
	strcpy(resultado.str, a.str);
	strcpy(resultado.str + a.len, b.str );
	resultado.len = newLen;
	return resultado;
}

