Files
LibCommon/Source/Common/Serialization/CBasicBinaryReader.h
T
Lioncache 7f20a5ef97 General: Add AXIO_ prefix to header guards
Makes any future potential of a class unlikely.
2026-01-16 22:45:09 -05:00

91 lines
4.1 KiB
C++

#ifndef AXIO_CBASICBINARYREADER_H
#define AXIO_CBASICBINARYREADER_H
#include "Common/CFourCC.h"
#include "Common/FileIO/CFileInStream.h"
#include "Common/FileIO/CMemoryInStream.h"
#include "Common/FileIO/IInputStream.h"
#include "Common/Serialization/IArchive.h"
#include "Common/Serialization/CSerialVersion.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 CBasicBinaryReader : public IArchive
{
IInputStream *mpStream = nullptr;
bool mMagicValid = false;
bool mOwnsStream = true;
public:
explicit CBasicBinaryReader(const TString& rkFilename, uint32_t Magic)
{
mArchiveFlags = AF_Binary | AF_Reader | AF_NoSkipping;
mpStream = new CFileInStream(rkFilename, std::endian::big);
if (mpStream->IsValid())
{
mMagicValid = (mpStream->ReadU32() == Magic);
SerializeVersion();
}
}
explicit CBasicBinaryReader(IInputStream *pStream, const CSerialVersion& rkVersion)
: mMagicValid(true)
, mOwnsStream(false)
{
mArchiveFlags = AF_Binary | AF_Reader | AF_NoSkipping;
ASSERT(pStream->IsValid());
mpStream = pStream;
SetVersion(rkVersion);
}
explicit CBasicBinaryReader(void *pData, uint32_t DataSize, const CSerialVersion& rkVersion, std::endian Endian = std::endian::native)
: mMagicValid(true)
{
mArchiveFlags = AF_Binary | AF_Reader | AF_NoSkipping;
mpStream = new CMemoryInStream(pData, DataSize, Endian);
SetVersion(rkVersion);
}
~CBasicBinaryReader() override
{
if (mOwnsStream)
delete mpStream;
}
bool IsValid() const { return mpStream->IsValid(); }
// Interface
virtual bool IsReader() const { return true; }
virtual bool IsWriter() const { return false; }
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 { return ArchiveVersion() >= eArVer_Refactor ? mpStream->ReadBool() : true; }
virtual void SerializeContainerSize(uint32_t& rSize, const TString&, uint32_t Flags) { SerializePrimitive(rSize, Flags); }
void SerializeBulkData(void* pData, uint32_t Size, uint32_t Flags) override { mpStream->ReadBytes(pData, Size); }
void SerializePrimitive(bool& rValue, uint32_t Flags) override { rValue = mpStream->ReadBool(); }
void SerializePrimitive(char& rValue, uint32_t Flags) override { rValue = mpStream->ReadS8(); }
void SerializePrimitive(int8_t& rValue, uint32_t Flags) override { rValue = mpStream->ReadS8(); }
void SerializePrimitive(uint8_t& rValue, uint32_t Flags) override { rValue = mpStream->ReadU8(); }
void SerializePrimitive(int16_t& rValue, uint32_t Flags) override { rValue = mpStream->ReadS16(); }
void SerializePrimitive(uint16_t& rValue, uint32_t Flags) override { rValue = mpStream->ReadU16(); }
void SerializePrimitive(int32_t& rValue, uint32_t Flags) override { rValue = mpStream->ReadS32(); }
void SerializePrimitive(uint32_t& rValue, uint32_t Flags) override { rValue = mpStream->ReadU32(); }
void SerializePrimitive(int64_t& rValue, uint32_t Flags) override { rValue = mpStream->ReadS64(); }
void SerializePrimitive(uint64_t& rValue, uint32_t Flags) override { rValue = mpStream->ReadU64(); }
void SerializePrimitive(float& rValue, uint32_t Flags) override { rValue = mpStream->ReadF32(); }
void SerializePrimitive(double& rValue, uint32_t Flags) override { rValue = mpStream->ReadF64(); }
void SerializePrimitive(TString& rValue, uint32_t Flags) override { rValue = mpStream->ReadSizedString(); }
void SerializePrimitive(CFourCC& rValue, uint32_t Flags) override { rValue = CFourCC(*mpStream); }
void SerializePrimitive(CAssetID& rValue, uint32_t Flags) override { rValue = CAssetID(*mpStream, mGame); }
};
#endif // AXIO_CBASICBINARYREADER_H