diff options
Diffstat (limited to 'vespalib')
-rw-r--r-- | vespalib/src/tests/stllike/string_test.cpp | 19 | ||||
-rw-r--r-- | vespalib/src/vespa/vespalib/stllike/string.h | 22 |
2 files changed, 41 insertions, 0 deletions
diff --git a/vespalib/src/tests/stllike/string_test.cpp b/vespalib/src/tests/stllike/string_test.cpp index de384bce9ad..d60380aa3ab 100644 --- a/vespalib/src/tests/stllike/string_test.cpp +++ b/vespalib/src/tests/stllike/string_test.cpp @@ -489,4 +489,23 @@ TEST("test that empty_string is shared and empty") { EXPECT_EQUAL(empty_string(), ""); } +TEST("starts_with has expected semantics for small_string") { + vespalib::string a("foobar"); + EXPECT_TRUE(a.starts_with("")); + EXPECT_TRUE(a.starts_with("foo")); + EXPECT_TRUE(a.starts_with("foobar")); + EXPECT_FALSE(a.starts_with("foobarf")); + EXPECT_FALSE(a.starts_with("oobar")); +} + +TEST("starts_with has expected semantics for stringref") { + vespalib::string a("foobar"); + vespalib::stringref ar(a); + EXPECT_TRUE(ar.starts_with("")); + EXPECT_TRUE(ar.starts_with("foo")); + EXPECT_TRUE(ar.starts_with("foobar")); + EXPECT_FALSE(ar.starts_with("foobarf")); + EXPECT_FALSE(ar.starts_with("oobar")); +} + TEST_MAIN() { TEST_RUN_ALL(); } diff --git a/vespalib/src/vespa/vespalib/stllike/string.h b/vespalib/src/vespa/vespalib/stllike/string.h index 2c0bb9a85d3..2e61d7ef0e9 100644 --- a/vespalib/src/vespa/vespalib/stllike/string.h +++ b/vespalib/src/vespa/vespalib/stllike/string.h @@ -111,6 +111,7 @@ public: } return npos; } + /** * Find the last occurrence of a substring, starting at e and * searching in reverse order. @@ -126,6 +127,17 @@ public: int diff(memcmp(_s, s, std::min(sz, size()))); return (diff != 0) ? diff : (size() - sz); } + + /** + * Returns true iff input string is a prefix of this string. + */ + [[nodiscard]] bool starts_with(stringref prefix) const noexcept { + if (prefix.size() > size()) { + return false; + } + return (memcmp(data(), prefix.data(), prefix.size()) == 0); + } + const char & operator [] (size_t i) const { return _s[i]; } operator std::string () const { return std::string(_s, _sz); } bool operator < (const char * s) const noexcept { return compare(s, strlen(s)) < 0; } @@ -257,6 +269,16 @@ public: } /** + * Returns true iff input string is a prefix of this string. + */ + [[nodiscard]] bool starts_with(stringref prefix) const noexcept { + if (prefix.size() > size()) { + return false; + } + return (memcmp(buffer(), prefix.data(), prefix.size()) == 0); + } + + /** * Find the last occurrence of a substring, starting at e and * searching in reverse order. * |