Update the BalsaHeadersSequence internal data structure from std::list to absl::InlinedVector. The std::vector/absl::InlinedVector may be somewhat more performant by default overall, especially once we switch from BalsaHeaders to std::unique_ptr<BalsaHeaders>, which is planned for the next CL (cl/538578037). Some interesting discussion on this comparison is at https://stackoverflow.com/q/2209224. The std::vector/absl::InlinedVector is also somewhat easier to work with, though there is a fond farewell to `&*iter_++`. Inspired by http://google3/gfe/gfe2/http2/http2_writer.h;l=164;rcl=524908183 :D PiperOrigin-RevId: 540664124
diff --git a/quiche/balsa/balsa_headers_sequence.cc b/quiche/balsa/balsa_headers_sequence.cc index 0ce2879..8e9fcff 100644 --- a/quiche/balsa/balsa_headers_sequence.cc +++ b/quiche/balsa/balsa_headers_sequence.cc
@@ -1,38 +1,32 @@ #include "quiche/balsa/balsa_headers_sequence.h" -#include <iterator> - #include "quiche/balsa/balsa_headers.h" namespace quiche { void BalsaHeadersSequence::Append(BalsaHeaders headers) { sequence_.push_back(std::move(headers)); - - if (iter_ == sequence_.end()) { - iter_ = std::prev(sequence_.end()); - } } -bool BalsaHeadersSequence::HasNext() const { return iter_ != sequence_.end(); } +bool BalsaHeadersSequence::HasNext() const { return next_ < sequence_.size(); } -BalsaHeaders* BalsaHeadersSequence::PeekNext() const { +BalsaHeaders* BalsaHeadersSequence::PeekNext() { if (!HasNext()) { return nullptr; } - return &*iter_; + return &sequence_[next_]; } BalsaHeaders* BalsaHeadersSequence::Next() { if (!HasNext()) { return nullptr; } - return &*iter_++; + return &sequence_[next_++]; } void BalsaHeadersSequence::Clear() { sequence_.clear(); - iter_ = sequence_.end(); + next_ = 0; } } // namespace quiche
diff --git a/quiche/balsa/balsa_headers_sequence.h b/quiche/balsa/balsa_headers_sequence.h index 91d1287..ca521f6 100644 --- a/quiche/balsa/balsa_headers_sequence.h +++ b/quiche/balsa/balsa_headers_sequence.h
@@ -1,8 +1,9 @@ #ifndef QUICHE_BALSA_BALSA_HEADERS_SEQUENCE_H_ #define QUICHE_BALSA_BALSA_HEADERS_SEQUENCE_H_ -#include <list> +#include <cstddef> +#include "absl/container/inlined_vector.h" #include "quiche/balsa/balsa_headers.h" #include "quiche/common/platform/api/quiche_export.h" @@ -25,14 +26,18 @@ // Similar to `Next()` but does not advance the sequence. // TODO(b/68801833): Consider removing after full refactoring is in place. - BalsaHeaders* PeekNext() const; + BalsaHeaders* PeekNext(); // Clears the sequence. Any previously returned BalsaHeaders become invalid. void Clear(); private: - std::list<BalsaHeaders> sequence_; - std::list<BalsaHeaders>::iterator iter_ = sequence_.end(); + // Typically at most two interim responses: an optional 100 Continue and an + // optional 103 Early Hints. + absl::InlinedVector<BalsaHeaders, 2> sequence_; + + // The index of the next entry in the sequence. + size_t next_ = 0; }; } // namespace quiche