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 {