This change simplifies SpdyHeaderBlock and SpdyHeaderStorage, now that the underlying arena implementation does not allocate memory upon construction.

gfe-relnote: Code simplifications to classes in //third_party/spdy, no functional change; not protected.
PiperOrigin-RevId: 284805587
Change-Id: I3b0cbdda821c1f2ea89b9f880d76a3132490b196
diff --git a/spdy/core/spdy_header_block.cc b/spdy/core/spdy_header_block.cc
index 9ccc627..609f6d7 100644
--- a/spdy/core/spdy_header_block.cc
+++ b/spdy/core/spdy_header_block.cc
@@ -12,7 +12,6 @@
 #include "net/third_party/quiche/src/spdy/platform/api/spdy_estimate_memory_usage.h"
 #include "net/third_party/quiche/src/spdy/platform/api/spdy_logging.h"
 #include "net/third_party/quiche/src/spdy/platform/api/spdy_string_utils.h"
-#include "net/third_party/quiche/src/spdy/platform/api/spdy_unsafe_arena.h"
 
 namespace spdy {
 namespace {
@@ -65,6 +64,10 @@
   return *this;
 }
 
+void SpdyHeaderBlock::HeaderValue::set_storage(SpdyHeaderStorage* storage) {
+  storage_ = storage;
+}
+
 SpdyHeaderBlock::HeaderValue::~HeaderValue() = default;
 
 SpdyStringPiece SpdyHeaderBlock::HeaderValue::ConsolidatedValue() const {
@@ -132,14 +135,14 @@
   // can reclaim the memory used by the key. This makes lookup-only access to
   // SpdyHeaderBlock through operator[] memory-neutral.
   if (valid_ && lookup_result_ == block_->map_.end()) {
-    block_->GetStorage()->Rewind(key_);
+    block_->storage_.Rewind(key_);
   }
 }
 
 SpdyHeaderBlock::ValueProxy& SpdyHeaderBlock::ValueProxy::operator=(
     const SpdyStringPiece value) {
   *spdy_header_block_value_size_ += value.size();
-  SpdyHeaderStorage* storage = block_->GetStorage();
+  SpdyHeaderStorage* storage = &block_->storage_;
   if (lookup_result_ == block_->map_.end()) {
     SPDY_DVLOG(1) << "Inserting: (" << key_ << ", " << value << ")";
     lookup_result_ =
@@ -168,7 +171,10 @@
 SpdyHeaderBlock::SpdyHeaderBlock(SpdyHeaderBlock&& other)
     : map_(kInitialMapBuckets) {
   map_.swap(other.map_);
-  storage_.swap(other.storage_);
+  storage_ = std::move(other.storage_);
+  for (auto& p : map_) {
+    p.second.set_storage(&storage_);
+  }
   key_size_ = other.key_size_;
   value_size_ = other.value_size_;
 }
@@ -177,7 +183,10 @@
 
 SpdyHeaderBlock& SpdyHeaderBlock::operator=(SpdyHeaderBlock&& other) {
   map_.swap(other.map_);
-  storage_.swap(other.storage_);
+  storage_ = std::move(other.storage_);
+  for (auto& p : map_) {
+    p.second.set_storage(&storage_);
+  }
   key_size_ = other.key_size_;
   value_size_ = other.value_size_;
   return *this;
@@ -226,7 +235,7 @@
   key_size_ = 0;
   value_size_ = 0;
   map_.clear();
-  storage_.reset();
+  storage_.Clear();
 }
 
 void SpdyHeaderBlock::insert(const SpdyHeaderBlock::value_type& value) {
@@ -242,9 +251,8 @@
     SPDY_DVLOG(1) << "Updating key: " << iter->first
                   << " with value: " << value.second;
     value_size_ -= iter->second.SizeEstimate();
-    SpdyHeaderStorage* storage = GetStorage();
     iter->second =
-        HeaderValue(storage, iter->first, storage->Write(value.second));
+        HeaderValue(&storage_, iter->first, storage_.Write(value.second));
   }
 }
 
@@ -280,7 +288,7 @@
   SPDY_DVLOG(1) << "Updating key: " << iter->first
                 << "; appending value: " << value;
   value_size_ += SeparatorForKey(key).size();
-  iter->second.Append(GetStorage()->Write(value));
+  iter->second.Append(storage_.Write(value));
 }
 
 size_t SpdyHeaderBlock::EstimateMemoryUsage() const {
@@ -292,29 +300,17 @@
 void SpdyHeaderBlock::AppendHeader(const SpdyStringPiece key,
                                    const SpdyStringPiece value) {
   auto backed_key = WriteKey(key);
-  SpdyHeaderStorage* storage = GetStorage();
   map_.emplace(std::make_pair(
-      backed_key, HeaderValue(storage, backed_key, storage->Write(value))));
-}
-
-SpdyHeaderStorage* SpdyHeaderBlock::GetStorage() {
-  if (storage_ == nullptr) {
-    storage_ = std::make_unique<SpdyHeaderStorage>();
-  }
-  return storage_.get();
+      backed_key, HeaderValue(&storage_, backed_key, storage_.Write(value))));
 }
 
 SpdyStringPiece SpdyHeaderBlock::WriteKey(const SpdyStringPiece key) {
   key_size_ += key.size();
-  return GetStorage()->Write(key);
+  return storage_.Write(key);
 }
 
 size_t SpdyHeaderBlock::bytes_allocated() const {
-  if (storage_ == nullptr) {
-    return 0;
-  } else {
-    return storage_->bytes_allocated();
-  }
+  return storage_.bytes_allocated();
 }
 
 }  // namespace spdy