sal/rtl/string.cxx  |   12 ++--
 sal/rtl/strtmpl.hxx |  148 ++++++++++++----------------------------------------
 sal/rtl/ustring.cxx |   12 ++--
 3 files changed, 47 insertions(+), 125 deletions(-)

New commits:
commit 09a06141c516991865627f78e39593be856f6457
Author:     Mike Kaganski <mike.kagan...@collabora.com>
AuthorDate: Thu Mar 3 08:19:30 2022 +0300
Commit:     Mike Kaganski <mike.kagan...@collabora.com>
CommitDate: Thu Mar 3 17:36:42 2022 +0100

    Deduplicate some char replacement functions
    
    Change-Id: Ie65224066941dbab89abb6fc91e6cbfbc45bf201
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/130901
    Reviewed-by: Noel Grandin <noel.gran...@collabora.co.uk>
    Reviewed-by: Mike Kaganski <mike.kagan...@collabora.com>
    Tested-by: Jenkins

diff --git a/sal/rtl/string.cxx b/sal/rtl/string.cxx
index 9927451c8f9e..7112017826f1 100644
--- a/sal/rtl/string.cxx
+++ b/sal/rtl/string.cxx
@@ -441,33 +441,33 @@ sal_Int32 SAL_CALL 
rtl_str_lastIndexOfStr_WithLength(const char* pStr, sal_Int32
 
 void SAL_CALL rtl_str_replaceChar(char* pStr, char cOld, char cNew) 
SAL_THROW_EXTERN_C()
 {
-    return rtl::str::replaceChar(pStr, cOld, cNew);
+    return rtl::str::replaceChars(rtl::str::null_terminated(pStr), 
rtl::str::FromTo(cOld, cNew));
 }
 
 void SAL_CALL rtl_str_replaceChar_WithLength(char* pStr, sal_Int32 nLen, char 
cOld, char cNew)
     SAL_THROW_EXTERN_C()
 {
-    return rtl::str::replaceChar_WithLength(pStr, nLen, cOld, cNew);
+    return rtl::str::replaceChars(rtl::str::with_length(pStr, nLen), 
rtl::str::FromTo(cOld, cNew));
 }
 
 void SAL_CALL rtl_str_toAsciiLowerCase(char* pStr) SAL_THROW_EXTERN_C()
 {
-    return rtl::str::toAsciiLowerCase(pStr);
+    return rtl::str::replaceChars(rtl::str::null_terminated(pStr), 
rtl::str::toAsciiLower);
 }
 
 void SAL_CALL rtl_str_toAsciiLowerCase_WithLength(char* pStr, sal_Int32 nLen) 
SAL_THROW_EXTERN_C()
 {
-    return rtl::str::toAsciiLowerCase_WithLength(pStr, nLen);
+    return rtl::str::replaceChars(rtl::str::with_length(pStr, nLen), 
rtl::str::toAsciiLower);
 }
 
 void SAL_CALL rtl_str_toAsciiUpperCase(char* pStr) SAL_THROW_EXTERN_C()
 {
-    return rtl::str::toAsciiUpperCase(pStr);
+    return rtl::str::replaceChars(rtl::str::null_terminated(pStr), 
rtl::str::toAsciiUpper);
 }
 
 void SAL_CALL rtl_str_toAsciiUpperCase_WithLength(char* pStr, sal_Int32 nLen) 
SAL_THROW_EXTERN_C()
 {
-    return rtl::str::toAsciiUpperCase_WithLength(pStr, nLen);
+    return rtl::str::replaceChars(rtl::str::with_length(pStr, nLen), 
rtl::str::toAsciiUpper);
 }
 
 sal_Int32 SAL_CALL rtl_str_trim(char* pStr) SAL_THROW_EXTERN_C() { return 
rtl::str::trim(pStr); }
diff --git a/sal/rtl/strtmpl.hxx b/sal/rtl/strtmpl.hxx
index 7234afd39ec1..6fa400c0164f 100644
--- a/sal/rtl/strtmpl.hxx
+++ b/sal/rtl/strtmpl.hxx
@@ -80,6 +80,38 @@ template <typename C> struct with_length
     auto end() const { return p + len; }
 };
 
