Added String::Set method

Also improved performances in some cases


Former-commit-id: f88dbd0685b8779715e316e9d85ec005ab72e1fb
This commit is contained in:
Lynix 2014-01-15 14:40:15 +01:00
parent 5876e1c17a
commit 151a34b35b
2 changed files with 154 additions and 79 deletions

View File

@ -33,7 +33,7 @@ class NAZARA_API NzString : public NzHashable
NzString();
explicit NzString(char character);
explicit NzString(unsigned int length, char character = '\0');
explicit NzString(unsigned int length, char character);
NzString(const char* string);
NzString(const char* string, unsigned int length);
NzString(const std::string& string);
@ -124,6 +124,15 @@ class NAZARA_API NzString : public NzHashable
NzString& Reverse();
NzString Reversed() const;
NzString& Set(char character);
NzString& Set(unsigned int length, char character);
NzString& Set(const char* string);
NzString& Set(const char* string, unsigned int length);
NzString& Set(const std::string& string);
NzString& Set(const NzString& string);
NzString& Set(NzString&& string) noexcept;
NzString& Set(SharedString* sharedString);
NzString Simplified(nzUInt32 flags = None) const;
NzString& Simplify(nzUInt32 flags = None);
@ -310,7 +319,7 @@ class NAZARA_API NzString : public NzHashable
static const unsigned int npos;
private:
void EnsureOwnership();
void EnsureOwnership(bool discardContent = false);
bool FillHash(NzAbstractHash* hash) const;
void ReleaseString();

View File

