diff options
author | rtk0c <[email protected]> | 2021-08-15 19:20:55 -0700 |
---|---|---|
committer | rtk0c <[email protected]> | 2021-08-15 19:20:55 -0700 |
commit | b79a244d76c66287c6228e3845aa3af91a847f5d (patch) | |
tree | a6a425395ffc534dbc5532b274543c14dc5d53c5 /core/src/Utils | |
parent | c51a61c0f0de65a3e64f589816a56f21ed4e8528 (diff) |
More work on IO adapters (not working)
Diffstat (limited to 'core/src/Utils')
-rw-r--r-- | core/src/Utils/IO/Adapter.cpp | 1 | ||||
-rw-r--r-- | core/src/Utils/IO/Adapter.hpp | 87 | ||||
-rw-r--r-- | core/src/Utils/IO/DataStream.cpp | 5 | ||||
-rw-r--r-- | core/src/Utils/IO/DataStream.hpp | 175 | ||||
-rw-r--r-- | core/src/Utils/IO/StringIntegration.hpp | 6 | ||||
-rw-r--r-- | core/src/Utils/IO/UuidIntegration.hpp | 4 | ||||
-rw-r--r-- | core/src/Utils/IO/VectorIntegration.hpp | 4 | ||||
-rw-r--r-- | core/src/Utils/IO/fwd.hpp | 4 |
8 files changed, 156 insertions, 130 deletions
diff --git a/core/src/Utils/IO/Adapter.cpp b/core/src/Utils/IO/Adapter.cpp deleted file mode 100644 index bd094d4..0000000 --- a/core/src/Utils/IO/Adapter.cpp +++ /dev/null @@ -1 +0,0 @@ -#include "Adapter.hpp" diff --git a/core/src/Utils/IO/Adapter.hpp b/core/src/Utils/IO/Adapter.hpp deleted file mode 100644 index e9e8fb2..0000000 --- a/core/src/Utils/IO/Adapter.hpp +++ /dev/null @@ -1,87 +0,0 @@ -#pragma once - -#include "Utils/IO/DataStream.hpp" - -#include <utility> - -class SerializationAdapter -{ -public: - static constexpr bool IsSerializer() - { - return true; - } - -public: - DataStream* Stream; - - template <class T> - void Bytes(size_t byteCount, T* buffer) const - { - Stream->WriteBytes(byteCount, buffer); - } - - template <class T> - void Value(T t) const - { - Stream->Write(t); - } - - template <class TObject> - void Object(TObject& obj) const - { - Stream->WriteObject(obj); - } -}; - -class DeserializationAdapter -{ -public: - static constexpr bool IsSerializer() - { - return false; - } - -public: - DataStream* Stream; - - template <class T> - void Bytes(size_t byteCount, T* buffer) const - { - Stream->WriteBytes(byteCount, buffer); - } - - template <class T> - void Value(T& t) const - { - Stream->Read(t); - } - - template <class TObject> - void Object(TObject& obj) const - { - Stream->ReadObject(obj); - } -}; - -template <class T> -requires requires(T t) -{ - t.OperateIOAdapter(std::declval<DeserializationAdapter>()); -} -void ReadFromDataStream(DataStream& stream, T& obj) -{ - DeserializationAdapter adapter{ &stream }; - obj.OperateIOAdapter(adapter); -} - -template <class T> -requires requires(T t) -{ - t.OperateIOAdapter(std::declval<SerializationAdapter>()); -} -void WriteToDataStream(DataStream& stream, T& obj) -{ - SerializationAdapter adapter{ &stream }; - obj.OperateIOAdapter(adapter); -} diff --git a/core/src/Utils/IO/DataStream.cpp b/core/src/Utils/IO/DataStream.cpp index bca357a..0e0a37b 100644 --- a/core/src/Utils/IO/DataStream.cpp +++ b/core/src/Utils/IO/DataStream.cpp @@ -1 +1,6 @@ #include "DataStream.hpp" + +DataStream::DataStream() + : mEndian{ LittleEndian } +{ +} diff --git a/core/src/Utils/IO/DataStream.hpp b/core/src/Utils/IO/DataStream.hpp index 6babf63..fb736cc 100644 --- a/core/src/Utils/IO/DataStream.hpp +++ b/core/src/Utils/IO/DataStream.hpp @@ -1,9 +1,124 @@ #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: + static constexpr bool IsSerializer() + { + return true; + } + +public: + DataStream* Stream; + + template <class T> + void Bytes(size_t byteCount, T* buffer) const + { + Stream->WriteBytes(byteCount, buffer); + } + + template <class T> + void Value(T t) const + { + Stream->Write(t); + } + + template <class T> + void Object(T& obj) const + { + Stream->WriteObject(obj); + } +}; + +class DeserializationAdapter +{ +public: + static constexpr bool IsSerializer() + { + return false; + } + +public: + DataStream* Stream; + + template <class T> + void Bytes(size_t byteCount, T* buffer) const + { + Stream->WriteBytes(byteCount, buffer); + } + + template <class T> + void Value(T& t) const + { + Stream->Read(t); + } + + template <class T> + void Object(T& obj) const + { + Stream->ReadObject(obj); + } +}; + +namespace DataStreamTraits { + +template <class T> +concept HasMember = requires(T t) +{ + t.ReadFromDataStream(std::declval<DataStream>()); +}; + +template <class T> +concept HasIOAdapterMember = requires(T t) +{ + t.OperateIOAdapter(std::declval<SerializationAdapter>()); + 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 { public: @@ -80,44 +195,40 @@ public: void Read(double& n); template <class TObject> - requires requires(TObject obj) - { - obj.ReadFromDataStream(std::declval<DataStream>()); - } void ReadObject(TObject& obj) { - obj.ReadFromDataStream(*this); - } - - template <class TObject> - requires requires(TObject obj) - { - // Let ADL happen - ReadFromDataStream(std::declval<DataStream>(), obj); - } - void ReadObject(TObject& obj) - { - ReadFromDataStream(*this, obj); - } - - template <class TObject> - requires requires(TObject obj) - { - obj.WriteToDataStream(std::declval<DataStream>()); - } - void WriteObject(TObject& obj) - { - obj.ReadFromDataStream(*this); + using namespace DataStreamTraits; + if constexpr (HasMember<TObject>) { + obj.ReadFromDataStream(*this); + } else if constexpr (HasIOAdapterMember<TObject>) { + 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> - requires requires(TObject obj) - { - // Let ADL happen - WriteToDataStream(std::declval<DataStream>(), obj); - } void WriteObject(TObject& obj) { - WriteToDataStream(*this, obj); + using namespace DataStreamTraits; + if constexpr (HasMember<TObject>) { + obj.WriteToDataStream(*this); + } else if constexpr (HasIOAdapterMember<TObject>) { + 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."); + } } }; diff --git a/core/src/Utils/IO/StringIntegration.hpp b/core/src/Utils/IO/StringIntegration.hpp index d4be23a..35b1660 100644 --- a/core/src/Utils/IO/StringIntegration.hpp +++ b/core/src/Utils/IO/StringIntegration.hpp @@ -1,11 +1,10 @@ #pragma once -#include "Utils/IO/DataStream.hpp" - #include <iterator> #include <string> #include <string_view> +namespace DataStreamIntegrations { void ReadFromDataStream(DataStream& s, std::string& str) { uint64_t size; @@ -26,4 +25,5 @@ void WriteToDataStream(DataStream& s, const std::string_view& str) { s.Write((uint64_t)str.size()); s.WriteBytes(str.size(), str.data()); -}
\ No newline at end of file +} +} // namespace DataStreamIntegrations diff --git a/core/src/Utils/IO/UuidIntegration.hpp b/core/src/Utils/IO/UuidIntegration.hpp index 202e021..9cba4b1 100644 --- a/core/src/Utils/IO/UuidIntegration.hpp +++ b/core/src/Utils/IO/UuidIntegration.hpp @@ -1,12 +1,11 @@ #pragma once -#include "Utils/IO/DataStream.hpp" - #include <uuid/uuid.h> #include <cstddef> #include <cstdint> #include <iterator> +namespace DataStreamIntegrations { void ReadFromDataStream(DataStream& s, uuids::uuid& uuid) { uint8_t buffer[16]; @@ -20,3 +19,4 @@ void WriteToDataStream(DataStream& s, const uuids::uuid& uuid) auto gslSpan = uuid.as_bytes(); s.WriteBytes(gslSpan.size(), gslSpan.data()); } +} // namespace DataStreamIntegrations diff --git a/core/src/Utils/IO/VectorIntegration.hpp b/core/src/Utils/IO/VectorIntegration.hpp index b2c751c..45929ed 100644 --- a/core/src/Utils/IO/VectorIntegration.hpp +++ b/core/src/Utils/IO/VectorIntegration.hpp @@ -1,9 +1,8 @@ #pragma once -#include "Utils/IO/DataStream.hpp" - #include <vector> +namespace DataStreamIntegrations { template <class TElement> void ReadFromDataStream(DataStream& s, std::vecetor<TElement>& vec) { @@ -26,3 +25,4 @@ void WriteToDataStream(DataStream& s, const std::vecetor<TElement>& vec) // TODO } } +} // namespace DataStreamIntegrations diff --git a/core/src/Utils/IO/fwd.hpp b/core/src/Utils/IO/fwd.hpp index 48d8cfb..755d94f 100644 --- a/core/src/Utils/IO/fwd.hpp +++ b/core/src/Utils/IO/fwd.hpp @@ -1,8 +1,6 @@ #pragma onceDeserializationAdapter -// Adapter.hpp +// DataStream.hpp class SerializationAdapter; class DeserializationAdapter; - -// DataStream.hpp class DataStream; |