dawncpp.h: Add nullptr ObjectBase constructor and assignment

BUG=dawn:3

Change-Id: I9f7ec0ae1c7885809888a603ed056c6565751bec
Reviewed-on: https://dawn-review.googlesource.com/c/2840
Commit-Queue: Corentin Wallez <cwallez@chromium.org>
Reviewed-by: Stephen White <senorblanco@chromium.org>
Reviewed-by: Kai Ninomiya <kainino@chromium.org>
diff --git a/generator/templates/apicpp.h b/generator/templates/apicpp.h
index af142b0..87bd71b 100644
--- a/generator/templates/apicpp.h
+++ b/generator/templates/apicpp.h
@@ -97,6 +97,15 @@
                 return static_cast<Derived&>(*this);
             }
 
+            ObjectBase(nullptr_t) {}
+            Derived& operator=(nullptr_t) {
+                if (mHandle != nullptr) {
+                    Derived::DawnRelease(mHandle);
+                    mHandle = nullptr;
+                }
+                return static_cast<Derived&>(*this);
+            }
+
             explicit operator bool() const {
                 return mHandle != nullptr;
             }
diff --git a/src/tests/unittests/ObjectBaseTests.cpp b/src/tests/unittests/ObjectBaseTests.cpp
index 2c9dccb..b42920f 100644
--- a/src/tests/unittests/ObjectBaseTests.cpp
+++ b/src/tests/unittests/ObjectBaseTests.cpp
@@ -177,3 +177,21 @@
     ASSERT_EQ(obj.Get(), &refcount);
     ASSERT_EQ(refcount, 2);
 }
+
+// Test the constructor using nullptr
+TEST(ObjectBase, NullptrConstructor) {
+    Object obj(nullptr);
+    ASSERT_EQ(obj.Get(), nullptr);
+}
+
+// Test assigning nullptr to the object
+TEST(ObjectBase, AssignNullptr) {
+    int refcount = 1;
+
+    Object obj(&refcount);
+    ASSERT_EQ(refcount, 2);
+
+    obj = nullptr;
+    ASSERT_EQ(refcount, 1);
+}
+