diff options
-rw-r--r-- | include/llvm/ADT/StringRef.h | 22 | ||||
-rw-r--r-- | unittests/ADT/StringRefTest.cpp | 7 |
2 files changed, 29 insertions, 0 deletions
diff --git a/include/llvm/ADT/StringRef.h b/include/llvm/ADT/StringRef.h index 40689a9..5433056 100644 --- a/include/llvm/ADT/StringRef.h +++ b/include/llvm/ADT/StringRef.h @@ -172,6 +172,28 @@ namespace llvm { return npos; } + /// count - Return the number of occurrences of \arg C in the string. + size_t count(char C) const { + size_t Count = 0; + for (size_t i = 0, e = Length; i != e; ++i) + if (Data[i] == C) + return i; + return Count; + } + + /// count - Return the number of non-overlapped occurrences of \arg Str in + /// the string. + size_t count(const StringRef &Str) const { + size_t Count = 0; + size_t N = Str.size(); + if (N > Length) + return 0; + for (size_t i = 0, e = Length - N + 1; i != e; ++i) + if (substr(i, N).equals(Str)) + ++Count; + return Count; + } + /// @} /// @name Substring Operations /// @{ diff --git a/unittests/ADT/StringRefTest.cpp b/unittests/ADT/StringRefTest.cpp index 972201c..ef89e9f 100644 --- a/unittests/ADT/StringRefTest.cpp +++ b/unittests/ADT/StringRefTest.cpp @@ -94,6 +94,13 @@ TEST(StringRefTest, Utilities) { EXPECT_TRUE(Str.find("hello") == 0); EXPECT_TRUE(Str.find("ello") == 1); EXPECT_TRUE(Str.find("zz") == StringRef::npos); + + EXPECT_TRUE(Str.count('l') == 2); + EXPECT_TRUE(Str.count('z') == 0); + EXPECT_TRUE(Str.count("helloworld") == 0); + EXPECT_TRUE(Str.count("hello") == 1); + EXPECT_TRUE(Str.count("ello") == 1); + EXPECT_TRUE(Str.count("zz") == 0); } } // end anonymous namespace |