Quellcode-Bibliothek copy_on_write_buffer.h
Sprache: C
/* * Copyright 2016 The WebRTC Project Authors. All rights reserved. * * Use of this source code is governed by a BSD-style license * that can be found in the LICENSE file in the root of the source * tree. An additional intellectual property rights grant can be found * in the file PATENTS. All contributing project authors may * be found in the AUTHORS file in the root of the source tree.
*/
class RTC_EXPORT CopyOnWriteBuffer { public: // An empty buffer.
CopyOnWriteBuffer(); // Share the data with an existing buffer.
CopyOnWriteBuffer(const CopyOnWriteBuffer& buf); // Move contents from an existing buffer.
CopyOnWriteBuffer(CopyOnWriteBuffer&& buf) noexcept;
// 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) { if (buffer_) {
std::memcpy(buffer_->data(), data, size);
offset_ = 0;
size_ = 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()); return buffer_->data<T>() + offset_;
}
// 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 {
RTC_DCHECK(IsConsistent()); if (!buffer_) { return nullptr;
} return buffer_->data<T>() + offset_;
}
// 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. friendvoid swap(CopyOnWriteBuffer& a, CopyOnWriteBuffer& b) {
a.buffer_.swap(b.buffer_);
std::swap(a.offset_, b.offset_);
std::swap(a.size_, b.size_);
}
private: using RefCountedBuffer = FinalRefCountedObject<Buffer>; // 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);
// buffer_ is either null, or points to an rtc::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 rtc
#endif// RTC_BASE_COPY_ON_WRITE_BUFFER_H_
Messung V0.5
¤ 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.0.10Bemerkung:
(vorverarbeitet)
¤
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.