aboutsummaryrefslogtreecommitdiff
path: root/core/src/Utils/IO/Adapter.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'core/src/Utils/IO/Adapter.hpp')
-rw-r--r--core/src/Utils/IO/Adapter.hpp87
1 files changed, 87 insertions, 0 deletions
diff --git a/core/src/Utils/IO/Adapter.hpp b/core/src/Utils/IO/Adapter.hpp
new file mode 100644
index 0000000..e9e8fb2
--- /dev/null
+++ b/core/src/Utils/IO/Adapter.hpp
@@ -0,0 +1,87 @@
+#pragma once
+
+#include "Utils/IO/DataStream.hpp"
+
+#include <utility>
+
+class SerializationAdapter
+{
+public:
+ static constexpr bool IsSerializer()
+ {
+ return true;
+ }
+
+public:
+ DataStream* Stream;
+
+ template <class T>
+ void Bytes(size_t byteCount, T* buffer) const
+ {
+ Stream->WriteBytes(byteCount, buffer);
+ }
+
+ template <class T>
+ void Value(T t) const
+ {
+ Stream->Write(t);
+ }
+
+ template <class TObject>
+ void Object(TObject& obj) const
+ {
+ Stream->WriteObject(obj);
+ }
+};
+
+class DeserializationAdapter
+{
+public:
+ static constexpr bool IsSerializer()
+ {
+ return false;
+ }
+
+public:
+ DataStream* Stream;
+
+ template <class T>
+ void Bytes(size_t byteCount, T* buffer) const
+ {
+ Stream->WriteBytes(byteCount, buffer);
+ }
+
+ template <class T>
+ void Value(T& t) const
+ {
+ Stream->Read(t);
+ }
+
+ template <class TObject>
+ void Object(TObject& obj) const
+ {
+ Stream->ReadObject(obj);
+ }
+};
+
+template <class T>
+requires requires(T t)
+{
+ t.OperateIOAdapter(std::declval<DeserializationAdapter>());
+}
+void ReadFromDataStream(DataStream& stream, T& obj)
+{
+ DeserializationAdapter adapter{ &stream };
+ obj.OperateIOAdapter(adapter);
+}
+
+template <class T>
+requires requires(T t)
+{
+ t.OperateIOAdapter(std::declval<SerializationAdapter>());
+}
+void WriteToDataStream(DataStream& stream, T& obj)
+{
+ SerializationAdapter adapter{ &stream };
+ obj.OperateIOAdapter(adapter);
+}