| 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
|
|
|