summaryrefslogtreecommitdiff
path: root/core/src/Utils
diff options
context:
space:
mode:
authorrtk0c <[email protected]>2021-08-21 19:12:02 -0700
committerrtk0c <[email protected]>2021-08-21 19:12:02 -0700
commitf7abb9021e071abee27b0fba2c1ffe989be2003e (patch)
treeac66ce9cdb01decf0b735ab0fd54037c6882c8d6 /core/src/Utils
parent16539032ceec2746aa3778b1c5db9e4485d274d0 (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.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;