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> template <typename Stream, typename T>
requires (is_ostream_v<Stream> && !is_custom_v<T> && !is_empty_v<T> && is_trivial_v<T>) requires (is_ostream_v<Stream>)
void write(Stream & s, T const & x) void write_trivial(Stream & s, T const & x)
{ {
write_padding<T>(s); write_padding<T>(s);
s.write(reinterpret_cast<char const *>(std::addressof(x)), sizeof(x)); s.write(reinterpret_cast<char const *>(std::addressof(x)), sizeof(x));
} }
template <typename Stream, typename T> template <typename Stream, typename T>
requires (is_istream_v<Stream> && !is_custom_v<T> && !is_empty_v<T> && is_trivial_v<T>) requires (is_ostream_v<Stream> && !is_custom_v<T> && !is_empty_v<T> && is_trivial_v<T>)
void read(Stream & s, T & x) 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); read_padding<T>(s);
s.read(reinterpret_cast<char *>(std::addressof(x)), sizeof(x)); 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> template <typename Iterator>
void write_sequence(ostream & s, Iterator begin, Iterator end) void write_sequence(ostream & s, Iterator begin, Iterator end)
{ {