mirror of
https://github.com/pocoproject/poco.git
synced 2025-10-27 02:53:10 +01:00
enh(Ascii): improve performance for toLower/toUpper #3462
This commit is contained in:
@@ -208,7 +208,7 @@ inline bool Ascii::isPrintable(int ch)
|
|||||||
inline int Ascii::toLower(int ch)
|
inline int Ascii::toLower(int ch)
|
||||||
{
|
{
|
||||||
if (isUpper(ch))
|
if (isUpper(ch))
|
||||||
return ch + 32;
|
return ch | 0x20;
|
||||||
else
|
else
|
||||||
return ch;
|
return ch;
|
||||||
}
|
}
|
||||||
@@ -217,7 +217,7 @@ inline int Ascii::toLower(int ch)
|
|||||||
inline int Ascii::toUpper(int ch)
|
inline int Ascii::toUpper(int ch)
|
||||||
{
|
{
|
||||||
if (isLower(ch))
|
if (isLower(ch))
|
||||||
return ch - 32;
|
return ch & ~0x20;
|
||||||
else
|
else
|
||||||
return ch;
|
return ch;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -116,12 +116,22 @@ template <class S>
|
|||||||
S toUpper(const S& str)
|
S toUpper(const S& str)
|
||||||
/// Returns a copy of str containing all upper-case characters.
|
/// Returns a copy of str containing all upper-case characters.
|
||||||
{
|
{
|
||||||
typename S::const_iterator it = str.begin();
|
S result(str);
|
||||||
typename S::const_iterator end = str.end();
|
|
||||||
|
|
||||||
S result;
|
typename S::iterator it = result.begin();
|
||||||
result.reserve(str.size());
|
typename S::iterator end = result.end();
|
||||||
while (it != end) result += static_cast<typename S::value_type>(Ascii::toUpper(*it++));
|
|
||||||
|
#if defined(__clang__) && ((__clang_major__ > 3) || (__clang_major__ == 3 && __clang_minor__ >= 6))
|
||||||
|
# pragma clang loop unroll(enable)
|
||||||
|
#elif defined(POCO_MSVS_VERSION) && (POCO_MSVS_VERSION >= 2017)
|
||||||
|
# pragma loop(hint_parallel(0))
|
||||||
|
#endif
|
||||||
|
while (it != end)
|
||||||
|
{
|
||||||
|
int ch = static_cast<unsigned char>(*it);
|
||||||
|
*it = static_cast<typename S::value_type>(Ascii::toUpper(ch));
|
||||||
|
++it;
|
||||||
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -133,7 +143,17 @@ S& toUpperInPlace(S& str)
|
|||||||
typename S::iterator it = str.begin();
|
typename S::iterator it = str.begin();
|
||||||
typename S::iterator end = str.end();
|
typename S::iterator end = str.end();
|
||||||
|
|
||||||
while (it != end) { *it = static_cast<typename S::value_type>(Ascii::toUpper(*it)); ++it; }
|
#if defined(__clang__) && ((__clang_major__ > 3) || (__clang_major__ == 3 && __clang_minor__ >= 6))
|
||||||
|
# pragma clang loop unroll(enable)
|
||||||
|
#elif defined(POCO_MSVS_VERSION) && (POCO_MSVS_VERSION >= 2017)
|
||||||
|
# pragma loop(hint_parallel(0))
|
||||||
|
#endif
|
||||||
|
while (it != end)
|
||||||
|
{
|
||||||
|
int ch = static_cast<unsigned char>(*it);
|
||||||
|
*it = static_cast<typename S::value_type>(Ascii::toUpper(ch));
|
||||||
|
++it;
|
||||||
|
}
|
||||||
return str;
|
return str;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -142,12 +162,22 @@ template <class S>
|
|||||||
S toLower(const S& str)
|
S toLower(const S& str)
|
||||||
/// Returns a copy of str containing all lower-case characters.
|
/// Returns a copy of str containing all lower-case characters.
|
||||||
{
|
{
|
||||||
typename S::const_iterator it = str.begin();
|
S result(str);
|
||||||
typename S::const_iterator end = str.end();
|
|
||||||
|
|
||||||
S result;
|
typename S::iterator it = result.begin();
|
||||||
result.reserve(str.size());
|
typename S::iterator end = result.end();
|
||||||
while (it != end) result += static_cast<typename S::value_type>(Ascii::toLower(*it++));
|
|
||||||
|
#if defined(__clang__) && ((__clang_major__ > 3) || (__clang_major__ == 3 && __clang_minor__ >= 6))
|
||||||
|
# pragma clang loop unroll(enable)
|
||||||
|
#elif defined(POCO_MSVS_VERSION) && (POCO_MSVS_VERSION >= 2017)
|
||||||
|
# pragma loop(hint_parallel(0))
|
||||||
|
#endif
|
||||||
|
while (it != end)
|
||||||
|
{
|
||||||
|
int ch = static_cast<unsigned char>(*it);
|
||||||
|
*it = static_cast<typename S::value_type>(Ascii::toLower(ch));
|
||||||
|
++it;
|
||||||
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -159,7 +189,17 @@ S& toLowerInPlace(S& str)
|
|||||||
typename S::iterator it = str.begin();
|
typename S::iterator it = str.begin();
|
||||||
typename S::iterator end = str.end();
|
typename S::iterator end = str.end();
|
||||||
|
|
||||||
while (it != end) { *it = static_cast<typename S::value_type>(Ascii::toLower(*it)); ++it; }
|
#if defined(__clang__) && ((__clang_major__ > 3) || (__clang_major__ == 3 && __clang_minor__ >= 6))
|
||||||
|
# pragma clang loop unroll(enable)
|
||||||
|
#elif defined(POCO_MSVS_VERSION) && (POCO_MSVS_VERSION >= 2017)
|
||||||
|
# pragma loop(hint_parallel(0))
|
||||||
|
#endif
|
||||||
|
while (it != end)
|
||||||
|
{
|
||||||
|
int ch = static_cast<unsigned char>(*it);
|
||||||
|
*it = static_cast<typename S::value_type>(Ascii::toLower(ch));
|
||||||
|
++it;
|
||||||
|
}
|
||||||
return str;
|
return str;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user