mirror of
https://github.com/AxioDL/metaforce.git
synced 2025-12-09 07:47:42 +00:00
Additional CPlayer work
This commit is contained in:
103
Runtime/rstl.hpp
103
Runtime/rstl.hpp
@@ -60,6 +60,109 @@ ForwardIt binary_find(ForwardIt first, ForwardIt last, const T& value, GetKey ge
|
||||
first = std::lower_bound(first, last, value, comp);
|
||||
return (!(first == last) && !(value < getkey(*first))) ? first : last;
|
||||
}
|
||||
|
||||
#if 0
|
||||
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);
|
||||
}
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
#endif // __RSTL_HPP__
|
||||
|
||||
Reference in New Issue
Block a user