Skip to content

Commit 4c94aff

Browse files
[ADT] Add more ArrayRef <-> StringRef conversion functions
Add new functions in StringExtras to convert byte size type array to StringRef and vice versa. Reviewed By: benlangmuir, dexonsmith Differential Revision: https://reviews.llvm.org/D139035
1 parent ce8ed00 commit 4c94aff

File tree

2 files changed

+22
-2
lines changed

2 files changed

+22
-2
lines changed

llvm/include/llvm/ADT/StringExtras.h

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,10 +58,19 @@ inline StringRef toStringRef(bool B) { return StringRef(B ? "true" : "false"); }
5858
inline StringRef toStringRef(ArrayRef<uint8_t> Input) {
5959
return StringRef(reinterpret_cast<const char *>(Input.begin()), Input.size());
6060
}
61+
inline StringRef toStringRef(ArrayRef<char> Input) {
62+
return StringRef(Input.begin(), Input.size());
63+
}
6164

6265
/// Construct a string ref from an array ref of unsigned chars.
63-
inline ArrayRef<uint8_t> arrayRefFromStringRef(StringRef Input) {
64-
return {Input.bytes_begin(), Input.bytes_end()};
66+
template <class CharT = uint8_t>
67+
inline ArrayRef<CharT> arrayRefFromStringRef(StringRef Input) {
68+
static_assert(std::is_same<CharT, char>::value ||
69+
std::is_same<CharT, unsigned char>::value ||
70+
std::is_same<CharT, signed char>::value,
71+
"Expected byte type");
72+
return ArrayRef<CharT>(reinterpret_cast<const CharT *>(Input.data()),
73+
Input.size());
6574
}
6675

6776
/// Interpret the given character \p C as a hexadecimal digit and return its

llvm/unittests/ADT/StringExtrasTest.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -362,3 +362,14 @@ TEST(StringExtrasTest, splitCharForLoop) {
362362
Result.push_back(x);
363363
EXPECT_THAT(Result, testing::ElementsAre("foo", "bar", "", "baz"));
364364
}
365+
366+
TEST(StringExtrasTest, arrayToStringRef) {
367+
auto roundTripTestString = [](llvm::StringRef Str) {
368+
EXPECT_EQ(Str, toStringRef(arrayRefFromStringRef<uint8_t>(Str)));
369+
EXPECT_EQ(Str, toStringRef(arrayRefFromStringRef<char>(Str)));
370+
};
371+
roundTripTestString("");
372+
roundTripTestString("foo");
373+
roundTripTestString("\0\n");
374+
roundTripTestString("\xFF\xFE");
375+
}

0 commit comments

Comments
 (0)