summaryrefslogtreecommitdiff
path: root/core/src/Utils
diff options
context:
space:
mode:
authorrtk0c <[email protected]>2021-08-15 19:20:55 -0700
committerrtk0c <[email protected]>2021-08-15 19:20:55 -0700
commitb79a244d76c66287c6228e3845aa3af91a847f5d (patch)
treea6a425395ffc534dbc5532b274543c14dc5d53c5 /core/src/Utils
parentc51a61c0f0de65a3e64f589816a56f21ed4e8528 (diff)
More work on IO adapters (not working)
Diffstat (limited to 'core/src/Utils')
-rw-r--r--core/src/Utils/IO/Adapter.cpp1
-rw-r--r--core/src/Utils/IO/Adapter.hpp87
-rw-r--r--core/src/Utils/IO/DataStream.cpp5
-rw-r--r--core/src/Utils/IO/DataStream.hpp175
-rw-r--r--core/src/Utils/IO/StringIntegration.hpp6
-rw-r--r--core/src/Utils/IO/UuidIntegration.hpp4
-rw-r--r--core/src/Utils/IO/VectorIntegration.hpp4
-rw-r--r--core/src/Utils/IO/fwd.hpp4
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;