Core/String: Replace Resize argument by flags, it is now capable of handling UTF-8 sequences

Former-commit-id: 472e3504de06166049fcf1b850c38e5646a2d872
This commit is contained in:
Lynix 2015-12-11 13:35:44 +01:00
parent bff0e2df21
commit 3cdf6a9f44
2 changed files with 27 additions and 15 deletions

View File

@ -119,8 +119,8 @@ namespace Nz
void Reserve(std::size_t bufferSize); void Reserve(std::size_t bufferSize);
String& Resize(std::intmax_t size, char character = ' '); String& Resize(std::intmax_t size, UInt32 flags = None);
String Resized(std::intmax_t size, char character = ' ') const; String Resized(std::intmax_t size, UInt32 flags = None) const;
String& Reverse(); String& Reverse();
String Reversed() const; String Reversed() const;

View File

@ -2469,7 +2469,7 @@ namespace Nz
m_sharedString = std::move(newString); m_sharedString = std::move(newString);
} }
String& String::Resize(std::intmax_t size, char character) String& String::Resize(std::intmax_t size, UInt32 flags)
{ {
if (size == 0) if (size == 0)
{ {
@ -2481,14 +2481,22 @@ namespace Nz
size = std::max<std::intmax_t>(m_sharedString->size + size, 0); size = std::max<std::intmax_t>(m_sharedString->size + size, 0);
std::size_t newSize = static_cast<std::size_t>(size); std::size_t newSize = static_cast<std::size_t>(size);
if (flags & HandleUtf8 && newSize < m_sharedString->size)
{
std::size_t characterToRemove = m_sharedString->size - newSize;
char* ptr = &m_sharedString->string[m_sharedString->size];
for (std::size_t i = 0; i < characterToRemove; ++i)
utf8::prior(ptr, m_sharedString->string.get());
newSize = ptr - m_sharedString->string.get();
}
if (m_sharedString->capacity >= newSize) if (m_sharedString->capacity >= newSize)
{ {
EnsureOwnership(); EnsureOwnership();
// We've got the space required, just fill it up
if (character != '\0' && newSize > m_sharedString->size)
std::memset(&m_sharedString->string[m_sharedString->size], character, newSize - m_sharedString->size);
m_sharedString->size = newSize; m_sharedString->size = newSize;
m_sharedString->string[newSize] = '\0'; // Adds the EoS character m_sharedString->string[newSize] = '\0'; // Adds the EoS character
} }
@ -2497,16 +2505,13 @@ namespace Nz
auto newString = std::make_shared<SharedString>(newSize); auto newString = std::make_shared<SharedString>(newSize);
std::memcpy(newString->string.get(), m_sharedString->string.get(), m_sharedString->size); std::memcpy(newString->string.get(), m_sharedString->string.get(), m_sharedString->size);
if (character != '\0')
std::memset(&newString->string[m_sharedString->size], character, newSize - m_sharedString->size);
m_sharedString = std::move(newString); m_sharedString = std::move(newString);
} }
return *this; return *this;
} }
String String::Resized(std::intmax_t size, char character) const String String::Resized(std::intmax_t size, UInt32 flags) const
{ {
if (size < 0) if (size < 0)
size = m_sharedString->size + size; size = m_sharedString->size + size;
@ -2518,13 +2523,20 @@ namespace Nz
if (newSize == m_sharedString->size) if (newSize == m_sharedString->size)
return *this; return *this;
if (flags & HandleUtf8 && newSize < m_sharedString->size)
{
std::size_t characterToRemove = m_sharedString->size - newSize;
char* ptr = &m_sharedString->string[m_sharedString->size - 1];
for (std::size_t i = 0; i < characterToRemove; ++i)
utf8::prior(ptr, m_sharedString->string.get());
newSize = ptr - m_sharedString->string.get();
}
auto sharedStr = std::make_shared<SharedString>(newSize); auto sharedStr = std::make_shared<SharedString>(newSize);
if (newSize > m_sharedString->size) if (newSize > m_sharedString->size)
{
std::memcpy(sharedStr->string.get(), m_sharedString->string.get(), m_sharedString->size); std::memcpy(sharedStr->string.get(), m_sharedString->string.get(), m_sharedString->size);
if (character != '\0')
std::memset(&sharedStr->string[m_sharedString->size], character, newSize - m_sharedString->size);
}
else else
std::memcpy(sharedStr->string.get(), m_sharedString->string.get(), newSize); std::memcpy(sharedStr->string.get(), m_sharedString->string.get(), newSize);