Transforms output parameters into return values for HPACK methods that return encoded strings.

Protected by refactoring, no functional change.

PiperOrigin-RevId: 391554902
diff --git a/spdy/core/hpack/hpack_decoder_adapter_test.cc b/spdy/core/hpack/hpack_decoder_adapter_test.cc
index 054e3e4..8aa588d 100644
--- a/spdy/core/hpack/hpack_decoder_adapter_test.cc
+++ b/spdy/core/hpack/hpack_decoder_adapter_test.cc
@@ -493,8 +493,8 @@
     output_stream.AppendPrefix(kHeaderTableSizeUpdateOpcode);
     output_stream.AppendUint32(126);
 
-    output_stream.TakeString(&input);
-    EXPECT_TRUE(DecodeHeaderBlock(absl::string_view(input)));
+    input = output_stream.TakeString();
+    EXPECT_TRUE(DecodeHeaderBlock(input));
     EXPECT_EQ(126u, decoder_peer_.header_table_size_limit());
   }
   {
@@ -503,8 +503,8 @@
     output_stream.AppendPrefix(kHeaderTableSizeUpdateOpcode);
     output_stream.AppendUint32(kDefaultHeaderTableSizeSetting);
 
-    output_stream.TakeString(&input);
-    EXPECT_TRUE(DecodeHeaderBlock(absl::string_view(input)));
+    input = output_stream.TakeString();
+    EXPECT_TRUE(DecodeHeaderBlock(input));
     EXPECT_EQ(kDefaultHeaderTableSizeSetting,
               decoder_peer_.header_table_size_limit());
   }
@@ -514,8 +514,8 @@
     output_stream.AppendPrefix(kHeaderTableSizeUpdateOpcode);
     output_stream.AppendUint32(kDefaultHeaderTableSizeSetting + 1);
 
-    output_stream.TakeString(&input);
-    EXPECT_FALSE(DecodeHeaderBlock(absl::string_view(input)));
+    input = output_stream.TakeString();
+    EXPECT_FALSE(DecodeHeaderBlock(input));
     EXPECT_EQ(kDefaultHeaderTableSizeSetting,
               decoder_peer_.header_table_size_limit());
   }
@@ -532,8 +532,8 @@
     output_stream.AppendPrefix(kHeaderTableSizeUpdateOpcode);
     output_stream.AppendUint32(122);
 
-    output_stream.TakeString(&input);
-    EXPECT_TRUE(DecodeHeaderBlock(absl::string_view(input)));
+    input = output_stream.TakeString();
+    EXPECT_TRUE(DecodeHeaderBlock(input));
     EXPECT_EQ(122u, decoder_peer_.header_table_size_limit());
   }
 }
@@ -551,9 +551,9 @@
     output_stream.AppendPrefix(kHeaderTableSizeUpdateOpcode);
     output_stream.AppendUint32(15);
 
-    output_stream.TakeString(&input);
+    input = output_stream.TakeString();
 
-    EXPECT_FALSE(DecodeHeaderBlock(absl::string_view(input)));
+    EXPECT_FALSE(DecodeHeaderBlock(input));
     EXPECT_EQ(10u, decoder_peer_.header_table_size_limit());
   }
 }
@@ -570,9 +570,9 @@
     output_stream.AppendPrefix(kHeaderTableSizeUpdateOpcode);
     output_stream.AppendUint32(123);
 
-    output_stream.TakeString(&input);
+    input = output_stream.TakeString();
 
-    EXPECT_FALSE(DecodeHeaderBlock(absl::string_view(input)));
+    EXPECT_FALSE(DecodeHeaderBlock(input));
     EXPECT_EQ(kDefaultHeaderTableSizeSetting,
               decoder_peer_.header_table_size_limit());
   }
@@ -593,9 +593,9 @@
     output_stream.AppendPrefix(kHeaderTableSizeUpdateOpcode);
     output_stream.AppendUint32(125);
 
-    output_stream.TakeString(&input);
+    input = output_stream.TakeString();
 
-    EXPECT_FALSE(DecodeHeaderBlock(absl::string_view(input)));
+    EXPECT_FALSE(DecodeHeaderBlock(input));
     EXPECT_EQ(60u, decoder_peer_.header_table_size_limit());
   }
 }
