8 #ifndef BITCOIN_SERIALIZE_H
9 #define BITCOIN_SERIALIZE_H
27 static const unsigned int MAX_SIZE = 0x02000000;
34 inline T&
REF(
const T& val)
36 return const_cast<T&
>(val);
46 return const_cast<T*
>(val);
62 inline const typename V::value_type*
begin_ptr(
const V& v)
67 inline typename V::value_type*
end_ptr(V& v)
69 return v.data() + v.size();
72 inline const typename V::value_type*
end_ptr(
const V& v)
74 return v.data() + v.size();
84 s.write((
char*)&obj, 1);
89 s.write((
char*)&obj, 2);
94 s.write((
char*)&obj, 4);
99 s.write((
char*)&obj, 8);
104 s.read((
char*)&obj, 1);
110 s.read((
char*)&obj, 2);
116 s.read((
char*)&obj, 4);
122 s.read((
char*)&obj, 8);
127 union {
double x; uint64_t y; } tmp;
133 union {
float x; uint32_t y; } tmp;
139 union {
double x; uint64_t y; } tmp;
145 union {
float x; uint32_t y; } tmp;
164 #define READWRITE(obj) (::SerReadWrite(s, (obj), nType, nVersion, ser_action))
172 #define ADD_SERIALIZE_METHODS \
173 size_t GetSerializeSize(int nType, int nVersion) const \
175 CSizeComputer s(nType, nVersion); \
176 NCONST_PTR(this)->SerializationOp(s, CSerActionSerialize(), nType, nVersion); \
179 template <typename Stream> \
180 void Serialize(Stream& s, int nType, int nVersion) const \
182 NCONST_PTR(this)->SerializationOp(s, CSerActionSerialize(), nType, nVersion); \
184 template <typename Stream> \
185 void Unserialize(Stream& s, int nType, int nVersion) \
187 SerializationOp(s, CSerActionUnserialize(), nType, nVersion); \
245 return sizeof(
unsigned char);
246 else if (nSize <= std::numeric_limits<unsigned short>::max())
247 return sizeof(
unsigned char) +
sizeof(
unsigned short);
248 else if (nSize <= std::numeric_limits<unsigned int>::max())
249 return sizeof(
unsigned char) +
sizeof(
unsigned int);
251 return sizeof(
unsigned char) +
sizeof(uint64_t);
254 template <
typename Stream>
259 }
else if (nSize <= std::numeric_limits<unsigned short>::max()) {
262 }
else if (nSize <= std::numeric_limits<unsigned int>::max()) {
272 template <
typename Stream>
276 uint64_t nSizeRet = 0;
279 }
else if (chSize == 253) {
282 throw std::ios_base::failure(
"non-canonical ReadCompactSize()");
283 }
else if (chSize == 254) {
285 if (nSizeRet < 0x10000u)
286 throw std::ios_base::failure(
"non-canonical ReadCompactSize()");
289 if (nSizeRet < 0x100000000ULL)
290 throw std::ios_base::failure(
"non-canonical ReadCompactSize()");
292 if (nSizeRet > (uint64_t)MAX_SIZE)
293 throw std::ios_base::failure(
"ReadCompactSize() : size too large");
321 template <
typename I>
334 template <
typename Stream,
typename I>
337 unsigned char tmp[(
sizeof(n) * 8 + 6) / 7];
340 tmp[len] = (n & 0x7F) | (len ? 0x80 : 0x00);
351 template <
typename Stream,
typename I>
357 n = (n << 7) | (chData & 0x7F);
365 #define FLATDATA(obj) REF(CFlatData((char*)&(obj), (char*)&(obj) + sizeof(obj)))
366 #define VARINT(obj) REF(WrapVarInt(REF(obj)))
367 #define LIMITED_STRING(obj, n) REF(LimitedString<n>(REF(obj)))
380 template <
class T,
class TAl>
384 pend = (
char*)(v.data() + v.size());
386 template <
unsigned int N,
typename T,
typename S,
typename D>
402 template <
typename Stream>
408 template <
typename Stream>
415 template <
typename I>
426 return GetSizeOfVarInt<I>(
n);
429 template <
typename Stream>
432 WriteVarInt<Stream, I>(s,
n);
435 template <
typename Stream>
438 n = ReadVarInt<Stream, I>(s);
442 template <
size_t Limit>
451 template <
typename Stream>
456 throw std::ios_base::failure(
"String length limit exceeded");
460 s.read((
char*)&
string[0], size);
463 template <
typename Stream>
468 s.write((
char*)&
string[0],
string.size());
477 template <
typename I>
490 template <
typename C>
491 unsigned int GetSerializeSize(
const std::basic_string<C>& str,
int,
int = 0);
492 template <
typename Stream,
typename C>
493 void Serialize(Stream& os,
const std::basic_string<C>& str,
int,
int = 0);
494 template <
typename Stream,
typename C>
495 void Unserialize(Stream& is, std::basic_string<C>& str,
int,
int = 0);
504 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&);
505 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&);
506 template<
typename Stream,
unsigned int N,
typename T>
inline void Serialize(Stream& os,
const prevector<N, T>& v,
int nType,
int nVersion);
507 template<
typename Stream,
unsigned int N,
typename T>
void Unserialize_impl(Stream& is,
prevector<N, T>& v,
int nType,
int nVersion,
const unsigned char&);
508 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&);
509 template<
typename Stream,
unsigned int N,
typename T>
inline void Unserialize(Stream& is,
prevector<N, T>& v,
int nType,
int nVersion);
515 template <
typename T,
typename A>
516 unsigned int GetSerializeSize_impl(
const std::vector<T, A>& v,
int nType,
int nVersion,
const unsigned char&);
517 template <
typename T,
typename A,
typename V>
519 template <
typename T,
typename A>
520 inline unsigned int GetSerializeSize(
const std::vector<T, A>& v,
int nType,
int nVersion);
521 template <
typename Stream,
typename T,
typename A>
522 void Serialize_impl(Stream& os,
const std::vector<T, A>& v,
int nType,
int nVersion,
const unsigned char&);
523 template <
typename Stream,
typename T,
typename A,
typename V>
524 void Serialize_impl(Stream& os,
const std::vector<T, A>& v,
int nType,
int nVersion,
const V&);
525 template <
typename Stream,
typename T,
typename A>
526 inline void Serialize(Stream& os,
const std::vector<T, A>& v,
int nType,
int nVersion);
527 template <
typename Stream,
typename T,
typename A>
528 void Unserialize_impl(Stream& is, std::vector<T, A>& v,
int nType,
int nVersion,
const unsigned char&);
529 template <
typename Stream,
typename T,
typename A,
typename V>
530 void Unserialize_impl(Stream& is, std::vector<T, A>& v,
int nType,
int nVersion,
const V&);
531 template <
typename Stream,
typename T,
typename A>
532 inline void Unserialize(Stream& is, std::vector<T, A>& v,
int nType,
int nVersion);
537 template <
typename K,
typename T>
538 unsigned int GetSerializeSize(
const std::pair<K, T>& item,
int nType,
int nVersion);
539 template <
typename Stream,
typename K,
typename T>
540 void Serialize(Stream& os,
const std::pair<K, T>& item,
int nType,
int nVersion);
541 template <
typename Stream,
typename K,
typename T>
542 void Unserialize(Stream& is, std::pair<K, T>& item,
int nType,
int nVersion);
547 template <
typename K,
typename T,
typename Pred,
typename A>
548 unsigned int GetSerializeSize(
const std::map<K, T, Pred, A>& m,
int nType,
int nVersion);
549 template <
typename Stream,
typename K,
typename T,
typename Pred,
typename A>
550 void Serialize(Stream& os,
const std::map<K, T, Pred, A>& m,
int nType,
int nVersion);
551 template <
typename Stream,
typename K,
typename T,
typename Pred,
typename A>
552 void Unserialize(Stream& is, std::map<K, T, Pred, A>& m,
int nType,
int nVersion);
557 template <
typename K,
typename Pred,
typename A>
558 unsigned int GetSerializeSize(
const std::set<K, Pred, A>& m,
int nType,
int nVersion);
559 template <
typename Stream,
typename K,
typename Pred,
typename A>
560 void Serialize(Stream& os,
const std::set<K, Pred, A>& m,
int nType,
int nVersion);
561 template <
typename Stream,
typename K,
typename Pred,
typename A>
562 void Unserialize(Stream& is, std::set<K, Pred, A>& m,
int nType,
int nVersion);
571 template <
typename T>
574 return a.GetSerializeSize((
int)nType, nVersion);
577 template <
typename Stream,
typename T>
578 inline void Serialize(Stream& os,
const T& a,
long nType,
int nVersion)
580 a.Serialize(os, (
int)nType, nVersion);
583 template <
typename Stream,
typename T>
584 inline void Unserialize(Stream& is, T& a,
long nType,
int nVersion)
586 a.Unserialize(is, (
int)nType, nVersion);
593 template <
typename C>
599 template <
typename Stream,
typename C>
600 void Serialize(Stream& os,
const std::basic_string<C>& str,
int,
int)
604 os.write((
char*)&str[0], str.size() *
sizeof(str[0]));
607 template <
typename Stream,
typename C>
613 is.read((
char*)&str[0], nSize *
sizeof(str[0]));
621 template<
unsigned int N,
typename T>
627 template<
unsigned int N,
typename T,
typename V>
636 template<
unsigned int N,
typename T>
643 template<
typename Stream,
unsigned int N,
typename T>
648 os.write((
char*)&v[0], v.
size() *
sizeof(T));
651 template<
typename Stream,
unsigned int N,
typename T,
typename V>
659 template<
typename Stream,
unsigned int N,
typename T>
666 template<
typename Stream,
unsigned int N,
typename T>
675 unsigned int blk = std::min(nSize - i, (
unsigned int)(1 + 4999999 /
sizeof(T)));
677 is.read((
char*)&v[i], blk *
sizeof(T));
682 template<
typename Stream,
unsigned int N,
typename T,
typename V>
688 unsigned int nMid = 0;
691 nMid += 5000000 /
sizeof(T);
695 for (; i < nMid; i++)
700 template<
typename Stream,
unsigned int N,
typename T>
711 template <
typename T,
typename A>
717 template <
typename T,
typename A,
typename V>
721 for (
typename std::vector<T, A>::const_iterator vi = v.begin(); vi != v.end(); ++vi)
726 template <
typename T,
typename A>
733 template <
typename Stream,
typename T,
typename A>
734 void Serialize_impl(Stream& os,
const std::vector<T, A>& v,
int nType,
int nVersion,
const unsigned char&)
738 os.write((
char*)&v[0], v.size() *
sizeof(T));
741 template <
typename Stream,
typename T,
typename A,
typename V>
742 void Serialize_impl(Stream& os,
const std::vector<T, A>& v,
int nType,
int nVersion,
const V&)
745 for (
typename std::vector<T, A>::const_iterator vi = v.begin(); vi != v.end(); ++vi)
749 template <
typename Stream,
typename T,
typename A>
750 inline void Serialize(Stream& os,
const std::vector<T, A>& v,
int nType,
int nVersion)
756 template <
typename Stream,
typename T,
typename A>
757 void Unserialize_impl(Stream& is, std::vector<T, A>& v,
int nType,
int nVersion,
const unsigned char&)
764 unsigned int blk = std::min(nSize - i, (
unsigned int)(1 + 4999999 /
sizeof(T)));
766 is.read((
char*)&v[i], blk *
sizeof(T));
771 template <
typename Stream,
typename T,
typename A,
typename V>
777 unsigned int nMid = 0;
778 while (nMid < nSize) {
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)
823 template <
typename K,
typename T,
typename Pred,
typename A>
827 for (
typename std::map<K, T, Pred, A>::const_iterator mi = m.begin(); mi != m.end(); ++mi)
832 template <
typename Stream,
typename K,
typename T,
typename Pred,
typename A>
833 void Serialize(Stream& os,
const std::map<K, T, Pred, A>& m,
int nType,
int nVersion)
836 for (
typename std::map<K, T, Pred, A>::const_iterator mi = m.begin(); mi != m.end(); ++mi)
840 template <
typename Stream,
typename K,
typename T,
typename Pred,
typename A>
841 void Unserialize(Stream& is, std::map<K, T, Pred, A>& m,
int nType,
int nVersion)
845 typename std::map<K, T, Pred, A>::iterator mi = m.begin();
846 for (
unsigned int i = 0; i < nSize; i++) {
847 std::pair<K, T> item;
849 mi = m.insert(mi, item);
857 template <
typename K,
typename Pred,
typename A>
861 for (
typename std::set<K, Pred, A>::const_iterator it = m.begin(); it != m.end(); ++it)
866 template <
typename Stream,
typename K,
typename Pred,
typename A>
867 void Serialize(Stream& os,
const std::set<K, Pred, A>& m,
int nType,
int nVersion)
870 for (
typename std::set<K, Pred, A>::const_iterator it = m.begin(); it != m.end(); ++it)
874 template <
typename Stream,
typename K,
typename Pred,
typename A>
875 void Unserialize(Stream& is, std::set<K, Pred, A>& m,
int nType,
int nVersion)
879 typename std::set<K, Pred, A>::iterator it = m.begin();
880 for (
unsigned int i = 0; i < nSize; i++) {
883 it = m.insert(it,
key);
898 template <
typename Stream,
typename T>
904 template <
typename Stream,
typename T>
924 this->nSize +=
nSize;
928 template <
typename T>
941 #endif // BITCOIN_SERIALIZE_H