ZoneCodeGenerator: Change ContentLoader to use vars for fastfile pointer transfer and change ZoneInputStream API to be able to specify load location to better reflect the way the games do it.

This commit is contained in:
Jan
2019-11-14 14:48:40 +01:00
parent 3839b22f71
commit b7ab2a1aa6
9 changed files with 170 additions and 108 deletions

View File

@ -14,25 +14,19 @@ public:
return static_cast<T*>(Alloc(align));
}
template<typename T>
T* Alloc()
{
return static_cast<T*>(Alloc(alignof(T)));
}
virtual void LoadData(size_t size) = 0;
virtual void LoadNullTerminated() = 0;
virtual void LoadData(void* dst, size_t size) = 0;
virtual void LoadNullTerminated(void* dst) = 0;
template<typename T>
void Load()
void Load(T* dst)
{
LoadData(sizeof(T));
LoadData(dst, sizeof(T));
}
template<typename T>
void Load(const uint32_t count)
void Load(T* dst, const uint32_t count)
{
LoadData(count * sizeof(T));
LoadData(const_cast<void*>(reinterpret_cast<const void*>(dst)), count * sizeof(T));
}
virtual void** InsertPointer() = 0;

View File

@ -4,6 +4,7 @@
#include "Loading/Exception/InvalidOffsetBlockOffsetException.h"
#include <cassert>
#include "Loading/Exception/OutOfBlockBoundsException.h"
XBlockInputStream::XBlockInputStream(std::vector<XBlock*>& blocks, ILoadingStream* stream, const int blockBitCount, const block_t insertBlock) : m_blocks(blocks)
{
@ -93,7 +94,7 @@ void* XBlockInputStream::Alloc(const int align)
return &block->m_buffer[m_block_offsets[block->m_index]];
}
void XBlockInputStream::LoadData(const size_t size)
void XBlockInputStream::LoadData(void* dst, const size_t size)
{
assert(!m_block_stack.empty());
@ -102,17 +103,25 @@ void XBlockInputStream::LoadData(const size_t size)
XBlock* block = m_block_stack.top();
if(m_block_offsets[block->m_index] + size >= block->m_buffer_size)
if(block->m_buffer > dst || block->m_buffer + block->m_buffer_size < dst)
{
throw OutOfBlockBoundsException(block);
}
if(reinterpret_cast<uint8_t*>(dst) + size >= block->m_buffer + block->m_buffer_size)
{
throw BlockOverflowException(block);
}
m_stream->Load(&block->m_buffer[m_block_offsets[block->m_index]], size);
// Theoretically ptr should always be at the current block offset.
assert(dst == &block->m_buffer[m_block_offsets[block->m_index]]);
m_stream->Load(dst, size);
m_block_offsets[block->m_index] += size;
}
void XBlockInputStream::LoadNullTerminated()
void XBlockInputStream::LoadNullTerminated(void* dst)
{
assert(!m_block_stack.empty());
@ -121,8 +130,16 @@ void XBlockInputStream::LoadNullTerminated()
XBlock* block = m_block_stack.top();
if (block->m_buffer > dst || block->m_buffer + block->m_buffer_size < dst)
{
throw OutOfBlockBoundsException(block);
}
// Theoretically ptr should always be at the current block offset.
assert(dst == &block->m_buffer[m_block_offsets[block->m_index]]);
uint8_t byte;
size_t offset = m_block_offsets[block->m_index];
size_t offset = reinterpret_cast<uint8_t*>(dst) - block->m_buffer;
do
{
m_stream->Load(&byte, 1);

View File

@ -30,11 +30,12 @@ public:
void* Alloc(int align) override;
void LoadData(size_t size) override;
void LoadNullTerminated() override;
void LoadData(void* dst, size_t size) override;
void LoadNullTerminated(void* dst) override;
void** InsertPointer() override;
void* ConvertOffsetToPointer(const void* offset) override;
void* ConvertOffsetToAlias(const void* offset) override;
};