aboutsummaryrefslogtreecommitdiff
path: root/core/src/Utils/IO/DataStream.hpp
diff options
context:
space:
mode:
authorrtk0c <[email protected]>2021-08-15 21:12:35 -0700
committerrtk0c <[email protected]>2021-08-15 21:12:35 -0700
commit87b964591c9a93146bd43e8813387392f8520337 (patch)
tree6e9db197c7fcd584acbcd6655854a3a8612382b9 /core/src/Utils/IO/DataStream.hpp
parentb79a244d76c66287c6228e3845aa3af91a847f5d (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.hpp79
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);
+ }
};