Luna/libluna/src/Buffer.cpp

55 lines
1.0 KiB
C++

#include <luna/Buffer.h>
#include <luna/CString.h>
#include <luna/Heap.h>
Buffer::Buffer()
{
}
Buffer::Buffer(u8* data, usize size) : m_data(data), m_size(size)
{
}
Buffer::Buffer(Buffer&& other) : m_data(other.data()), m_size(other.size())
{
other.m_data = nullptr;
}
Buffer::~Buffer()
{
if (m_data) free_impl(m_data);
}
Result<Buffer> Buffer::create_sized(usize size)
{
u8* data = (u8*)TRY(malloc_impl(size));
return Buffer { data, size };
}
Result<void> Buffer::try_resize(usize new_size)
{
m_data = (u8*)TRY(realloc_impl(m_data, new_size));
m_size = new_size;
return {};
}
Result<u8*> Buffer::slice_at_end(usize size)
{
usize old_size = m_size;
TRY(try_resize(m_size + size));
return m_data + old_size;
}
Result<u8*> Buffer::slice(usize offset, usize size)
{
if (offset + size > m_size) { TRY(try_resize(offset + size)); }
return m_data + offset;
}
Result<void> Buffer::append_data(const u8* data, usize size)
{
memcpy(TRY(slice_at_end(size)), data, size);
return {};
}