diff --git a/rtc_base/BUILD.gn b/rtc_base/BUILD.gn index ca1a457dfa..51e15b57f7 100644 --- a/rtc_base/BUILD.gn +++ b/rtc_base/BUILD.gn @@ -156,8 +156,12 @@ rtc_library("byte_buffer") { deps = [ ":buffer", ":byte_order", + "../api:array_view", + ] + absl_deps = [ + "//third_party/abseil-cpp/absl/base:core_headers", + "//third_party/abseil-cpp/absl/strings", ] - absl_deps = [ "//third_party/abseil-cpp/absl/strings" ] } rtc_library("buffer_queue") { diff --git a/rtc_base/byte_buffer.cc b/rtc_base/byte_buffer.cc index 4f4235c4b3..3f0e61e59c 100644 --- a/rtc_base/byte_buffer.cc +++ b/rtc_base/byte_buffer.cc @@ -19,6 +19,10 @@ ByteBufferWriter::ByteBufferWriter() : ByteBufferWriterT() {} ByteBufferWriter::ByteBufferWriter(const char* bytes, size_t len) : ByteBufferWriterT(bytes, len) {} +ByteBufferReader::ByteBufferReader(rtc::ArrayView bytes) { + Construct(bytes.data(), bytes.size()); +} + ByteBufferReader::ByteBufferReader(const char* bytes, size_t len) { Construct(reinterpret_cast(bytes), len); } @@ -27,10 +31,6 @@ ByteBufferReader::ByteBufferReader(const char* bytes) { Construct(reinterpret_cast(bytes), strlen(bytes)); } -ByteBufferReader::ByteBufferReader(const Buffer& buf) { - Construct(buf.data(), buf.size()); -} - ByteBufferReader::ByteBufferReader(const ByteBufferWriter& buf) { Construct(reinterpret_cast(buf.Data()), buf.Length()); } diff --git a/rtc_base/byte_buffer.h b/rtc_base/byte_buffer.h index 3161cf4794..fe17da20c8 100644 --- a/rtc_base/byte_buffer.h +++ b/rtc_base/byte_buffer.h @@ -16,7 +16,9 @@ #include +#include "absl/base/attributes.h" #include "absl/strings/string_view.h" +#include "api/array_view.h" #include "rtc_base/buffer.h" #include "rtc_base/byte_order.h" @@ -124,11 +126,12 @@ class ByteBufferReader { public: ByteBufferReader(const char* bytes, size_t len); + explicit ByteBufferReader( + rtc::ArrayView bytes ABSL_ATTRIBUTE_LIFETIME_BOUND); + // Initializes buffer from a zero-terminated string. explicit ByteBufferReader(const char* bytes); - explicit ByteBufferReader(const Buffer& buf); - explicit ByteBufferReader(const ByteBufferWriter& buf); ByteBufferReader(const ByteBufferReader&) = delete; diff --git a/rtc_base/byte_buffer_unittest.cc b/rtc_base/byte_buffer_unittest.cc index 4f8043c98f..615237c1e6 100644 --- a/rtc_base/byte_buffer_unittest.cc +++ b/rtc_base/byte_buffer_unittest.cc @@ -12,6 +12,8 @@ #include +#include + #include "rtc_base/arraysize.h" #include "rtc_base/byte_order.h" #include "test/gtest.h" @@ -247,4 +249,19 @@ TEST(ByteBufferTest, TestReadWriteUVarint) { EXPECT_EQ(size, read_buffer.Length()); } +TEST(ByteBufferTest, ReadFromArrayView) { + const uint8_t buf[] = {'a', 'b', 'c'}; + ArrayView view(buf, 3); + + ByteBufferReader read_buffer(view); + uint8_t val; + EXPECT_TRUE(read_buffer.ReadUInt8(&val)); + EXPECT_EQ(val, 'a'); + EXPECT_TRUE(read_buffer.ReadUInt8(&val)); + EXPECT_EQ(val, 'b'); + EXPECT_TRUE(read_buffer.ReadUInt8(&val)); + EXPECT_EQ(val, 'c'); + EXPECT_FALSE(read_buffer.ReadUInt8(&val)); +} + } // namespace rtc