mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-01-10 20:03:34 -03:00
Add CustomUintFormatter
This commit is contained in:
parent
10633398f2
commit
e574fff53e
1 changed files with 22 additions and 0 deletions
|
@ -513,6 +513,28 @@ struct VarIntFormatter
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
template<int Bytes>
|
||||||
|
struct CustomUintFormatter
|
||||||
|
{
|
||||||
|
static_assert(Bytes > 0 && Bytes <= 8, "CustomUintFormatter Bytes out of range");
|
||||||
|
static constexpr uint64_t MAX = 0xffffffffffffffff >> (8 * (8 - Bytes));
|
||||||
|
|
||||||
|
template <typename Stream, typename I> void Ser(Stream& s, I v)
|
||||||
|
{
|
||||||
|
if (v < 0 || v > MAX) throw std::ios_base::failure("CustomUintFormatter value out of range");
|
||||||
|
uint64_t raw = htole64(v);
|
||||||
|
s.write((const char*)&raw, Bytes);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename Stream, typename I> void Unser(Stream& s, I& v)
|
||||||
|
{
|
||||||
|
static_assert(std::numeric_limits<I>::max() >= MAX && std::numeric_limits<I>::min() <= 0, "CustomUintFormatter type too small");
|
||||||
|
uint64_t raw = 0;
|
||||||
|
s.read((char*)&raw, Bytes);
|
||||||
|
v = le64toh(raw);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
/** Serialization wrapper class for big-endian integers.
|
/** Serialization wrapper class for big-endian integers.
|
||||||
*
|
*
|
||||||
* Use this wrapper around integer types that are stored in memory in native
|
* Use this wrapper around integer types that are stored in memory in native
|
||||||
|
|
Loading…
Reference in a new issue