From 87b964591c9a93146bd43e8813387392f8520337 Mon Sep 17 00:00:00 2001 From: rtk0c Date: Sun, 15 Aug 2021 21:12:35 -0700 Subject: Turn IO adapter's mechanism from function overload into structs that are given by the user --- core/src/Utils/IO/DataStream.hpp | 79 +++++++++++++++------------------------- 1 file changed, 29 insertions(+), 50 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 fb736cc..fb55f42 100644 --- a/core/src/Utils/IO/DataStream.hpp +++ b/core/src/Utils/IO/DataStream.hpp @@ -1,34 +1,11 @@ #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: @@ -57,6 +34,12 @@ public: { Stream->WriteObject(obj); } + + template + void ObjectAdapted(TObject& obj, TAdapter adapter) const + { + Stream->WriteObjectAdapted(obj, adapter); + } }; class DeserializationAdapter @@ -87,6 +70,12 @@ public: { Stream->ReadObject(obj); } + + template + void ObjectAdapted(TObject& obj, TAdapter& adapter) const + { + Stream->ReadObjectAdapted(obj, adapter); + } }; namespace DataStreamTraits { @@ -95,6 +84,7 @@ template concept HasMember = requires(T t) { t.ReadFromDataStream(std::declval()); + t.WriteToDataStream(std::declval()); }; template @@ -104,19 +94,6 @@ concept HasIOAdapterMember = requires(T t) 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 @@ -198,37 +175,39 @@ public: void ReadObject(TObject& obj) { using namespace DataStreamTraits; - if constexpr (HasMember) { + if constexpr (requires(TObject t) { t.ReadFromDataStream(std::declval()); }) { obj.ReadFromDataStream(*this); - } else if constexpr (HasIOAdapterMember) { + } else if constexpr (requires(TObject t) { t.OperateIOAdapter(std::declval()); }) { 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 + void ReadObjectAdapted(TObject& obj, TAdapter& adapter) + { + adapter.ReadFromDataStream(*this, obj); + } + template void WriteObject(TObject& obj) { using namespace DataStreamTraits; - if constexpr (HasMember) { + if constexpr (requires(TObject t) { t.WriteToDataStream(std::declval()); }) { obj.WriteToDataStream(*this); - } else if constexpr (HasIOAdapterMember) { + } else if constexpr (requires(TObject t) { t.OperateIOAdapter(std::declval()); }) { 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."); } } + + template + void WriteObjectAdapted(TObject& obj, TAdapter& adapter) + { + adapter.WriteToDataStream(*this, obj); + } }; -- cgit v1.2.3-70-g09d2