Move QuicMemSlice to third_party/quiche as QuicheMemSlice.

Also move and rename QuicMemSliceStorage, but since it does not have anything
platformized itself, put it in third_party/quiche/common rather than
third_party/quiche/common/platform.

PiperOrigin-RevId: 430769412
diff --git a/common/platform/api/quiche_mem_slice.h b/common/platform/api/quiche_mem_slice.h
new file mode 100644
index 0000000..6c4f81a
--- /dev/null
+++ b/common/platform/api/quiche_mem_slice.h
@@ -0,0 +1,92 @@
+// 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_COMMON_PLATFORM_API_QUICHE_MEM_SLICE_H_
+#define QUICHE_COMMON_PLATFORM_API_QUICHE_MEM_SLICE_H_
+
+#include <memory>
+
+#include "absl/strings/string_view.h"
+#include "common/platform/api/quiche_export.h"
+#include "net/quiche/common/platform/impl/quiche_mem_slice_impl.h"
+
+/* API_DESCRIPTION
+ QuicheMemSlice is used to wrap application data and pass to QUIC stream's write
+ interface. It refers to a memory block of data which should be around till
+ QuicheMemSlice::Reset() is called. It's upto each platform, to implement it as
+ reference counted or not.
+ API-DESCRIPTION */
+
+namespace quiche {
+
+// QuicheMemSlice is an internally reference counted data buffer used as the
+// source buffers for write operations. QuicheMemSlice implicitly maintains a
+// reference count and will free the underlying data buffer when the reference
+// count reaches zero.
+class QUICHE_EXPORT_PRIVATE QuicheMemSlice {
+ public:
+  // Constructs a empty QuicheMemSlice with no underlying data and 0 reference
+  // count.
+  QuicheMemSlice() = default;
+
+  // Constructs a QuicheMemSlice that takes ownership of |buffer|.  |length|
+  // must not be zero.  To construct an empty QuicheMemSlice, use the
+  // zero-argument constructor instead.
+  // TODO(vasilvv): switch all users to QuicBuffer version, and make this
+  // private.
+  QuicheMemSlice(quic::QuicUniqueBufferPtr buffer, size_t length)
+      : impl_(std::move(buffer), length) {}
+
+  // Constructs a QuicheMemSlice that takes ownership of |buffer|.  The length
+  // of the |buffer| must not be zero.  To construct an empty QuicheMemSlice,
+  // use the zero-argument constructor instead.
+  explicit QuicheMemSlice(quic::QuicBuffer buffer) : QuicheMemSlice() {
+    // Store the size of the buffer *before* calling buffer.Release().
+    const size_t size = buffer.size();
+    *this = QuicheMemSlice(buffer.Release(), size);
+  }
+
+  // Constructs a QuicheMemSlice that takes ownership of |buffer| allocated on
+  // heap.  |length| must not be zero.
+  QuicheMemSlice(std::unique_ptr<char[]> buffer, size_t length)
+      : impl_(std::move(buffer), length) {}
+
+  // Constructs QuicheMemSlice from |impl|. It takes the reference away from
+  // |impl|.
+  explicit QuicheMemSlice(QuicheMemSliceImpl impl) : impl_(std::move(impl)) {}
+
+  QuicheMemSlice(const QuicheMemSlice& other) = delete;
+  QuicheMemSlice& operator=(const QuicheMemSlice& other) = delete;
+
+  // Move constructors. |other| will not hold a reference to the data buffer
+  // after this call completes.
+  QuicheMemSlice(QuicheMemSlice&& other) = default;
+  QuicheMemSlice& operator=(QuicheMemSlice&& other) = default;
+
+  ~QuicheMemSlice() = default;
+
+  // Release the underlying reference. Further access the memory will result in
+  // undefined behavior.
+  void Reset() { impl_.Reset(); }
+
+  // Returns a const char pointer to underlying data buffer.
+  const char* data() const { return impl_.data(); }
+  // Returns the length of underlying data buffer.
+  size_t length() const { return impl_.length(); }
+  // Returns the representation of the underlying data as a string view.
+  absl::string_view AsStringView() const {
+    return absl::string_view(data(), length());
+  }
+
+  bool empty() const { return impl_.empty(); }
+
+  QuicheMemSliceImpl* impl() { return &impl_; }
+
+ private:
+  QuicheMemSliceImpl impl_;
+};
+
+}  // namespace quiche
+
+#endif  // QUICHE_COMMON_PLATFORM_API_QUICHE_MEM_SLICE_H_
diff --git a/quic/platform/api/quic_mem_slice_test.cc b/common/platform/api/quiche_mem_slice_test.cc
similarity index 63%
rename from quic/platform/api/quic_mem_slice_test.cc
rename to common/platform/api/quiche_mem_slice_test.cc
index 44095df..de6adbe 100644
--- a/quic/platform/api/quic_mem_slice_test.cc
+++ b/common/platform/api/quiche_mem_slice_test.cc
@@ -2,36 +2,36 @@
 // 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.h"
+#include "common/platform/api/quiche_mem_slice.h"
 
 #include <memory>
 
 #include "absl/strings/string_view.h"
 #include "quic/core/quic_buffer_allocator.h"
 #include "quic/core/quic_simple_buffer_allocator.h"
-#include "quic/platform/api/quic_test.h"
+#include "common/platform/api/quiche_test.h"
 
