From 70e00f817e9596a746800ba4afec2b7c4ca25142 Mon Sep 17 00:00:00 2001 From: rtk0c Date: Sat, 4 Sep 2021 17:58:56 -0700 Subject: Migrate Template and TableTemplate to use DataStream --- core/src/Utils/IO/DataStream.hpp | 73 +++++++++++++++++++++++++++++++++------- 1 file changed, 61 insertions(+), 12 deletions(-) (limited to 'core/src/Utils/IO/DataStream.hpp') diff --git a/core/src/Utils/IO/DataStream.hpp b/core/src/Utils/IO/DataStream.hpp index fa22549..58fae7d 100644 --- a/core/src/Utils/IO/DataStream.hpp +++ b/core/src/Utils/IO/DataStream.hpp @@ -60,6 +60,15 @@ public: void Read(float& n); void Read(double& n); + template + requires std::is_enum_v + void ReadEnum(TEnum& e) + { + std::underlying_type_t n; + Read(n); + e = static_cast(e); + } + template void ReadObject(TObject& obj) { @@ -72,10 +81,26 @@ public: } } - template - void ReadObjectAdapted(TObject& obj, TAdapter&& adapter) + /// Helper to invoke either Read() or ReadObject(). Note that this function doesn't account for types that needs and adapter. + /// This is intended for writing IO adapters, users that's writing IO logic shouldn't using this - it increases compile time while reducing readability. + template + void ReadGeneric(T& t) + { + if constexpr (requires(T tt, InputDataStream ss) { ss.Read(tt); }) { + Read(t); + } else if constexpr (requires(T tt, InputDataStream ss) { ss.ReadEnum(tt); }) { + ReadEnum(t); + } else if constexpr (requires(T tt, InputDataStream ss) { ss.ReadObject(tt); }) { + ReadObject(t); + } else { + static_assert(false && sizeof(T), "This type is neither a 'value' nor an 'object'."); + } + } + + template + void ReadObjectAdapted(TObject& obj) { - adapter.ReadFromDataStream(*this, obj); + TAdapter::ReadFromDataStream(*this, obj); } public: @@ -99,10 +124,10 @@ public: ReadObject(obj); } - template - void ObjectAdapted(TObject& obj, TAdapter&& adapter) + template + void ObjectAdapted(TObject& obj) { - ReadObjectAdapted(obj, adapter); + ReadObjectAdapted(obj); } }; @@ -146,6 +171,14 @@ public: void Write(float n); void Write(double n); + template + requires std::is_enum_v + void WriteEnum(TEnum e) + { + auto n = static_cast>(e); + Write(n); + } + template void WriteObject(TObject& obj) { @@ -158,10 +191,26 @@ public: } } - template - void WriteObjectAdapted(TObject& obj, TAdapter&& adapter) + /// Helper to invoke either Write() or WriteObject(). Note that this function doesn't account for types that needs and adapter. + /// This is intended for writing IO adapters, users that's writing IO logic shouldn't using this - it increases compile time while reducing readability. + template + void WriteGeneric(T& t) + { + if constexpr (requires(T tt, OutputDataStream ss) { ss.Write(tt); }) { + Write(t); + } else if constexpr (requires(T tt, OutputDataStream ss) { ss.WriteEnum(tt); }) { + WriteEnum(t); + } else if constexpr (requires(T tt, OutputDataStream ss) { ss.WriteObject(tt); }) { + WriteObject(t); + } else { + static_assert(false && sizeof(T), "This type is neither a 'value' nor an 'object'."); + } + } + + template + void WriteObjectAdapted(TObject& obj) { - adapter.WriteToDataStream(*this, obj); + TAdapter::WriteToDataStream(*this, obj); } public: @@ -185,9 +234,9 @@ public: WriteObject(obj); } - template - void ObjectAdapted(TObject& obj, TAdapter&& adapter) + template + void ObjectAdapted(TObject& obj) { - WriteObjectAdapted(obj, adapter); + WriteObjectAdapted(obj); } }; -- cgit v1.2.3-70-g09d2