diff --git a/sal/rtl/string.cxx b/sal/rtl/string.cxx index 23196e528682..06cde3c4faad 100644 --- a/sal/rtl/string.cxx +++ b/sal/rtl/string.cxx @@ -638,19 +638,19 @@ void SAL_CALL rtl_string_newReplaceStrAt_WithLength(rtl_String** ppThis, rtl_Str void SAL_CALL rtl_string_newReplace(rtl_String** ppThis, rtl_String* pStr, char cOld, char cNew) SAL_THROW_EXTERN_C() { - rtl::str::newReplace(ppThis, pStr, cOld, cNew); + rtl::str::newReplaceChars(ppThis, pStr, rtl::str::FromTo(cOld, cNew)); } void SAL_CALL rtl_string_newToAsciiLowerCase(rtl_String** ppThis, rtl_String* pStr) SAL_THROW_EXTERN_C() { - rtl::str::newReplaceChars(ppThis, pStr); + rtl::str::newReplaceChars(ppThis, pStr, rtl::str::toAsciiLower); } void SAL_CALL rtl_string_newToAsciiUpperCase(rtl_String** ppThis, rtl_String* pStr) SAL_THROW_EXTERN_C() { - rtl::str::newReplaceChars(ppThis, pStr); + rtl::str::newReplaceChars(ppThis, pStr, rtl::str::toAsciiUpper); } void SAL_CALL rtl_string_newTrim(rtl_String** ppThis, rtl_String* pStr) SAL_THROW_EXTERN_C() diff --git a/sal/rtl/strtmpl.hxx b/sal/rtl/strtmpl.hxx index ba182f87817e..cbbef030198f 100644 --- a/sal/rtl/strtmpl.hxx +++ b/sal/rtl/strtmpl.hxx @@ -87,35 +87,20 @@ template struct with_length auto end() const { return p + len; } }; -struct ToAsciiLower +template struct CaseReplace { - template static bool Applicable(C c) - { - return rtl::isAsciiUpperCase(UChar(c)); - } - template static C Replace(C c) - { - return rtl::toAsciiLowerCase(UChar(c)); - } -} constexpr toAsciiLower; - -struct ToAsciiUpper -{ - template static bool Applicable(C c) - { - return rtl::isAsciiLowerCase(UChar(c)); - } - template static C Replace(C c) - { - return rtl::toAsciiUpperCase(UChar(c)); - } -} constexpr toAsciiUpper; + static auto Applicable() { return [](auto c) { return fApplicable(UChar(c)); }; } + template static C Replace(C c) { return fReplace(UChar(c)); } +}; +constexpr CaseReplace toAsciiLower; +constexpr CaseReplace toAsciiUpper; template struct FromTo { C from; C to; FromTo(C cFrom, C cTo) : from(cFrom), to(cTo) {} + auto Applicable() const { return [this](C c) { return c == from; }; } C Replace(C c) const { return c == from ? to : c; } }; @@ -1112,14 +1097,14 @@ void newReplaceStrAt(rtl_tString** ppThis, rtl_tString* pStr, sal_Int32 nIndex, /* ----------------------------------------------------------------------- */ -template -void newReplaceChars(rtl_tString** ppThis, rtl_tString* pStr) +template +void newReplaceChars(rtl_tString** ppThis, rtl_tString* pStr, Replacer replacer) { assert(ppThis); assert(pStr); const auto pEnd = pStr->buffer + pStr->length; - auto pCharStr = std::find_if(pStr->buffer, pEnd, [](auto c) { return Traits::Applicable(c); }); + auto pCharStr = std::find_if(pStr->buffer, pEnd, replacer.Applicable()); if (pCharStr != pEnd) { rtl_tString* pOrg = *ppThis; @@ -1133,7 +1118,7 @@ void newReplaceChars(rtl_tString** ppThis, rtl_tString* pStr) /* replace/copy rest of the string */ do { - *pNewCharStr = Traits::Replace(*pCharStr); + *pNewCharStr = replacer.Replace(*pCharStr); pNewCharStr++; pCharStr++; } while (pCharStr != pEnd); @@ -1367,13 +1352,6 @@ void newReplaceAllFromIndex(S** s, S* s1, CharTypeFrom const* from, sal_Int32 fr RTL_LOG_STRING_NEW(*s); } -template -void newReplace(rtl_tString** ppThis, rtl_tString* pStr, - Char_T cOld, Char_T cNew) -{ - return newReplaceAllFromIndex(ppThis, pStr, &cOld, 1, &cNew, 1, 0); -} - template void newReplaceFirst(rtl_tString** s, rtl_tString* s1, C1 const* from, sal_Int32 fromLength, C2 const* to, sal_Int32 toLength, sal_Int32& fromIndex) diff --git a/sal/rtl/ustring.cxx b/sal/rtl/ustring.cxx index fc23cf37a338..c863be00512b 100644 --- a/sal/rtl/ustring.cxx +++ b/sal/rtl/ustring.cxx @@ -1272,19 +1272,19 @@ void SAL_CALL rtl_uString_newReplaceStrAtUtf16L(rtl_uString** ppThis, rtl_uStrin void SAL_CALL rtl_uString_newReplace(rtl_uString** ppThis, rtl_uString* pStr, sal_Unicode cOld, sal_Unicode cNew) SAL_THROW_EXTERN_C() { - rtl::str::newReplace(ppThis, pStr, cOld, cNew); + rtl::str::newReplaceChars(ppThis, pStr, rtl::str::FromTo(cOld, cNew)); } void SAL_CALL rtl_uString_newToAsciiLowerCase(rtl_uString** ppThis, rtl_uString* pStr) SAL_THROW_EXTERN_C() { - rtl::str::newReplaceChars(ppThis, pStr); + rtl::str::newReplaceChars(ppThis, pStr, rtl::str::toAsciiLower); } void SAL_CALL rtl_uString_newToAsciiUpperCase(rtl_uString** ppThis, rtl_uString* pStr) SAL_THROW_EXTERN_C() { - rtl::str::newReplaceChars(ppThis, pStr); + rtl::str::newReplaceChars(ppThis, pStr, rtl::str::toAsciiUpper); } void SAL_CALL rtl_uString_newTrim(rtl_uString** ppThis, rtl_uString* pStr) SAL_THROW_EXTERN_C()