6 #ifndef BITCOIN_SERIALIZE_H 7 #define BITCOIN_SERIALIZE_H 27 static const unsigned int MAX_SIZE = 0x02000000;
48 inline T&
REF(
const T& val)
50 return const_cast<T&>(val);
60 return const_cast<T*>(val);
65 inline char*
CharCast(
unsigned char* c) {
return (
char*)c; }
66 inline const char*
CharCast(
const char* c) {
return c; }
67 inline const char*
CharCast(
const unsigned char* c) {
return (
const char*)c; }
75 s.write((
char*)&obj, 1);
80 s.write((
char*)&obj, 2);
85 s.write((
char*)&obj, 2);
90 s.write((
char*)&obj, 4);
95 s.write((
char*)&obj, 4);
100 s.write((
char*)&obj, 8);
105 s.read((
char*)&obj, 1);
111 s.read((
char*)&obj, 2);
117 s.read((
char*)&obj, 2);
123 s.read((
char*)&obj, 4);
129 s.read((
char*)&obj, 4);
135 s.read((
char*)&obj, 8);
140 union {
double x;
uint64_t y; } tmp;
152 union {
double x;
uint64_t y; } tmp;
184 #define READWRITE(...) (::SerReadWriteMany(s, ser_action, __VA_ARGS__)) 185 #define READWRITEAS(type, obj) (::SerReadWriteMany(s, ser_action, ReadWriteAsHelper<type>(obj))) 193 #define ADD_SERIALIZE_METHODS \ 194 template<typename Stream> \ 195 void Serialize(Stream& s) const { \ 196 NCONST_PTR(this)->SerializationOp(s, CSerActionSerialize()); \ 198 template<typename Stream> \ 199 void Unserialize(Stream& s) { \ 200 SerializationOp(s, CSerActionUnserialize()); \ 203 #ifndef CHAR_EQUALS_INT8 216 template<
typename Stream,
int N>
inline void Serialize(Stream& s,
const char (&a)[N]) { s.write(a, N); }
217 template<
typename Stream,
int N>
inline void Serialize(Stream& s,
const unsigned char (&a)[N]) { s.write(
CharCast(a), N); }
221 #ifndef CHAR_EQUALS_INT8 234 template<
typename Stream,
int N>
inline void Unserialize(Stream& s,
char (&a)[N]) { s.read(a, N); }
235 template<
typename Stream,
int N>
inline void Unserialize(Stream& s,
unsigned char (&a)[N]) { s.read(
CharCast(a), N); }
255 if (
nSize < 253)
return sizeof(
unsigned char);
256 else if (
nSize <= std::numeric_limits<unsigned short>::max())
return sizeof(
unsigned char) +
sizeof(
unsigned short);
257 else if (
nSize <= std::numeric_limits<unsigned int>::max())
return sizeof(
unsigned char) +
sizeof(
unsigned int);
258 else return sizeof(
unsigned char) +
sizeof(
uint64_t);
263 template<
typename Stream>
270 else if (
nSize <= std::numeric_limits<unsigned short>::max())
275 else if (
nSize <= std::numeric_limits<unsigned int>::max())
288 template<
typename Stream>
297 else if (chSize == 253)
301 throw std::ios_base::failure(
"non-canonical ReadCompactSize()");
303 else if (chSize == 254)
306 if (nSizeRet < 0x10000u)
307 throw std::ios_base::failure(
"non-canonical ReadCompactSize()");
312 if (nSizeRet < 0x100000000ULL)
313 throw std::ios_base::failure(
"non-canonical ReadCompactSize()");
316 throw std::ios_base::failure(
"ReadCompactSize(): size too large");
356 template <VarIntMode Mode,
typename I>
360 static_assert(Mode !=
VarIntMode::DEFAULT || std::is_unsigned<I>::value,
"Unsigned type required with mode DEFAULT.");
365 template<VarIntMode Mode,
typename I>
382 template<
typename Stream, VarIntMode Mode,
typename I>
386 unsigned char tmp[(
sizeof(n)*8+6)/7];
389 tmp[len] = (n & 0x7F) | (len ? 0x80 : 0x00);
400 template<
typename Stream, VarIntMode Mode,
typename I>
407 if (n > (std::numeric_limits<I>::max() >> 7)) {
408 throw std::ios_base::failure(
"ReadVarInt(): size too large");
410 n = (n << 7) | (chData & 0x7F);
412 if (n == std::numeric_limits<I>::max()) {
413 throw std::ios_base::failure(
"ReadVarInt(): size too large");
422 #define VARINT(obj, ...) WrapVarInt<__VA_ARGS__>(REF(obj)) 423 #define COMPACTSIZE(obj) CCompactSize(REF(obj)) 424 #define LIMITED_STRING(obj,n) LimitedString< n >(REF(obj)) 426 template<VarIntMode Mode,
typename I>
434 template<
typename Stream>
436 WriteVarInt<Stream,Mode,I>(s,
n);
439 template<
typename Stream>
441 n = ReadVarInt<Stream,Mode,I>(s);
462 static_assert(std::is_unsigned<I>::value,
"BigEndian type must be unsigned integer");
463 static_assert(
sizeof(I) == 2 && std::numeric_limits<I>::min() == 0 && std::numeric_limits<I>::max() == std::numeric_limits<uint16_t>::max(),
"Unsupported BigEndian size");
466 template<
typename Stream>
472 template<
typename Stream>
486 template<
typename Stream>
488 WriteCompactSize<Stream>(s,
n);
491 template<
typename Stream>
493 n = ReadCompactSize<Stream>(s);
497 template<
size_t Limit>
505 template<
typename Stream>
510 throw std::ios_base::failure(
"String length limit exceeded");
514 s.read((
char*)
string.
data(), size);
517 template<
typename Stream>
522 s.write((
char*)
string.
data(),
string.size());
526 template<VarIntMode Mode=VarIntMode::DEFAULT,
typename I>
539 template<
typename Stream,
typename C>
void Serialize(Stream& os,
const std::basic_string<C>& str);
540 template<
typename Stream,
typename C>
void Unserialize(Stream& is, std::basic_string<C>& str);
557 template<
typename Stream,
typename T,
typename A>
void Serialize_impl(Stream& os,
const std::vector<T, A>& v,
const unsigned char&);
558 template<
typename Stream,
typename T,
typename A,
typename V>
void Serialize_impl(Stream& os,
const std::vector<T, A>& v,
const V&);
559 template<
typename Stream,
typename T,
typename A>
inline void Serialize(Stream& os,
const std::vector<T, A>& v);
560 template<
typename Stream,
typename T,
typename A>
void Unserialize_impl(Stream& is, std::vector<T, A>& v,
const unsigned char&);
561 template<
typename Stream,
typename T,
typename A,
typename V>
void Unserialize_impl(Stream& is, std::vector<T, A>& v,
const V&);
562 template<
typename Stream,
typename T,
typename A>
inline void Unserialize(Stream& is, std::vector<T, A>& v);
567 template<
typename Stream,
typename K,
typename T>
void Serialize(Stream& os,
const std::pair<K, T>& item);
568 template<
typename Stream,
typename K,
typename T>
void Unserialize(Stream& is, std::pair<K, T>& item);
573 template<
typename Stream,
typename K,
typename T,
typename Pred,
typename A>
void Serialize(Stream& os,
const std::map<K, T, Pred, A>&
m);
574 template<
typename Stream,
typename K,
typename T,
typename Pred,
typename A>
void Unserialize(Stream& is, std::map<K, T, Pred, A>&
m);
579 template<
typename Stream,
typename K,
typename Pred,
typename A>
void Serialize(Stream& os,
const std::set<K, Pred, A>&
m);
580 template<
typename Stream,
typename K,
typename Pred,
typename A>
void Unserialize(Stream& is, std::set<K, Pred, A>&
m);
585 template<
typename Stream,
typename T>
void Serialize(Stream& os,
const std::shared_ptr<const T>& p);
586 template<
typename Stream,
typename T>
void Unserialize(Stream& os, std::shared_ptr<const T>& p);
591 template<
typename Stream,
typename T>
void Serialize(Stream& os,
const std::unique_ptr<const T>& p);
592 template<
typename Stream,
typename T>
void Unserialize(Stream& os, std::unique_ptr<const T>& p);
599 template<
typename Stream,
typename T>
605 template<
typename Stream,
typename T>
618 template<
typename Stream,
typename C>
619 void Serialize(Stream& os,
const std::basic_string<C>& str)
623 os.write((
char*)str.data(), str.size() *
sizeof(C));
626 template<
typename Stream,
typename C>
632 is.read((
char*)str.data(), nSize *
sizeof(C));
640 template<
typename Stream,
unsigned int N,
typename T>
645 os.write((
char*)v.
data(), v.
size() *
sizeof(T));
648 template<
typename Stream,
unsigned int N,
typename T,
typename V>
656 template<
typename Stream,
unsigned int N,
typename T>
663 template<
typename Stream,
unsigned int N,
typename T>
672 unsigned int blk = std::min(nSize - i, (
unsigned int)(1 + 4999999 /
sizeof(T)));
674 is.read((
char*)&v[i], blk *
sizeof(T));
679 template<
typename Stream,
unsigned int N,
typename T,
typename V>
685 unsigned int nMid = 0;
688 nMid += 5000000 /
sizeof(T);
692 for (; i < nMid; ++i)
697 template<
typename Stream,
unsigned int N,
typename T>
708 template<
typename Stream,
typename T,
typename A>
709 void Serialize_impl(Stream& os,
const std::vector<T, A>& v,
const unsigned char&)
713 os.write((
char*)v.data(), v.size() *
sizeof(T));
716 template<
typename Stream,
typename T,
typename A,
typename V>
720 for (
typename std::vector<T, A>::const_iterator vi = v.begin(); vi != v.end(); ++vi)
724 template<
typename Stream,
typename T,
typename A>
725 inline void Serialize(Stream& os,
const std::vector<T, A>& v)
731 template<
typename Stream,
typename T,
typename A>
740 unsigned int blk = std::min(nSize - i, (
unsigned int)(1 + 4999999 /
sizeof(T)));
742 is.read((
char*)&v[i], blk *
sizeof(T));
747 template<
typename Stream,
typename T,
typename A,
typename V>
753 unsigned int nMid = 0;
756 nMid += 5000000 /
sizeof(T);
760 for (; i < nMid; i++)
765 template<
typename Stream,
typename T,
typename A>
776 template<
typename Stream,
typename K,
typename T>
783 template<
typename Stream,
typename K,
typename T>
795 template<
typename Stream,
typename K,
typename T,
typename Pred,
typename A>
799 for (
const auto& entry :
m)
803 template<
typename Stream,
typename K,
typename T,
typename Pred,
typename A>
808 typename std::map<K, T, Pred, A>::iterator mi =
m.begin();
809 for (
unsigned int i = 0; i < nSize; i++)
811 std::pair<K, T> item;
813 mi =
m.insert(mi, item);
822 template<
typename Stream,
typename K,
typename Pred,
typename A>
826 for (
typename std::set<K, Pred, A>::const_iterator
it =
m.begin();
it !=
m.end(); ++
it)
830 template<
typename Stream,
typename K,
typename Pred,
typename A>
835 typename std::set<K, Pred, A>::iterator
it =
m.begin();
836 for (
unsigned int i = 0; i < nSize; i++)
849 template<
typename Stream,
typename T>
void 850 Serialize(Stream& os,
const std::unique_ptr<const T>& p)
855 template<
typename Stream,
typename T>
866 template<
typename Stream,
typename T>
void 867 Serialize(Stream& os,
const std::shared_ptr<const T>& p)
872 template<
typename Stream,
typename T>
885 constexpr
bool ForRead()
const {
return false; }
889 constexpr
bool ForRead()
const {
return true; }
919 void write(
const char *psz,
size_t _nSize)
921 this->nSize += _nSize;
927 this->nSize += _nSize;
944 template<
typename Stream>
949 template<
typename Stream,
typename Arg,
typename... Args>
956 template<
typename Stream>
961 template<
typename Stream,
typename Arg,
typename... Args>
968 template<
typename Stream,
typename... Args>
974 template<
typename Stream,
typename... Args>
983 s.
seek(GetSizeOfVarInt<I>(n));
991 template <
typename T>
997 template <
typename... T>
1005 #endif // BITCOIN_SERIALIZE_H
size_t nSize
Definition: serialize.h:913
uint64_t ser_double_to_uint64(double x)
Definition: serialize.h:138
CVarInt(I &nIn)
Definition: serialize.h:432
X & ReadWriteAsHelper(X &x)
Convert the reference base type to X, without changing constness or reference type.
Definition: serialize.h:181
constexpr bool ForRead() const
Definition: serialize.h:885
Definition: serialize.h:175
uint32_t ser_float_to_uint32(float x)
Definition: serialize.h:144
Definition: serialize.h:176
BigEndian(I &val)
Definition: serialize.h:460
void Unserialize(Stream &s)
Definition: serialize.h:440
uint8_t ser_readdata8(Stream &s)
Definition: serialize.h:102
void clear()
Definition: prevector.h:338
Definition: serialize.h:498
void ser_writedata64(Stream &s, uint64_t obj)
Definition: serialize.h:97
uint64_t ReadCompactSize(Stream &is)
Definition: serialize.h:289
void WriteVarInt(CSizeComputer &os, I n)
Definition: serialize.h:981
void WriteCompactSize(CSizeComputer &os, uint64_t nSize)
Definition: serialize.h:986
constexpr CheckVarIntMode()
Definition: serialize.h:358
void ser_writedata32(Stream &s, uint32_t obj)
Definition: serialize.h:87
constexpr deserialize_type deserialize
Definition: serialize.h:41
unsigned int GetSizeOfCompactSize(uint64_t nSize)
Definition: serialize.h:253
Definition: serialize.h:427
I & m_val
Definition: serialize.h:458
Definition: serialize.h:883
unsigned short uint16_t
Definition: stdint.h:20
uint32_t be32toh(uint32_t big_endian_32bits)
Definition: endian.h:198
Definition: prevector.h:99
void write(const char *psz, size_t _nSize)
Definition: serialize.h:919
void resize_uninitialized(size_type new_size)
Definition: prevector.h:381
unsigned char uint8_t
Definition: stdint.h:19
void UnserializeMany(Stream &s)
Definition: serialize.h:957
BigEndian< I > WrapBigEndian(I &n)
Definition: serialize.h:530
uint32_t htole32(uint32_t host_32bits)
Definition: endian.h:191
Definition: serialize.h:40
char * CharCast(char *c)
Safely convert odd char pointer types to standard ones.
Definition: serialize.h:64
void Serialize(Stream &s) const
Definition: serialize.h:435
value_type * data()
Definition: prevector.h:518
size_t GetSerializeSize(const T &t, int nVersion=0)
Definition: serialize.h:992
void Serialize(Stream &s, char a)
Definition: serialize.h:204
m
Definition: linearize-data.py:266
uint32_t htobe32(uint32_t host_32bits)
Definition: endian.h:184
CVarInt< Mode, I > WrapVarInt(I &n)
Definition: serialize.h:527
void Serialize(Stream &s) const
Definition: serialize.h:467
f
Definition: linearize-data.py:263
args
Definition: filter-lcov.py:10
iterator end()
Definition: prevector.h:287
void SerReadWriteMany(Stream &s, CSerActionSerialize ser_action, const Args &... args)
Definition: serialize.h:969
void Unserialize(Stream &s)
Definition: serialize.h:473
uint16_t ser_readdata16(Stream &s)
Definition: serialize.h:108
Definition: serialize.h:887
CSizeComputer(int nVersionIn)
Definition: serialize.h:917
CSizeComputer & operator<<(const T &obj)
Definition: serialize.h:931
constexpr C * data() const noexcept
Definition: span.h:27
Definition: serialize.h:455
uint32_t ser_readdata32(Stream &s)
Definition: serialize.h:120
Definition: serialize.h:177
constexpr bool ForRead() const
Definition: serialize.h:889
unsigned int uint32_t
Definition: stdint.h:21
signed short int16_t
Definition: stdint.h:16
void ser_writedata16(Stream &s, uint16_t obj)
Definition: serialize.h:77
unsigned long long uint64_t
Definition: stdint.h:22
constexpr std::ptrdiff_t size() const noexcept
Definition: span.h:30
uint16_t htobe16(uint16_t host_16bits)
Definition: endian.h:156
void seek(size_t _nSize)
Definition: serialize.h:925
VarIntMode
Definition: serialize.h:354
I ReadVarInt(Stream &is)
Definition: serialize.h:401
void Serialize(Stream &s) const
Definition: serialize.h:518
uint16_t le16toh(uint16_t little_endian_16bits)
Definition: endian.h:177
void ser_writedata32be(Stream &s, uint32_t obj)
Definition: serialize.h:92
std::string & string
Definition: serialize.h:501
signed char int8_t
Definition: stdint.h:15
double ser_uint64_to_double(uint64_t y)
Definition: serialize.h:150
void SerializeMany(Stream &s)
Definition: serialize.h:945
I & n
Definition: serialize.h:430
Definition: prevector.h:38
uint64_t ser_readdata64(Stream &s)
Definition: serialize.h:132
LimitedString(std::string &_string)
Definition: serialize.h:503
#define X(name)
Definition: net.cpp:493
uint16_t htole16(uint16_t host_16bits)
Definition: endian.h:163
std::vector< uint8_t > data
Definition: bech32.cpp:10
void Serialize(Stream &s) const
Definition: serialize.h:487
uint16_t ser_readdata16be(Stream &s)
Definition: serialize.h:114
size_t size() const
Definition: serialize.h:937
Definition: serialize.h:910
static const unsigned int MAX_SIZE
Definition: serialize.h:27
uint64_t le64toh(uint64_t little_endian_64bits)
Definition: endian.h:233
const int nVersion
Definition: serialize.h:915
uint16_t be16toh(uint16_t big_endian_16bits)
Definition: endian.h:170
Definition: serialize.h:357
void Unserialize(Stream &s)
Definition: serialize.h:506
bool empty() const
Definition: prevector.h:281
uint64_t htole64(uint64_t host_64bits)
Definition: endian.h:219
CCompactSize(uint64_t &nIn)
Definition: serialize.h:484
uint32_t ser_readdata32be(Stream &s)
Definition: serialize.h:126
unsigned int GetSizeOfVarInt(I n)
Definition: serialize.h:366
size_t GetSerializeSizeMany(int nVersion, const T &... t)
Definition: serialize.h:998
void Unserialize(Stream &s, char &a)
Definition: serialize.h:222
iterator begin()
Definition: prevector.h:285
void ser_writedata16be(Stream &s, uint16_t obj)
Definition: serialize.h:82
uint64_t & n
Definition: serialize.h:482
signed long long int64_t
Definition: stdint.h:18
size_type size() const
Definition: prevector.h:277
void Serialize_impl(Stream &os, const prevector< N, T > &v, const unsigned char &)
Definition: serialize.h:641
T * NCONST_PTR(const T *val)
Definition: serialize.h:58
signed int int32_t
Definition: stdint.h:17
void Unserialize_impl(Stream &is, prevector< N, T > &v, const unsigned char &)
Definition: serialize.h:664
auto it
Definition: validation.cpp:360
uint32_t le32toh(uint32_t little_endian_32bits)
Definition: endian.h:205
T & REF(const T &val)
Definition: serialize.h:48
void Unserialize(Stream &s)
Definition: serialize.h:492
int GetVersion() const
Definition: serialize.h:941
Definition: serialize.h:479
void ser_writedata8(Stream &s, uint8_t obj)
Definition: serialize.h:73
float ser_uint32_to_float(uint32_t y)
Definition: serialize.h:156