#pragma once #include "Utils/IO/DataStream.hpp" #include class SerializationAdapter { public: static constexpr bool IsSerializer() { return true; } public: DataStream* Stream; template void Bytes(size_t byteCount, T* buffer) const { Stream->WriteBytes(byteCount, buffer); } template void Value(T t) const { Stream->Write(t); } template void Object(TObject& obj) const { Stream->WriteObject(obj); } }; class DeserializationAdapter { public: static constexpr bool IsSerializer() { return false; } public: DataStream* Stream; template void Bytes(size_t byteCount, T* buffer) const { Stream->WriteBytes(byteCount, buffer); } template void Value(T& t) const { Stream->Read(t); } template void Object(TObject& obj) const { Stream->ReadObject(obj); } }; template requires requires(T t) { t.OperateIOAdapter(std::declval()); } void ReadFromDataStream(DataStream& stream, T& obj) { DeserializationAdapter adapter{ &stream }; obj.OperateIOAdapter(adapter); } template requires requires(T t) { t.OperateIOAdapter(std::declval()); } void WriteToDataStream(DataStream& stream, T& obj) { SerializationAdapter adapter{ &stream }; obj.OperateIOAdapter(adapter); }