6 #ifndef BITCOIN_SERIALIZE_H 7 #define BITCOIN_SERIALIZE_H 26 static const unsigned int MAX_SIZE = 0x02000000;
33 inline T&
REF(
const T& val)
35 return const_cast<T&
>(val);
45 return const_cast<T*
>(val);
56 return v.empty() ? NULL : &v[0];
60 inline const typename V::value_type*
begin_ptr(
const V& v)
62 return v.empty() ? NULL : &v[0];
66 inline typename V::value_type*
end_ptr(V& v)
68 return v.empty() ? NULL : (&v[0] + v.size());
72 inline const typename V::value_type*
end_ptr(
const V& v)
74 return v.empty() ? NULL : (&v[0] + v.size());
83 s.write((
char*)&obj, 1);
88 s.write((
char*)&obj, 2);
93 s.write((
char*)&obj, 4);
98 s.write((
char*)&obj, 4);
103 s.write((
char*)&obj, 8);
108 s.read((
char*)&obj, 1);
114 s.read((
char*)&obj, 2);
120 s.read((
char*)&obj, 4);
126 s.read((
char*)&obj, 4);
132 s.read((
char*)&obj, 8);
137 union {
double x; uint64_t y; } tmp;
143 union {
float x; uint32_t y; } tmp;
149 union {
double x; uint64_t y; } tmp;
155 union {
float x; uint32_t y; } tmp;
175 #define READWRITE(obj) (::SerReadWrite(s, (obj), nType, nVersion, ser_action)) 176 #define READWRITEMANY(...) (::SerReadWriteMany(s, nType, nVersion, ser_action, __VA_ARGS__)) 184 #define ADD_SERIALIZE_METHODS \ 185 size_t GetSerializeSize(int nType, int nVersion) const { \ 186 CSizeComputer s(nType, nVersion); \ 187 NCONST_PTR(this)->SerializationOp(s, CSerActionSerialize(), nType, nVersion);\ 190 template<typename Stream> \ 191 void Serialize(Stream& s, int nType, int nVersion) const { \ 192 NCONST_PTR(this)->SerializationOp(s, CSerActionSerialize(), nType, nVersion);\ 194 template<typename Stream> \ 195 void Unserialize(Stream& s, int nType, int nVersion) { \ 196 SerializationOp(s, CSerActionUnserialize(), nType, nVersion); \ 256 if (nSize < 253)
return sizeof(
unsigned char);
257 else if (nSize <= std::numeric_limits<unsigned short>::max())
return sizeof(
unsigned char) +
sizeof(
unsigned short);
258 else if (nSize <= std::numeric_limits<unsigned int>::max())
return sizeof(
unsigned char) +
sizeof(
unsigned int);
259 else return sizeof(
unsigned char) +
sizeof(uint64_t);
262 template<
typename Stream>
269 else if (nSize <= std::numeric_limits<unsigned short>::max())
274 else if (nSize <= std::numeric_limits<unsigned int>::max())
287 template<
typename Stream>
291 uint64_t nSizeRet = 0;
296 else if (chSize == 253)
300 throw std::ios_base::failure(
"non-canonical ReadCompactSize()");
302 else if (chSize == 254)
305 if (nSizeRet < 0x10000u)
306 throw std::ios_base::failure(
"non-canonical ReadCompactSize()");
311 if (nSizeRet < 0x100000000ULL)
312 throw std::ios_base::failure(
"non-canonical ReadCompactSize()");
315 throw std::ios_base::failure(
"ReadCompactSize(): size too large");
356 template<
typename Stream,
typename I>
359 unsigned char tmp[(
sizeof(
n)*8+6)/7];
362 tmp[len] = (
n & 0x7F) | (len ? 0x80 : 0x00);
373 template<
typename Stream,
typename I>
379 n = (
n << 7) | (chData & 0x7F);
387 #define FLATDATA(obj) REF(CFlatData((char*)&(obj), (char*)&(obj) + sizeof(obj))) 388 #define VARINT(obj) REF(WrapVarInt(REF(obj))) 389 #define LIMITED_STRING(obj,n) REF(LimitedString< n >(REF(obj))) 401 template <
class T,
class TAl>
407 template <
unsigned int N,
typename T,
typename S,
typename D>
423 template<
typename Stream>
429 template<
typename Stream>
445 return GetSizeOfVarInt<I>(
n);
448 template<
typename Stream>
450 WriteVarInt<Stream,I>(s,
n);
453 template<
typename Stream>
455 n = ReadVarInt<Stream,I>(s);
459 template<
size_t Limit>
467 template<
typename Stream>
472 throw std::ios_base::failure(
"String length limit exceeded");
476 s.read((
char*)&
string[0], size);
479 template<
typename Stream>
484 s.write((
char*)&
string[0],
string.size());
503 template<
typename C>
unsigned int GetSerializeSize(
const std::basic_string<C>& str,
int,
int=0);
504 template<
typename Stream,
typename C>
void Serialize(Stream& os,
const std::basic_string<C>& str,
int,
int=0);
505 template<
typename Stream,
typename C>
void Unserialize(Stream& is, std::basic_string<C>& str,
int,
int=0);
514 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&);
515 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&);
516 template<
typename Stream,
unsigned int N,
typename T>
inline void Serialize(Stream& os,
const prevector<N, T>& v,
int nType,
int nVersion);
517 template<
typename Stream,
unsigned int N,
typename T>
void Unserialize_impl(Stream& is,
prevector<N, T>& v,
int nType,
int nVersion,
const unsigned char&);
518 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&);
519 template<
typename Stream,
unsigned int N,
typename T>
inline void Unserialize(Stream& is,
prevector<N, T>& v,
int nType,
int nVersion);
525 template<
typename T,
typename A>
unsigned int GetSerializeSize_impl(
const std::vector<T, A>& v,
int nType,
int nVersion,
const unsigned char&);
526 template<
typename T,
typename A,
typename V>
unsigned int GetSerializeSize_impl(
const std::vector<T, A>& v,
int nType,
int nVersion,
const V&);
527 template<
typename T,
typename A>
inline unsigned int GetSerializeSize(
const std::vector<T, A>& v,
int nType,
int nVersion);
528 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&);
529 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&);
530 template<
typename Stream,
typename T,
typename A>
inline void Serialize(Stream& os,
const std::vector<T, A>& v,
int nType,
int nVersion);
531 template<
typename Stream,
typename T,
typename A>
void Unserialize_impl(Stream& is, std::vector<T, A>& v,
int nType,
int nVersion,
const unsigned char&);
532 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&);
533 template<
typename Stream,
typename T,
typename A>
inline void Unserialize(Stream& is, std::vector<T, A>& v,
int nType,
int nVersion);
538 template<
typename K,
typename T>
unsigned int GetSerializeSize(
const std::pair<K, T>& item,
int nType,
int nVersion);
539 template<
typename Stream,
typename K,
typename T>
void Serialize(Stream& os,
const std::pair<K, T>& item,
int nType,
int nVersion);
540 template<
typename Stream,
typename K,
typename T>
void Unserialize(Stream& is, std::pair<K, T>& item,
int nType,
int nVersion);
545 template<
typename K,
typename T,
typename Pred,
typename A>
unsigned int GetSerializeSize(
const std::map<K, T, Pred, A>&
m,
int nType,
int nVersion);
546 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);
547 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);
552 template<
typename K,
typename Pred,
typename A>
unsigned int GetSerializeSize(
const std::set<K, Pred, A>&
m,
int nType,
int nVersion);
553 template<
typename Stream,
typename K,
typename Pred,
typename A>
void Serialize(Stream& os,
const std::set<K, Pred, A>&
m,
int nType,
int nVersion);
554 template<
typename Stream,
typename K,
typename Pred,
typename A>
void Unserialize(Stream& is, std::set<K, Pred, A>&
m,
int nType,
int nVersion);
569 return a.GetSerializeSize((
int)nType, nVersion);
572 template<
typename Stream,
typename T>
573 inline void Serialize(Stream& os,
const T& a,
long nType,
int nVersion)
575 a.Serialize(os, (
int)nType, nVersion);
578 template<
typename Stream,
typename T>
579 inline void Unserialize(Stream& is, T& a,
long nType,
int nVersion)
581 a.Unserialize(is, (
int)nType, nVersion);
597 template<
typename Stream,
typename C>
598 void Serialize(Stream& os,
const std::basic_string<C>& str,
int,
int)
602 os.write((
char*)&str[0], str.size() *
sizeof(str[0]));
605 template<
typename Stream,
typename C>
611 is.read((
char*)&str[0], nSize *
sizeof(str[0]));
619 template<
unsigned int N,
typename T>
625 template<
unsigned int N,
typename T,
typename V>
634 template<
unsigned int N,
typename T>
641 template<
typename Stream,
unsigned int N,
typename T>
646 os.write((
char*)&v[0], v.
size() *
sizeof(T));
649 template<
typename Stream,
unsigned int N,
typename T,
typename V>
657 template<
typename Stream,
unsigned int N,
typename T>
664 template<
typename Stream,
unsigned int N,
typename T>
673 unsigned int blk = std::min(nSize - i, (
unsigned int)(1 + 4999999 /
sizeof(T)));
675 is.read((
char*)&v[i], blk *
sizeof(T));
680 template<
typename Stream,
unsigned int N,
typename T,
typename V>
686 unsigned int nMid = 0;
689 nMid += 5000000 /
sizeof(T);
693 for (; i < nMid; i++)
698 template<
typename Stream,
unsigned int N,
typename T>
709 template<
typename T,
typename A>
715 template<
typename T,
typename A,
typename V>
719 for (
typename std::vector<T, A>::const_iterator vi = v.begin(); vi != v.end(); ++vi)
724 template<
typename T,
typename A>
731 template<
typename Stream,
typename T,
typename A>
732 void Serialize_impl(Stream& os,
const std::vector<T, A>& v,
int nType,
int nVersion,
const unsigned char&)
736 os.write((
char*)&v[0], v.size() *
sizeof(T));
739 template<
typename Stream,
typename T,
typename A,
typename V>
740 void Serialize_impl(Stream& os,
const std::vector<T, A>& v,
int nType,
int nVersion,
const V&)
743 for (
typename std::vector<T, A>::const_iterator vi = v.begin(); vi != v.end(); ++vi)
747 template<
typename Stream,
typename T,
typename A>
748 inline void Serialize(Stream& os,
const std::vector<T, A>& v,
int nType,
int nVersion)
754 template<
typename Stream,
typename T,
typename A>
755 void Unserialize_impl(Stream& is, std::vector<T, A>& v,
int nType,
int nVersion,
const unsigned char&)
763 unsigned int blk = std::min(nSize - i, (
unsigned int)(1 + 4999999 /
sizeof(T)));
765 is.read((
char*)&v[i], blk *
sizeof(T));
770 template<
typename Stream,
typename T,
typename A,
typename V>
776 unsigned int nMid = 0;
779 nMid += 5000000 /
sizeof(T);
783 for (; i < nMid; i++)
788 template<
typename Stream,
typename T,
typename A>
789 inline void Unserialize(Stream& is, std::vector<T, A>& v,
int nType,
int nVersion)
799 template<
typename K,
typename T>
805 template<
typename Stream,
typename K,
typename T>
806 void Serialize(Stream& os,
const std::pair<K, T>& item,
int nType,
int nVersion)
808 Serialize(os, item.first, nType, nVersion);
809 Serialize(os, item.second, nType, nVersion);
812 template<
typename Stream,
typename K,
typename T>
813 void Unserialize(Stream& is, std::pair<K, T>& item,
int nType,
int nVersion)
824 template<
typename K,
typename T,
typename Pred,
typename A>
828 for (
typename std::map<K, T, Pred, A>::const_iterator mi =
m.begin(); mi !=
m.end(); ++mi)
833 template<
typename Stream,
typename K,
typename T,
typename Pred,
typename A>
834 void Serialize(Stream& os,
const std::map<K, T, Pred, A>&
m,
int nType,
int nVersion)
837 for (
typename std::map<K, T, Pred, A>::const_iterator mi =
m.begin(); mi !=
m.end(); ++mi)
841 template<
typename Stream,
typename K,
typename T,
typename Pred,
typename A>
842 void Unserialize(Stream& is, std::map<K, T, Pred, A>&
m,
int nType,
int nVersion)
846 typename std::map<K, T, Pred, A>::iterator mi =
m.begin();
847 for (
unsigned int i = 0; i < nSize; i++)
849 std::pair<K, T> item;
851 mi =
m.insert(mi, item);
860 template<
typename K,
typename Pred,
typename A>
864 for (
typename std::set<K, Pred, A>::const_iterator it =
m.begin(); it !=
m.end(); ++it)
869 template<
typename Stream,
typename K,
typename Pred,
typename A>
870 void Serialize(Stream& os,
const std::set<K, Pred, A>&
m,
int nType,
int nVersion)
873 for (
typename std::set<K, Pred, A>::const_iterator it =
m.begin(); it !=
m.end(); ++it)
877 template<
typename Stream,
typename K,
typename Pred,
typename A>
878 void Unserialize(Stream& is, std::set<K, Pred, A>&
m,
int nType,
int nVersion)
882 typename std::set<K, Pred, A>::iterator it =
m.begin();
883 for (
unsigned int i = 0; i < nSize; i++)
887 it =
m.insert(it,
key);
894 template<
typename T,
typename A>
898 for (
typename std::list<T, A>::const_iterator it = l.begin(); it != l.end(); ++it)
903 template<
typename Stream,
typename T,
typename A>
904 void Serialize(Stream& os,
const std::list<T, A>& l,
int nType,
int nVersion)
907 for (
typename std::list<T, A>::const_iterator it = l.begin(); it != l.end(); ++it)
911 template<
typename Stream,
typename T,
typename A>
912 void Unserialize(Stream& is, std::list<T, A>& l,
int nType,
int nVersion)
916 for (
unsigned int i = 0; i < nSize; i++)
938 template<
typename Stream,
typename T>
944 template<
typename Stream,
typename T>
971 this->nSize +=
nSize;
987 template<
typename Stream>
992 template<
typename Stream,
typename Arg>
995 ::Serialize(s, std::forward<Arg>(arg), nType, nVersion);
998 template<
typename Stream,
typename Arg,
typename... Args>
999 void SerializeMany(Stream& s,
int nType,
int nVersion, Arg&& arg, Args&&... args)
1001 ::Serialize(s, std::forward<Arg>(arg), nType, nVersion);
1005 template<
typename Stream>
1010 template<
typename Stream,
typename Arg>
1016 template<
typename Stream,
typename Arg,
typename... Args>
1023 template<
typename Stream,
typename... Args>
1029 template<
typename Stream,
typename... Args>
1035 #endif // BITCOIN_SERIALIZE_H
uint64_t ser_double_to_uint64(double x)
void Serialize(Stream &s, int, int=0) const
void UnserializeMany(Stream &s, int nType, int nVersion)
void resize(size_type new_size)
uint32_t ser_float_to_uint32(float x)
uint8_t ser_readdata8(Stream &s)
void ser_writedata64(Stream &s, uint64_t obj)
uint64_t ReadCompactSize(Stream &is)
CFlatData(void *pbeginIn, void *pendIn)
void Serialize(Stream &s, char a, int, int=0)
void ser_writedata32(Stream &s, uint32_t obj)
unsigned int GetSizeOfCompactSize(uint64_t nSize)
void Unserialize_impl(Stream &is, prevector< N, T > &v, int nType, int nVersion, const unsigned char &)
void Serialize_impl(Stream &os, const prevector< N, T > &v, int nType, int nVersion, const unsigned char &)
unsigned int GetSerializeSize(int, int) const
void Unserialize(Stream &s, int, int)
uint32_t be32toh(uint32_t big_endian_32bits)
CFlatData(prevector< N, T, S, D > &v)
uint32_t htole32(uint32_t host_32bits)
void WriteVarInt(Stream &os, I n)
void SerReadWriteMany(Stream &s, int nType, int nVersion, CSerActionSerialize ser_action, Args &&... args)
const char * begin() const
void SerializeMany(Stream &s, int nType, int nVersion)
uint32_t htobe32(uint32_t host_32bits)
CSizeComputer(int nTypeIn, int nVersionIn)
uint16_t ser_readdata16(Stream &s)
CSizeComputer & operator<<(const T &obj)
unsigned int GetSerializeSize_impl(const prevector< N, T > &v, int nType, int nVersion, const unsigned char &)
uint32_t ser_readdata32(Stream &s)
unsigned int GetSerializeSize(char a, int, int=0)
void Unserialize(Stream &s, int, int=0)
void Serialize(Stream &s, int, int) const
void ser_writedata16(Stream &s, uint16_t obj)
void Unserialize(Stream &s, char &a, int, int=0)
V::value_type * end_ptr(V &v)
void SerReadWrite(Stream &s, const T &obj, int nType, int nVersion, CSerActionSerialize ser_action)
CFlatData(std::vector< T, TAl > &v)
LimitedString(std::string &string)
uint16_t le16toh(uint16_t little_endian_16bits)
void ser_writedata32be(Stream &s, uint32_t obj)
double ser_uint64_to_double(uint64_t y)
unsigned int GetSizeOfVarInt(I n)
uint64_t ser_readdata64(Stream &s)
V::value_type * begin_ptr(V &v)
uint16_t htole16(uint16_t host_16bits)
static const unsigned int MAX_SIZE
uint64_t le64toh(uint64_t little_endian_64bits)
CSizeComputer & write(const char *psz, size_t nSize)
uint64_t htole64(uint64_t host_64bits)
uint32_t ser_readdata32be(Stream &s)
unsigned int GetSerializeSize(int, int=0) const
T * NCONST_PTR(const T *val)
void Serialize(Stream &s, int, int=0) const
void WriteCompactSize(Stream &os, uint64_t nSize)
uint32_t le32toh(uint32_t little_endian_32bits)
void Unserialize(Stream &s, int, int=0)
unsigned int GetSerializeSize(int, int=0) const
CVarInt< I > WrapVarInt(I &n)
void ser_writedata8(Stream &s, uint8_t obj)
float ser_uint32_to_float(uint32_t y)