#include "Archive.hpp" constexpr uint8_t kMagicNumbers[] = { 0x98, 0xd8, 0xa4, 0x65, 0x18, 0xa2, 0xd6, 0xa0 }; constexpr size_t kMagicNumberCount = std::size(kMagicNumbers); constexpr uint8_t kByteOrderMark = []() { switch (std::endian::native) { case std::endian::little: return 0; case std::endian::big: return 1; } }(); std::span DataArchive::GetMagicNumbers() { return std::span{ kMagicNumbers }; } std::optional DataArchive::LoadFile(const std::filesystem::path& path) { InputFileStream fileStream(path); fileStream.SetReadInSize(1024); InputDataStream stream(std::move(fileStream)); uint8_t magicNumbers[kMagicNumberCount]; stream.ReadBytes(kMagicNumberCount, magicNumbers); for (size_t i = 0; i < kMagicNumberCount; ++i) { if (magicNumbers[i] != kMagicNumbers[i]) { return {}; } } uint8_t byteOrderMark; stream.Read(byteOrderMark); switch (byteOrderMark) { case 0: stream.SetEndianness(std::endian::little); break; case 1: stream.SetEndianness(std::endian::big); break; default: std::abort(); } return stream; } std::optional DataArchive::SaveFile(const std::filesystem::path& path) { OutputFileStream fileStream(path, OutputFileStream::TruncateFile); fileStream.SetMaxBufferSize(1024); OutputDataStream stream(std::move(fileStream)); stream.WriteBytes(kMagicNumberCount, kMagicNumbers); stream.Write(kByteOrderMark); stream.SetEndianness(std::endian::native); return stream; }