diff --git a/src/serialize.h b/src/serialize.h --- a/src/serialize.h +++ b/src/serialize.h @@ -622,6 +622,30 @@ } }; +template struct CustomUintFormatter { + static_assert(Bytes > 0 && Bytes <= 8, + "CustomUintFormatter Bytes out of range"); + static constexpr uint64_t MAX = 0xffffffffffffffff >> (8 * (8 - Bytes)); + + template 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 void Unser(Stream &s, I &v) { + static_assert(std::numeric_limits::max() >= MAX && + std::numeric_limits::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. * * Use this wrapper around integer types that are stored in memory in native