diff options
Diffstat (limited to 'core/src/Utils')
-rw-r--r-- | core/src/Utils/IO/Archive.cpp | 65 | ||||
-rw-r--r-- | core/src/Utils/IO/Archive.hpp | 22 | ||||
-rw-r--r-- | core/src/Utils/IO/DataStream.cpp | 2 | ||||
-rw-r--r-- | core/src/Utils/IO/DataStream.hpp | 1 | ||||
-rw-r--r-- | core/src/Utils/IO/fwd.hpp | 3 |
5 files changed, 90 insertions, 3 deletions
diff --git a/core/src/Utils/IO/Archive.cpp b/core/src/Utils/IO/Archive.cpp new file mode 100644 index 0000000..559c476 --- /dev/null +++ b/core/src/Utils/IO/Archive.cpp @@ -0,0 +1,65 @@ +#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::optional<DataArchive> DataArchive::SaveFile(const std::filesystem::path& path) +{ + auto archive = DataArchive(DataStream(std::fstream(path))); + auto& stream = archive.mStream; + + stream.WriteBytes(kMagicNumberCount, kMagicNumbers); + stream.Write(kByteOrderMark); + + stream.SetEndianness(std::endian::native); + + return archive; +} + +std::optional<DataArchive> DataArchive::LoadFile(const std::filesystem::path& path) +{ + auto archive = DataArchive(DataStream(std::fstream(path))); + auto& stream = archive.mStream; + + 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 archive; +} + +const DataStream& DataArchive::GetStream() const +{ + return mStream; +} + +DataStream& DataArchive::GetStream() +{ + return mStream; +} + +DataArchive::DataArchive(DataStream stream) + : mStream(std::move(stream)) +{ +} diff --git a/core/src/Utils/IO/Archive.hpp b/core/src/Utils/IO/Archive.hpp new file mode 100644 index 0000000..72f79c6 --- /dev/null +++ b/core/src/Utils/IO/Archive.hpp @@ -0,0 +1,22 @@ +#pragma once + +#include "Utils/IO/DataStream.hpp" + +#include <filesystem> +#include <optional> + +class DataArchive +{ +private: + DataStream mStream; + +public: + static std::optional<DataArchive> SaveFile(const std::filesystem::path& path); + static std::optional<DataArchive> LoadFile(const std::filesystem::path& path); + + const DataStream& GetStream()const; + DataStream& GetStream(); + +private: + DataArchive(DataStream stream); +}; diff --git a/core/src/Utils/IO/DataStream.cpp b/core/src/Utils/IO/DataStream.cpp index 95e0b09..4880901 100644 --- a/core/src/Utils/IO/DataStream.cpp +++ b/core/src/Utils/IO/DataStream.cpp @@ -14,8 +14,6 @@ DataStream::DataStream(std::fstream stream) { } -DataStream::~DataStream() = default; - std::endian DataStream::GetEndianness() const { return mEndian; diff --git a/core/src/Utils/IO/DataStream.hpp b/core/src/Utils/IO/DataStream.hpp index b965263..8dca00f 100644 --- a/core/src/Utils/IO/DataStream.hpp +++ b/core/src/Utils/IO/DataStream.hpp @@ -66,7 +66,6 @@ private: public: DataStream(std::fstream stream); - ~DataStream(); std::endian GetEndianness() const; void SetEndianness(std::endian endianness); diff --git a/core/src/Utils/IO/fwd.hpp b/core/src/Utils/IO/fwd.hpp index 848c78f..f249e34 100644 --- a/core/src/Utils/IO/fwd.hpp +++ b/core/src/Utils/IO/fwd.hpp @@ -1,5 +1,8 @@ #pragma once +// Archive.hpp +class DataArchive; + // DataStream.hpp class SerializationStreamProxy; class DeserializationStreamProxy; |