Remove QuicMemSliceSpan and TestQuicMemSliceVector.

Also deprecate --gfe2_restart_flag_quic_use_new_mem_slice_span2

PiperOrigin-RevId: 389885783
diff --git a/quic/core/http/quic_spdy_stream.cc b/quic/core/http/quic_spdy_stream.cc
index bc23474..0f0c7dc 100644
--- a/quic/core/http/quic_spdy_stream.cc
+++ b/quic/core/http/quic_spdy_stream.cc
@@ -391,7 +391,7 @@
   if (can_write) {
     // Save one copy and allocation if send buffer can accomodate the header.
     QuicMemSlice header_slice(std::move(header));
-    WriteMemSlices(QuicMemSliceSpan(&header_slice), false);
+    WriteMemSlices(absl::MakeSpan(&header_slice, 1), false);
   } else {
     QUICHE_DCHECK(force_write);
     WriteOrBufferData(header.AsStringView(), false, nullptr);
@@ -399,23 +399,6 @@
   return true;
 }
 
-QuicConsumedData QuicSpdyStream::WriteBodySlices(QuicMemSliceSpan slices,
-                                                 bool fin) {
-  if (!VersionUsesHttp3(transport_version()) || slices.empty()) {
-    return WriteMemSlices(slices, fin);
-  }
-
-  QuicConnection::ScopedPacketFlusher flusher(spdy_session_->connection());
-  if (!WriteDataFrameHeader(slices.total_length(), /*force_write=*/false)) {
-    return {0, false};
-  }
-
-  QUIC_DLOG(INFO) << ENDPOINT << "Stream " << id()
-                  << " is writing DATA frame payload of length "
-                  << slices.total_length();
-  return WriteMemSlices(slices, fin);
-}
-
 QuicConsumedData QuicSpdyStream::WriteBodySlices(
     absl::Span<QuicMemSlice> slices,
     bool fin) {
diff --git a/quic/core/http/quic_spdy_stream.h b/quic/core/http/quic_spdy_stream.h
index 4df1196..9042698 100644
--- a/quic/core/http/quic_spdy_stream.h
+++ b/quic/core/http/quic_spdy_stream.h
@@ -161,7 +161,6 @@
 
   // Does the same thing as WriteOrBufferBody except this method takes
   // memslicespan as the data input. Right now it only calls WriteMemSlices.
-  QuicConsumedData WriteBodySlices(QuicMemSliceSpan slices, bool fin);
   QuicConsumedData WriteBodySlices(absl::Span<QuicMemSlice> slices, bool fin);
 
   // Marks the trailers as consumed. This applies to the case where this object
diff --git a/quic/core/quic_datagram_queue.cc b/quic/core/quic_datagram_queue.cc
index e6f3e6f..ebd7483 100644
--- a/quic/core/quic_datagram_queue.cc
+++ b/quic/core/quic_datagram_queue.cc
@@ -9,7 +9,6 @@
 #include "quic/core/quic_session.h"
 #include "quic/core/quic_time.h"
 #include "quic/core/quic_types.h"
-#include "quic/platform/api/quic_mem_slice_span.h"
 
 namespace quic {
 
diff --git a/quic/core/quic_session_test.cc b/quic/core/quic_session_test.cc
index 84b9e2e..10d57c3 100644
--- a/quic/core/quic_session_test.cc
+++ b/quic/core/quic_session_test.cc
@@ -29,7 +29,6 @@
 #include "quic/platform/api/quic_flags.h"
 #include "quic/platform/api/quic_mem_slice_storage.h"
 #include "quic/platform/api/quic_test.h"
-#include "quic/platform/api/quic_test_mem_slice_vector.h"
 #include "quic/test_tools/mock_quic_session_visitor.h"
 #include "quic/test_tools/quic_config_peer.h"
 #include "quic/test_tools/quic_connection_peer.h"
@@ -2571,12 +2570,11 @@
               CloseConnection(
                   QUIC_TRY_TO_WRITE_DATA_ON_READ_UNIDIRECTIONAL_STREAM, _, _))
       .Times(1);
-  char data[1024];
-  std::vector<std::pair<char*, size_t>> buffers;
-  buffers.push_back(std::make_pair(data, ABSL_ARRAYSIZE(data)));
-  buffers.push_back(std::make_pair(data, ABSL_ARRAYSIZE(data)));
-  QuicTestMemSliceVector vector(buffers);
-  stream4->WriteMemSlices(vector.span(), false);
+  std::string data(1024, 'a');
+  std::vector<QuicMemSlice> buffers;
+  buffers.push_back(MemSliceFromString(data));
+  buffers.push_back(MemSliceFromString(data));
+  stream4->WriteMemSlices(absl::MakeSpan(buffers), false);
 }
 
 // Test code that tests that an incoming stream frame with a new (not previously
