Migrates quic's settingsframe from std::map to quichashmap.
There is no particular reason to use an ordered container, and std::map is not a very efficient data structure.
Note: this change makes an effort to preserve the existing order of serialized SETTINGS. Many tests fail if SETTINGS order is permuted.
PiperOrigin-RevId: 318555812
Change-Id: Ib3829c1013f70462ff90b946282933a59cf479ec
diff --git a/quic/core/http/http_encoder.cc b/quic/core/http/http_encoder.cc
index 6066b26..a51abbe 100644
--- a/quic/core/http/http_encoder.cc
+++ b/quic/core/http/http_encoder.cc
@@ -99,10 +99,13 @@
const SettingsFrame& settings,
std::unique_ptr<char[]>* output) {
QuicByteCount payload_length = 0;
+ std::vector<std::pair<uint64_t, uint64_t>> ordered_settings{
+ settings.values.begin(), settings.values.end()};
+ std::sort(ordered_settings.begin(), ordered_settings.end());
// Calculate the payload length.
- for (auto it = settings.values.begin(); it != settings.values.end(); ++it) {
- payload_length += QuicDataWriter::GetVarInt62Len(it->first);
- payload_length += QuicDataWriter::GetVarInt62Len(it->second);
+ for (const auto& p : ordered_settings) {
+ payload_length += QuicDataWriter::GetVarInt62Len(p.first);
+ payload_length += QuicDataWriter::GetVarInt62Len(p.second);
}
QuicByteCount total_length =
@@ -117,8 +120,8 @@
return 0;
}
- for (auto it = settings.values.begin(); it != settings.values.end(); ++it) {
- if (!writer.WriteVarInt62(it->first) || !writer.WriteVarInt62(it->second)) {
+ for (const auto& p : ordered_settings) {
+ if (!writer.WriteVarInt62(p.first) || !writer.WriteVarInt62(p.second)) {
QUIC_DLOG(ERROR) << "Http encoder failed when attempting to serialize "
"settings frame payload.";
return 0;
diff --git a/quic/core/http/http_frames.h b/quic/core/http/http_frames.h
index d7d875a..242f72b 100644
--- a/quic/core/http/http_frames.h
+++ b/quic/core/http/http_frames.h
@@ -65,7 +65,7 @@
// affect how endpoints communicate, such as preferences and constraints
// on peer behavior
-using SettingsMap = std::map<uint64_t, uint64_t>;
+using SettingsMap = QuicHashMap<uint64_t, uint64_t>;
struct QUIC_EXPORT_PRIVATE SettingsFrame {
SettingsMap values;