From a656b986341766a26a7d65287575d98124a3dc44 Mon Sep 17 00:00:00 2001 From: Yabin Cui Date: Tue, 30 Oct 2018 15:49:53 -0700 Subject: [PATCH] libbase: support char parameter in StartsWith/EndsWith. Bug: 117568547 Test: run libbase_test. Change-Id: I5a6a412733c594f5a116f333b8e091d2d9f60e06 --- base/include/android-base/strings.h | 2 ++ base/strings.cpp | 8 ++++++++ base/strings_test.cpp | 12 ++++++++++++ 3 files changed, 22 insertions(+) diff --git a/base/include/android-base/strings.h b/base/include/android-base/strings.h index 9c3556084..fc5c1ce36 100644 --- a/base/include/android-base/strings.h +++ b/base/include/android-base/strings.h @@ -61,6 +61,7 @@ bool StartsWith(const std::string& s, const char* prefix); bool StartsWithIgnoreCase(const std::string& s, const char* prefix); bool StartsWith(const std::string& s, const std::string& prefix); bool StartsWithIgnoreCase(const std::string& s, const std::string& prefix); +bool StartsWith(const std::string& s, char prefix); // Tests whether 's' ends with 'suffix'. // TODO: string_view @@ -68,6 +69,7 @@ bool EndsWith(const std::string& s, const char* suffix); bool EndsWithIgnoreCase(const std::string& s, const char* suffix); bool EndsWith(const std::string& s, const std::string& suffix); bool EndsWithIgnoreCase(const std::string& s, const std::string& suffix); +bool EndsWith(const std::string& s, char suffix); // Tests whether 'lhs' equals 'rhs', ignoring case. bool EqualsIgnoreCase(const std::string& lhs, const std::string& rhs); diff --git a/base/strings.cpp b/base/strings.cpp index a8bb2a986..2d6eef099 100644 --- a/base/strings.cpp +++ b/base/strings.cpp @@ -95,6 +95,10 @@ bool StartsWith(const std::string& s, const std::string& prefix) { return strncmp(s.c_str(), prefix.c_str(), prefix.size()) == 0; } +bool StartsWith(const std::string& s, char prefix) { + return *s.c_str() == prefix; // Use c_str() to guarantee there is at least a '\0'. +} + bool StartsWithIgnoreCase(const std::string& s, const char* prefix) { return strncasecmp(s.c_str(), prefix, strlen(prefix)) == 0; } @@ -121,6 +125,10 @@ bool EndsWith(const std::string& s, const std::string& suffix) { return EndsWith(s, suffix.c_str(), suffix.size(), true); } +bool EndsWith(const std::string& s, char suffix) { + return EndsWith(s, &suffix, 1, true); +} + bool EndsWithIgnoreCase(const std::string& s, const char* suffix) { return EndsWith(s, suffix, strlen(suffix), false); } diff --git a/base/strings_test.cpp b/base/strings_test.cpp index b8639ead4..9d740947e 100644 --- a/base/strings_test.cpp +++ b/base/strings_test.cpp @@ -198,6 +198,12 @@ TEST(strings, StartsWithIgnoreCase_contains_prefix) { ASSERT_FALSE(android::base::StartsWithIgnoreCase("foobar", "BAR")); } +TEST(strings, StartsWith_char) { + ASSERT_FALSE(android::base::StartsWith("", 'f')); + ASSERT_TRUE(android::base::StartsWith("foo", 'f')); + ASSERT_FALSE(android::base::StartsWith("foo", 'o')); +} + TEST(strings, EndsWith_empty) { ASSERT_FALSE(android::base::EndsWith("", "foo")); ASSERT_TRUE(android::base::EndsWith("", "")); @@ -273,6 +279,12 @@ TEST(strings, EndsWithIgnoreCase_std_string) { ASSERT_FALSE(android::base::EndsWithIgnoreCase("GoOdByE", std::string{"lo"})); } +TEST(strings, EndsWith_char) { + ASSERT_FALSE(android::base::EndsWith("", 'o')); + ASSERT_TRUE(android::base::EndsWith("foo", 'o')); + ASSERT_FALSE(android::base::EndsWith("foo", "f")); +} + TEST(strings, EqualsIgnoreCase) { ASSERT_TRUE(android::base::EqualsIgnoreCase("foo", "FOO")); ASSERT_TRUE(android::base::EqualsIgnoreCase("FOO", "foo"));