diff --git a/libcxxabi/src/demangle/StringView.h b/libcxxabi/src/demangle/StringView.h --- a/libcxxabi/src/demangle/StringView.h +++ b/libcxxabi/src/demangle/StringView.h @@ -36,8 +36,9 @@ StringView(const char *Str) : First(Str), Last(Str + std::strlen(Str)) {} StringView() : First(nullptr), Last(nullptr) {} - StringView substr(size_t From) const { - return StringView(begin() + From, size() - From); + StringView substr(size_t Pos, size_t Len = npos) const { + assert(Pos <= size()); + return StringView(begin() + Pos, std::min(Len, size() - Pos)); } size_t find(char C, size_t From = 0) const { @@ -51,14 +52,6 @@ return npos; } - StringView substr(size_t From, size_t To) const { - if (To >= size()) - To = size() - 1; - if (From >= size()) - From = size() - 1; - return StringView(First + From, First + To); - } - StringView dropFront(size_t N = 1) const { if (N >= size()) N = size(); diff --git a/llvm/include/llvm/Demangle/StringView.h b/llvm/include/llvm/Demangle/StringView.h --- a/llvm/include/llvm/Demangle/StringView.h +++ b/llvm/include/llvm/Demangle/StringView.h @@ -36,8 +36,9 @@ StringView(const char *Str) : First(Str), Last(Str + std::strlen(Str)) {} StringView() : First(nullptr), Last(nullptr) {} - StringView substr(size_t From) const { - return StringView(begin() + From, size() - From); + StringView substr(size_t Pos, size_t Len = npos) const { + assert(Pos <= size()); + return StringView(begin() + Pos, std::min(Len, size() - Pos)); } size_t find(char C, size_t From = 0) const { @@ -51,14 +52,6 @@ return npos; } - StringView substr(size_t From, size_t To) const { - if (To >= size()) - To = size() - 1; - if (From >= size()) - From = size() - 1; - return StringView(First + From, First + To); - } - StringView dropFront(size_t N = 1) const { if (N >= size()) N = size(); diff --git a/llvm/unittests/Demangle/CMakeLists.txt b/llvm/unittests/Demangle/CMakeLists.txt --- a/llvm/unittests/Demangle/CMakeLists.txt +++ b/llvm/unittests/Demangle/CMakeLists.txt @@ -7,4 +7,5 @@ DemangleTest.cpp ItaniumDemangleTest.cpp PartialDemangleTest.cpp + StringViewTest.cpp ) diff --git a/llvm/unittests/Demangle/StringViewTest.cpp b/llvm/unittests/Demangle/StringViewTest.cpp new file mode 100644 --- /dev/null +++ b/llvm/unittests/Demangle/StringViewTest.cpp @@ -0,0 +1,48 @@ +//===- llvm/unittest/StringViewTest.cpp - StringView unit tests -----------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "llvm/Demangle/StringView.h" +#include "gtest/gtest.h" + +using namespace llvm; +using llvm::itanium_demangle::StringView; + +namespace llvm { +namespace itanium_demangle { + +std::ostream &operator<<(std::ostream &OS, const StringView &S) { + return OS.write(S.begin(), S.size()); +} + +} // namespace itanium_demangle +} // namespace llvm + +TEST(StringViewTest, EmptyInitializerList) { + StringView S = {}; + EXPECT_TRUE(S.empty()); + + S = {}; + EXPECT_TRUE(S.empty()); +} + +TEST(StringViewTest, Substr) { + StringView S("abcdef"); + + EXPECT_EQ("abcdef", S.substr(0)); + EXPECT_EQ("f", S.substr(5)); + EXPECT_EQ("", S.substr(6)); + + EXPECT_EQ("", S.substr(0, 0)); + EXPECT_EQ("a", S.substr(0, 1)); + EXPECT_EQ("abcde", S.substr(0, 5)); + EXPECT_EQ("abcdef", S.substr(0, 6)); + EXPECT_EQ("abcdef", S.substr(0, 7)); + + EXPECT_EQ("f", S.substr(5, 100)); + EXPECT_EQ("", S.substr(6, 100)); +}