79 lines
1.8 KiB
C++
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;
|
|
} |