diff options
author | Noel Grandin <noel.grandin@collabora.co.uk> | 2022-04-29 20:52:46 +0200 |
---|---|---|
committer | Noel Grandin <noel.grandin@collabora.co.uk> | 2022-04-30 21:21:34 +0200 |
commit | fbff7af0a1a31e82c3a3eb6dac77d5a48ef3371d (patch) | |
tree | 2aad7e48c6f7a260e0c3ebf6799fbfb95bb6a210 /comphelper | |
parent | 40077fe30919494f0ecd04c4620cac2334d3d382 (diff) |
split comphelper::string::strip functions into String and view version
which is more obvious, from the perspective of the caller, and lets us
avoid creating a new String if nothing needs to be stripped
Change-Id: I66a980eaf4aa818251bec49bdb16c2dddb0745e7
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/133657
Tested-by: Jenkins
Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
Diffstat (limited to 'comphelper')
-rw-r--r-- | comphelper/source/misc/string.cxx | 86 |
1 files changed, 76 insertions, 10 deletions
diff --git a/comphelper/source/misc/string.cxx b/comphelper/source/misc/string.cxx index acdb6c88adcb..a11a305c5daf 100644 --- a/comphelper/source/misc/string.cxx +++ b/comphelper/source/misc/string.cxx @@ -61,16 +61,43 @@ namespace return rIn.substr(i); } + template <typename T, typename C> T tmpl_stripStartString(const T &rIn, + const C cRemove) + { + if (rIn.isEmpty()) + return rIn; + + sal_Int32 i = 0; + + while (i < rIn.getLength()) + { + if (rIn[i] != cRemove) + break; + ++i; + } + + return rIn.copy(i); + } } -OString stripStart(std::string_view rIn, char c) +OString stripStart(const OString& rIn, char c) { - return OString(tmpl_stripStart<std::string_view, char>(rIn, c)); + return tmpl_stripStartString<OString, char>(rIn, c); } -OUString stripStart(std::u16string_view rIn, sal_Unicode c) +std::string_view stripStart(std::string_view rIn, char c) { - return OUString(tmpl_stripStart<std::u16string_view, sal_Unicode>(rIn, c)); + return tmpl_stripStart<std::string_view, char>(rIn, c); +} + +OUString stripStart(const OUString& rIn, sal_Unicode c) +{ + return tmpl_stripStartString<OUString, sal_Unicode>(rIn, c); +} + +std::u16string_view stripStart(std::u16string_view rIn, sal_Unicode c) +{ + return tmpl_stripStart<std::u16string_view, sal_Unicode>(rIn, c); } namespace @@ -92,25 +119,64 @@ namespace return rIn.substr(0, i); } + template <typename T, typename C> T tmpl_stripEndString(const T &rIn, + const C cRemove) + { + if (rIn.isEmpty()) + return rIn; + + sal_Int32 i = rIn.getLength(); + + while (i > 0) + { + if (rIn[i-1] != cRemove) + break; + --i; + } + + return rIn.copy(0, i); + } +} + +OString stripEnd(const OString& rIn, char c) +{ + return tmpl_stripEndString<OString, char>(rIn, c); } -OString stripEnd(std::string_view rIn, char c) +std::string_view stripEnd(std::string_view rIn, char c) { - return OString(tmpl_stripEnd<std::string_view, char>(rIn, c)); + return tmpl_stripEnd<std::string_view, char>(rIn, c); } -OUString stripEnd(std::u16string_view rIn, sal_Unicode c) +OUString stripEnd(const OUString& rIn, sal_Unicode c) { - return OUString(tmpl_stripEnd<std::u16string_view, sal_Unicode>(rIn, c)); + return tmpl_stripEndString<OUString, sal_Unicode>(rIn, c); } -OString strip(std::string_view rIn, char c) +std::u16string_view stripEnd(std::u16string_view rIn, sal_Unicode c) +{ + return tmpl_stripEnd<std::u16string_view, sal_Unicode>(rIn, c); +} + +OString strip(const OString& rIn, char c) +{ + auto x = tmpl_stripStartString<OString, char>(rIn, c); + return stripEnd(x, c); +} + +std::string_view strip(std::string_view rIn, char c) { auto x = tmpl_stripStart<std::string_view, char>(rIn, c); return stripEnd(x, c); } -OUString strip(std::u16string_view rIn, sal_Unicode c) +OUString strip(const OUString& rIn, sal_Unicode c) +{ + auto x = tmpl_stripStartString<OUString, sal_Unicode>(rIn, c); + return stripEnd(x, c); +} + +std::u16string_view strip(std::u16string_view rIn, sal_Unicode c) { auto x = tmpl_stripStart<std::u16string_view, sal_Unicode>(rIn, c); return stripEnd(x, c); |