Index: webrtc/base/copyonwritebuffer.cc |
diff --git a/webrtc/base/copyonwritebuffer.cc b/webrtc/base/copyonwritebuffer.cc |
index 6eae42626bff9d55ab6e5398ffde3434619579ab..e1ba8de88181ecb97cebb565ad2c70386774efe8 100644 |
--- a/webrtc/base/copyonwritebuffer.cc |
+++ b/webrtc/base/copyonwritebuffer.cc |
@@ -38,4 +38,75 @@ CopyOnWriteBuffer::CopyOnWriteBuffer(size_t size, size_t capacity) |
CopyOnWriteBuffer::~CopyOnWriteBuffer() = default; |
+bool CopyOnWriteBuffer::operator==(const CopyOnWriteBuffer& buf) const { |
+ // Must either use the same buffer internally or have the same contents. |
+ RTC_DCHECK(IsConsistent()); |
+ RTC_DCHECK(buf.IsConsistent()); |
+ return buffer_.get() == buf.buffer_.get() || |
+ (buffer_.get() && buf.buffer_.get() && |
+ *buffer_.get() == *buf.buffer_.get()); |
+} |
+ |
+void CopyOnWriteBuffer::SetSize(size_t size) { |
+ RTC_DCHECK(IsConsistent()); |
+ if (!buffer_) { |
+ if (size > 0) { |
+ buffer_ = new RefCountedObject<Buffer>(size); |
+ } |
+ RTC_DCHECK(IsConsistent()); |
+ return; |
+ } |
+ |
+ // Clone data if referenced. |
+ if (!buffer_->HasOneRef()) { |
+ buffer_ = new RefCountedObject<Buffer>( |
+ buffer_->data(), |
+ std::min(buffer_->size(), size), |
+ std::max(buffer_->capacity(), size)); |
+ } |
+ buffer_->SetSize(size); |
+ RTC_DCHECK(IsConsistent()); |
+} |
+ |
+void CopyOnWriteBuffer::EnsureCapacity(size_t capacity) { |
+ RTC_DCHECK(IsConsistent()); |
+ if (!buffer_) { |
+ if (capacity > 0) { |
+ buffer_ = new RefCountedObject<Buffer>(0, capacity); |
+ } |
+ RTC_DCHECK(IsConsistent()); |
+ return; |
+ } else if (capacity <= buffer_->capacity()) { |
+ return; |
+ } |
+ |
+ CloneDataIfReferenced(std::max(buffer_->capacity(), capacity)); |
+ buffer_->EnsureCapacity(capacity); |
+ RTC_DCHECK(IsConsistent()); |
+} |
+ |
+void CopyOnWriteBuffer::Clear() { |
+ if (!buffer_) |
+ return; |
+ |
+ if (buffer_->HasOneRef()) { |
+ buffer_->Clear(); |
+ } else { |
+ buffer_ = new RefCountedObject<Buffer>(0, buffer_->capacity()); |
+ } |
+ RTC_DCHECK(IsConsistent()); |
+} |
+ |
+void CopyOnWriteBuffer::CloneDataIfReferenced(size_t new_capacity) { |
+ if (buffer_->HasOneRef()) { |
+ return; |
+ } |
+ |
+ buffer_ = new RefCountedObject<Buffer>(buffer_->data(), buffer_->size(), |
+ new_capacity); |
+ RTC_DCHECK(IsConsistent()); |
+} |
+ |
+ |
+ |
} // namespace rtc |