16 static uint64_t MAX_SIZE = 0x02000000;
19 static const int PROTOCOL_VERSION = 70002;
26 inline T& REF(
const T& val)
28 return const_cast<T&
>(val);
36 inline T* NCONST_PTR(
const T* val)
38 return const_cast<T*
>(val);
46 template <
class T,
class TAl>
47 inline T* begin_ptr(std::vector<T,TAl>& v)
49 return v.empty() ? NULL : &v[0];
52 template <
class T,
class TAl>
53 inline const T* begin_ptr(
const std::vector<T,TAl>& v)
55 return v.empty() ? NULL : &v[0];
58 template <
class T,
class TAl>
59 inline T* end_ptr(std::vector<T,TAl>& v)
61 return v.empty() ? NULL : (&v[0] + v.size());
64 template <
class T,
class TAl>
65 inline const T* end_ptr(
const std::vector<T,TAl>& v)
67 return v.empty() ? NULL : (&v[0] + v.size());
79 SER_NETWORK = (1 << 0),
81 SER_GETHASH = (1 << 2),
84 #define READWRITE(obj) (::SerReadWrite(s, (obj), nType, nVersion, ser_action)) 92 #define ADD_SERIALIZE_METHODS \ 93 size_t GetSerializeSize(int nType, int nVersion) const { \ 94 CSizeComputer s(nType, nVersion); \ 95 NCONST_PTR(this)->SerializationOp(s, CSerActionSerialize(), nType, nVersion);\ 98 template<typename Stream> \ 99 void Serialize(Stream& s, int nType, int nVersion) const { \ 100 NCONST_PTR(this)->SerializationOp(s, CSerActionSerialize(), nType, nVersion);\ 102 template<typename Stream> \ 103 void Unserialize(Stream& s, int nType, int nVersion) { \ 104 SerializationOp(s, CSerActionUnserialize(), nType, nVersion); \ 111 #define WRITEDATA(s, obj) s.write((char*)&(obj), sizeof(obj)) 112 #define READDATA(s, obj) s.read((char*)&(obj), sizeof(obj)) 114 inline unsigned int GetSerializeSize(
char a,
int,
int=0) {
return sizeof(a); }
115 inline unsigned int GetSerializeSize(
signed char a,
int,
int=0) {
return sizeof(a); }
116 inline unsigned int GetSerializeSize(
unsigned char a,
int,
int=0) {
return sizeof(a); }
117 inline unsigned int GetSerializeSize(
signed short a,
int,
int=0) {
return sizeof(a); }
118 inline unsigned int GetSerializeSize(
unsigned short a,
int,
int=0) {
return sizeof(a); }
119 inline unsigned int GetSerializeSize(
signed int a,
int,
int=0) {
return sizeof(a); }
120 inline unsigned int GetSerializeSize(
unsigned int a,
int,
int=0) {
return sizeof(a); }
121 inline unsigned int GetSerializeSize(
signed long a,
int,
int=0) {
return sizeof(a); }
122 inline unsigned int GetSerializeSize(
unsigned long a,
int,
int=0) {
return sizeof(a); }
123 inline unsigned int GetSerializeSize(
signed long long a,
int,
int=0) {
return sizeof(a); }
124 inline unsigned int GetSerializeSize(
unsigned long long a,
int,
int=0) {
return sizeof(a); }
125 inline unsigned int GetSerializeSize(
float a,
int,
int=0) {
return sizeof(a); }
126 inline unsigned int GetSerializeSize(
double a,
int,
int=0) {
return sizeof(a); }
128 template<
typename Stream>
inline void Serialize(Stream& s,
char a,
int,
int=0) { WRITEDATA(s, a); }
129 template<
typename Stream>
inline void Serialize(Stream& s,
signed char a,
int,
int=0) { WRITEDATA(s, a); }
130 template<
typename Stream>
inline void Serialize(Stream& s,
unsigned char a,
int,
int=0) { WRITEDATA(s, a); }
131 template<
typename Stream>
inline void Serialize(Stream& s,
signed short a,
int,
int=0) { WRITEDATA(s, a); }
132 template<
typename Stream>
inline void Serialize(Stream& s,
unsigned short a,
int,
int=0) { WRITEDATA(s, a); }
133 template<
typename Stream>
inline void Serialize(Stream& s,
signed int a,
int,
int=0) { WRITEDATA(s, a); }
134 template<
typename Stream>
inline void Serialize(Stream& s,
unsigned int a,
int,
int=0) { WRITEDATA(s, a); }
135 template<
typename Stream>
inline void Serialize(Stream& s,
signed long a,
int,
int=0) { WRITEDATA(s, a); }
136 template<
typename Stream>
inline void Serialize(Stream& s,
unsigned long a,
int,
int=0) { WRITEDATA(s, a); }
137 template<
typename Stream>
inline void Serialize(Stream& s,
signed long long a,
int,
int=0) { WRITEDATA(s, a); }
138 template<
typename Stream>
inline void Serialize(Stream& s,
unsigned long long a,
int,
int=0) { WRITEDATA(s, a); }
139 template<
typename Stream>
inline void Serialize(Stream& s,
float a,
int,
int=0) { WRITEDATA(s, a); }
140 template<
typename Stream>
inline void Serialize(Stream& s,
double a,
int,
int=0) { WRITEDATA(s, a); }
143 template<
typename Stream>
inline void Unserialize(Stream& s,
char& a,
int,
int=0) { READDATA(s, a); }
144 template<
typename Stream>
inline void Unserialize(Stream& s,
signed char& a,
int,
int=0) { READDATA(s, a); }
145 template<
typename Stream>
inline void Unserialize(Stream& s,
unsigned char& a,
int,
int=0) { READDATA(s, a); }
146 template<
typename Stream>
inline void Unserialize(Stream& s,
signed short& a,
int,
int=0) { READDATA(s, a); }
147 template<
typename Stream>
inline void Unserialize(Stream& s,
unsigned short& a,
int,
int=0) { READDATA(s, a); }
148 template<
typename Stream>
inline void Unserialize(Stream& s,
signed int& a,
int,
int=0) { READDATA(s, a); }
149 template<
typename Stream>
inline void Unserialize(Stream& s,
unsigned int& a,
int,
int=0) { READDATA(s, a); }
150 template<
typename Stream>
inline void Unserialize(Stream& s,
signed long& a,
int,
int=0) { READDATA(s, a); }
151 template<
typename Stream>
inline void Unserialize(Stream& s,
unsigned long& a,
int,
int=0) { READDATA(s, a); }
152 template<
typename Stream>
inline void Unserialize(Stream& s,
signed long long& a,
int,
int=0) { READDATA(s, a); }
153 template<
typename Stream>
inline void Unserialize(Stream& s,
unsigned long long& a,
int,
int=0) { READDATA(s, a); }
154 template<
typename Stream>
inline void Unserialize(Stream& s,
float& a,
int,
int=0) { READDATA(s, a); }
155 template<
typename Stream>
inline void Unserialize(Stream& s,
double& a,
int,
int=0) { READDATA(s, a); }
162 template<
typename T,
typename A>
unsigned int GetSerializeSize_impl(
const std::vector<T, A>& v,
int nType,
int nVersion,
const unsigned char&);
163 template<
typename T,
typename A,
typename V>
unsigned int GetSerializeSize_impl(
const std::vector<T, A>& v,
int nType,
int nVersion,
const V&);
164 template<
typename T,
typename A>
inline unsigned int GetSerializeSize(
const std::vector<T, A>& v,
int nType,
int nVersion);
165 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&);
166 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&);
167 template<
typename Stream,
typename T,
typename A>
inline void Serialize(Stream& os,
const std::vector<T, A>& v,
int nType,
int nVersion);
168 template<
typename Stream,
typename T,
typename A>
void Unserialize_impl(Stream& is, std::vector<T, A>& v,
int nType,
int nVersion,
const unsigned char&);
169 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&);
170 template<
typename Stream,
typename T,
typename A>
inline void Unserialize(Stream& is, std::vector<T, A>& v,
int nType,
int nVersion);
175 extern inline unsigned int GetSerializeSize(
const CScript& v,
int nType,
int nVersion);
176 template<
typename Stream>
void Serialize(Stream& os,
const CScript& v,
int nType,
int nVersion);
177 template<
typename Stream>
void Unserialize(Stream& is,
CScript& v,
int nType,
int nVersion);
186 inline unsigned int GetSizeOfCompactSize(uint64_t nSize)
188 if (nSize < 253)
return sizeof(
unsigned char);
189 else if (nSize <= std::numeric_limits<unsigned short>::max())
return sizeof(
unsigned char) +
sizeof(
unsigned short);
190 else if (nSize <= std::numeric_limits<unsigned int>::max())
return sizeof(
unsigned char) +
sizeof(
unsigned int);
191 else return sizeof(
unsigned char) +
sizeof(uint64_t);
194 template<
typename Stream>
195 void WriteCompactSize(Stream& os, uint64_t nSize)
199 unsigned char chSize = (
unsigned char)nSize;
200 WRITEDATA(os, chSize);
202 else if (nSize <= std::numeric_limits<unsigned short>::max())
204 unsigned char chSize = 253;
205 unsigned short xSize = (
unsigned short)nSize;
206 WRITEDATA(os, chSize);
207 WRITEDATA(os, xSize);
209 else if (nSize <= std::numeric_limits<unsigned int>::max())
211 unsigned char chSize = 254;
212 unsigned int xSize = (
unsigned int)nSize;
213 WRITEDATA(os, chSize);
214 WRITEDATA(os, xSize);
218 unsigned char chSize = 255;
219 uint64_t xSize = nSize;
220 WRITEDATA(os, chSize);
221 WRITEDATA(os, xSize);
226 template<
typename Stream>
227 uint64_t ReadCompactSize(Stream& is)
229 unsigned char chSize;
230 READDATA(is, chSize);
231 uint64_t nSizeRet = 0;
236 else if (chSize == 253)
238 unsigned short xSize;
242 throw std::ios_base::failure(
"non-canonical ReadCompactSize()");
244 else if (chSize == 254)
249 if (nSizeRet < 0x10000u)
250 throw std::ios_base::failure(
"non-canonical ReadCompactSize()");
257 if (nSizeRet < 0x100000000ULL)
258 throw std::ios_base::failure(
"non-canonical ReadCompactSize()");
260 if (nSizeRet > (uint64_t)MAX_SIZE)
261 throw std::ios_base::failure(
"ReadCompactSize() : size too large");
265 #define FLATDATA(obj) REF(CFlatData((char*)&(obj), (char*)&(obj) + sizeof(obj))) 266 #define VARINT(obj) REF(WrapVarInt(REF(obj))) 267 #define LIMITED_STRING(obj,n) REF(LimitedString< n >(REF(obj))) 278 CFlatData(
void* pbeginIn,
void* pendIn) : pbegin((
char*)pbeginIn), pend((
char*)pendIn) { }
279 template <
class T,
class TAl>
280 explicit CFlatData(std::vector<T,TAl> &v)
282 pbegin = (
char*)begin_ptr(v);
283 pend = (
char*)end_ptr(v);
285 char* begin() {
return pbegin; }
286 const char* begin()
const {
return pbegin; }
287 char* end() {
return pend; }
288 const char* end()
const {
return pend; }
290 unsigned int GetSerializeSize(
int,
int=0)
const 292 return pend - pbegin;
295 template<
typename Stream>
296 void Serialize(Stream& s,
int,
int=0)
const 298 s.write(pbegin, pend - pbegin);
301 template<
typename Stream>
302 void Unserialize(Stream& s,
int,
int=0)
304 s.read(pbegin, pend - pbegin);
315 inline unsigned int GetSerializeSize(
const T& a,
long nType,
int nVersion)
317 return a.GetSerializeSize((
int)nType, nVersion);
320 template<
typename Stream,
typename T>
321 inline void Serialize(Stream& os,
const T& a,
long nType,
int nVersion)
323 a.Serialize(os, (
int)nType, nVersion);
326 template<
typename Stream,
typename T>
327 inline void Unserialize(Stream& is, T& a,
long nType,
int nVersion)
329 a.Unserialize(is, (
int)nType, nVersion);
336 unsigned int GetSerializeSize(
const std::basic_string<C>& str,
int,
int)
338 return GetSizeOfCompactSize(str.size()) + str.size() *
sizeof(str[0]);
341 template<
typename Stream,
typename C>
342 void Serialize(Stream& os,
const std::basic_string<C>& str,
int,
int)
344 WriteCompactSize(os, str.size());
346 os.write((
char*)&str[0], str.size() *
sizeof(str[0]));
349 template<
typename Stream,
typename C>
350 void Unserialize(Stream& is, std::basic_string<C>& str,
int,
int)
352 unsigned int nSize = ReadCompactSize(is);
355 is.read((
char*)&str[0], nSize *
sizeof(str[0]));
361 template<
typename T,
typename A>
362 unsigned int GetSerializeSize_impl(
const std::vector<T, A>& v,
int nType,
int nVersion,
const unsigned char&)
364 return (GetSizeOfCompactSize(v.size()) + v.size() *
sizeof(T));
367 template<
typename T,
typename A,
typename V>
368 unsigned int GetSerializeSize_impl(
const std::vector<T, A>& v,
int nType,
int nVersion,
const V&)
370 unsigned int nSize = GetSizeOfCompactSize(v.size());
371 for (
typename std::vector<T, A>::const_iterator vi = v.begin(); vi != v.end(); ++vi)
372 nSize += GetSerializeSize((*vi), nType, nVersion);
376 template<
typename T,
typename A>
377 inline unsigned int GetSerializeSize(
const std::vector<T, A>& v,
int nType,
int nVersion)
379 return GetSerializeSize_impl(v, nType, nVersion, T());
383 template<
typename Stream,
typename T,
typename A>
384 void Serialize_impl(Stream& os,
const std::vector<T, A>& v,
int nType,
int nVersion,
const unsigned char&)
386 WriteCompactSize(os, v.size());
388 os.write((
char*)&v[0], v.size() *
sizeof(T));
391 template<
typename Stream,
typename T,
typename A,
typename V>
392 void Serialize_impl(Stream& os,
const std::vector<T, A>& v,
int nType,
int nVersion,
const V&)
394 WriteCompactSize(os, v.size());
395 for (
typename std::vector<T, A>::const_iterator vi = v.begin(); vi != v.end(); ++vi)
396 ::Serialize(os, (*vi), nType, nVersion);
399 template<
typename Stream,
typename T,
typename A>
400 inline void Serialize(Stream& os,
const std::vector<T, A>& v,
int nType,
int nVersion)
402 Serialize_impl(os, v, nType, nVersion, T());
406 template<
typename Stream,
typename T,
typename A>
407 void Unserialize_impl(Stream& is, std::vector<T, A>& v,
int nType,
int nVersion,
const unsigned char&)
411 unsigned int nSize = (
unsigned int)ReadCompactSize(is);
415 unsigned int blk = std::min(nSize - i, (
unsigned int)(1 + 4999999 /
sizeof(T)));
417 is.read((
char*)&v[i], blk *
sizeof(T));
422 template<
typename Stream,
typename T,
typename A,
typename V>
423 void Unserialize_impl(Stream& is, std::vector<T, A>& v,
int nType,
int nVersion,
const V&)
426 unsigned int nSize = (
unsigned int)ReadCompactSize(is);
428 unsigned int nMid = 0;
431 nMid += 5000000 /
sizeof(T);
435 for (; i < nMid; i++)
436 Unserialize(is, v[i], nType, nVersion);
440 template<
typename Stream,
typename T,
typename A>
441 inline void Unserialize(Stream& is, std::vector<T, A>& v,
int nType,
int nVersion)
443 Unserialize_impl(is, v, nType, nVersion, T());
449 inline unsigned int GetSerializeSize(
const CScript& v,
int nType,
int nVersion)
451 return GetSerializeSize((
const std::vector<unsigned char>&)v, nType, nVersion);
454 template<
typename Stream>
455 void Serialize(Stream& os,
const CScript& v,
int nType,
int nVersion)
457 Serialize(os, (
const std::vector<unsigned char>&)v, nType, nVersion);
460 template<
typename Stream>
461 void Unserialize(Stream& is,
CScript& v,
int nType,
int nVersion)
463 Unserialize(is, (std::vector<unsigned char>&)v, nType, nVersion);
469 template<
typename K,
typename Pred,
typename A>
470 unsigned int GetSerializeSize(
const std::set<K, Pred, A>& m,
int nType,
int nVersion)
472 unsigned int nSize = GetSizeOfCompactSize(m.size());
473 for (
typename std::set<K, Pred, A>::const_iterator it = m.begin(); it != m.end(); ++it)
474 nSize += GetSerializeSize((*it), nType, nVersion);
478 template<
typename Stream,
typename K,
typename Pred,
typename A>
479 void Serialize(Stream& os,
const std::set<K, Pred, A>& m,
int nType,
int nVersion)
481 WriteCompactSize(os, m.size());
482 for (
typename std::set<K, Pred, A>::const_iterator it = m.begin(); it != m.end(); ++it)
483 Serialize(os, (*it), nType, nVersion);
486 template<
typename Stream,
typename K,
typename Pred,
typename A>
487 void Unserialize(Stream& is, std::set<K, Pred, A>& m,
int nType,
int nVersion)
490 unsigned int nSize = ReadCompactSize(is);
491 typename std::set<K, Pred, A>::iterator it = m.begin();
492 for (
unsigned int i = 0; i < nSize; i++)
495 Unserialize(is, key, nType, nVersion);
496 it = m.insert(it, key);
506 bool ForRead()
const {
return false; }
510 bool ForRead()
const {
return true; }
513 template<
typename Stream,
typename T>
514 inline void SerReadWrite(Stream& s,
const T& obj,
int nType,
int nVersion,
CSerActionSerialize ser_action)
516 ::Serialize(s, obj, nType, nVersion);
519 template<
typename Stream,
typename T>
520 inline void SerReadWrite(Stream& s, T& obj,
int nType,
int nVersion,
CSerActionUnserialize ser_action)
522 ::Unserialize(s, obj, nType, nVersion);
535 CSizeComputer(
int nTypeIn,
int nVersionIn) : nSize(0), nType(nTypeIn), nVersion(nVersionIn) {}
539 this->nSize += nSize;
546 ::Serialize(*
this, obj, nType, nVersion);
550 size_t size()
const {
555 #endif // SERIALIZE_H Definition: serialize.h:508
Definition: serialize.h:504
Definition: serialize.h:526
Definition: serialize.h:272