//===-- DataBufferHeap.cpp ------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//

#include "lldb/Utility/DataBufferHeap.h"


using namespace lldb_private;

// Default constructor
DataBufferHeap::DataBufferHeap() : m_data() {}

// Initialize this class with "n" characters and fill the buffer with "ch".
DataBufferHeap::DataBufferHeap(lldb::offset_t n, uint8_t ch) : m_data() {
  if (n < m_data.max_size())
    m_data.assign(n, ch);
}

// Initialize this class with a copy of the "n" bytes from the "bytes" buffer.
DataBufferHeap::DataBufferHeap(const void *src, lldb::offset_t src_len)
    : m_data() {
  CopyData(src, src_len);
}

// Virtual destructor since this class inherits from a pure virtual base class.
DataBufferHeap::~DataBufferHeap() = default;

// Return a pointer to the bytes owned by this object, or nullptr if the object
// contains no bytes.
uint8_t *DataBufferHeap::GetBytes() {
  return (m_data.empty() ? nullptr : m_data.data());
}

// Return a const pointer to the bytes owned by this object, or nullptr if the
// object contains no bytes.
const uint8_t *DataBufferHeap::GetBytes() const {
  return (m_data.empty() ? nullptr : m_data.data());
}

// Return the number of bytes this object currently contains.
uint64_t DataBufferHeap::GetByteSize() const { return m_data.size(); }

// Sets the number of bytes that this object should be able to contain. This
// can be used prior to copying data into the buffer.
uint64_t DataBufferHeap::SetByteSize(uint64_t new_size) {
  m_data.resize(new_size);
  return m_data.size();
}

void DataBufferHeap::CopyData(const void *src, uint64_t src_len) {
  const uint8_t *src_u8 = static_cast<const uint8_t *>(src);
  if (src && src_len > 0)
    m_data.assign(src_u8, src_u8 + src_len);
  else
    m_data.clear();
}

void DataBufferHeap::AppendData(const void *src, uint64_t src_len) {
  m_data.insert(m_data.end(), static_cast<const uint8_t *>(src),
                static_cast<const uint8_t *>(src) + src_len);
}

void DataBufferHeap::Clear() {
  buffer_t empty;
  m_data.swap(empty);
}
