From 7f0f37fca781a578c7736f59cf70c859fdde271a Mon Sep 17 00:00:00 2001 From: Lioncash Date: Mon, 3 Aug 2020 13:18:43 -0400 Subject: partition_data_manager: Make data arrays constexpr Previously the constructor for all of these would run at program startup, consuming time before the application can enter main(). This is also particularly dangerous, given the logging system wouldn't have been initialized properly yet, yet the program would use the logs to signify an error. To rectify this, we can replace the literals with constexpr functions that perform the conversion at compile-time, completely eliminating the runtime cost of initializing these arrays. --- src/common/hex_util.h | 29 +++++++++++++++++++++++------ 1 file changed, 23 insertions(+), 6 deletions(-) (limited to 'src/common/hex_util.h') diff --git a/src/common/hex_util.h b/src/common/hex_util.h index bb4736f96..a0a0e78a4 100644 --- a/src/common/hex_util.h +++ b/src/common/hex_util.h @@ -14,19 +14,31 @@ namespace Common { -u8 ToHexNibble(char c1); +constexpr u8 ToHexNibble(char c) { + if (c >= 65 && c <= 70) { + return c - 55; + } + + if (c >= 97 && c <= 102) { + return c - 87; + } + + return c - 48; +} std::vector HexStringToVector(std::string_view str, bool little_endian); template -std::array HexStringToArray(std::string_view str) { +constexpr std::array HexStringToArray(std::string_view str) { std::array out{}; if constexpr (le) { - for (std::size_t i = 2 * Size - 2; i <= 2 * Size; i -= 2) + for (std::size_t i = 2 * Size - 2; i <= 2 * Size; i -= 2) { out[i / 2] = (ToHexNibble(str[i]) << 4) | ToHexNibble(str[i + 1]); + } } else { - for (std::size_t i = 0; i < 2 * Size; i += 2) + for (std::size_t i = 0; i < 2 * Size; i += 2) { out[i / 2] = (ToHexNibble(str[i]) << 4) | ToHexNibble(str[i + 1]); + } } return out; } @@ -48,7 +60,12 @@ std::string HexToString(const ContiguousContainer& data, bool upper = true) { return out; } -std::array operator"" _array16(const char* str, std::size_t len); -std::array operator"" _array32(const char* str, std::size_t len); +constexpr std::array AsArray(const char (&data)[17]) { + return HexStringToArray<16>(data); +} + +constexpr std::array AsArray(const char (&data)[65]) { + return HexStringToArray<32>(data); +} } // namespace Common -- cgit v1.2.3