diff --git a/AK/Span.h b/AK/Span.h index 19f4d59710..ed13319201 100644 --- a/AK/Span.h +++ b/AK/Span.h @@ -176,6 +176,14 @@ public: return false; } + bool constexpr starts_with(Span other) const + { + if (size() < other.size()) + return false; + + return TypedTransfer::compare(data(), other.data(), other.size()); + } + ALWAYS_INLINE constexpr const T& at(size_t index) const { VERIFY(index < this->m_size); diff --git a/Tests/AK/TestSpan.cpp b/Tests/AK/TestSpan.cpp index 2668133c4e..8affd79584 100644 --- a/Tests/AK/TestSpan.cpp +++ b/Tests/AK/TestSpan.cpp @@ -123,3 +123,19 @@ TEST_CASE(span_from_c_string) const char* str = "Serenity"; [[maybe_unused]] ReadonlyBytes bytes { str, strlen(str) }; } + +TEST_CASE(starts_with) +{ + const char* str = "HeyFriends!"; + ReadonlyBytes bytes { str, strlen(str) }; + const char* str_hey = "Hey"; + ReadonlyBytes hey_bytes { str_hey, strlen(str_hey) }; + EXPECT(bytes.starts_with(hey_bytes)); + const char* str_nah = "Nah"; + ReadonlyBytes nah_bytes { str_nah, strlen(str_nah) }; + EXPECT(!bytes.starts_with(nah_bytes)); + + const u8 hey_array[3] = { 'H', 'e', 'y' }; + ReadonlyBytes hey_bytes_u8 { hey_array, 3 }; + EXPECT(bytes.starts_with(hey_bytes_u8)); +}