Revert "Reland "libutils: Introduce StaticString16"""
This reverts commit c55ac92bd6b6f14778758893730415f5328da530.
Reason for revert: Breaks down-stream branches. See b/140315617
Change-Id: I4937fdf4bdcc7a44d5f10700ecf2d5e96aef7d27
Merged-In: I8da93f2c9b95183e32d4a2ea895f90c449abbe4d
diff --git a/libutils/String16.cpp b/libutils/String16.cpp
index 5c3cf32..818b171 100644
--- a/libutils/String16.cpp
+++ b/libutils/String16.cpp
@@ -24,21 +24,21 @@
namespace android {
-static const StaticString16 emptyString(u"");
static inline char16_t* getEmptyString() {
- return const_cast<char16_t*>(emptyString.string());
+ static SharedBuffer* gEmptyStringBuf = [] {
+ SharedBuffer* buf = SharedBuffer::alloc(sizeof(char16_t));
+ char16_t* str = static_cast<char16_t*>(buf->data());
+ *str = 0;
+ return buf;
+ }();
+
+ gEmptyStringBuf->acquire();
+ return static_cast<char16_t*>(gEmptyStringBuf->data());
}
// ---------------------------------------------------------------------------
-void* String16::alloc(size_t size)
-{
- SharedBuffer* buf = SharedBuffer::alloc(size);
- buf->mClientMetadata = kIsSharedBufferAllocated;
- return buf;
-}
-
-char16_t* String16::allocFromUTF8(const char* u8str, size_t u8len)
+static char16_t* allocFromUTF8(const char* u8str, size_t u8len)
{
if (u8len == 0) return getEmptyString();
@@ -49,7 +49,7 @@
return getEmptyString();
}
- SharedBuffer* buf = static_cast<SharedBuffer*>(alloc(sizeof(char16_t) * (u16len + 1)));
+ SharedBuffer* buf = SharedBuffer::alloc(sizeof(char16_t)*(u16len+1));
if (buf) {
u8cur = (const uint8_t*) u8str;
char16_t* u16str = (char16_t*)buf->data();
@@ -66,13 +66,13 @@
return getEmptyString();
}
-char16_t* String16::allocFromUTF16(const char16_t* u16str, size_t u16len) {
+static char16_t* allocFromUTF16(const char16_t* u16str, size_t u16len) {
if (u16len >= SIZE_MAX / sizeof(char16_t)) {
android_errorWriteLog(0x534e4554, "73826242");
abort();
}
- SharedBuffer* buf = static_cast<SharedBuffer*>(alloc((u16len + 1) * sizeof(char16_t)));
+ SharedBuffer* buf = SharedBuffer::alloc((u16len + 1) * sizeof(char16_t));
ALOG_ASSERT(buf, "Unable to allocate shared buffer");
if (buf) {
char16_t* str = (char16_t*)buf->data();
@@ -97,8 +97,8 @@
// having run. In this case we always allocate an empty string. It's less
// efficient than using getEmptyString(), but we assume it's uncommon.
- SharedBuffer* buf = static_cast<SharedBuffer*>(alloc(sizeof(char16_t)));
- char16_t* data = static_cast<char16_t*>(buf->data());
+ char16_t* data = static_cast<char16_t*>(
+ SharedBuffer::alloc(sizeof(char16_t))->data());
data[0] = 0;
mString = data;
}
@@ -106,7 +106,7 @@
String16::String16(const String16& o)
: mString(o.mString)
{
- acquire();
+ SharedBuffer::bufferFromData(mString)->acquire();
}
String16::String16(const String16& o, size_t len, size_t begin)
@@ -136,30 +136,26 @@
String16::~String16()
{
- release();
+ SharedBuffer::bufferFromData(mString)->release();
}
size_t String16::size() const
{
- if (isStaticString()) {
- return staticStringSize();
- } else {
- return SharedBuffer::sizeFromData(mString) / sizeof(char16_t) - 1;
- }
+ return SharedBuffer::sizeFromData(mString)/sizeof(char16_t)-1;
}
void String16::setTo(const String16& other)
{
- release();
+ SharedBuffer::bufferFromData(other.mString)->acquire();
+ SharedBuffer::bufferFromData(mString)->release();
mString = other.mString;
- acquire();
}
status_t String16::setTo(const String16& other, size_t len, size_t begin)
{
const size_t N = other.size();
if (begin >= N) {
- release();
+ SharedBuffer::bufferFromData(mString)->release();
mString = getEmptyString();
return OK;
}
@@ -188,7 +184,8 @@
abort();
}
- SharedBuffer* buf = static_cast<SharedBuffer*>(editResize((len + 1) * sizeof(char16_t)));
+ SharedBuffer* buf = SharedBuffer::bufferFromData(mString)
+ ->editResize((len+1)*sizeof(char16_t));
if (buf) {
char16_t* str = (char16_t*)buf->data();
memmove(str, other, len*sizeof(char16_t));
@@ -215,8 +212,8 @@
abort();
}
- SharedBuffer* buf =
- static_cast<SharedBuffer*>(editResize((myLen + otherLen + 1) * sizeof(char16_t)));
+ SharedBuffer* buf = SharedBuffer::bufferFromData(mString)
+ ->editResize((myLen+otherLen+1)*sizeof(char16_t));
if (buf) {
char16_t* str = (char16_t*)buf->data();
memcpy(str+myLen, other, (otherLen+1)*sizeof(char16_t));
@@ -241,8 +238,8 @@
abort();
}
- SharedBuffer* buf =
- static_cast<SharedBuffer*>(editResize((myLen + otherLen + 1) * sizeof(char16_t)));
+ SharedBuffer* buf = SharedBuffer::bufferFromData(mString)
+ ->editResize((myLen+otherLen+1)*sizeof(char16_t));
if (buf) {
char16_t* str = (char16_t*)buf->data();
memcpy(str+myLen, chrs, otherLen*sizeof(char16_t));
@@ -276,8 +273,8 @@
len, myLen, String8(chrs, len).string());
#endif
- SharedBuffer* buf =
- static_cast<SharedBuffer*>(editResize((myLen + len + 1) * sizeof(char16_t)));
+ SharedBuffer* buf = SharedBuffer::bufferFromData(mString)
+ ->editResize((myLen+len+1)*sizeof(char16_t));
if (buf) {
char16_t* str = (char16_t*)buf->data();
if (pos < myLen) {
@@ -341,87 +338,23 @@
return strstr16(mString, chrs) != nullptr;
}
-void* String16::edit() {
- SharedBuffer* buf;
- if (isStaticString()) {
- buf = static_cast<SharedBuffer*>(alloc((size() + 1) * sizeof(char16_t)));
- if (buf) {
- buf->acquire();
- memcpy(buf->data(), mString, (size() + 1) * sizeof(char16_t));
- }
- } else {
- buf = SharedBuffer::bufferFromData(mString)->edit();
- buf->mClientMetadata = kIsSharedBufferAllocated;
- }
- return buf;
-}
-
-void* String16::editResize(size_t newSize) {
- SharedBuffer* buf;
- if (isStaticString()) {
- size_t copySize = (size() + 1) * sizeof(char16_t);
- if (newSize < copySize) {
- copySize = newSize;
- }
- buf = static_cast<SharedBuffer*>(alloc(newSize));
- if (buf) {
- buf->acquire();
- memcpy(buf->data(), mString, copySize);
- }
- } else {
- buf = SharedBuffer::bufferFromData(mString)->editResize(newSize);
- buf->mClientMetadata = kIsSharedBufferAllocated;
- }
- return buf;
-}
-
-void String16::acquire()
-{
- if (!isStaticString()) {
- SharedBuffer::bufferFromData(mString)->acquire();
- }
-}
-
-void String16::release()
-{
- if (!isStaticString()) {
- SharedBuffer::bufferFromData(mString)->release();
- }
-}
-
-bool String16::isStaticString() const {
- // See String16.h for notes on the memory layout of String16::StaticData and
- // SharedBuffer.
- static_assert(sizeof(SharedBuffer) - offsetof(SharedBuffer, mClientMetadata) == 4);
- const uint32_t* p = reinterpret_cast<const uint32_t*>(mString);
- return (*(p - 1) & kIsSharedBufferAllocated) == 0;
-}
-
-size_t String16::staticStringSize() const {
- // See String16.h for notes on the memory layout of String16::StaticData and
- // SharedBuffer.
- static_assert(sizeof(SharedBuffer) - offsetof(SharedBuffer, mClientMetadata) == 4);
- const uint32_t* p = reinterpret_cast<const uint32_t*>(mString);
- return static_cast<size_t>(*(p - 1));
-}
-
status_t String16::makeLower()
{
const size_t N = size();
const char16_t* str = string();
- char16_t* edited = nullptr;
+ char16_t* edit = nullptr;
for (size_t i=0; i<N; i++) {
const char16_t v = str[i];
if (v >= 'A' && v <= 'Z') {
- if (!edited) {
- SharedBuffer* buf = static_cast<SharedBuffer*>(edit());
+ if (!edit) {
+ SharedBuffer* buf = SharedBuffer::bufferFromData(mString)->edit();
if (!buf) {
return NO_MEMORY;
}
- edited = (char16_t*)buf->data();
- mString = str = edited;
+ edit = (char16_t*)buf->data();
+ mString = str = edit;
}
- edited[i] = tolower((char)v);
+ edit[i] = tolower((char)v);
}
}
return OK;
@@ -431,18 +364,18 @@
{
const size_t N = size();
const char16_t* str = string();
- char16_t* edited = nullptr;
+ char16_t* edit = nullptr;
for (size_t i=0; i<N; i++) {
if (str[i] == replaceThis) {
- if (!edited) {
- SharedBuffer* buf = static_cast<SharedBuffer*>(edit());
+ if (!edit) {
+ SharedBuffer* buf = SharedBuffer::bufferFromData(mString)->edit();
if (!buf) {
return NO_MEMORY;
}
- edited = (char16_t*)buf->data();
- mString = str = edited;
+ edit = (char16_t*)buf->data();
+ mString = str = edit;
}
- edited[i] = withThis;
+ edit[i] = withThis;
}
}
return OK;
@@ -452,7 +385,7 @@
{
const size_t N = size();
if (begin >= N) {
- release();
+ SharedBuffer::bufferFromData(mString)->release();
mString = getEmptyString();
return OK;
}
@@ -462,7 +395,8 @@
}
if (begin > 0) {
- SharedBuffer* buf = static_cast<SharedBuffer*>(editResize((N + 1) * sizeof(char16_t)));
+ SharedBuffer* buf = SharedBuffer::bufferFromData(mString)
+ ->editResize((N+1)*sizeof(char16_t));
if (!buf) {
return NO_MEMORY;
}
@@ -470,7 +404,8 @@
memmove(str, str+begin, (N-begin+1)*sizeof(char16_t));
mString = str;
}
- SharedBuffer* buf = static_cast<SharedBuffer*>(editResize((len + 1) * sizeof(char16_t)));
+ SharedBuffer* buf = SharedBuffer::bufferFromData(mString)
+ ->editResize((len+1)*sizeof(char16_t));
if (buf) {
char16_t* str = (char16_t*)buf->data();
str[len] = 0;