#include <iostream>
#include "xstring.h"

using namespace std;

xstring::xstring() : _length(0), _chars(0) {
	cout << "xstring::xstring() is called\n";
}

xstring::xstring(const int length, const char filler) {
	cout << "xstring::xstring(" << length << ", " << "'" << filler << "') is called\n";

	_length = length;
	_chars = new char[length + 1];
	memset(_chars, filler, _length);
	_chars[length] = '\0';
}

xstring::xstring(const char *str) : _length(0), _chars(0) {
	cout << "xstring::xstring((const char*)\"" << (str ? str : "") << "\") is called\n";

	init(str);
}

xstring::xstring(const xstring &other) : _length(0), _chars(0) {
	cout << "xstring::xstring(xstring& \"" << (other._chars ? other._chars : "") << "\") is called\n";

	init(other._chars);
}

xstring::~xstring() {
	cout << "xstring::~xstring() is called\n";

	clear();
}

void xstring::init(const char *str) {
	cout << "xstring::init((const char*)\"" << (str ? str : "") << "\") is called\n";

	if(!str) return;


	clear();
	for(_length = 0; str[_length]; _length++);
	_chars = new char[_length + 1];
	memcpy(_chars, str, _length);
	_chars[_length] = '\0';
}

void xstring::clear() {
	_length = 0;
	if(_chars) {
		delete [] _chars;
		_chars = 0;
	}
}

xstring& xstring::operator=(const xstring &other) {
	cout << "xstring& xstring::operator=(xstring& \"" << (other._chars ? other._chars : "") << "\") is called\n";

	if(this == &other)
		return *this;
	init(other._chars);
	return *this;
}

int xstring::get_length() const {
	cout << "int xstring::get_length() is called\n";

	return _length;
}

void xstring::print() const {
	cout << "xstring::print() is called\n";
	if(_chars)
		cout << _chars << "\n";
}
