Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(9)

Unified Diff: webrtc/base/copyonwritebuffer.cc

Issue 2338843002: Move CopyOnWriteBuffer functions definitions from .h to .cc (Closed)
Patch Set: Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « webrtc/base/copyonwritebuffer.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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
« no previous file with comments | « webrtc/base/copyonwritebuffer.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698