diff --git a/spdy/core/hpack/hpack_encoder.cc b/spdy/core/hpack/hpack_encoder.cc
index ccf17da..4b87a0e 100644
--- a/spdy/core/hpack/hpack_encoder.cc
+++ b/spdy/core/hpack/hpack_encoder.cc
@@ -144,7 +144,7 @@
     }
   }
 
-  output_stream_.TakeString(output);
+  *output = output_stream_.TakeString();
 }
 
 void HpackEncoder::EmitIndex(size_t index) {
@@ -283,9 +283,8 @@
   // Returns true iff more remains to encode.
   bool HasNext() const override { return has_next_; }
 
-  // Encodes up to max_encoded_bytes of the current header block into the
-  // given output string.
-  void Next(size_t max_encoded_bytes, std::string* output) override;
+  // Encodes and returns up to max_encoded_bytes of the current header block.
+  std::string Next(size_t max_encoded_bytes) override;
 
  private:
   HpackEncoder* encoder_;
@@ -338,8 +337,7 @@
   encoder_->MaybeEmitTableSize();
 }
 
-void HpackEncoder::Encoderator::Next(size_t max_encoded_bytes,
-                                     std::string* output) {
+std::string HpackEncoder::Encoderator::Next(size_t max_encoded_bytes) {
   QUICHE_BUG_IF(spdy_bug_61_1, !has_next_)
       << "Encoderator::Next called with nothing left to encode.";
   const bool enable_compression = encoder_->enable_compression_;
@@ -365,7 +363,7 @@
   }
 
   has_next_ = encoder_->output_stream_.size() > max_encoded_bytes;
-  encoder_->output_stream_.BoundedTakeString(max_encoded_bytes, output);
+  return encoder_->output_stream_.BoundedTakeString(max_encoded_bytes);
 }
 
 std::unique_ptr<HpackEncoder::ProgressiveEncoder> HpackEncoder::EncodeHeaderSet(
diff --git a/spdy/core/hpack/hpack_encoder.h b/spdy/core/hpack/hpack_encoder.h
index 5e2ea03..bed59f7 100644
--- a/spdy/core/hpack/hpack_encoder.h
+++ b/spdy/core/hpack/hpack_encoder.h
@@ -60,9 +60,8 @@
     // Returns true iff more remains to encode.
     virtual bool HasNext() const = 0;
 
-    // Encodes up to max_encoded_bytes of the current header block into the
-    // given output string.
-    virtual void Next(size_t max_encoded_bytes, std::string* output) = 0;
+    // Encodes and returns up to max_encoded_bytes of the current header block.
+    virtual std::string Next(size_t max_encoded_bytes) = 0;
   };
 
   // Returns a ProgressiveEncoder which must be outlived by both the given
