Changeset View
Changeset View
Standalone View
Standalone View
src/seeder/serialize.h
// Copyright (c) 2009-2010 Satoshi Nakamoto | // Copyright (c) 2009-2010 Satoshi Nakamoto | ||||
// Copyright (c) 2011 The Bitcoin developers | // Copyright (c) 2011 The Bitcoin developers | ||||
// Distributed under the MIT/X11 software license, see the accompanying | // Distributed under the MIT/X11 software license, see the accompanying | ||||
// file license.txt or http://www.opensource.org/licenses/mit-license.php. | // file license.txt or http://www.opensource.org/licenses/mit-license.php. | ||||
#ifndef BITCOIN_SEEDER_SERIALIZE_H | #ifndef BITCOIN_SEEDER_SERIALIZE_H | ||||
#define BITCOIN_SEEDER_SERIALIZE_H | #define BITCOIN_SEEDER_SERIALIZE_H | ||||
#include <cassert> | #include <cassert> | ||||
#include <climits> | #include <climits> | ||||
#include <cstdint> | |||||
#include <cstdio> | #include <cstdio> | ||||
#include <cstring> | #include <cstring> | ||||
#include <map> | #include <map> | ||||
#include <set> | #include <set> | ||||
#include <string> | #include <string> | ||||
#include <vector> | #include <vector> | ||||
#include <boost/tuple/tuple.hpp> | #include <boost/tuple/tuple.hpp> | ||||
#include <boost/tuple/tuple_comparison.hpp> | #include <boost/tuple/tuple_comparison.hpp> | ||||
#include <boost/tuple/tuple_io.hpp> | #include <boost/tuple/tuple_io.hpp> | ||||
#include <boost/type_traits/is_fundamental.hpp> | #include <boost/type_traits/is_fundamental.hpp> | ||||
#if defined(_MSC_VER) || defined(__BORLANDC__) | |||||
typedef __int64 int64; | |||||
typedef unsigned __int64 uint64; | |||||
#else | |||||
typedef long long int64; | |||||
typedef unsigned long long uint64; | |||||
#endif | |||||
#if defined(_MSC_VER) && _MSC_VER < 1300 | #if defined(_MSC_VER) && _MSC_VER < 1300 | ||||
#define for if (false); else for | #define for if (false); else for | ||||
#endif | #endif | ||||
#ifdef WIN32 | #ifdef WIN32 | ||||
#include <windows.h> | #include <windows.h> | ||||
// This is used to attempt to keep keying material out of swap | // This is used to attempt to keep keying material out of swap | ||||
// Note that VirtualLock does not provide this as a guarantee on Windows, | // Note that VirtualLock does not provide this as a guarantee on Windows, | ||||
▲ Show 20 Lines • Show All 90 Lines • ▼ Show 20 Lines | #define READWRITE(obj) \ | ||||
(nSerSize += ::SerReadWrite(s, (obj), nType, nVersion, ser_action)) | (nSerSize += ::SerReadWrite(s, (obj), nType, nVersion, ser_action)) | ||||
// | // | ||||
// Basic types | // Basic types | ||||
// | // | ||||
#define WRITEDATA(s, obj) s.write((char *)&(obj), sizeof(obj)) | #define WRITEDATA(s, obj) s.write((char *)&(obj), sizeof(obj)) | ||||
#define READDATA(s, obj) s.read((char *)&(obj), sizeof(obj)) | #define READDATA(s, obj) s.read((char *)&(obj), sizeof(obj)) | ||||
inline unsigned int GetSerializeSize(char a, int, int = 0) { | inline unsigned int GetSerializeSize(int8_t a, int, int = 0) { | ||||
return sizeof(a); | |||||
} | |||||
inline unsigned int GetSerializeSize(signed char a, int, int = 0) { | |||||
return sizeof(a); | return sizeof(a); | ||||
} | } | ||||
inline unsigned int GetSerializeSize(uint8_t a, int, int = 0) { | inline unsigned int GetSerializeSize(uint8_t a, int, int = 0) { | ||||
return sizeof(a); | return sizeof(a); | ||||
} | } | ||||
inline unsigned int GetSerializeSize(signed short a, int, int = 0) { | inline unsigned int GetSerializeSize(int16_t a, int, int = 0) { | ||||
return sizeof(a); | |||||
} | |||||
inline unsigned int GetSerializeSize(unsigned short a, int, int = 0) { | |||||
return sizeof(a); | |||||
} | |||||
inline unsigned int GetSerializeSize(signed int a, int, int = 0) { | |||||
return sizeof(a); | return sizeof(a); | ||||
} | } | ||||
inline unsigned int GetSerializeSize(unsigned int a, int, int = 0) { | inline unsigned int GetSerializeSize(uint16_t a, int, int = 0) { | ||||
return sizeof(a); | return sizeof(a); | ||||
} | } | ||||
inline unsigned int GetSerializeSize(signed long a, int, int = 0) { | inline unsigned int GetSerializeSize(int32_t a, int, int = 0) { | ||||
return sizeof(a); | return sizeof(a); | ||||
} | } | ||||
inline unsigned int GetSerializeSize(unsigned long a, int, int = 0) { | inline unsigned int GetSerializeSize(uint32_t a, int, int = 0) { | ||||
return sizeof(a); | return sizeof(a); | ||||
} | } | ||||
inline unsigned int GetSerializeSize(int64 a, int, int = 0) { | inline unsigned int GetSerializeSize(int64_t a, int, int = 0) { | ||||
return sizeof(a); | return sizeof(a); | ||||
} | } | ||||
inline unsigned int GetSerializeSize(uint64 a, int, int = 0) { | inline unsigned int GetSerializeSize(uint64_t a, int, int = 0) { | ||||
return sizeof(a); | return sizeof(a); | ||||
} | } | ||||
inline unsigned int GetSerializeSize(float a, int, int = 0) { | inline unsigned int GetSerializeSize(float a, int, int = 0) { | ||||
return sizeof(a); | return sizeof(a); | ||||
} | } | ||||
inline unsigned int GetSerializeSize(double a, int, int = 0) { | inline unsigned int GetSerializeSize(double a, int, int = 0) { | ||||
return sizeof(a); | return sizeof(a); | ||||
} | } | ||||
template <typename Stream> | template <typename Stream> | ||||
inline void Serialize(Stream &s, char a, int, int = 0) { | inline void Serialize(Stream &s, int8_t a, int, int = 0) { | ||||
WRITEDATA(s, a); | |||||
} | |||||
template <typename Stream> | |||||
inline void Serialize(Stream &s, signed char a, int, int = 0) { | |||||
WRITEDATA(s, a); | WRITEDATA(s, a); | ||||
} | } | ||||
template <typename Stream> | template <typename Stream> | ||||
inline void Serialize(Stream &s, uint8_t a, int, int = 0) { | inline void Serialize(Stream &s, uint8_t a, int, int = 0) { | ||||
WRITEDATA(s, a); | WRITEDATA(s, a); | ||||
} | } | ||||
template <typename Stream> | template <typename Stream> | ||||
inline void Serialize(Stream &s, signed short a, int, int = 0) { | inline void Serialize(Stream &s, int16_t a, int, int = 0) { | ||||
WRITEDATA(s, a); | |||||
} | |||||
template <typename Stream> | |||||
inline void Serialize(Stream &s, unsigned short a, int, int = 0) { | |||||
WRITEDATA(s, a); | WRITEDATA(s, a); | ||||
} | } | ||||
template <typename Stream> | template <typename Stream> | ||||
inline void Serialize(Stream &s, signed int a, int, int = 0) { | inline void Serialize(Stream &s, uint16_t a, int, int = 0) { | ||||
WRITEDATA(s, a); | WRITEDATA(s, a); | ||||
} | } | ||||
template <typename Stream> | template <typename Stream> | ||||
inline void Serialize(Stream &s, unsigned int a, int, int = 0) { | inline void Serialize(Stream &s, int32_t a, int, int = 0) { | ||||
WRITEDATA(s, a); | WRITEDATA(s, a); | ||||
} | } | ||||
template <typename Stream> | template <typename Stream> | ||||
inline void Serialize(Stream &s, signed long a, int, int = 0) { | inline void Serialize(Stream &s, uint32_t a, int, int = 0) { | ||||
WRITEDATA(s, a); | WRITEDATA(s, a); | ||||
} | } | ||||
template <typename Stream> | template <typename Stream> | ||||
inline void Serialize(Stream &s, unsigned long a, int, int = 0) { | inline void Serialize(Stream &s, int64_t a, int, int = 0) { | ||||
WRITEDATA(s, a); | WRITEDATA(s, a); | ||||
} | } | ||||
template <typename Stream> | template <typename Stream> | ||||
inline void Serialize(Stream &s, int64 a, int, int = 0) { | inline void Serialize(Stream &s, uint64_t a, int, int = 0) { | ||||
WRITEDATA(s, a); | |||||
} | |||||
template <typename Stream> | |||||
inline void Serialize(Stream &s, uint64 a, int, int = 0) { | |||||
WRITEDATA(s, a); | WRITEDATA(s, a); | ||||
} | } | ||||
template <typename Stream> | template <typename Stream> | ||||
inline void Serialize(Stream &s, float a, int, int = 0) { | inline void Serialize(Stream &s, float a, int, int = 0) { | ||||
WRITEDATA(s, a); | WRITEDATA(s, a); | ||||
} | } | ||||
template <typename Stream> | template <typename Stream> | ||||
inline void Serialize(Stream &s, double a, int, int = 0) { | inline void Serialize(Stream &s, double a, int, int = 0) { | ||||
WRITEDATA(s, a); | WRITEDATA(s, a); | ||||
} | } | ||||
template <typename Stream> | template <typename Stream> | ||||
inline void Unserialize(Stream &s, char &a, int, int = 0) { | inline void Unserialize(Stream &s, int8_t &a, int, int = 0) { | ||||
READDATA(s, a); | |||||
} | |||||
template <typename Stream> | |||||
inline void Unserialize(Stream &s, signed char &a, int, int = 0) { | |||||
READDATA(s, a); | READDATA(s, a); | ||||
} | } | ||||
template <typename Stream> | template <typename Stream> | ||||
inline void Unserialize(Stream &s, uint8_t &a, int, int = 0) { | inline void Unserialize(Stream &s, uint8_t &a, int, int = 0) { | ||||
READDATA(s, a); | READDATA(s, a); | ||||
} | } | ||||
template <typename Stream> | template <typename Stream> | ||||
inline void Unserialize(Stream &s, signed short &a, int, int = 0) { | inline void Unserialize(Stream &s, int16_t &a, int, int = 0) { | ||||
READDATA(s, a); | READDATA(s, a); | ||||
} | } | ||||
template <typename Stream> | template <typename Stream> | ||||
inline void Unserialize(Stream &s, unsigned short &a, int, int = 0) { | inline void Unserialize(Stream &s, uint16_t &a, int, int = 0) { | ||||
READDATA(s, a); | READDATA(s, a); | ||||
} | } | ||||
template <typename Stream> | template <typename Stream> | ||||
inline void Unserialize(Stream &s, signed int &a, int, int = 0) { | inline void Unserialize(Stream &s, int32_t &a, int, int = 0) { | ||||
READDATA(s, a); | READDATA(s, a); | ||||
} | } | ||||
template <typename Stream> | template <typename Stream> | ||||
inline void Unserialize(Stream &s, unsigned int &a, int, int = 0) { | inline void Unserialize(Stream &s, uint32_t &a, int, int = 0) { | ||||
READDATA(s, a); | READDATA(s, a); | ||||
} | } | ||||
template <typename Stream> | template <typename Stream> | ||||
inline void Unserialize(Stream &s, signed long &a, int, int = 0) { | inline void Unserialize(Stream &s, int64_t &a, int, int = 0) { | ||||
READDATA(s, a); | READDATA(s, a); | ||||
} | } | ||||
template <typename Stream> | template <typename Stream> | ||||
inline void Unserialize(Stream &s, unsigned long &a, int, int = 0) { | inline void Unserialize(Stream &s, uint64_t &a, int, int = 0) { | ||||
READDATA(s, a); | |||||
} | |||||
template <typename Stream> | |||||
inline void Unserialize(Stream &s, int64 &a, int, int = 0) { | |||||
READDATA(s, a); | |||||
} | |||||
template <typename Stream> | |||||
inline void Unserialize(Stream &s, uint64 &a, int, int = 0) { | |||||
READDATA(s, a); | READDATA(s, a); | ||||
} | } | ||||
template <typename Stream> | template <typename Stream> | ||||
inline void Unserialize(Stream &s, float &a, int, int = 0) { | inline void Unserialize(Stream &s, float &a, int, int = 0) { | ||||
READDATA(s, a); | READDATA(s, a); | ||||
} | } | ||||
template <typename Stream> | template <typename Stream> | ||||
inline void Unserialize(Stream &s, double &a, int, int = 0) { | inline void Unserialize(Stream &s, double &a, int, int = 0) { | ||||
Show All 17 Lines | |||||
// | // | ||||
// Compact size | // Compact size | ||||
// size < 253 -- 1 byte | // size < 253 -- 1 byte | ||||
// size <= USHRT_MAX -- 3 bytes (253 + 2 bytes) | // size <= USHRT_MAX -- 3 bytes (253 + 2 bytes) | ||||
// size <= UINT_MAX -- 5 bytes (254 + 4 bytes) | // size <= UINT_MAX -- 5 bytes (254 + 4 bytes) | ||||
// size > UINT_MAX -- 9 bytes (255 + 8 bytes) | // size > UINT_MAX -- 9 bytes (255 + 8 bytes) | ||||
// | // | ||||
inline unsigned int GetSizeOfCompactSize(uint64 nSize) { | inline unsigned int GetSizeOfCompactSize(uint64_t nSize) { | ||||
if (nSize < 253) | if (nSize < 253) | ||||
return sizeof(uint8_t); | return sizeof(uint8_t); | ||||
else if (nSize <= USHRT_MAX) | else if (nSize <= USHRT_MAX) | ||||
return sizeof(uint8_t) + sizeof(unsigned short); | return sizeof(uint8_t) + sizeof(uint16_t); | ||||
else if (nSize <= UINT_MAX) | else if (nSize <= UINT_MAX) | ||||
return sizeof(uint8_t) + sizeof(unsigned int); | return sizeof(uint8_t) + sizeof(uint32_t); | ||||
else | else | ||||
return sizeof(uint8_t) + sizeof(uint64); | return sizeof(uint8_t) + sizeof(uint64_t); | ||||
} | } | ||||
template <typename Stream> void WriteCompactSize(Stream &os, uint64 nSize) { | template <typename Stream> void WriteCompactSize(Stream &os, uint64_t nSize) { | ||||
if (nSize < 253) { | if (nSize < 253) { | ||||
uint8_t chSize = nSize; | uint8_t chSize = nSize; | ||||
WRITEDATA(os, chSize); | WRITEDATA(os, chSize); | ||||
} else if (nSize <= USHRT_MAX) { | } else if (nSize <= USHRT_MAX) { | ||||
uint8_t chSize = 253; | uint8_t chSize = 253; | ||||
unsigned short xSize = nSize; | uint16_t xSize = nSize; | ||||
WRITEDATA(os, chSize); | WRITEDATA(os, chSize); | ||||
WRITEDATA(os, xSize); | WRITEDATA(os, xSize); | ||||
} else if (nSize <= UINT_MAX) { | } else if (nSize <= UINT_MAX) { | ||||
uint8_t chSize = 254; | uint8_t chSize = 254; | ||||
unsigned int xSize = nSize; | uint32_t xSize = nSize; | ||||
WRITEDATA(os, chSize); | WRITEDATA(os, chSize); | ||||
WRITEDATA(os, xSize); | WRITEDATA(os, xSize); | ||||
} else { | } else { | ||||
uint8_t chSize = 255; | uint8_t chSize = 255; | ||||
uint64 xSize = nSize; | uint64_t xSize = nSize; | ||||
WRITEDATA(os, chSize); | WRITEDATA(os, chSize); | ||||
WRITEDATA(os, xSize); | WRITEDATA(os, xSize); | ||||
} | } | ||||
return; | return; | ||||
} | } | ||||
template <typename Stream> uint64 ReadCompactSize(Stream &is) { | template <typename Stream> uint64_t ReadCompactSize(Stream &is) { | ||||
uint8_t chSize; | uint8_t chSize; | ||||
READDATA(is, chSize); | READDATA(is, chSize); | ||||
uint64 nSizeRet = 0; | uint64_t nSizeRet = 0; | ||||
if (chSize < 253) { | if (chSize < 253) { | ||||
nSizeRet = chSize; | nSizeRet = chSize; | ||||
} else if (chSize == 253) { | } else if (chSize == 253) { | ||||
unsigned short xSize; | uint16_t xSize; | ||||
READDATA(is, xSize); | READDATA(is, xSize); | ||||
nSizeRet = xSize; | nSizeRet = xSize; | ||||
} else if (chSize == 254) { | } else if (chSize == 254) { | ||||
unsigned int xSize; | uint32_t xSize; | ||||
READDATA(is, xSize); | READDATA(is, xSize); | ||||
nSizeRet = xSize; | nSizeRet = xSize; | ||||
} else { | } else { | ||||
uint64 xSize; | uint64_t xSize; | ||||
READDATA(is, xSize); | READDATA(is, xSize); | ||||
nSizeRet = xSize; | nSizeRet = xSize; | ||||
} | } | ||||
if (nSizeRet > (uint64)MAX_SIZE) | if (nSizeRet > uint64_t(MAX_SIZE)) { | ||||
throw std::ios_base::failure("ReadCompactSize() : size too large"); | throw std::ios_base::failure("ReadCompactSize() : size too large"); | ||||
} | |||||
return nSizeRet; | return nSizeRet; | ||||
} | } | ||||
// | // | ||||
// Wrapper for serializing arrays and POD | // Wrapper for serializing arrays and POD | ||||
// There's a clever template way to make arrays serialize normally, but MSVC6 | // There's a clever template way to make arrays serialize normally, but MSVC6 | ||||
// doesn't support it | // doesn't support it | ||||
// | // | ||||
▲ Show 20 Lines • Show All 993 Lines • Show Last 20 Lines |