diff --git a/quic/core/quic_stream.cc b/quic/core/quic_stream.cc
index cde50ef..8654ebf 100644
--- a/quic/core/quic_stream.cc
+++ b/quic/core/quic_stream.cc
@@ -740,17 +740,12 @@
   }
 }
 
-QuicConsumedData QuicStream::WriteMemSlices(QuicMemSliceSpan span, bool fin) {
-  return WriteMemSlicesInner(MemSliceSpanWrapper(span), fin);
+QuicConsumedData QuicStream::WriteMemSlice(QuicMemSlice span, bool fin) {
+  return WriteMemSlices(absl::MakeSpan(&span, 1), fin);
 }
 
 QuicConsumedData QuicStream::WriteMemSlices(absl::Span<QuicMemSlice> span,
                                             bool fin) {
-  return WriteMemSlicesInner(MemSliceSpanWrapper(span), fin);
-}
-
-QuicConsumedData QuicStream::WriteMemSlicesInner(MemSliceSpanWrapper span,
-                                                 bool fin) {
   QuicConsumedData consumed_data(0, false);
   if (span.empty() && !fin) {
     QUIC_BUG(quic_bug_10586_6) << "span.empty() && !fin";
@@ -778,7 +773,7 @@
     if (!span.empty()) {
       // Buffer all data if buffered data size is below limit.
       QuicStreamOffset offset = send_buffer_.stream_offset();
-      consumed_data.bytes_consumed = span.SaveTo(send_buffer_);
+      consumed_data.bytes_consumed = send_buffer_.SaveMemSliceSpan(span);
       if (offset > send_buffer_.stream_offset() ||
           kMaxStreamLength < send_buffer_.stream_offset()) {
         QUIC_BUG(quic_bug_10586_8) << "Write too many data via stream " << id_;
diff --git a/quic/core/quic_stream.h b/quic/core/quic_stream.h
index 6374d8a..1b35e7f 100644
--- a/quic/core/quic_stream.h
+++ b/quic/core/quic_stream.h
@@ -34,7 +34,6 @@
 #include "quic/core/stream_delegate_interface.h"
 #include "quic/platform/api/quic_export.h"
 #include "quic/platform/api/quic_mem_slice.h"
-#include "quic/platform/api/quic_mem_slice_span.h"
 #include "quic/platform/api/quic_reference_counted.h"
 #include "spdy/core/spdy_protocol.h"
 
@@ -349,9 +348,8 @@
   // the wire.  This method has all-or-nothing semantics: if the write buffer is
   // not full, all of the memslices in |span| are moved into it; otherwise,
   // nothing happens.
-  // TODO(vasilvv): deprecate and remove QuicMemSliceSpan version.
-  QuicConsumedData WriteMemSlices(QuicMemSliceSpan span, bool fin);
   QuicConsumedData WriteMemSlices(absl::Span<QuicMemSlice> span, bool fin);
+  QuicConsumedData WriteMemSlice(QuicMemSlice span, bool fin);
 
   // Returns true if any stream data is lost (including fin) and needs to be
   // retransmitted.
@@ -470,26 +468,6 @@
   friend class test::QuicStreamPeer;
   friend class QuicStreamUtils;
 
-  // Wraps around either QuicMemSliceSpan or absl::Span<QuicMemSlice>.
-  // TODO(vasilvv): delete this after QuicMemSliceSpan is gone.
-  class QUIC_EXPORT_PRIVATE MemSliceSpanWrapper {
-   public:
-    explicit MemSliceSpanWrapper(QuicMemSliceSpan span) : old_(span) {}
-    explicit MemSliceSpanWrapper(absl::Span<QuicMemSlice> span) : new_(span) {}
-
-    bool empty() { return old_.has_value() ? old_->empty() : new_.empty(); }
-    QuicByteCount SaveTo(QuicStreamSendBuffer& send_buffer) {
-      if (old_.has_value()) {
-        return send_buffer.SaveMemSliceSpan(*old_);
-      }
-      return send_buffer.SaveMemSliceSpan(new_);
-    }
-
-   private:
-    absl::optional<QuicMemSliceSpan> old_;
-    absl::Span<QuicMemSlice> new_;
-  };
-
   QuicStream(QuicStreamId id,
              QuicSession* session,
              QuicStreamSequencer sequencer,
@@ -518,8 +496,6 @@
   // Returns true if deadline_ has passed.
   bool HasDeadlinePassed() const;
 
-  QuicConsumedData WriteMemSlicesInner(MemSliceSpanWrapper span, bool fin);
-
   QuicStreamSequencer sequencer_;
   QuicStreamId id_;
   // Pointer to the owning QuicSession object.
diff --git a/quic/core/quic_stream_send_buffer.cc b/quic/core/quic_stream_send_buffer.cc
index 1e32e54..b2ac6bf 100644
--- a/quic/core/quic_stream_send_buffer.cc
+++ b/quic/core/quic_stream_send_buffer.cc
@@ -92,11 +92,6 @@
   stream_offset_ += length;
 }
 
-QuicByteCount QuicStreamSendBuffer::SaveMemSliceSpan(QuicMemSliceSpan span) {
-  return span.ConsumeAll(
-      [&](QuicMemSlice slice) { SaveMemSlice(std::move(slice)); });
-}
-
 QuicByteCount QuicStreamSendBuffer::SaveMemSliceSpan(
     absl::Span<QuicMemSlice> span) {
   QuicByteCount total = 0;
diff --git a/quic/core/quic_stream_send_buffer.h b/quic/core/quic_stream_send_buffer.h
index f91e476..bf50217 100644
--- a/quic/core/quic_stream_send_buffer.h
+++ b/quic/core/quic_stream_send_buffer.h
@@ -12,7 +12,6 @@
 #include "quic/core/quic_types.h"
 #include "quic/platform/api/quic_iovec.h"
 #include "quic/platform/api/quic_mem_slice.h"
-#include "quic/platform/api/quic_mem_slice_span.h"
 #include "common/quiche_circular_deque.h"
 
 namespace quic {
@@ -80,7 +79,6 @@
   void SaveMemSlice(QuicMemSlice slice);
 
   // Save all slices in |span| to send buffer. Return total bytes saved.
-  QuicByteCount SaveMemSliceSpan(QuicMemSliceSpan span);
   QuicByteCount SaveMemSliceSpan(absl::Span<QuicMemSlice> span);
 
   // Called when |bytes_consumed| bytes has been consumed by the stream.
diff --git a/quic/core/quic_stream_send_buffer_test.cc b/quic/core/quic_stream_send_buffer_test.cc
index e1a2358..9aaec4d 100644
--- a/quic/core/quic_stream_send_buffer_test.cc
+++ b/quic/core/quic_stream_send_buffer_test.cc
@@ -13,7 +13,6 @@
 #include "quic/platform/api/quic_expect_bug.h"
 #include "quic/platform/api/quic_flags.h"
 #include "quic/platform/api/quic_test.h"
-#include "quic/platform/api/quic_test_mem_slice_vector.h"
 #include "quic/test_tools/quic_stream_send_buffer_peer.h"
 #include "quic/test_tools/quic_test_utils.h"
 
@@ -321,14 +320,13 @@
   SimpleBufferAllocator allocator;
   QuicStreamSendBuffer send_buffer(&allocator);
 
-  char data[1024];
-  std::vector<std::pair<char*, size_t>> buffers;
+  std::string data(1024, 'a');
+  std::vector<QuicMemSlice> buffers;
   for (size_t i = 0; i < 10; ++i) {
-    buffers.push_back(std::make_pair(data, 1024));
+    buffers.push_back(MemSliceFromString(data));
   }
-  QuicTestMemSliceVector vector(buffers);
 
-  EXPECT_EQ(10 * 1024u, send_buffer.SaveMemSliceSpan(vector.span()));
+  EXPECT_EQ(10 * 1024u, send_buffer.SaveMemSliceSpan(absl::MakeSpan(buffers)));
   EXPECT_EQ(10u, send_buffer.size());
 }
 
@@ -336,15 +334,13 @@
   SimpleBufferAllocator allocator;
   QuicStreamSendBuffer send_buffer(&allocator);
 
-  char data[1024];
-  std::vector<std::pair<char*, size_t>> buffers;
+  std::string data(1024, 'a');
+  std::vector<QuicMemSlice> buffers;
   for (size_t i = 0; i < 10; ++i) {
-    buffers.push_back(std::make_pair(data, 1024));
+    buffers.push_back(MemSliceFromString(data));
   }
-  buffers.push_back(std::make_pair(nullptr, 0));
-  QuicTestMemSliceVector vector(buffers);
 
-  EXPECT_EQ(10 * 1024u, send_buffer.SaveMemSliceSpan(vector.span()));
+  EXPECT_EQ(10 * 1024u, send_buffer.SaveMemSliceSpan(absl::MakeSpan(buffers)));
   // Verify the empty slice does not get saved.
   EXPECT_EQ(10u, send_buffer.size());
 }
diff --git a/quic/core/quic_stream_test.cc b/quic/core/quic_stream_test.cc
index e69b657..b36bd95 100644
--- a/quic/core/quic_stream_test.cc
+++ b/quic/core/quic_stream_test.cc
@@ -26,7 +26,6 @@
 #include "quic/platform/api/quic_logging.h"
 #include "quic/platform/api/quic_mem_slice_storage.h"
 #include "quic/platform/api/quic_test.h"
-#include "quic/platform/api/quic_test_mem_slice_vector.h"
 #include "quic/test_tools/quic_config_peer.h"
 #include "quic/test_tools/quic_connection_peer.h"
 #include "quic/test_tools/quic_flow_controller_peer.h"
@@ -1243,26 +1242,20 @@
 TEST_P(QuicStreamTest, WriteMemSlicesReachStreamLimit) {
   Initialize();
   QuicStreamPeer::SetStreamBytesWritten(kMaxStreamLength - 5u, stream_);
-  char data[5];
   std::vector<std::pair<char*, size_t>> buffers;
-  buffers.push_back(std::make_pair(data, ABSL_ARRAYSIZE(data)));
-  QuicTestMemSliceVector vector1(buffers);
-  QuicMemSliceSpan span1 = vector1.span();
+  QuicMemSlice slice1 = MemSliceFromString("12345");
   EXPECT_CALL(*session_, WritevData(_, _, _, _, _, _))
       .WillOnce(InvokeWithoutArgs([this]() {
         return session_->ConsumeData(stream_->id(), 5u, 0u, NO_FIN,
                                      NOT_RETRANSMISSION, absl::nullopt);
       }));
   // There is no buffered data before, all data should be consumed.
-  QuicConsumedData consumed = stream_->WriteMemSlices(span1, false);
+  QuicConsumedData consumed = stream_->WriteMemSlice(std::move(slice1), false);
   EXPECT_EQ(5u, consumed.bytes_consumed);
 
-  std::vector<std::pair<char*, size_t>> buffers2;
-  buffers2.push_back(std::make_pair(data, 1u));
-  QuicTestMemSliceVector vector2(buffers);
-  QuicMemSliceSpan span2 = vector2.span();
+  QuicMemSlice slice2 = MemSliceFromString("6");
   EXPECT_CALL(*connection_, CloseConnection(QUIC_STREAM_LENGTH_OVERFLOW, _, _));
-  EXPECT_QUIC_BUG(stream_->WriteMemSlices(span2, false),
+  EXPECT_QUIC_BUG(stream_->WriteMemSlice(std::move(slice2), false),
                   "Write too many data via stream");
 }
 
diff --git a/quic/core/web_transport_stream_adapter.cc b/quic/core/web_transport_stream_adapter.cc
index 2470aac..171a3c0 100644
--- a/quic/core/web_transport_stream_adapter.cc
+++ b/quic/core/web_transport_stream_adapter.cc
@@ -45,7 +45,7 @@
   QuicMemSlice memslice(QuicBuffer::Copy(
       session_->connection()->helper()->GetStreamSendBufferAllocator(), data));
   QuicConsumedData consumed =
-      stream_->WriteMemSlices(QuicMemSliceSpan(&memslice), /*fin=*/false);
+      stream_->WriteMemSlices(absl::MakeSpan(&memslice, 1), /*fin=*/false);
 
   if (consumed.bytes_consumed == data.size()) {
     return true;
@@ -75,7 +75,7 @@
 
   QuicMemSlice empty;
   QuicConsumedData consumed =
-      stream_->WriteMemSlices(QuicMemSliceSpan(&empty), /*fin=*/true);
+      stream_->WriteMemSlices(absl::MakeSpan(&empty, 1), /*fin=*/true);
   QUICHE_DCHECK_EQ(consumed.bytes_consumed, 0u);
   return consumed.fin_consumed;
 }
diff --git a/quic/platform/api/quic_mem_slice_span.h b/quic/platform/api/quic_mem_slice_span.h
deleted file mode 100644
index c33707a..0000000
--- a/quic/platform/api/quic_mem_slice_span.h
+++ /dev/null
@@ -1,59 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef QUICHE_QUIC_PLATFORM_API_QUIC_MEM_SLICE_SPAN_H_
-#define QUICHE_QUIC_PLATFORM_API_QUIC_MEM_SLICE_SPAN_H_
-
-#include "absl/strings/string_view.h"
-#include "quic/platform/api/quic_export.h"
-#include "net/quic/platform/impl/quic_mem_slice_span_impl.h"
-
-namespace quic {
-
-// QuicMemSliceSpan is effectively wrapper around an array of data structures
-// used as QuicMemSlice. So it could implemented with:
-// QuicMemSlice* slices_;
-// size_t num_slices_;
-// But for efficiency reasons, the actual implementation is an array of
-// platform-specific objects. This could avoid the translation from
-// platform-specific object to QuicMemSlice.
-// QuicMemSliceSpan does not own the underling data buffers.
-class QUIC_EXPORT_PRIVATE QuicMemSliceSpan {
- public:
-  explicit QuicMemSliceSpan(QuicMemSliceSpanImpl impl) : impl_(impl) {}
-
-  // Constructs a span with a single QuicMemSlice.
-  explicit QuicMemSliceSpan(QuicMemSlice* slice) : impl_(slice->impl()) {}
-
-  QuicMemSliceSpan(const QuicMemSliceSpan& other) = default;
-  QuicMemSliceSpan& operator=(const QuicMemSliceSpan& other) = default;
-  QuicMemSliceSpan(QuicMemSliceSpan&& other) = default;
-  QuicMemSliceSpan& operator=(QuicMemSliceSpan&& other) = default;
-
-  ~QuicMemSliceSpan() = default;
-
-  template <typename ConsumeFunction>
-  QuicByteCount ConsumeAll(ConsumeFunction consume) {
-    return impl_.ConsumeAll(consume);
-  }
-
-  // Return data of the span at |index| by the form of a
-  // absl::string_view.
-  absl::string_view GetData(int index) { return impl_.GetData(index); }
-
-  // Return the total length of the data inside the span.
-  QuicByteCount total_length() { return impl_.total_length(); }
-
-  // Return total number of slices in the span.
-  size_t NumSlices() { return impl_.NumSlices(); }
-
-  bool empty() const { return impl_.empty(); }
-
- private:
-  QuicMemSliceSpanImpl impl_;
-};
-
-}  // namespace quic
-
-#endif  // QUICHE_QUIC_PLATFORM_API_QUIC_MEM_SLICE_SPAN_H_
diff --git a/quic/platform/api/quic_mem_slice_span_test.cc b/quic/platform/api/quic_mem_slice_span_test.cc
deleted file mode 100644
index 99a11df..0000000
--- a/quic/platform/api/quic_mem_slice_span_test.cc
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "quic/platform/api/quic_mem_slice_span.h"
-
-#include "quic/core/quic_simple_buffer_allocator.h"
-#include "quic/core/quic_types.h"
-#include "quic/platform/api/quic_flags.h"
-#include "quic/platform/api/quic_test.h"
-#include "quic/platform/api/quic_test_mem_slice_vector.h"
-
-namespace quic {
-namespace test {
-namespace {
-
-class QuicMemSliceSpanImplTest : public QuicTest {
- public:
-  QuicMemSliceSpanImplTest() {
-    for (size_t i = 0; i < 10; ++i) {
-      buffers_.push_back(std::make_pair(data_, 1024));
-    }
-  }
-
-  char data_[1024];
-  std::vector<std::pair<char*, size_t>> buffers_;
-};
-
-TEST_F(QuicMemSliceSpanImplTest, ConsumeAll) {
-  SimpleBufferAllocator allocator;
-  QuicTestMemSliceVector vector(buffers_);
-
-  int num_slices = 0;
-  QuicByteCount bytes_consumed =
-      vector.span().ConsumeAll([&](QuicMemSlice slice) {
-        EXPECT_EQ(data_, slice.data());
-        EXPECT_EQ(1024u, slice.length());
-        ++num_slices;
-      });
-
-  EXPECT_EQ(10 * 1024u, bytes_consumed);
-  EXPECT_EQ(10, num_slices);
-}
-
-}  // namespace
-}  // namespace test
-}  // namespace quic
diff --git a/quic/platform/api/quic_mem_slice_storage.cc b/quic/platform/api/quic_mem_slice_storage.cc
new file mode 100644
index 0000000..87bce7f
--- /dev/null
+++ b/quic/platform/api/quic_mem_slice_storage.cc
@@ -0,0 +1,35 @@
+// Copyright 2021 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "quic/platform/api/quic_mem_slice_storage.h"
+
+#include "quic/core/quic_utils.h"
+
+namespace quic {
+
+QuicMemSliceStorage::QuicMemSliceStorage(const struct iovec* iov, int iov_count,
+                                         QuicBufferAllocator* allocator,
+                                         const QuicByteCount max_slice_len) {
+  if (iov == nullptr) {
+    return;
+  }
+  QuicByteCount write_len = 0;
+  for (int i = 0; i < iov_count; ++i) {
+    write_len += iov[i].iov_len;
+  }
+  QUICHE_DCHECK_LT(0u, write_len);
+
+  size_t io_offset = 0;
+  while (write_len > 0) {
+    size_t slice_len = std::min(write_len, max_slice_len);
+    QuicBuffer buffer(allocator, slice_len);
+    QuicUtils::CopyToBuffer(iov, iov_count, io_offset, slice_len,
+                            buffer.data());
+    storage_.push_back(QuicMemSlice(std::move(buffer)));
+    write_len -= slice_len;
+    io_offset += slice_len;
+  }
+}
+
+}  // namespace quic
diff --git a/quic/platform/api/quic_mem_slice_storage.h b/quic/platform/api/quic_mem_slice_storage.h
index 3ec1fc4..4cccee3 100644
--- a/quic/platform/api/quic_mem_slice_storage.h
+++ b/quic/platform/api/quic_mem_slice_storage.h
@@ -5,8 +5,14 @@
 #ifndef QUICHE_QUIC_PLATFORM_API_QUIC_MEM_SLICE_STORAGE_H_
 #define QUICHE_QUIC_PLATFORM_API_QUIC_MEM_SLICE_STORAGE_H_
 
+#include <vector>
+
+#include "absl/types/span.h"
+#include "quic/core/quic_buffer_allocator.h"
+#include "quic/core/quic_types.h"
 #include "quic/platform/api/quic_export.h"
-#include "net/quic/platform/impl/quic_mem_slice_storage_impl.h"
+#include "quic/platform/api/quic_iovec.h"
+#include "quic/platform/api/quic_mem_slice.h"
 
 namespace quic {
 
@@ -14,11 +20,9 @@
 // use cases such as turning into QuicMemSliceSpan.
 class QUIC_EXPORT_PRIVATE QuicMemSliceStorage {
  public:
-  QuicMemSliceStorage(const struct iovec* iov,
-                      int iov_count,
+  QuicMemSliceStorage(const struct iovec* iov, int iov_count,
                       QuicBufferAllocator* allocator,
-                      const QuicByteCount max_slice_len)
-      : impl_(iov, iov_count, allocator, max_slice_len) {}
+                      const QuicByteCount max_slice_len);
 
   QuicMemSliceStorage(const QuicMemSliceStorage& other) = default;
   QuicMemSliceStorage& operator=(const QuicMemSliceStorage& other) = default;
@@ -28,12 +32,10 @@
   ~QuicMemSliceStorage() = default;
 
   // Return a QuicMemSliceSpan form of the storage.
-  QuicMemSliceSpan ToSpan() { return impl_.ToSpan(); }
-
-  void Append(QuicMemSlice slice) { impl_.Append(std::move(*slice.impl())); }
+  absl::Span<QuicMemSlice> ToSpan() { return absl::MakeSpan(storage_); }
 
  private:
-  QuicMemSliceStorageImpl impl_;
+  std::vector<QuicMemSlice> storage_;
 };
 
 }  // namespace quic
diff --git a/quic/platform/api/quic_mem_slice_storage_test.cc b/quic/platform/api/quic_mem_slice_storage_test.cc
index 086e218..4bef774 100644
--- a/quic/platform/api/quic_mem_slice_storage_test.cc
+++ b/quic/platform/api/quic_mem_slice_storage_test.cc
@@ -6,7 +6,6 @@
 
 #include "quic/core/quic_simple_buffer_allocator.h"
 #include "quic/platform/api/quic_test.h"
-#include "quic/platform/api/quic_test_mem_slice_vector.h"
 
 namespace quic {
 namespace test {
@@ -28,8 +27,8 @@
   struct iovec iov = {const_cast<char*>(body.data()), body.length()};
   QuicMemSliceStorage storage(&iov, 1, &allocator, 1024);
   auto span = storage.ToSpan();
-  EXPECT_EQ("ccc", span.GetData(0));
-  EXPECT_NE(static_cast<const void*>(span.GetData(0).data()), body.data());
+  EXPECT_EQ("ccc", span[0].AsStringView());
+  EXPECT_NE(static_cast<const void*>(span[0].data()), body.data());
 }
 
 TEST_F(QuicMemSliceStorageImplTest, MultipleIovInSingleSlice) {
@@ -41,7 +40,7 @@
 
   QuicMemSliceStorage storage(iov, 2, &allocator, 1024);
   auto span = storage.ToSpan();
-  EXPECT_EQ("aaabbbb", span.GetData(0));
+  EXPECT_EQ("aaabbbb", span[0].AsStringView());
 }
 
 TEST_F(QuicMemSliceStorageImplTest, MultipleIovInMultipleSlice) {
@@ -53,26 +52,8 @@
 
   QuicMemSliceStorage storage(iov, 2, &allocator, 4);
   auto span = storage.ToSpan();
-  EXPECT_EQ("aaaa", span.GetData(0));
-  EXPECT_EQ("bbbb", span.GetData(1));
-}
-
-TEST_F(QuicMemSliceStorageImplTest, AppendMemSlices) {
-  std::string body1(3, 'a');
-  std::string body2(4, 'b');
-  std::vector<std::pair<char*, size_t>> buffers;
-  buffers.push_back(
-      std::make_pair(const_cast<char*>(body1.data()), body1.length()));
-  buffers.push_back(
-      std::make_pair(const_cast<char*>(body2.data()), body2.length()));
-  QuicTestMemSliceVector mem_slices(buffers);
-
-  QuicMemSliceStorage storage(nullptr, 0, nullptr, 0);
-  mem_slices.span().ConsumeAll(
-      [&storage](QuicMemSlice slice) { storage.Append(std::move(slice)); });
-
-  EXPECT_EQ("aaa", storage.ToSpan().GetData(0));
-  EXPECT_EQ("bbbb", storage.ToSpan().GetData(1));
+  EXPECT_EQ("aaaa", span[0].AsStringView());
+  EXPECT_EQ("bbbb", span[1].AsStringView());
 }
 
 }  // namespace
diff --git a/quic/platform/api/quic_test_mem_slice_vector.h b/quic/platform/api/quic_test_mem_slice_vector.h
deleted file mode 100644
index 17d5853..0000000
--- a/quic/platform/api/quic_test_mem_slice_vector.h
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef QUICHE_QUIC_PLATFORM_API_QUIC_TEST_MEM_SLICE_VECTOR_H_
-#define QUICHE_QUIC_PLATFORM_API_QUIC_TEST_MEM_SLICE_VECTOR_H_
-
-#include <utility>
-
-#include "quic/platform/api/quic_mem_slice_span.h"
-#include "net/quic/platform/impl/quic_test_mem_slice_vector_impl.h"
-
-namespace quic {
-namespace test {
-// QuicTestMemSliceVector is a test only class which creates a vector of
-// platform-specific data structure (used as QuicMemSlice) from an array of data
-// buffers. QuicTestMemSliceVector does not own the underlying data buffer.
-// Tests using QuicTestMemSliceVector need to make sure the actual data buffers
-// outlive QuicTestMemSliceVector, and QuicTestMemSliceVector outlive the
-// returned QuicMemSliceSpan.
-class QUIC_NO_EXPORT QuicTestMemSliceVector {
- public:
-  explicit QuicTestMemSliceVector(std::vector<std::pair<char*, size_t>> buffers)
-      : impl_(std::move(buffers)) {}
-
-  QuicMemSliceSpan span() { return QuicMemSliceSpan(impl_.span()); }
-
- private:
-  QuicTestMemSliceVectorImpl impl_;
-};
-
-}  // namespace test
-}  // namespace quic
-
-#endif  // QUICHE_QUIC_PLATFORM_API_QUIC_TEST_MEM_SLICE_VECTOR_H_
diff --git a/quic/test_tools/quic_test_utils.cc b/quic/test_tools/quic_test_utils.cc
index 126b87e..9a7fd85 100644
--- a/quic/test_tools/quic_test_utils.cc
+++ b/quic/test_tools/quic_test_utils.cc
@@ -1312,20 +1312,6 @@
              : default_type;
 }
 
-QuicMemSliceSpan MakeSpan(QuicBufferAllocator* allocator,
-                          absl::string_view message_data,
-                          QuicMemSliceStorage* storage) {
-  if (message_data.length() == 0) {
-    *storage =
-        QuicMemSliceStorage(nullptr, 0, allocator, kMaxOutgoingPacketSize);
-    return storage->ToSpan();
-  }
-  struct iovec iov = {const_cast<char*>(message_data.data()),
-                      message_data.length()};
-  *storage = QuicMemSliceStorage(&iov, 1, allocator, kMaxOutgoingPacketSize);
-  return storage->ToSpan();
-}
-
 QuicMemSlice MemSliceFromString(absl::string_view data) {
   if (data.empty()) {
     return QuicMemSlice();
diff --git a/quic/test_tools/quic_test_utils.h b/quic/test_tools/quic_test_utils.h
index 06f3eec..39320e1 100644
--- a/quic/test_tools/quic_test_utils.h
+++ b/quic/test_tools/quic_test_utils.h
@@ -1823,12 +1823,6 @@
                                bool is_incoming,
                                StreamType default_type);
 
-// Utility function that stores message_data in |storage| and returns a
-// QuicMemSliceSpan.
-QuicMemSliceSpan MakeSpan(QuicBufferAllocator* allocator,
-                          absl::string_view message_data,
-                          QuicMemSliceStorage* storage);
-
 // Creates a MemSlice using a singleton trivial buffer allocator.  Performs a
 // copy.
 QuicMemSlice MemSliceFromString(absl::string_view data);