2023-03-10 23:27:08 +00:00
|
|
|
#include <luna/Buffer.h>
|
2023-03-23 20:20:57 +00:00
|
|
|
#include <luna/CString.h>
|
2023-03-10 23:27:08 +00:00
|
|
|
#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 {};
|
|
|
|
}
|
|
|
|
|
2023-03-10 23:52:39 +00:00
|
|
|
Result<u8*> Buffer::slice_at_end(usize size)
|
2023-03-10 23:27:08 +00:00
|
|
|
{
|
|
|
|
usize old_size = m_size;
|
|
|
|
TRY(try_resize(m_size + size));
|
|
|
|
return m_data + old_size;
|
|
|
|
}
|
2023-03-10 23:52:39 +00:00
|
|
|
|
|
|
|
Result<u8*> Buffer::slice(usize offset, usize size)
|
|
|
|
{
|
|
|
|
if (offset + size > m_size) { TRY(try_resize(offset + size)); }
|
|
|
|
return m_data + offset;
|
|
|
|
}
|
2023-03-23 20:20:57 +00:00
|
|
|
|
2023-04-07 09:52:20 +00:00
|
|
|
Result<void> Buffer::append_data(const u8* data, usize size)
|
2023-03-23 20:20:57 +00:00
|
|
|
{
|
|
|
|
memcpy(TRY(slice_at_end(size)), data, size);
|
|
|
|
|
|
|
|
return {};
|
|
|
|
}
|