Make bool and null easier to use. am: 4268a60b05 am: c151d59747

Original change: https://googleplex-android-review.googlesource.com/c/platform/external/libcppbor/+/18638884

Change-Id: I4001b9acfb6a58a5627f45363677115cb66bfaea
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
diff --git a/include/cppbor/cppbor.h b/include/cppbor/cppbor.h
index 8338441..f7a2af0 100644
--- a/include/cppbor/cppbor.h
+++ b/include/cppbor/cppbor.h
@@ -142,6 +142,11 @@
     const Bstr* asBstr() const { return const_cast<Item*>(this)->asBstr(); }
     virtual Simple* asSimple() { return nullptr; }
     const Simple* asSimple() const { return const_cast<Item*>(this)->asSimple(); }
+    virtual Bool* asBool() { return nullptr; }
+    const Bool* asBool() const { return const_cast<Item*>(this)->asBool(); }
+    virtual Null* asNull() { return nullptr; }
+    const Null* asNull() const { return const_cast<Item*>(this)->asNull(); }
+
     virtual Map* asMap() { return nullptr; }
     const Map* asMap() const { return const_cast<Item*>(this)->asMap(); }
     virtual Array* asArray() { return nullptr; }
@@ -859,9 +864,6 @@
     MajorType type() const override { return kMajorType; }
 
     Simple* asSimple() override { return this; }
