/* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. * * Copyright 2022, Danny Robson */ #pragma once #include "./converter.hpp" #include "./ops.hpp" /////////////////////////////////////////////////////////////////////////////// template struct cruft::serialise::converter> { using value_type = std::vector; static std::size_t size (value_type const &val) { std::size_t accum = sizeof (typename value_type::size_type); for (auto const &i: val) accum += converter::size (i); return accum; } static cruft::view to_bytes [[nodiscard]] ( cruft::view dst, value_type const &src ) { dst = ::cruft::serialise::to_bytes (dst, src.size ()); for (auto const &i: src) dst = ::cruft::serialise::to_bytes (dst, i); return dst; } static value_type from_bytes (cruft::view &src) { auto const len = ::cruft::serialise::from_bytes::size_type> (src); std::vector res; res.reserve (len); for (std::size_t i = 0; i != len; ++i) res.push_back (::cruft::serialise::from_bytes (src)); return res; } }; /////////////////////////////////////////////////////////////////////////////// template <> struct cruft::serialise::converter { using value_type = std::string; static std::size_t size (value_type const &val) { return sizeof (value_type::size_type) + sizeof (value_type::value_type) * val.size (); } static cruft::view to_bytes [[nodiscard]] ( cruft::view dst, value_type const &src ) { dst = ::cruft::serialise::to_bytes (dst, src.size ()); for (auto const &i: src) dst = ::cruft::serialise::to_bytes (dst, i); return dst; } static value_type from_bytes (cruft::view &src) { std::string res; res.resize (::cruft::serialise::converter::from_bytes (src)); for (auto &i: res) i = ::cruft::serialise::converter::from_bytes (src); return res; } }; /////////////////////////////////////////////////////////////////////////////// template struct cruft::serialise::converter> { using value_type = std::pair; static std::size_t size (value_type const &val) { return converter::size (val.first) + converter::size (val.second); } static cruft::view to_bytes [[nodiscard]] ( cruft::view dst, value_type const &src ) { dst = ::cruft::serialise::to_bytes (dst, src.first); dst = ::cruft::serialise::to_bytes (dst, src.second); return dst; } static value_type from_bytes (cruft::view &src) { return { cruft::serialise::converter::from_bytes (src), cruft::serialise::converter::from_bytes (src), }; } }; /////////////////////////////////////////////////////////////////////////////// template struct cruft::serialise::converter> { using value_type = std::tuple; static std::size_t size (value_type const &val) { return size (val, std::make_index_sequence {}); } static cruft::view to_bytes [[nodiscard]] ( cruft::view dst, value_type const &src ) { return to_bytes (dst, src, std::make_index_sequence {}); } static value_type from_bytes (cruft::view &src) { return from_bytes (src, std::make_index_sequence {}); } private: template static std::size_t size (value_type const &val, std::index_sequence const &) { return ( converter< std::tuple_element_t >::size ( std::get (val) ) + ... + 0uz ); } template static cruft::view to_bytes [[nodiscard]] ( cruft::view dst, value_type const &src, std::index_sequence const& ) { return ::cruft::serialise::to_bytes (dst, std::get (src)...); } template static value_type from_bytes (cruft::view &src, std::index_sequence const&) { return std::tuple { ::cruft::serialise::from_bytes (src)..., }; } };