Convert CCompactSize to proper formatter

This commit is contained in:
Pieter Wuille 2020-02-03 19:49:10 -08:00
parent 0c20809da8
commit 3ca574cef0

View file

@ -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);
} }
}; };