diff --git a/spdy/core/hpack/hpack_encoder_test.cc b/spdy/core/hpack/hpack_encoder_test.cc
index dfd8d8f..af73889 100644
--- a/spdy/core/hpack/hpack_encoder_test.cc
+++ b/spdy/core/hpack/hpack_encoder_test.cc
@@ -45,7 +45,7 @@
   HpackHeaderTablePeer table_peer() { return HpackHeaderTablePeer(table()); }
   void EmitString(absl::string_view str) { encoder_->EmitString(str); }
   void TakeString(std::string* out) {
-    encoder_->output_stream_.TakeString(out);
+    *out = encoder_->output_stream_.TakeString();
   }
   static void CookieToCrumbs(absl::string_view cookie,
                              std::vector<absl::string_view>* out) {
@@ -82,12 +82,11 @@
                                 std::string* output) {
     std::unique_ptr<HpackEncoder::ProgressiveEncoder> encoderator =
         encoder->EncodeHeaderSet(header_set);
-    std::string output_buffer;
     http2::test::Http2Random random;
-    encoderator->Next(random.UniformInRange(0, 16), &output_buffer);
+    std::string output_buffer = encoderator->Next(random.UniformInRange(0, 16));
     while (encoderator->HasNext()) {
-      std::string second_buffer;
-      encoderator->Next(random.UniformInRange(0, 16), &second_buffer);
+      std::string second_buffer =
+          encoderator->Next(random.UniformInRange(0, 16));
       output_buffer.append(second_buffer);
     }
     *output = std::move(output_buffer);
@@ -99,12 +98,11 @@
                                     std::string* output) {
     std::unique_ptr<HpackEncoder::ProgressiveEncoder> encoderator =
         encoder->EncodeRepresentations(representations);
-    std::string output_buffer;
     http2::test::Http2Random random;
-    encoderator->Next(random.UniformInRange(0, 16), &output_buffer);
+    std::string output_buffer = encoderator->Next(random.UniformInRange(0, 16));
     while (encoderator->HasNext()) {
-      std::string second_buffer;
-      encoderator->Next(random.UniformInRange(0, 16), &second_buffer);
+      std::string second_buffer =
+          encoderator->Next(random.UniformInRange(0, 16));
       output_buffer.append(second_buffer);
     }
     *output = std::move(output_buffer);
@@ -219,8 +217,8 @@
     return r;
   }
   void CompareWithExpectedEncoding(const SpdyHeaderBlock& header_set) {
-    std::string expected_out, actual_out;
-    expected_.TakeString(&expected_out);
+    std::string actual_out;
+    std::string expected_out = expected_.TakeString();
     switch (strategy_) {
       case kDefault:
         EXPECT_TRUE(test::HpackEncoderPeer::EncodeHeaderSet(
@@ -238,8 +236,8 @@
     EXPECT_EQ(expected_out, actual_out);
   }
   void CompareWithExpectedEncoding(const Representations& representations) {
-    std::string expected_out, actual_out;
-    expected_.TakeString(&expected_out);
+    std::string actual_out;
+    std::string expected_out = expected_.TakeString();
     EXPECT_TRUE(test::HpackEncoderPeer::EncodeRepresentations(
         &encoder_, representations, &actual_out));
     EXPECT_EQ(expected_out, actual_out);
@@ -460,8 +458,8 @@
   expected_.AppendUint32(6);
   expected_.AppendBytes("@@@@@@");
 
-  std::string expected_out, actual_out;
-  expected_.TakeString(&expected_out);
+  std::string actual_out;
+  std::string expected_out = expected_.TakeString();
   peer_.TakeString(&actual_out);
   EXPECT_EQ(expected_out, actual_out);
 }
diff --git a/spdy/core/hpack/hpack_output_stream.cc b/spdy/core/hpack/hpack_output_stream.cc
index bce24fa..291ad3d 100644
--- a/spdy/core/hpack/hpack_output_stream.cc
+++ b/spdy/core/hpack/hpack_output_stream.cc
@@ -68,31 +68,32 @@
   return &buffer_;
 }
 
-void HpackOutputStream::TakeString(std::string* output) {
+std::string HpackOutputStream::TakeString() {
   // This must hold, since all public functions cause the buffer to
   // end on a byte boundary.
   QUICHE_DCHECK_EQ(bit_offset_, 0u);
-  buffer_.swap(*output);
-  buffer_.clear();
+  std::string out = std::move(buffer_);
+  buffer_ = {};
   bit_offset_ = 0;
+  return out;
 }
 
-void HpackOutputStream::BoundedTakeString(size_t max_size,
-                                          std::string* output) {
+std::string HpackOutputStream::BoundedTakeString(size_t max_size) {
   if (buffer_.size() > max_size) {
     // Save off overflow bytes to temporary string (causes a copy).
-    std::string overflow(buffer_.data() + max_size, buffer_.size() - max_size);
+    std::string overflow = buffer_.substr(max_size);
 
     // Resize buffer down to the given limit.
     buffer_.resize(max_size);
 
     // Give buffer to output string.
-    *output = std::move(buffer_);
+    std::string out = std::move(buffer_);
 
     // Reset to contain overflow.
     buffer_ = std::move(overflow);
+    return out;
   } else {
-    TakeString(output);
+    return TakeString();
   }
 }
 
diff --git a/spdy/core/hpack/hpack_output_stream.h b/spdy/core/hpack/hpack_output_stream.h
index ec657b5..ade1cd1 100644
--- a/spdy/core/hpack/hpack_output_stream.h
+++ b/spdy/core/hpack/hpack_output_stream.h
@@ -51,12 +51,12 @@
   // Return pointer to internal buffer.  |bit_offset_| needs to be zero.
   std::string* MutableString();
 
-  // Swaps the internal buffer with |output|, then resets state.
-  void TakeString(std::string* output);
+  // Returns the internal buffer as a string, then resets state.
+  std::string TakeString();
 
-  // Gives up to |max_size| bytes of the internal buffer to |output|. Resets
+  // Returns up to |max_size| bytes of the internal buffer. Resets
   // internal state with the overflow.
-  void BoundedTakeString(size_t max_size, std::string* output);
+  std::string BoundedTakeString(size_t max_size);
 
   // Size in bytes of stream's internal buffer.
   size_t size() const { return buffer_.size(); }
diff --git a/spdy/core/hpack/hpack_output_stream_test.cc b/spdy/core/hpack/hpack_output_stream_test.cc
index ea05ece..3d8c35d 100644
--- a/spdy/core/hpack/hpack_output_stream_test.cc
+++ b/spdy/core/hpack/hpack_output_stream_test.cc
@@ -37,8 +37,7 @@
 
   output_stream.AppendBits(0x0, 7);
 
-  std::string str;
-  output_stream.TakeString(&str);
+  std::string str = output_stream.TakeString();
   EXPECT_EQ(expected_str, str);
 }
 
@@ -50,8 +49,7 @@
     output_stream.AppendBits(0x00, 8 - N);
   }
   output_stream.AppendUint32(I);
-  std::string str;
-  output_stream.TakeString(&str);
+  std::string str = output_stream.TakeString();
   return str;
 }
 
@@ -236,8 +234,7 @@
   HpackOutputStream output_stream;
   output_stream.AppendBits(0x7f, 7);
   output_stream.AppendUint32(0x01);
-  std::string str;
-  output_stream.TakeString(&str);
+  std::string str = output_stream.TakeString();
   EXPECT_EQ(std::string("\xff\x00", 2), str);
 }
 
