mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-01-10 20:03:34 -03:00
Convert CCompactSize to proper formatter
This commit is contained in:
parent
0c20809da8
commit
3ca574cef0
1 changed files with 18 additions and 13 deletions
|
@ -495,7 +495,7 @@ static inline Wrapper<Formatter, T&> Using(T&& t) { return Wrapper<Formatter, T&
|
||||||
|
|
||||||
#define VARINT_MODE(obj, mode) Using<VarIntFormatter<mode>>(obj)
|
#define VARINT_MODE(obj, mode) Using<VarIntFormatter<mode>>(obj)
|
||||||
#define VARINT(obj) Using<VarIntFormatter<VarIntMode::DEFAULT>>(obj)
|
#define VARINT(obj) Using<VarIntFormatter<VarIntMode::DEFAULT>>(obj)
|
||||||
#define COMPACTSIZE(obj) CCompactSize(REF(obj))
|
#define COMPACTSIZE(obj) Using<CompactSizeFormatter>(obj)
|
||||||
#define LIMITED_STRING(obj,n) LimitedString< n >(REF(obj))
|
#define LIMITED_STRING(obj,n) LimitedString< n >(REF(obj))
|
||||||
|
|
||||||
/** Serialization wrapper class for integers in VarInt format. */
|
/** Serialization wrapper class for integers in VarInt format. */
|
||||||
|
@ -547,21 +547,26 @@ public:
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
class CCompactSize
|
/** Formatter for integers in CompactSize format. */
|
||||||
|
struct CompactSizeFormatter
|
||||||
{
|
{
|
||||||
protected:
|
template<typename Stream, typename I>
|
||||||
uint64_t &n;
|
void Unser(Stream& s, I& v)
|
||||||
public:
|
{
|
||||||
explicit CCompactSize(uint64_t& nIn) : n(nIn) { }
|
uint64_t n = ReadCompactSize<Stream>(s);
|
||||||
|
if (n < std::numeric_limits<I>::min() || n > std::numeric_limits<I>::max()) {
|
||||||
template<typename Stream>
|
throw std::ios_base::failure("CompactSize exceeds limit of type");
|
||||||
void Serialize(Stream &s) const {
|
}
|
||||||
WriteCompactSize<Stream>(s, n);
|
v = n;
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename Stream>
|
template<typename Stream, typename I>
|
||||||
void Unserialize(Stream& s) {
|
void Ser(Stream& s, I v)
|
||||||
n = ReadCompactSize<Stream>(s);
|
{
|
||||||
|
static_assert(std::is_unsigned<I>::value, "CompactSize only supported for unsigned integers");
|
||||||
|
static_assert(std::numeric_limits<I>::max() <= std::numeric_limits<uint64_t>::max(), "CompactSize only supports 64-bit integers and below");
|
||||||
|
|
||||||
|
WriteCompactSize<Stream>(s, v);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue