Files
Lioncache 28bb335317 General: Remove BasicTypes
Avoids dumping extremely common names into the global namespace.
2026-01-21 10:24:36 -05:00

101 lines
4.3 KiB
C++

#ifndef AXIO_CBASICBINARYWRITER_H
#define AXIO_CBASICBINARYWRITER_H
#include "Common/CFourCC.h"
#include "Common/FileIO/IOutputStream.h"
#include "Common/FileIO/CFileOutStream.h"
#include "Common/Serialization/IArchive.h"
// This is a basic binary reader that doesn't do any checks on parameter names.
// This is the fastest serializer, but it relies entirely on parameter order so
// changes to file structure will break old versions of the file. Use carefully!
class CBasicBinaryWriter : public IArchive
{
IOutputStream *mpStream = nullptr;
uint32_t mMagic = 0;
bool mOwnsStream = true;
public:
explicit CBasicBinaryWriter(const TString& rkFilename, uint32_t Magic, uint16_t FileVersion, EGame Game)
: mMagic(Magic)
{
mArchiveFlags = AF_Binary | AF_Writer | AF_NoSkipping;
mpStream = new CFileOutStream(rkFilename, std::endian::big);
if (mpStream->IsValid())
{
mpStream->WriteS32(0); // Magic is written after the rest of the file is successfully saved
SetVersion(skCurrentArchiveVersion, FileVersion, Game);
SerializeVersion();
}
}
explicit CBasicBinaryWriter(IOutputStream *pStream, uint16_t FileVersion, EGame Game)
: mOwnsStream(false)
{
ASSERT(pStream->IsValid());
mArchiveFlags = AF_Binary | AF_Writer | AF_NoSkipping;
mpStream = pStream;
SetVersion(skCurrentArchiveVersion, FileVersion, Game);
}
explicit CBasicBinaryWriter(IOutputStream *pStream, const CSerialVersion& rkVersion)
: mOwnsStream(false)
{
ASSERT(pStream->IsValid());
mArchiveFlags = AF_Binary | AF_Writer | AF_NoSkipping;
mpStream = pStream;
SetVersion(rkVersion);
}
~CBasicBinaryWriter() override
{
// Write magic and delete stream
if (mOwnsStream)
{
mpStream->GoTo(0);
mpStream->WriteU32(mMagic);
delete mpStream;
}
}
bool IsValid() const { return mpStream->IsValid(); }
// Interface
virtual bool IsReader() const { return false; }
virtual bool IsWriter() const { return true; }
virtual bool IsTextFormat() const { return false; }
bool ParamBegin(const char*, uint32_t) override { return true; }
void ParamEnd() override {}
bool PreSerializePointer(void*& Pointer, uint32_t Flags) override
{
bool ValidPtr = (Pointer != nullptr);
mpStream->WriteBool(ValidPtr);
return ValidPtr;
}
virtual void SerializeContainerSize(uint32_t& rSize, const TString&) { mpStream->WriteU32(rSize); }
void SerializePrimitive(bool& rValue, uint32_t Flags) override { mpStream->WriteBool(rValue); }
void SerializePrimitive(char& rValue, uint32_t Flags) override { mpStream->WriteS8(rValue); }
void SerializePrimitive(int8_t& rValue, uint32_t Flags) override { mpStream->WriteS8(rValue); }
void SerializePrimitive(uint8_t& rValue, uint32_t Flags) override { mpStream->WriteU8(rValue); }
void SerializePrimitive(int16_t& rValue, uint32_t Flags) override { mpStream->WriteS16(rValue); }
void SerializePrimitive(uint16_t& rValue, uint32_t Flags) override { mpStream->WriteU16(rValue); }
void SerializePrimitive(int32_t& rValue, uint32_t Flags) override { mpStream->WriteS32(rValue); }
void SerializePrimitive(uint32_t& rValue, uint32_t Flags) override { mpStream->WriteU32(rValue); }
void SerializePrimitive(int64_t& rValue, uint32_t Flags) override { mpStream->WriteS64(rValue); }
void SerializePrimitive(uint64_t& rValue, uint32_t Flags) override { mpStream->WriteU64(rValue); }
void SerializePrimitive(float& rValue, uint32_t Flags) override { mpStream->WriteF32(rValue); }
void SerializePrimitive(double& rValue, uint32_t Flags) override { mpStream->WriteF64(rValue); }
void SerializePrimitive(TString& rValue, uint32_t Flags) override { mpStream->WriteSizedString(rValue); }
void SerializePrimitive(CFourCC& rValue, uint32_t Flags) override { rValue.Write(*mpStream); }
void SerializePrimitive(CAssetID& rValue, uint32_t Flags) override { rValue.Write(*mpStream, CAssetID::GameIDLength(Game())); }
void SerializeBulkData(void* pData, uint32_t Size, uint32_t Flags) override { mpStream->WriteBytes(pData, Size); }
};
#endif // CBASICBINARYWRITER