#include "Str.h"
#include <cstring>
#include <iostream>
using std::cout;
using std::endl;
using std::ostream;
#define TRACE(what) cout << "- Str::" what << " called on " << this << endl
Str::Str() {
TRACE("default constructor");
st_ = new char[1];
st_[0] = '\0';
}
Str::Str(const char* s) {
TRACE("c-string constructor");
int len = strlen(s);
st_ = new char[len + 1];
strncpy(st_, s, len + 1);
}
Str::Str(const Str& s) {
TRACE("copy constructor");
int len = strlen(s.st_);
st_ = new char[len + 1];
strncpy(st_, s.st_, len + 1);
}
Str::~Str() {
TRACE("destructor");
delete [] st_;
}
int Str::length() const {
TRACE("length");
return strlen(st_);
}
char* Str::c_str() const {
TRACE("c_str");
int len = strlen(st_);
char* result = new char[len + 1];
strncpy(result, st_, len + 1);
return result;
}
void Str::append(const Str& s) {
TRACE("append");
int len1 = strlen(st_);
int len2 = strlen(s.st_);
char* newst = new char[len1 + len2 + 1];
strncpy(newst, st_, len1 + 1);
strncat(newst, s.st_, len2);
delete [] st_;
st_ = newst;
}
Str& Str::operator=(const Str& s) {
TRACE("assignment");
if (this == &s) {
return *this;
}
delete [] st_;
int len = strlen(s.st_);
st_ = new char[len + 1];
strncpy(st_, s.st_, len + 1);
return *this;
}
ostream& operator<<(ostream& out, const Str& s) {
out << s.st_;
return out;
}