From fab08bf4899e40d02d8bf394a63499ac679ac61c Mon Sep 17 00:00:00 2001 From: Jonas Devlieghere Date: Mon, 11 May 2020 14:41:38 -0700 Subject: [PATCH] [YAMLTraits] Add trait for char Add a YAML trait for char. Differential revision: https://reviews.llvm.org/D79745 --- llvm/include/llvm/Support/YAMLTraits.h | 6 ++++++ llvm/lib/Support/YAMLTraits.cpp | 11 +++++++++++ llvm/unittests/Support/YAMLIOTest.cpp | 8 +++++++- 3 files changed, 24 insertions(+), 1 deletion(-) diff --git a/llvm/include/llvm/Support/YAMLTraits.h b/llvm/include/llvm/Support/YAMLTraits.h index f93f360..9aa9640 100644 --- a/llvm/include/llvm/Support/YAMLTraits.h +++ b/llvm/include/llvm/Support/YAMLTraits.h @@ -1159,6 +1159,12 @@ struct ScalarTraits { static QuotingType mustQuote(StringRef) { return QuotingType::None; } }; +template <> struct ScalarTraits { + static void output(const char &, void *, raw_ostream &); + static StringRef input(StringRef, void *, char &); + static QuotingType mustQuote(StringRef S) { return needsQuotes(S); } +}; + template<> struct ScalarTraits { static void output(const StringRef &, void *, raw_ostream &); diff --git a/llvm/lib/Support/YAMLTraits.cpp b/llvm/lib/Support/YAMLTraits.cpp index f27be3e..a4b782d 100644 --- a/llvm/lib/Support/YAMLTraits.cpp +++ b/llvm/lib/Support/YAMLTraits.cpp @@ -864,6 +864,17 @@ StringRef ScalarTraits::input(StringRef Scalar, void *, bool &Val) { return "invalid boolean"; } +void ScalarTraits::output(const char &Val, void *, raw_ostream &Out) { + Out << Val; +} + +StringRef ScalarTraits::input(StringRef Scalar, void *, char &Val) { + if (Scalar.size() != 1) + return "invalid character"; + Val = Scalar[0]; + return StringRef(); +} + void ScalarTraits::output(const StringRef &Val, void *, raw_ostream &Out) { Out << Val; diff --git a/llvm/unittests/Support/YAMLIOTest.cpp b/llvm/unittests/Support/YAMLIOTest.cpp index d86489c..b2ea5aa 100644 --- a/llvm/unittests/Support/YAMLIOTest.cpp +++ b/llvm/unittests/Support/YAMLIOTest.cpp @@ -333,6 +333,7 @@ struct BuiltInTypes { uint16_t u16; uint8_t u8; bool b; + char c; int64_t s64; int32_t s32; int16_t s16; @@ -357,6 +358,7 @@ namespace yaml { io.mapRequired("u16", bt.u16); io.mapRequired("u8", bt.u8); io.mapRequired("b", bt.b); + io.mapRequired("c", bt.c); io.mapRequired("s64", bt.s64); io.mapRequired("s32", bt.s32); io.mapRequired("s16", bt.s16); @@ -386,6 +388,7 @@ TEST(YAMLIO, TestReadBuiltInTypes) { "u16: 65000\n" "u8: 255\n" "b: false\n" + "c: 'c'\n" "s64: -5000000000\n" "s32: -2000000000\n" "s16: -32000\n" @@ -396,7 +399,7 @@ TEST(YAMLIO, TestReadBuiltInTypes) { "h16: 0x8765\n" "h32: 0xFEDCBA98\n" "h64: 0xFEDCBA9876543210\n" - "...\n"); + "...\n"); yin >> map; EXPECT_FALSE(yin.error()); @@ -407,6 +410,7 @@ TEST(YAMLIO, TestReadBuiltInTypes) { EXPECT_EQ(map.u16, 65000); EXPECT_EQ(map.u8, 255); EXPECT_EQ(map.b, false); + EXPECT_EQ(map.c, 'c'); EXPECT_EQ(map.s64, -5000000000LL); EXPECT_EQ(map.s32, -2000000000L); EXPECT_EQ(map.s16, -32000); @@ -434,6 +438,7 @@ TEST(YAMLIO, TestReadWriteBuiltInTypes) { map.u16 = 50000; map.u8 = 254; map.b = true; + map.c = 'd'; map.s64 = -6000000000LL; map.s32 = -2000000000; map.s16 = -32000; @@ -463,6 +468,7 @@ TEST(YAMLIO, TestReadWriteBuiltInTypes) { EXPECT_EQ(map.u16, 50000); EXPECT_EQ(map.u8, 254); EXPECT_EQ(map.b, true); + EXPECT_EQ(map.c, 'd'); EXPECT_EQ(map.s64, -6000000000LL); EXPECT_EQ(map.s32, -2000000000L); EXPECT_EQ(map.s16, -32000); -- 2.7.4