Add CopyOnWriteBuffer::empty accessor

CopyOnWriteBuffer is a container-like type,
lack of empty accessor is often surprising.

Bug: None
Change-Id: I9db1e3837aa596810729e9bf92e366fbce3908d3
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/328382
Reviewed-by: Mirko Bonadei <mbonadei@webrtc.org>
Auto-Submit: Danil Chapovalov <danilchap@webrtc.org>
Commit-Queue: Mirko Bonadei <mbonadei@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#41234}
diff --git a/rtc_base/copy_on_write_buffer.h b/rtc_base/copy_on_write_buffer.h
index 8332ee6..bc5e82f 100644
--- a/rtc_base/copy_on_write_buffer.h
+++ b/rtc_base/copy_on_write_buffer.h
@@ -132,6 +132,8 @@
     return buffer_->data<T>() + offset_;
   }
 
+  bool empty() const { return size_ == 0; }
+
   size_t size() const {
     RTC_DCHECK(IsConsistent());
     return size_;
diff --git a/rtc_base/copy_on_write_buffer_unittest.cc b/rtc_base/copy_on_write_buffer_unittest.cc
index 8a9fc4e..8bf53c4 100644
--- a/rtc_base/copy_on_write_buffer_unittest.cc
+++ b/rtc_base/copy_on_write_buffer_unittest.cc
@@ -46,11 +46,20 @@
 
 TEST(CopyOnWriteBufferTest, TestCreateEmptyData) {
   CopyOnWriteBuffer buf(static_cast<const uint8_t*>(nullptr), 0);
+  EXPECT_TRUE(buf.empty());
   EXPECT_EQ(buf.size(), 0u);
   EXPECT_EQ(buf.capacity(), 0u);
   EXPECT_EQ(buf.data(), nullptr);
 }
 
+TEST(CopyOnWriteBufferTest, CreateEmptyDataWithCapacity) {
+  CopyOnWriteBuffer buf(0, 16);
+  EXPECT_TRUE(buf.empty());
+  EXPECT_EQ(buf.size(), 0u);
+  EXPECT_EQ(buf.capacity(), 16u);
+  EXPECT_NE(buf.MutableData(), nullptr);
+}
+
 TEST(CopyOnWriteBufferTest, TestMoveConstruct) {
   EXPECT_TRUE(std::is_nothrow_move_constructible_v<CopyOnWriteBuffer>);
 
@@ -60,9 +69,11 @@
   const uint8_t* buf1_data = buf1.cdata();
 
   CopyOnWriteBuffer buf2(std::move(buf1));
+  EXPECT_TRUE(buf1.empty());
   EXPECT_EQ(buf1.size(), 0u);
   EXPECT_EQ(buf1.capacity(), 0u);
   EXPECT_EQ(buf1.data(), nullptr);
+  EXPECT_FALSE(buf2.empty());
   EXPECT_EQ(buf2.size(), buf1_size);
   EXPECT_EQ(buf2.capacity(), buf1_capacity);
   EXPECT_EQ(buf2.data(), buf1_data);
@@ -127,6 +138,7 @@
   buf.SetData<uint8_t>(nullptr, 0);
 
   EXPECT_EQ(0u, buf.size());
+  EXPECT_TRUE(buf.empty());
 }
 
 TEST(CopyOnWriteBufferTest, SetDataNoMoreThanCapacityDoesntCauseReallocation) {