#pragma once #include #include "data.hpp" namespace saw { namespace trans { template struct FixedLength {}; template struct VarLength {}; struct NewLine {}; struct CarriageReturnNewLine {}; } template class transport; template class transport> final { private: public: error_or view_slice(buffer& buff) const { typename native_data_type>::type val{}; buffer_view view{buff}; auto eov = stream_value>::decode(val, view); if(eov.is_error()){ return std::move(eov.get_error()); } if(view.read_composite_length() < val){ return make_error(); } buff.read_advance(Len); buffer_view data_view{buff, val, 0u}; return data_view; } error_or wrap(buffer& out_buff, buffer& in_buff){ using trans_type = typename native_data_type>::type; trans_type val{}; val = static_cast(in_buff.read_composite_length()); auto eov = stream_value>::encode(val, out_buff); if(eov.is_error()){ auto& err = eov.get_error(); return std::move(err); } return Len; } error_or chain_slice(chain_array_buffer& buff) const { (void) buff; return make_error(); } }; template class transport> final { public: error_or view_slice(buffer& buff) const { using var_max_t = typename native_data_type>::type; var_max_t val{}; buffer_view view{buff}; std::array val_array; for(uint64_t i = 0; i < Len && view.read_composite_length() > 0u; ++i){ uint8_t len_byte = view.read(); val |= static_cast(len_byte & 0x7F) << i*7; if( (len_byte & 0x80 ) == 0 ){ if( (i+1u) == Len ) { return make_error("Last VarLength Continue Bit is set."); } } view.read_advance(1u); } if( val > view.read_composite_length() ){ return make_error(); } return buffer_view{buff, val, 0u}; } error_or wrap(buffer& out_buff, buffer& in_buff){ using var_max_t = typename native_data_type>::type; uint64_t len = in_buff.read_composite_length(); var_max_t val = len; if(len != val){ return make_error("Number too large"); } buffer_view view{out_buff}; uint64_t i = 0u; for(i = 0u; i < Len && view.write_composite_length() > 0u; ++i){ view.write() = (val & 0x7F); if( ( val & ~0x7F ) == 0u ){ ++i; break; } view.write() |= 0x80; val = (val >> (i * 7u)); view.write_advance(1u); } return i; } error_or chain_slice(chain_array_buffer& buff) const { (void) buff; return make_error(); } }; }