Add Slice method to CopyOnWriteBuffer and use it in FEC code.

This avoids unnecessary memcpy calls.

Bug: webrtc:10750
Change-Id: I73fe8f1c9659f2c5e59d7fb97b80349a3504a34a
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/145320
Reviewed-by: Karl Wiberg <kwiberg@webrtc.org>
Reviewed-by: Rasmus Brandt <brandtr@webrtc.org>
Reviewed-by: Danil Chapovalov <danilchap@webrtc.org>
Commit-Queue: Ilya Nikolaevskiy <ilnik@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#29315}
This commit is contained in:
Ilya Nikolaevskiy
2019-09-25 14:37:10 +02:00
committed by Commit Bot
parent 85d5c197a8
commit 741bab0f6c
5 changed files with 147 additions and 43 deletions

View File

@ -319,4 +319,50 @@ TEST(CopyOnWriteBufferTest, TestBacketWrite) {
EXPECT_EQ(0, memcmp(buf2.cdata(), kTestData, 3));
}
TEST(CopyOnWriteBufferTest, CreateSlice) {
CopyOnWriteBuffer buf(kTestData, 10, 10);
CopyOnWriteBuffer slice = buf.Slice(3, 4);
EXPECT_EQ(slice.size(), 4u);
EXPECT_EQ(0, memcmp(buf.cdata() + 3, slice.cdata(), 4));
}
TEST(CopyOnWriteBufferTest, NoCopyDataOnSlice) {
CopyOnWriteBuffer buf(kTestData, 10, 10);
CopyOnWriteBuffer slice = buf.Slice(3, 4);
EXPECT_EQ(buf.cdata() + 3, slice.cdata());
}
TEST(CopyOnWriteBufferTest, WritingCopiesData) {
CopyOnWriteBuffer buf(kTestData, 10, 10);
CopyOnWriteBuffer slice = buf.Slice(3, 4);
slice[0] = 0xaa;
EXPECT_NE(buf.cdata() + 3, slice.cdata());
EXPECT_EQ(0, memcmp(buf.cdata(), kTestData, 10));
}
TEST(CopyOnWriteBufferTest, WritingToBufferDoesntAffectsSlice) {
CopyOnWriteBuffer buf(kTestData, 10, 10);
CopyOnWriteBuffer slice = buf.Slice(3, 4);
buf[0] = 0xaa;
EXPECT_NE(buf.cdata() + 3, slice.cdata());
EXPECT_EQ(0, memcmp(slice.cdata(), kTestData + 3, 4));
}
TEST(CopyOnWriteBufferTest, SliceOfASlice) {
CopyOnWriteBuffer buf(kTestData, 10, 10);
CopyOnWriteBuffer slice = buf.Slice(3, 7);
CopyOnWriteBuffer slice2 = slice.Slice(2, 3);
EXPECT_EQ(slice2.size(), 3u);
EXPECT_EQ(slice.cdata() + 2, slice2.cdata());
EXPECT_EQ(buf.cdata() + 5, slice2.cdata());
}
TEST(CopyOnWriteBufferTest, SlicesAreIndependent) {
CopyOnWriteBuffer buf(kTestData, 10, 10);
CopyOnWriteBuffer slice = buf.Slice(3, 7);
CopyOnWriteBuffer slice2 = buf.Slice(3, 7);
slice2[0] = 0xaa;
EXPECT_EQ(buf.cdata() + 3, slice.cdata());
}
} // namespace rtc