summaryrefslogtreecommitdiff
path: root/src/codec/simple.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/codec/simple.h')
-rw-r--r--src/codec/simple.h94
1 files changed, 92 insertions, 2 deletions
diff --git a/src/codec/simple.h b/src/codec/simple.h
index ad66f66..8712c6d 100644
--- a/src/codec/simple.h
+++ b/src/codec/simple.h
@@ -3,8 +3,6 @@
#include "data.h"
#include "stream_value.h"
-#include <iostream>
-
#include <forstio/core/buffer.h>
#include <forstio/core/error.h>
@@ -99,6 +97,52 @@ struct kelsimple_encode<schema::Struct<schema::Member<T,Lits>...>,FromEnc> {
}
};
+template<typename... T, typename FromEnc>
+struct kelsimple_encode<schema::Tuple<T...>, FromEnc> {
+ template<std::size_t i>
+ static error_or<void> encode_member(const data<schema::Tuple<T...>, FromEnc>& from, buffer& to){
+ using Type = typename parameter_pack_type<i,T...>::type;
+ {
+ auto eov = kelsimple_encode<Type, FromEnc>::encode(from.template get<i>(), to);
+ }
+ if constexpr ((i+1) < sizeof...(T)){
+ auto eov = encode_member<i+1>(from, to);
+ if(eov.is_error()){
+ return eov;
+ }
+ }
+ return void_t{};
+ }
+
+ static error_or<void> encode(const data<schema::Tuple<T...>, FromEnc>& from, buffer& to){
+ return encode_member<0>(from, to);
+ }
+};
+
+template<typename FromEnc>
+struct kelsimple_encode<schema::String, FromEnc> {
+ static error_or<void> encode(const data<schema::String, FromEnc>& from, buffer& to){
+ const auto str_size = from.size();
+ typename native_data_type<schema::UInt64>::type str_len = static_cast<uint64_t>(str_size);
+ {
+ auto eov = stream_value<schema::UInt64>::encode(str_len, to);
+ if(eov.is_error()){
+ return eov;
+ }
+ }
+
+ for(std::size_t i = 0; i < str_size; ++i){
+ auto eov = stream_value<schema::Int8>::encode(from.at(i), to);
+ if(eov.is_error()){
+ return eov;
+ }
+ }
+
+ return void_t{};
+ }
+};
+
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
template<typename Schema, typename FromEnc>
class kelsimple_decode {
static_assert(always_false<Schema, FromEnc>, "This schema type is not being handled by the kelsimple encoding.");
@@ -178,6 +222,52 @@ struct kelsimple_decode<schema::Struct<schema::Member<T,Lits>...>,FromEnc> {
}
};
+template<typename... T, typename FromEnc>
+struct kelsimple_decode<schema::Tuple<T...>,FromEnc> {
+ template<std::size_t i>
+ static error_or<void> decode_member(buffer& from, data<schema::Tuple<T...>, FromEnc>& to){
+ using Type = typename parameter_pack_type<i,T...>::type;
+ {
+ auto eov = kelsimple_decode<Type, FromEnc>::decode(from, to.template get<i>());
+ }
+ if constexpr ((i+1) < sizeof...(T)){
+ auto eov = decode_member<i+1>(from, to);
+ if(eov.is_error()){
+ return eov;
+ }
+ }
+ return void_t{};
+
+ }
+ static error_or<void> decode(buffer& from, data<schema::Tuple<T...>, FromEnc>& to){
+ return decode_member<0>(from, to);
+ }
+
+};
+template<typename FromEnc>
+struct kelsimple_decode<schema::String, FromEnc> {
+ static error_or<void> decode(buffer& from, data<schema::String, FromEnc>& to){
+ {
+ uint64_t val{};
+ auto eov = stream_value<schema::UInt64>::decode(val, from);
+ if(eov.is_error()){
+ return eov;
+ }
+ to = data<schema::String,FromEnc>{val};
+ }
+ const std::size_t str_size = to.size();
+ for(std::size_t i = 0; i < str_size; ++i){
+ int8_t val{};
+ auto eov = stream_value<schema::Int8>::decode(val, from);
+ if(eov.is_error()){
+ return eov;
+ }
+ to.set_at(i, val);
+ }
+ return void_t{};
+ }
+};
+
}
template<typename Schema>