+struct ToAsciiLower
+{
+    template <typename C> static bool Applicable(C c)
+    {
+        return rtl::isAsciiUpperCase(IMPL_RTL_USTRCODE(c));
+    }
+    template <typename C> static C Replace(C c)
+    {
+        return rtl::toAsciiLowerCase(IMPL_RTL_USTRCODE(c));
+    }
+} constexpr toAsciiLower;
+
+struct ToAsciiUpper
+{
+    template <typename C> static bool Applicable(C c)
+    {
+        return rtl::isAsciiLowerCase(IMPL_RTL_USTRCODE(c));
+    }
+    template <typename C> static C Replace(C c)
+    {
+        return rtl::toAsciiUpperCase(IMPL_RTL_USTRCODE(c));
+    }
+} constexpr toAsciiUpper;
+
+template <typename C> struct FromTo
+{
+    C from;
+    C to;
+    FromTo(C cFrom, C cTo) : from(cFrom), to(cTo) {}
+    C Replace(C c) const { return c == from ? to : c; }
+};
+
 template <typename C> void Copy(C* _pDest, const C* _pSrc, sal_Int32 _nCount)
 {
     // take advantage of builtin optimisations
@@ -450,96 +482,10 @@ sal_Int32 lastIndexOfStr_WithLength                       
      ( const IMPL_RTL
 
 /* ----------------------------------------------------------------------- */
 
-template <typename IMPL_RTL_STRCODE>
-void replaceChar                             ( IMPL_RTL_STRCODE* pStr,
-                                               IMPL_RTL_STRCODE cOld,
-                                               IMPL_RTL_STRCODE cNew )
-{
-    assert(pStr);
-    while ( *pStr )
-    {
-        if ( *pStr == cOld )
-            *pStr = cNew;
-
-        pStr++;
-    }
-}
-
-/* ----------------------------------------------------------------------- */
-
-template <typename IMPL_RTL_STRCODE>
-void replaceChar_WithLength                             ( IMPL_RTL_STRCODE* 
pStr,
-                                                          sal_Int32 nLen,
-                                                          IMPL_RTL_STRCODE 
cOld,
-                                                          IMPL_RTL_STRCODE 
cNew )
-{
-    assert(nLen >= 0);
-    while ( nLen > 0 )
-    {
-        if ( *pStr == cOld )
-            *pStr = cNew;
-
-        pStr++;
-        nLen--;
-    }
-}
-
-/* ----------------------------------------------------------------------- */
-
-template <typename IMPL_RTL_STRCODE> void toAsciiLowerCase( IMPL_RTL_STRCODE* 
pStr )
-{
-    assert(pStr);
-    while ( *pStr )
-    {
-        *pStr = rtl::toAsciiLowerCase(IMPL_RTL_USTRCODE(*pStr));
-
-        pStr++;
-    }
-}
-
-/* ----------------------------------------------------------------------- */
-
-template <typename IMPL_RTL_STRCODE>
-void toAsciiLowerCase_WithLength                             ( 
IMPL_RTL_STRCODE* pStr,
-                                                               sal_Int32 nLen )
+template <class S, class Replacer> void replaceChars(S str, Replacer replacer)
 {
-    assert(nLen >= 0);
-    while ( nLen > 0 )
-    {
-        *pStr = rtl::toAsciiLowerCase(IMPL_RTL_USTRCODE(*pStr));
-
-        pStr++;
-        nLen--;
-    }
-}
-
-/* ----------------------------------------------------------------------- */
-
-template <typename IMPL_RTL_STRCODE> void toAsciiUpperCase( IMPL_RTL_STRCODE* 
pStr )
-{
-    assert(pStr);
-    while ( *pStr )
-    {
-        *pStr = rtl::toAsciiUpperCase(IMPL_RTL_USTRCODE(*pStr));
-
-        pStr++;
-    }
-}
-
-/* ----------------------------------------------------------------------- */
-
-template <typename IMPL_RTL_STRCODE>
-void toAsciiUpperCase_WithLength                             ( 
IMPL_RTL_STRCODE* pStr,
-                                                               sal_Int32 nLen )
-{
-    assert(nLen >= 0);
-    while ( nLen > 0 )
-    {
-        *pStr = rtl::toAsciiUpperCase(IMPL_RTL_USTRCODE(*pStr));
-
-        pStr++;
-        nLen--;
-    }
+    for (auto& rChar : str)
+        rChar = replacer.Replace(rChar);
 }
 
 /* ----------------------------------------------------------------------- */
@@ -1240,30 +1186,6 @@ void newReplace                                ( 
IMPL_RTL_STRINGDATA** ppThis,
 
 /* ----------------------------------------------------------------------- */
 
-struct ToAsciiLower
-{
-    template <typename C> static bool Applicable(C c)
-    {
-        return rtl::isAsciiUpperCase(IMPL_RTL_USTRCODE(c));
-    }
-    template <typename C> static C Replace(C c)
-    {
-        return rtl::toAsciiLowerCase(IMPL_RTL_USTRCODE(c));
-    }
-};
-
-struct ToAsciiUpper
-{
-    template <typename C> static bool Applicable(C c)
-    {
-        return rtl::isAsciiLowerCase(IMPL_RTL_USTRCODE(c));
-    }
-    template <typename C> static C Replace(C c)
-    {
-        return rtl::toAsciiUpperCase(IMPL_RTL_USTRCODE(c));
-    }
-};
-
 template <class Traits, typename IMPL_RTL_STRINGDATA>
 void newReplaceChars(IMPL_RTL_STRINGDATA** ppThis, IMPL_RTL_STRINGDATA* pStr)
 {
diff --git a/sal/rtl/ustring.cxx b/sal/rtl/ustring.cxx
index 99f4575b1240..658c04cb88ef 100644
--- a/sal/rtl/ustring.cxx
+++ b/sal/rtl/ustring.cxx
@@ -1110,35 +1110,35 @@ sal_Int32 SAL_CALL 
rtl_ustr_lastIndexOfStr_WithLength(const sal_Unicode* pStr, s
 void SAL_CALL rtl_ustr_replaceChar(sal_Unicode* pStr, sal_Unicode cOld, 
sal_Unicode cNew)
     SAL_THROW_EXTERN_C()
 {
-    return rtl::str::replaceChar(pStr, cOld, cNew);
+    return rtl::str::replaceChars(rtl::str::null_terminated(pStr), 
rtl::str::FromTo(cOld, cNew));
 }
 
 void SAL_CALL rtl_ustr_replaceChar_WithLength(sal_Unicode* pStr, sal_Int32 
nLen, sal_Unicode cOld,
                                               sal_Unicode cNew) 
SAL_THROW_EXTERN_C()
 {
-    return rtl::str::replaceChar_WithLength(pStr, nLen, cOld, cNew);
+    return rtl::str::replaceChars(rtl::str::with_length(pStr, nLen), 
rtl::str::FromTo(cOld, cNew));
 }
 
 void SAL_CALL rtl_ustr_toAsciiLowerCase(sal_Unicode* pStr) SAL_THROW_EXTERN_C()
 {
-    return rtl::str::toAsciiLowerCase(pStr);
+    return rtl::str::replaceChars(rtl::str::null_terminated(pStr), 
rtl::str::toAsciiLower);
 }
 
 void SAL_CALL rtl_ustr_toAsciiLowerCase_WithLength(sal_Unicode* pStr, 
sal_Int32 nLen)
     SAL_THROW_EXTERN_C()
 {
-    return rtl::str::toAsciiLowerCase_WithLength(pStr, nLen);
+    return rtl::str::replaceChars(rtl::str::with_length(pStr, nLen), 
rtl::str::toAsciiLower);
 }
 
 void SAL_CALL rtl_ustr_toAsciiUpperCase(sal_Unicode* pStr) SAL_THROW_EXTERN_C()
 {
-    return rtl::str::toAsciiUpperCase(pStr);
+    return rtl::str::replaceChars(rtl::str::null_terminated(pStr), 
rtl::str::toAsciiUpper);
 }
 
 void SAL_CALL rtl_ustr_toAsciiUpperCase_WithLength(sal_Unicode* pStr, 
sal_Int32 nLen)
     SAL_THROW_EXTERN_C()
 {
-    return rtl::str::toAsciiUpperCase_WithLength(pStr, nLen);
+    return rtl::str::replaceChars(rtl::str::with_length(pStr, nLen), 
rtl::str::toAsciiUpper);
 }
 
 sal_Int32 SAL_CALL rtl_ustr_trim(sal_Unicode* pStr) SAL_THROW_EXTERN_C()

Reply via email to