diff options
author | Mike Kaganski <mike.kaganski@collabora.com> | 2022-02-27 09:44:23 +0100 |
---|---|---|
committer | Mike Kaganski <mike.kaganski@collabora.com> | 2022-02-27 10:42:51 +0100 |
commit | 7b8671d7b58a2a70c641f8315dc506542e8266cc (patch) | |
tree | a4bacdfe6ee435587149d4c40c468404347cf7a5 /sal | |
parent | bedb7118f5ca2cd19f4bc1eac1b26498ee5ef113 (diff) |
Deduplicate newToAscii*Case
Change-Id: I55f4f43375037ad4247f592bc981d8718c12de68
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/130631
Tested-by: Jenkins
Reviewed-by: Mike Kaganski <mike.kaganski@collabora.com>
Diffstat (limited to 'sal')
-rw-r--r-- | sal/rtl/string.cxx | 4 | ||||
-rw-r--r-- | sal/rtl/strtmpl.hxx | 168 | ||||
-rw-r--r-- | sal/rtl/ustring.cxx | 4 |
3 files changed, 47 insertions, 129 deletions
diff --git a/sal/rtl/string.cxx b/sal/rtl/string.cxx index 4b08b5e2c39f..92564b494c61 100644 --- a/sal/rtl/string.cxx +++ b/sal/rtl/string.cxx @@ -650,13 +650,13 @@ void SAL_CALL rtl_string_newReplace(rtl_String** ppThis, rtl_String* pStr, char void SAL_CALL rtl_string_newToAsciiLowerCase(rtl_String** ppThis, rtl_String* pStr) SAL_THROW_EXTERN_C() { - rtl::str::newToAsciiLowerCase(ppThis, pStr); + rtl::str::newReplaceChars<rtl::str::ToAsciiLower>(ppThis, pStr); } void SAL_CALL rtl_string_newToAsciiUpperCase(rtl_String** ppThis, rtl_String* pStr) SAL_THROW_EXTERN_C() { - rtl::str::newToAsciiUpperCase(ppThis, pStr); + rtl::str::newReplaceChars<rtl::str::ToAsciiUpper>(ppThis, pStr); } 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 9cbc8148044a..d800dd3c7b84 100644 --- a/sal/rtl/strtmpl.hxx +++ b/sal/rtl/strtmpl.hxx @@ -918,13 +918,7 @@ sal_uInt64 toUInt64 ( const IMPL_RTL_STRCODE* pStr, /* Internal String-Class help functions */ /* ======================================================================= */ -template <typename STRINGDATA> struct STRCODE_DATA -{ - using type = std::remove_extent_t<decltype(STRINGDATA::buffer)>; - using unsigned_type = std::make_unsigned_t<type>; -}; -template <class STRINGDATA> using STRCODE = typename STRCODE_DATA<STRINGDATA>::type; -template <class STRINGDATA> using USTRCODE = typename STRCODE_DATA<STRINGDATA>::unsigned_type; +template <class STRINGDATA> using STRCODE = std::remove_extent_t<decltype(STRINGDATA::buffer)>; template <typename IMPL_RTL_STRINGDATA> IMPL_RTL_STRINGDATA* Alloc( sal_Int32 nLen ) { @@ -943,27 +937,6 @@ template <typename IMPL_RTL_STRINGDATA> IMPL_RTL_STRINGDATA* Alloc( sal_Int32 nL return pData; } -/* ----------------------------------------------------------------------- */ - -template <typename IMPL_RTL_STRINGDATA> -auto* NewCopy ( IMPL_RTL_STRINGDATA** ppThis, - IMPL_RTL_STRINGDATA* pStr, - sal_Int32 nCount ) -{ - assert(ppThis); - assert(pStr); - assert(nCount >= 0 && nCount <= pStr->length); - *ppThis = Alloc<IMPL_RTL_STRINGDATA>( pStr->length ); - OSL_ASSERT(*ppThis != nullptr); - - auto* pDest = (*ppThis)->buffer; - - Copy(pDest, pStr->buffer, nCount); - - RTL_LOG_STRING_NEW( *ppThis ); - return pDest + nCount; -} - /* ======================================================================= */ /* String-Class functions */ /* ======================================================================= */ @@ -1456,118 +1429,63 @@ void newReplace ( IMPL_RTL_STRINGDATA** ppThis, /* ----------------------------------------------------------------------- */ -template <typename IMPL_RTL_STRINGDATA> -void newToAsciiLowerCase ( IMPL_RTL_STRINGDATA** ppThis, - IMPL_RTL_STRINGDATA* pStr ) +struct ToAsciiLower { - assert(ppThis); - assert(pStr); - IMPL_RTL_STRINGDATA* pOrg = *ppThis; - bool bChanged = false; - sal_Int32 nLen = pStr->length; - const auto* pCharStr = pStr->buffer; - - while ( nLen > 0 ) + template <typename C> static bool Applicable(C c) { - if ( rtl::isAsciiUpperCase(USTRCODE<IMPL_RTL_STRINGDATA>(*pCharStr)) ) - { - /* Copy String */ - auto* pNewCharStr = NewCopy( ppThis, pStr, pCharStr-pStr->buffer ); - - /* replace/copy rest of the string */ - if ( pNewCharStr ) - { - *pNewCharStr = rtl::toAsciiLowerCase(USTRCODE<IMPL_RTL_STRINGDATA>(*pCharStr)); - pNewCharStr++; - pCharStr++; - nLen--; - - while ( nLen > 0 ) - { - *pNewCharStr = rtl::toAsciiLowerCase(USTRCODE<IMPL_RTL_STRINGDATA>(*pCharStr)); - - pNewCharStr++; - pCharStr++; - nLen--; - } - } - - bChanged = true; - break; - } - - pCharStr++; - nLen--; + return rtl::isAsciiUpperCase(IMPL_RTL_USTRCODE(c)); } - - if ( !bChanged ) + template <typename C> static C Replace(C c) { - *ppThis = pStr; - acquire( pStr ); + return rtl::toAsciiLowerCase(IMPL_RTL_USTRCODE(c)); } +}; - RTL_LOG_STRING_NEW( *ppThis ); - /* must be done last, if pStr == *ppThis */ - if ( pOrg ) - release( pOrg ); -} - -/* ----------------------------------------------------------------------- */ +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 <typename IMPL_RTL_STRINGDATA> -void newToAsciiUpperCase ( IMPL_RTL_STRINGDATA** ppThis, - IMPL_RTL_STRINGDATA* pStr ) +template <class Traits, typename IMPL_RTL_STRINGDATA> +void newReplaceChars(IMPL_RTL_STRINGDATA** ppThis, IMPL_RTL_STRINGDATA* pStr) { assert(ppThis); assert(pStr); - IMPL_RTL_STRINGDATA* pOrg = *ppThis; - bool bChanged = false; - sal_Int32 nLen = pStr->length; - const auto* pCharStr = pStr->buffer; - while ( nLen > 0 ) + const auto pEnd = pStr->buffer + pStr->length; + auto pCharStr = std::find_if(pStr->buffer, pEnd, [](auto c) { return Traits::Applicable(c); }); + if (pCharStr != pEnd) { - if ( rtl::isAsciiLowerCase(USTRCODE<IMPL_RTL_STRINGDATA>(*pCharStr)) ) + IMPL_RTL_STRINGDATA* pOrg = *ppThis; + *ppThis = Alloc<IMPL_RTL_STRINGDATA>(pStr->length); + OSL_ASSERT(*ppThis != nullptr); + auto* pNewCharStr = (*ppThis)->buffer; + /* Copy String */ + const sal_Int32 nCount = pCharStr - pStr->buffer; + Copy(pNewCharStr, pStr->buffer, nCount); + pNewCharStr += nCount; + /* replace/copy rest of the string */ + do { - /* Copy String */ - auto* pNewCharStr = NewCopy( ppThis, pStr, pCharStr-pStr->buffer ); - - /* replace/copy rest of the string */ - if ( pNewCharStr ) - { - *pNewCharStr = rtl::toAsciiUpperCase(USTRCODE<IMPL_RTL_STRINGDATA>(*pCharStr)); - pNewCharStr++; - pCharStr++; - nLen--; - - while ( nLen > 0 ) - { - *pNewCharStr = rtl::toAsciiUpperCase(USTRCODE<IMPL_RTL_STRINGDATA>(*pCharStr)); - - pNewCharStr++; - pCharStr++; - nLen--; - } - } - - bChanged = true; - break; - } - - pCharStr++; - nLen--; - } + *pNewCharStr = Traits::Replace(*pCharStr); + pNewCharStr++; + pCharStr++; + } while (pCharStr != pEnd); - if ( !bChanged ) - { - *ppThis = pStr; - acquire( pStr ); + RTL_LOG_STRING_NEW(*ppThis); + /* must be done last, if pStr == *ppThis */ + if (pOrg) + release(pOrg); } - - RTL_LOG_STRING_NEW( *ppThis ); - /* must be done last, if pStr == *ppThis */ - if ( pOrg ) - release( pOrg ); + else + assign(ppThis, pStr); } /* ----------------------------------------------------------------------- */ diff --git a/sal/rtl/ustring.cxx b/sal/rtl/ustring.cxx index f2503f5c2d06..04070b5588a9 100644 --- a/sal/rtl/ustring.cxx +++ b/sal/rtl/ustring.cxx @@ -1321,13 +1321,13 @@ void SAL_CALL rtl_uString_newReplace(rtl_uString** ppThis, rtl_uString* pStr, sa void SAL_CALL rtl_uString_newToAsciiLowerCase(rtl_uString** ppThis, rtl_uString* pStr) SAL_THROW_EXTERN_C() { - rtl::str::newToAsciiLowerCase(ppThis, pStr); + rtl::str::newReplaceChars<rtl::str::ToAsciiLower>(ppThis, pStr); } void SAL_CALL rtl_uString_newToAsciiUpperCase(rtl_uString** ppThis, rtl_uString* pStr) SAL_THROW_EXTERN_C() { - rtl::str::newToAsciiUpperCase(ppThis, pStr); + rtl::str::newReplaceChars<rtl::str::ToAsciiUpper>(ppThis, pStr); } void SAL_CALL rtl_uString_newTrim(rtl_uString** ppThis, rtl_uString* pStr) SAL_THROW_EXTERN_C() |