@@ -244,46 +244,48 @@ const Out& AsBase(const In& x)
244244// Templates for serializing to anything that looks like a stream,
245245// i.e. anything that supports .read(std::span<std::byte>) and .write(std::span<const std::byte>)
246246//
247- // clang-format off
248247
249248// Typically int8_t and char are distinct types, but some systems may define int8_t
250249// in terms of char. Forbid serialization of char in the typical case, but allow it if
251250// it's the only way to describe an int8_t.
252251template<class T>
253252concept CharNotInt8 = std::same_as<T, char> && !std::same_as<T, int8_t>;
254253
254+ // clang-format off
255255template <typename Stream, CharNotInt8 V> void Serialize (Stream&, V) = delete; // char serialization forbidden. Use uint8_t or int8_t
256256template <typename Stream> void Serialize (Stream& s, std::byte a) { ser_writedata8 (s, uint8_t (a)); }
257- template <typename Stream> inline void Serialize (Stream& s, int8_t a ) { ser_writedata8 (s, a); }
258- template <typename Stream> inline void Serialize (Stream& s, uint8_t a ) { ser_writedata8 (s, a); }
259- template <typename Stream> inline void Serialize (Stream& s, int16_t a ) { ser_writedata16 (s, a); }
260- template <typename Stream> inline void Serialize (Stream& s, uint16_t a) { ser_writedata16 (s, a); }
261- template <typename Stream> inline void Serialize (Stream& s, int32_t a ) { ser_writedata32 (s, a); }
262- template <typename Stream> inline void Serialize (Stream& s, uint32_t a) { ser_writedata32 (s, a); }
263- template <typename Stream> inline void Serialize (Stream& s, int64_t a ) { ser_writedata64 (s, a); }
264- template <typename Stream> inline void Serialize (Stream& s, uint64_t a) { ser_writedata64 (s, a); }
265- template <typename Stream, BasicByte B, int N> void Serialize (Stream& s, const B (&a)[N]) { s.write (MakeByteSpan (a)); }
266- template <typename Stream, BasicByte B, std::size_t N> void Serialize (Stream& s, const std::array<B, N>& a) { s.write (MakeByteSpan (a)); }
267- template <typename Stream, BasicByte B, std::size_t N> void Serialize (Stream& s, std::span<B, N> span) { s.write (std::as_bytes (span)); }
268- template <typename Stream, BasicByte B> void Serialize (Stream& s, std::span<B> span) { s.write (std::as_bytes (span)); }
257+ template <typename Stream> void Serialize (Stream& s, int8_t a) { ser_writedata8 (s, uint8_t (a)); }
258+ template <typename Stream> void Serialize (Stream& s, uint8_t a) { ser_writedata8 (s, a); }
259+ template <typename Stream> void Serialize (Stream& s, int16_t a) { ser_writedata16 (s, uint16_t (a)); }
260+ template <typename Stream> void Serialize (Stream& s, uint16_t a) { ser_writedata16 (s, a); }
261+ template <typename Stream> void Serialize (Stream& s, int32_t a) { ser_writedata32 (s, uint32_t (a)); }
262+ template <typename Stream> void Serialize (Stream& s, uint32_t a) { ser_writedata32 (s, a); }
263+ template <typename Stream> void Serialize (Stream& s, int64_t a) { ser_writedata64 (s, uint64_t (a)); }
264+ template <typename Stream> void Serialize (Stream& s, uint64_t a) { ser_writedata64 (s, a); }
265+
266+ template <typename Stream, BasicByte B, size_t N> void Serialize (Stream& s, const B (&a)[N]) { s.write (MakeByteSpan (a)); }
267+ template <typename Stream, BasicByte B, size_t N> void Serialize (Stream& s, const std::array<B, N>& a) { s.write (MakeByteSpan (a)); }
268+ template <typename Stream, BasicByte B, size_t N> void Serialize (Stream& s, std::span<B, N> span) { s.write (std::as_bytes (span)); }
269+ template <typename Stream, BasicByte B> void Serialize (Stream& s, std::span<B> span) { s.write (std::as_bytes (span)); }
269270
270271template <typename Stream, CharNotInt8 V> void Unserialize (Stream&, V) = delete; // char serialization forbidden. Use uint8_t or int8_t
271- template <typename Stream> void Unserialize (Stream& s, std::byte& a) { a = std::byte{ser_readdata8 (s)}; }
272- template <typename Stream> inline void Unserialize (Stream& s, int8_t & a ) { a = ser_readdata8 (s); }
273- template <typename Stream> inline void Unserialize (Stream& s, uint8_t & a ) { a = ser_readdata8 (s); }
274- template <typename Stream> inline void Unserialize (Stream& s, int16_t & a ) { a = ser_readdata16 (s); }
275- template <typename Stream> inline void Unserialize (Stream& s, uint16_t & a) { a = ser_readdata16 (s); }
276- template <typename Stream> inline void Unserialize (Stream& s, int32_t & a ) { a = ser_readdata32 (s); }
277- template <typename Stream> inline void Unserialize (Stream& s, uint32_t & a) { a = ser_readdata32 (s); }
278- template <typename Stream> inline void Unserialize (Stream& s, int64_t & a ) { a = ser_readdata64 (s); }
279- template <typename Stream> inline void Unserialize (Stream& s, uint64_t & a) { a = ser_readdata64 (s); }
280- template <typename Stream, BasicByte B, int N> void Unserialize (Stream& s, B (&a)[N]) { s.read (MakeWritableByteSpan (a)); }
281- template <typename Stream, BasicByte B, std::size_t N> void Unserialize (Stream& s, std::array<B, N>& a) { s.read (MakeWritableByteSpan (a)); }
282- template <typename Stream, BasicByte B, std::size_t N> void Unserialize (Stream& s, std::span<B, N> span) { s.read (std::as_writable_bytes (span)); }
283- template <typename Stream, BasicByte B> void Unserialize (Stream& s, std::span<B> span) { s.read (std::as_writable_bytes (span)); }
284-
285- template <typename Stream> inline void Serialize (Stream& s, bool a) { uint8_t f = a; ser_writedata8 (s, f); }
286- template <typename Stream> inline void Unserialize (Stream& s, bool & a) { uint8_t f = ser_readdata8 (s); a = f; }
272+ template <typename Stream> void Unserialize (Stream& s, std::byte& a) { a = std::byte (ser_readdata8 (s)); }
273+ template <typename Stream> void Unserialize (Stream& s, int8_t & a) { a = int8_t (ser_readdata8 (s)); }
274+ template <typename Stream> void Unserialize (Stream& s, uint8_t & a) { a = ser_readdata8 (s); }
275+ template <typename Stream> void Unserialize (Stream& s, int16_t & a) { a = int16_t (ser_readdata16 (s)); }
276+ template <typename Stream> void Unserialize (Stream& s, uint16_t & a) { a = ser_readdata16 (s); }
277+ template <typename Stream> void Unserialize (Stream& s, int32_t & a) { a = int32_t (ser_readdata32 (s)); }
278+ template <typename Stream> void Unserialize (Stream& s, uint32_t & a) { a = ser_readdata32 (s); }
279+ template <typename Stream> void Unserialize (Stream& s, int64_t & a) { a = int64_t (ser_readdata64 (s)); }
280+ template <typename Stream> void Unserialize (Stream& s, uint64_t & a) { a = ser_readdata64 (s); }
281+
282+ template <typename Stream, BasicByte B, size_t N> void Unserialize (Stream& s, B (&a)[N]) { s.read (MakeWritableByteSpan (a)); }
283+ template <typename Stream, BasicByte B, size_t N> void Unserialize (Stream& s, std::array<B, N>& a) { s.read (MakeWritableByteSpan (a)); }
284+ template <typename Stream, BasicByte B, size_t N> void Unserialize (Stream& s, std::span<B, N> span) { s.read (std::as_writable_bytes (span)); }
285+ template <typename Stream, BasicByte B> void Unserialize (Stream& s, std::span<B> span) { s.read (std::as_writable_bytes (span)); }
286+
287+ template <typename Stream> void Serialize (Stream& s, bool a) { uint8_t f = a; ser_writedata8 (s, f); }
288+ template <typename Stream> void Unserialize (Stream& s, bool & a) { uint8_t f = ser_readdata8 (s); a = f; }
287289// clang-format on
288290
289291
0 commit comments