2026-01-19 20:18:08 +02:00

79 lines
1.8 KiB
C++

#define _GLIBCXX_USE_CXX11_ABI 0
#include "string.h"
mcpe::string* mcpe::string::empty;
mcpe::string::string() {
ptr = empty->ptr;
}
mcpe::string::string(const char *str) {
if (str[0] == '\0') {
ptr = empty->ptr;
} else {
new (this) std::string(str);
}
}
mcpe::string::string(const char *str, size_t len) {
if (len == 0) {
ptr = empty->ptr;
} else {
new (this) std::string(str, len);
}
}
mcpe::string::string(const string &str) {
if (str.ptr == empty->ptr) {
ptr = empty->ptr;
} else {
new (this) std::string(*((const std::string *) &str));
}
}
mcpe::string::~string() {
if (ptr == empty->ptr)
return;
((std::string*) this)->~basic_string<char>();
}
size_t mcpe::string::length() const {
if (ptr == empty->ptr)
return 0;
return ((std::string*) this)->length();
}
mcpe::string mcpe::string::operator+(const string &str) {
return *((std::string*) this) + *((std::string*) &str);
}
mcpe::string& mcpe::string::operator=(const mcpe::string &str) {
if (this == &str)
return *this;
if (ptr != empty->ptr) {
if (str.ptr == empty->ptr) {
((std::string*) this)->~basic_string<char>();
ptr = empty->ptr;
} else {
*((std::string*) this) = *((const std::string*) &str);
}
} else {
if (str.ptr != empty->ptr) {
new (this) std::string(*((const std::string*)&str));
}
}
return *this;
}
const char *mcpe::string::c_str() const {
if (ptr == empty->ptr)
return "";
return ((std::string*) this)->c_str();
}
std::ostream& operator<< (std::ostream& os, const mcpe::string& obj) {
os << *((std::string const*) &obj);
return os;
}