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

Side by Side Diff: webrtc/base/copyonwritebuffer.h

Issue 1929903002: Define rtc::BufferT, like rtc::Buffer but for any trivial type (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: review Created 4 years, 7 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 unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright 2016 The WebRTC Project Authors. All rights reserved. 2 * Copyright 2016 The WebRTC Project Authors. All rights reserved.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license 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 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 6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may 7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree. 8 * be found in the AUTHORS file in the root of the source tree.
9 */ 9 */
10 10
(...skipping 18 matching lines...) Expand all
29 CopyOnWriteBuffer(const CopyOnWriteBuffer& buf); 29 CopyOnWriteBuffer(const CopyOnWriteBuffer& buf);
30 // Move contents from an existing buffer. 30 // Move contents from an existing buffer.
31 CopyOnWriteBuffer(CopyOnWriteBuffer&& buf); 31 CopyOnWriteBuffer(CopyOnWriteBuffer&& buf);
32 32
33 // Construct a buffer with the specified number of uninitialized bytes. 33 // Construct a buffer with the specified number of uninitialized bytes.
34 explicit CopyOnWriteBuffer(size_t size); 34 explicit CopyOnWriteBuffer(size_t size);
35 CopyOnWriteBuffer(size_t size, size_t capacity); 35 CopyOnWriteBuffer(size_t size, size_t capacity);
36 36
37 // Construct a buffer and copy the specified number of bytes into it. The 37 // Construct a buffer and copy the specified number of bytes into it. The
38 // source array may be (const) uint8_t*, int8_t*, or char*. 38 // source array may be (const) uint8_t*, int8_t*, or char*.
39 template <typename T, typename internal::ByteType<T>::t = 0> 39 template <typename T,
40 typename std::enable_if<
41 internal::BufferCompat<uint8_t, T>::value>::type* = nullptr>
40 CopyOnWriteBuffer(const T* data, size_t size) 42 CopyOnWriteBuffer(const T* data, size_t size)
41 : CopyOnWriteBuffer(data, size, size) {} 43 : CopyOnWriteBuffer(data, size, size) {}
42 template <typename T, typename internal::ByteType<T>::t = 0> 44 template <typename T,
45 typename std::enable_if<
46 internal::BufferCompat<uint8_t, T>::value>::type* = nullptr>
43 CopyOnWriteBuffer(const T* data, size_t size, size_t capacity) 47 CopyOnWriteBuffer(const T* data, size_t size, size_t capacity)
44 : CopyOnWriteBuffer(size, capacity) { 48 : CopyOnWriteBuffer(size, capacity) {
45 if (buffer_) { 49 if (buffer_) {
46 std::memcpy(buffer_->data(), data, size); 50 std::memcpy(buffer_->data(), data, size);
47 } 51 }
48 } 52 }
49 53
50 // Construct a buffer from the contents of an array. 54 // Construct a buffer from the contents of an array.
51 template <typename T, size_t N, typename internal::ByteType<T>::t = 0> 55 template <typename T,
52 CopyOnWriteBuffer(const T(&array)[N]) // NOLINT: runtime/explicit 56 size_t N,
57 typename std::enable_if<
58 internal::BufferCompat<uint8_t, T>::value>::type* = nullptr>
59 CopyOnWriteBuffer(const T (&array)[N]) // NOLINT: runtime/explicit
53 : CopyOnWriteBuffer(array, N) {} 60 : CopyOnWriteBuffer(array, N) {}
54 61
55 ~CopyOnWriteBuffer(); 62 ~CopyOnWriteBuffer();
56 63
57 // Get a pointer to the data. Just .data() will give you a (const) uint8_t*, 64 // Get a pointer to the data. Just .data() will give you a (const) uint8_t*,
58 // but you may also use .data<int8_t>() and .data<char>(). 65 // but you may also use .data<int8_t>() and .data<char>().
59 template <typename T = uint8_t, typename internal::ByteType<T>::t = 0> 66 template <typename T = uint8_t,
67 typename std::enable_if<
68 internal::BufferCompat<uint8_t, T>::value>::type* = nullptr>
60 const T* data() const { 69 const T* data() const {
61 return cdata<T>(); 70 return cdata<T>();
62 } 71 }
63 72
64 // Get writable pointer to the data. This will create a copy of the underlying 73 // Get writable pointer to the data. This will create a copy of the underlying
65 // data if it is shared with other buffers. 74 // data if it is shared with other buffers.
66 template <typename T = uint8_t, typename internal::ByteType<T>::t = 0> 75 template <typename T = uint8_t,
76 typename std::enable_if<
77 internal::BufferCompat<uint8_t, T>::value>::type* = nullptr>
67 T* data() { 78 T* data() {
68 RTC_DCHECK(IsConsistent()); 79 RTC_DCHECK(IsConsistent());
69 if (!buffer_) { 80 if (!buffer_) {
70 return nullptr; 81 return nullptr;
71 } 82 }
72 CloneDataIfReferenced(buffer_->capacity()); 83 CloneDataIfReferenced(buffer_->capacity());
73 return buffer_->data<T>(); 84 return buffer_->data<T>();
74 } 85 }
75 86
76 // Get const pointer to the data. This will not create a copy of the 87 // Get const pointer to the data. This will not create a copy of the
77 // underlying data if it is shared with other buffers. 88 // underlying data if it is shared with other buffers.
78 template <typename T = uint8_t, typename internal::ByteType<T>::t = 0> 89 template <typename T = uint8_t,
90 typename std::enable_if<
91 internal::BufferCompat<uint8_t, T>::value>::type* = nullptr>
79 T* cdata() const { 92 T* cdata() const {
80 RTC_DCHECK(IsConsistent()); 93 RTC_DCHECK(IsConsistent());
81 if (!buffer_) { 94 if (!buffer_) {
82 return nullptr; 95 return nullptr;
83 } 96 }
84 return buffer_->data<T>(); 97 return buffer_->data<T>();
85 } 98 }
86 99
87 size_t size() const { 100 size_t size() const {
88 RTC_DCHECK(IsConsistent()); 101 RTC_DCHECK(IsConsistent());
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
130 return data()[index]; 143 return data()[index];
131 } 144 }
132 145
133 uint8_t operator[](size_t index) const { 146 uint8_t operator[](size_t index) const {
134 RTC_DCHECK_LT(index, size()); 147 RTC_DCHECK_LT(index, size());
135 return cdata()[index]; 148 return cdata()[index];
136 } 149 }
137 150
138 // Replace the contents of the buffer. Accepts the same types as the 151 // Replace the contents of the buffer. Accepts the same types as the
139 // constructors. 152 // constructors.
140 template <typename T, typename internal::ByteType<T>::t = 0> 153 template <typename T,
154 typename std::enable_if<
155 internal::BufferCompat<uint8_t, T>::value>::type* = nullptr>
141 void SetData(const T* data, size_t size) { 156 void SetData(const T* data, size_t size) {
142 RTC_DCHECK(IsConsistent()); 157 RTC_DCHECK(IsConsistent());
143 if (!buffer_ || !buffer_->HasOneRef()) { 158 if (!buffer_ || !buffer_->HasOneRef()) {
144 buffer_ = size > 0 ? new RefCountedObject<Buffer>(data, size) 159 buffer_ = size > 0 ? new RefCountedObject<Buffer>(data, size)
145 : nullptr; 160 : nullptr;
146 } else { 161 } else {
147 buffer_->SetData(data, size); 162 buffer_->SetData(data, size);
148 } 163 }
149 RTC_DCHECK(IsConsistent()); 164 RTC_DCHECK(IsConsistent());
150 } 165 }
151 166
152 template <typename T, size_t N, typename internal::ByteType<T>::t = 0> 167 template <typename T,
153 void SetData(const T(&array)[N]) { 168 size_t N,
169 typename std::enable_if<
170 internal::BufferCompat<uint8_t, T>::value>::type* = nullptr>
171 void SetData(const T (&array)[N]) {
154 SetData(array, N); 172 SetData(array, N);
155 } 173 }
156 174
157 void SetData(const CopyOnWriteBuffer& buf) { 175 void SetData(const CopyOnWriteBuffer& buf) {
158 RTC_DCHECK(IsConsistent()); 176 RTC_DCHECK(IsConsistent());
159 RTC_DCHECK(buf.IsConsistent()); 177 RTC_DCHECK(buf.IsConsistent());
160 if (&buf != this) { 178 if (&buf != this) {
161 buffer_ = buf.buffer_; 179 buffer_ = buf.buffer_;
162 } 180 }
163 } 181 }
164 182
165 // Append data to the buffer. Accepts the same types as the constructors. 183 // Append data to the buffer. Accepts the same types as the constructors.
166 template <typename T, typename internal::ByteType<T>::t = 0> 184 template <typename T,
185 typename std::enable_if<
186 internal::BufferCompat<uint8_t, T>::value>::type* = nullptr>
167 void AppendData(const T* data, size_t size) { 187 void AppendData(const T* data, size_t size) {
168 RTC_DCHECK(IsConsistent()); 188 RTC_DCHECK(IsConsistent());
169 if (!buffer_) { 189 if (!buffer_) {
170 buffer_ = new RefCountedObject<Buffer>(data, size); 190 buffer_ = new RefCountedObject<Buffer>(data, size);
171 RTC_DCHECK(IsConsistent()); 191 RTC_DCHECK(IsConsistent());
172 return; 192 return;
173 } 193 }
174 194
175 CloneDataIfReferenced(std::max(buffer_->capacity(), 195 CloneDataIfReferenced(std::max(buffer_->capacity(),
176 buffer_->size() + size)); 196 buffer_->size() + size));
177 buffer_->AppendData(data, size); 197 buffer_->AppendData(data, size);
178 RTC_DCHECK(IsConsistent()); 198 RTC_DCHECK(IsConsistent());
179 } 199 }
180 200
181 template <typename T, size_t N, typename internal::ByteType<T>::t = 0> 201 template <typename T,
182 void AppendData(const T(&array)[N]) { 202 size_t N,
203 typename std::enable_if<
204 internal::BufferCompat<uint8_t, T>::value>::type* = nullptr>
205 void AppendData(const T (&array)[N]) {
183 AppendData(array, N); 206 AppendData(array, N);
184 } 207 }
185 208
186 void AppendData(const CopyOnWriteBuffer& buf) { 209 void AppendData(const CopyOnWriteBuffer& buf) {
187 AppendData(buf.data(), buf.size()); 210 AppendData(buf.data(), buf.size());
188 } 211 }
189 212
190 // Sets the size of the buffer. If the new size is smaller than the old, the 213 // Sets the size of the buffer. If the new size is smaller than the old, the
191 // buffer contents will be kept but truncated; if the new size is greater, 214 // buffer contents will be kept but truncated; if the new size is greater,
192 // the existing contents will be kept and the new space will be 215 // the existing contents will be kept and the new space will be
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
260 return (!buffer_ || buffer_->capacity() > 0); 283 return (!buffer_ || buffer_->capacity() > 0);
261 } 284 }
262 285
263 // buffer_ is either null, or points to an rtc::Buffer with capacity > 0. 286 // buffer_ is either null, or points to an rtc::Buffer with capacity > 0.
264 scoped_refptr<RefCountedObject<Buffer>> buffer_; 287 scoped_refptr<RefCountedObject<Buffer>> buffer_;
265 }; 288 };
266 289
267 } // namespace rtc 290 } // namespace rtc
268 291
269 #endif // WEBRTC_BASE_COPYONWRITEBUFFER_H_ 292 #endif // WEBRTC_BASE_COPYONWRITEBUFFER_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698