diff options
author | rtk0c <[email protected]> | 2021-08-15 21:12:35 -0700 |
---|---|---|
committer | rtk0c <[email protected]> | 2021-08-15 21:12:35 -0700 |
commit | 87b964591c9a93146bd43e8813387392f8520337 (patch) | |
tree | 6e9db197c7fcd584acbcd6655854a3a8612382b9 /core/src/Utils/IO/DataStream.hpp | |
parent | b79a244d76c66287c6228e3845aa3af91a847f5d (diff) |
Turn IO adapter's mechanism from function overload into structs that are given by the user
Diffstat (limited to 'core/src/Utils/IO/DataStream.hpp')
-rw-r--r-- | core/src/Utils/IO/DataStream.hpp | 79 |
1 files changed, 29 insertions, 50 deletions
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 <string> -#include <string_view> -#include <vector> - #include <cstddef> #include <cstdint> #include <span> -namespace DataStreamIntegrations { -template <class TElement> -void ReadFromDataStream(DataStream& s, std::vector<TElement>& vec); -template <class TElement> -void WriteToDataStream(DataStream& s, const std::vector<TElement>& 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 <class T> -void OperateIOAdapter(T&, int); -} // namespace DataStreamIntegrations - class SerializationAdapter { public: @@ -57,6 +34,12 @@ public: { Stream->WriteObject(obj); } + + template <class TObject, class TAdapter> + void ObjectAdapted(TObject& obj, TAdapter adapter) const + { + Stream->WriteObjectAdapted(obj, adapter); + } }; class DeserializationAdapter @@ -87,6 +70,12 @@ public: { Stream->ReadObject(obj); } + + template <class TObject, class TAdapter> + void ObjectAdapted(TObject& obj, TAdapter& adapter) const + { + Stream->ReadObjectAdapted(obj, adapter); + } }; namespace DataStreamTraits { @@ -95,6 +84,7 @@ template <class T> concept HasMember = requires(T t) { t.ReadFromDataStream(std::declval<DataStream>()); + t.WriteToDataStream(std::declval<DataStream>()); }; template <class T> @@ -104,19 +94,6 @@ concept HasIOAdapterMember = requires(T t) t.OperateIOAdapter(std::declval<DeserializationAdapter>()); }; -template <class T> -concept HasExtension = requires(T t) -{ - DataStreamIntegrations::ReadFromDataStream(std::declval<DataStream>(), t); -}; - -template <class T> -concept HasIOAdapterExtension = requires(T t) -{ - DataStreamIntegrations::OperateIOAdapter(std::declval<SerializationAdapter>(), t); - DataStreamIntegrations::OperateIOAdapter(std::declval<DeserializationAdapter>(), t); -}; - } // namespace DataStreamTraits class DataStream @@ -198,37 +175,39 @@ public: void ReadObject(TObject& obj) { using namespace DataStreamTraits; - if constexpr (HasMember<TObject>) { + if constexpr (requires(TObject t) { t.ReadFromDataStream(std::declval<DataStream>()); }) { obj.ReadFromDataStream(*this); - } else if constexpr (HasIOAdapterMember<TObject>) { + } else if constexpr (requires(TObject t) { t.OperateIOAdapter(std::declval<DeserializationAdapter>()); }) { DeserializationAdapter adapter{ this }; obj.OperateIOAdapter(adapter); - } else if constexpr (HasExtension<TObject>) { - DataStreamIntegrations::ReadFromDataStream(*this, obj); - } else if constexpr (HasIOAdapterExtension<TObject>) { - DeserializationAdapter adapter{ this }; - DataStreamIntegrations::OperateIOAdapter(adapter, obj); } else { static_assert(false && sizeof(TObject), "This type does not have integration with DataStream."); } } + template <class TObject, class TAdapter> + void ReadObjectAdapted(TObject& obj, TAdapter& adapter) + { + adapter.ReadFromDataStream(*this, obj); + } + template <class TObject> void WriteObject(TObject& obj) { using namespace DataStreamTraits; - if constexpr (HasMember<TObject>) { + if constexpr (requires(TObject t) { t.WriteToDataStream(std::declval<DataStream>()); }) { obj.WriteToDataStream(*this); - } else if constexpr (HasIOAdapterMember<TObject>) { + } else if constexpr (requires(TObject t) { t.OperateIOAdapter(std::declval<SerializationAdapter>()); }) { SerializationAdapter adapter{ this }; obj.OperateIOAdapter(adapter); - } else if constexpr (HasExtension<TObject>) { - DataStreamIntegrations::WriteToDataStream(*this, obj); - } else if constexpr (HasIOAdapterExtension<TObject>) { - SerializationAdapter adapter{ this }; - DataStreamIntegrations::OperateIOAdapter(adapter, obj); } else { static_assert(false && sizeof(TObject), "This type does not have integration with DataStream."); } } + + template <class TObject, class TAdapter> + void WriteObjectAdapted(TObject& obj, TAdapter& adapter) + { + adapter.WriteToDataStream(*this, obj); + } }; |