diff options
author | Kevin Han <kevhan@google.com> | 2019-08-30 23:43:45 +0000 |
---|---|---|
committer | Steven Moreland <smoreland@google.com> | 2019-08-30 23:50:38 +0000 |
commit | 1270e4fbf17402fb01dbfa7928a654d41d8553ee (patch) | |
tree | 59fa127f76ea3f705e92611f3ee3bbfc7306293e /libutils/String16.cpp | |
parent | c55ac92bd6b6f14778758893730415f5328da530 (diff) |
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
Diffstat (limited to 'libutils/String16.cpp')
-rw-r--r-- | libutils/String16.cpp | 157 |
1 files changed, 46 insertions, 111 deletions
diff --git a/libutils/String16.cpp b/libutils/String16.cpp index 5c3cf3261..818b17124 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 @@ char16_t* String16::allocFromUTF8(const char* u8str, size_t u8len) 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 @@ char16_t* String16::allocFromUTF8(const char* u8str, size_t u8len) 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 @@ String16::String16(StaticLinkage) // 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(StaticLinkage) 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(const char* o, size_t len) 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 @@ status_t String16::setTo(const char16_t* other, size_t len) 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 @@ status_t String16::append(const String16& other) 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 @@ status_t String16::append(const char16_t* chrs, size_t otherLen) 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 @@ status_t String16::insert(size_t pos, const char16_t* chrs, size_t len) 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 @@ bool String16::contains(const char16_t* chrs) const 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 @@ status_t String16::replaceAll(char16_t replaceThis, char16_t withThis) { 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 @@ status_t String16::remove(size_t len, size_t begin) { const size_t N = size(); if (begin >= N) { - release(); + SharedBuffer::bufferFromData(mString)->release(); mString = getEmptyString(); return OK; } @@ -462,7 +395,8 @@ status_t String16::remove(size_t len, size_t begin) } 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 @@ status_t String16::remove(size_t len, size_t begin) 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; |