Move CopyOnWriteBuffer functions definitions from .h to .cc
R=kwiberg@webrtc.org
Review URL: https://codereview.webrtc.org/2338843002 .
Cr-Commit-Position: refs/heads/master@{#14217}
diff --git a/webrtc/base/copyonwritebuffer.cc b/webrtc/base/copyonwritebuffer.cc
index 6eae426..e1ba8de 100644
--- a/webrtc/base/copyonwritebuffer.cc
+++ b/webrtc/base/copyonwritebuffer.cc
@@ -38,4 +38,75 @@
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