@ -273,8 +273,8 @@ template<typename Stream> inline void Serialize(Stream& s, int64_t a ) { ser_wri
template < typename Stream > inline void Serialize ( Stream & s , uint64_t a ) { ser_writedata64 ( s , a ) ; }
template < typename Stream , int N > inline void Serialize ( Stream & s , const char ( & a ) [ N ] ) { s . write ( MakeByteSpan ( a ) ) ; }
template < typename Stream , int N > inline void Serialize ( Stream & s , const unsigned char ( & a ) [ N ] ) { s . write ( MakeByteSpan ( a ) ) ; }
template < typename Stream , typenam e B , std : : size_t N > void Serialize ( Stream & s , const std : : array < B , N > & a ) { ( void ) /* force byte-type */ UCharCast ( a . data ( ) ) ; s . write ( MakeByteSpan ( a ) ) ; }
template < typename Stream , typenam e B > void Serialize ( Stream & s , Span < B > span ) { ( void ) /* force byte-type */ UCharCast ( span . data ( ) ) ; s . write ( AsBytes ( span ) ) ; }
template < typename Stream , BasicByt e B , std : : size_t N > void Serialize ( Stream & s , const std : : array < B , N > & a ) { s . write ( MakeByteSpan ( a ) ) ; }
template < typename Stream , BasicByt e B > void Serialize ( Stream & s , Span < B > span ) { s . write ( AsBytes ( span ) ) ; }
# ifndef CHAR_EQUALS_INT8
template < typename Stream > void Unserialize ( Stream & , char ) = delete ; // char serialization forbidden. Use uint8_t or int8_t
@ -290,8 +290,8 @@ template<typename Stream> inline void Unserialize(Stream& s, int64_t& a ) { a =
template < typename Stream > inline void Unserialize ( Stream & s , uint64_t & a ) { a = ser_readdata64 ( s ) ; }
template < typename Stream , int N > inline void Unserialize ( Stream & s , char ( & a ) [ N ] ) { s . read ( MakeWritableByteSpan ( a ) ) ; }
template < typename Stream , int N > inline void Unserialize ( Stream & s , unsigned char ( & a ) [ N ] ) { s . read ( MakeWritableByteSpan ( a ) ) ; }
template < typename Stream , typenam e B , std : : size_t N > void Unserialize ( Stream & s , std : : array < B , N > & a ) { ( void ) /* force byte-type */ UCharCast ( a . data ( ) ) ; s . read ( MakeWritableByteSpan ( a ) ) ; }
template < typename Stream , typenam e B > void Unserialize ( Stream & s , Span < B > span ) { ( void ) /* force byte-type */ UCharCast ( span . data ( ) ) ; s . read ( AsWritableBytes ( span ) ) ; }
template < typename Stream , BasicByt e B , std : : size_t N > void Unserialize ( Stream & s , std : : array < B , N > & a ) { s . read ( MakeWritableByteSpan ( a ) ) ; }
template < typename Stream , BasicByt e B > void Unserialize ( Stream & s , Span < B > span ) { s . read ( AsWritableBytes ( span ) ) ; }
template < typename Stream > inline void Serialize ( Stream & s , bool a ) { uint8_t f = a ; ser_writedata8 ( s , f ) ; }
template < typename Stream > inline void Unserialize ( Stream & s , bool & a ) { uint8_t f = ser_readdata8 ( s ) ; a = f ; }
@ -755,18 +755,23 @@ template<typename Stream, typename T> void Serialize(Stream& os, const std::uniq
template < typename Stream , typename T > void Unserialize ( Stream & os , std : : unique_ptr < const T > & p ) ;
/**
* If none of the specialized versions above matched , default to calling member function .
*/
template < typename Stream , typename T >
inline void Serialize ( Stream & os , const T & a )
template < class T , class Stream >
concept Serializable = requires ( T a , Stream s ) { a . Serialize ( s ) ; } ;
template < typename Stream , typename T >
requires Serializable < T , Stream >
void Serialize ( Stream & os , const T & a )
{
a . Serialize ( os ) ;
}
template < typename Stream , typename T >
inline void Unserialize ( Stream & is , T & & a )
template < class T , class Stream >
concept Unserializable = requires ( T a , Stream s ) { a . Unserialize ( s ) ; } ;
template < typename Stream , typename T >
requires Unserializable < T , Stream >
void Unserialize ( Stream & is , T & & a )
{
a . Unserialize ( is ) ;
}