From 72dc29a8486e991a0c168945624d2943bd0755ed Mon Sep 17 00:00:00 2001 From: Petr Hosek Date: Mon, 10 Sep 2018 19:34:44 +0000 Subject: [PATCH] [ADT] Support converting to lowercase string in toHex This is useful in certain use-cases such as D51833. Differential Revision: https://reviews.llvm.org/D51835 llvm-svn: 341852 --- llvm/include/llvm/ADT/StringExtras.h | 11 ++++++----- llvm/unittests/ADT/StringExtrasTest.cpp | 2 ++ 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/llvm/include/llvm/ADT/StringExtras.h b/llvm/include/llvm/ADT/StringExtras.h index 71b0e75..60a0363 100644 --- a/llvm/include/llvm/ADT/StringExtras.h +++ b/llvm/include/llvm/ADT/StringExtras.h @@ -139,22 +139,23 @@ inline std::string utohexstr(uint64_t X, bool LowerCase = false) { /// Convert buffer \p Input to its hexadecimal representation. /// The returned string is double the size of \p Input. -inline std::string toHex(StringRef Input) { +inline std::string toHex(StringRef Input, bool LowerCase = false) { static const char *const LUT = "0123456789ABCDEF"; + const uint8_t Offset = LowerCase ? 32 : 0; size_t Length = Input.size(); std::string Output; Output.reserve(2 * Length); for (size_t i = 0; i < Length; ++i) { const unsigned char c = Input[i]; - Output.push_back(LUT[c >> 4]); - Output.push_back(LUT[c & 15]); + Output.push_back(LUT[c >> 4] | Offset); + Output.push_back(LUT[c & 15] | Offset); } return Output; } -inline std::string toHex(ArrayRef Input) { - return toHex(toStringRef(Input)); +inline std::string toHex(ArrayRef Input, bool LowerCase = false) { + return toHex(toStringRef(Input), LowerCase); } inline uint8_t hexFromNibbles(char MSB, char LSB) { diff --git a/llvm/unittests/ADT/StringExtrasTest.cpp b/llvm/unittests/ADT/StringExtrasTest.cpp index 1df2005..02a45c3 100644 --- a/llvm/unittests/ADT/StringExtrasTest.cpp +++ b/llvm/unittests/ADT/StringExtrasTest.cpp @@ -70,6 +70,7 @@ TEST(StringExtrasTest, ToAndFromHex) { OddBytes.size()); EXPECT_EQ(OddStr, toHex(OddData)); EXPECT_EQ(OddData, fromHex(StringRef(OddStr).drop_front())); + EXPECT_EQ(StringRef(OddStr).lower(), toHex(OddData, true)); std::vector EvenBytes = {0xA5, 0xBD, 0x0D, 0x3E, 0xCD}; std::string EvenStr = "A5BD0D3ECD"; @@ -77,6 +78,7 @@ TEST(StringExtrasTest, ToAndFromHex) { EvenBytes.size()); EXPECT_EQ(EvenStr, toHex(EvenData)); EXPECT_EQ(EvenData, fromHex(EvenStr)); + EXPECT_EQ(StringRef(EvenStr).lower(), toHex(EvenData, true)); } TEST(StringExtrasTest, to_float) { -- 2.7.4