![]() |
BSHA3
0.17.99
P2P Blockchain, based on Bitcoin
|
#include <compat/endian.h>
#include <algorithm>
#include <assert.h>
#include <ios>
#include <limits>
#include <map>
#include <memory>
#include <set>
#include <stdint.h>
#include <string>
#include <string.h>
#include <utility>
#include <vector>
#include <prevector.h>
#include <span.h>
Go to the source code of this file.
Classes | |
struct | deserialize_type |
Dummy data type to identify deserializing constructors. More... | |
struct | CheckVarIntMode< Mode, I > |
class | CVarInt< Mode, I > |
class | BigEndian< I > |
Serialization wrapper class for big-endian integers. More... | |
class | CCompactSize |
class | LimitedString< Limit > |
struct | CSerActionSerialize |
Support for ADD_SERIALIZE_METHODS and READWRITE macro. More... | |
struct | CSerActionUnserialize |
class | CSizeComputer |
Macros | |
#define | READWRITE(...) (::SerReadWriteMany(s, ser_action, __VA_ARGS__)) |
#define | READWRITEAS(type, obj) (::SerReadWriteMany(s, ser_action, ReadWriteAsHelper<type>(obj))) |
#define | ADD_SERIALIZE_METHODS |
Implement three methods for serializable objects. More... | |
#define | VARINT(obj, ...) WrapVarInt<__VA_ARGS__>(REF(obj)) |
#define | COMPACTSIZE(obj) CCompactSize(REF(obj)) |
#define | LIMITED_STRING(obj, n) LimitedString< n >(REF(obj)) |
Enumerations | |
enum | { SER_NETWORK = (1 << 0), SER_DISK = (1 << 1), SER_GETHASH = (1 << 2) } |
enum | VarIntMode { VarIntMode::DEFAULT, VarIntMode::NONNEGATIVE_SIGNED } |
Variable-length integers: bytes are a MSB base-128 encoding of the number. More... | |
Functions | |
template<typename T > | |
T & | REF (const T &val) |
Used to bypass the rule against non-const reference to temporary where it makes sense with wrappers. More... | |
template<typename T > | |
T * | NCONST_PTR (const T *val) |
Used to acquire a non-const pointer "this" to generate bodies of const serialization operations from a template. More... | |
char * | CharCast (char *c) |
Safely convert odd char pointer types to standard ones. More... | |
char * | CharCast (unsigned char *c) |
const char * | CharCast (const char *c) |
const char * | CharCast (const unsigned char *c) |
template<typename Stream > | |
void | ser_writedata8 (Stream &s, uint8_t obj) |
template<typename Stream > | |
void | ser_writedata16 (Stream &s, uint16_t obj) |
template<typename Stream > | |
void | ser_writedata16be (Stream &s, uint16_t obj) |
template<typename Stream > | |
void | ser_writedata32 (Stream &s, uint32_t obj) |
template<typename Stream > | |
void | ser_writedata64 (Stream &s, uint64_t obj) |
template<typename Stream > | |
uint8_t | ser_readdata8 (Stream &s) |
template<typename Stream > | |
uint16_t | ser_readdata16 (Stream &s) |
template<typename Stream > | |
uint16_t | ser_readdata16be (Stream &s) |
template<typename Stream > | |
uint32_t | ser_readdata32 (Stream &s) |
template<typename Stream > | |
uint64_t | ser_readdata64 (Stream &s) |
uint64_t | ser_double_to_uint64 (double x) |
uint32_t | ser_float_to_uint32 (float x) |
double | ser_uint64_to_double (uint64_t y) |
float | ser_uint32_to_float (uint32_t y) |
template<typename X > | |
X & | ReadWriteAsHelper (X &x) |
Convert the reference base type to X, without changing constness or reference type. More... | |
template<typename X > | |
const X & | ReadWriteAsHelper (const X &x) |
template<typename Stream > | |
void | Serialize (Stream &s, char a) |
template<typename Stream > | |
void | Serialize (Stream &s, int8_t a) |
template<typename Stream > | |
void | Serialize (Stream &s, uint8_t a) |
template<typename Stream > | |
void | Serialize (Stream &s, int16_t a) |
template<typename Stream > | |
void | Serialize (Stream &s, uint16_t a) |
template<typename Stream > | |
void | Serialize (Stream &s, int32_t a) |
template<typename Stream > | |
void | Serialize (Stream &s, uint32_t a) |
template<typename Stream > | |
void | Serialize (Stream &s, int64_t a) |
template<typename Stream > | |
void | Serialize (Stream &s, uint64_t a) |
template<typename Stream > | |
void | Serialize (Stream &s, float a) |
template<typename Stream > | |
void | Serialize (Stream &s, double a) |
template<typename Stream , int N> | |
void | Serialize (Stream &s, const char(&a)[N]) |
template<typename Stream , int N> | |
void | Serialize (Stream &s, const unsigned char(&a)[N]) |
template<typename Stream > | |
void | Serialize (Stream &s, const Span< const unsigned char > &span) |
template<typename Stream > | |
void | Serialize (Stream &s, const Span< unsigned char > &span) |
template<typename Stream > | |
void | Unserialize (Stream &s, char &a) |
template<typename Stream > | |
void | Unserialize (Stream &s, int8_t &a) |
template<typename Stream > | |
void | Unserialize (Stream &s, uint8_t &a) |
template<typename Stream > | |
void | Unserialize (Stream &s, int16_t &a) |
template<typename Stream > | |
void | Unserialize (Stream &s, uint16_t &a) |
template<typename Stream > | |
void | Unserialize (Stream &s, int32_t &a) |
template<typename Stream > | |
void | Unserialize (Stream &s, uint32_t &a) |
template<typename Stream > | |
void | Unserialize (Stream &s, int64_t &a) |
template<typename Stream > | |
void | Unserialize (Stream &s, uint64_t &a) |
template<typename Stream > | |
void | Unserialize (Stream &s, float &a) |
template<typename Stream > | |
void | Unserialize (Stream &s, double &a) |
template<typename Stream , int N> | |
void | Unserialize (Stream &s, char(&a)[N]) |
template<typename Stream , int N> | |
void | Unserialize (Stream &s, unsigned char(&a)[N]) |
template<typename Stream > | |
void | Unserialize (Stream &s, Span< unsigned char > &span) |
template<typename Stream > | |
void | Serialize (Stream &s, bool a) |
template<typename Stream > | |
void | Unserialize (Stream &s, bool &a) |
unsigned int | GetSizeOfCompactSize (uint64_t nSize) |
Compact Size size < 253 – 1 byte size <= USHRT_MAX – 3 bytes (253 + 2 bytes) size <= UINT_MAX – 5 bytes (254 + 4 bytes) size > UINT_MAX – 9 bytes (255 + 8 bytes) More... | |
void | WriteCompactSize (CSizeComputer &os, uint64_t nSize) |
template<typename Stream > | |
void | WriteCompactSize (Stream &os, uint64_t nSize) |
template<typename Stream > | |
uint64_t | ReadCompactSize (Stream &is) |
template<VarIntMode Mode, typename I > | |
unsigned int | GetSizeOfVarInt (I n) |
template<typename I > | |
void | WriteVarInt (CSizeComputer &os, I n) |
template<typename Stream , VarIntMode Mode, typename I > | |
void | WriteVarInt (Stream &os, I n) |
template<typename Stream , VarIntMode Mode, typename I > | |
I | ReadVarInt (Stream &is) |
template<VarIntMode Mode = VarIntMode::DEFAULT, typename I > | |
CVarInt< Mode, I > | WrapVarInt (I &n) |
template<typename I > | |
BigEndian< I > | WrapBigEndian (I &n) |
template<typename Stream , typename C > | |
void | Serialize (Stream &os, const std::basic_string< C > &str) |
Forward declarations. More... | |
template<typename Stream , typename C > | |
void | Unserialize (Stream &is, std::basic_string< C > &str) |
template<typename Stream , unsigned int N, typename T > | |
void | Serialize_impl (Stream &os, const prevector< N, T > &v, const unsigned char &) |
prevector prevectors of unsigned char are a special case and are intended to be serialized as a single opaque blob. More... | |
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 > | |
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 > | |
void | Unserialize (Stream &is, prevector< N, T > &v) |
template<typename Stream , typename T , typename A > | |
void | Serialize_impl (Stream &os, const std::vector< T, A > &v, const unsigned char &) |
vector vectors of unsigned char are a special case and are intended to be serialized as a single opaque blob. More... | |
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 > | |
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 > | |
void | Unserialize (Stream &is, std::vector< T, A > &v) |
template<typename Stream , typename K , typename T > | |
void | Serialize (Stream &os, const std::pair< K, T > &item) |
pair More... | |
template<typename Stream , typename K , typename T > | |
void | Unserialize (Stream &is, std::pair< K, T > &item) |
template<typename Stream , typename K , typename T , typename Pred , typename A > | |
void | Serialize (Stream &os, const std::map< K, T, Pred, A > &m) |
map More... | |
template<typename Stream , typename K , typename T , typename Pred , typename A > | |
void | Unserialize (Stream &is, std::map< K, T, Pred, A > &m) |
template<typename Stream , typename K , typename Pred , typename A > | |
void | Serialize (Stream &os, const std::set< K, Pred, A > &m) |
set More... | |
template<typename Stream , typename K , typename Pred , typename A > | |
void | Unserialize (Stream &is, std::set< K, Pred, A > &m) |
template<typename Stream , typename T > | |
void | Serialize (Stream &os, const std::shared_ptr< const T > &p) |
shared_ptr More... | |
template<typename Stream , typename T > | |
void | Unserialize (Stream &os, std::shared_ptr< const T > &p) |
template<typename Stream , typename T > | |
void | Serialize (Stream &os, const std::unique_ptr< const T > &p) |
unique_ptr More... | |
template<typename Stream , typename T > | |
void | Unserialize (Stream &os, std::unique_ptr< const T > &p) |
template<typename Stream , typename T > | |
void | Serialize (Stream &os, const T &a) |
If none of the specialized versions above matched, default to calling member function. More... | |
template<typename Stream , typename T > | |
void | Unserialize (Stream &is, T &&a) |
template<typename Stream > | |
void | SerializeMany (Stream &s) |
template<typename Stream , typename Arg , typename... Args> | |
void | SerializeMany (Stream &s, const Arg &arg, const Args &... args) |
template<typename Stream > | |
void | UnserializeMany (Stream &s) |
template<typename Stream , typename Arg , typename... Args> | |
void | UnserializeMany (Stream &s, Arg &&arg, Args &&... args) |
template<typename Stream , typename... Args> | |
void | SerReadWriteMany (Stream &s, CSerActionSerialize ser_action, const Args &... args) |
template<typename Stream , typename... Args> | |
void | SerReadWriteMany (Stream &s, CSerActionUnserialize ser_action, Args &&... args) |
template<typename T > | |
size_t | GetSerializeSize (const T &t, int nVersion=0) |
template<typename... T> | |
size_t | GetSerializeSizeMany (int nVersion, const T &... t) |
Variables | |
constexpr deserialize_type | deserialize {} |
#define ADD_SERIALIZE_METHODS |
Implement three methods for serializable objects.
These are actually wrappers over "SerializationOp" template, which implements the body of each class' serialization code. Adding "ADD_SERIALIZE_METHODS" in the body of the class causes these wrappers to be added as members.
Definition at line 182 of file serialize.h.
#define COMPACTSIZE | ( | obj | ) | CCompactSize(REF(obj)) |
Definition at line 412 of file serialize.h.
#define LIMITED_STRING | ( | obj, | |
n | |||
) | LimitedString< n >(REF(obj)) |
Definition at line 413 of file serialize.h.
#define READWRITE | ( | ... | ) | (::SerReadWriteMany(s, ser_action, __VA_ARGS__)) |
Definition at line 173 of file serialize.h.
#define READWRITEAS | ( | type, | |
obj | |||
) | (::SerReadWriteMany(s, ser_action, ReadWriteAsHelper<type>(obj))) |
Definition at line 174 of file serialize.h.
#define VARINT | ( | obj, | |
... | |||
) | WrapVarInt<__VA_ARGS__>(REF(obj)) |
Definition at line 411 of file serialize.h.
anonymous enum |
Enumerator | |
---|---|
SER_NETWORK | |
SER_DISK | |
SER_GETHASH |
Definition at line 161 of file serialize.h.
|
strong |
Variable-length integers: bytes are a MSB base-128 encoding of the number.
The high bit in each byte signifies whether another digit follows. To make sure the encoding is one-to-one, one is subtracted from all but the last digit. Thus, the byte sequence a[] with length len, where all but the last byte has bit 128 set, encodes the number:
(a[len-1] & 0x7F) + sum(i=1..len-1, 128^i*((a[len-i-1] & 0x7F)+1))
Properties:
0: [0x00] 256: [0x81 0x00] 1: [0x01] 16383: [0xFE 0x7F] 127: [0x7F] 16384: [0xFF 0x00] 128: [0x80 0x00] 16511: [0xFF 0x7F] 255: [0x80 0x7F] 65535: [0x82 0xFE 0x7F] 2^32: [0x8E 0xFE 0xFE 0xFF 0x00] Mode for encoding VarInts.
Currently there is no support for signed encodings. The default mode will not compile with signed values, and the legacy "nonnegative signed" mode will accept signed values, but improperly encode and decode them if they are negative. In the future, the DEFAULT mode could be extended to support negative numbers in a backwards compatible way, and additional modes could be added to support different varint formats (e.g. zigzag encoding).
Enumerator | |
---|---|
DEFAULT | |
NONNEGATIVE_SIGNED |
Definition at line 343 of file serialize.h.
|
inline |
Safely convert odd char pointer types to standard ones.
Definition at line 64 of file serialize.h.
|
inline |
Definition at line 65 of file serialize.h.
|
inline |
Definition at line 66 of file serialize.h.
|
inline |
Definition at line 67 of file serialize.h.
size_t GetSerializeSize | ( | const T & | t, |
int | nVersion = 0 |
||
) |
size_t GetSerializeSizeMany | ( | int | nVersion, |
const T &... | t | ||
) |
Definition at line 987 of file serialize.h.
|
inline |
Compact Size size < 253 – 1 byte size <= USHRT_MAX – 3 bytes (253 + 2 bytes) size <= UINT_MAX – 5 bytes (254 + 4 bytes) size > UINT_MAX – 9 bytes (255 + 8 bytes)
Definition at line 242 of file serialize.h.
|
inline |
Definition at line 355 of file serialize.h.
|
inline |
Used to acquire a non-const pointer "this" to generate bodies of const serialization operations from a template.
Definition at line 58 of file serialize.h.
uint64_t ReadCompactSize | ( | Stream & | is | ) |
Definition at line 278 of file serialize.h.
I ReadVarInt | ( | Stream & | is | ) |
Convert the reference base type to X, without changing constness or reference type.
Definition at line 170 of file serialize.h.
Definition at line 171 of file serialize.h.
|
inline |
Used to bypass the rule against non-const reference to temporary where it makes sense with wrappers.
Definition at line 48 of file serialize.h.
|
inline |
|
inline |
|
inline |
Definition at line 103 of file serialize.h.
|
inline |
Definition at line 109 of file serialize.h.
|
inline |
Definition at line 115 of file serialize.h.
|
inline |
Definition at line 121 of file serialize.h.
|
inline |
|
inline |
|
inline |
|
inline |
Definition at line 77 of file serialize.h.
|
inline |
Definition at line 82 of file serialize.h.
|
inline |
Definition at line 87 of file serialize.h.
|
inline |
Definition at line 92 of file serialize.h.
|
inline |
|
inline |
Definition at line 193 of file serialize.h.
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
Definition at line 205 of file serialize.h.
|
inline |
|
inline |
|
inline |
|
inline |
void Serialize | ( | Stream & | os, |
const std::basic_string< C > & | str | ||
) |
Forward declarations.
string
Definition at line 608 of file serialize.h.
|
inline |
|
inline |
void Serialize | ( | Stream & | os, |
const std::pair< K, T > & | item | ||
) |
void Serialize | ( | Stream & | os, |
const std::map< K, T, Pred, A > & | m | ||
) |
void Serialize | ( | Stream & | os, |
const std::set< K, Pred, A > & | m | ||
) |
void Serialize | ( | Stream & | os, |
const std::shared_ptr< const T > & | p | ||
) |
void Serialize | ( | Stream & | os, |
const std::unique_ptr< const T > & | p | ||
) |
|
inline |
If none of the specialized versions above matched, default to calling member function.
Definition at line 589 of file serialize.h.
void Serialize_impl | ( | Stream & | os, |
const prevector< N, T > & | v, | ||
const unsigned char & | |||
) |
prevector prevectors of unsigned char are a special case and are intended to be serialized as a single opaque blob.
prevector
Definition at line 630 of file serialize.h.
void Serialize_impl | ( | Stream & | os, |
const prevector< N, T > & | v, | ||
const V & | |||
) |
void Serialize_impl | ( | Stream & | os, |
const std::vector< T, A > & | v, | ||
const unsigned char & | |||
) |
vector vectors of unsigned char are a special case and are intended to be serialized as a single opaque blob.
vector
Definition at line 698 of file serialize.h.
void Serialize_impl | ( | Stream & | os, |
const std::vector< T, A > & | v, | ||
const V & | |||
) |
void SerializeMany | ( | Stream & | s | ) |
void SerializeMany | ( | Stream & | s, |
const Arg & | arg, | ||
const Args &... | args | ||
) |
|
inline |
|
inline |
|
inline |
Definition at line 211 of file serialize.h.
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
Definition at line 223 of file serialize.h.
|
inline |
|
inline |
|
inline |
void Unserialize | ( | Stream & | is, |
std::basic_string< C > & | str | ||
) |
|
inline |
|
inline |
void Unserialize | ( | Stream & | is, |
std::pair< K, T > & | item | ||
) |
void Unserialize | ( | Stream & | is, |
std::map< K, T, Pred, A > & | m | ||
) |
void Unserialize | ( | Stream & | is, |
std::set< K, Pred, A > & | m | ||
) |
void Unserialize | ( | Stream & | os, |
std::shared_ptr< const T > & | p | ||
) |
Definition at line 862 of file serialize.h.
void Unserialize | ( | Stream & | os, |
std::unique_ptr< const T > & | p | ||
) |
Definition at line 845 of file serialize.h.
|
inline |
Definition at line 595 of file serialize.h.
void Unserialize_impl | ( | Stream & | is, |
prevector< N, T > & | v, | ||
const unsigned char & | |||
) |
Definition at line 653 of file serialize.h.
void Unserialize_impl | ( | Stream & | is, |
prevector< N, T > & | v, | ||
const V & | |||
) |
void Unserialize_impl | ( | Stream & | is, |
std::vector< T, A > & | v, | ||
const unsigned char & | |||
) |
void Unserialize_impl | ( | Stream & | is, |
std::vector< T, A > & | v, | ||
const V & | |||
) |
|
inline |
|
inline |
BigEndian<I> WrapBigEndian | ( | I & | n | ) |
CVarInt<Mode, I> WrapVarInt | ( | I & | n | ) |
Definition at line 516 of file serialize.h.
|
inline |
Definition at line 975 of file serialize.h.
void WriteCompactSize | ( | Stream & | os, |
uint64_t | nSize | ||
) |
|
inline |
void WriteVarInt | ( | Stream & | os, |
I | n | ||
) |
constexpr deserialize_type deserialize {} |
Definition at line 41 of file serialize.h.