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}
This commit is contained in:

committed by
Commit Bot

parent
524f682184
commit
82e1875c7d
@ -86,7 +86,7 @@ class RTC_EXPORT CopyOnWriteBuffer {
|
|||||||
template <typename T = uint8_t,
|
template <typename T = uint8_t,
|
||||||
typename std::enable_if<
|
typename std::enable_if<
|
||||||
internal::BufferCompat<uint8_t, T>::value>::type* = nullptr>
|
internal::BufferCompat<uint8_t, T>::value>::type* = nullptr>
|
||||||
T* data() {
|
T* MutableData() {
|
||||||
RTC_DCHECK(IsConsistent());
|
RTC_DCHECK(IsConsistent());
|
||||||
if (!buffer_) {
|
if (!buffer_) {
|
||||||
return nullptr;
|
return nullptr;
|
||||||
@ -95,6 +95,14 @@ class RTC_EXPORT CopyOnWriteBuffer {
|
|||||||
return buffer_->data<T>() + offset_;
|
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
|
// Get const pointer to the data. This will not create a copy of the
|
||||||
// underlying data if it is shared with other buffers.
|
// underlying data if it is shared with other buffers.
|
||||||
template <typename T = uint8_t,
|
template <typename T = uint8_t,
|
||||||
@ -146,9 +154,10 @@ class RTC_EXPORT CopyOnWriteBuffer {
|
|||||||
return !(*this == buf);
|
return !(*this == buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO(bugs.webrtc.org/12334): Delete when all usage updated to MutableData()
|
||||||
uint8_t& operator[](size_t index) {
|
uint8_t& operator[](size_t index) {
|
||||||
RTC_DCHECK_LT(index, size());
|
RTC_DCHECK_LT(index, size());
|
||||||
return data()[index];
|
return MutableData()[index];
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t operator[](size_t index) const {
|
uint8_t operator[](size_t index) const {
|
||||||
|
@ -280,7 +280,8 @@ TEST(CopyOnWriteBufferTest, TestConstDataAccessor) {
|
|||||||
EXPECT_EQ(data2, cdata1);
|
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 buf1(kTestData, 3, 10);
|
||||||
CopyOnWriteBuffer buf2(buf1);
|
CopyOnWriteBuffer buf2(buf1);
|
||||||
|
|
||||||
@ -292,7 +293,7 @@ TEST(CopyOnWriteBufferTest, TestBacketRead) {
|
|||||||
EnsureBuffersDontShareData(buf1, buf2);
|
EnsureBuffersDontShareData(buf1, buf2);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST(CopyOnWriteBufferTest, TestBacketReadConst) {
|
TEST(CopyOnWriteBufferTest, SeveralConstReads) {
|
||||||
CopyOnWriteBuffer buf1(kTestData, 3, 10);
|
CopyOnWriteBuffer buf1(kTestData, 3, 10);
|
||||||
CopyOnWriteBuffer buf2(buf1);
|
CopyOnWriteBuffer buf2(buf1);
|
||||||
|
|
||||||
@ -304,13 +305,13 @@ TEST(CopyOnWriteBufferTest, TestBacketReadConst) {
|
|||||||
EnsureBuffersShareData(buf1, buf2);
|
EnsureBuffersShareData(buf1, buf2);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST(CopyOnWriteBufferTest, TestBacketWrite) {
|
TEST(CopyOnWriteBufferTest, SeveralWrites) {
|
||||||
CopyOnWriteBuffer buf1(kTestData, 3, 10);
|
CopyOnWriteBuffer buf1(kTestData, 3, 10);
|
||||||
CopyOnWriteBuffer buf2(buf1);
|
CopyOnWriteBuffer buf2(buf1);
|
||||||
|
|
||||||
EnsureBuffersShareData(buf1, buf2);
|
EnsureBuffersShareData(buf1, buf2);
|
||||||
for (size_t i = 0; i != 3u; ++i) {
|
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.size(), 3u);
|
||||||
EXPECT_EQ(buf1.capacity(), 10u);
|
EXPECT_EQ(buf1.capacity(), 10u);
|
||||||
@ -335,7 +336,7 @@ TEST(CopyOnWriteBufferTest, NoCopyDataOnSlice) {
|
|||||||
TEST(CopyOnWriteBufferTest, WritingCopiesData) {
|
TEST(CopyOnWriteBufferTest, WritingCopiesData) {
|
||||||
CopyOnWriteBuffer buf(kTestData, 10, 10);
|
CopyOnWriteBuffer buf(kTestData, 10, 10);
|
||||||
CopyOnWriteBuffer slice = buf.Slice(3, 4);
|
CopyOnWriteBuffer slice = buf.Slice(3, 4);
|
||||||
slice[0] = 0xaa;
|
slice.MutableData()[0] = 0xaa;
|
||||||
EXPECT_NE(buf.cdata() + 3, slice.cdata());
|
EXPECT_NE(buf.cdata() + 3, slice.cdata());
|
||||||
EXPECT_EQ(0, memcmp(buf.cdata(), kTestData, 10));
|
EXPECT_EQ(0, memcmp(buf.cdata(), kTestData, 10));
|
||||||
}
|
}
|
||||||
@ -343,7 +344,7 @@ TEST(CopyOnWriteBufferTest, WritingCopiesData) {
|
|||||||
TEST(CopyOnWriteBufferTest, WritingToBufferDoesntAffectsSlice) {
|
TEST(CopyOnWriteBufferTest, WritingToBufferDoesntAffectsSlice) {
|
||||||
CopyOnWriteBuffer buf(kTestData, 10, 10);
|
CopyOnWriteBuffer buf(kTestData, 10, 10);
|
||||||
CopyOnWriteBuffer slice = buf.Slice(3, 4);
|
CopyOnWriteBuffer slice = buf.Slice(3, 4);
|
||||||
buf[0] = 0xaa;
|
buf.MutableData()[0] = 0xaa;
|
||||||
EXPECT_NE(buf.cdata() + 3, slice.cdata());
|
EXPECT_NE(buf.cdata() + 3, slice.cdata());
|
||||||
EXPECT_EQ(0, memcmp(slice.cdata(), kTestData + 3, 4));
|
EXPECT_EQ(0, memcmp(slice.cdata(), kTestData + 3, 4));
|
||||||
}
|
}
|
||||||
@ -361,7 +362,7 @@ TEST(CopyOnWriteBufferTest, SlicesAreIndependent) {
|
|||||||
CopyOnWriteBuffer buf(kTestData, 10, 10);
|
CopyOnWriteBuffer buf(kTestData, 10, 10);
|
||||||
CopyOnWriteBuffer slice = buf.Slice(3, 7);
|
CopyOnWriteBuffer slice = buf.Slice(3, 7);
|
||||||
CopyOnWriteBuffer slice2 = buf.Slice(3, 7);
|
CopyOnWriteBuffer slice2 = buf.Slice(3, 7);
|
||||||
slice2[0] = 0xaa;
|
slice2.MutableData()[0] = 0xaa;
|
||||||
EXPECT_EQ(buf.cdata() + 3, slice.cdata());
|
EXPECT_EQ(buf.cdata() + 3, slice.cdata());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user