diff options
Diffstat (limited to 'core/src')
-rw-r--r-- | core/src/Model/Assets.cpp | 5 | ||||
-rw-r--r-- | core/src/Utils/IO/DataStream.hpp | 79 | ||||
-rw-r--r-- | core/src/Utils/IO/StringIntegration.hpp | 42 | ||||
-rw-r--r-- | core/src/Utils/IO/UuidIntegration.hpp | 30 | ||||
-rw-r--r-- | core/src/Utils/IO/VectorIntegration.hpp | 39 |
5 files changed, 93 insertions, 102 deletions
diff --git a/core/src/Model/Assets.cpp b/core/src/Model/Assets.cpp index c819e53..1987aa9 100644 --- a/core/src/Model/Assets.cpp +++ b/core/src/Model/Assets.cpp @@ -3,7 +3,6 @@ #include "UI/UI.hpp" #include "Utils/I18n.hpp" #include "Utils/IO/DataStream.hpp" - #include "Utils/IO/StringIntegration.hpp" #include "Utils/IO/UuidIntegration.hpp" @@ -20,8 +19,8 @@ namespace fs = std::filesystem; template <class TAdapter> void SavedAsset::OperateIOAdapter(TAdapter& adapter) { - adapter.Object(Name); - adapter.Object(Uuid); + adapter.ObjectAdapted(Name, DataStreamAdapters::String{}); + adapter.ObjectAdapted(Uuid, DataStreamAdapters::Uuid{}); adapter.Value(Payload); } 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 |