1 //===-- DataBufferHeap.cpp ------------------------------------------------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 #include "lldb/Utility/DataBufferHeap.h" 10 11 12 using namespace lldb_private; 13 14 // Default constructor 15 DataBufferHeap::DataBufferHeap() : m_data() {} 16 17 // Initialize this class with "n" characters and fill the buffer with "ch". 18 DataBufferHeap::DataBufferHeap(lldb::offset_t n, uint8_t ch) : m_data() { 19 if (n < m_data.max_size()) 20 m_data.assign(n, ch); 21 } 22 23 // Initialize this class with a copy of the "n" bytes from the "bytes" buffer. 24 DataBufferHeap::DataBufferHeap(const void *src, lldb::offset_t src_len) 25 : m_data() { 26 CopyData(src, src_len); 27 } 28 29 DataBufferHeap::DataBufferHeap(const DataBuffer &data_buffer) : m_data() { 30 CopyData(data_buffer.GetBytes(), data_buffer.GetByteSize()); 31 } 32 33 // Virtual destructor since this class inherits from a pure virtual base class. 34 DataBufferHeap::~DataBufferHeap() = default; 35 36 // Return a const pointer to the bytes owned by this object, or nullptr if the 37 // object contains no bytes. 38 const uint8_t *DataBufferHeap::GetBytesImpl() const { 39 return (m_data.empty() ? nullptr : m_data.data()); 40 } 41 42 // Return the number of bytes this object currently contains. 43 uint64_t DataBufferHeap::GetByteSize() const { return m_data.size(); } 44 45 // Sets the number of bytes that this object should be able to contain. This 46 // can be used prior to copying data into the buffer. 47 uint64_t DataBufferHeap::SetByteSize(uint64_t new_size) { 48 if (new_size < m_data.max_size()) 49 m_data.resize(new_size); 50 return m_data.size(); 51 } 52 53 void DataBufferHeap::CopyData(const void *src, uint64_t src_len) { 54 const uint8_t *src_u8 = static_cast<const uint8_t *>(src); 55 if (src && src_len > 0) 56 m_data.assign(src_u8, src_u8 + src_len); 57 else 58 m_data.clear(); 59 } 60 61 void DataBufferHeap::AppendData(const void *src, uint64_t src_len) { 62 m_data.insert(m_data.end(), static_cast<const uint8_t *>(src), 63 static_cast<const uint8_t *>(src) + src_len); 64 } 65 66 void DataBufferHeap::Clear() { 67 buffer_t empty; 68 m_data.swap(empty); 69 } 70 71 char DataBuffer::ID; 72 char WritableDataBuffer::ID; 73 char DataBufferUnowned::ID; 74 char DataBufferHeap::ID; 75