Files
LibCommon/Source/Common/FileIO/IOutputStream.cpp
T

171 lines
3.4 KiB
C++
Raw Normal View History

#include "IOutputStream.h"
2020-06-18 15:59:53 -04:00
IOutputStream::~IOutputStream() = default;
void IOutputStream::WriteBool(bool Val)
{
2020-06-18 15:59:53 -04:00
const auto ChrVal = static_cast<char>(Val ? 1 : 0);
WriteBytes(&ChrVal, 1);
}
2018-12-09 02:38:38 -07:00
void IOutputStream::WriteByte(int8 Val)
{
WriteBytes(&Val, 1);
}
2020-06-18 15:59:53 -04:00
void IOutputStream::WriteUByte(uint8 Val)
{
WriteByte(static_cast<int8>(Val));
}
2018-12-09 02:38:38 -07:00
void IOutputStream::WriteShort(int16 Val)
{
2025-12-23 14:15:09 -05:00
if (mDataEndianness != std::endian::native)
Val = std::byteswap(Val);
2020-06-18 15:59:53 -04:00
WriteBytes(&Val, 2);
}
2020-06-18 15:59:53 -04:00
void IOutputStream::WriteUShort(uint16 Val)
{
WriteShort(static_cast<int16>(Val));
}
2018-12-09 02:38:38 -07:00
void IOutputStream::WriteLong(int32 Val)
{
2025-12-23 14:15:09 -05:00
if (mDataEndianness != std::endian::native)
Val = std::byteswap(Val);
2020-06-18 15:59:53 -04:00
WriteBytes(&Val, 4);
}
2020-06-18 15:59:53 -04:00
void IOutputStream::WriteULong(uint32 Val)
{
WriteLong(static_cast<int32>(Val));
}
2018-12-09 02:38:38 -07:00
void IOutputStream::WriteLongLong(int64 Val)
{
2025-12-23 14:15:09 -05:00
if (mDataEndianness != std::endian::native)
Val = std::byteswap(Val);
2020-06-18 15:59:53 -04:00
WriteBytes(&Val, 8);
}
2020-06-18 15:59:53 -04:00
void IOutputStream::WriteULongLong(uint64 Val)
{
WriteLongLong(static_cast<int64>(Val));
}
void IOutputStream::WriteFloat(float Val)
{
2025-12-23 14:15:09 -05:00
if (mDataEndianness != std::endian::native)
Val = std::bit_cast<float>(std::byteswap(std::bit_cast<uint32_t>(Val)));
2020-06-18 15:59:53 -04:00
WriteBytes(&Val, 4);
}
void IOutputStream::WriteDouble(double Val)
{
2025-12-23 14:15:09 -05:00
if (mDataEndianness != std::endian::native)
Val = std::bit_cast<double>(std::byteswap(std::bit_cast<uint64_t>(Val)));
2020-06-18 15:59:53 -04:00
WriteBytes(&Val, 8);
}
2018-12-09 02:38:38 -07:00
void IOutputStream::WriteFourCC(uint32 Val)
{
2025-12-23 14:15:09 -05:00
if constexpr (std::endian::native == std::endian::little)
Val = std::byteswap(Val);
2020-06-18 15:59:53 -04:00
WriteBytes(&Val, 4);
}
2020-06-18 15:59:53 -04:00
void IOutputStream::WriteString(const TString& rkVal, int Count, bool Terminate)
{
if (Count < 0)
Count = rkVal.Size();
WriteBytes(rkVal.Data(), Count);
2020-06-18 15:59:53 -04:00
if (Terminate && (rkVal.IsEmpty() || rkVal[Count - 1] != 0))
WriteByte(0);
}
void IOutputStream::WriteSizedString(const TString& rkVal)
{
WriteLong(rkVal.Size());
WriteBytes(rkVal.Data(), rkVal.Size());
}
2020-06-18 15:59:53 -04:00
void IOutputStream::Write16String(const T16String& rkVal, int Count, bool Terminate)
{
if (Count < 0)
Count = rkVal.Size();
for (int ChrIdx = 0; ChrIdx < Count; ChrIdx++)
WriteShort(rkVal[ChrIdx]);
2020-06-18 15:59:53 -04:00
if (Terminate && (rkVal.IsEmpty() || rkVal[Count - 1] != 0))
WriteShort(0);
}
void IOutputStream::WriteSized16String(const T16String& rkVal)
{
WriteLong(rkVal.Size());
2020-06-18 15:59:53 -04:00
for (size_t ChrIdx = 0; ChrIdx < rkVal.Size(); ChrIdx++)
WriteShort(rkVal[ChrIdx]);
}
2018-12-09 02:38:38 -07:00
bool IOutputStream::GoTo(uint32 Address)
{
return Seek(Address, SEEK_SET);
}
2018-12-09 02:38:38 -07:00
bool IOutputStream::Skip(int32 SkipAmount)
{
return Seek(SkipAmount, SEEK_CUR);
}
2018-12-09 02:38:38 -07:00
void IOutputStream::WriteToBoundary(uint32 Boundary, uint8 Fill)
{
2020-06-18 15:59:53 -04:00
const uint32 Num = Boundary - (Tell() % Boundary);
if (Num == Boundary)
return;
2018-12-09 02:38:38 -07:00
for (uint32 iByte = 0; iByte < Num; iByte++)
WriteByte(Fill);
}
2025-12-23 14:15:09 -05:00
void IOutputStream::SetEndianness(std::endian Endianness)
{
mDataEndianness = Endianness;
}
void IOutputStream::SetDestString(const TString& rkDest)
{
mDataDest = rkDest;
}
2025-12-23 14:15:09 -05:00
std::endian IOutputStream::GetEndianness() const
{
return mDataEndianness;
}
TString IOutputStream::GetDestString() const
{
return mDataDest;
}
2018-12-09 02:38:38 -07:00
bool IOutputStream::Seek64(int64 Offset, uint32 Origin)
{
2020-06-18 15:59:53 -04:00
return Seek(static_cast<int32>(Offset), Origin);
}
2018-12-09 02:38:38 -07:00
uint64 IOutputStream::Tell64() const
{
2020-06-18 15:59:53 -04:00
return static_cast<uint64>(Tell());
}