Use QuicCircularDeque instead of QuicQueue.

QuicQueue is std::queue which is backed by std::deque in internal code.  It is
base::queue which a typedef for std::queue backed by base::circular_deque in
Chromium.

This changes the internal implementation from a container that has iterator
stability from one that does not (elements may move when a new one is added).
It is safe to do so because (1) by code inspection I established that nothing is
done with these two containers that would rely on iterator stability (like
taking address of front() then pushing a new element), and (2) this has already
been the case in Chromium for a while and there are no reported crashes or MSAN
failures.

My motivation is to remove as many things from QUICHE platform as possible.
Also note that QuicCircularDeque typically uses less memory than std::deque,
especially for small containers.

PiperOrigin-RevId: 366309029
Change-Id: I0f8f8185feee071b1043b7a60e6456444a281fab
diff --git a/quic/core/qpack/fuzzer/qpack_round_trip_fuzzer.cc b/quic/core/qpack/fuzzer/qpack_round_trip_fuzzer.cc
index 4e4ebc4..6c3e351 100644
--- a/quic/core/qpack/fuzzer/qpack_round_trip_fuzzer.cc
+++ b/quic/core/qpack/fuzzer/qpack_round_trip_fuzzer.cc
@@ -15,8 +15,8 @@
 #include "quic/core/qpack/qpack_encoder.h"
 #include "quic/core/qpack/qpack_stream_sender_delegate.h"
 #include "quic/core/qpack/value_splitting_header_list.h"
+#include "quic/core/quic_circular_deque.h"
 #include "quic/core/quic_error_codes.h"
-#include "quic/platform/api/quic_containers.h"
 #include "quic/platform/api/quic_fuzzed_data_provider.h"
 #include "quic/test_tools/qpack/qpack_decoder_test_utils.h"
 #include "quic/test_tools/qpack/qpack_encoder_peer.h"
@@ -413,7 +413,7 @@
 
   // QpackStreamSenderDelegate implementation.
   void WriteStreamData(absl::string_view data) override {
-    stream_data.push(std::string(data.data(), data.size()));
+    stream_data.push_back(std::string(data.data(), data.size()));
   }
 
   // Release some (possibly none) delayed stream data.
@@ -421,7 +421,7 @@
     auto count = provider_->ConsumeIntegral<uint8_t>();
     while (!stream_data.empty() && count > 0) {
       receiver_->Decode(stream_data.front());
-      stream_data.pop();
+      stream_data.pop_front();
       --count;
     }
   }
@@ -430,14 +430,14 @@
   void Flush() {
     while (!stream_data.empty()) {
       receiver_->Decode(stream_data.front());
-      stream_data.pop();
+      stream_data.pop_front();
     }
   }
 
  private:
   QpackStreamReceiver* const receiver_;
   QuicFuzzedDataProvider* const provider_;
-  QuicQueue<std::string> stream_data;
+  QuicCircularDeque<std::string> stream_data;
 };
 
 // Generate header list using fuzzer data.
diff --git a/quic/test_tools/simulator/queue.cc b/quic/test_tools/simulator/queue.cc
index 5113cf7..c286bf6 100644
--- a/quic/test_tools/simulator/queue.cc
+++ b/quic/test_tools/simulator/queue.cc
@@ -43,7 +43,7 @@
   }
 
   bytes_queued_ += packet->size;
-  queue_.emplace(std::move(packet), current_bundle_);
+  queue_.emplace_back(std::move(packet), current_bundle_);
 
   if (IsAggregationEnabled()) {
     current_bundle_bytes_ += queue_.front().packet->size;
@@ -65,7 +65,7 @@
     bytes_queued_ -= queue_.front().packet->size;
 
     tx_port_->AcceptPacket(std::move(queue_.front().packet));
-    queue_.pop();
+    queue_.pop_front();
     if (listener_ != nullptr) {
       listener_->OnPacketDequeued();
     }
diff --git a/quic/test_tools/simulator/queue.h b/quic/test_tools/simulator/queue.h
index a291f48..943b8b0 100644
--- a/quic/test_tools/simulator/queue.h
+++ b/quic/test_tools/simulator/queue.h
@@ -6,6 +6,7 @@
 #define QUICHE_QUIC_TEST_TOOLS_SIMULATOR_QUEUE_H_
 
 #include "quic/core/quic_alarm.h"
+#include "quic/core/quic_circular_deque.h"
 #include "quic/test_tools/simulator/link.h"
 
 namespace quic {
@@ -109,7 +110,7 @@
   std::unique_ptr<QuicAlarm> aggregation_timeout_alarm_;
 
   ConstrainedPortInterface* tx_port_;
-  QuicQueue<EnqueuedPacket> queue_;
+  QuicCircularDeque<EnqueuedPacket> queue_;
 
   ListenerInterface* listener_;
 };