Introduce CopyOnWriteBuffer::MutableData() function

With intent to replace non-const data() and operator[]

Bug: webrtc:12334
Change-Id: Ib81f8607b96045ca517159d6d0c9d8a07bda5fd0
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/200802
Commit-Queue: Danil Chapovalov <danilchap@webrtc.org>
Reviewed-by: Mirko Bonadei <mbonadei@webrtc.org>
Reviewed-by: Harald Alvestrand <hta@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#32919}
diff --git a/rtc_base/copy_on_write_buffer.h b/rtc_base/copy_on_write_buffer.h
index 68c6ad5..87bf625fe 100644
--- a/rtc_base/copy_on_write_buffer.h
+++ b/rtc_base/copy_on_write_buffer.h
@@ -86,7 +86,7 @@
   template <typename T = uint8_t,
             typename std::enable_if<
                 internal::BufferCompat<uint8_t, T>::value>::type* = nullptr>
-  T* data() {
+  T* MutableData() {
     RTC_DCHECK(IsConsistent());
     if (!buffer_) {
       return nullptr;
@@ -95,6 +95,14 @@
     return buffer_->data<T>() + offset_;
   }
 
+  // TODO(bugs.webrtc.org/12334): Delete when all usage updated to MutableData()
+  template <typename T = uint8_t,
+            typename std::enable_if<
+                internal::BufferCompat<uint8_t, T>::value>::type* = nullptr>
+  T* data() {
+    return MutableData<T>();
+  }
+
   // Get const pointer to the data. This will not create a copy of the
   // underlying data if it is shared with other buffers.
   template <typename T = uint8_t,
@@ -146,9 +154,10 @@
     return !(*this == buf);
   }
 
+  // TODO(bugs.webrtc.org/12334): Delete when all usage updated to MutableData()
   uint8_t& operator[](size_t index) {
     RTC_DCHECK_LT(index, size());
-    return data()[index];
+    return MutableData()[index];
   }
 
   uint8_t operator[](size_t index) const {
diff --git a/rtc_base/copy_on_write_buffer_unittest.cc b/rtc_base/copy_on_write_buffer_unittest.cc
index b35cd79..5c29c10 100644
--- a/rtc_base/copy_on_write_buffer_unittest.cc
+++ b/rtc_base/copy_on_write_buffer_unittest.cc
@@ -280,7 +280,8 @@
   EXPECT_EQ(data2, cdata1);
 }
 
-TEST(CopyOnWriteBufferTest, TestBacketRead) {
+// TODO(bugs.webrtc.org/12334): Delete when all reads become const
+TEST(CopyOnWriteBufferTest, SeveralReads) {
   CopyOnWriteBuffer buf1(kTestData, 3, 10);
   CopyOnWriteBuffer buf2(buf1);
 
@@ -292,7 +293,7 @@
   EnsureBuffersDontShareData(buf1, buf2);
 }
 
-TEST(CopyOnWriteBufferTest, TestBacketReadConst) {
+TEST(CopyOnWriteBufferTest, SeveralConstReads) {
   CopyOnWriteBuffer buf1(kTestData, 3, 10);
   CopyOnWriteBuffer buf2(buf1);
 
@@ -304,13 +305,13 @@
   EnsureBuffersShareData(buf1, buf2);
 }
 
-TEST(CopyOnWriteBufferTest, TestBacketWrite) {
+TEST(CopyOnWriteBufferTest, SeveralWrites) {
   CopyOnWriteBuffer buf1(kTestData, 3, 10);
   CopyOnWriteBuffer buf2(buf1);
 
   EnsureBuffersShareData(buf1, buf2);
   for (size_t i = 0; i != 3u; ++i) {
-    buf1[i] = kTestData[i] + 1;
+    buf1.MutableData()[i] = kTestData[i] + 1;
   }
   EXPECT_EQ(buf1.size(), 3u);
   EXPECT_EQ(buf1.capacity(), 10u);
@@ -335,7 +336,7 @@
 TEST(CopyOnWriteBufferTest, WritingCopiesData) {
   CopyOnWriteBuffer buf(kTestData, 10, 10);
   CopyOnWriteBuffer slice = buf.Slice(3, 4);
-  slice[0] = 0xaa;
+  slice.MutableData()[0] = 0xaa;
   EXPECT_NE(buf.cdata() + 3, slice.cdata());
   EXPECT_EQ(0, memcmp(buf.cdata(), kTestData, 10));
 }
@@ -343,7 +344,7 @@
 TEST(CopyOnWriteBufferTest, WritingToBufferDoesntAffectsSlice) {
   CopyOnWriteBuffer buf(kTestData, 10, 10);
   CopyOnWriteBuffer slice = buf.Slice(3, 4);
-  buf[0] = 0xaa;
+  buf.MutableData()[0] = 0xaa;
   EXPECT_NE(buf.cdata() + 3, slice.cdata());
   EXPECT_EQ(0, memcmp(slice.cdata(), kTestData + 3, 4));
 }
@@ -361,7 +362,7 @@
   CopyOnWriteBuffer buf(kTestData, 10, 10);
   CopyOnWriteBuffer slice = buf.Slice(3, 7);
   CopyOnWriteBuffer slice2 = buf.Slice(3, 7);
-  slice2[0] = 0xaa;
+  slice2.MutableData()[0] = 0xaa;
   EXPECT_EQ(buf.cdata() + 3, slice.cdata());
 }