aboutsummaryrefslogtreecommitdiff
path: root/core/src/Utils/IO
diff options
context:
space:
mode:
Diffstat (limited to 'core/src/Utils/IO')
-rw-r--r--core/src/Utils/IO/DataStream.hpp79
-rw-r--r--core/src/Utils/IO/StringIntegration.hpp42
-rw-r--r--core/src/Utils/IO/UuidIntegration.hpp30
-rw-r--r--core/src/Utils/IO/VectorIntegration.hpp39
4 files changed, 91 insertions, 99 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);
+ }
};
diff --git a/core/src/Utils/IO/StringIntegration.hpp b/core/src/Utils/IO/StringIntegration.hpp
index 35b1660..a90ea98 100644
--- a/core/src/Utils/IO/StringIntegration.hpp
+++ b/core/src/Utils/IO/StringIntegration.hpp
@@ -4,26 +4,32 @@
#include <string>
#include <string_view>
-namespace DataStreamIntegrations {
-void ReadFromDataStream(DataStream& s, std::string& str)
+namespace DataStreamAdapters {
+struct String
{
- uint64_t size;
- s.Read(size);
+ void ReadFromDataStream(DataStream& s, std::string& str)
+ {
+ uint64_t size;
+ s.Read(size);
- str = {};
- str.reserve(size);
- s.ReadBytes(size, std::back_inserter(str));
-}
+ str = {};
+ str.reserve(size);
+ s.ReadBytes(size, std::back_inserter(str));
+ }
-void WriteToDataStream(DataStream& s, const std::string& str)
-{
- s.Write((uint64_t)str.size());
- s.WriteBytes(str.size(), str.data());
-}
+ void WriteToDataStream(DataStream& s, const std::string& str)
+ {
+ s.Write((uint64_t)str.size());
+ s.WriteBytes(str.size(), str.data());
+ }
+};
-void WriteToDataStream(DataStream& s, const std::string_view& str)
+struct StringView
{
- s.Write((uint64_t)str.size());
- s.WriteBytes(str.size(), str.data());
-}
-} // namespace DataStreamIntegrations
+ void WriteToDataStream(DataStream& s, const std::string_view& str)
+ {
+ s.Write((uint64_t)str.size());
+ s.WriteBytes(str.size(), str.data());
+ }
+};
+} // namespace DataStreamAdapters
diff --git a/core/src/Utils/IO/UuidIntegration.hpp b/core/src/Utils/IO/UuidIntegration.hpp
index 9cba4b1..b6ca062 100644
--- a/core/src/Utils/IO/UuidIntegration.hpp
+++ b/core/src/Utils/IO/UuidIntegration.hpp
@@ -1,22 +1,26 @@
#pragma once
-#include <uuid/uuid.h>
+#include "Utils/UUID.hpp"
+
#include <cstddef>
#include <cstdint>
#include <iterator>
-namespace DataStreamIntegrations {
-void ReadFromDataStream(DataStream& s, uuids::uuid& uuid)
+namespace DataStreamAdapters {
+struct Uuid
{
- uint8_t buffer[16];
- s.ReadBytes(16, buffer);
+ void ReadFromDataStream(DataStream& s, uuids::uuid& uuid)
+ {
+ uint8_t buffer[16];
+ s.ReadBytes(16, buffer);
- uuid = uuids::uuid(gsl::span<uint8_t, 16>{ buffer });
-}
+ uuid = uuids::uuid(gsl::span<uint8_t, 16>{ buffer });
+ }
-void WriteToDataStream(DataStream& s, const uuids::uuid& uuid)
-{
- auto gslSpan = uuid.as_bytes();
- s.WriteBytes(gslSpan.size(), gslSpan.data());
-}
-} // namespace DataStreamIntegrations
+ void WriteToDataStream(DataStream& s, const uuids::uuid& uuid)
+ {
+ auto gslSpan = uuid.as_bytes();
+ s.WriteBytes(gslSpan.size(), gslSpan.data());
+ }
+};
+} // namespace DataStreamAdapters
diff --git a/core/src/Utils/IO/VectorIntegration.hpp b/core/src/Utils/IO/VectorIntegration.hpp
index 45929ed..ff6e3a8 100644
--- a/core/src/Utils/IO/VectorIntegration.hpp
+++ b/core/src/Utils/IO/VectorIntegration.hpp
@@ -2,27 +2,30 @@
#include <vector>
-namespace DataStreamIntegrations {
-template <class TElement>
-void ReadFromDataStream(DataStream& s, std::vecetor<TElement>& vec)
+namespace DataStreamAdapters {
+struct Vector
{
- s.Write((uint64_t)vec.size());
- for (auto& element : vec) {
- // TODO
+ template <class TElement>
+ void ReadFromDataStream(DataStream& s, std::vecetor<TElement>& vec)
+ {
+ s.Write((uint64_t)vec.size());
+ for (auto& element : vec) {
+ // TODO
+ }
}
-}
-template <class TElement>
-void WriteToDataStream(DataStream& s, const std::vecetor<TElement>& vec)
-{
- uint64_t size;
- s >> size;
+ template <class TElement>
+ void WriteToDataStream(DataStream& s, const std::vecetor<TElement>& vec)
+ {
+ uint64_t size;
+ s >> size;
- vec.clear();
- vec.reserve(size);
+ vec.clear();
+ vec.reserve(size);
- for (uint64_t i = 0; i < size; ++i) {
- // TODO
+ for (uint64_t i = 0; i < size; ++i) {
+ // TODO
+ }
}
-}
-} // namespace DataStreamIntegrations
+};
+} // namespace DataStreamAdapters