mirror of
https://github.com/Laupetin/OpenAssetTools.git
synced 2025-07-05 02:31:55 +00:00
ZoneWriting stuff
This commit is contained in:
@ -64,7 +64,7 @@ void InMemoryZoneOutputStream::Align(const int align)
|
||||
{
|
||||
assert(!m_block_stack.empty());
|
||||
|
||||
if (align > 0)
|
||||
if (align > 1)
|
||||
{
|
||||
auto* block = m_block_stack.top();
|
||||
|
||||
@ -75,14 +75,14 @@ void InMemoryZoneOutputStream::Align(const int align)
|
||||
}
|
||||
}
|
||||
|
||||
void* InMemoryZoneOutputStream::WriteDataRaw(void* src, const size_t size)
|
||||
void* InMemoryZoneOutputStream::WriteDataRaw(const void* src, const size_t size)
|
||||
{
|
||||
auto* result = m_zone_data->GetBufferOfSize(size);
|
||||
memcpy(result, src, size);
|
||||
return result;
|
||||
}
|
||||
|
||||
void* InMemoryZoneOutputStream::WriteDataInBlock(void* src, const size_t size)
|
||||
void* InMemoryZoneOutputStream::WriteDataInBlock(const void* src, const size_t size)
|
||||
{
|
||||
assert(!m_block_stack.empty());
|
||||
|
||||
@ -130,9 +130,9 @@ void InMemoryZoneOutputStream::IncBlockPos(const size_t size)
|
||||
}
|
||||
}
|
||||
|
||||
void InMemoryZoneOutputStream::WriteNullTerminated(void* src)
|
||||
void InMemoryZoneOutputStream::WriteNullTerminated(const void* src)
|
||||
{
|
||||
const auto len = strlen(static_cast<char*>(src));
|
||||
const auto len = strlen(static_cast<const char*>(src));
|
||||
WriteDataInBlock(src, len + 1);
|
||||
}
|
||||
|
||||
@ -161,9 +161,20 @@ uintptr_t InMemoryZoneOutputStream::InsertPointer()
|
||||
return result;
|
||||
}
|
||||
|
||||
void InMemoryZoneOutputStream::MarkFollowing(void** pPtr)
|
||||
{
|
||||
assert(!m_block_stack.empty());
|
||||
assert(pPtr != nullptr);
|
||||
*pPtr = m_block_stack.top()->m_type == XBlock::Type::BLOCK_TYPE_TEMP ? PTR_INSERT : PTR_FOLLOWING;
|
||||
}
|
||||
|
||||
bool InMemoryZoneOutputStream::ReusableShouldWrite(void** pPtr, const size_t entrySize, const size_t entryCount, std::type_index type)
|
||||
{
|
||||
assert(!m_block_stack.empty());
|
||||
assert(pPtr != nullptr);
|
||||
|
||||
if (*pPtr == nullptr)
|
||||
return false;
|
||||
|
||||
const auto inTemp = m_block_stack.top()->m_type == XBlock::Type::BLOCK_TYPE_TEMP;
|
||||
const auto foundEntriesForType = m_reusable_entries.find(type);
|
||||
@ -173,8 +184,7 @@ bool InMemoryZoneOutputStream::ReusableShouldWrite(void** pPtr, const size_t ent
|
||||
auto zoneOffset = inTemp ? InsertPointer() : GetCurrentZonePointer();
|
||||
entries.emplace_back(*pPtr, entrySize, entryCount, zoneOffset);
|
||||
m_reusable_entries.emplace(std::make_pair(type, std::move(entries)));
|
||||
|
||||
*pPtr = inTemp ? PTR_INSERT : PTR_FOLLOWING;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -190,7 +200,6 @@ bool InMemoryZoneOutputStream::ReusableShouldWrite(void** pPtr, const size_t ent
|
||||
|
||||
auto zoneOffset = inTemp ? InsertPointer() : GetCurrentZonePointer();
|
||||
foundEntriesForType->second.emplace_back(*pPtr, entrySize, entryCount, zoneOffset);
|
||||
|
||||
*pPtr = inTemp ? PTR_INSERT : PTR_FOLLOWING;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
@ -9,9 +9,6 @@
|
||||
|
||||
class InMemoryZoneOutputStream final : public IZoneOutputStream
|
||||
{
|
||||
static constexpr void* PTR_FOLLOWING = reinterpret_cast<void*>(-1);
|
||||
static constexpr void* PTR_INSERT = reinterpret_cast<void*>(-2);
|
||||
|
||||
class ReusableEntry
|
||||
{
|
||||
public:
|
||||
@ -44,9 +41,10 @@ public:
|
||||
void PushBlock(block_t block) override;
|
||||
block_t PopBlock() override;
|
||||
void Align(int align) override;
|
||||
void* WriteDataRaw(void* src, size_t size) override;
|
||||
void* WriteDataInBlock(void* src, size_t size) override;
|
||||
void* WriteDataRaw(const void* src, size_t size) override;
|
||||
void* WriteDataInBlock(const void* src, size_t size) override;
|
||||
void IncBlockPos(size_t size) override;
|
||||
void WriteNullTerminated(void* src) override;
|
||||
void WriteNullTerminated(const void* src) override;
|
||||
void MarkFollowing(void** pPtr) override;
|
||||
bool ReusableShouldWrite(void** pPtr, size_t entrySize, size_t entryCount, std::type_index type) override;
|
||||
};
|
||||
|
Reference in New Issue
Block a user