Created and integrated QuicIntervalDeque class for index management. Improves code readability.

gfe-relnote: Integrated QuicIntervalDeque class into QuicStreamSendBuffer affecting the QUIC GFE path. Protected by --gfe2_reloadable_flag_quic_interval_deque
PiperOrigin-RevId: 286471930
Change-Id: Ida91b6c7d066d9710d06932c9f4726946bfbd430
diff --git a/quic/test_tools/quic_interval_deque_peer.h b/quic/test_tools/quic_interval_deque_peer.h
new file mode 100644
index 0000000..e9a99ba
--- /dev/null
+++ b/quic/test_tools/quic_interval_deque_peer.h
@@ -0,0 +1,35 @@
+// Copyright 2019 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_TEST_TOOLS_QUIC_INTERVAL_DEQUE_PEER_H_
+#define QUICHE_QUIC_TEST_TOOLS_QUIC_INTERVAL_DEQUE_PEER_H_
+
+#include "net/third_party/quiche/src/quic/core/quic_interval_deque.h"
+
+namespace quic {
+
+namespace test {
+
+class QuicIntervalDequePeer {
+ public:
+  template <class T, class C>
+  static int32_t GetCachedIndex(QuicIntervalDeque<T, C>* interval_deque) {
+    if (!interval_deque->cached_index_.has_value()) {
+      return -1;
+    }
+    return interval_deque->cached_index_.value();
+  }
+
+  template <class T, class C>
+  static T* GetItem(QuicIntervalDeque<T, C>* interval_deque,
+                    const std::size_t index) {
+    return &interval_deque->container_[index];
+  }
+};
+
+}  // namespace test
+
+}  // namespace quic
+
+#endif  // QUICHE_QUIC_TEST_TOOLS_QUIC_INTERVAL_DEQUE_PEER_H_
diff --git a/quic/test_tools/quic_stream_send_buffer_peer.cc b/quic/test_tools/quic_stream_send_buffer_peer.cc
index 22e5e56..2135d3f 100644
--- a/quic/test_tools/quic_stream_send_buffer_peer.cc
+++ b/quic/test_tools/quic_stream_send_buffer_peer.cc
@@ -3,6 +3,7 @@
 // found in the LICENSE file.
 
 #include "net/third_party/quiche/src/quic/test_tools/quic_stream_send_buffer_peer.h"
+#include "net/third_party/quiche/src/quic/test_tools/quic_interval_deque_peer.h"
 
 namespace quic {
 
@@ -15,25 +16,58 @@
   send_buffer->stream_offset_ = stream_offset;
 }
 
+// TODO(b/144690240): Remove CurrentWriteSlice when deprecating
+// --quic_interval_deque
 // static
 const BufferedSlice* QuicStreamSendBufferPeer::CurrentWriteSlice(
     QuicStreamSendBuffer* send_buffer) {
-  if (send_buffer->write_index_ == -1) {
+  auto wi = write_index(send_buffer);
+
+  if (wi == -1) {
     return nullptr;
   }
-  return &send_buffer->buffered_slices_[send_buffer->write_index_];
+  if (GetQuicReloadableFlag(quic_interval_deque)) {
+    return QuicIntervalDequePeer::GetItem(&send_buffer->interval_deque_, wi);
+  } else {
+    return &send_buffer->buffered_slices_[wi];
+  }
+}
+
+QuicStreamOffset QuicStreamSendBufferPeer::EndOffset(
+    QuicStreamSendBuffer* send_buffer) {
+  if (GetQuicReloadableFlag(quic_interval_deque)) {
+    return send_buffer->current_end_offset_;
+  }
+  return 0;
 }
 
 // static
 QuicByteCount QuicStreamSendBufferPeer::TotalLength(
     QuicStreamSendBuffer* send_buffer) {
   QuicByteCount length = 0;
-  for (const auto& slice : send_buffer->buffered_slices_) {
-    length += slice.slice.length();
+  if (GetQuicReloadableFlag(quic_interval_deque)) {
+    for (auto slice = send_buffer->interval_deque_.DataBegin();
+         slice != send_buffer->interval_deque_.DataEnd(); ++slice) {
+      length += slice->slice.length();
+    }
+  } else {
+    for (const auto& slice : send_buffer->buffered_slices_) {
+      length += slice.slice.length();
+    }
   }
   return length;
 }
 
+// static
+int32_t QuicStreamSendBufferPeer::write_index(
+    QuicStreamSendBuffer* send_buffer) {
+  if (send_buffer->interval_deque_active_) {
+    return QuicIntervalDequePeer::GetCachedIndex(&send_buffer->interval_deque_);
+  } else {
+    return send_buffer->write_index_;
+  }
+}
+
 }  // namespace test
 
 }  // namespace quic
diff --git a/quic/test_tools/quic_stream_send_buffer_peer.h b/quic/test_tools/quic_stream_send_buffer_peer.h
index 3adb173..310cda9 100644
--- a/quic/test_tools/quic_stream_send_buffer_peer.h
+++ b/quic/test_tools/quic_stream_send_buffer_peer.h
@@ -19,11 +19,11 @@
   static const BufferedSlice* CurrentWriteSlice(
       QuicStreamSendBuffer* send_buffer);
 
+  static QuicStreamOffset EndOffset(QuicStreamSendBuffer* send_buffer);
+
   static QuicByteCount TotalLength(QuicStreamSendBuffer* send_buffer);
 
-  static int32_t write_index(QuicStreamSendBuffer* send_buffer) {
-    return send_buffer->write_index_;
-  }
+  static int32_t write_index(QuicStreamSendBuffer* send_buffer);
 };
 
 }  // namespace test