From: Fred Morcos Date: Thu, 17 Oct 2024 14:16:36 +0000 (+0200) Subject: Rework MDBInVal X-Git-Tag: rec-5.2.0-alpha1~23^2~2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a15771b94a3096f9a6187fc0b33e70b5a8ac4db6;p=thirdparty%2Fpdns.git Rework MDBInVal --- diff --git a/ext/lmdb-safe/lmdb-safe.hh b/ext/lmdb-safe/lmdb-safe.hh index fc4c0ae7a3..084c7a9d5f 100644 --- a/ext/lmdb-safe/lmdb-safe.hh +++ b/ext/lmdb-safe/lmdb-safe.hh @@ -166,9 +166,18 @@ namespace LMDBLS { #endif /* ifndef DNSDIST */ +template +auto hostToNetworkByteOrder(T value) -> T; + template auto networkToHostByteOrder(T value) -> T; +template <> +inline auto hostToNetworkByteOrder(uint32_t value) -> uint32_t +{ + return htonl(value); +} + template <> inline auto networkToHostByteOrder(uint32_t value) -> uint32_t { @@ -268,50 +277,46 @@ inline string_view MDBOutVal::getNoStripHeader() const class MDBInVal { public: - MDBInVal(const MDBOutVal& rhs): d_mdbval(rhs.d_mdbval) + MDBInVal(const MDBOutVal& rhs) : + d_mdbval(rhs.d_mdbval) { } #ifndef DNSDIST - template ::value, - T>::type* = nullptr> - MDBInVal(T i) + template + MDBInVal(T rhs) { - static_assert(sizeof(T) == 4, "this code currently only supports 32 bit integers"); - auto j = htonl(i); // all actual usage in our codebase is 32 bits. If that ever changes, this will break the build and avoid runtime surprises - memcpy(&d_memory[0], &j, sizeof(j)); - - d_mdbval.mv_size = sizeof(T); - d_mdbval.mv_data = d_memory;; + auto rhsNetworkOrder = hostToNetworkByteOrder(rhs); + memcpy(&d_memory[0], &rhsNetworkOrder, sizeof(rhsNetworkOrder)); + d_mdbval.mv_size = sizeof(rhs); + d_mdbval.mv_data = static_cast(d_memory); } #endif - MDBInVal(const char* s) + MDBInVal(const char* rhs) { - d_mdbval.mv_size = strlen(s); - d_mdbval.mv_data = (void*)s; + d_mdbval.mv_size = strlen(rhs); + d_mdbval.mv_data = (void*)rhs; } - MDBInVal(const string_view& v) + MDBInVal(const string_view& rhs) { - d_mdbval.mv_size = v.size(); - d_mdbval.mv_data = (void*)&v[0]; + d_mdbval.mv_size = rhs.size(); + d_mdbval.mv_data = (void*)rhs.data(); } - MDBInVal(const std::string& v) + MDBInVal(const std::string& rhs) { - d_mdbval.mv_size = v.size(); - d_mdbval.mv_data = (void*)&v[0]; + d_mdbval.mv_size = rhs.size(); + d_mdbval.mv_data = (void*)rhs.data(); } - template - static MDBInVal fromStruct(const T& t) + static MDBInVal fromStruct(const T& rhs) { MDBInVal ret; ret.d_mdbval.mv_size = sizeof(T); - ret.d_mdbval.mv_data = (void*)&t; + ret.d_mdbval.mv_data = (void*)&rhs; return ret; } @@ -319,11 +324,15 @@ public: { return d_mdbval; } - MDB_val d_mdbval; + + // NOLINTNEXTLINE(cppcoreguidelines-non-private-member-variables-in-classes) + MDB_val d_mdbval{}; + private: MDBInVal(){} #ifndef DNSDIST - char d_memory[sizeof(double)]; + // NOLINTNEXTLINE(cppcoreguidelines-avoid-c-arrays, modernize-avoid-c-arrays) + char d_memory[sizeof(uint64_t)]{}; #endif };