From 810d0929c1626bba141af3f779a3c9cd6ece7e75 Mon Sep 17 00:00:00 2001 From: Jon Atack Date: Mon, 22 Mar 2021 20:05:15 +0100 Subject: [PATCH] p2p, refactor: make NetPermissionFlags a uint32 enum class and define/update operation methods to handle type conversions explicitly. See https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines#Renum-oper for more info. --- src/net_permissions.h | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/net_permissions.h b/src/net_permissions.h index 4f64a9d6ece..55b6db58daa 100644 --- a/src/net_permissions.h +++ b/src/net_permissions.h @@ -5,6 +5,7 @@ #include #include +#include #include #ifndef BITCOIN_NET_PERMISSIONS_H @@ -14,7 +15,7 @@ struct bilingual_str; extern const std::vector NET_PERMISSIONS_DOC; -enum NetPermissionFlags { +enum class NetPermissionFlags : uint32_t { PF_NONE = 0, // Can query bloomfilter even if -peerbloomfilters is false PF_BLOOMFILTER = (1U << 1), @@ -37,6 +38,11 @@ enum NetPermissionFlags { PF_ISIMPLICIT = (1U << 31), PF_ALL = PF_BLOOMFILTER | PF_FORCERELAY | PF_RELAY | PF_NOBAN | PF_MEMPOOL | PF_DOWNLOAD | PF_ADDR, }; +static inline constexpr NetPermissionFlags operator|(NetPermissionFlags a, NetPermissionFlags b) +{ + using t = typename std::underlying_type::type; + return static_cast(static_cast(a) | static_cast(b)); +} class NetPermissions { @@ -45,11 +51,12 @@ public: static std::vector ToStrings(NetPermissionFlags flags); static inline bool HasFlag(NetPermissionFlags flags, NetPermissionFlags f) { - return (flags & f) == f; + using t = typename std::underlying_type::type; + return (static_cast(flags) & static_cast(f)) == static_cast(f); } static inline void AddFlag(NetPermissionFlags& flags, NetPermissionFlags f) { - flags = static_cast(flags | f); + flags = flags | f; } //! ClearFlag is only called with `f` == NetPermissionFlags::PF_ISIMPLICIT. //! If that should change in the future, be aware that ClearFlag should not @@ -59,7 +66,8 @@ public: static inline void ClearFlag(NetPermissionFlags& flags, NetPermissionFlags f) { assert(f == NetPermissionFlags::PF_ISIMPLICIT); - flags = static_cast(flags & ~f); + using t = typename std::underlying_type::type; + flags = static_cast(static_cast(flags) & ~static_cast(f)); } };