Templetize QpackHeaderTableBase with dynamic entry table type.
No functional change for now. This CL allows changing the underlying container
type for the encoder and decoder separately in a future CL.
PiperOrigin-RevId: 372180411
Change-Id: Id7bf3351f95c446184344a5fac8b6a752bde42fb
diff --git a/quic/core/qpack/qpack_header_table.cc b/quic/core/qpack/qpack_header_table.cc
index 1afee4f..3284062 100644
--- a/quic/core/qpack/qpack_header_table.cc
+++ b/quic/core/qpack/qpack_header_table.cc
@@ -10,7 +10,30 @@
namespace quic {
-QpackHeaderTableBase::QpackHeaderTableBase()
+// Explicitly instantiate templated public non-virtual base class methods.
+
+template bool
+QpackHeaderTableBase<QpackEncoderDynamicTable>::EntryFitsDynamicTableCapacity(
+ absl::string_view name,
+ absl::string_view value) const;
+template bool QpackHeaderTableBase<
+ QpackEncoderDynamicTable>::SetDynamicTableCapacity(uint64_t capacity);
+template bool
+QpackHeaderTableBase<QpackEncoderDynamicTable>::SetMaximumDynamicTableCapacity(
+ uint64_t maximum_dynamic_table_capacity);
+
+template bool
+QpackHeaderTableBase<QpackDecoderDynamicTable>::EntryFitsDynamicTableCapacity(
+ absl::string_view name,
+ absl::string_view value) const;
+template bool QpackHeaderTableBase<
+ QpackDecoderDynamicTable>::SetDynamicTableCapacity(uint64_t capacity);
+template bool
+QpackHeaderTableBase<QpackDecoderDynamicTable>::SetMaximumDynamicTableCapacity(
+ uint64_t maximum_dynamic_table_capacity);
+
+template <typename DynamicEntryTable>
+QpackHeaderTableBase<DynamicEntryTable>::QpackHeaderTableBase()
: dynamic_table_size_(0),
dynamic_table_capacity_(0),
maximum_dynamic_table_capacity_(0),
@@ -18,14 +41,17 @@
dropped_entry_count_(0),
dynamic_table_entry_referenced_(false) {}
-bool QpackHeaderTableBase::EntryFitsDynamicTableCapacity(
+template <typename DynamicEntryTable>
+bool QpackHeaderTableBase<DynamicEntryTable>::EntryFitsDynamicTableCapacity(
absl::string_view name,
absl::string_view value) const {
return QpackEntry::Size(name, value) <= dynamic_table_capacity_;
}
-uint64_t QpackHeaderTableBase::InsertEntry(absl::string_view name,
- absl::string_view value) {
+template <typename DynamicEntryTable>
+uint64_t QpackHeaderTableBase<DynamicEntryTable>::InsertEntry(
+ absl::string_view name,
+ absl::string_view value) {
QUICHE_DCHECK(EntryFitsDynamicTableCapacity(name, value));
const uint64_t index = dropped_entry_count_ + dynamic_entries_.size();
@@ -44,7 +70,9 @@
return index;
}
-bool QpackHeaderTableBase::SetDynamicTableCapacity(uint64_t capacity) {
+template <typename DynamicEntryTable>
+bool QpackHeaderTableBase<DynamicEntryTable>::SetDynamicTableCapacity(
+ uint64_t capacity) {
if (capacity > maximum_dynamic_table_capacity_) {
return false;
}
@@ -57,7 +85,8 @@
return true;
}
-bool QpackHeaderTableBase::SetMaximumDynamicTableCapacity(
+template <typename DynamicEntryTable>
+bool QpackHeaderTableBase<DynamicEntryTable>::SetMaximumDynamicTableCapacity(
uint64_t maximum_dynamic_table_capacity) {
if (maximum_dynamic_table_capacity_ == 0) {
maximum_dynamic_table_capacity_ = maximum_dynamic_table_capacity;
@@ -68,7 +97,8 @@
return maximum_dynamic_table_capacity == maximum_dynamic_table_capacity_;
}
-void QpackHeaderTableBase::RemoveEntryFromEnd() {
+template <typename DynamicEntryTable>
+void QpackHeaderTableBase<DynamicEntryTable>::RemoveEntryFromEnd() {
const uint64_t entry_size = dynamic_entries_.front().Size();
QUICHE_DCHECK_GE(dynamic_table_size_, entry_size);
dynamic_table_size_ -= entry_size;
@@ -77,7 +107,9 @@
++dropped_entry_count_;
}
-void QpackHeaderTableBase::EvictDownToCapacity(uint64_t capacity) {
+template <typename DynamicEntryTable>
+void QpackHeaderTableBase<DynamicEntryTable>::EvictDownToCapacity(
+ uint64_t capacity) {
while (dynamic_table_size_ > capacity) {
QUICHE_DCHECK(!dynamic_entries_.empty());
RemoveEntryFromEnd();
@@ -90,7 +122,8 @@
uint64_t QpackEncoderHeaderTable::InsertEntry(absl::string_view name,
absl::string_view value) {
- const uint64_t index = QpackHeaderTableBase::InsertEntry(name, value);
+ const uint64_t index =
+ QpackHeaderTableBase<QpackEncoderDynamicTable>::InsertEntry(name, value);
// Make name and value point to the new entry.
name = dynamic_entries().back().name();
@@ -235,7 +268,7 @@
dynamic_name_index_.erase(name_it);
}
- QpackHeaderTableBase::RemoveEntryFromEnd();
+ QpackHeaderTableBase<QpackEncoderDynamicTable>::RemoveEntryFromEnd();
}
QpackDecoderHeaderTable::QpackDecoderHeaderTable()
@@ -249,7 +282,8 @@
uint64_t QpackDecoderHeaderTable::InsertEntry(absl::string_view name,
absl::string_view value) {
- const uint64_t index = QpackHeaderTableBase::InsertEntry(name, value);
+ const uint64_t index =
+ QpackHeaderTableBase<QpackDecoderDynamicTable>::InsertEntry(name, value);
// Notify and deregister observers whose threshold is met, if any.
while (!observers_.empty()) {
diff --git a/quic/core/qpack/qpack_header_table.h b/quic/core/qpack/qpack_header_table.h
index f5e4c56..ce4375d 100644
--- a/quic/core/qpack/qpack_header_table.h
+++ b/quic/core/qpack/qpack_header_table.h
@@ -21,10 +21,19 @@
using QpackLookupEntry = spdy::HpackLookupEntry;
constexpr size_t kQpackEntrySizeOverhead = spdy::kHpackEntrySizeOverhead;
+// Encoder needs pointer stability for |dynamic_index_| and
+// |dynamic_name_index_|. However, it does not need random access.
+using QpackEncoderDynamicTable = spdy::HpackHeaderTable::DynamicEntryTable;
+
+// Decoder needs random access for LookupEntry().
+// However, it does not need pointer stability.
+using QpackDecoderDynamicTable = spdy::HpackHeaderTable::DynamicEntryTable;
+
// This is a base class for encoder and decoder classes that manage the QPACK
// static and dynamic tables. For dynamic entries, it only has a concept of
// absolute indices. The caller needs to perform the necessary transformations
// to and from relative indices and post-base indices.
+template <typename DynamicEntryTable>
class QUIC_EXPORT_PRIVATE QpackHeaderTableBase {
public:
QpackHeaderTableBase();
@@ -91,7 +100,6 @@
// |dynamic_table_size_| and |dropped_entry_count_|.
virtual void RemoveEntryFromEnd();
- using DynamicEntryTable = spdy::HpackHeaderTable::DynamicEntryTable;
const DynamicEntryTable& dynamic_entries() const { return dynamic_entries_; }
private:
@@ -131,7 +139,7 @@
};
class QUIC_EXPORT_PRIVATE QpackEncoderHeaderTable
- : public QpackHeaderTableBase {
+ : public QpackHeaderTableBase<QpackEncoderDynamicTable> {
public:
// Result of header table lookup.
enum class MatchType { kNameAndValue, kName, kNoMatch };
@@ -198,7 +206,7 @@
};
class QUIC_EXPORT_PRIVATE QpackDecoderHeaderTable
- : public QpackHeaderTableBase {
+ : public QpackHeaderTableBase<QpackDecoderDynamicTable> {
public:
// Observer interface for dynamic table insertion.
class QUIC_EXPORT_PRIVATE Observer {