class RTC_EXPORT CopyOnWriteBuffer { public: using const_iterator = std::span<const uint8_t>::iterator;
// An empty buffer.
CopyOnWriteBuffer(); // Share the data with an existing buffer.
CopyOnWriteBuffer(const CopyOnWriteBuffer& buf);
CopyOnWriteBuffer& operator=(const CopyOnWriteBuffer& buf) = default;
// Construct a buffer from a string, convenient for unittests.
explicit CopyOnWriteBuffer(absl::string_view s);
// Construct a buffer with the specified number of uninitialized bytes.
explicit CopyOnWriteBuffer(size_t size);
CopyOnWriteBuffer(size_t size, size_t capacity);
// Construct a buffer and copy the specified number of bytes into it. The // source array may be (const) uint8_t*, int8_t*, or char*. template <typename T, typename std::enable_if<
internal::BufferCompat<uint8_t, T>::value>::type* = nullptr>
CopyOnWriteBuffer(const T* data, size_t size)
: CopyOnWriteBuffer(data, size, size) {} template <typename T, typename std::enable_if<
internal::BufferCompat<uint8_t, T>::value>::type* = nullptr>
CopyOnWriteBuffer(const T* data, size_t size, size_t capacity)
: CopyOnWriteBuffer(size, capacity) {
SetData(data, size);
}
// Construct a buffer from the contents of an array. template <typename T,
size_t N, typename std::enable_if<
internal::BufferCompat<uint8_t, T>::value>::type* = nullptr>
CopyOnWriteBuffer(const T (&array)[N]) // NOLINT: runtime/explicit
: CopyOnWriteBuffer(array, N) {}
// Construct a buffer from a vector like type. template <typename VecT, typename ElemT = typename std::remove_pointer_t<
decltype(std::declval<VecT>().data())>, typename std::enable_if_t<
!std::is_same<VecT, CopyOnWriteBuffer>::value &&
HasDataAndSize<VecT, ElemT>::value &&
internal::BufferCompat<uint8_t, ElemT>::value>* = nullptr>
explicit CopyOnWriteBuffer(const VecT& v)
: CopyOnWriteBuffer(v.data(), v.size()) {}
// Construct a buffer from a vector like type and a capacity argument template <typename VecT, typename ElemT = typename std::remove_pointer_t<
decltype(std::declval<VecT>().data())>, typename std::enable_if_t<
!std::is_same<VecT, CopyOnWriteBuffer>::value &&
HasDataAndSize<VecT, ElemT>::value &&
internal::BufferCompat<uint8_t, ElemT>::value>* = nullptr>
explicit CopyOnWriteBuffer(const VecT& v, size_t capacity)
: CopyOnWriteBuffer(v.data(), v.size(), capacity) {}
~CopyOnWriteBuffer();
// Get a pointer to the data. Just .data() will give you a (const) uint8_t*, // but you may also use .data<int8_t>() and .data<char>(). template <typename T = uint8_t, typename std::enable_if<
internal::BufferCompat<uint8_t, T>::value>::type* = nullptr> const T* data() const { return cdata<T>();
}
// Get writable pointer to the data. This will create a copy of the underlying // data if it is shared with other buffers. template <typename T = uint8_t, typename std::enable_if<
internal::BufferCompat<uint8_t, T>::value>::type* = nullptr>
T* MutableData() {
RTC_DCHECK(IsConsistent());
if (!buffer_) { return nullptr;
}
UnshareAndEnsureCapacity(capacity()); returnreinterpret_cast<T*>(buffer_->data().subspan(offset_).data());
}
// Get const pointer to the data. This will not create a copy of the // underlying data if it is shared with other buffers. template <typename T = uint8_t, typename std::enable_if<
internal::BufferCompat<uint8_t, T>::value>::type* = nullptr> const T* cdata() const { returnreinterpret_cast<const T*>(AsConstSpan().data());
}
// Replace the contents of the buffer. Accepts the same types as the // constructors. template <typename T, typename std::enable_if<
internal::BufferCompat<uint8_t, T>::value>::type* = nullptr> void SetData(const T* data, size_t size) {
Set(std::span(reinterpret_cast<const uint8_t*>(data), size));
}
template <typename T,
size_t N, typename std::enable_if<
internal::BufferCompat<uint8_t, T>::value>::type* = nullptr> void SetData(const T (&array)[N]) {
SetData(array, N);
}
// Append data to the buffer. Accepts the same types as the constructors. template <typename T, typename std::enable_if<
internal::BufferCompat<uint8_t, T>::value>::type* = nullptr> void AppendData(const T* data, size_t size) {
Append(std::span(reinterpret_cast<const uint8_t*>(data), size));
}
template <typename T,
size_t N, typename std::enable_if<
internal::BufferCompat<uint8_t, T>::value>::type* = nullptr> void AppendData(const T (&array)[N]) {
AppendData(array, N);
}
// Sets the size of the buffer. If the new size is smaller than the old, the // buffer contents will be kept but truncated; if the new size is greater, // the existing contents will be kept and the new space will be // uninitialized. void SetSize(size_t size);
// Ensure that the buffer size can be increased to at least capacity without // further reallocation. (Of course, this operation might need to reallocate // the buffer.) void EnsureCapacity(size_t capacity);
// Resets the buffer to zero size without altering capacity. Works even if the // buffer has been moved from. void Clear();
// Swaps two buffers.
friend void swap(CopyOnWriteBuffer& a, CopyOnWriteBuffer& b) {
a.buffer_.swap(b.buffer_);
std::swap(a.offset_, b.offset_);
std::swap(a.size_, b.size_);
}
// Create a copy of the underlying data if it is referenced from other Buffer // objects or there is not enough capacity. void UnshareAndEnsureCapacity(size_t new_capacity);
// Pre- and postcondition of all methods. bool IsConsistent() const {
if (buffer_) { return buffer_->capacity() > 0 && offset_ + size_ <= buffer_->capacity();
} else { return size_ == 0 && offset_ == 0;
}
}
// buffer_ is either null, or points to an Buffer with capacity > 0.
scoped_refptr<RefCountedBuffer> buffer_; // This buffer may represent a slice of a original data.
size_t offset_; // Offset of a current slice in the original data in buffer_. // Should be 0 if the buffer_ is empty.
size_t size_; // Size of a current slice in the original data in buffer_. // Should be 0 if the buffer_ is empty.
};
} // namespace webrtc
#endif// RTC_BASE_COPY_ON_WRITE_BUFFER_H_
Messung V0.5 in Prozent
¤ Dauer der Verarbeitung: 0.12 Sekunden
(vorverarbeitet am 2026-08-27)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.