#pragma once #include "binary-serializer.hpp" #include #include namespace floormat::Serialize { template concept char_sequence = requires(T& x, const T& cx) { requires std::same_as; requires std::same_as; requires std::forward_iterator; requires std::forward_iterator; requires std::same_as>; requires std::same_as>; }; template concept string_input_iterator = requires(It it) { requires std::forward_iterator; requires std::is_same_v>; }; template struct binary_reader final { template explicit constexpr binary_reader(const Seq& seq) noexcept; constexpr binary_reader(It begin, It end) noexcept; constexpr void assert_end() noexcept; template constexpr T read() noexcept; template constexpr std::array read() noexcept; constexpr std::size_t bytes_read() const noexcept { return num_bytes_read; } template constexpr auto read_asciiz_string() noexcept; private: std::size_t num_bytes_read = 0; It it, end; }; template binary_reader& operator>>(binary_reader& reader, T& x) noexcept; template binary_reader(It&& begin, It&& end) -> binary_reader>; template binary_reader(Array&& array) -> binary_reader>; } // namespace floormat::Serialize