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/simple.h | 81 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) (limited to 'src/codec/simple.h') 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 -- cgit v1.2.3