@@ -247,8 +244,7 @@
   output_stream.AppendBytes("buffer1");
   output_stream.AppendBytes("buffer2");
 
-  std::string str;
-  output_stream.TakeString(&str);
+  std::string str = output_stream.TakeString();
   EXPECT_EQ("buffer1buffer2", str);
 }
 
@@ -258,16 +254,15 @@
   output_stream.AppendBytes("buffer12");
   output_stream.AppendBytes("buffer456");
 
-  std::string str;
-  output_stream.BoundedTakeString(9, &str);
+  std::string str = output_stream.BoundedTakeString(9);
   EXPECT_EQ("buffer12b", str);
 
   output_stream.AppendBits(0x7f, 7);
   output_stream.AppendUint32(0x11);
-  output_stream.BoundedTakeString(9, &str);
+  str = output_stream.BoundedTakeString(9);
   EXPECT_EQ("uffer456\xff", str);
 
-  output_stream.BoundedTakeString(9, &str);
+  str = output_stream.BoundedTakeString(9);
   EXPECT_EQ("\x10", str);
 }
 
@@ -280,8 +275,7 @@
   output_stream.AppendBytes("foo");
   output_stream.MutableString()->append("bar");
 
-  std::string str;
-  output_stream.TakeString(&str);
+  std::string str = output_stream.TakeString();
   EXPECT_EQ("12foobar", str);
 }
 
diff --git a/spdy/core/metadata_extension.cc b/spdy/core/metadata_extension.cc
index 12f6af1..1683dcc 100644
--- a/spdy/core/metadata_extension.cc
+++ b/spdy/core/metadata_extension.cc
@@ -55,9 +55,9 @@
   if (!progressive_encoder_->HasNext()) {
     return nullptr;
   }
-  std::string payload;
   // METADATA frames obey the HTTP/2 maximum frame size.
-  progressive_encoder_->Next(spdy::kHttp2DefaultFramePayloadLimit, &payload);
+  std::string payload =
+      progressive_encoder_->Next(spdy::kHttp2DefaultFramePayloadLimit);
   const bool end_metadata = (!progressive_encoder_->HasNext());
   const uint8_t flags = end_metadata ? MetadataVisitor::kEndMetadataFlag : 0;
   return absl::make_unique<spdy::SpdyUnknownIR>(
diff --git a/spdy/core/spdy_framer.cc b/spdy/core/spdy_framer.cc
index 1b6eb8a..580d1e2 100644
--- a/spdy/core/spdy_framer.cc
+++ b/spdy/core/spdy_framer.cc
@@ -301,8 +301,8 @@
 
   const size_t size_without_block =
       is_first_frame_ ? GetFrameSizeSansBlock() : kContinuationFrameMinimumSize;
-  std::string encoding;
-  encoder_->Next(kHttp2MaxControlFrameSendSize - size_without_block, &encoding);
+  std::string encoding =
+      encoder_->Next(kHttp2MaxControlFrameSendSize - size_without_block);
   has_next_frame_ = encoder_->HasNext();
 
   if (framer_->debug_visitor_ != nullptr) {