From 2349dc1a21a9f82943532214f4e1189af1d33c16 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Thu, 15 Aug 2019 14:07:23 +0200 Subject: [PATCH] StringView: Add StringView::operator==(StringView) Previously we'd implicitly convert the second StringView to a String when comparing two StringViews, which is obviously not what we wanted. --- AK/StringView.h | 16 ++++++++++++++++ AK/Tests/Makefile | 4 +++- AK/Tests/TestStringView.cpp | 36 ++++++++++++++++++++++++++++++++++++ 3 files changed, 55 insertions(+), 1 deletion(-) create mode 100644 AK/Tests/TestStringView.cpp diff --git a/AK/StringView.h b/AK/StringView.h index 7d5d50a99f1..7fceb768857 100644 --- a/AK/StringView.h +++ b/AK/StringView.h @@ -83,6 +83,22 @@ public: bool operator==(const String&) const; + bool operator==(const StringView& other) const + { + if (is_null()) + return other.is_null(); + if (other.is_null()) + return false; + if (length() != other.length()) + return false; + return !memcmp(m_characters, other.m_characters, m_length); + } + + bool operator!=(const StringView& other) const + { + return !(*this == other); + } + private: friend class String; const StringImpl* m_impl { nullptr }; diff --git a/AK/Tests/Makefile b/AK/Tests/Makefile index b1c7b8a2488..a87819f174c 100644 --- a/AK/Tests/Makefile +++ b/AK/Tests/Makefile @@ -1,4 +1,4 @@ -PROGRAMS = TestString TestQueue TestVector TestHashMap TestJSON TestWeakPtr TestNonnullRefPtr TestRefPtr TestFixedArray TestFileSystemPath TestURL +PROGRAMS = TestString TestQueue TestVector TestHashMap TestJSON TestWeakPtr TestNonnullRefPtr TestRefPtr TestFixedArray TestFileSystemPath TestURL TestStringView CXXFLAGS = -std=c++17 -Wall -Wextra -ggdb3 -O2 -I../ -I../../ @@ -62,6 +62,8 @@ TestFileSystemPath: TestFileSystemPath.o $(SHARED_TEST_OBJS) TestURL: TestURL.o $(SHARED_TEST_OBJS) $(PRE_CXX) $(CXX) $(CXXFLAGS) -o $@ TestURL.o $(SHARED_TEST_OBJS) +TestStringView: TestStringView.o $(SHARED_TEST_OBJS) + $(PRE_CXX) $(CXX) $(CXXFLAGS) -o $@ TestStringView.o $(SHARED_TEST_OBJS) clean: rm -f $(SHARED_TEST_OBJS) diff --git a/AK/Tests/TestStringView.cpp b/AK/Tests/TestStringView.cpp new file mode 100644 index 00000000000..06c2c565898 --- /dev/null +++ b/AK/Tests/TestStringView.cpp @@ -0,0 +1,36 @@ +#include + +#include + +TEST_CASE(construct_empty) +{ + EXPECT(StringView().is_null()); + EXPECT(StringView().is_empty()); + EXPECT(!StringView().characters_without_null_termination()); + EXPECT_EQ(StringView().length(), 0); +} + +TEST_CASE(view_literal) +{ + const char* truth = "cats rule dogs drool"; + StringView view(truth); + EXPECT_EQ(view.is_null(), false); + EXPECT_EQ(view.characters_without_null_termination(), truth); + EXPECT_EQ(view, view); + EXPECT_EQ(view, truth); +} + +TEST_CASE(compare_views) +{ + String foo1 = "foo"; + String foo2 = "foo"; + auto view1 = foo1.view(); + auto view2 = foo2.view(); + + EXPECT_EQ(view1, view2); + EXPECT_EQ(view1, foo1); + EXPECT_EQ(view1, foo2); + EXPECT_EQ(view1, "foo"); +} + +TEST_MAIN(StringView)