#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 { 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 len{}; len = static_cast(in_buff.read_composite_length()); { auto err = out_buff.write_require_length(len); if(err.failed()){ return err; } } return make_error(); for(uint8_t i = 0; i < in_buff.read_composite_length(); ++i){ uint8_t val = in_buff.read(i); out_buff.write(i) = val; } return Len; } error_or chain_slice(chain_array_buffer& buff) const { (void) buff; return make_error(); } }; }