diff options
author | Claudius "keldu" Holeksa <mail@keldu.de> | 2023-06-23 08:09:41 +0200 |
---|---|---|
committer | Claudius "keldu" Holeksa <mail@keldu.de> | 2023-06-23 08:09:41 +0200 |
commit | 89c8277bbc5c20082e0eaff25c0ee7d6d3c89a48 (patch) | |
tree | 673f925da2f42f1b3c0ca30e009f1c76b9fd352a /src | |
parent | fd35c046e8bcfa8cd8ee5566084016c56f57bb42 (diff) |
c++, codec: Adding binary transport protocol
Diffstat (limited to 'src')
-rw-r--r-- | src/codec-json/json.tmpl.h | 2 | ||||
-rw-r--r-- | src/codec/simple.h | 62 | ||||
-rw-r--r-- | src/codec/stream_value.h | 58 |
3 files changed, 121 insertions, 1 deletions
diff --git a/src/codec-json/json.tmpl.h b/src/codec-json/json.tmpl.h index 0f6c59f..b4e8d6d 100644 --- a/src/codec-json/json.tmpl.h +++ b/src/codec-json/json.tmpl.h @@ -6,7 +6,7 @@ namespace saw { namespace impl { template<typename Schema, typename RootSchema, typename FromEncode> class json_encode { - static_assert(always_false<Schema, RootSchema, FromEncode>, "This schema type is not being handle by the json encoding."); + static_assert(always_false<Schema, RootSchema, FromEncode>, "This schema type is not being handled by the json encoding."); }; template<typename T, size_t N, typename RootSchema, typename FromEncode> diff --git a/src/codec/simple.h b/src/codec/simple.h new file mode 100644 index 0000000..1b6cf0d --- /dev/null +++ b/src/codec/simple.h @@ -0,0 +1,62 @@ +#pragma once + +#include "data.h" + +namespace saw { +namespace encode { +struct KelSimple {}; +} + +template<typename T> +class data<T, encode::KelSimple> { +private: + ring_buffer buffer_; +public: + data() = default; + + buffer& get_buffer(){ + return buffer; + } +}; + +namespace impl { +template<typename Schema, typename FromEnc> +class kelsimple_encode { + static_assert(always_false<Schema, FromEnc>, "This schema type is not being handled by the kelsimple encoding."); +}; + +template<typename T, size_t N, typename Schema, typename FromEnc> +struct kelsimple_encode<schema::Primitive<T,N>, FromEnc> { + static error_or<void> encode(const data<schema::Primitive<T,N>, FromEnc>& from, buffer& to){ + + + return void_t{}; + } +}; +} + +template<typename Schema> +class codec<Schema, encode::KelSimple> { +public: + struct config { + size_t depth = 16; + size_t length = 1024; + }; +private: + config cfg_; +public: + codec() = default; + + SAW_FORBID_COPY(codec); + SAW_DEFAULT_MOVE(codec); + + template<typename FromEnc> + error_or<void> encode(const data<Schema, FromEnc>& from_enc, data<Schema, encode::KelSimple>& to_enc){ + buffer_view buff_v{to_enc.get_buffer()}; + + auto eov = kelsimple_encode::encode(from_env, buff_v); + + return void_t{}; + } +}; +} diff --git a/src/codec/stream_value.h b/src/codec/stream_value.h new file mode 100644 index 0000000..df1334b --- /dev/null +++ b/src/codec/stream_value.h @@ -0,0 +1,58 @@ +#pragma once + +#include "buffer.h" +#include "error.h" + +#include <cstdint> +#include <cstring> + +namespace saw { +/** + * Helper class to encode/decode any primtive type into/from litte endian. + * The shift class does this by shifting bytes. This type of procedure is + * platform independent. So it does not matter if the memory layout is + * little endian or big endian + */ +template <typename T, size_t N> class ShiftStreamValue { +public: + inline static error_or<void> decode(typename native_data_type<schema::Primitive<T,N>>::type &val, buffer &buff) { + if (buff.read_composite_length() < sizeof(T)) { + return make_error<err::buffer_exhausted>(); + } + + typename native_data_type<schema::Primitive<schema::UnsignedInteger,N>>::type raw = 0; + + for (size_t i = 0; i < sizeof(T); ++i) { + raw |= (static_cast<uint64_t>(buff.read(i)) << (i * 8)); + } + + memcpy(&val, &raw, sizeof(T)); + buff.read_advance(sizeof(T)); + + return void_t{}; + } + + inline static error_or<void> encode(const typename native_data_type<schema::Primitive<T,N>>::type &val, buffer &buff) { + error err = buff.write_require_length(sizeof(T)); + if (err.failed()) { + return err; + } + + typename native_data_type<schema::Primitive<schema::UnsignedInteger,N>>::type raw{}; + memcpy(&raw, &val, sizeof(T)); + + for (size_t i = 0; i < sizeof(T); ++i) { + buffer.write(i) = raw >> (i * 8); + } + + buffer.write_advance(sizeof(T)); + + return void_t{}; + } + + inline static size_t size() const { return N; } +}; + +template <typename T> using stream_value = shift_stream_value<T>; + +} // namespace saw |