diff --git a/base/base_tests/string_utils_test.cpp b/base/base_tests/string_utils_test.cpp index 35c07c5a2a..28ecada741 100644 --- a/base/base_tests/string_utils_test.cpp +++ b/base/base_tests/string_utils_test.cpp @@ -1121,3 +1121,17 @@ UNIT_TEST(Strings_JoinAny) [](auto const & item) { return item.second; }), ()); } } + +UNIT_TEST(Trim) +{ + std::string const kStrWithoutSpaces = "string"; + + std::string strWithLeftSpaces = " " + kStrWithoutSpaces; + TEST_EQUAL(strings::TrimLeft(strWithLeftSpaces), kStrWithoutSpaces, ()); + + std::string strWithRightSpaces = kStrWithoutSpaces + " "; + TEST_EQUAL(strings::TrimRight(strWithRightSpaces), kStrWithoutSpaces, ()); + + std::string strWithLeftRightSpaces = " " + kStrWithoutSpaces + " "; + TEST_EQUAL(strings::Trim(strWithLeftSpaces), kStrWithoutSpaces, ()); +} diff --git a/base/string_utils.cpp b/base/string_utils.cpp index 3425d4e6a8..915e409173 100644 --- a/base/string_utils.cpp +++ b/base/string_utils.cpp @@ -204,20 +204,20 @@ char ascii_to_lower(char in) void AsciiToLower(std::string & s) { transform(s.begin(), s.end(), s.begin(), &ascii_to_lower); } -std::string & Ltrim(std::string & s) +std::string & TrimLeft(std::string & s) { s.erase(s.begin(), std::find_if(s.cbegin(), s.cend(), [](auto c) { return !std::isspace(c); })); return s; } -std::string & Rtrim(std::string & s) +std::string & TrimRight(std::string & s) { s.erase(std::find_if(s.crbegin(), s.crend(), [](auto c) { return !std::isspace(c); }).base(), s.end()); return s; } -std::string & Trim(std::string & s) { return Ltrim(Rtrim(s)); } +std::string & Trim(std::string & s) { return TrimLeft(TrimRight(s)); } std::string & Trim(std::string & s, char const * anyOf) { diff --git a/base/string_utils.hpp b/base/string_utils.hpp index 561ff90cdd..250ab0c7b9 100644 --- a/base/string_utils.hpp +++ b/base/string_utils.hpp @@ -101,8 +101,12 @@ void NormalizeDigits(UniString & us); size_t CountNormLowerSymbols(UniString const & s, UniString const & lowStr); void AsciiToLower(std::string & s); -// TODO(AlexZ): current impl works as boost trim, that uses default std::locale() to trim. -// In general, it does not work for any unicode whitespace except ASCII U+0020 one. + +// All triming functions return a reference on an input string. +// They do in-place trimming. In general, it does not work for any unicode whitespace except +// ASCII U+0020 one. +std::string & TrimLeft(std::string & s); +std::string & TrimRight(std::string & s); std::string & Trim(std::string & s); /// Remove any characters that contain in "anyOf" on left and right side of string s std::string & Trim(std::string & s, char const * anyOf);