aboutsummaryrefslogtreecommitdiff
path: root/core/src
diff options
context:
space:
mode:
Diffstat (limited to 'core/src')
-rw-r--r--core/src/Utils/IO/Archive.cpp65
-rw-r--r--core/src/Utils/IO/Archive.hpp22
-rw-r--r--core/src/Utils/IO/DataStream.cpp2
-rw-r--r--core/src/Utils/IO/DataStream.hpp1
-rw-r--r--core/src/Utils/IO/fwd.hpp3
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;