#include <iostream>
#include <cstring>
template<size_t maxsize>
class str {
private:
char buf[maxsize];
public:
str(void){}
str(const str& s) { std::strcpy(buf, s.buf);}
str(const char* s){ std::strcpy(buf, s);}
public:
str& operator = (const str& s){
if(this != &s)
std::strcpy(buf, s.buf);
return *this;
}
str& operator += (const str& s){
if(this != &s)
std::strcat(buf, s.buf);
return *this;
}
friend str operator + (const str& s1, const str& s2){
str o(s1);
return o += s2;
}
friend std::istream& operator >> (std::istream& _in, str& s){
return _in.get(s.buf, maxsize - 1);
}
friend std::ostream& operator << (std::ostream& _out, const str& s){
return _out << s.buf;
}
bool operator < (const str& s) const {
return (std::strcmp(buf, s.buf) < 0);
}
bool operator > (const str& s) const {
return (std::strcmp(buf, s.buf) > 0);
}
bool operator == (const str& s) const {
return (! std::strcmp(buf, s.buf));
}
const char* get(void) const { return &buf[0]; }
};
int main(void){
str<64> s;
std::cout << "Enter str: ";
std::cin >> s;
std::cin.sync();
if(s == "exit")
return 0;
s = "-[" + s + "]-";
s += "\tfin";
std::cout << s << std::endl;
str<64> p = s;
if(p == s)
std::cout << "yes cmp.\n";
std::cin.get();
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Y3N0cmluZz4KCnRlbXBsYXRlPHNpemVfdCBtYXhzaXplPgpjbGFzcyBzdHIgewpwcml2YXRlOgoJY2hhciBidWZbbWF4c2l6ZV07CnB1YmxpYzoKCXN0cih2b2lkKXt9CglzdHIoY29uc3Qgc3RyJiBzKSB7IHN0ZDo6c3RyY3B5KGJ1Ziwgcy5idWYpO30KCXN0cihjb25zdCBjaGFyKiBzKXsgc3RkOjpzdHJjcHkoYnVmLCBzKTt9CnB1YmxpYzoKCglzdHImIG9wZXJhdG9yID0gKGNvbnN0IHN0ciYgcyl7CgkJaWYodGhpcyAhPSAmcykKCQkJc3RkOjpzdHJjcHkoYnVmLCBzLmJ1Zik7CgkJcmV0dXJuICp0aGlzOwoJfQoKCXN0ciYgb3BlcmF0b3IgKz0gKGNvbnN0IHN0ciYgcyl7CgkJaWYodGhpcyAhPSAmcykKCQkJc3RkOjpzdHJjYXQoYnVmLCBzLmJ1Zik7CgkJcmV0dXJuICp0aGlzOwoJfQoKCWZyaWVuZCBzdHIgb3BlcmF0b3IgKyAoY29uc3Qgc3RyJiBzMSwgY29uc3Qgc3RyJiBzMil7CgkJc3RyIG8oczEpOwoJCXJldHVybiBvICs9IHMyOwoJfQoKCWZyaWVuZCBzdGQ6OmlzdHJlYW0mIG9wZXJhdG9yID4+IChzdGQ6OmlzdHJlYW0mIF9pbiwgc3RyJiBzKXsKCQlyZXR1cm4gX2luLmdldChzLmJ1ZiwgbWF4c2l6ZSAtIDEpOwoJfQoKCWZyaWVuZCBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yIDw8IChzdGQ6Om9zdHJlYW0mIF9vdXQsIGNvbnN0IHN0ciYgcyl7CgkJcmV0dXJuIF9vdXQgPDwgcy5idWY7Cgl9CgoJYm9vbCBvcGVyYXRvciA8IChjb25zdCBzdHImIHMpIGNvbnN0IHsKCQlyZXR1cm4gKHN0ZDo6c3RyY21wKGJ1Ziwgcy5idWYpIDwgMCk7Cgl9CgoJYm9vbCBvcGVyYXRvciA+IChjb25zdCBzdHImIHMpIGNvbnN0IHsKCQlyZXR1cm4gKHN0ZDo6c3RyY21wKGJ1Ziwgcy5idWYpID4gMCk7Cgl9CgoJYm9vbCBvcGVyYXRvciA9PSAoY29uc3Qgc3RyJiBzKSBjb25zdCB7CgkJcmV0dXJuICghIHN0ZDo6c3RyY21wKGJ1Ziwgcy5idWYpKTsKCX0KCgljb25zdCBjaGFyKiBnZXQodm9pZCkgY29uc3QgeyByZXR1cm4gJmJ1ZlswXTsgfQp9OwoKCmludCBtYWluKHZvaWQpewoJc3RyPDY0PiBzOwoJc3RkOjpjb3V0IDw8ICJFbnRlciBzdHI6ICI7CglzdGQ6OmNpbiAgPj4gczsKCXN0ZDo6Y2luLnN5bmMoKTsKCglpZihzID09ICJleGl0IikKCQlyZXR1cm4gMDsKCglzICA9ICItWyIgKyBzICsgIl0tIjsKCXMgKz0gIlx0ZmluIjsgCglzdGQ6OmNvdXQgPDwgcyA8PCBzdGQ6OmVuZGw7CgoJc3RyPDY0PiBwID0gczsKCWlmKHAgPT0gcykKCQlzdGQ6OmNvdXQgPDwgInllcyBjbXAuXG4iOwoJc3RkOjpjaW4uZ2V0KCk7CglyZXR1cm4gMDsKfQ==