Optimized String::GetWord (2x faster)

Former-commit-id: 9257614bff0d2a38d089f8073ce7f7de2fa51467
This commit is contained in:
Lynix 2013-06-19 14:59:02 +02:00
parent 3f9faa3a5a
commit 17c9461610
1 changed files with 29 additions and 14 deletions

View File

@ -1821,24 +1821,39 @@ wchar_t* NzString::GetWideBuffer(unsigned int* size) const
NzString NzString::GetWord(unsigned int index, nzUInt32 flags) const NzString NzString::GetWord(unsigned int index, nzUInt32 flags) const
{ {
if (m_sharedString->size == 0) unsigned int startPos = GetWordPosition(index, flags);
if (startPos == npos)
return NzString(); return NzString();
NzString temp = Simplified(flags); // Évitons les mauvaises surprises int endPos = -1;
if (temp.IsEmpty()) const char* ptr = &m_sharedString->string[startPos];
return NzString(); if (flags & HandleUtf8)
unsigned int foundPos = temp.Find(' '); // Simplified nous assure que nous n'avons plus que des espaces comme séparation
unsigned int lastPos = 0;
for (; index > 0; --index)
{ {
if (foundPos == npos) utf8::unchecked::iterator<const char*> it(ptr);
return NzString(); do
{
lastPos = foundPos; if (NzUnicode::GetCategory(*it) & NzUnicode::Category_Separator)
foundPos = temp.Find(' ', foundPos+1); {
endPos = static_cast<int>(it.base() - m_sharedString->string - 1);
break;
}
}
while (*++it);
} }
return temp.SubString((lastPos == 0) ? 0 : lastPos+1, (foundPos == npos) ? -1 : static_cast<int>(foundPos-1)); else
{
do
{
if (std::isspace(*ptr))
{
endPos = static_cast<int>(ptr - m_sharedString->string - 1);
break;
}
}
while (*++ptr);
}
return SubString(startPos, endPos);
} }
unsigned int NzString::GetWordPosition(unsigned int index, nzUInt32 flags) const unsigned int NzString::GetWordPosition(unsigned int index, nzUInt32 flags) const