From 6f9a1e5ad0a270d3b5a715f3e3ea0911193bf244 Mon Sep 17 00:00:00 2001 From: Russell Yanofsky Date: Mon, 30 Mar 2020 15:32:39 -0700 Subject: [PATCH] Extend CustomUintFormatter to support enums Extracted by Pieter Wuille from a comment by Russ Yanofsky, see https://github.com/bitcoin/bitcoin/pull/18317#discussion_r398821936. --- src/serialize.h | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/serialize.h b/src/serialize.h index 7ee9556dc13..a44cc2c001f 100644 --- a/src/serialize.h +++ b/src/serialize.h @@ -538,14 +538,15 @@ struct CustomUintFormatter template void Unser(Stream& s, I& v) { - static_assert(std::numeric_limits::max() >= MAX && std::numeric_limits::min() <= 0, "CustomUintFormatter type too small"); + using U = typename std::conditional::value, std::underlying_type, std::common_type>::type::type; + static_assert(std::numeric_limits::max() >= MAX && std::numeric_limits::min() <= 0, "Assigned type too small"); uint64_t raw = 0; if (BigEndian) { s.read(((char*)&raw) + 8 - Bytes, Bytes); - v = be64toh(raw); + v = static_cast(be64toh(raw)); } else { s.read((char*)&raw, Bytes); - v = le64toh(raw); + v = static_cast(le64toh(raw)); } } };