From 4dce8e6aeb770fee1a7190526b04d03f3da69cb0 Mon Sep 17 00:00:00 2001 From: Stanislaw Halik Date: Thu, 27 Oct 2022 18:28:42 +0200 Subject: wip binary serializer --- serialize/binary-serializer.inl | 54 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 serialize/binary-serializer.inl (limited to 'serialize/binary-serializer.inl') diff --git a/serialize/binary-serializer.inl b/serialize/binary-serializer.inl new file mode 100644 index 00000000..9e7e58fa --- /dev/null +++ b/serialize/binary-serializer.inl @@ -0,0 +1,54 @@ +#pragma once + +#include "binary-serializer.hpp" + +namespace floormat::Serialize { + +template +template +constexpr value_u binary_reader::read_u() noexcept +{ + value_u buf; + static_assert(sizeof(T) <= sizeof(buf)); + fm_assert(std::distance(it, end) >= sizeof(T)); + for (int i = 0; i < sizeof(T); i++) + buf.bytes[i] = *it++; + return buf; +} + +template +template +T binary_reader::read() noexcept +{ + value_u buf = read_u(); + return *reinterpret_cast(buf.bytes); +} + +template +constexpr binary_reader::~binary_reader() noexcept +{ + fm_assert(it == end); +} + +template +template +constexpr value_u binary_reader::read_u() noexcept +{ + value_u buf; + if (std::is_constant_evaluated()) + for (std::size_t i = 0; i < std::size(buf.bytes); i++) + buf.bytes[i] = 0; + static_assert(sizeof(T) <= sizeof(buf)); + fm_assert(std::distance(it, end) >= (std::ptrdiff_t) sizeof(T)); + if constexpr(std::endian::native == std::endian::big) + for (int i = sizeof(T) - 1; i >= 0; i--) + buf.bytes[i] = *it++; + else + for (std::size_t i = 0; i < sizeof(T); i++) + buf.bytes[i] = *it++; + return buf; +} + +} // namespace floormat::Serialize + + -- cgit v1.2.3