From 5688c721c610e2a8931d6ec6f84dee2d4d65c763 Mon Sep 17 00:00:00 2001 From: Claudius Holeksa Date: Tue, 27 Jun 2023 12:41:56 +0200 Subject: c++,codec,core: Added Union to KelSimple and fixed the native data type. Made some errors more clear as well --- src/codec/data.h | 14 +++++++-- src/codec/simple.h | 81 ++++++++++++++++++++++++++++++++++++++++++++++++++++ src/core/templates.h | 5 +++- 3 files changed, 97 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/codec/data.h b/src/codec/data.h index 9eb2bfc..397aed1 100644 --- a/src/codec/data.h +++ b/src/codec/data.h @@ -90,13 +90,23 @@ public: SAW_DEFAULT_COPY(data); SAW_DEFAULT_MOVE(data); + template + void set(data::value, T...>::type, encode::Native> val){ + value_ = std::move(val); + } + template bool holds_alternative() const { - return std::holds_alternative::value>(value_); + return (parameter_key_pack_index::value == value_.index()); } template - data::value>::type, encode::Native>& get(){ + data::value, T...>::type, encode::Native>& get(){ + return std::get::value>(value_); + } + + template + const data::value, T...>::type, encode::Native>& get() const{ return std::get::value>(value_); } }; diff --git a/src/codec/simple.h b/src/codec/simple.h index 8712c6d..8760754 100644 --- a/src/codec/simple.h +++ b/src/codec/simple.h @@ -82,6 +82,9 @@ struct kelsimple_encode...>,FromEnc> { constexpr string_literal Literal = parameter_key_pack_type::literal; { auto eov = kelsimple_encode::encode(from.template get(), to); + if(eov.is_error()){ + return eov; + } } if constexpr ((i+1) < sizeof...(T)){ auto eov = encode_member(from, to); @@ -97,6 +100,41 @@ struct kelsimple_encode...>,FromEnc> { } }; +template +struct kelsimple_encode...>,FromEnc> { + template + static error_or encode_member(const data...>, FromEnc>& from, buffer& to){ + using Type = typename parameter_pack_type::type; + constexpr string_literal Literal = parameter_key_pack_type::literal; + if (from.template holds_alternative()) { + { + auto eov = stream_value::encode(static_cast(i), to); + if(eov.is_error()){ + return eov; + } + } + { + auto eov = kelsimple_encode::encode(from.template get(), to); + if(eov.is_error()){ + return eov; + } + } + } + + if constexpr ( (i+1) < sizeof...(T) ){ + auto eov = encode_member(from, to); + if(eov.is_error()){ + return eov; + } + } + return void_t{}; + } + + static error_or encode(const data...>, FromEnc>& from, buffer& to){ + return encode_member<0>(from, to); + } +}; + template struct kelsimple_encode, FromEnc> { template @@ -207,6 +245,9 @@ struct kelsimple_decode...>,FromEnc> { constexpr string_literal Literal = parameter_key_pack_type::literal; { auto eov = kelsimple_decode::decode(from, to.template get()); + if(eov.is_error()){ + return eov; + } } if constexpr ((i+1) < sizeof...(T)){ auto eov = decode_member(from, to); @@ -222,6 +263,46 @@ struct kelsimple_decode...>,FromEnc> { } }; + +template +struct kelsimple_decode...>,FromEnc> { + template + static error_or decode_member(buffer& from, data...>, FromEnc>& to, uint64_t val){ + using Type = typename parameter_pack_type::type; + constexpr string_literal Literal = parameter_key_pack_type::literal; + + if( i == val ){ + to.template set(data{}); + auto eov = kelsimple_decode::decode(from, to.template get()); + if(eov.is_error()){ + return eov; + } + return void_t{}; + } + + if constexpr ((i+1) < sizeof...(T)){ + auto eov = decode_member(from, to, val); + if(eov.is_error()){ + return eov; + } + } + return void_t{}; + + } + static error_or decode(buffer& from, data...>, FromEnc>& to){ + uint64_t val{}; + auto eov = stream_value::decode(val, from); + if(eov.is_error()){ + return eov; + } + if ( val >= sizeof...(T) ){ + return make_error(); + } + return decode_member<0>(from, to, val); + } + +}; + template struct kelsimple_decode,FromEnc> { template diff --git a/src/core/templates.h b/src/core/templates.h index fcac61b..39befc1 100644 --- a/src/core/templates.h +++ b/src/core/templates.h @@ -16,7 +16,9 @@ struct parameter_pack_index { 1u + parameter_pack_index::value; }; -template struct parameter_pack_type; +template struct parameter_pack_type { + static_assert(always_false, "Should've been caught by the specializations"); +}; template struct parameter_pack_type<0, TN, T...> { using type = TN; @@ -25,6 +27,7 @@ template struct parameter_pack_type<0, TN, T...> { template struct parameter_pack_type { static_assert(sizeof...(T) > 0, "Exhausted parameters"); + static_assert(N > 0, "Invalid number. Should've been caught"); using type = typename parameter_pack_type::type; }; /* -- cgit v1.2.3