diff options
author | rtk0c <[email protected]> | 2021-08-21 19:12:02 -0700 |
---|---|---|
committer | rtk0c <[email protected]> | 2021-08-21 19:12:02 -0700 |
commit | f7abb9021e071abee27b0fba2c1ffe989be2003e (patch) | |
tree | ac66ce9cdb01decf0b735ab0fd54037c6882c8d6 /core/src/Utils | |
parent | 16539032ceec2746aa3778b1c5db9e4485d274d0 (diff) |
DataArchive system which saves in native endian (for better performance working with local files), but is also able to load in any endian depending on archive's header information
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; |