Last active
July 21, 2017 05:31
-
-
Save jackoalan/9b177a4a5802f6c97b8a11cc4acf35f3 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
template <typename _CharTp> | |
class basic_string | |
{ | |
struct COWData | |
{ | |
uint32_t x0_capacity; | |
uint32_t x4_refCount; | |
_CharTp x8_data[]; | |
}; | |
const _CharTp* x0_ptr; | |
COWData* x4_cow; | |
uint32_t x8_size; | |
void internal_allocate(int size) | |
{ | |
x4_cow = reinterpret_cast<COWData*>(new uint8_t[size * sizeof(_CharTp) + 8]); | |
x0_ptr = x4_cow->x8_data; | |
x4_cow->x0_capacity = uint32_t(size); | |
x4_cow->x4_refCount = 1; | |
} | |
static const _CharTp _EmptyString; | |
public: | |
struct literal_t {}; | |
basic_string(literal_t, const _CharTp* data) | |
{ | |
x0_ptr = data; | |
x4_cow = nullptr; | |
const _CharTp* it = data; | |
while (*it) | |
++it; | |
x8_size = uint32_t((it - data) / sizeof(_CharTp)); | |
} | |
basic_string(const basic_string& str) | |
{ | |
x0_ptr = str.x0_ptr; | |
x4_cow = str.x4_cow; | |
x8_size = str.x8_size; | |
if (x4_cow) | |
++x4_cow->x4_refCount; | |
} | |
basic_string(const _CharTp* data, int size) | |
{ | |
if (size <= 0 && !data) | |
{ | |
x0_ptr = &_EmptyString; | |
x4_cow = nullptr; | |
x8_size = 0; | |
return; | |
} | |
const _CharTp* it = data; | |
uint32_t len = 0; | |
while (*it) | |
{ | |
if (size != -1 && len >= size) | |
break; | |
++it; | |
++len; | |
} | |
internal_allocate(len + 1); | |
x8_size = len; | |
for (int i = 0; i < len; ++i) | |
x4_cow->x8_data[i] = data[i]; | |
x4_cow->x8_data[len] = 0; | |
} | |
~basic_string() | |
{ | |
if (x4_cow && --x4_cow->x4_refCount == 0) | |
delete[] x4_cow; | |
} | |
}; | |
template <> | |
const char basic_string<char>::_EmptyString = 0; | |
template <> | |
const wchar_t basic_string<wchar_t>::_EmptyString = 0; | |
typedef basic_string<wchar_t> wstring; | |
typedef basic_string<char> string; | |
wstring wstring_l(const wchar_t* data) | |
{ | |
return wstring(wstring::literal_t(), data); | |
} | |
string string_l(const char* data) | |
{ | |
return string(string::literal_t(), data); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment