Move generators to unique pointers.

This Cl will setup the code to allow a Reset method to be added to the
generators.

Bug: tint:211
Change-Id: I41c3aaf0daf832729aea9c76500e297ae32d7f5e
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/28042
Commit-Queue: David Neto <dneto@google.com>
Reviewed-by: David Neto <dneto@google.com>
diff --git a/src/writer/hlsl/generator.cc b/src/writer/hlsl/generator.cc
index 84c6999..f38f0a3 100644
--- a/src/writer/hlsl/generator.cc
+++ b/src/writer/hlsl/generator.cc
@@ -21,14 +21,15 @@
 namespace hlsl {
 
 Generator::Generator(ast::Module module)
-    : Text(std::move(module)), impl_(&module_) {}
+    : Text(std::move(module)),
+      impl_(std::make_unique<GeneratorImpl>(&module_)) {}
 
 Generator::~Generator() = default;
 
 bool Generator::Generate() {
-  auto ret = impl_.Generate(out_);
+  auto ret = impl_->Generate(out_);
   if (!ret) {
-    error_ = impl_.error();
+    error_ = impl_->error();
   }
   return ret;
 }
@@ -38,7 +39,7 @@
 }
 
 std::string Generator::error() const {
-  return impl_.error();
+  return impl_->error();
 }
 
 }  // namespace hlsl
diff --git a/src/writer/hlsl/generator.h b/src/writer/hlsl/generator.h
index 9820fab..f664e26 100644
--- a/src/writer/hlsl/generator.h
+++ b/src/writer/hlsl/generator.h
@@ -15,6 +15,7 @@
 #ifndef SRC_WRITER_HLSL_GENERATOR_H_
 #define SRC_WRITER_HLSL_GENERATOR_H_
 
+#include <memory>
 #include <sstream>
 #include <string>
 
@@ -45,7 +46,7 @@
 
  private:
   std::ostringstream out_;
-  GeneratorImpl impl_;
+  std::unique_ptr<GeneratorImpl> impl_;
 };
 
 }  // namespace hlsl
diff --git a/src/writer/msl/generator.cc b/src/writer/msl/generator.cc
index ce3c1a0..1f1af8b 100644
--- a/src/writer/msl/generator.cc
+++ b/src/writer/msl/generator.cc
@@ -21,24 +21,25 @@
 namespace msl {
 
 Generator::Generator(ast::Module module)
-    : Text(std::move(module)), impl_(&module_) {}
+    : Text(std::move(module)),
+      impl_(std::make_unique<GeneratorImpl>(&module_)) {}
 
 Generator::~Generator() = default;
 
 bool Generator::Generate() {
-  auto ret = impl_.Generate();
+  auto ret = impl_->Generate();
   if (!ret) {
-    error_ = impl_.error();
+    error_ = impl_->error();
   }
   return ret;
 }
 
 std::string Generator::result() const {
-  return impl_.result();
+  return impl_->result();
 }
 
 std::string Generator::error() const {
-  return impl_.error();
+  return impl_->error();
 }
 
 }  // namespace msl
diff --git a/src/writer/msl/generator.h b/src/writer/msl/generator.h
index fcee316..df0f832 100644
--- a/src/writer/msl/generator.h
+++ b/src/writer/msl/generator.h
@@ -15,6 +15,7 @@
 #ifndef SRC_WRITER_MSL_GENERATOR_H_
 #define SRC_WRITER_MSL_GENERATOR_H_
 
+#include <memory>
 #include <string>
 
 #include "src/writer/msl/generator_impl.h"
@@ -43,7 +44,7 @@
   std::string error() const;
 
  private:
-  GeneratorImpl impl_;
+  std::unique_ptr<GeneratorImpl> impl_;
 };
 
 }  // namespace msl
diff --git a/src/writer/spirv/binary_writer.cc b/src/writer/spirv/binary_writer.cc
index c414b08..9f8bab5 100644
--- a/src/writer/spirv/binary_writer.cc
+++ b/src/writer/spirv/binary_writer.cc
@@ -29,9 +29,9 @@
 
 BinaryWriter::~BinaryWriter() = default;
 
-void BinaryWriter::WriteBuilder(const Builder& builder) {
-  out_.reserve(builder.total_size());
-  builder.iterate(
+void BinaryWriter::WriteBuilder(Builder* builder) {
+  out_.reserve(builder->total_size());
+  builder->iterate(
       [this](const Instruction& inst) { this->process_instruction(inst); });
 }
 
diff --git a/src/writer/spirv/binary_writer.h b/src/writer/spirv/binary_writer.h
index 84fd53e..2ca007a 100644
--- a/src/writer/spirv/binary_writer.h
+++ b/src/writer/spirv/binary_writer.h
@@ -38,7 +38,7 @@
   /// the SPIR-V header. You |must| call |WriteHeader| before |WriteBuilder|
   /// if you want the SPIR-V to be emitted.
   /// @param builder the builder to assemble from
-  void WriteBuilder(const Builder& builder);
+  void WriteBuilder(Builder* builder);
 
   /// Writes the given instruction into the binary.
   /// @param inst the instruction to assemble
diff --git a/src/writer/spirv/binary_writer_test.cc b/src/writer/spirv/binary_writer_test.cc
index 9589761..46a7544 100644
--- a/src/writer/spirv/binary_writer_test.cc
+++ b/src/writer/spirv/binary_writer_test.cc
@@ -47,7 +47,7 @@
   Builder b(&mod);
   b.push_preamble(spv::Op::OpKill, {Operand::Float(2.4f)});
   BinaryWriter bw;
-  bw.WriteBuilder(b);
+  bw.WriteBuilder(&b);
 
   auto res = bw.result();
   ASSERT_EQ(res.size(), 2u);
@@ -61,7 +61,7 @@
   Builder b(&mod);
   b.push_preamble(spv::Op::OpKill, {Operand::Int(2)});
   BinaryWriter bw;
-  bw.WriteBuilder(b);
+  bw.WriteBuilder(&b);
 
   auto res = bw.result();
   ASSERT_EQ(res.size(), 2u);
@@ -73,7 +73,7 @@
   Builder b(&mod);
   b.push_preamble(spv::Op::OpKill, {Operand::String("my_string")});
   BinaryWriter bw;
-  bw.WriteBuilder(b);
+  bw.WriteBuilder(&b);
 
   auto res = bw.result();
   ASSERT_EQ(res.size(), 4u);
@@ -98,7 +98,7 @@
   Builder b(&mod);
   b.push_preamble(spv::Op::OpKill, {Operand::String("mystring")});
   BinaryWriter bw;
-  bw.WriteBuilder(b);
+  bw.WriteBuilder(&b);
 
   auto res = bw.result();
   ASSERT_EQ(res.size(), 4u);
diff --git a/src/writer/spirv/generator.cc b/src/writer/spirv/generator.cc
index c3b5720..33652cf 100644
--- a/src/writer/spirv/generator.cc
+++ b/src/writer/spirv/generator.cc
@@ -21,18 +21,20 @@
 namespace spirv {
 
 Generator::Generator(ast::Module module)
-    : writer::Writer(std::move(module)), builder_(&module_) {}
+    : writer::Writer(std::move(module)),
+      builder_(std::make_unique<Builder>(&module_)),
+      writer_(std::make_unique<BinaryWriter>()) {}
 
 Generator::~Generator() = default;
 
 bool Generator::Generate() {
-  if (!builder_.Build()) {
-    set_error(builder_.error());
+  if (!builder_->Build()) {
+    set_error(builder_->error());
     return false;
   }
 
-  writer_.WriteHeader(builder_.id_bound());
-  writer_.WriteBuilder(builder_);
+  writer_->WriteHeader(builder_->id_bound());
+  writer_->WriteBuilder(builder_.get());
   return true;
 }
 
diff --git a/src/writer/spirv/generator.h b/src/writer/spirv/generator.h
index 3a14ec5..49d8ce3 100644
--- a/src/writer/spirv/generator.h
+++ b/src/writer/spirv/generator.h
@@ -15,6 +15,7 @@
 #ifndef SRC_WRITER_SPIRV_GENERATOR_H_
 #define SRC_WRITER_SPIRV_GENERATOR_H_
 
+#include <memory>
 #include <vector>
 
 #include "src/ast/module.h"
@@ -39,11 +40,11 @@
   bool Generate() override;
 
   /// @returns the result data
-  const std::vector<uint32_t>& result() const { return writer_.result(); }
+  const std::vector<uint32_t>& result() const { return writer_->result(); }
 
  private:
-  Builder builder_;
-  BinaryWriter writer_;
+  std::unique_ptr<Builder> builder_;
+  std::unique_ptr<BinaryWriter> writer_;
 };
 
 }  // namespace spirv
diff --git a/src/writer/spirv/spv_dump.cc b/src/writer/spirv/spv_dump.cc
index 6c5cd8f..1b7f5ed 100644
--- a/src/writer/spirv/spv_dump.cc
+++ b/src/writer/spirv/spv_dump.cc
@@ -61,10 +61,10 @@
 
 }  // namespace
 
-std::string DumpBuilder(const Builder& builder) {
+std::string DumpBuilder(Builder& builder) {
   BinaryWriter writer;
   writer.WriteHeader(builder.id_bound());
-  writer.WriteBuilder(builder);
+  writer.WriteBuilder(&builder);
   return Disassemble(writer.result());
 }
 
diff --git a/src/writer/spirv/spv_dump.h b/src/writer/spirv/spv_dump.h
index deae123..3513290 100644
--- a/src/writer/spirv/spv_dump.h
+++ b/src/writer/spirv/spv_dump.h
@@ -28,7 +28,7 @@
 /// Dumps the given builder to a SPIR-V disassembly string
 /// @param builder the builder to convert
 /// @returns the builder as a SPIR-V disassembly string
-std::string DumpBuilder(const Builder& builder);
+std::string DumpBuilder(Builder& builder);
 
 /// Dumps the given instruction to a SPIR-V disassembly string
 /// @param inst the instruction to dump
diff --git a/src/writer/wgsl/generator.cc b/src/writer/wgsl/generator.cc
index d077e22..23b3d99 100644
--- a/src/writer/wgsl/generator.cc
+++ b/src/writer/wgsl/generator.cc
@@ -20,24 +20,25 @@
 namespace writer {
 namespace wgsl {
 
-Generator::Generator(ast::Module module) : Text(std::move(module)) {}
+Generator::Generator(ast::Module module)
+    : Text(std::move(module)), impl_(std::make_unique<GeneratorImpl>()) {}
 
 Generator::~Generator() = default;
 
 bool Generator::Generate() {
-  auto ret = impl_.Generate(module_);
+  auto ret = impl_->Generate(module_);
   if (!ret) {
-    error_ = impl_.error();
+    error_ = impl_->error();
   }
   return ret;
 }
 
 std::string Generator::result() const {
-  return impl_.result();
+  return impl_->result();
 }
 
 std::string Generator::error() const {
-  return impl_.error();
+  return impl_->error();
 }
 
 }  // namespace wgsl
diff --git a/src/writer/wgsl/generator.h b/src/writer/wgsl/generator.h
index 400d855..abf3d38 100644
--- a/src/writer/wgsl/generator.h
+++ b/src/writer/wgsl/generator.h
@@ -15,6 +15,7 @@
 #ifndef SRC_WRITER_WGSL_GENERATOR_H_
 #define SRC_WRITER_WGSL_GENERATOR_H_
 
+#include <memory>
 #include <string>
 
 #include "src/writer/text.h"
@@ -43,7 +44,7 @@
   std::string error() const;
 
  private:
-  GeneratorImpl impl_;
+  std::unique_ptr<GeneratorImpl> impl_;
 };
 
 }  // namespace wgsl