Skip to content

Commit

Permalink
Convert CCompactSize to proper formatter
Browse files Browse the repository at this point in the history
  • Loading branch information
sipa committed Feb 15, 2020
1 parent 0c20809 commit 3ca574c
Showing 1 changed file with 18 additions and 13 deletions.
31 changes: 18 additions & 13 deletions src/serialize.h
Expand Up @@ -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(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))

/** Serialization wrapper class for integers in VarInt format. */
Expand Down Expand Up @@ -547,21 +547,26 @@ class BigEndian
}
};

class CCompactSize
/** Formatter for integers in CompactSize format. */
struct CompactSizeFormatter
{
protected:
uint64_t &n;
public:
explicit CCompactSize(uint64_t& nIn) : n(nIn) { }

template<typename Stream>
void Serialize(Stream &s) const {
WriteCompactSize<Stream>(s, n);
template<typename Stream, typename I>
void Unser(Stream& s, I& v)
{
uint64_t n = ReadCompactSize<Stream>(s);
if (n < std::numeric_limits<I>::min() || n > std::numeric_limits<I>::max()) {
throw std::ios_base::failure("CompactSize exceeds limit of type");
}
v = n;
}

template<typename Stream>
void Unserialize(Stream& s) {
n = ReadCompactSize<Stream>(s);
template<typename Stream, typename I>
void Ser(Stream& s, I v)
{
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);
}
};

Expand Down

0 comments on commit 3ca574c

Please sign in to comment.