@ -189,7 +189,7 @@ void NzString::Clear(bool keepBuffer)
{
if (keepBuffer)
{
EnsureOwnership();
EnsureOwnership(true);
m_sharedString->size = 0;
}
else
@ -2631,6 +2631,137 @@ NzString NzString::Reversed() const
return NzString(new SharedString(1, m_sharedString->size, m_sharedString->size, str));
}
NzString& NzString::Set(char character)
{
if (character != '\0')
{
if (m_sharedString->capacity >= 1)
EnsureOwnership(true);
else
{
ReleaseString();
m_sharedString = new SharedString;
m_sharedString->capacity = 1;
m_sharedString->string = new char[2];
}
m_sharedString->size = 1;
m_sharedString->string[0] = character;
m_sharedString->string[1] = '\0';
}
else
ReleaseString();
return *this;
}
NzString& NzString::Set(unsigned int length, char character)
{
if (length > 0)
{
if (m_sharedString->capacity >= length)
EnsureOwnership(true);
else
{
ReleaseString();
m_sharedString = new SharedString;
m_sharedString->capacity = length;
m_sharedString->string = new char[length+1];
}
m_sharedString->size = length;
if (character != '\0')
std::memset(m_sharedString->string, character, length);
m_sharedString->string[length] = '\0';
}
else
ReleaseString();
return *this;
}
NzString& NzString::Set(const char* string)
{
return Set(string, (string) ? std::strlen(string) : 0);
}
NzString& NzString::Set(const char* string, unsigned int length)
{
if (length > 0)
{
if (m_sharedString->capacity >= length)
EnsureOwnership(true);
else
{
ReleaseString();
m_sharedString = new SharedString;
m_sharedString->capacity = length;
m_sharedString->string = new char[length+1];
}
m_sharedString->size = length;
std::memcpy(m_sharedString->string, string, length);
m_sharedString->string[length] = '\0';
}
else
ReleaseString();
return *this;
}
NzString& NzString::Set(const std::string& string)
{
if (string.size() > 0)
{
if (m_sharedString->capacity >= string.size())
EnsureOwnership(true);
else
{
ReleaseString();
m_sharedString = new SharedString;
m_sharedString->capacity = string.size();
m_sharedString->string = new char[string.size()+1];
}
m_sharedString->size = string.size();
std::memcpy(m_sharedString->string, string.c_str(), string.size()+1);
}
else
ReleaseString();
return *this;
}
NzString& NzString::Set(const NzString& string)
{
ReleaseString();
m_sharedString = string.m_sharedString;
if (m_sharedString != &emptyString)
m_sharedString->refCount++;
return *this;
}
NzString& NzString::Set(NzString&& string) noexcept
{
std::swap(m_sharedString, string.m_sharedString);
return *this;
}
NzString& NzString::Set(SharedString* sharedString)
{
ReleaseString();
m_sharedString = sharedString;
return *this;
}
NzString NzString::Simplified(nzUInt32 flags) const
{
if (m_sharedString->size == 0)
@ -2694,7 +2825,7 @@ NzString NzString::Simplified(nzUInt32 flags) const
NzString& NzString::Simplify(nzUInt32 flags)
{
return operator=(Simplified(flags));
return Set(Simplified(flags));
}
unsigned int NzString::Split(std::vector<NzString>& result, char separation, int start, nzUInt32 flags) const
@ -3189,12 +3320,12 @@ NzString NzString::ToUpper(nzUInt32 flags) const
NzString& NzString::Trim(nzUInt32 flags)
{
return operator=(Trimmed(flags));
return Set(Trimmed(flags));
}
NzString& NzString::Trim(char character, nzUInt32 flags)
{
return operator=(Trimmed(character, flags));
return Set(Trimmed(character, flags));
}
NzString NzString::Trimmed(nzUInt32 flags) const
@ -3394,93 +3525,27 @@ char NzString::operator[](unsigned int pos) const
NzString& NzString::operator=(char character)
{
if (character != '\0')
{
if (m_sharedString->capacity >= 1)
EnsureOwnership();
else
{
ReleaseString();
m_sharedString = new SharedString;
m_sharedString->capacity = 1;
m_sharedString->string = new char[2];
}
m_sharedString->size = 1;
m_sharedString->string[0] = character;
m_sharedString->string[1] = '\0';
}
else
ReleaseString();
return *this;
return Set(character);
}
NzString& NzString::operator=(const char* string)
{
if (string && string[0] != '\0')
{
unsigned int size = std::strlen(string);
if (m_sharedString->capacity >= size)
EnsureOwnership();
else
{
ReleaseString();
m_sharedString = new SharedString;
m_sharedString->capacity = size;
m_sharedString->string = new char[size+1];
}
m_sharedString->size = size;
std::memcpy(m_sharedString->string, string, size+1);
}
else
ReleaseString();
return *this;
return Set(string);
}
NzString& NzString::operator=(const std::string& string)
{
if (string.size() > 0)
{
if (m_sharedString->capacity >= string.size())
EnsureOwnership();
else
{
ReleaseString();
m_sharedString = new SharedString;
m_sharedString->capacity = string.size();
m_sharedString->string = new char[string.size()+1];
}
m_sharedString->size = string.size();
std::memcpy(m_sharedString->string, string.c_str(), string.size()+1);
}
else
ReleaseString();
return *this;
return Set(string);
}
NzString& NzString::operator=(const NzString& string)
{
ReleaseString();
m_sharedString = string.m_sharedString;
if (m_sharedString != &emptyString)
m_sharedString->refCount++;
return *this;
return Set(string);
}
NzString& NzString::operator=(NzString&& string) noexcept
{
std::swap(m_sharedString, string.m_sharedString);
return *this;
return Set(string);
}
NzString NzString::operator+(char character) const
@ -4194,7 +4259,7 @@ bool operator>=(const std::string& string, const NzString& nstring)
return !operator<(string, nstring);
}
void NzString::EnsureOwnership()
void NzString::EnsureOwnership(bool discardContent)
{
if (m_sharedString == &emptyString)
return;
@ -4204,7 +4269,8 @@ void NzString::EnsureOwnership()
m_sharedString->refCount--;
char* string = new char[m_sharedString->capacity+1];
std::memcpy(string, m_sharedString->string, m_sharedString->size+1);
if (!discardContent)
std::memcpy(string, m_sharedString->string, m_sharedString->size+1);
m_sharedString = new SharedString(1, m_sharedString->capacity, m_sharedString->size, string);
}