[fbreader] Optimized ZLUnicodeUtil::toLower and toUpper for ASCII
Performance analysis shows that UTF8->UCS4->UTF8 conversion takes noticeable amount of CPU time. For ASCII strings it's unnecessary.
This commit is contained in:
parent
61adf35e4f
commit
4026ae35d1
1 changed files with 26 additions and 12 deletions
|
@ -450,13 +450,20 @@ void ZLUnicodeUtil::toLower(Ucs4String &str) {
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string ZLUnicodeUtil::toLower(const std::string &utf8String) {
|
std::string ZLUnicodeUtil::toLower(const std::string &utf8String) {
|
||||||
|
std::string result;
|
||||||
|
const int utf8Len = utf8String.length();
|
||||||
|
if (utf8Length(utf8String) == utf8Len) {
|
||||||
|
// ASCII string
|
||||||
|
result.reserve(utf8Len);
|
||||||
|
for (std::string::const_iterator it = utf8String.begin(); it != utf8String.end(); ++it) {
|
||||||
|
result.append(1, tolower(*it));
|
||||||
|
}
|
||||||
|
} else {
|
||||||
Ucs4String ucs4String;
|
Ucs4String ucs4String;
|
||||||
utf8ToUcs4(ucs4String, utf8String);
|
utf8ToUcs4(ucs4String, utf8String);
|
||||||
|
|
||||||
toLower(ucs4String);
|
toLower(ucs4String);
|
||||||
|
ucs4ToUtf8(result, ucs4String, utf8Len);
|
||||||
std::string result;
|
}
|
||||||
ucs4ToUtf8(result, ucs4String, utf8String.length());
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -473,12 +480,19 @@ void ZLUnicodeUtil::toUpper(Ucs4String &str) {
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string ZLUnicodeUtil::toUpper(const std::string &utf8String) {
|
std::string ZLUnicodeUtil::toUpper(const std::string &utf8String) {
|
||||||
|
std::string result;
|
||||||
|
const int utf8Len = utf8String.length();
|
||||||
|
if (utf8Length(utf8String) == utf8Len) {
|
||||||
|
// ASCII string
|
||||||
|
result.reserve(utf8Len);
|
||||||
|
for (std::string::const_iterator it = utf8String.begin(); it != utf8String.end(); ++it) {
|
||||||
|
result.append(1, toupper(*it));
|
||||||
|
}
|
||||||
|
} else {
|
||||||
Ucs4String ucs4String;
|
Ucs4String ucs4String;
|
||||||
utf8ToUcs4(ucs4String, utf8String);
|
utf8ToUcs4(ucs4String, utf8String);
|
||||||
|
|
||||||
toUpper(ucs4String);
|
toUpper(ucs4String);
|
||||||
|
ucs4ToUtf8(result, ucs4String, utf8Len);
|
||||||
std::string result;
|
}
|
||||||
ucs4ToUtf8(result, ucs4String, utf8String.length());
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue