From b79a244d76c66287c6228e3845aa3af91a847f5d Mon Sep 17 00:00:00 2001 From: rtk0c Date: Sun, 15 Aug 2021 19:20:55 -0700 Subject: More work on IO adapters (not working) --- core/src/Utils/IO/DataStream.hpp | 175 ++++++++++++++++++++++++++++++++------- 1 file changed, 143 insertions(+), 32 deletions(-) (limited to 'core/src/Utils/IO/DataStream.hpp') diff --git a/core/src/Utils/IO/DataStream.hpp b/core/src/Utils/IO/DataStream.hpp index 6babf63..fb736cc 100644 --- a/core/src/Utils/IO/DataStream.hpp +++ b/core/src/Utils/IO/DataStream.hpp @@ -1,9 +1,124 @@ #pragma once +#include "Utils/UUID.hpp" +#include "cplt_fwd.hpp" + +#include +#include +#include + #include #include #include +namespace DataStreamIntegrations { +template +void ReadFromDataStream(DataStream& s, std::vector& vec); +template +void WriteToDataStream(DataStream& s, const std::vector& vec); + +void ReadFromDataStream(DataStream& s, std::string& str); +void WriteToDataStream(DataStream& s, const std::string& str); + +void WriteToDataStream(DataStream& s, const std::string_view& str); + +void ReadFromDataStream(DataStream& s, uuids::uuid& uuid); +void WriteToDataStream(DataStream& s, const uuids::uuid& uuid); + +template +void OperateIOAdapter(T&, int); +} // namespace DataStreamIntegrations + +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(T& 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(T& obj) const + { + Stream->ReadObject(obj); + } +}; + +namespace DataStreamTraits { + +template +concept HasMember = requires(T t) +{ + t.ReadFromDataStream(std::declval()); +}; + +template +concept HasIOAdapterMember = requires(T t) +{ + t.OperateIOAdapter(std::declval()); + t.OperateIOAdapter(std::declval()); +}; + +template +concept HasExtension = requires(T t) +{ + DataStreamIntegrations::ReadFromDataStream(std::declval(), t); +}; + +template +concept HasIOAdapterExtension = requires(T t) +{ + DataStreamIntegrations::OperateIOAdapter(std::declval(), t); + DataStreamIntegrations::OperateIOAdapter(std::declval(), t); +}; + +} // namespace DataStreamTraits + class DataStream { public: @@ -80,44 +195,40 @@ public: void Read(double& n); template - requires requires(TObject obj) - { - obj.ReadFromDataStream(std::declval()); - } void ReadObject(TObject& obj) { - obj.ReadFromDataStream(*this); - } - - template - requires requires(TObject obj) - { - // Let ADL happen - ReadFromDataStream(std::declval(), obj); - } - void ReadObject(TObject& obj) - { - ReadFromDataStream(*this, obj); - } - - template - requires requires(TObject obj) - { - obj.WriteToDataStream(std::declval()); - } - void WriteObject(TObject& obj) - { - obj.ReadFromDataStream(*this); + using namespace DataStreamTraits; + if constexpr (HasMember) { + obj.ReadFromDataStream(*this); + } else if constexpr (HasIOAdapterMember) { + DeserializationAdapter adapter{ this }; + obj.OperateIOAdapter(adapter); + } else if constexpr (HasExtension) { + DataStreamIntegrations::ReadFromDataStream(*this, obj); + } else if constexpr (HasIOAdapterExtension) { + DeserializationAdapter adapter{ this }; + DataStreamIntegrations::OperateIOAdapter(adapter, obj); + } else { + static_assert(false && sizeof(TObject), "This type does not have integration with DataStream."); + } } template - requires requires(TObject obj) - { - // Let ADL happen - WriteToDataStream(std::declval(), obj); - } void WriteObject(TObject& obj) { - WriteToDataStream(*this, obj); + using namespace DataStreamTraits; + if constexpr (HasMember) { + obj.WriteToDataStream(*this); + } else if constexpr (HasIOAdapterMember) { + SerializationAdapter adapter{ this }; + obj.OperateIOAdapter(adapter); + } else if constexpr (HasExtension) { + DataStreamIntegrations::WriteToDataStream(*this, obj); + } else if constexpr (HasIOAdapterExtension) { + SerializationAdapter adapter{ this }; + DataStreamIntegrations::OperateIOAdapter(adapter, obj); + } else { + static_assert(false && sizeof(TObject), "This type does not have integration with DataStream."); + } } }; -- cgit v1.2.3-70-g09d2