OLD | NEW |
| (Empty) |
1 /* | |
2 * Copyright 2016 The WebRTC Project Authors. All rights reserved. | |
3 * | |
4 * Use of this source code is governed by a BSD-style license | |
5 * that can be found in the LICENSE file in the root of the source | |
6 * tree. An additional intellectual property rights grant can be found | |
7 * in the file PATENTS. All contributing project authors may | |
8 * be found in the AUTHORS file in the root of the source tree. | |
9 */ | |
10 | |
11 #include "webrtc/base/copyonwritebuffer.h" | |
12 | |
13 namespace rtc { | |
14 | |
15 CopyOnWriteBuffer::CopyOnWriteBuffer() { | |
16 RTC_DCHECK(IsConsistent()); | |
17 } | |
18 | |
19 CopyOnWriteBuffer::CopyOnWriteBuffer(const CopyOnWriteBuffer& buf) | |
20 : buffer_(buf.buffer_) { | |
21 } | |
22 | |
23 CopyOnWriteBuffer::CopyOnWriteBuffer(CopyOnWriteBuffer&& buf) | |
24 : buffer_(std::move(buf.buffer_)) { | |
25 } | |
26 | |
27 CopyOnWriteBuffer::CopyOnWriteBuffer(size_t size) | |
28 : buffer_(size > 0 ? new RefCountedObject<Buffer>(size) : nullptr) { | |
29 RTC_DCHECK(IsConsistent()); | |
30 } | |
31 | |
32 CopyOnWriteBuffer::CopyOnWriteBuffer(size_t size, size_t capacity) | |
33 : buffer_(size > 0 || capacity > 0 | |
34 ? new RefCountedObject<Buffer>(size, capacity) | |
35 : nullptr) { | |
36 RTC_DCHECK(IsConsistent()); | |
37 } | |
38 | |
39 CopyOnWriteBuffer::~CopyOnWriteBuffer() = default; | |
40 | |
41 bool CopyOnWriteBuffer::operator==(const CopyOnWriteBuffer& buf) const { | |
42 // Must either use the same buffer internally or have the same contents. | |
43 RTC_DCHECK(IsConsistent()); | |
44 RTC_DCHECK(buf.IsConsistent()); | |
45 return buffer_.get() == buf.buffer_.get() || | |
46 (buffer_.get() && buf.buffer_.get() && | |
47 *buffer_.get() == *buf.buffer_.get()); | |
48 } | |
49 | |
50 void CopyOnWriteBuffer::SetSize(size_t size) { | |
51 RTC_DCHECK(IsConsistent()); | |
52 if (!buffer_) { | |
53 if (size > 0) { | |
54 buffer_ = new RefCountedObject<Buffer>(size); | |
55 } | |
56 RTC_DCHECK(IsConsistent()); | |
57 return; | |
58 } | |
59 | |
60 // Clone data if referenced. | |
61 if (!buffer_->HasOneRef()) { | |
62 buffer_ = new RefCountedObject<Buffer>( | |
63 buffer_->data(), | |
64 std::min(buffer_->size(), size), | |
65 std::max(buffer_->capacity(), size)); | |
66 } | |
67 buffer_->SetSize(size); | |
68 RTC_DCHECK(IsConsistent()); | |
69 } | |
70 | |
71 void CopyOnWriteBuffer::EnsureCapacity(size_t capacity) { | |
72 RTC_DCHECK(IsConsistent()); | |
73 if (!buffer_) { | |
74 if (capacity > 0) { | |
75 buffer_ = new RefCountedObject<Buffer>(0, capacity); | |
76 } | |
77 RTC_DCHECK(IsConsistent()); | |
78 return; | |
79 } else if (capacity <= buffer_->capacity()) { | |
80 return; | |
81 } | |
82 | |
83 CloneDataIfReferenced(std::max(buffer_->capacity(), capacity)); | |
84 buffer_->EnsureCapacity(capacity); | |
85 RTC_DCHECK(IsConsistent()); | |
86 } | |
87 | |
88 void CopyOnWriteBuffer::Clear() { | |
89 if (!buffer_) | |
90 return; | |
91 | |
92 if (buffer_->HasOneRef()) { | |
93 buffer_->Clear(); | |
94 } else { | |
95 buffer_ = new RefCountedObject<Buffer>(0, buffer_->capacity()); | |
96 } | |
97 RTC_DCHECK(IsConsistent()); | |
98 } | |
99 | |
100 void CopyOnWriteBuffer::CloneDataIfReferenced(size_t new_capacity) { | |
101 if (buffer_->HasOneRef()) { | |
102 return; | |
103 } | |
104 | |
105 buffer_ = new RefCountedObject<Buffer>(buffer_->data(), buffer_->size(), | |
106 new_capacity); | |
107 RTC_DCHECK(IsConsistent()); | |
108 } | |
109 | |
110 | |
111 | |
112 } // namespace rtc | |
OLD | NEW |