-
-    virtual const Bool* asBool() const { return nullptr; };
-    virtual const Null* asNull() const { return nullptr; };
 };
 
 /**
@@ -877,7 +879,7 @@
     bool operator==(const Bool& other) const& { return mValue == other.mValue; }
 
     SimpleType simpleType() const override { return kSimpleType; }
-    const Bool* asBool() const override { return this; }
+    Bool* asBool() override { return this; }
 
     size_t encodedSize() const override { return 1; }
 
@@ -907,7 +909,7 @@
     explicit Null() {}
 
     SimpleType simpleType() const override { return kSimpleType; }
-    const Null* asNull() const override { return this; }
+    Null* asNull() override { return this; }
 
     size_t encodedSize() const override { return 1; }
 
diff --git a/tests/cppbor_test.cpp b/tests/cppbor_test.cpp
index 68778dc..b9a2f35 100644
--- a/tests/cppbor_test.cpp
+++ b/tests/cppbor_test.cpp
@@ -721,6 +721,8 @@
     EXPECT_EQ(nullptr, item->asTstr());
     EXPECT_EQ(nullptr, item->asBstr());
     EXPECT_EQ(nullptr, item->asSimple());
+    EXPECT_EQ(nullptr, item->asBool());
+    EXPECT_EQ(nullptr, item->asNull());
     EXPECT_EQ(nullptr, item->asMap());
     EXPECT_EQ(nullptr, item->asArray());
     EXPECT_EQ(nullptr, item->asViewTstr());
@@ -740,6 +742,8 @@
     EXPECT_EQ(nullptr, item->asTstr());
     EXPECT_EQ(nullptr, item->asBstr());
     EXPECT_EQ(nullptr, item->asSimple());
+    EXPECT_EQ(nullptr, item->asBool());
+    EXPECT_EQ(nullptr, item->asNull());
     EXPECT_EQ(nullptr, item->asMap());
     EXPECT_EQ(nullptr, item->asArray());
     EXPECT_EQ(nullptr, item->asViewTstr());
@@ -759,6 +763,8 @@
     EXPECT_NE(nullptr, item->asTstr());
     EXPECT_EQ(nullptr, item->asBstr());
     EXPECT_EQ(nullptr, item->asSimple());
+    EXPECT_EQ(nullptr, item->asBool());
+    EXPECT_EQ(nullptr, item->asNull());
     EXPECT_EQ(nullptr, item->asMap());
     EXPECT_EQ(nullptr, item->asArray());
     EXPECT_EQ(nullptr, item->asViewTstr());
@@ -778,6 +784,8 @@
     EXPECT_EQ(nullptr, item->asTstr());
     EXPECT_NE(nullptr, item->asBstr());
     EXPECT_EQ(nullptr, item->asSimple());
+    EXPECT_EQ(nullptr, item->asBool());
+    EXPECT_EQ(nullptr, item->asNull());
     EXPECT_EQ(nullptr, item->asMap());
     EXPECT_EQ(nullptr, item->asArray());
     EXPECT_EQ(nullptr, item->asViewTstr());
@@ -796,15 +804,20 @@
     EXPECT_EQ(nullptr, item->asTstr());
     EXPECT_EQ(nullptr, item->asBstr());
     EXPECT_NE(nullptr, item->asSimple());
+    EXPECT_NE(nullptr, item->asBool());
+    EXPECT_EQ(nullptr, item->asNull());
     EXPECT_EQ(nullptr, item->asMap());
     EXPECT_EQ(nullptr, item->asArray());
     EXPECT_EQ(nullptr, item->asViewTstr());
     EXPECT_EQ(nullptr, item->asViewBstr());
 
     EXPECT_EQ(cppbor::BOOLEAN, item->asSimple()->simpleType());
+    EXPECT_NE(nullptr, item->asBool());
     EXPECT_NE(nullptr, item->asSimple()->asBool());
+    EXPECT_EQ(nullptr, item->asNull());
     EXPECT_EQ(nullptr, item->asSimple()->asNull());
 
+    EXPECT_FALSE(item->asBool()->value());
     EXPECT_FALSE(item->asSimple()->asBool()->value());
 }
 
@@ -818,6 +831,8 @@
     EXPECT_EQ(nullptr, item->asTstr());
     EXPECT_EQ(nullptr, item->asBstr());
     EXPECT_EQ(nullptr, item->asSimple());
+    EXPECT_EQ(nullptr, item->asBool());
+    EXPECT_EQ(nullptr, item->asNull());
     EXPECT_NE(nullptr, item->asMap());
     EXPECT_EQ(nullptr, item->asArray());
     EXPECT_EQ(nullptr, item->asViewTstr());
@@ -836,6 +851,8 @@
     EXPECT_EQ(nullptr, item->asTstr());
     EXPECT_EQ(nullptr, item->asBstr());
     EXPECT_EQ(nullptr, item->asSimple());
+    EXPECT_EQ(nullptr, item->asBool());
+    EXPECT_EQ(nullptr, item->asNull());
     EXPECT_EQ(nullptr, item->asMap());
     EXPECT_NE(nullptr, item->asArray());
     EXPECT_EQ(nullptr, item->asViewTstr());
@@ -853,6 +870,8 @@
     EXPECT_EQ(nullptr, item->asNint());
     EXPECT_EQ(nullptr, item->asBstr());
     EXPECT_EQ(nullptr, item->asSimple());
+    EXPECT_EQ(nullptr, item->asBool());
+    EXPECT_EQ(nullptr, item->asNull());
     EXPECT_EQ(nullptr, item->asMap());
     EXPECT_EQ(nullptr, item->asArray());
     EXPECT_EQ(nullptr, item->asViewTstr());
@@ -881,6 +900,8 @@
     EXPECT_EQ(nullptr, item->asNint());
     EXPECT_EQ(nullptr, item->asBstr());
     EXPECT_EQ(nullptr, item->asSimple());
+    EXPECT_EQ(nullptr, item->asBool());
+    EXPECT_EQ(nullptr, item->asNull());
     EXPECT_EQ(nullptr, item->asMap());
     EXPECT_EQ(nullptr, item->asArray());
     EXPECT_EQ(nullptr, item->asViewTstr());
@@ -912,13 +933,17 @@
     EXPECT_EQ(nullptr, item->asTstr());
     EXPECT_EQ(nullptr, item->asBstr());
     EXPECT_NE(nullptr, item->asSimple());
+    EXPECT_EQ(nullptr, item->asBool());
+    EXPECT_NE(nullptr, item->asNull());
     EXPECT_EQ(nullptr, item->asMap());
     EXPECT_EQ(nullptr, item->asArray());
     EXPECT_EQ(nullptr, item->asViewTstr());
     EXPECT_EQ(nullptr, item->asViewBstr());
 
     EXPECT_EQ(NULL_T, item->asSimple()->simpleType());
+    EXPECT_EQ(nullptr, item->asBool());
     EXPECT_EQ(nullptr, item->asSimple()->asBool());
+    EXPECT_NE(nullptr, item->asNull());
     EXPECT_NE(nullptr, item->asSimple()->asNull());
 }
 
@@ -932,6 +957,8 @@
     EXPECT_EQ(nullptr, item->asTstr());
     EXPECT_EQ(nullptr, item->asBstr());
     EXPECT_EQ(nullptr, item->asSimple());
+    EXPECT_EQ(nullptr, item->asBool());
+    EXPECT_EQ(nullptr, item->asNull());
     EXPECT_EQ(nullptr, item->asMap());
     EXPECT_EQ(nullptr, item->asArray());
     EXPECT_NE(nullptr, item->asViewTstr());
@@ -952,6 +979,8 @@
     EXPECT_EQ(nullptr, item->asTstr());
     EXPECT_EQ(nullptr, item->asBstr());
     EXPECT_EQ(nullptr, item->asSimple());
+    EXPECT_EQ(nullptr, item->asBool());
+    EXPECT_EQ(nullptr, item->asNull());
     EXPECT_EQ(nullptr, item->asMap());
     EXPECT_EQ(nullptr, item->asArray());
     EXPECT_EQ(nullptr, item->asViewTstr());
@@ -1024,8 +1053,11 @@
     EXPECT_EQ(clone->type(), SIMPLE);
     EXPECT_NE(clone->asSimple(), nullptr);
     EXPECT_EQ(clone->asSimple()->simpleType(), cppbor::BOOLEAN);
+    EXPECT_NE(clone->asBool(), nullptr);
     EXPECT_NE(clone->asSimple()->asBool(), nullptr);
+    EXPECT_EQ(item, *clone->asBool());
     EXPECT_EQ(item, *clone->asSimple()->asBool());
+    EXPECT_EQ(*clone->asBool(), Bool(true));
     EXPECT_EQ(*clone->asSimple()->asBool(), Bool(true));
 }