diff --git a/libc/src/__support/CPP/string.h b/libc/src/__support/CPP/string.h index f050defe498ce..239fa18eac36d 100644 --- a/libc/src/__support/CPP/string.h +++ b/libc/src/__support/CPP/string.h @@ -58,6 +58,8 @@ class string { resize(count); inline_memcpy(buffer_, cstr, count); } + LIBC_INLINE string(const string_view &view) + : string(view.data(), view.size()) {} LIBC_INLINE string(const char *cstr) : string(cstr, ::__llvm_libc::internal::string_length(cstr)) {} LIBC_INLINE string(size_t size_, char value) { @@ -78,6 +80,10 @@ class string { return *this; } + LIBC_INLINE string &operator=(const string_view &view) { + return *this = string(view); + } + LIBC_INLINE ~string() { if (buffer_ != get_empty_string()) ::free(buffer_); diff --git a/libc/test/src/__support/CPP/string_test.cpp b/libc/test/src/__support/CPP/string_test.cpp index f7a18214eb811..928277fe2e9cc 100644 --- a/libc/test/src/__support/CPP/string_test.cpp +++ b/libc/test/src/__support/CPP/string_test.cpp @@ -62,6 +62,16 @@ TEST(LlvmLibcStringTest, InitializeCStringWithSize) { ASSERT_EQ(s.back(), 'b'); } +TEST(LlvmLibcStringTest, InitializeStringView) { + const string_view str = "ab"; + const string s(str); + ASSERT_EQ(s.size(), size_t(2)); + ASSERT_EQ(s[0], 'a'); + ASSERT_EQ(s[1], 'b'); + ASSERT_EQ(s.front(), 'a'); + ASSERT_EQ(s.back(), 'b'); +} + TEST(LlvmLibcStringTest, InitializeRepeatedChar) { const string s(4, '1'); ASSERT_EQ(string_view(s), string_view("1111")); @@ -114,6 +124,17 @@ TEST(LlvmLibcStringTest, MoveAssign) { ASSERT_STREQ(a.c_str(), ""); } +TEST(LlvmLibcStringTest, StringViewAssign) { + const string_view str = "ab"; + string s; + s = str; + ASSERT_EQ(s.size(), size_t(2)); + ASSERT_EQ(s[0], 'a'); + ASSERT_EQ(s[1], 'b'); + ASSERT_EQ(s.front(), 'a'); + ASSERT_EQ(s.back(), 'b'); +} + TEST(LlvmLibcStringTest, Concat) { const char *const str = "abc"; string a(str);