-namespace quic {
+namespace quiche {
 namespace test {
 namespace {
 
-class QuicMemSliceTest : public QuicTest {
+class QuicheMemSliceTest : public QuicheTest {
  public:
-  QuicMemSliceTest() {
+  QuicheMemSliceTest() {
     size_t length = 1024;
-    slice_ = QuicMemSlice(MakeUniqueBuffer(&allocator_, length), length);
+    slice_ = QuicheMemSlice(MakeUniqueBuffer(&allocator_, length), length);
     orig_data_ = slice_.data();
     orig_length_ = slice_.length();
   }
 
-  SimpleBufferAllocator allocator_;
-  QuicMemSlice slice_;
+  quic::SimpleBufferAllocator allocator_;
+  QuicheMemSlice slice_;
   const char* orig_data_;
   size_t orig_length_;
 };
 
-TEST_F(QuicMemSliceTest, MoveConstruct) {
-  QuicMemSlice moved(std::move(slice_));
+TEST_F(QuicheMemSliceTest, MoveConstruct) {
+  QuicheMemSlice moved(std::move(slice_));
   EXPECT_EQ(moved.data(), orig_data_);
   EXPECT_EQ(moved.length(), orig_length_);
   EXPECT_EQ(nullptr, slice_.data());
@@ -39,8 +39,8 @@
   EXPECT_TRUE(slice_.empty());
 }
 
-TEST_F(QuicMemSliceTest, MoveAssign) {
-  QuicMemSlice moved;
+TEST_F(QuicheMemSliceTest, MoveAssign) {
+  QuicheMemSlice moved;
   moved = std::move(slice_);
   EXPECT_EQ(moved.data(), orig_data_);
   EXPECT_EQ(moved.length(), orig_length_);
@@ -49,21 +49,21 @@
   EXPECT_TRUE(slice_.empty());
 }
 
-TEST_F(QuicMemSliceTest, SliceAllocatedOnHeap) {
+TEST_F(QuicheMemSliceTest, SliceAllocatedOnHeap) {
   auto buffer = std::make_unique<char[]>(128);
   char* orig_data = buffer.get();
   size_t used_length = 105;
-  QuicMemSlice slice = QuicMemSlice(std::move(buffer), used_length);
-  QuicMemSlice moved = std::move(slice);
+  QuicheMemSlice slice = QuicheMemSlice(std::move(buffer), used_length);
+  QuicheMemSlice moved = std::move(slice);
   EXPECT_EQ(moved.data(), orig_data);
   EXPECT_EQ(moved.length(), used_length);
 }
 
-TEST_F(QuicMemSliceTest, SliceFromBuffer) {
+TEST_F(QuicheMemSliceTest, SliceFromBuffer) {
   const absl::string_view kTestString =
       "RFC 9000 Release Celebration Memorial Test String";
-  auto buffer = QuicBuffer::Copy(&allocator_, kTestString);
-  QuicMemSlice slice(std::move(buffer));
+  auto buffer = quic::QuicBuffer::Copy(&allocator_, kTestString);
+  QuicheMemSlice slice(std::move(buffer));
 
   EXPECT_EQ(buffer.data(), nullptr);  // NOLINT(bugprone-use-after-move)
   EXPECT_EQ(buffer.size(), 0u);
@@ -73,4 +73,4 @@
 
 }  // namespace
 }  // namespace test
-}  // namespace quic
+}  // namespace quiche
diff --git a/common/quiche_mem_slice_storage.cc b/common/quiche_mem_slice_storage.cc
new file mode 100644
index 0000000..e3e1c5a
--- /dev/null
+++ b/common/quiche_mem_slice_storage.cc
@@ -0,0 +1,36 @@
+// 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 "common/quiche_mem_slice_storage.h"
+
+#include "quic/core/quic_utils.h"
+
+namespace quiche {
+
+QuicheMemSliceStorage::QuicheMemSliceStorage(
+    const struct iovec* iov, int iov_count,
+    quic::QuicBufferAllocator* allocator,
+    const quic::QuicByteCount max_slice_len) {
+  if (iov == nullptr) {
+    return;
+  }
+  quic::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);
+    quic::QuicBuffer buffer(allocator, slice_len);
+    quic::QuicUtils::CopyToBuffer(iov, iov_count, io_offset, slice_len,
+                                  buffer.data());
+    storage_.push_back(QuicheMemSlice(std::move(buffer)));
+    write_len -= slice_len;
+    io_offset += slice_len;
+  }
+}
+
+}  // namespace quiche
diff --git a/common/quiche_mem_slice_storage.h b/common/quiche_mem_slice_storage.h
new file mode 100644
index 0000000..6ec68bb
--- /dev/null
+++ b/common/quiche_mem_slice_storage.h
@@ -0,0 +1,44 @@
+// 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_COMMON_QUICHE_MEM_SLICE_STORAGE_H_
+#define QUICHE_COMMON_QUICHE_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_iovec.h"
+#include "common/platform/api/quiche_export.h"
+#include "common/platform/api/quiche_mem_slice.h"
+
+namespace quiche {
+
+// QuicheMemSliceStorage is a container class that store QuicheMemSlices for
+// further use cases such as turning into QuicheMemSliceSpan.
+class QUICHE_EXPORT_PRIVATE QuicheMemSliceStorage {
+ public:
+  QuicheMemSliceStorage(const struct iovec* iov, int iov_count,
+                        quic::QuicBufferAllocator* allocator,
+                        const quic::QuicByteCount max_slice_len);
+
+  QuicheMemSliceStorage(const QuicheMemSliceStorage& other) = default;
+  QuicheMemSliceStorage& operator=(const QuicheMemSliceStorage& other) =
+      default;
+  QuicheMemSliceStorage(QuicheMemSliceStorage&& other) = default;
+  QuicheMemSliceStorage& operator=(QuicheMemSliceStorage&& other) = default;
+
+  ~QuicheMemSliceStorage() = default;
+
+  // Return a QuicheMemSliceSpan form of the storage.
+  absl::Span<QuicheMemSlice> ToSpan() { return absl::MakeSpan(storage_); }
+
+ private:
+  std::vector<QuicheMemSlice> storage_;
+};
+
+}  // namespace quiche
+
+#endif  // QUICHE_COMMON_QUICHE_MEM_SLICE_STORAGE_H_
diff --git a/common/quiche_mem_slice_storage_test.cc b/common/quiche_mem_slice_storage_test.cc
new file mode 100644
index 0000000..a07c71d
--- /dev/null
+++ b/common/quiche_mem_slice_storage_test.cc
@@ -0,0 +1,61 @@
+// 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 "common/quiche_mem_slice_storage.h"
+
+#include "quic/core/quic_simple_buffer_allocator.h"
+#include "common/platform/api/quiche_test.h"
+
+namespace quiche {
+namespace test {
+namespace {
+
+class QuicheMemSliceStorageImplTest : public QuicheTest {
+ public:
+  QuicheMemSliceStorageImplTest() = default;
+};
+
+TEST_F(QuicheMemSliceStorageImplTest, EmptyIov) {
+  QuicheMemSliceStorage storage(nullptr, 0, nullptr, 1024);
+  EXPECT_TRUE(storage.ToSpan().empty());
+}
+
+TEST_F(QuicheMemSliceStorageImplTest, SingleIov) {
+  quic::SimpleBufferAllocator allocator;
+  std::string body(3, 'c');
+  struct iovec iov = {const_cast<char*>(body.data()), body.length()};
+  QuicheMemSliceStorage storage(&iov, 1, &allocator, 1024);
+  auto span = storage.ToSpan();
+  EXPECT_EQ("ccc", span[0].AsStringView());
+  EXPECT_NE(static_cast<const void*>(span[0].data()), body.data());
+}
+
+TEST_F(QuicheMemSliceStorageImplTest, MultipleIovInSingleSlice) {
+  quic::SimpleBufferAllocator allocator;
+  std::string body1(3, 'a');
+  std::string body2(4, 'b');
+  struct iovec iov[] = {{const_cast<char*>(body1.data()), body1.length()},
+                        {const_cast<char*>(body2.data()), body2.length()}};
+
+  QuicheMemSliceStorage storage(iov, 2, &allocator, 1024);
+  auto span = storage.ToSpan();
+  EXPECT_EQ("aaabbbb", span[0].AsStringView());
+}
+
+TEST_F(QuicheMemSliceStorageImplTest, MultipleIovInMultipleSlice) {
+  quic::SimpleBufferAllocator allocator;
+  std::string body1(4, 'a');
+  std::string body2(4, 'b');
+  struct iovec iov[] = {{const_cast<char*>(body1.data()), body1.length()},
+                        {const_cast<char*>(body2.data()), body2.length()}};
+
+  QuicheMemSliceStorage storage(iov, 2, &allocator, 4);
+  auto span = storage.ToSpan();
+  EXPECT_EQ("aaaa", span[0].AsStringView());
+  EXPECT_EQ("bbbb", span[1].AsStringView());
+}
+
+}  // namespace
+}  // namespace test
+}  // namespace quiche
diff --git a/quic/core/frames/quic_frame.cc b/quic/core/frames/quic_frame.cc
index c31b45e..e83e422 100644
--- a/quic/core/frames/quic_frame.cc
+++ b/quic/core/frames/quic_frame.cc
@@ -11,6 +11,7 @@
 #include "quic/core/quic_types.h"
 #include "quic/platform/api/quic_bug_tracker.h"
 #include "quic/platform/api/quic_logging.h"
+#include "common/platform/api/quiche_mem_slice.h"
 
 namespace quic {
 
@@ -393,7 +394,7 @@
       for (const auto& slice : frame.message_frame->message_data) {
         QuicBuffer buffer = QuicBuffer::Copy(allocator, slice.AsStringView());
         copy.message_frame->message_data.push_back(
-            QuicMemSlice(std::move(buffer)));
+            quiche::QuicheMemSlice(std::move(buffer)));
       }
       break;
     case NEW_TOKEN_FRAME:
diff --git a/quic/core/frames/quic_message_frame.cc b/quic/core/frames/quic_message_frame.cc
index 1ac0de6..429a3bf 100644
--- a/quic/core/frames/quic_message_frame.cc
+++ b/quic/core/frames/quic_message_frame.cc
@@ -6,7 +6,7 @@
 
 #include "quic/core/quic_constants.h"
 #include "quic/platform/api/quic_logging.h"
-#include "quic/platform/api/quic_mem_slice.h"
+#include "common/platform/api/quiche_mem_slice.h"
 
 namespace quic {
 
@@ -14,9 +14,9 @@
     : message_id(message_id), data(nullptr), message_length(0) {}
 
 QuicMessageFrame::QuicMessageFrame(QuicMessageId message_id,
-                                   absl::Span<QuicMemSlice> span)
+                                   absl::Span<quiche::QuicheMemSlice> span)
     : message_id(message_id), data(nullptr), message_length(0) {
-  for (QuicMemSlice& slice : span) {
+  for (quiche::QuicheMemSlice& slice : span) {
     if (slice.empty()) {
       continue;
     }
@@ -24,7 +24,8 @@
     message_data.push_back(std::move(slice));
   }
 }
-QuicMessageFrame::QuicMessageFrame(QuicMessageId message_id, QuicMemSlice slice)
+QuicMessageFrame::QuicMessageFrame(QuicMessageId message_id,
+                                   quiche::QuicheMemSlice slice)
     : QuicMessageFrame(message_id, absl::MakeSpan(&slice, 1)) {}
 
 QuicMessageFrame::QuicMessageFrame(const char* data, QuicPacketLength length)
diff --git a/quic/core/frames/quic_message_frame.h b/quic/core/frames/quic_message_frame.h
index 1d090c9..008a7d9 100644
--- a/quic/core/frames/quic_message_frame.h
+++ b/quic/core/frames/quic_message_frame.h
@@ -10,17 +10,18 @@
 #include "quic/core/quic_types.h"
 #include "quic/platform/api/quic_containers.h"
 #include "quic/platform/api/quic_export.h"
-#include "quic/platform/api/quic_mem_slice.h"
+#include "common/platform/api/quiche_mem_slice.h"
 
 namespace quic {
 
-using QuicMessageData = absl::InlinedVector<QuicMemSlice, 1>;
+using QuicMessageData = absl::InlinedVector<quiche::QuicheMemSlice, 1>;
 
 struct QUIC_EXPORT_PRIVATE QuicMessageFrame {
   QuicMessageFrame() = default;
   explicit QuicMessageFrame(QuicMessageId message_id);
-  QuicMessageFrame(QuicMessageId message_id, absl::Span<QuicMemSlice> span);
-  QuicMessageFrame(QuicMessageId message_id, QuicMemSlice slice);
+  QuicMessageFrame(QuicMessageId message_id,
+                   absl::Span<quiche::QuicheMemSlice> span);
+  QuicMessageFrame(QuicMessageId message_id, quiche::QuicheMemSlice slice);
   QuicMessageFrame(const char* data, QuicPacketLength length);
 
   QuicMessageFrame(const QuicMessageFrame& other) = delete;
diff --git a/quic/core/http/quic_spdy_session.cc b/quic/core/http/quic_spdy_session.cc
index cfc4729..7b63328 100644
--- a/quic/core/http/quic_spdy_session.cc
+++ b/quic/core/http/quic_spdy_session.cc
@@ -30,6 +30,7 @@
 #include "quic/platform/api/quic_flags.h"
 #include "quic/platform/api/quic_logging.h"
 #include "quic/platform/api/quic_stack_trace.h"
+#include "common/platform/api/quiche_mem_slice.h"
 #include "spdy/core/http2_frame_decoder_adapter.h"
 
 using http2::Http2DecoderAdapter;
@@ -1690,7 +1691,7 @@
     return MESSAGE_STATUS_INTERNAL_ERROR;
   }
 
-  QuicMemSlice slice(std::move(buffer));
+  quiche::QuicheMemSlice slice(std::move(buffer));
   return datagram_queue()->SendOrQueueDatagram(std::move(slice));
 }
 
diff --git a/quic/core/http/quic_spdy_session_test.cc b/quic/core/http/quic_spdy_session_test.cc
index 67f2e44..b91292d 100644
--- a/quic/core/http/quic_spdy_session_test.cc
+++ b/quic/core/http/quic_spdy_session_test.cc
@@ -46,6 +46,7 @@
 #include "quic/test_tools/quic_stream_peer.h"
 #include "quic/test_tools/quic_stream_send_buffer_peer.h"
 #include "quic/test_tools/quic_test_utils.h"
+#include "common/platform/api/quiche_mem_slice.h"
 #include "common/quiche_endian.h"
 #include "common/test_tools/quiche_test_utils.h"
 #include "spdy/core/spdy_framer.h"
@@ -2040,7 +2041,7 @@
   SpdyFramer spdy_framer(SpdyFramer::ENABLE_COMPRESSION);
   SpdySerializedFrame frame = spdy_framer.SerializeFrame(priority_frame);
 
-  const QuicMemSlice& slice =
+  const quiche::QuicheMemSlice& slice =
       QuicStreamSendBufferPeer::CurrentWriteSlice(&send_buffer)->slice;
   EXPECT_EQ(absl::string_view(frame.data(), frame.size()),
             absl::string_view(slice.data(), slice.length()));
diff --git a/quic/core/http/quic_spdy_stream.cc b/quic/core/http/quic_spdy_stream.cc
index 5317137..2fcece7 100644
--- a/quic/core/http/quic_spdy_stream.cc
+++ b/quic/core/http/quic_spdy_stream.cc
@@ -32,7 +32,7 @@
 #include "quic/platform/api/quic_flag_utils.h"
 #include "quic/platform/api/quic_flags.h"
 #include "quic/platform/api/quic_logging.h"
-#include "quic/platform/api/quic_mem_slice_storage.h"
+#include "common/quiche_mem_slice_storage.h"
 #include "common/quiche_text_utils.h"
 #include "spdy/core/spdy_protocol.h"
 
@@ -390,7 +390,7 @@
 
 QuicConsumedData QuicSpdyStream::WritevBody(const struct iovec* iov, int count,
                                             bool fin) {
-  QuicMemSliceStorage storage(
+  quiche::QuicheMemSliceStorage storage(
       iov, count,
       session()->connection()->helper()->GetStreamSendBufferAllocator(),
       GetQuicFlag(FLAGS_quic_send_buffer_max_data_slice_size));
@@ -421,7 +421,7 @@
                   << header.size();
   if (can_write) {
     // Save one copy and allocation if send buffer can accomodate the header.
-    QuicMemSlice header_slice(std::move(header));
+    quiche::QuicheMemSlice header_slice(std::move(header));
     WriteMemSlices(absl::MakeSpan(&header_slice, 1), false);
   } else {
     QUICHE_DCHECK(force_write);
@@ -431,7 +431,7 @@
 }
 
 QuicConsumedData QuicSpdyStream::WriteBodySlices(
-    absl::Span<QuicMemSlice> slices, bool fin) {
+    absl::Span<quiche::QuicheMemSlice> slices, bool fin) {
   if (!VersionUsesHttp3(transport_version()) || slices.empty()) {
     return WriteMemSlices(slices, fin);
   }
diff --git a/quic/core/http/quic_spdy_stream.h b/quic/core/http/quic_spdy_stream.h
index 14ac2f2..1df1485 100644
--- a/quic/core/http/quic_spdy_stream.h
+++ b/quic/core/http/quic_spdy_stream.h
@@ -35,6 +35,7 @@
 #include "quic/platform/api/quic_export.h"
 #include "quic/platform/api/quic_flags.h"
 #include "quic/platform/api/quic_socket_address.h"
+#include "common/platform/api/quiche_mem_slice.h"
 #include "spdy/core/spdy_framer.h"
 #include "spdy/core/spdy_header_block.h"
 
@@ -154,7 +155,8 @@
 
   // Does the same thing as WriteOrBufferBody except this method takes
   // memslicespan as the data input. Right now it only calls WriteMemSlices.
-  QuicConsumedData WriteBodySlices(absl::Span<QuicMemSlice> slices, bool fin);
+  QuicConsumedData WriteBodySlices(absl::Span<quiche::QuicheMemSlice> slices,
+                                   bool fin);
 
   // Marks the trailers as consumed. This applies to the case where this object
   // receives headers and trailers as QuicHeaderLists via calls to
diff --git a/quic/core/http/quic_spdy_stream_test.cc b/quic/core/http/quic_spdy_stream_test.cc
index c8146e1..cb00c2a 100644
--- a/quic/core/http/quic_spdy_stream_test.cc
+++ b/quic/core/http/quic_spdy_stream_test.cc
@@ -37,6 +37,7 @@
 #include "quic/test_tools/quic_spdy_stream_peer.h"
 #include "quic/test_tools/quic_stream_peer.h"
 #include "quic/test_tools/quic_test_utils.h"
+#include "common/quiche_mem_slice_storage.h"
 
 using spdy::kV3HighestPriority;
 using spdy::kV3LowestPriority;
@@ -1980,10 +1981,10 @@
   std::string body2(100, 'x');
   struct iovec body1_iov = {const_cast<char*>(body1.data()), body1.length()};
   struct iovec body2_iov = {const_cast<char*>(body2.data()), body2.length()};
-  QuicMemSliceStorage storage(&body1_iov, 1,
-                              helper_.GetStreamSendBufferAllocator(), 1024);
-  QuicMemSliceStorage storage2(&body2_iov, 1,
-                               helper_.GetStreamSendBufferAllocator(), 1024);
+  quiche::QuicheMemSliceStorage storage(
+      &body1_iov, 1, helper_.GetStreamSendBufferAllocator(), 1024);
+  quiche::QuicheMemSliceStorage storage2(
+      &body2_iov, 1, helper_.GetStreamSendBufferAllocator(), 1024);
   EXPECT_CALL(*session_, WritevData(_, _, _, _, _, _)).Times(AtLeast(1));
   stream_->WriteBodySlices(storage.ToSpan(), false);
   stream_->WriteBodySlices(storage2.ToSpan(), true);
diff --git a/quic/core/http/web_transport_http3.cc b/quic/core/http/web_transport_http3.cc
index c2d02f0..f4e8040 100644
--- a/quic/core/http/web_transport_http3.cc
+++ b/quic/core/http/web_transport_http3.cc
@@ -280,7 +280,8 @@
   return stream->interface();
 }
 
-MessageStatus WebTransportHttp3::SendOrQueueDatagram(QuicMemSlice datagram) {
+MessageStatus WebTransportHttp3::SendOrQueueDatagram(
+    quiche::QuicheMemSlice datagram) {
   return connect_stream_->SendHttp3Datagram(
       context_id_, absl::string_view(datagram.data(), datagram.length()));
 }
diff --git a/quic/core/http/web_transport_http3.h b/quic/core/http/web_transport_http3.h
index 542b941..f6f94cd 100644
--- a/quic/core/http/web_transport_http3.h
+++ b/quic/core/http/web_transport_http3.h
@@ -16,6 +16,7 @@
 #include "quic/core/quic_stream.h"
 #include "quic/core/quic_types.h"
 #include "quic/core/web_transport_interface.h"
+#include "common/platform/api/quiche_mem_slice.h"
 #include "spdy/core/spdy_header_block.h"
 
 namespace quic {
@@ -84,7 +85,7 @@
   WebTransportStream* OpenOutgoingBidirectionalStream() override;
   WebTransportStream* OpenOutgoingUnidirectionalStream() override;
 
-  MessageStatus SendOrQueueDatagram(QuicMemSlice datagram) override;
+  MessageStatus SendOrQueueDatagram(quiche::QuicheMemSlice datagram) override;
   QuicByteCount GetMaxDatagramSize() const override;
   void SetDatagramMaxTimeInQueue(QuicTime::Delta max_time_in_queue) override;
 
diff --git a/quic/core/http/web_transport_stream_adapter.cc b/quic/core/http/web_transport_stream_adapter.cc
index bea1377..eb42fd8 100644
--- a/quic/core/http/web_transport_stream_adapter.cc
+++ b/quic/core/http/web_transport_stream_adapter.cc
@@ -6,6 +6,7 @@
 
 #include "quic/core/http/web_transport_http3.h"
 #include "quic/core/quic_error_codes.h"
+#include "common/platform/api/quiche_mem_slice.h"
 
 namespace quic {
 
@@ -45,7 +46,7 @@
     return false;
   }
 
-  QuicMemSlice memslice(QuicBuffer::Copy(
+  quiche::QuicheMemSlice memslice(QuicBuffer::Copy(
       session_->connection()->helper()->GetStreamSendBufferAllocator(), data));
   QuicConsumedData consumed =
       stream_->WriteMemSlices(absl::MakeSpan(&memslice, 1), /*fin=*/false);
@@ -76,7 +77,7 @@
     return false;
   }
 
-  QuicMemSlice empty;
+  quiche::QuicheMemSlice empty;
   QuicConsumedData consumed =
       stream_->WriteMemSlices(absl::MakeSpan(&empty, 1), /*fin=*/true);
   QUICHE_DCHECK_EQ(consumed.bytes_consumed, 0u);
diff --git a/quic/core/quic_buffer_allocator.h b/quic/core/quic_buffer_allocator.h
index d3905e7..de69ca2 100644
--- a/quic/core/quic_buffer_allocator.h
+++ b/quic/core/quic_buffer_allocator.h
@@ -57,9 +57,9 @@
                              QuicBufferDeleter(allocator));
 }
 
-// QuicUniqueBufferPtr with a length attached to it.  Similar to QuicMemSlice,
-// except unlike QuicMemSlice, QuicBuffer is mutable and is not
-// platform-specific.  Also unlike QuicMemSlice, QuicBuffer can be empty.
+// QuicUniqueBufferPtr with a length attached to it.  Similar to QuicheMemSlice,
+// except unlike QuicheMemSlice, QuicBuffer is mutable and is not
+// platform-specific.  Also unlike QuicheMemSlice, QuicBuffer can be empty.
 class QUIC_EXPORT_PRIVATE QuicBuffer {
  public:
   QuicBuffer() : buffer_(nullptr, QuicBufferDeleter(nullptr)), size_(0) {}
diff --git a/quic/core/quic_connection.cc b/quic/core/quic_connection.cc
index 9db7965..58daa88 100644
--- a/quic/core/quic_connection.cc
+++ b/quic/core/quic_connection.cc
@@ -5705,9 +5705,9 @@
   uber_received_packet_manager_.ResetAckStates(encryption_level_);
 }
 
-MessageStatus QuicConnection::SendMessage(QuicMessageId message_id,
-                                          absl::Span<QuicMemSlice> message,
-                                          bool flush) {
+MessageStatus QuicConnection::SendMessage(
+    QuicMessageId message_id, absl::Span<quiche::QuicheMemSlice> message,
+    bool flush) {
   if (!VersionSupportsMessageFrames(transport_version())) {
     QUIC_BUG(quic_bug_10511_38)
         << "MESSAGE frame is not supported for version " << transport_version();
diff --git a/quic/core/quic_connection.h b/quic/core/quic_connection.h
index 129d8bf..42b4358 100644
--- a/quic/core/quic_connection.h
+++ b/quic/core/quic_connection.h
@@ -58,6 +58,7 @@
 #include "quic/platform/api/quic_export.h"
 #include "quic/platform/api/quic_flags.h"
 #include "quic/platform/api/quic_socket_address.h"
+#include "common/platform/api/quiche_mem_slice.h"
 #include "common/quiche_circular_deque.h"
 
 namespace quic {
@@ -985,7 +986,7 @@
   // If |flush| is false, this will return a MESSAGE_STATUS_BLOCKED
   // when the connection is deemed unwritable.
   virtual MessageStatus SendMessage(QuicMessageId message_id,
-                                    absl::Span<QuicMemSlice> message,
+                                    absl::Span<quiche::QuicheMemSlice> message,
                                     bool flush);
 
   // Returns the largest payload that will fit into a single MESSAGE frame.
diff --git a/quic/core/quic_connection_test.cc b/quic/core/quic_connection_test.cc
index 5845769..f563fde 100644
--- a/quic/core/quic_connection_test.cc
+++ b/quic/core/quic_connection_test.cc
@@ -1069,7 +1069,7 @@
 
   MessageStatus SendMessage(absl::string_view message) {
     connection_.SetDefaultEncryptionLevel(ENCRYPTION_FORWARD_SECURE);
-    QuicMemSlice slice(QuicBuffer::Copy(
+    quiche::QuicheMemSlice slice(QuicBuffer::Copy(
         connection_.helper()->GetStreamSendBufferAllocator(), message));
     return connection_.SendMessage(1, absl::MakeSpan(&slice, 1), false);
   }
@@ -8705,7 +8705,7 @@
     connection_.SetFromConfig(config);
   }
   std::string message(connection_.GetCurrentLargestMessagePayload() * 2, 'a');
-  QuicMemSlice slice;
+  quiche::QuicheMemSlice slice;
   {
     QuicConnection::ScopedPacketFlusher flusher(&connection_);
     connection_.SendStreamData3();
diff --git a/quic/core/quic_datagram_queue.cc b/quic/core/quic_datagram_queue.cc
index ebd7483..0851878 100644
--- a/quic/core/quic_datagram_queue.cc
+++ b/quic/core/quic_datagram_queue.cc
@@ -25,7 +25,8 @@
       clock_(session->connection()->clock()),
       observer_(std::move(observer)) {}
 
-MessageStatus QuicDatagramQueue::SendOrQueueDatagram(QuicMemSlice datagram) {
+MessageStatus QuicDatagramQueue::SendOrQueueDatagram(
+    quiche::QuicheMemSlice datagram) {
   // If the queue is non-empty, always queue the daragram.  This ensures that
   // the datagrams are sent in the same order that they were sent by the
   // application.
diff --git a/quic/core/quic_datagram_queue.h b/quic/core/quic_datagram_queue.h
index 4d3aa2f..6374a64 100644
--- a/quic/core/quic_datagram_queue.h
+++ b/quic/core/quic_datagram_queue.h
@@ -10,7 +10,7 @@
 #include "absl/types/optional.h"
 #include "quic/core/quic_time.h"
 #include "quic/core/quic_types.h"
-#include "quic/platform/api/quic_mem_slice.h"
+#include "common/platform/api/quiche_mem_slice.h"
 #include "common/quiche_circular_deque.h"
 
 namespace quic {
@@ -44,7 +44,7 @@
 
   // Adds the datagram to the end of the queue.  May send it immediately; if
   // not, MESSAGE_STATUS_BLOCKED is returned.
-  MessageStatus SendOrQueueDatagram(QuicMemSlice datagram);
+  MessageStatus SendOrQueueDatagram(quiche::QuicheMemSlice datagram);
 
   // Attempts to send a single datagram from the queue.  Returns the result of
   // SendMessage(), or nullopt if there were no unexpired datagrams to send.
@@ -69,7 +69,7 @@
 
  private:
   struct QUIC_EXPORT_PRIVATE Datagram {
-    QuicMemSlice datagram;
+    quiche::QuicheMemSlice datagram;
     QuicTime expiry;
   };
 
diff --git a/quic/core/quic_datagram_queue_test.cc b/quic/core/quic_datagram_queue_test.cc
index 68a876b..8449e15 100644
--- a/quic/core/quic_datagram_queue_test.cc
+++ b/quic/core/quic_datagram_queue_test.cc
@@ -12,10 +12,10 @@
 #include "quic/core/quic_buffer_allocator.h"
 #include "quic/core/quic_time.h"
 #include "quic/core/quic_types.h"
-#include "quic/platform/api/quic_mem_slice.h"
 #include "quic/platform/api/quic_reference_counted.h"
 #include "quic/platform/api/quic_test.h"
 #include "quic/test_tools/quic_test_utils.h"
+#include "common/platform/api/quiche_mem_slice.h"
 
 namespace quic {
 namespace test {
@@ -70,11 +70,11 @@
 
   ~QuicDatagramQueueTestBase() = default;
 
-  QuicMemSlice CreateMemSlice(absl::string_view data) {
+  quiche::QuicheMemSlice CreateMemSlice(absl::string_view data) {
     QuicUniqueBufferPtr buffer =
         MakeUniqueBuffer(helper_.GetStreamSendBufferAllocator(), data.size());
     memcpy(buffer.get(), data.data(), data.size());
-    return QuicMemSlice(std::move(buffer), data.size());
+    return quiche::QuicheMemSlice(std::move(buffer), data.size());
   }
 
   MockQuicConnectionHelper helper_;
@@ -176,7 +176,7 @@
   std::vector<std::string> messages;
   EXPECT_CALL(*connection_, SendMessage(_, _, _))
       .WillRepeatedly([&messages](QuicMessageId /*id*/,
-                                  absl::Span<QuicMemSlice> message,
+                                  absl::Span<quiche::QuicheMemSlice> message,
                                   bool /*flush*/) {
         messages.push_back(std::string(message[0].AsStringView()));
         return MESSAGE_STATUS_SUCCESS;
diff --git a/quic/core/quic_packet_creator.cc b/quic/core/quic_packet_creator.cc
index 5042d66..d34d1e6 100644
--- a/quic/core/quic_packet_creator.cc
+++ b/quic/core/quic_packet_creator.cc
@@ -1605,7 +1605,7 @@
 }
 
 MessageStatus QuicPacketCreator::AddMessageFrame(
-    QuicMessageId message_id, absl::Span<QuicMemSlice> message) {
+    QuicMessageId message_id, absl::Span<quiche::QuicheMemSlice> message) {
   QUIC_BUG_IF(quic_bug_10752_33, !flusher_attached_)
       << ENDPOINT
       << "Packet flusher is not attached when "
diff --git a/quic/core/quic_packet_creator.h b/quic/core/quic_packet_creator.h
index 9cc4bca..b32be86 100644
--- a/quic/core/quic_packet_creator.h
+++ b/quic/core/quic_packet_creator.h
@@ -30,6 +30,7 @@
 #include "quic/core/quic_packets.h"
 #include "quic/core/quic_types.h"
 #include "quic/platform/api/quic_export.h"
+#include "common/platform/api/quiche_mem_slice.h"
 #include "common/quiche_circular_deque.h"
 
 namespace quic {
@@ -421,7 +422,7 @@
 
   // Tries to add a message frame containing |message| and returns the status.
   MessageStatus AddMessageFrame(QuicMessageId message_id,
-                                absl::Span<QuicMemSlice> message);
+                                absl::Span<quiche::QuicheMemSlice> message);
 
   // Returns the largest payload that will fit into a single MESSAGE frame.
   QuicPacketLength GetCurrentLargestMessagePayload() const;
diff --git a/quic/core/quic_packet_creator_test.cc b/quic/core/quic_packet_creator_test.cc
index 5538564..c7b7dcb 100644
--- a/quic/core/quic_packet_creator_test.cc
+++ b/quic/core/quic_packet_creator_test.cc
@@ -2448,7 +2448,7 @@
   }
 
   MessageStatus AddMessageFrame(QuicMessageId message_id,
-                                QuicMemSlice message) {
+                                quiche::QuicheMemSlice message) {
     if (!has_ack() && delegate_->ShouldGeneratePacket(NO_RETRANSMITTABLE_DATA,
                                                       NOT_HANDSHAKE)) {
       EXPECT_CALL(*delegate_, MaybeBundleAckOpportunistically()).Times(1);
diff --git a/quic/core/quic_sent_packet_manager_test.cc b/quic/core/quic_sent_packet_manager_test.cc
index 8b4ceac..cceceb7 100644
--- a/quic/core/quic_sent_packet_manager_test.cc
+++ b/quic/core/quic_sent_packet_manager_test.cc
@@ -18,6 +18,7 @@
 #include "quic/test_tools/quic_config_peer.h"
 #include "quic/test_tools/quic_sent_packet_manager_peer.h"
 #include "quic/test_tools/quic_test_utils.h"
+#include "common/platform/api/quiche_mem_slice.h"
 
 using testing::_;
 using testing::AnyNumber;
@@ -4440,7 +4441,7 @@
 
   QuicMessageFrame* message_frame = nullptr;
   {
-    QuicMemSlice slice(MakeUniqueBuffer(&allocator_, 1024), 1024);
+    quiche::QuicheMemSlice slice(MakeUniqueBuffer(&allocator_, 1024), 1024);
     message_frame = new QuicMessageFrame(/*message_id=*/1, std::move(slice));
     EXPECT_FALSE(message_frame->message_data.empty());
     EXPECT_EQ(message_frame->message_length, 1024);
diff --git a/quic/core/quic_session.cc b/quic/core/quic_session.cc
index fe2955b..89fa564 100644
--- a/quic/core/quic_session.cc
+++ b/quic/core/quic_session.cc
@@ -2464,16 +2464,17 @@
   connection_->SetTransmissionType(type);
 }
 
-MessageResult QuicSession::SendMessage(absl::Span<QuicMemSlice> message) {
+MessageResult QuicSession::SendMessage(
+    absl::Span<quiche::QuicheMemSlice> message) {
   return SendMessage(message, /*flush=*/false);
 }
 
-MessageResult QuicSession::SendMessage(QuicMemSlice message) {
+MessageResult QuicSession::SendMessage(quiche::QuicheMemSlice message) {
   return SendMessage(absl::MakeSpan(&message, 1), /*flush=*/false);
 }
 
-MessageResult QuicSession::SendMessage(absl::Span<QuicMemSlice> message,
-                                       bool flush) {
+MessageResult QuicSession::SendMessage(
+    absl::Span<quiche::QuicheMemSlice> message, bool flush) {
   QUICHE_DCHECK(connection_->connected())
       << ENDPOINT << "Try to write messages when connection is closed.";
   if (!IsEncryptionEstablished()) {
diff --git a/quic/core/quic_session.h b/quic/core/quic_session.h
index 88ae992..2734c6e 100644
--- a/quic/core/quic_session.h
+++ b/quic/core/quic_session.h
@@ -42,8 +42,8 @@
 #include "quic/core/uber_quic_stream_id_manager.h"
 #include "quic/platform/api/quic_export.h"
 #include "quic/platform/api/quic_flags.h"
-#include "quic/platform/api/quic_mem_slice.h"
 #include "quic/platform/api/quic_socket_address.h"
+#include "common/platform/api/quiche_mem_slice.h"
 #include "common/quiche_linked_hash_map.h"
 
 namespace quic {
@@ -234,15 +234,16 @@
   // SendMessage flushes the current packet even it is not full; if the
   // application needs to bundle other data in the same packet, consider using
   // QuicConnection::ScopedPacketFlusher around the relevant write operations.
-  MessageResult SendMessage(absl::Span<QuicMemSlice> message);
+  MessageResult SendMessage(absl::Span<quiche::QuicheMemSlice> message);
 
   // Same as above SendMessage, except caller can specify if the given |message|
   // should be flushed even if the underlying connection is deemed unwritable.
-  MessageResult SendMessage(absl::Span<QuicMemSlice> message, bool flush);
+  MessageResult SendMessage(absl::Span<quiche::QuicheMemSlice> message,
+                            bool flush);
 
   // Single-slice version of SendMessage().  Unlike the version above, this
   // version always takes ownership of the slice.
-  MessageResult SendMessage(QuicMemSlice message);
+  MessageResult SendMessage(quiche::QuicheMemSlice message);
 
   // Called when message with |message_id| gets acked.
   virtual void OnMessageAcked(QuicMessageId message_id,
diff --git a/quic/core/quic_session_test.cc b/quic/core/quic_session_test.cc
index b62f2a9..68ae9f9 100644
--- a/quic/core/quic_session_test.cc
+++ b/quic/core/quic_session_test.cc
@@ -28,7 +28,6 @@
 #include "quic/core/quic_versions.h"
 #include "quic/platform/api/quic_expect_bug.h"
 #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/test_tools/mock_quic_session_visitor.h"
 #include "quic/test_tools/quic_config_peer.h"
@@ -39,6 +38,7 @@
 #include "quic/test_tools/quic_stream_peer.h"
 #include "quic/test_tools/quic_stream_send_buffer_peer.h"
 #include "quic/test_tools/quic_test_utils.h"
+#include "common/quiche_mem_slice_storage.h"
 
 using spdy::kV3HighestPriority;
 using spdy::SpdyPriority;
@@ -2700,7 +2700,7 @@
       .Times(1);
   std::string body(100, '.');
   struct iovec iov = {const_cast<char*>(body.data()), body.length()};
-  QuicMemSliceStorage storage(
+  quiche::QuicheMemSliceStorage storage(
       &iov, 1, session_.connection()->helper()->GetStreamSendBufferAllocator(),
       1024);
   stream4->WriteMemSlices(storage.ToSpan(), false);
@@ -2716,7 +2716,7 @@
                   QUIC_TRY_TO_WRITE_DATA_ON_READ_UNIDIRECTIONAL_STREAM, _, _))
       .Times(1);
   std::string data(1024, 'a');
-  std::vector<QuicMemSlice> buffers;
+  std::vector<quiche::QuicheMemSlice> buffers;
   buffers.push_back(MemSliceFromString(data));
   buffers.push_back(MemSliceFromString(data));
   stream4->WriteMemSlices(absl::MakeSpan(buffers), false);
diff --git a/quic/core/quic_stream.cc b/quic/core/quic_stream.cc
index 6237dae..f8e00b4 100644
--- a/quic/core/quic_stream.cc
+++ b/quic/core/quic_stream.cc
@@ -20,8 +20,8 @@
 #include "quic/platform/api/quic_flag_utils.h"
 #include "quic/platform/api/quic_flags.h"
 #include "quic/platform/api/quic_logging.h"
-#include "quic/platform/api/quic_mem_slice.h"
 #include "common/platform/api/quiche_logging.h"
+#include "common/platform/api/quiche_mem_slice.h"
 
 using spdy::SpdyPriority;
 
@@ -759,12 +759,13 @@
   }
 }
 
-QuicConsumedData QuicStream::WriteMemSlice(QuicMemSlice span, bool fin) {
+QuicConsumedData QuicStream::WriteMemSlice(quiche::QuicheMemSlice span,
+                                           bool fin) {
   return WriteMemSlices(absl::MakeSpan(&span, 1), fin);
 }
 
-QuicConsumedData QuicStream::WriteMemSlices(absl::Span<QuicMemSlice> span,
-                                            bool fin) {
+QuicConsumedData QuicStream::WriteMemSlices(
+    absl::Span<quiche::QuicheMemSlice> span, bool fin) {
   QuicConsumedData consumed_data(0, false);
   if (span.empty() && !fin) {
     QUIC_BUG(quic_bug_10586_6) << "span.empty() && !fin";
diff --git a/quic/core/quic_stream.h b/quic/core/quic_stream.h
index dc129a2..4a6acca 100644
--- a/quic/core/quic_stream.h
+++ b/quic/core/quic_stream.h
@@ -35,8 +35,8 @@
 #include "quic/core/session_notifier_interface.h"
 #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_reference_counted.h"
+#include "common/platform/api/quiche_mem_slice.h"
 #include "spdy/core/spdy_protocol.h"
 
 namespace quic {
@@ -365,8 +365,9 @@
   // 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.
-  QuicConsumedData WriteMemSlices(absl::Span<QuicMemSlice> span, bool fin);
-  QuicConsumedData WriteMemSlice(QuicMemSlice span, bool fin);
+  QuicConsumedData WriteMemSlices(absl::Span<quiche::QuicheMemSlice> span,
+                                  bool fin);
+  QuicConsumedData WriteMemSlice(quiche::QuicheMemSlice span, bool fin);
 
   // Returns true if any stream data is lost (including fin) and needs to be
   // retransmitted.
diff --git a/quic/core/quic_stream_send_buffer.cc b/quic/core/quic_stream_send_buffer.cc
index b2ac6bf..2c68dc1 100644
--- a/quic/core/quic_stream_send_buffer.cc
+++ b/quic/core/quic_stream_send_buffer.cc
@@ -2,17 +2,18 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+#include "quic/core/quic_stream_send_buffer.h"
+
 #include <algorithm>
 
 #include "quic/core/quic_data_writer.h"
 #include "quic/core/quic_interval.h"
-#include "quic/core/quic_stream_send_buffer.h"
 #include "quic/core/quic_utils.h"
 #include "quic/platform/api/quic_bug_tracker.h"
 #include "quic/platform/api/quic_flag_utils.h"
 #include "quic/platform/api/quic_flags.h"
 #include "quic/platform/api/quic_logging.h"
-#include "quic/platform/api/quic_mem_slice.h"
+#include "common/platform/api/quiche_mem_slice.h"
 
 namespace quic {
 
@@ -26,7 +27,8 @@
 
 }  // namespace
 
-BufferedSlice::BufferedSlice(QuicMemSlice mem_slice, QuicStreamOffset offset)
+BufferedSlice::BufferedSlice(quiche::QuicheMemSlice mem_slice,
+                             QuicStreamOffset offset)
     : slice(std::move(mem_slice)), offset(offset) {}
 
 BufferedSlice::BufferedSlice(BufferedSlice&& other) = default;
@@ -68,13 +70,13 @@
     QuicUniqueBufferPtr buffer = MakeUniqueBuffer(allocator_, slice_len);
     QuicUtils::CopyToBuffer(iov, iov_count, iov_offset, slice_len,
                             buffer.get());
-    SaveMemSlice(QuicMemSlice(std::move(buffer), slice_len));
+    SaveMemSlice(quiche::QuicheMemSlice(std::move(buffer), slice_len));
     data_length -= slice_len;
     iov_offset += slice_len;
   }
 }
 
-void QuicStreamSendBuffer::SaveMemSlice(QuicMemSlice slice) {
+void QuicStreamSendBuffer::SaveMemSlice(quiche::QuicheMemSlice slice) {
   QUIC_DVLOG(2) << "Save slice offset " << stream_offset_ << " length "
                 << slice.length();
   if (slice.empty()) {
@@ -93,9 +95,9 @@
 }
 
 QuicByteCount QuicStreamSendBuffer::SaveMemSliceSpan(
-    absl::Span<QuicMemSlice> span) {
+    absl::Span<quiche::QuicheMemSlice> span) {
   QuicByteCount total = 0;
-  for (QuicMemSlice& slice : span) {
+  for (quiche::QuicheMemSlice& slice : span) {
     if (slice.length() == 0) {
       // Skip empty slices.
       continue;
diff --git a/quic/core/quic_stream_send_buffer.h b/quic/core/quic_stream_send_buffer.h
index bf50217..2069e8b 100644
--- a/quic/core/quic_stream_send_buffer.h
+++ b/quic/core/quic_stream_send_buffer.h
@@ -11,7 +11,7 @@
 #include "quic/core/quic_interval_set.h"
 #include "quic/core/quic_types.h"
 #include "quic/platform/api/quic_iovec.h"
-#include "quic/platform/api/quic_mem_slice.h"
+#include "common/platform/api/quiche_mem_slice.h"
 #include "common/quiche_circular_deque.h"
 
 namespace quic {
@@ -28,7 +28,7 @@
 // stream data is saved in send buffer and is removed when stream data is fully
 // acked. It is move-only.
 struct QUIC_EXPORT_PRIVATE BufferedSlice {
-  BufferedSlice(QuicMemSlice mem_slice, QuicStreamOffset offset);
+  BufferedSlice(quiche::QuicheMemSlice mem_slice, QuicStreamOffset offset);
   BufferedSlice(BufferedSlice&& other);
   BufferedSlice& operator=(BufferedSlice&& other);
 
@@ -40,7 +40,7 @@
   QuicInterval<std::size_t> interval() const;
 
   // Stream data of this data slice.
-  QuicMemSlice slice;
+  quiche::QuicheMemSlice slice;
   // Location of this data slice in the stream.
   QuicStreamOffset offset;
 };
@@ -76,10 +76,10 @@
                       QuicByteCount data_length);
 
   // Save |slice| to send buffer.
-  void SaveMemSlice(QuicMemSlice slice);
+  void SaveMemSlice(quiche::QuicheMemSlice slice);
 
   // Save all slices in |span| to send buffer. Return total bytes saved.
-  QuicByteCount SaveMemSliceSpan(absl::Span<QuicMemSlice> span);
+  QuicByteCount SaveMemSliceSpan(absl::Span<quiche::QuicheMemSlice> span);
 
   // Called when |bytes_consumed| bytes has been consumed by the stream.
   void OnStreamDataConsumed(size_t bytes_consumed);
diff --git a/quic/core/quic_stream_send_buffer_test.cc b/quic/core/quic_stream_send_buffer_test.cc
index 9aaec4d..15e0d3f 100644
--- a/quic/core/quic_stream_send_buffer_test.cc
+++ b/quic/core/quic_stream_send_buffer_test.cc
@@ -40,10 +40,10 @@
 
     QuicBuffer buffer1(&allocator_, 1024);
     memset(buffer1.data(), 'c', buffer1.size());
-    QuicMemSlice slice1(std::move(buffer1));
+    quiche::QuicheMemSlice slice1(std::move(buffer1));
     QuicBuffer buffer2(&allocator_, 768);
     memset(buffer2.data(), 'd', buffer2.size());
-    QuicMemSlice slice2(std::move(buffer2));
+    quiche::QuicheMemSlice slice2(std::move(buffer2));
 
     // The stream offset should be 0 since nothing is written.
     EXPECT_EQ(0u, QuicStreamSendBufferPeer::EndOffset(&send_buffer_));
@@ -310,7 +310,7 @@
   EXPECT_EQ(3840u, QuicStreamSendBufferPeer::EndOffset(&send_buffer_));
   QuicBuffer buffer(&allocator_, 60);
   memset(buffer.data(), 'e', buffer.size());
-  QuicMemSlice slice(std::move(buffer));
+  quiche::QuicheMemSlice slice(std::move(buffer));
   send_buffer_.SaveMemSlice(std::move(slice));
 
   EXPECT_EQ(3840u, QuicStreamSendBufferPeer::EndOffset(&send_buffer_));
@@ -321,7 +321,7 @@
   QuicStreamSendBuffer send_buffer(&allocator);
 
   std::string data(1024, 'a');
-  std::vector<QuicMemSlice> buffers;
+  std::vector<quiche::QuicheMemSlice> buffers;
   for (size_t i = 0; i < 10; ++i) {
     buffers.push_back(MemSliceFromString(data));
   }
@@ -335,7 +335,7 @@
   QuicStreamSendBuffer send_buffer(&allocator);
 
   std::string data(1024, 'a');
-  std::vector<QuicMemSlice> buffers;
+  std::vector<quiche::QuicheMemSlice> buffers;
   for (size_t i = 0; i < 10; ++i) {
     buffers.push_back(MemSliceFromString(data));
   }
diff --git a/quic/core/quic_stream_test.cc b/quic/core/quic_stream_test.cc
index 9d48b1f..7c97ce9 100644
--- a/quic/core/quic_stream_test.cc
+++ b/quic/core/quic_stream_test.cc
@@ -24,7 +24,6 @@
 #include "quic/platform/api/quic_expect_bug.h"
 #include "quic/platform/api/quic_flags.h"
 #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/test_tools/quic_config_peer.h"
 #include "quic/test_tools/quic_connection_peer.h"
@@ -33,6 +32,7 @@
 #include "quic/test_tools/quic_stream_peer.h"
 #include "quic/test_tools/quic_stream_sequencer_peer.h"
 #include "quic/test_tools/quic_test_utils.h"
+#include "common/quiche_mem_slice_storage.h"
 
 using testing::_;
 using testing::AnyNumber;
@@ -1171,7 +1171,7 @@
   EXPECT_CALL(*session_, WritevData(_, _, _, _, _, _))
       .WillOnce(Return(QuicConsumedData(0, false)));
   struct iovec iov = {const_cast<char*>(data.data()), data.length()};
-  QuicMemSliceStorage storage(
+  quiche::QuicheMemSliceStorage storage(
       &iov, 1, session_->connection()->helper()->GetStreamSendBufferAllocator(),
       1024);
   QuicConsumedData consumed = stream_->WriteMemSlices(storage.ToSpan(), false);
@@ -1184,7 +1184,7 @@
   EXPECT_FALSE(stream_->CanWriteNewData());
 
   EXPECT_CALL(*session_, WritevData(_, _, _, _, _, _)).Times(0);
-  QuicMemSliceStorage storage2(
+  quiche::QuicheMemSliceStorage storage2(
       &iov, 1, session_->connection()->helper()->GetStreamSendBufferAllocator(),
       1024);
   consumed = stream_->WriteMemSlices(storage2.ToSpan(), false);
@@ -1210,7 +1210,7 @@
 
   EXPECT_CALL(*session_, WritevData(_, _, _, _, _, _)).Times(0);
   // All data can be consumed as buffered data is below upper limit.
-  QuicMemSliceStorage storage3(
+  quiche::QuicheMemSliceStorage storage3(
       &iov, 1, session_->connection()->helper()->GetStreamSendBufferAllocator(),
       1024);
   consumed = stream_->WriteMemSlices(storage3.ToSpan(), false);
@@ -1229,13 +1229,13 @@
   EXPECT_CALL(*session_, WritevData(_, _, _, _, _, _))
       .WillOnce(Invoke(session_.get(), &MockQuicSession::ConsumeData));
   struct iovec iov = {const_cast<char*>(data.data()), 5u};
-  QuicMemSliceStorage storage(
+  quiche::QuicheMemSliceStorage storage(
       &iov, 1, session_->connection()->helper()->GetStreamSendBufferAllocator(),
       1024);
   QuicConsumedData consumed = stream_->WriteMemSlices(storage.ToSpan(), false);
   EXPECT_EQ(data.length(), consumed.bytes_consumed);
   struct iovec iov2 = {const_cast<char*>(data.data()), 1u};
-  QuicMemSliceStorage storage2(
+  quiche::QuicheMemSliceStorage storage2(
       &iov2, 1,
       session_->connection()->helper()->GetStreamSendBufferAllocator(), 1024);
   EXPECT_CALL(*connection_, CloseConnection(QUIC_STREAM_LENGTH_OVERFLOW, _, _));
@@ -1251,14 +1251,14 @@
   constexpr QuicByteCount kDataSize = 1024;
   QuicBufferAllocator* allocator =
       connection_->helper()->GetStreamSendBufferAllocator();
-  std::vector<QuicMemSlice> vector1;
-  vector1.push_back(QuicMemSlice(QuicBuffer(allocator, kDataSize)));
-  vector1.push_back(QuicMemSlice(QuicBuffer(allocator, kDataSize)));
-  std::vector<QuicMemSlice> vector2;
-  vector2.push_back(QuicMemSlice(QuicBuffer(allocator, kDataSize)));
-  vector2.push_back(QuicMemSlice(QuicBuffer(allocator, kDataSize)));
-  absl::Span<QuicMemSlice> span1(vector1);
-  absl::Span<QuicMemSlice> span2(vector2);
+  std::vector<quiche::QuicheMemSlice> vector1;
+  vector1.push_back(quiche::QuicheMemSlice(QuicBuffer(allocator, kDataSize)));
+  vector1.push_back(quiche::QuicheMemSlice(QuicBuffer(allocator, kDataSize)));
+  std::vector<quiche::QuicheMemSlice> vector2;
+  vector2.push_back(quiche::QuicheMemSlice(QuicBuffer(allocator, kDataSize)));
+  vector2.push_back(quiche::QuicheMemSlice(QuicBuffer(allocator, kDataSize)));
+  absl::Span<quiche::QuicheMemSlice> span1(vector1);
+  absl::Span<quiche::QuicheMemSlice> span2(vector2);
 
   EXPECT_CALL(*session_, WritevData(_, _, _, _, _, _))
       .WillOnce(InvokeWithoutArgs([this]() {
@@ -1314,7 +1314,7 @@
   Initialize();
   QuicStreamPeer::SetStreamBytesWritten(kMaxStreamLength - 5u, stream_);
   std::vector<std::pair<char*, size_t>> buffers;
-  QuicMemSlice slice1 = MemSliceFromString("12345");
+  quiche::QuicheMemSlice slice1 = MemSliceFromString("12345");
   EXPECT_CALL(*session_, WritevData(_, _, _, _, _, _))
       .WillOnce(InvokeWithoutArgs([this]() {
         return session_->ConsumeData(stream_->id(), 5u, 0u, NO_FIN,
@@ -1324,7 +1324,7 @@
   QuicConsumedData consumed = stream_->WriteMemSlice(std::move(slice1), false);
   EXPECT_EQ(5u, consumed.bytes_consumed);
 
-  QuicMemSlice slice2 = MemSliceFromString("6");
+  quiche::QuicheMemSlice slice2 = MemSliceFromString("6");
   EXPECT_CALL(*connection_, CloseConnection(QUIC_STREAM_LENGTH_OVERFLOW, _, _));
   EXPECT_QUIC_BUG(stream_->WriteMemSlice(std::move(slice2), false),
                   "Write too many data via stream");
diff --git a/quic/core/quic_utils.cc b/quic/core/quic_utils.cc
index 021fe24..caffd7f 100644
--- a/quic/core/quic_utils.cc
+++ b/quic/core/quic_utils.cc
@@ -22,8 +22,8 @@
 #include "quic/platform/api/quic_bug_tracker.h"
 #include "quic/platform/api/quic_flag_utils.h"
 #include "quic/platform/api/quic_flags.h"
-#include "quic/platform/api/quic_mem_slice.h"
 #include "common/platform/api/quiche_logging.h"
+#include "common/platform/api/quiche_mem_slice.h"
 #include "common/platform/api/quiche_prefetch.h"
 #include "common/quiche_endian.h"
 
@@ -729,9 +729,9 @@
          QuicUtils::IsClientInitiatedStreamId(version.transport_version, id);
 }
 
-QuicByteCount MemSliceSpanTotalSize(absl::Span<QuicMemSlice> span) {
+QuicByteCount MemSliceSpanTotalSize(absl::Span<quiche::QuicheMemSlice> span) {
   QuicByteCount total = 0;
-  for (const QuicMemSlice& slice : span) {
+  for (const quiche::QuicheMemSlice& slice : span) {
     total += slice.length();
   }
   return total;
diff --git a/quic/core/quic_utils.h b/quic/core/quic_utils.h
index 9b5c6ff..43e6470 100644
--- a/quic/core/quic_utils.h
+++ b/quic/core/quic_utils.h
@@ -22,8 +22,8 @@
 #include "quic/core/quic_versions.h"
 #include "quic/platform/api/quic_export.h"
 #include "quic/platform/api/quic_iovec.h"
-#include "quic/platform/api/quic_mem_slice.h"
 #include "quic/platform/api/quic_socket_address.h"
+#include "common/platform/api/quiche_mem_slice.h"
 
 namespace quic {
 
@@ -254,7 +254,7 @@
 bool IsValidWebTransportSessionId(WebTransportSessionId id,
                                   ParsedQuicVersion transport_version);
 
-QuicByteCount MemSliceSpanTotalSize(absl::Span<QuicMemSlice> span);
+QuicByteCount MemSliceSpanTotalSize(absl::Span<quiche::QuicheMemSlice> span);
 
 // Computes a SHA-256 hash and returns the raw bytes of the hash.
 QUIC_EXPORT_PRIVATE std::string RawSha256(absl::string_view input);
diff --git a/quic/core/web_transport_interface.h b/quic/core/web_transport_interface.h
index 102fd1f..6f2941e 100644
--- a/quic/core/web_transport_interface.h
+++ b/quic/core/web_transport_interface.h
@@ -16,6 +16,7 @@
 #include "quic/core/quic_datagram_queue.h"
 #include "quic/core/quic_types.h"
 #include "quic/platform/api/quic_export.h"
+#include "common/platform/api/quiche_mem_slice.h"
 #include "spdy/core/spdy_header_block.h"
 
 namespace quic {
@@ -137,7 +138,8 @@
   virtual WebTransportStream* OpenOutgoingBidirectionalStream() = 0;
   virtual WebTransportStream* OpenOutgoingUnidirectionalStream() = 0;
 
-  virtual MessageStatus SendOrQueueDatagram(QuicMemSlice datagram) = 0;
+  virtual MessageStatus SendOrQueueDatagram(
+      quiche::QuicheMemSlice datagram) = 0;
   // Returns a conservative estimate of the largest datagram size that the
   // session would be able to send.
   virtual QuicByteCount GetMaxDatagramSize() const = 0;
diff --git a/quic/masque/masque_compression_engine.cc b/quic/masque/masque_compression_engine.cc
index 035b9f9..ca9ed93 100644
--- a/quic/masque/masque_compression_engine.cc
+++ b/quic/masque/masque_compression_engine.cc
@@ -15,6 +15,7 @@
 #include "quic/core/quic_types.h"
 #include "quic/core/quic_versions.h"
 #include "quic/platform/api/quic_containers.h"
+#include "common/platform/api/quiche_mem_slice.h"
 #include "common/quiche_text_utils.h"
 
 namespace quic {
@@ -281,7 +282,7 @@
   }
 
   MessageResult message_result =
-      masque_session_->SendMessage(QuicMemSlice(std::move(buffer)));
+      masque_session_->SendMessage(quiche::QuicheMemSlice(std::move(buffer)));
 
   QUIC_DVLOG(1) << "Sent packet compressed with flow ID " << flow_id
                 << " and got message result " << message_result;
diff --git a/quic/platform/api/quic_mem_slice.h b/quic/platform/api/quic_mem_slice.h
deleted file mode 100644
index adc03d4..0000000
--- a/quic/platform/api/quic_mem_slice.h
+++ /dev/null
@@ -1,92 +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_H_
-#define QUICHE_QUIC_PLATFORM_API_QUIC_MEM_SLICE_H_
-
-#include <memory>
-
-#include "absl/strings/string_view.h"
-#include "quic/platform/api/quic_export.h"
-#include "net/quic/platform/impl/quic_mem_slice_impl.h"
-
-/* API_DESCRIPTION
- QuicMemSlice is used to wrap application data and pass to QUIC stream's write
- interface. It refers to a memory block of data which should be around till
- QuicMemSlice::Reset() is called. It's upto each platform, to implement it as
- reference counted or not.
- API-DESCRIPTION */
-
-namespace quic {
-
-// QuicMemSlice is an internally reference counted data buffer used as the
-// source buffers for write operations. QuicMemSlice implicitly maintains a
-// reference count and will free the underlying data buffer when the reference
-// count reaches zero.
-class QUIC_EXPORT_PRIVATE QuicMemSlice {
- public:
-  // Constructs a empty QuicMemSlice with no underlying data and 0 reference
-  // count.
-  QuicMemSlice() = default;
-
-  // Constructs a QuicMemSlice that takes ownership of |buffer|.  |length| must
-  // not be zero.  To construct an empty QuicMemSlice, use the zero-argument
-  // constructor instead.
-  // TODO(vasilvv): switch all users to QuicBuffer version, and make this
-  // private.
-  QuicMemSlice(QuicUniqueBufferPtr buffer, size_t length)
-      : impl_(std::move(buffer), length) {}
-
-  // Constructs a QuicMemSlice that takes ownership of |buffer|.  The length of
-  // the |buffer| must not be zero.  To construct an empty QuicMemSlice, use the
-  // zero-argument constructor instead.
-  explicit QuicMemSlice(QuicBuffer buffer) : QuicMemSlice() {
-    // Store the size of the buffer *before* calling buffer.Release().
-    const size_t size = buffer.size();
-    *this = QuicMemSlice(buffer.Release(), size);
-  }
-
-  // Constructs a QuicMemSlice that takes ownership of |buffer| allocated on
-  // heap.  |length| must not be zero.
-  QuicMemSlice(std::unique_ptr<char[]> buffer, size_t length)
-      : impl_(std::move(buffer), length) {}
-
-  // Constructs QuicMemSlice from |impl|. It takes the reference away from
-  // |impl|.
-  explicit QuicMemSlice(QuicMemSliceImpl impl) : impl_(std::move(impl)) {}
-
-  QuicMemSlice(const QuicMemSlice& other) = delete;
-  QuicMemSlice& operator=(const QuicMemSlice& other) = delete;
-
-  // Move constructors. |other| will not hold a reference to the data buffer
-  // after this call completes.
-  QuicMemSlice(QuicMemSlice&& other) = default;
-  QuicMemSlice& operator=(QuicMemSlice&& other) = default;
-
-  ~QuicMemSlice() = default;
-
-  // Release the underlying reference. Further access the memory will result in
-  // undefined behavior.
-  void Reset() { impl_.Reset(); }
-
-  // Returns a const char pointer to underlying data buffer.
-  const char* data() const { return impl_.data(); }
-  // Returns the length of underlying data buffer.
-  size_t length() const { return impl_.length(); }
-  // Returns the representation of the underlying data as a string view.
-  absl::string_view AsStringView() const {
-    return absl::string_view(data(), length());
-  }
-
-  bool empty() const { return impl_.empty(); }
-
-  QuicMemSliceImpl* impl() { return &impl_; }
-
- private:
-  QuicMemSliceImpl impl_;
-};
-
-}  // namespace quic
-
-#endif  // QUICHE_QUIC_PLATFORM_API_QUIC_MEM_SLICE_H_
diff --git a/quic/platform/api/quic_mem_slice_storage.cc b/quic/platform/api/quic_mem_slice_storage.cc
deleted file mode 100644
index 87bce7f..0000000
--- a/quic/platform/api/quic_mem_slice_storage.cc
+++ /dev/null
@@ -1,35 +0,0 @@
-// 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
deleted file mode 100644
index 4cccee3..0000000
--- a/quic/platform/api/quic_mem_slice_storage.h
+++ /dev/null
@@ -1,43 +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_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 "quic/platform/api/quic_iovec.h"
-#include "quic/platform/api/quic_mem_slice.h"
-
-namespace quic {
-
-// QuicMemSliceStorage is a container class that store QuicMemSlices for further
-// use cases such as turning into QuicMemSliceSpan.
-class QUIC_EXPORT_PRIVATE QuicMemSliceStorage {
- public:
-  QuicMemSliceStorage(const struct iovec* iov, int iov_count,
-                      QuicBufferAllocator* allocator,
-                      const QuicByteCount max_slice_len);
-
-  QuicMemSliceStorage(const QuicMemSliceStorage& other) = default;
-  QuicMemSliceStorage& operator=(const QuicMemSliceStorage& other) = default;
-  QuicMemSliceStorage(QuicMemSliceStorage&& other) = default;
-  QuicMemSliceStorage& operator=(QuicMemSliceStorage&& other) = default;
-
-  ~QuicMemSliceStorage() = default;
-
-  // Return a QuicMemSliceSpan form of the storage.
-  absl::Span<QuicMemSlice> ToSpan() { return absl::MakeSpan(storage_); }
-
- private:
-  std::vector<QuicMemSlice> storage_;
-};
-
-}  // namespace quic
-
-#endif  // QUICHE_QUIC_PLATFORM_API_QUIC_MEM_SLICE_STORAGE_H_
diff --git a/quic/platform/api/quic_mem_slice_storage_test.cc b/quic/platform/api/quic_mem_slice_storage_test.cc
deleted file mode 100644
index 4bef774..0000000
--- a/quic/platform/api/quic_mem_slice_storage_test.cc
+++ /dev/null
@@ -1,61 +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_storage.h"
-
-#include "quic/core/quic_simple_buffer_allocator.h"
-#include "quic/platform/api/quic_test.h"
-
-namespace quic {
-namespace test {
-namespace {
-
-class QuicMemSliceStorageImplTest : public QuicTest {
- public:
-  QuicMemSliceStorageImplTest() = default;
-};
-
-TEST_F(QuicMemSliceStorageImplTest, EmptyIov) {
-  QuicMemSliceStorage storage(nullptr, 0, nullptr, 1024);
-  EXPECT_TRUE(storage.ToSpan().empty());
-}
-
-TEST_F(QuicMemSliceStorageImplTest, SingleIov) {
-  SimpleBufferAllocator allocator;
-  std::string body(3, 'c');
-  struct iovec iov = {const_cast<char*>(body.data()), body.length()};
-  QuicMemSliceStorage storage(&iov, 1, &allocator, 1024);
-  auto span = storage.ToSpan();
-  EXPECT_EQ("ccc", span[0].AsStringView());
-  EXPECT_NE(static_cast<const void*>(span[0].data()), body.data());
-}
-
-TEST_F(QuicMemSliceStorageImplTest, MultipleIovInSingleSlice) {
-  SimpleBufferAllocator allocator;
-  std::string body1(3, 'a');
-  std::string body2(4, 'b');
-  struct iovec iov[] = {{const_cast<char*>(body1.data()), body1.length()},
-                        {const_cast<char*>(body2.data()), body2.length()}};
-
-  QuicMemSliceStorage storage(iov, 2, &allocator, 1024);
-  auto span = storage.ToSpan();
-  EXPECT_EQ("aaabbbb", span[0].AsStringView());
-}
-
-TEST_F(QuicMemSliceStorageImplTest, MultipleIovInMultipleSlice) {
-  SimpleBufferAllocator allocator;
-  std::string body1(4, 'a');
-  std::string body2(4, 'b');
-  struct iovec iov[] = {{const_cast<char*>(body1.data()), body1.length()},
-                        {const_cast<char*>(body2.data()), body2.length()}};
-
-  QuicMemSliceStorage storage(iov, 2, &allocator, 4);
-  auto span = storage.ToSpan();
-  EXPECT_EQ("aaaa", span[0].AsStringView());
-  EXPECT_EQ("bbbb", span[1].AsStringView());
-}
-
-}  // namespace
-}  // namespace test
-}  // namespace quic
diff --git a/quic/qbone/qbone_session_base.cc b/quic/qbone/qbone_session_base.cc
index 702f185..a5e8a2d 100644
--- a/quic/qbone/qbone_session_base.cc
+++ b/quic/qbone/qbone_session_base.cc
@@ -19,6 +19,7 @@
 #include "quic/qbone/platform/icmp_packet.h"
 #include "quic/qbone/qbone_constants.h"
 #include "common/platform/api/quiche_command_line_flags.h"
+#include "common/platform/api/quiche_mem_slice.h"
 
 DEFINE_QUICHE_COMMAND_LINE_FLAG(
     bool, qbone_close_ephemeral_frames, true,
@@ -139,7 +140,7 @@
   }
 
   if (send_packets_as_messages_) {
-    QuicMemSlice slice(QuicBuffer::Copy(
+    quiche::QuicheMemSlice slice(QuicBuffer::Copy(
         connection()->helper()->GetStreamSendBufferAllocator(), packet));
     switch (SendMessage(absl::MakeSpan(&slice, 1), /*flush=*/true).status) {
       case MESSAGE_STATUS_SUCCESS:
diff --git a/quic/quic_transport/quic_transport_client_session.h b/quic/quic_transport/quic_transport_client_session.h
index 8785457..f5374de 100644
--- a/quic/quic_transport/quic_transport_client_session.h
+++ b/quic/quic_transport/quic_transport_client_session.h
@@ -28,6 +28,7 @@
 #include "quic/quic_transport/quic_transport_protocol.h"
 #include "quic/quic_transport/quic_transport_session_interface.h"
 #include "quic/quic_transport/quic_transport_stream.h"
+#include "common/platform/api/quiche_mem_slice.h"
 
 namespace quic {
 
@@ -99,7 +100,7 @@
   QuicTransportStream* OpenOutgoingBidirectionalStream() override;
   QuicTransportStream* OpenOutgoingUnidirectionalStream() override;
 
-  MessageStatus SendOrQueueDatagram(QuicMemSlice datagram) override {
+  MessageStatus SendOrQueueDatagram(quiche::QuicheMemSlice datagram) override {
     return datagram_queue()->SendOrQueueDatagram(std::move(datagram));
   }
   void SetDatagramMaxTimeInQueue(QuicTime::Delta max_time_in_queue) override {
diff --git a/quic/test_tools/quic_test_backend.cc b/quic/test_tools/quic_test_backend.cc
index 3cfe927..12f530a 100644
--- a/quic/test_tools/quic_test_backend.cc
+++ b/quic/test_tools/quic_test_backend.cc
@@ -13,7 +13,6 @@
 #include "quic/core/quic_buffer_allocator.h"
 #include "quic/core/quic_simple_buffer_allocator.h"
 #include "quic/core/web_transport_interface.h"
-#include "quic/platform/api/quic_mem_slice.h"
 #include "quic/test_tools/web_transport_resets_backend.h"
 #include "quic/tools/web_transport_test_visitors.h"
 
diff --git a/quic/test_tools/quic_test_utils.cc b/quic/test_tools/quic_test_utils.cc
index 1149721..52eafed 100644
--- a/quic/test_tools/quic_test_utils.cc
+++ b/quic/test_tools/quic_test_utils.cc
@@ -1310,13 +1310,13 @@
              : default_type;
 }
 
-QuicMemSlice MemSliceFromString(absl::string_view data) {
+quiche::QuicheMemSlice MemSliceFromString(absl::string_view data) {
   if (data.empty()) {
-    return QuicMemSlice();
+    return quiche::QuicheMemSlice();
   }
 
   static SimpleBufferAllocator* allocator = new SimpleBufferAllocator();
-  return QuicMemSlice(QuicBuffer::Copy(allocator, data));
+  return quiche::QuicheMemSlice(QuicBuffer::Copy(allocator, data));
 }
 
 bool TaggingEncrypter::EncryptPacket(uint64_t /*packet_number*/,
diff --git a/quic/test_tools/quic_test_utils.h b/quic/test_tools/quic_test_utils.h
index 8d12d16..705f951 100644
--- a/quic/test_tools/quic_test_utils.h
+++ b/quic/test_tools/quic_test_utils.h
@@ -33,7 +33,6 @@
 #include "quic/core/quic_simple_buffer_allocator.h"
 #include "quic/core/quic_types.h"
 #include "quic/core/quic_utils.h"
-#include "quic/platform/api/quic_mem_slice_storage.h"
 #include "quic/platform/api/quic_socket_address.h"
 #include "quic/platform/api/quic_test.h"
 #include "quic/test_tools/mock_clock.h"
@@ -41,6 +40,7 @@
 #include "quic/test_tools/mock_random.h"
 #include "quic/test_tools/quic_framer_peer.h"
 #include "quic/test_tools/simple_quic_framer.h"
+#include "common/quiche_mem_slice_storage.h"
 
 namespace quic {
 
@@ -645,7 +645,8 @@
               (override));
   MOCK_METHOD(bool, SendControlFrame, (const QuicFrame& frame), (override));
   MOCK_METHOD(MessageStatus, SendMessage,
-              (QuicMessageId, absl::Span<QuicMemSlice>, bool), (override));
+              (QuicMessageId, absl::Span<quiche::QuicheMemSlice>, bool),
+              (override));
   MOCK_METHOD(bool, SendPathChallenge,
               (const QuicPathFrameBuffer&, const QuicSocketAddress&,
                const QuicSocketAddress&, const QuicSocketAddress&,
@@ -1534,7 +1535,7 @@
 
 // Creates a MemSlice using a singleton trivial buffer allocator.  Performs a
 // copy.
-QuicMemSlice MemSliceFromString(absl::string_view data);
+quiche::QuicheMemSlice MemSliceFromString(absl::string_view data);
 
 // Used to compare ReceivedPacketInfo.
 MATCHER_P(ReceivedPacketInfoEquals, info, "") {
diff --git a/quic/tools/quic_transport_simple_server_session.cc b/quic/tools/quic_transport_simple_server_session.cc
index bc7ef19..f4496fa 100644
--- a/quic/tools/quic_transport_simple_server_session.cc
+++ b/quic/tools/quic_transport_simple_server_session.cc
@@ -16,6 +16,7 @@
 #include "quic/quic_transport/quic_transport_protocol.h"
 #include "quic/quic_transport/quic_transport_stream.h"
 #include "quic/tools/web_transport_test_visitors.h"
+#include "common/platform/api/quiche_mem_slice.h"
 
 namespace quic {
 
@@ -131,7 +132,7 @@
       connection()->helper()->GetStreamSendBufferAllocator(), message.size());
   memcpy(buffer.get(), message.data(), message.size());
   datagram_queue()->SendOrQueueDatagram(
-      QuicMemSlice(std::move(buffer), message.size()));
+      quiche::QuicheMemSlice(std::move(buffer), message.size()));
 }
 
 void QuicTransportSimpleServerSession::MaybeEchoStreamsBack() {
diff --git a/quic/tools/web_transport_test_visitors.h b/quic/tools/web_transport_test_visitors.h
index b1f2246..9451ba7 100644
--- a/quic/tools/web_transport_test_visitors.h
+++ b/quic/tools/web_transport_test_visitors.h
@@ -10,6 +10,7 @@
 #include "quic/core/quic_simple_buffer_allocator.h"
 #include "quic/core/web_transport_interface.h"
 #include "quic/platform/api/quic_logging.h"
+#include "common/platform/api/quiche_mem_slice.h"
 #include "common/quiche_circular_deque.h"
 
 namespace quic {
@@ -220,7 +221,7 @@
   void OnDatagramReceived(absl::string_view datagram) override {
     auto buffer = MakeUniqueBuffer(&allocator_, datagram.size());
     memcpy(buffer.get(), datagram.data(), datagram.size());
-    QuicMemSlice slice(std::move(buffer), datagram.size());
+    quiche::QuicheMemSlice slice(std::move(buffer), datagram.size());
     session_->SendOrQueueDatagram(std::move(slice));
   }