//===-- DataBufferHeap.cpp --------------------------------------*- C++ -*-===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//

#include "lldb/Core/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 (size_t n, uint8_t ch) :
    m_data(n, ch)
{
}

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

//----------------------------------------------------------------------
// Virtual destructor since this class inherits from a pure virtual
// base class.
//----------------------------------------------------------------------
DataBufferHeap::~DataBufferHeap ()
{
}

//----------------------------------------------------------------------
// Return a pointer to the bytes owned by this object, or NULL if
// the object contains no bytes.
//----------------------------------------------------------------------
uint8_t *
DataBufferHeap::GetBytes ()
{
    if (m_data.empty())
        return NULL;
    return &m_data[0];
}

//----------------------------------------------------------------------
// Return a const pointer to the bytes owned by this object, or NULL
// if the object contains no bytes.
//----------------------------------------------------------------------
const uint8_t *
DataBufferHeap::GetBytes () const
{
    if (m_data.empty())
        return NULL;
    return &m_data[0];
}

//----------------------------------------------------------------------
// Return the number of bytes this object currently contains.
//----------------------------------------------------------------------
size_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.
//----------------------------------------------------------------------
size_t
DataBufferHeap::SetByteSize (size_t new_size)
{
    m_data.resize(new_size);
    return m_data.size();
}

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



