#include
#include
#include
#include
using namespace std;
class String {
public:
static const auto npos = -1;
String() : len(0), cap(limit), str(new char[cap]) {
memset(str, 0, cap);
}
explicit String(const size_t n, const char ch) : len(n), cap(n), str(new char[cap]) {
memset(str, ch, cap);
}
String(const char* s) : len(strlen(s)), cap(strlen(s)), str(new char[cap]) {
copy(s, s + len, begin());
}
String(const String& s) {
len = s.len;
cap = s.cap;
copy(s.begin(), s.end(), begin());
}
String(String&& s) noexcept{
len = s.len;
cap = s.cap;
str = move(s.str);
s.str = nullptr;
}
~String() {
if (str != nullptr) {
delete[] str;
str = nullptr;
}
}
String& operator=(const String& s) {
if (this != &s) {
len = s.len;
cap = s.cap;
str = new char[cap];
copy(s.begin(), s.end(), begin());
}
return *this;
}
String& operator=(String&& s) noexcept {
len = s.len;
cap = s.cap;
str = move(s.str);
s.str = nullptr;
return *this;
}
char& operator[](size_t i) {
return str[i];
}
char* begin()const {
return str;
}
char* end()const {
return str + len;
}
private:
size_t len;
size_t cap;
char* str;
static const size_t limit = 16;
void incbuff() {
auto tmp = *this;
delete[] str;
cap += limit;
str = new char[cap];
copy(tmp.begin(), tmp.end(), begin());
}
friend ostream& operator(istream& inp, String& s) {
s.len = 0;
do {
auto ch = inp.get();
if (ch == '\n') break;
if (s.len > s.cap) s.incbuff();
s[s.len] = ch;
} while (++s.len);
return inp;
}
};
int main() {
String hello = "Hello world!";
cout