@@ -213,9 +213,9 @@ template<typename Stream> inline void Serialize(Stream& s, int32_t a ) { ser_wri
213213template <typename Stream> inline void Serialize (Stream& s, uint32_t a) { ser_writedata32 (s, a); }
214214template <typename Stream> inline void Serialize (Stream& s, int64_t a ) { ser_writedata64 (s, a); }
215215template <typename Stream> inline void Serialize (Stream& s, uint64_t a) { ser_writedata64 (s, a); }
216- template <typename Stream, int N> inline void Serialize (Stream& s, const char (&a)[N]) { s.write (MakeByteSpan (a)); }
217- template <typename Stream, int N> inline void Serialize (Stream& s, const unsigned char (&a)[N] ) { s.write (MakeByteSpan (a)); }
218- template <typename Stream, typename B> void Serialize (Stream& s, Span<B> span) { ( void ) /* force byte-type */ UCharCast (span. data ()); s.write (AsBytes (span)); }
216+ template <typename Stream, BasicByte B, int N> void Serialize (Stream& s, const B (&a)[N]) { s.write (MakeByteSpan (a)); }
217+ template <typename Stream, BasicByte B, std:: size_t N> void Serialize (Stream& s, const std::array<B, N>& a ) { s.write (MakeByteSpan (a)); }
218+ template <typename Stream, BasicByte B> void Serialize (Stream& s, Span<B> span) { s.write (AsBytes (span)); }
219219
220220template <typename Stream, CharNotInt8 V> void Unserialize (Stream&, V) = delete; // char serialization forbidden. Use uint8_t or int8_t
221221template <typename Stream> void Unserialize (Stream& s, std::byte& a) { a = std::byte{ser_readdata8 (s)}; }
@@ -227,9 +227,9 @@ template<typename Stream> inline void Unserialize(Stream& s, int32_t& a ) { a =
227227template <typename Stream> inline void Unserialize (Stream& s, uint32_t & a) { a = ser_readdata32 (s); }
228228template <typename Stream> inline void Unserialize (Stream& s, int64_t & a ) { a = ser_readdata64 (s); }
229229template <typename Stream> inline void Unserialize (Stream& s, uint64_t & a) { a = ser_readdata64 (s); }
230- template <typename Stream, int N> inline void Unserialize (Stream& s, char (&a)[N]) { s.read (MakeWritableByteSpan (a)); }
231- template <typename Stream, int N> inline void Unserialize (Stream& s, unsigned char (&a)[N] ) { s.read (MakeWritableByteSpan (a)); }
232- template <typename Stream, typename B> void Unserialize (Stream& s, Span<B> span) { ( void ) /* force byte-type */ UCharCast (span. data ()); s.read (AsWritableBytes (span)); }
230+ template <typename Stream, BasicByte B, int N> void Unserialize (Stream& s, B (&a)[N]) { s.read (MakeWritableByteSpan (a)); }
231+ template <typename Stream, BasicByte B, std:: size_t N> void Unserialize (Stream& s, std::array<B, N>& a ) { s.read (MakeWritableByteSpan (a)); }
232+ template <typename Stream, BasicByte B> void Unserialize (Stream& s, Span<B> span) { s.read (AsWritableBytes (span)); }
233233
234234template <typename Stream> inline void Serialize (Stream& s, bool a) { uint8_t f = a; ser_writedata8 (s, f); }
235235template <typename Stream> inline void Unserialize (Stream& s, bool & a) { uint8_t f = ser_readdata8 (s); a = f; }
@@ -886,18 +886,23 @@ template<typename Stream, typename T> void Serialize(Stream& os, const std::atom
886886template <typename Stream, typename T> void Unserialize (Stream& is, std::atomic<T>& a);
887887
888888
889-
890889/* *
891890 * If none of the specialized versions above matched and T is a class, default to calling member function.
892891 */
893- template <typename Stream, typename T, typename std::enable_if<std::is_class<T>::value>::type* = nullptr >
894- inline void Serialize (Stream& os, const T& a)
892+ template <class T , class Stream , typename std::enable_if<std::is_class<T>::value>::type* = nullptr >
893+ concept Serializable = requires (T a, Stream s) { a.Serialize (s); };
894+ template <typename Stream, typename T>
895+ requires Serializable<T, Stream>
896+ void Serialize (Stream& os, const T& a)
895897{
896898 a.Serialize (os);
897899}
898900
899- template <typename Stream, typename T, typename std::enable_if<std::is_class<std::remove_reference<T> >::value>::type* = nullptr >
900- inline void Unserialize (Stream& is, T&& a)
901+ template <class T , class Stream , typename std::enable_if<std::is_class<std::remove_reference<T> >::value>::type* = nullptr >
902+ concept Unserializable = requires (T a, Stream s) { a.Unserialize (s); };
903+ template <typename Stream, typename T>
904+ requires Unserializable<T, Stream>
905+ void Unserialize (Stream& is, T&& a)
901906{
902907 a.Unserialize (is);
903908}
0 commit comments