diff options
author | Stanislaw Halik <sthalik@misaki.pl> | 2022-10-27 18:28:42 +0200 |
---|---|---|
committer | Stanislaw Halik <sthalik@misaki.pl> | 2022-10-27 18:28:42 +0200 |
commit | 4dce8e6aeb770fee1a7190526b04d03f3da69cb0 (patch) | |
tree | d38a607139d51b8b6399490fcca8bab303a5cd5d /serialize/binary-serializer.inl | |
parent | 96f2ef35072e9caf1e87debf0566d61c35a05d65 (diff) |
wip binary serializer
Diffstat (limited to 'serialize/binary-serializer.inl')
-rw-r--r-- | serialize/binary-serializer.inl | 54 |
1 files changed, 54 insertions, 0 deletions
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<std::forward_iterator It> +template<std::floating_point T> +constexpr value_u binary_reader<It>::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<std::forward_iterator It> +template<typename T> +T binary_reader<It>::read() noexcept +{ + value_u buf = read_u<T>(); + return *reinterpret_cast<T>(buf.bytes); +} + +template<std::forward_iterator It> +constexpr binary_reader<It>::~binary_reader() noexcept +{ + fm_assert(it == end); +} + +template<std::forward_iterator It> +template<integer T> +constexpr value_u binary_reader<It>::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 + + |