@ -151,6 +151,8 @@ inline float ser_uint32_to_float(uint32_t y)
@@ -151,6 +151,8 @@ inline float ser_uint32_to_float(uint32_t y)
// i.e. anything that supports .read(char*, size_t) and .write(char*, size_t)
//
class CSizeComputer ;
enum
{
// primary actions
@ -159,8 +161,8 @@ enum
@@ -159,8 +161,8 @@ enum
SER_GETHASH = ( 1 < < 2 ) ,
} ;
# define READWRITE(obj) (::SerReadWrite(s, (obj), nType, nVersion, ser_action))
# define READWRITEMANY(...) (::SerReadWriteMany(s, nType, nVersion, ser_action, __VA_ARGS__))
# define READWRITE(obj) (::SerReadWrite(s, (obj), ser_action))
# define READWRITEMANY(...) (::SerReadWriteMany(s, ser_action, __VA_ARGS__))
/**
* Implement three methods for serializable objects . These are actually wrappers over
@ -168,63 +170,42 @@ enum
@@ -168,63 +170,42 @@ enum
* code . Adding " ADD_SERIALIZE_METHODS " in the body of the class causes these wrappers to be
* added as members .
*/
# define ADD_SERIALIZE_METHODS \
size_t GetSerializeSize ( int nType , int nVersion ) const { \
CSizeComputer s ( nType , nVersion ) ; \
NCONST_PTR ( this ) - > SerializationOp ( s , CSerActionSerialize ( ) , nType , nVersion ) ; \
return s . size ( ) ; \
} \
template < typename Stream > \
void Serialize ( Stream & s , int nType , int nVersion ) const { \
NCONST_PTR ( this ) - > SerializationOp ( s , CSerActionSerialize ( ) , nType , nVersion ) ; \
} \
template < typename Stream > \
void Unserialize ( Stream & s , int nType , int nVersion ) { \
SerializationOp ( s , CSerActionUnserialize ( ) , nType , nVersion ) ; \
# define ADD_SERIALIZE_METHODS \
template < typename Stream > \
void Serialize ( Stream & s ) const { \
NCONST_PTR ( this ) - > SerializationOp ( s , CSerActionSerialize ( ) ) ; \
} \
template < typename Stream > \
void Unserialize ( Stream & s ) { \
SerializationOp ( s , CSerActionUnserialize ( ) ) ; \
}
/*
* Basic Types
*/
inline unsigned int GetSerializeSize ( char a , int , int = 0 ) { return 1 ; }
inline unsigned int GetSerializeSize ( int8_t a , int , int = 0 ) { return 1 ; }
inline unsigned int GetSerializeSize ( uint8_t a , int , int = 0 ) { return 1 ; }
inline unsigned int GetSerializeSize ( int16_t a , int , int = 0 ) { return 2 ; }
inline unsigned int GetSerializeSize ( uint16_t a , int , int = 0 ) { return 2 ; }
inline unsigned int GetSerializeSize ( int32_t a , int , int = 0 ) { return 4 ; }
inline unsigned int GetSerializeSize ( uint32_t a , int , int = 0 ) { return 4 ; }
inline unsigned int GetSerializeSize ( int64_t a , int , int = 0 ) { return 8 ; }
inline unsigned int GetSerializeSize ( uint64_t a , int , int = 0 ) { return 8 ; }
inline unsigned int GetSerializeSize ( float a , int , int = 0 ) { return 4 ; }
inline unsigned int GetSerializeSize ( double a , int , int = 0 ) { return 8 ; }
template < typename Stream > inline void Serialize ( Stream & s , char a , int , int = 0 ) { ser_writedata8 ( s , a ) ; } // TODO Get rid of bare char
template < typename Stream > inline void Serialize ( Stream & s , int8_t a , int , int = 0 ) { ser_writedata8 ( s , a ) ; }
template < typename Stream > inline void Serialize ( Stream & s , uint8_t a , int , int = 0 ) { ser_writedata8 ( s , a ) ; }
template < typename Stream > inline void Serialize ( Stream & s , int16_t a , int , int = 0 ) { ser_writedata16 ( s , a ) ; }
template < typename Stream > inline void Serialize ( Stream & s , uint16_t a , int , int = 0 ) { ser_writedata16 ( s , a ) ; }
template < typename Stream > inline void Serialize ( Stream & s , int32_t a , int , int = 0 ) { ser_writedata32 ( s , a ) ; }
template < typename Stream > inline void Serialize ( Stream & s , uint32_t a , int , int = 0 ) { ser_writedata32 ( s , a ) ; }
template < typename Stream > inline void Serialize ( Stream & s , int64_t a , int , int = 0 ) { ser_writedata64 ( s , a ) ; }
template < typename Stream > inline void Serialize ( Stream & s , uint64_t a , int , int = 0 ) { ser_writedata64 ( s , a ) ; }
template < typename Stream > inline void Serialize ( Stream & s , float a , int , int = 0 ) { ser_writedata32 ( s , ser_float_to_uint32 ( a ) ) ; }
template < typename Stream > inline void Serialize ( Stream & s , double a , int , int = 0 ) { ser_writedata64 ( s , ser_double_to_uint64 ( a ) ) ; }
template < typename Stream > inline void Unserialize ( Stream & s , char & a , int , int = 0 ) { a = ser_readdata8 ( s ) ; } // TODO Get rid of bare char
template < typename Stream > inline void Unserialize ( Stream & s , int8_t & a , int , int = 0 ) { a = ser_readdata8 ( s ) ; }
template < typename Stream > inline void Unserialize ( Stream & s , uint8_t & a , int , int = 0 ) { a = ser_readdata8 ( s ) ; }
template < typename Stream > inline void Unserialize ( Stream & s , int16_t & a , int , int = 0 ) { a = ser_readdata16 ( s ) ; }
template < typename Stream > inline void Unserialize ( Stream & s , uint16_t & a , int , int = 0 ) { a = ser_readdata16 ( s ) ; }
template < typename Stream > inline void Unserialize ( Stream & s , int32_t & a , int , int = 0 ) { a = ser_readdata32 ( s ) ; }
template < typename Stream > inline void Unserialize ( Stream & s , uint32_t & a , int , int = 0 ) { a = ser_readdata32 ( s ) ; }
template < typename Stream > inline void Unserialize ( Stream & s , int64_t & a , int , int = 0 ) { a = ser_readdata64 ( s ) ; }
template < typename Stream > inline void Unserialize ( Stream & s , uint64_t & a , int , int = 0 ) { a = ser_readdata64 ( s ) ; }
template < typename Stream > inline void Unserialize ( Stream & s , float & a , int , int = 0 ) { a = ser_uint32_to_float ( ser_readdata32 ( s ) ) ; }
template < typename Stream > inline void Unserialize ( Stream & s , double & a , int , int = 0 ) { a = ser_uint64_to_double ( ser_readdata64 ( s ) ) ; }
inline unsigned int GetSerializeSize ( bool a , int , int = 0 ) { return sizeof ( char ) ; }
template < typename Stream > inline void Serialize ( Stream & s , bool a , int , int = 0 ) { char f = a ; ser_writedata8 ( s , f ) ; }
template < typename Stream > inline void Unserialize ( Stream & s , bool & a , int , int = 0 ) { char f = ser_readdata8 ( s ) ; a = f ; }
template < typename Stream > inline void Serialize ( Stream & s , char a ) { ser_writedata8 ( s , a ) ; } // TODO Get rid of bare char
template < typename Stream > inline void Serialize ( Stream & s , int8_t a ) { ser_writedata8 ( s , a ) ; }
template < typename Stream > inline void Serialize ( Stream & s , uint8_t a ) { ser_writedata8 ( s , a ) ; }
template < typename Stream > inline void Serialize ( Stream & s , int16_t a ) { ser_writedata16 ( s , a ) ; }
template < typename Stream > inline void Serialize ( Stream & s , uint16_t a ) { ser_writedata16 ( s , a ) ; }
template < typename Stream > inline void Serialize ( Stream & s , int32_t a ) { ser_writedata32 ( s , a ) ; }
template < typename Stream > inline void Serialize ( Stream & s , uint32_t a ) { ser_writedata32 ( s , a ) ; }
template < typename Stream > inline void Serialize ( Stream & s , int64_t a ) { ser_writedata64 ( s , a ) ; }
template < typename Stream > inline void Serialize ( Stream & s , uint64_t a ) { ser_writedata64 ( s , a ) ; }
template < typename Stream > inline void Serialize ( Stream & s , float a ) { ser_writedata32 ( s , ser_float_to_uint32 ( a ) ) ; }
template < typename Stream > inline void Serialize ( Stream & s , double a ) { ser_writedata64 ( s , ser_double_to_uint64 ( a ) ) ; }
template < typename Stream > inline void Unserialize ( Stream & s , char & a ) { a = ser_readdata8 ( s ) ; } // TODO Get rid of bare char
template < typename Stream > inline void Unserialize ( Stream & s , int8_t & a ) { a = ser_readdata8 ( s ) ; }
template < typename Stream > inline void Unserialize ( Stream & s , uint8_t & a ) { a = ser_readdata8 ( s ) ; }
template < typename Stream > inline void Unserialize ( Stream & s , int16_t & a ) { a = ser_readdata16 ( s ) ; }
template < typename Stream > inline void Unserialize ( Stream & s , uint16_t & a ) { a = ser_readdata16 ( s ) ; }
template < typename Stream > inline void Unserialize ( Stream & s , int32_t & a ) { a = ser_readdata32 ( s ) ; }
template < typename Stream > inline void Unserialize ( Stream & s , uint32_t & a ) { a = ser_readdata32 ( s ) ; }
template < typename Stream > inline void Unserialize ( Stream & s , int64_t & a ) { a = ser_readdata64 ( s ) ; }
template < typename Stream > inline void Unserialize ( Stream & s , uint64_t & a ) { a = ser_readdata64 ( s ) ; }
template < typename Stream > inline void Unserialize ( Stream & s , float & a ) { a = ser_uint32_to_float ( ser_readdata32 ( s ) ) ; }
template < typename Stream > inline void Unserialize ( Stream & s , double & a ) { a = ser_uint64_to_double ( ser_readdata64 ( s ) ) ; }
template < typename Stream > inline void Serialize ( Stream & s , bool a ) { char f = a ; ser_writedata8 ( s , f ) ; }
template < typename Stream > inline void Unserialize ( Stream & s , bool & a ) { char f = ser_readdata8 ( s ) ; a = f ; }
@ -246,6 +227,8 @@ inline unsigned int GetSizeOfCompactSize(uint64_t nSize)
@@ -246,6 +227,8 @@ inline unsigned int GetSizeOfCompactSize(uint64_t nSize)
else return sizeof ( unsigned char ) + sizeof ( uint64_t ) ;
}
inline void WriteCompactSize ( CSizeComputer & os , uint64_t nSize ) ;
template < typename Stream >
void WriteCompactSize ( Stream & os , uint64_t nSize )
{
@ -340,6 +323,9 @@ inline unsigned int GetSizeOfVarInt(I n)
@@ -340,6 +323,9 @@ inline unsigned int GetSizeOfVarInt(I n)
return nRet ;
}
template < typename I >
inline void WriteVarInt ( CSizeComputer & os , I n ) ;
template < typename Stream , typename I >
void WriteVarInt ( Stream & os , I n )
{
@ -403,19 +389,14 @@ public:
@@ -403,19 +389,14 @@ public:
char * end ( ) { return pend ; }
const char * end ( ) const { return pend ; }
unsigned int GetSerializeSize ( int , int = 0 ) const
{
return pend - pbegin ;
}
template < typename Stream >
void Serialize ( Stream & s , int , int = 0 ) const
void Serialize ( Stream & s ) const
{
s . write ( pbegin , pend - pbegin ) ;
}
template < typename Stream >
void Unserialize ( Stream & s , int , int = 0 )
void Unserialize ( Stream & s )
{
s . read ( pbegin , pend - pbegin ) ;
}
@ -429,17 +410,13 @@ protected:
@@ -429,17 +410,13 @@ protected:
public :
CVarInt ( I & nIn ) : n ( nIn ) { }
unsigned int GetSerializeSize ( int , int ) const {
return GetSizeOfVarInt < I > ( n ) ;
}
template < typename Stream >
void Serialize ( Stream & s , int , int ) const {
void Serialize ( Stream & s ) const {
WriteVarInt < Stream , I > ( s , n ) ;
}
template < typename Stream >
void Unserialize ( Stream & s , int , int ) {
void Unserialize ( Stream & s ) {
n = ReadVarInt < Stream , I > ( s ) ;
}
} ;
@ -451,17 +428,13 @@ protected:
@@ -451,17 +428,13 @@ protected:
public :
CCompactSize ( uint64_t & nIn ) : n ( nIn ) { }
unsigned int GetSerializeSize ( int , int ) const {
return GetSizeOfCompactSize ( n ) ;
}
template < typename Stream >
void Serialize ( Stream & s , int , int ) const {
void Serialize ( Stream & s ) const {
WriteCompactSize < Stream > ( s , n ) ;
}
template < typename Stream >
void Unserialize ( Stream & s , int , int ) {
void Unserialize ( Stream & s ) {
n = ReadCompactSize < Stream > ( s ) ;
}
} ;
@ -472,10 +445,10 @@ class LimitedString
@@ -472,10 +445,10 @@ class LimitedString
protected :
std : : string & string ;
public :
LimitedString ( std : : string & string ) : string ( string ) { }
LimitedString ( std : : string & _ string) : string ( _ string) { }
template < typename Stream >
void Unserialize ( Stream & s , int , int = 0 )
void Unserialize ( Stream & s )
{
size_t size = ReadCompactSize ( s ) ;
if ( size > Limit ) {
@ -487,17 +460,12 @@ public:
@@ -487,17 +460,12 @@ public:
}
template < typename Stream >
void Serialize ( Stream & s , int , int = 0 ) const
void Serialize ( Stream & s ) const
{
WriteCompactSize ( s , string . size ( ) ) ;
if ( ! string . empty ( ) )
s . write ( ( char * ) & string [ 0 ] , string . size ( ) ) ;
}
unsigned int GetSerializeSize ( int , int = 0 ) const
{
return GetSizeOfCompactSize ( string . size ( ) ) + string . size ( ) ;
}
} ;
template < typename I >
@ -510,58 +478,48 @@ CVarInt<I> WrapVarInt(I& n) { return CVarInt<I>(n); }
@@ -510,58 +478,48 @@ CVarInt<I> WrapVarInt(I& n) { return CVarInt<I>(n); }
/**
* string
*/
template < typename C > unsigned int GetSerializeSize ( const std : : basic_string < C > & str , int , int = 0 ) ;
template < typename Stream , typename C > void Serialize ( Stream & os , const std : : basic_string < C > & str , int , int = 0 ) ;
template < typename Stream , typename C > void Unserialize ( Stream & is , std : : basic_string < C > & str , int , int = 0 ) ;
template < typename Stream , typename C > void Serialize ( Stream & os , const std : : basic_string < C > & str ) ;
template < typename Stream , typename C > void Unserialize ( Stream & is , std : : basic_string < C > & str ) ;
/**
* prevector
* prevectors of unsigned char are a special case and are intended to be serialized as a single opaque blob .
*/
template < unsigned int N , typename T > unsigned int GetSerializeSize_impl ( const prevector < N , T > & v , int nType , int nVersion , const unsigned char & ) ;
template < unsigned int N , typename T , typename V > unsigned int GetSerializeSize_impl ( const prevector < N , T > & v , int nType , int nVersion , const V & ) ;
template < unsigned int N , typename T > inline unsigned int GetSerializeSize ( const prevector < N , T > & v , int nType , int nVersion ) ;
template < typename Stream , unsigned int N , typename T > void Serialize_impl ( Stream & os , const prevector < N , T > & v , int nType , int nVersion , const unsigned char & ) ;
template < typename Stream , unsigned int N , typename T , typename V > void Serialize_impl ( Stream & os , const prevector < N , T > & v , int nType , int nVersion , const V & ) ;
template < typename Stream , unsigned int N , typename T > inline void Serialize ( Stream & os , const prevector < N , T > & v , int nType , int nVersion ) ;
template < typename Stream , unsigned int N , typename T > void Unserialize_impl ( Stream & is , prevector < N , T > & v , int nType , int nVersion , const unsigned char & ) ;
template < typename Stream , unsigned int N , typename T , typename V > void Unserialize_impl ( Stream & is , prevector < N , T > & v , int nType , int nVersion , const V & ) ;
template < typename Stream , unsigned int N , typename T > inline void Unserialize ( Stream & is , prevector < N , T > & v , int nType , int nVersion ) ;
template < typename Stream , unsigned int N , typename T > void Serialize_impl ( Stream & os , const prevector < N , T > & v , const unsigned char & ) ;
template < typename Stream , unsigned int N , typename T , typename V > void Serialize_impl ( Stream & os , const prevector < N , T > & v , const V & ) ;
template < typename Stream , unsigned int N , typename T > inline void Serialize ( Stream & os , const prevector < N , T > & v ) ;
template < typename Stream , unsigned int N , typename T > void Unserialize_impl ( Stream & is , prevector < N , T > & v , const unsigned char & ) ;
template < typename Stream , unsigned int N , typename T , typename V > void Unserialize_impl ( Stream & is , prevector < N , T > & v , const V & ) ;
template < typename Stream , unsigned int N , typename T > inline void Unserialize ( Stream & is , prevector < N , T > & v ) ;
/**
* vector
* vectors of unsigned char are a special case and are intended to be serialized as a single opaque blob .
*/
template < typename T , typename A > unsigned int GetSerializeSize_impl ( const std : : vector < T , A > & v , int nType , int nVersion , const unsigned char & ) ;
template < typename T , typename A , typename V > unsigned int GetSerializeSize_impl ( const std : : vector < T , A > & v , int nType , int nVersion , const V & ) ;
template < typename T , typename A > inline unsigned int GetSerializeSize ( const std : : vector < T , A > & v , int nType , int nVersion ) ;
template < typename Stream , typename T , typename A > void Serialize_impl ( Stream & os , const std : : vector < T , A > & v , int nType , int nVersion , const unsigned char & ) ;
template < typename Stream , typename T , typename A , typename V > void Serialize_impl ( Stream & os , const std : : vector < T , A > & v , int nType , int nVersion , const V & ) ;
template < typename Stream , typename T , typename A > inline void Serialize ( Stream & os , const std : : vector < T , A > & v , int nType , int nVersion ) ;
template < typename Stream , typename T , typename A > void Unserialize_impl ( Stream & is , std : : vector < T , A > & v , int nType , int nVersion , const unsigned char & ) ;
template < typename Stream , typename T , typename A , typename V > void Unserialize_impl ( Stream & is , std : : vector < T , A > & v , int nType , int nVersion , const V & ) ;
template < typename Stream , typename T , typename A > inline void Unserialize ( Stream & is , std : : vector < T , A > & v , int nType , int nVersion ) ;
template < typename Stream , typename T , typename A > void Serialize_impl ( Stream & os , const std : : vector < T , A > & v , const unsigned char & ) ;
template < typename Stream , typename T , typename A , typename V > void Serialize_impl ( Stream & os , const std : : vector < T , A > & v , const V & ) ;
template < typename Stream , typename T , typename A > inline void Serialize ( Stream & os , const std : : vector < T , A > & v ) ;
template < typename Stream , typename T , typename A > void Unserialize_impl ( Stream & is , std : : vector < T , A > & v , const unsigned char & ) ;
template < typename Stream , typename T , typename A , typename V > void Unserialize_impl ( Stream & is , std : : vector < T , A > & v , const V & ) ;
template < typename Stream , typename T , typename A > inline void Unserialize ( Stream & is , std : : vector < T , A > & v ) ;
/**
* pair
*/
template < typename K , typename T > unsigned int GetSerializeSize ( const std : : pair < K , T > & item , int nType , int nVersion ) ;
template < typename Stream , typename K , typename T > void Serialize ( Stream & os , const std : : pair < K , T > & item , int nType , int nVersion ) ;
template < typename Stream , typename K , typename T > void Unserialize ( Stream & is , std : : pair < K , T > & item , int nType , int nVersion ) ;
template < typename Stream , typename K , typename T > void Serialize ( Stream & os , const std : : pair < K , T > & item ) ;
template < typename Stream , typename K , typename T > void Unserialize ( Stream & is , std : : pair < K , T > & item ) ;
/**
* map
*/
template < typename K , typename T , typename Pred , typename A > unsigned int GetSerializeSize ( const std : : map < K , T , Pred , A > & m , int nType , int nVersion ) ;
template < typename Stream , typename K , typename T , typename Pred , typename A > void Serialize ( Stream & os , const std : : map < K , T , Pred , A > & m , int nType , int nVersion ) ;
template < typename Stream , typename K , typename T , typename Pred , typename A > void Unserialize ( Stream & is , std : : map < K , T , Pred , A > & m , int nType , int nVersion ) ;
template < typename Stream , typename K , typename T , typename Pred , typename A > void Serialize ( Stream & os , const std : : map < K , T , Pred , A > & m ) ;
template < typename Stream , typename K , typename T , typename Pred , typename A > void Unserialize ( Stream & is , std : : map < K , T , Pred , A > & m ) ;
/**
* set
*/
template < typename K , typename Pred , typename A > unsigned int GetSerializeSize ( const std : : set < K , Pred , A > & m , int nType , int nVersion ) ;
template < typename Stream , typename K , typename Pred , typename A > void Serialize ( Stream & os , const std : : set < K , Pred , A > & m , int nType , int nVersion ) ;
template < typename Stream , typename K , typename Pred , typename A > void Unserialize ( Stream & is , std : : set < K , Pred , A > & m , int nType , int nVersion ) ;
template < typename Stream , typename K , typename Pred , typename A > void Serialize ( Stream & os , const std : : set < K , Pred , A > & m ) ;
template < typename Stream , typename K , typename Pred , typename A > void Unserialize ( Stream & is , std : : set < K , Pred , A > & m ) ;
@ -569,26 +527,17 @@ template<typename Stream, typename K, typename Pred, typename A> void Unserializ
@@ -569,26 +527,17 @@ template<typename Stream, typename K, typename Pred, typename A> void Unserializ
/**
* If none of the specialized versions above matched , default to calling member function .
* " int nType " is changed to " long nType " to keep from getting an ambiguous overload error .
* The compiler will only cast int to long if none of the other templates matched .
* Thanks to Boost serialization for this idea .
*/
template < typename T >
inline unsigned int GetSerializeSize ( const T & a , long nType , int nVersion )
{
return a . GetSerializeSize ( ( int ) nType , nVersion ) ;
}
template < typename Stream , typename T >
inline void Serialize ( Stream & os , const T & a , long nType , int nVersion )
inline void Serialize ( Stream & os , const T & a )
{
a . Serialize ( os , ( int ) nType , nVersion ) ;
a . Serialize ( os ) ;
}
template < typename Stream , typename T >
inline void Unserialize ( Stream & is , T & a , long nType , int nVersion )
inline void Unserialize ( Stream & is , T & a )
{
a . Unserialize ( is , ( int ) nType , nVersion ) ;
a . Unserialize ( is ) ;
}
@ -598,14 +547,8 @@ inline void Unserialize(Stream& is, T& a, long nType, int nVersion)
@@ -598,14 +547,8 @@ inline void Unserialize(Stream& is, T& a, long nType, int nVersion)
/**
* string
*/
template < typename C >
unsigned int GetSerializeSize ( const std : : basic_string < C > & str , int , int )
{
return GetSizeOfCompactSize ( str . size ( ) ) + str . size ( ) * sizeof ( str [ 0 ] ) ;
}
template < typename Stream , typename C >
void Serialize ( Stream & os , const std : : basic_string < C > & str , int , int )
void Serialize ( Stream & os , const std : : basic_string < C > & str )
{
WriteCompactSize ( os , str . size ( ) ) ;
if ( ! str . empty ( ) )
@ -613,7 +556,7 @@ void Serialize(Stream& os, const std::basic_string<C>& str, int, int)
@@ -613,7 +556,7 @@ void Serialize(Stream& os, const std::basic_string<C>& str, int, int)
}
template < typename Stream , typename C >
void Unserialize ( Stream & is , std : : basic_string < C > & str , int , int )
void Unserialize ( Stream & is , std : : basic_string < C > & str )
{
unsigned int nSize = ReadCompactSize ( is ) ;
str . resize ( nSize ) ;
@ -626,30 +569,8 @@ void Unserialize(Stream& is, std::basic_string<C>& str, int, int)
@@ -626,30 +569,8 @@ void Unserialize(Stream& is, std::basic_string<C>& str, int, int)
/**
* prevector
*/
template < unsigned int N , typename T >
unsigned int GetSerializeSize_impl ( const prevector < N , T > & v , int nType , int nVersion , const unsigned char & )
{
return ( GetSizeOfCompactSize ( v . size ( ) ) + v . size ( ) * sizeof ( T ) ) ;
}
template < unsigned int N , typename T , typename V >
unsigned int GetSerializeSize_impl ( const prevector < N , T > & v , int nType , int nVersion , const V & )
{
unsigned int nSize = GetSizeOfCompactSize ( v . size ( ) ) ;
for ( typename prevector < N , T > : : const_iterator vi = v . begin ( ) ; vi ! = v . end ( ) ; + + vi )
nSize + = GetSerializeSize ( ( * vi ) , nType , nVersion ) ;
return nSize ;
}
template < unsigned int N , typename T >
inline unsigned int GetSerializeSize ( const prevector < N , T > & v , int nType , int nVersion )
{
return GetSerializeSize_impl ( v , nType , nVersion , T ( ) ) ;
}
template < typename Stream , unsigned int N , typename T >
void Serialize_impl ( Stream & os , const prevector < N , T > & v , int nType , int nVersion , const unsigned char & )
void Serialize_impl ( Stream & os , const prevector < N , T > & v , const unsigned char & )
{
WriteCompactSize ( os , v . size ( ) ) ;
if ( ! v . empty ( ) )
@ -657,22 +578,22 @@ void Serialize_impl(Stream& os, const prevector<N, T>& v, int nType, int nVersio
@@ -657,22 +578,22 @@ void Serialize_impl(Stream& os, const prevector<N, T>& v, int nType, int nVersio
}
template < typename Stream , unsigned int N , typename T , typename V >
void Serialize_impl ( Stream & os , const prevector < N , T > & v , int nType , int nVersion , const V & )
void Serialize_impl ( Stream & os , const prevector < N , T > & v , const V & )
{
WriteCompactSize ( os , v . size ( ) ) ;
for ( typename prevector < N , T > : : const_iterator vi = v . begin ( ) ; vi ! = v . end ( ) ; + + vi )
: : Serialize ( os , ( * vi ) , nType , nVersion ) ;
: : Serialize ( os , ( * vi ) ) ;
}
template < typename Stream , unsigned int N , typename T >
inline void Serialize ( Stream & os , const prevector < N , T > & v , int nType , int nVersion )
inline void Serialize ( Stream & os , const prevector < N , T > & v )
{
Serialize_impl ( os , v , nType , nVersion , T ( ) ) ;
Serialize_impl ( os , v , T ( ) ) ;
}
template < typename Stream , unsigned int N , typename T >
void Unserialize_impl ( Stream & is , prevector < N , T > & v , int nType , int nVersion , const unsigned char & )
void Unserialize_impl ( Stream & is , prevector < N , T > & v , const unsigned char & )
{
// Limit size per read so bogus size value won't cause out of memory
v . clear ( ) ;
@ -688,7 +609,7 @@ void Unserialize_impl(Stream& is, prevector<N, T>& v, int nType, int nVersion, c
@@ -688,7 +609,7 @@ void Unserialize_impl(Stream& is, prevector<N, T>& v, int nType, int nVersion, c
}
template < typename Stream , unsigned int N , typename T , typename V >
void Unserialize_impl ( Stream & is , prevector < N , T > & v , int nType , int nVersion , const V & )
void Unserialize_impl ( Stream & is , prevector < N , T > & v , const V & )
{
v . clear ( ) ;
unsigned int nSize = ReadCompactSize ( is ) ;
@ -701,14 +622,14 @@ void Unserialize_impl(Stream& is, prevector<N, T>& v, int nType, int nVersion, c
@@ -701,14 +622,14 @@ void Unserialize_impl(Stream& is, prevector<N, T>& v, int nType, int nVersion, c
nMid = nSize ;
v . resize ( nMid ) ;
for ( ; i < nMid ; i + + )
Unserialize ( is , v [ i ] , nType , nVersion ) ;
Unserialize ( is , v [ i ] ) ;
}
}
template < typename Stream , unsigned int N , typename T >
inline void Unserialize ( Stream & is , prevector < N , T > & v , int nType , int nVersion )
inline void Unserialize ( Stream & is , prevector < N , T > & v )
{
Unserialize_impl ( is , v , nType , nVersion , T ( ) ) ;
Unserialize_impl ( is , v , T ( ) ) ;
}
@ -716,30 +637,8 @@ inline void Unserialize(Stream& is, prevector<N, T>& v, int nType, int nVersion)
@@ -716,30 +637,8 @@ inline void Unserialize(Stream& is, prevector<N, T>& v, int nType, int nVersion)
/**
* vector
*/
template < typename T , typename A >
unsigned int GetSerializeSize_impl ( const std : : vector < T , A > & v , int nType , int nVersion , const unsigned char & )
{
return ( GetSizeOfCompactSize ( v . size ( ) ) + v . size ( ) * sizeof ( T ) ) ;
}
template < typename T , typename A , typename V >
unsigned int GetSerializeSize_impl ( const std : : vector < T , A > & v , int nType , int nVersion , const V & )
{
unsigned int nSize = GetSizeOfCompactSize ( v . size ( ) ) ;
for ( typename std : : vector < T , A > : : const_iterator vi = v . begin ( ) ; vi ! = v . end ( ) ; + + vi )
nSize + = GetSerializeSize ( ( * vi ) , nType , nVersion ) ;
return nSize ;
}
template < typename T , typename A >
inline unsigned int GetSerializeSize ( const std : : vector < T , A > & v , int nType , int nVersion )
{
return GetSerializeSize_impl ( v , nType , nVersion , T ( ) ) ;
}
template < typename Stream , typename T , typename A >
void Serialize_impl ( Stream & os , const std : : vector < T , A > & v , int nType , int nVersion , const unsigned char & )
void Serialize_impl ( Stream & os , const std : : vector < T , A > & v , const unsigned char & )
{
WriteCompactSize ( os , v . size ( ) ) ;
if ( ! v . empty ( ) )
@ -747,22 +646,22 @@ void Serialize_impl(Stream& os, const std::vector<T, A>& v, int nType, int nVers
@@ -747,22 +646,22 @@ void Serialize_impl(Stream& os, const std::vector<T, A>& v, int nType, int nVers
}
template < typename Stream , typename T , typename A , typename V >
void Serialize_impl ( Stream & os , const std : : vector < T , A > & v , int nType , int nVersion , const V & )
void Serialize_impl ( Stream & os , const std : : vector < T , A > & v , const V & )
{
WriteCompactSize ( os , v . size ( ) ) ;
for ( typename std : : vector < T , A > : : const_iterator vi = v . begin ( ) ; vi ! = v . end ( ) ; + + vi )
: : Serialize ( os , ( * vi ) , nType , nVersion ) ;
: : Serialize ( os , ( * vi ) ) ;
}
template < typename Stream , typename T , typename A >
inline void Serialize ( Stream & os , const std : : vector < T , A > & v , int nType , int nVersion )
inline void Serialize ( Stream & os , const std : : vector < T , A > & v )
{
Serialize_impl ( os , v , nType , nVersion , T ( ) ) ;
Serialize_impl ( os , v , T ( ) ) ;
}
template < typename Stream , typename T , typename A >
void Unserialize_impl ( Stream & is , std : : vector < T , A > & v , int nType , int nVersion , const unsigned char & )
void Unserialize_impl ( Stream & is , std : : vector < T , A > & v , const unsigned char & )
{
// Limit size per read so bogus size value won't cause out of memory
v . clear ( ) ;
@ -778,7 +677,7 @@ void Unserialize_impl(Stream& is, std::vector<T, A>& v, int nType, int nVersion,
@@ -778,7 +677,7 @@ void Unserialize_impl(Stream& is, std::vector<T, A>& v, int nType, int nVersion,
}
template < typename Stream , typename T , typename A , typename V >
void Unserialize_impl ( Stream & is , std : : vector < T , A > & v , int nType , int nVersion , const V & )
void Unserialize_impl ( Stream & is , std : : vector < T , A > & v , const V & )
{
v . clear ( ) ;
unsigned int nSize = ReadCompactSize ( is ) ;
@ -791,14 +690,14 @@ void Unserialize_impl(Stream& is, std::vector<T, A>& v, int nType, int nVersion,
@@ -791,14 +690,14 @@ void Unserialize_impl(Stream& is, std::vector<T, A>& v, int nType, int nVersion,
nMid = nSize ;
v . resize ( nMid ) ;
for ( ; i < nMid ; i + + )
Unserialize ( is , v [ i ] , nType , nVersion ) ;
Unserialize ( is , v [ i ] ) ;
}
}
template < typename Stream , typename T , typename A >
inline void Unserialize ( Stream & is , std : : vector < T , A > & v , int nType , int nVersion )
inline void Unserialize ( Stream & is , std : : vector < T , A > & v )
{
Unserialize_impl ( is , v , nType , nVersion , T ( ) ) ;
Unserialize_impl ( is , v , T ( ) ) ;
}
@ -806,24 +705,18 @@ inline void Unserialize(Stream& is, std::vector<T, A>& v, int nType, int nVersio
@@ -806,24 +705,18 @@ inline void Unserialize(Stream& is, std::vector<T, A>& v, int nType, int nVersio
/**
* pair
*/
template < typename K , typename T >
unsigned int GetSerializeSize ( const std : : pair < K , T > & item , int nType , int nVersion )
{
return GetSerializeSize ( item . first , nType , nVersion ) + GetSerializeSize ( item . second , nType , nVersion ) ;
}
template < typename Stream , typename K , typename T >
void Serialize ( Stream & os , const std : : pair < K , T > & item , int nType , int nVersion )
void Serialize ( Stream & os , const std : : pair < K , T > & item )
{
Serialize ( os , item . first , nType , nVersion ) ;
Serialize ( os , item . second , nType , nVersion ) ;
Serialize ( os , item . first ) ;
Serialize ( os , item . second ) ;
}
template < typename Stream , typename K , typename T >
void Unserialize ( Stream & is , std : : pair < K , T > & item , int nType , int nVersion )
void Unserialize ( Stream & is , std : : pair < K , T > & item )
{
Unserialize ( is , item . first , nType , nVersion ) ;
Unserialize ( is , item . second , nType , nVersion ) ;
Unserialize ( is , item . first ) ;
Unserialize ( is , item . second ) ;
}
@ -831,25 +724,16 @@ void Unserialize(Stream& is, std::pair<K, T>& item, int nType, int nVersion)
@@ -831,25 +724,16 @@ void Unserialize(Stream& is, std::pair<K, T>& item, int nType, int nVersion)
/**
* map
*/
template < typename K , typename T , typename Pred , typename A >
unsigned int GetSerializeSize ( const std : : map < K , T , Pred , A > & m , int nType , int nVersion )
{
unsigned int nSize = GetSizeOfCompactSize ( m . size ( ) ) ;
for ( typename std : : map < K , T , Pred , A > : : const_iterator mi = m . begin ( ) ; mi ! = m . end ( ) ; + + mi )
nSize + = GetSerializeSize ( ( * mi ) , nType , nVersion ) ;
return nSize ;
}
template < typename Stream , typename K , typename T , typename Pred , typename A >
void Serialize ( Stream & os , const std : : map < K , T , Pred , A > & m , int nType , int nVersion )
void Serialize ( Stream & os , const std : : map < K , T , Pred , A > & m )
{
WriteCompactSize ( os , m . size ( ) ) ;
for ( typename std : : map < K , T , Pred , A > : : const_iterator mi = m . begin ( ) ; mi ! = m . end ( ) ; + + mi )
Serialize ( os , ( * mi ) , nType , nVersion ) ;
Serialize ( os , ( * mi ) ) ;
}
template < typename Stream , typename K , typename T , typename Pred , typename A >
void Unserialize ( Stream & is , std : : map < K , T , Pred , A > & m , int nType , int nVersion )
void Unserialize ( Stream & is , std : : map < K , T , Pred , A > & m )
{
m . clear ( ) ;
unsigned int nSize = ReadCompactSize ( is ) ;
@ -857,7 +741,7 @@ void Unserialize(Stream& is, std::map<K, T, Pred, A>& m, int nType, int nVersion
@@ -857,7 +741,7 @@ void Unserialize(Stream& is, std::map<K, T, Pred, A>& m, int nType, int nVersion
for ( unsigned int i = 0 ; i < nSize ; i + + )
{
std : : pair < K , T > item ;
Unserialize ( is , item , nType , nVersion ) ;
Unserialize ( is , item ) ;
mi = m . insert ( mi , item ) ;
}
}
@ -867,25 +751,16 @@ void Unserialize(Stream& is, std::map<K, T, Pred, A>& m, int nType, int nVersion
@@ -867,25 +751,16 @@ void Unserialize(Stream& is, std::map<K, T, Pred, A>& m, int nType, int nVersion
/**
* set
*/
template < typename K , typename Pred , typename A >
unsigned int GetSerializeSize ( const std : : set < K , Pred , A > & m , int nType , int nVersion )
{
unsigned int nSize = GetSizeOfCompactSize ( m . size ( ) ) ;
for ( typename std : : set < K , Pred , A > : : const_iterator it = m . begin ( ) ; it ! = m . end ( ) ; + + it )
nSize + = GetSerializeSize ( ( * it ) , nType , nVersion ) ;
return nSize ;
}
template < typename Stream , typename K , typename Pred , typename A >
void Serialize ( Stream & os , const std : : set < K , Pred , A > & m , int nType , int nVersion )
void Serialize ( Stream & os , const std : : set < K , Pred , A > & m )
{
WriteCompactSize ( os , m . size ( ) ) ;
for ( typename std : : set < K , Pred , A > : : const_iterator it = m . begin ( ) ; it ! = m . end ( ) ; + + it )
Serialize ( os , ( * it ) , nType , nVersion ) ;
Serialize ( os , ( * it ) ) ;
}
template < typename Stream , typename K , typename Pred , typename A >
void Unserialize ( Stream & is , std : : set < K , Pred , A > & m , int nType , int nVersion )
void Unserialize ( Stream & is , std : : set < K , Pred , A > & m )
{
m . clear ( ) ;
unsigned int nSize = ReadCompactSize ( is ) ;
@ -893,7 +768,7 @@ void Unserialize(Stream& is, std::set<K, Pred, A>& m, int nType, int nVersion)
@@ -893,7 +768,7 @@ void Unserialize(Stream& is, std::set<K, Pred, A>& m, int nType, int nVersion)
for ( unsigned int i = 0 ; i < nSize ; i + + )
{
K key ;
Unserialize ( is , key , nType , nVersion ) ;
Unserialize ( is , key ) ;
it = m . insert ( it , key ) ;
}
}
@ -905,23 +780,23 @@ void Unserialize(Stream& is, std::set<K, Pred, A>& m, int nType, int nVersion)
@@ -905,23 +780,23 @@ void Unserialize(Stream& is, std::set<K, Pred, A>& m, int nType, int nVersion)
*/
struct CSerActionSerialize
{
bool ForRead ( ) const { return false ; }
constexpr bool ForRead ( ) const { return false ; }
} ;
struct CSerActionUnserialize
{
bool ForRead ( ) const { return true ; }
constexpr bool ForRead ( ) const { return true ; }
} ;
template < typename Stream , typename T >
inline void SerReadWrite ( Stream & s , const T & obj , int nType , int nVersion , CSerActionSerialize ser_action )
inline void SerReadWrite ( Stream & s , const T & obj , CSerActionSerialize ser_action )
{
: : Serialize ( s , obj , nType , nVersion ) ;
: : Serialize ( s , obj ) ;
}
template < typename Stream , typename T >
inline void SerReadWrite ( Stream & s , T & obj , int nType , int nVersion , CSerActionUnserialize ser_action )
inline void SerReadWrite ( Stream & s , T & obj , CSerActionUnserialize ser_action )
{
: : Unserialize ( s , obj , nType , nVersion ) ;
: : Unserialize ( s , obj ) ;
}
@ -932,81 +807,122 @@ inline void SerReadWrite(Stream& s, T& obj, int nType, int nVersion, CSerActionU
@@ -932,81 +807,122 @@ inline void SerReadWrite(Stream& s, T& obj, int nType, int nVersion, CSerActionU
/* ::GetSerializeSize implementations
*
* Computing the serialized size of objects is done through a special stream
* object of type CSizeComputer , which only records the number of bytes written
* to it .
*
* If your Serialize or SerializationOp method has non - trivial overhead for
* serialization , it may be worthwhile to implement a specialized version for
* CSizeComputer , which uses the s . seek ( ) method to record bytes that would
* be written instead .
*/
class CSizeComputer
{
protected :
size_t nSize ;
const int nType ;
const int nVersion ;
public :
int nType ;
int nVersion ;
CSizeComputer ( int nTypeIn , int nVersionIn ) : nSize ( 0 ) , nType ( nTypeIn ) , nVersion ( nVersionIn ) { }
CSizeComputer & write ( const char * psz , size_t nSize )
void write ( const char * psz , size_t _nSize )
{
this - > nSize + = _nSize ;
}
/** Pretend _nSize bytes are written, without specifying them. */
void seek ( size_t _nSize )
{
this - > nSize + = nSize ;
return * this ;
this - > nSize + = _nSize ;
}
template < typename T >
CSizeComputer & operator < < ( const T & obj )
{
: : Serialize ( * this , obj , nType , nVersion ) ;
: : Serialize ( * this , obj ) ;
return ( * this ) ;
}
size_t size ( ) const {
return nSize ;
}
int GetVersion ( ) const { return nVersion ; }
int GetType ( ) const { return nType ; }
} ;
template < typename Stream >
void SerializeMany ( Stream & s , int nType , int nVersion )
void SerializeMany ( Stream & s )
{
}
template < typename Stream , typename Arg >
void SerializeMany ( Stream & s , int nType , int nVersion , Arg & & arg )
void SerializeMany ( Stream & s , Arg & & arg )
{
: : Serialize ( s , std : : forward < Arg > ( arg ) , nType , nVersion ) ;
: : Serialize ( s , std : : forward < Arg > ( arg ) ) ;
}
template < typename Stream , typename Arg , typename . . . Args >
void SerializeMany ( Stream & s , int nType , int nVersion , Arg & & arg , Args & & . . . args )
void SerializeMany ( Stream & s , Arg & & arg , Args & & . . . args )
{
: : Serialize ( s , std : : forward < Arg > ( arg ) , nType , nVersion ) ;
: : SerializeMany ( s , nType , nVersion , std : : forward < Args > ( args ) . . . ) ;
: : Serialize ( s , std : : forward < Arg > ( arg ) ) ;
: : SerializeMany ( s , std : : forward < Args > ( args ) . . . ) ;
}
template < typename Stream >
inline void UnserializeMany ( Stream & s , int nType , int nVersion )
inline void UnserializeMany ( Stream & s )
{
}
template < typename Stream , typename Arg >
inline void UnserializeMany ( Stream & s , int nType , int nVersion , Arg & arg )
inline void UnserializeMany ( Stream & s , Arg & arg )
{
: : Unserialize ( s , arg , nType , nVersion ) ;
: : Unserialize ( s , arg ) ;
}
template < typename Stream , typename Arg , typename . . . Args >
inline void UnserializeMany ( Stream & s , int nType , int nVersion , Arg & arg , Args & . . . args )
inline void UnserializeMany ( Stream & s , Arg & arg , Args & . . . args )
{
: : Unserialize ( s , arg , nType , nVersion ) ;
: : UnserializeMany ( s , nType , nVersion , args . . . ) ;
: : Unserialize ( s , arg ) ;
: : UnserializeMany ( s , args . . . ) ;
}
template < typename Stream , typename . . . Args >
inline void SerReadWriteMany ( Stream & s , int nType , int nVersion , CSerActionSerialize ser_action , Args & & . . . args )
inline void SerReadWriteMany ( Stream & s , CSerActionSerialize ser_action , Args & & . . . args )
{
: : SerializeMany ( s , nType , nVersion , std : : forward < Args > ( args ) . . . ) ;
: : SerializeMany ( s , std : : forward < Args > ( args ) . . . ) ;
}
template < typename Stream , typename . . . Args >
inline void SerReadWriteMany ( Stream & s , int nType , int nVersion , CSerActionUnserialize ser_action , Args & . . . args )
inline void SerReadWriteMany ( Stream & s , CSerActionUnserialize ser_action , Args & . . . args )
{
: : UnserializeMany ( s , args . . . ) ;
}
template < typename I >
inline void WriteVarInt ( CSizeComputer & s , I n )
{
s . seek ( GetSizeOfVarInt < I > ( n ) ) ;
}
inline void WriteCompactSize ( CSizeComputer & s , uint64_t nSize )
{
s . seek ( GetSizeOfCompactSize ( nSize ) ) ;
}
template < typename T >
size_t GetSerializeSize ( const T & t , int nType , int nVersion = 0 )
{
return ( CSizeComputer ( nType , nVersion ) < < t ) . size ( ) ;
}
template < typename S , typename T >
size_t GetSerializeSize ( const S & s , const T & t )
{
: : UnserializeMany ( s , nType , nVersion , args . . . ) ;
return ( CSizeComputer ( s . GetType ( ) , s . GetVersion ( ) ) < < t ) . size ( ) ;
}
# endif // BITCOIN_SERIALIZE_H