Refactor trivial serialization

This commit is contained in:
Nikita Lisitsa 2024-03-27 21:37:10 +03:00
parent b26849e689
commit 6770ce908f

View file

@ -92,21 +92,35 @@ namespace psemek::sir
}
template <typename Stream, typename T>
requires (is_ostream_v<Stream> && !is_custom_v<T> && !is_empty_v<T> && is_trivial_v<T>)
void write(Stream & s, T const & x)
requires (is_ostream_v<Stream>)
void write_trivial(Stream & s, T const & x)
{
write_padding<T>(s);
s.write(reinterpret_cast<char const *>(std::addressof(x)), sizeof(x));
}
template <typename Stream, typename T>
requires (is_istream_v<Stream> && !is_custom_v<T> && !is_empty_v<T> && is_trivial_v<T>)
void read(Stream & s, T & x)
requires (is_ostream_v<Stream> && !is_custom_v<T> && !is_empty_v<T> && is_trivial_v<T>)
void write(Stream & s, T const & x)
{
write_trivial(s, x);
}
template <typename Stream, typename T>
requires (is_istream_v<Stream>)
void read_trivial(Stream & s, T & x)
{
read_padding<T>(s);
s.read(reinterpret_cast<char *>(std::addressof(x)), sizeof(x));
}
template <typename Stream, typename T>
requires (is_istream_v<Stream> && !is_custom_v<T> && !is_empty_v<T> && is_trivial_v<T>)
void read(Stream & s, T & x)
{
read_trivial(s, x);
}
template <typename Iterator>
void write_sequence(ostream & s, Iterator begin, Iterator end)
{