SkDynamicMemoryWStream: make moveable

Motivation:  using this in an experiment of mine (I want a
std::vector<SkDynamicMemoryWStream>.)

Change-Id: I28e2c468156ace2f9e7d5e09937e05bc8b7e8200
Reviewed-on: https://skia-review.googlesource.com/c/159326
Reviewed-by: Ben Wagner <bungeman@google.com>
Commit-Queue: Hal Canary <halcanary@google.com>
diff --git a/include/core/SkStream.h b/include/core/SkStream.h
index c37a113..f8f0fdb 100644
--- a/include/core/SkStream.h
+++ b/include/core/SkStream.h
@@ -278,9 +278,7 @@
     static int SizeOfPackedUInt(size_t value);
 
 private:
-    SkWStream(SkWStream&&) = delete;
     SkWStream(const SkWStream&) = delete;
-    SkWStream& operator=(SkWStream&&) = delete;
     SkWStream& operator=(const SkWStream&) = delete;
 };
 
@@ -459,7 +457,9 @@
 
 class SK_API SkDynamicMemoryWStream : public SkWStream {
 public:
-    SkDynamicMemoryWStream();
+    SkDynamicMemoryWStream() = default;
+    SkDynamicMemoryWStream(SkDynamicMemoryWStream&&);
+    SkDynamicMemoryWStream& operator=(SkDynamicMemoryWStream&&);
     ~SkDynamicMemoryWStream() override;
 
     bool write(const void* buffer, size_t size) override;
@@ -488,9 +488,9 @@
     void padToAlign4();
 private:
     struct Block;
-    Block*  fHead;
-    Block*  fTail;
-    size_t  fBytesWrittenBeforeTail;
+    Block*  fHead = nullptr;
+    Block*  fTail = nullptr;
+    size_t  fBytesWrittenBeforeTail = 0;
 
 #ifdef SK_DEBUG
     void validate() const;
diff --git a/src/core/SkStream.cpp b/src/core/SkStream.cpp
index f8f4350..b80efbd 100644
--- a/src/core/SkStream.cpp
+++ b/src/core/SkStream.cpp
@@ -476,9 +476,23 @@
     }
 };
 
-SkDynamicMemoryWStream::SkDynamicMemoryWStream()
-    : fHead(nullptr), fTail(nullptr), fBytesWrittenBeforeTail(0)
-{}
+SkDynamicMemoryWStream::SkDynamicMemoryWStream(SkDynamicMemoryWStream&& other)
+    : fHead(other.fHead)
+    , fTail(other.fTail)
+    , fBytesWrittenBeforeTail(other.fBytesWrittenBeforeTail)
+{
+    other.fHead = nullptr;
+    other.fTail = nullptr;
+    other.fBytesWrittenBeforeTail = 0;
+}
+
+SkDynamicMemoryWStream& SkDynamicMemoryWStream::operator=(SkDynamicMemoryWStream&& other) {
+    if (this != &other) {
+        this->~SkDynamicMemoryWStream();
+        new (this) SkDynamicMemoryWStream(std::move(other));
+    }
+    return *this;
+}
 
 SkDynamicMemoryWStream::~SkDynamicMemoryWStream() {
     this->reset();