aboutsummaryrefslogtreecommitdiff
path: root/src/serialization/container.h
diff options
context:
space:
mode:
authorluigi1111 <luigi1111w@gmail.com>2021-04-06 12:20:15 -0500
committerluigi1111 <luigi1111w@gmail.com>2021-04-06 12:20:15 -0500
commit3c69596bc9a27dfbb138d8df2347a04a9bbd8598 (patch)
treed370256677064e5f1372ae06feec31d2911bff2e /src/serialization/container.h
parent9a5579fc4f9caa41ef05d0c8190ce03a6f33f84c (diff)
parentf9b5b521e82b9dc08325bc65f25f8e4e446270fc (diff)
downloadmonzero-core-3c69596bc9a27dfbb138d8df2347a04a9bbd8598.tar.gz
monzero-core-3c69596bc9a27dfbb138d8df2347a04a9bbd8598.tar.xz
monzero-core-3c69596bc9a27dfbb138d8df2347a04a9bbd8598.zip
Merge pull request #7321
f9b5b52 fix serialization being different on mac (moneromooo-monero)
Diffstat (limited to 'src/serialization/container.h')
-rw-r--r--src/serialization/container.h23
1 files changed, 14 insertions, 9 deletions
diff --git a/src/serialization/container.h b/src/serialization/container.h
index d5e75bb4f..a4997c8ae 100644
--- a/src/serialization/container.h
+++ b/src/serialization/container.h
@@ -32,22 +32,27 @@ namespace serialization
{
namespace detail
{
- template <typename Archive, class T>
- bool serialize_container_element(Archive& ar, T& e)
+ template<typename T>
+ inline constexpr bool use_container_varint() noexcept
{
- return ::do_serialize(ar, e);
+ return std::is_integral<T>::value && std::is_unsigned<T>::value && sizeof(T) > 1;
}
- template <typename Archive>
- bool serialize_container_element(Archive& ar, uint32_t& e)
+ template <typename Archive, class T>
+ typename std::enable_if<!use_container_varint<T>(), bool>::type
+ serialize_container_element(Archive& ar, T& e)
{
- ar.serialize_varint(e);
- return true;
+ return ::do_serialize(ar, e);
}
- template <typename Archive>
- bool serialize_container_element(Archive& ar, uint64_t& e)
+ template<typename Archive, typename T>
+ typename std::enable_if<use_container_varint<T>(), bool>::type
+ serialize_container_element(Archive& ar, T& e)
{
+ static constexpr const bool previously_varint = std::is_same<uint64_t, T>() || std::is_same<uint32_t, T>();
+
+ if (!previously_varint && ar.varint_bug_backward_compatibility_enabled() && !typename Archive::is_saving())
+ return ::do_serialize(ar, e);
ar.serialize_varint(e);
return true;
}