#include <cstring>
#include <iostream>
#include <vector>
class STR {
public:
STR() : m_str(1, '\0') {} // Empty string -> only a null-terminator
STR(const char* str)
: m_str(&str[0], &str[strlen(str) + 1]) // Copy null-terminator as well
{
}
std::size_t getSize() const noexcept { return m_str.size() - 1u; }
const char* getData() const { return m_str.data(); }
operator const char*() const { return m_str.data(); }
private:
std::vector<char> m_str;
};
std::ostream& operator<<(std::ostream& os, const STR& str)
{
if (!str.getData())
return (os << "");
os << str.getData();
return os;
}
auto main()->int
{
//Object direct initialization
STR a{"Simple text"};
//Object direct initialization
STR b = "Another text";
STR c = a;
//Empty obj creation
STR d;
std::cout << "d:" << d << '\n';
//Empty object assignment
d = std::move(c);
std::cout << "d:" << d << '\n';
//Existing object assignment
b = d;
std::cout << "b:" << b << '\n';
//Object assigment using const char*
a = "What next";
std::cout << "a:" << a <<'\n';
}
I2luY2x1ZGUgPGNzdHJpbmc+CiNpbmNsdWRlIDxpb3N0cmVhbT4KI2luY2x1ZGUgPHZlY3Rvcj4KCmNsYXNzIFNUUiB7CiBwdWJsaWM6CiAgU1RSKCkgOiBtX3N0cigxLCAnXDAnKSB7fSAgLy8gRW1wdHkgc3RyaW5nIC0+IG9ubHkgYSBudWxsLXRlcm1pbmF0b3IKICAKICBTVFIoY29uc3QgY2hhciogc3RyKQogICAgOiBtX3N0cigmc3RyWzBdLCAmc3RyW3N0cmxlbihzdHIpICsgMV0pICAvLyBDb3B5IG51bGwtdGVybWluYXRvciBhcyB3ZWxsCiAgewogIH0KCQogIHN0ZDo6c2l6ZV90IGdldFNpemUoKSBjb25zdCBub2V4Y2VwdCB7IHJldHVybiBtX3N0ci5zaXplKCkgLSAxdTsgfQogIGNvbnN0IGNoYXIqIGdldERhdGEoKSBjb25zdCB7IHJldHVybiBtX3N0ci5kYXRhKCk7IH0KICBvcGVyYXRvciBjb25zdCBjaGFyKigpIGNvbnN0IHsgcmV0dXJuIG1fc3RyLmRhdGEoKTsgfQoKIHByaXZhdGU6CiAgc3RkOjp2ZWN0b3I8Y2hhcj4gbV9zdHI7Cn07CgpzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgU1RSJiBzdHIpCnsKICAgIGlmICghc3RyLmdldERhdGEoKSkKICAgICAgICByZXR1cm4gKG9zIDw8ICIiKTsKICAgIG9zIDw8IHN0ci5nZXREYXRhKCk7CiAgICByZXR1cm4gb3M7Cn0KCmF1dG8gbWFpbigpLT5pbnQKewogICAgLy9PYmplY3QgZGlyZWN0IGluaXRpYWxpemF0aW9uCiAgICBTVFIgYXsiU2ltcGxlIHRleHQifTsKICAgIC8vT2JqZWN0IGRpcmVjdCBpbml0aWFsaXphdGlvbgogICAgU1RSIGIgPSAiQW5vdGhlciB0ZXh0IjsKICAgIFNUUiBjID0gYTsKICAgIC8vRW1wdHkgb2JqIGNyZWF0aW9uCiAgICBTVFIgZDsKICAgIHN0ZDo6Y291dCA8PCAiZDoiIDw8IGQgPDwgJ1xuJzsKICAgIC8vRW1wdHkgb2JqZWN0IGFzc2lnbm1lbnQKICAgIGQgPSBzdGQ6Om1vdmUoYyk7CiAgICBzdGQ6OmNvdXQgPDwgImQ6IiA8PCBkIDw8ICdcbic7CiAgICAvL0V4aXN0aW5nIG9iamVjdCBhc3NpZ25tZW50CiAgICBiID0gZDsKICAgIHN0ZDo6Y291dCA8PCAiYjoiIDw8IGIgPDwgJ1xuJzsKICAgIC8vT2JqZWN0IGFzc2lnbWVudCB1c2luZyBjb25zdCBjaGFyKgogICAgYSA9ICJXaGF0IG5leHQiOwogICAgc3RkOjpjb3V0IDw8ICJhOiIgPDwgYSA8PCdcbic7Cn0=