Index: webrtc/base/buffer.cc |
diff --git a/webrtc/base/buffer.cc b/webrtc/base/buffer.cc |
index 62855f1620dfeac0c9f797c96492cbf7a99404f1..07d40bbf0214ad88da5da6a9afcc7aee89253c8b 100644 |
--- a/webrtc/base/buffer.cc |
+++ b/webrtc/base/buffer.cc |
@@ -15,18 +15,57 @@ |
namespace rtc { |
-Buffer::Buffer() : size_(0), capacity_(0), data_(nullptr) { |
+BufferData::BufferData() |
+ : ref_count_(1), |
+ size_(0), |
+ capacity_(0), |
+ data_(nullptr) { |
assert(IsConsistent()); |
} |
-Buffer::Buffer(const Buffer& buf) : Buffer(buf.data(), buf.size()) { |
+BufferData::BufferData(const BufferData& data) |
+ : ref_count_(1), |
+ size_(data.size_), |
+ capacity_(data.capacity_), |
+ data_(new uint8_t[capacity_]) { |
+ assert(IsConsistent()); |
+ if (data.size_) { |
+ std::memcpy(data_.get(), data.data_.get(), data.size_); |
+ } |
+} |
+ |
+BufferData::BufferData(size_t size) : BufferData(size, size) { |
} |
-Buffer::Buffer(Buffer&& buf) |
- : size_(buf.size()), |
- capacity_(buf.capacity()), |
- data_(std::move(buf.data_)) { |
+BufferData::BufferData(size_t size, size_t capacity) |
+ : ref_count_(1), |
+ size_(size), |
+ capacity_(std::max(size, capacity)), |
+ data_(new uint8_t[capacity_]) { |
assert(IsConsistent()); |
+} |
+ |
+BufferData::BufferData(const void* data, size_t size) |
+ : BufferData(data, size, size) { |
+} |
+ |
+BufferData::BufferData(const void* data, size_t size, size_t capacity) |
+ : BufferData(size, capacity) { |
+ std::memcpy(data_.get(), data, size); |
+} |
+ |
+BufferData::~BufferData() { |
+} |
+ |
+ |
+Buffer::Buffer() : data_(new BufferData()) { |
+} |
+ |
+Buffer::Buffer(const Buffer& buf) : data_(buf.data_) { |
+ data_->AddRef(); |
+} |
+ |
+Buffer::Buffer(Buffer&& buf) : data_(std::move(buf.data_)) { |
buf.OnMovedFrom(); |
} |
@@ -34,13 +73,12 @@ Buffer::Buffer(size_t size) : Buffer(size, size) { |
} |
Buffer::Buffer(size_t size, size_t capacity) |
- : size_(size), |
- capacity_(std::max(size, capacity)), |
- data_(new uint8_t[capacity_]) { |
+ : data_(new BufferData(size, capacity)) { |
assert(IsConsistent()); |
} |
-// Note: The destructor works even if the buffer has been moved from. |
-Buffer::~Buffer() = default; |
+Buffer::~Buffer() { |
+ data_->Release(); |
+} |
}; // namespace rtc |