diff options
author | Mike Kaganski <mike.kaganski@collabora.com> | 2021-04-11 08:46:44 +0300 |
---|---|---|
committer | Mike Kaganski <mike.kaganski@collabora.com> | 2021-04-12 08:00:30 +0200 |
commit | 334838efc12cd1e4a451a8dd7542b93fdaf30bb9 (patch) | |
tree | b436c6f042d6fdbb8261d6885ed580a05f4f00ec /sal/rtl | |
parent | bcf0ed2f672646107b42cbe67e5c3c9d170bb33a (diff) |
Unify on std::basic_string_view for indexOfStr
A follow-up for 5ebccaa07589383653dbd65e58204a82dd3cde09 and
5a11edc795d8a3ef1e15fc4e251f594911403131
Change-Id: I58c1f518967cb98bd7edecd655d5be0d4657a1ee
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/113938
Tested-by: Jenkins
Reviewed-by: Mike Kaganski <mike.kaganski@collabora.com>
Diffstat (limited to 'sal/rtl')
-rw-r--r-- | sal/rtl/strtmpl.hxx | 209 |
1 files changed, 25 insertions, 184 deletions
diff --git a/sal/rtl/strtmpl.hxx b/sal/rtl/strtmpl.hxx index d0f853f62feb..bdff4bb44647 100644 --- a/sal/rtl/strtmpl.hxx +++ b/sal/rtl/strtmpl.hxx @@ -392,33 +392,13 @@ sal_Int32 indexOfChar_WithLength ( const IMPL_RTL_ST IMPL_RTL_STRCODE c ) { // assert(nLen >= 0); - if constexpr (sizeof(IMPL_RTL_STRCODE) == sizeof(char)) - { - // take advantage of builtin optimisations - IMPL_RTL_STRCODE* p = static_cast<IMPL_RTL_STRCODE*>(std::memchr(const_cast<IMPL_RTL_STRCODE *>(pStr), c, nLen)); - return p ? p - pStr : -1; - } - else if constexpr (sizeof(IMPL_RTL_STRCODE) == sizeof(char16_t)) - { - // take advantage of builtin optimisations - if (nLen <= 0) // char_traits::find takes an unsigned length - return -1; - char16_t const * p = std::char_traits<char16_t>::find(pStr, nLen, c); - return p ? p - pStr : -1; - } - else - { - const IMPL_RTL_STRCODE* pTempStr = pStr; - while ( nLen > 0 ) - { - if ( *pTempStr == c ) - return pTempStr-pStr; - - pTempStr++; - nLen--; - } + if (nLen <= 0) return -1; - } + // take advantage of builtin optimisations + using my_string_view = std::basic_string_view<IMPL_RTL_STRCODE>; + my_string_view v(pStr, nLen); + typename my_string_view::size_type idx = v.find(c); + return idx == my_string_view::npos ? -1 : idx; } /* ----------------------------------------------------------------------- */ @@ -457,33 +437,11 @@ sal_Int32 lastIndexOfChar_WithLength ( const IMPL_RT IMPL_RTL_STRCODE c ) { assert(nLen >= 0); - if constexpr (sizeof(IMPL_RTL_STRCODE) == sizeof(char)) - { - // take advantage of builtin optimisations - std::string_view v(pStr, nLen); - std::string_view::size_type idx = v.rfind(c); - return idx == std::string_view::npos ? -1 : idx; - } - else if constexpr (sizeof(IMPL_RTL_STRCODE) == sizeof(char16_t)) - { - // take advantage of builtin optimisations - std::u16string_view v(pStr, nLen); - std::u16string_view::size_type idx = v.rfind(c); - return idx == std::string_view::npos ? -1 : idx; - } - else - { - pStr += nLen; - while ( nLen > 0 ) - { - nLen--; - pStr--; - - if ( *pStr == c ) - return nLen; - } - return -1; - } + // take advantage of builtin optimisations + using my_string_view = std::basic_string_view<IMPL_RTL_STRCODE>; + my_string_view v(pStr, nLen); + typename my_string_view::size_type idx = v.rfind(c); + return idx == my_string_view::npos ? -1 : idx; } /* ----------------------------------------------------------------------- */ @@ -529,75 +487,13 @@ sal_Int32 indexOfStr_WithLength ( const IMPL_RTL_STR assert(nSubLen >= 0); /* an empty SubString is always not findable */ if ( nSubLen == 0 ) - ; - else if constexpr (sizeof(IMPL_RTL_STRCODE) == sizeof(char)) - { - // take advantage of builtin optimisations - std::string_view v(pStr, nStrLen); - std::string_view needle(pSubStr, nSubLen); - std::string_view::size_type idx = v.find(needle); - return idx == std::string_view::npos ? -1 : idx; - } - else if constexpr (sizeof(IMPL_RTL_STRCODE) == sizeof(char16_t)) - { - // take advantage of builtin optimisations - std::u16string_view v(pStr, nStrLen); - std::u16string_view needle(pSubStr, nSubLen); - std::u16string_view::size_type idx = v.find(needle); - return idx == std::string_view::npos ? -1 : idx; - } - else - { - /* faster search for a single character */ - if ( nSubLen == 1 ) - { - IMPL_RTL_STRCODE c = *pSubStr; - const IMPL_RTL_STRCODE* pTempStr = pStr; - while ( nStrLen > 0 ) - { - if ( *pTempStr == c ) - return pTempStr-pStr; - - pTempStr++; - nStrLen--; - } - } - else - { - const IMPL_RTL_STRCODE* pTempStr = pStr; - while ( nStrLen > 0 ) - { - if ( *pTempStr == *pSubStr ) - { - /* Compare SubString */ - if ( nSubLen <= nStrLen ) - { - const IMPL_RTL_STRCODE* pTempStr1 = pTempStr; - const IMPL_RTL_STRCODE* pTempStr2 = pSubStr; - sal_Int32 nTempLen = nSubLen; - while ( nTempLen ) - { - if ( *pTempStr1 != *pTempStr2 ) - break; - - pTempStr1++; - pTempStr2++; - nTempLen--; - } - - if ( !nTempLen ) - return pTempStr-pStr; - } - else - break; - } - - nStrLen--; - pTempStr++; - } - } - } - return -1; + return -1; + // take advantage of builtin optimisations + using my_string_view = std::basic_string_view<IMPL_RTL_STRCODE>; + my_string_view v(pStr, nStrLen); + my_string_view needle(pSubStr, nSubLen); + typename my_string_view::size_type idx = v.find(needle); + return idx == my_string_view::npos ? -1 : idx; } /* ----------------------------------------------------------------------- */ @@ -626,68 +522,13 @@ sal_Int32 lastIndexOfStr_WithLength ( const IMPL_RTL assert(nSubLen >= 0); /* an empty SubString is always not findable */ if ( nSubLen == 0 ) - ; - else if constexpr (sizeof(IMPL_RTL_STRCODE) == sizeof(char)) - { - // take advantage of builtin optimisations - std::string_view v(pStr, nStrLen); - std::string_view needle(pSubStr, nSubLen); - std::string_view::size_type idx = v.rfind(needle); - return idx == std::string_view::npos ? -1 : idx; - } - else if constexpr (sizeof(IMPL_RTL_STRCODE) == sizeof(char16_t)) - { - // take advantage of builtin optimisations - std::u16string_view v(pStr, nStrLen); - std::u16string_view needle(pSubStr, nSubLen); - std::u16string_view::size_type idx = v.rfind(needle); - return idx == std::string_view::npos ? -1 : idx; - } - else - { - /* faster search for a single character */ - if ( nSubLen == 1 ) - { - IMPL_RTL_STRCODE c = *pSubStr; - pStr += nStrLen; - while ( nStrLen > 0 ) - { - nStrLen--; - pStr--; - - if ( *pStr == c ) - return nStrLen; - } - } - else - { - pStr += nStrLen; - nStrLen -= nSubLen; - pStr -= nSubLen; - while ( nStrLen >= 0 ) - { - const IMPL_RTL_STRCODE* pTempStr1 = pStr; - const IMPL_RTL_STRCODE* pTempStr2 = pSubStr; - sal_Int32 nTempLen = nSubLen; - while ( nTempLen ) - { - if ( *pTempStr1 != *pTempStr2 ) - break; - - pTempStr1++; - pTempStr2++; - nTempLen--; - } - - if ( !nTempLen ) - return nStrLen; - - nStrLen--; - pStr--; - } - } - } - return -1; + return -1; + // take advantage of builtin optimisations + using my_string_view = std::basic_string_view<IMPL_RTL_STRCODE>; + my_string_view v(pStr, nStrLen); + my_string_view needle(pSubStr, nSubLen); + typename my_string_view::size_type idx = v.rfind(needle); + return idx == my_string_view::npos ? -1 : idx; } /* ----------------------------------------------------------------------- */ |