[YAMLTraits] Add trait for char
authorJonas Devlieghere <jonas@devlieghere.com>
Mon, 11 May 2020 21:41:38 +0000 (14:41 -0700)
committerJonas Devlieghere <jonas@devlieghere.com>
Mon, 11 May 2020 22:51:47 +0000 (15:51 -0700)
Add a YAML trait for char.

Differential revision: https://reviews.llvm.org/D79745

llvm/include/llvm/Support/YAMLTraits.h
llvm/lib/Support/YAMLTraits.cpp
llvm/unittests/Support/YAMLIOTest.cpp

index f93f360..9aa9640 100644 (file)
@@ -1159,6 +1159,12 @@ struct ScalarTraits<bool> {
   static QuotingType mustQuote(StringRef) { return QuotingType::None; }
 };
 
+template <> struct ScalarTraits<char> {
+  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<StringRef> {
   static void output(const StringRef &, void *, raw_ostream &);
index f27be3e..a4b782d 100644 (file)
@@ -864,6 +864,17 @@ StringRef ScalarTraits<bool>::input(StringRef Scalar, void *, bool &Val) {
   return "invalid boolean";
 }
 
+void ScalarTraits<char>::output(const char &Val, void *, raw_ostream &Out) {
+  Out << Val;
+}
+
+StringRef ScalarTraits<char>::input(StringRef Scalar, void *, char &Val) {
+  if (Scalar.size() != 1)
+    return "invalid character";
+  Val = Scalar[0];
+  return StringRef();
+}
+
 void ScalarTraits<StringRef>::output(const StringRef &Val, void *,
                                      raw_ostream &Out) {
   Out << Val;
index d86489c..b2ea5aa 100644 (file)
@@ -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);