From afc237751ae5c2fa9c72bdf9ab2119bf0c861e1e Mon Sep 17 00:00:00 2001 From: philipel Date: Mon, 20 Sep 2021 11:22:13 +0200 Subject: [PATCH] Allow CopyOnWriteBuffer to accept vector-like types. Bug: none Change-Id: I03ee91be151e10d6b0385b462158ecd0bd9ad4ed Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/232129 Reviewed-by: Danil Chapovalov Reviewed-by: Mirko Bonadei Commit-Queue: Philip Eliasson Cr-Commit-Position: refs/heads/main@{#35039} --- rtc_base/copy_on_write_buffer.h | 22 ++++++++++++++++++++-- rtc_base/copy_on_write_buffer_unittest.cc | 20 ++++++++++++++++++++ 2 files changed, 40 insertions(+), 2 deletions(-) diff --git a/rtc_base/copy_on_write_buffer.h b/rtc_base/copy_on_write_buffer.h index 526cbe5c5c..6837f06526 100644 --- a/rtc_base/copy_on_write_buffer.h +++ b/rtc_base/copy_on_write_buffer.h @@ -24,6 +24,7 @@ #include "rtc_base/checks.h" #include "rtc_base/ref_counted_object.h" #include "rtc_base/system/rtc_export.h" +#include "rtc_base/type_traits.h" namespace rtc { @@ -70,6 +71,17 @@ class RTC_EXPORT CopyOnWriteBuffer { CopyOnWriteBuffer(const T (&array)[N]) // NOLINT: runtime/explicit : CopyOnWriteBuffer(array, N) {} + // Construct a buffer from a vector like type. + template ().data())>, + typename std::enable_if_t< + !std::is_same::value && + HasDataAndSize::value && + internal::BufferCompat::value>* = nullptr> + explicit CopyOnWriteBuffer(const VecT& v) + : CopyOnWriteBuffer(v.data(), v.size()) {} + ~CopyOnWriteBuffer(); // Get a pointer to the data. Just .data() will give you a (const) uint8_t*, @@ -221,8 +233,14 @@ class RTC_EXPORT CopyOnWriteBuffer { AppendData(array, N); } - void AppendData(const CopyOnWriteBuffer& buf) { - AppendData(buf.data(), buf.size()); + template ().data())>, + typename std::enable_if_t< + HasDataAndSize::value && + internal::BufferCompat::value>* = nullptr> + void AppendData(const VecT& v) { + AppendData(v.data(), v.size()); } // Sets the size of the buffer. If the new size is smaller than the old, the diff --git a/rtc_base/copy_on_write_buffer_unittest.cc b/rtc_base/copy_on_write_buffer_unittest.cc index d3978686a8..ad2c4e0fba 100644 --- a/rtc_base/copy_on_write_buffer_unittest.cc +++ b/rtc_base/copy_on_write_buffer_unittest.cc @@ -353,4 +353,24 @@ TEST(CopyOnWriteBufferTest, SlicesAreIndependent) { EXPECT_EQ(buf.cdata() + 3, slice.cdata()); } +TEST(CopyOnWriteBufferTest, AcceptsVectorLikeTypes) { + std::vector a = {1, 2}; + std::vector b = {3, 4}; + rtc::ArrayView c(a); + rtc::ArrayView d(b); + + CopyOnWriteBuffer a_buf(a); + CopyOnWriteBuffer b_buf(b); + CopyOnWriteBuffer c_buf(c); + CopyOnWriteBuffer d_buf(d); + + CopyOnWriteBuffer all; + all.AppendData(a); + all.AppendData(b); + all.AppendData(c); + all.AppendData(d); + + EXPECT_EQ(all.size(), 8U); +} + } // namespace rtc