diff options
Diffstat (limited to 'core/src/Utils/IO/Adapter.hpp')
-rw-r--r-- | core/src/Utils/IO/Adapter.hpp | 87 |
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); +} |