Internal change
PiperOrigin-RevId: 372619290
diff --git a/quic/core/qpack/qpack_header_table.cc b/quic/core/qpack/qpack_header_table.cc
index e39babf..6607272 100644
--- a/quic/core/qpack/qpack_header_table.cc
+++ b/quic/core/qpack/qpack_header_table.cc
@@ -10,128 +10,6 @@
namespace quic {
-// Explicitly instantiate all possible templated non-inline base class methods.
-
-template QpackHeaderTableBase<QpackEncoderDynamicTable>::QpackHeaderTableBase();
-template bool
-QpackHeaderTableBase<QpackEncoderDynamicTable>::EntryFitsDynamicTableCapacity(
- absl::string_view name,
- absl::string_view value) const;
-template uint64_t QpackHeaderTableBase<QpackEncoderDynamicTable>::InsertEntry(
- absl::string_view name,
- absl::string_view value);
-template bool QpackHeaderTableBase<
- QpackEncoderDynamicTable>::SetDynamicTableCapacity(uint64_t capacity);
-template bool
-QpackHeaderTableBase<QpackEncoderDynamicTable>::SetMaximumDynamicTableCapacity(
- uint64_t maximum_dynamic_table_capacity);
-template void
-QpackHeaderTableBase<QpackEncoderDynamicTable>::RemoveEntryFromEnd();
-template void QpackHeaderTableBase<
- QpackEncoderDynamicTable>::EvictDownToCapacity(uint64_t capacity);
-
-template QpackHeaderTableBase<QpackDecoderDynamicTable>::QpackHeaderTableBase();
-template bool
-QpackHeaderTableBase<QpackDecoderDynamicTable>::EntryFitsDynamicTableCapacity(
- absl::string_view name,
- absl::string_view value) const;
-template uint64_t QpackHeaderTableBase<QpackDecoderDynamicTable>::InsertEntry(
- absl::string_view name,
- absl::string_view value);
-template bool QpackHeaderTableBase<
- QpackDecoderDynamicTable>::SetDynamicTableCapacity(uint64_t capacity);
-template bool
-QpackHeaderTableBase<QpackDecoderDynamicTable>::SetMaximumDynamicTableCapacity(
- uint64_t maximum_dynamic_table_capacity);
-template void
-QpackHeaderTableBase<QpackDecoderDynamicTable>::RemoveEntryFromEnd();
-template void QpackHeaderTableBase<
- QpackDecoderDynamicTable>::EvictDownToCapacity(uint64_t capacity);
-
-template <typename DynamicEntryTable>
-QpackHeaderTableBase<DynamicEntryTable>::QpackHeaderTableBase()
- : dynamic_table_size_(0),
- dynamic_table_capacity_(0),
- maximum_dynamic_table_capacity_(0),
- max_entries_(0),
- dropped_entry_count_(0),
- dynamic_table_entry_referenced_(false) {}
-
-template <typename DynamicEntryTable>
-bool QpackHeaderTableBase<DynamicEntryTable>::EntryFitsDynamicTableCapacity(
- absl::string_view name,
- absl::string_view value) const {
- return QpackEntry::Size(name, value) <= dynamic_table_capacity_;
-}
-
-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();
-
- // Copy name and value before modifying the container, because evicting
- // entries or even inserting a new one might invalidate |name| or |value| if
- // they point to an entry.
- QpackEntry new_entry((std::string(name)), (std::string(value)));
- const size_t entry_size = new_entry.Size();
-
- EvictDownToCapacity(dynamic_table_capacity_ - entry_size);
-
- dynamic_table_size_ += entry_size;
- dynamic_entries_.push_back(std::move(new_entry));
-
- return index;
-}
-
-template <typename DynamicEntryTable>
-bool QpackHeaderTableBase<DynamicEntryTable>::SetDynamicTableCapacity(
- uint64_t capacity) {
- if (capacity > maximum_dynamic_table_capacity_) {
- return false;
- }
-
- dynamic_table_capacity_ = capacity;
- EvictDownToCapacity(capacity);
-
- QUICHE_DCHECK_LE(dynamic_table_size_, dynamic_table_capacity_);
-
- return true;
-}
-
-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;
- max_entries_ = maximum_dynamic_table_capacity / 32;
- return true;
- }
- // If the value is already set, it should not be changed.
- return maximum_dynamic_table_capacity == maximum_dynamic_table_capacity_;
-}
-
-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;
-
- dynamic_entries_.pop_front();
- ++dropped_entry_count_;
-}
-
-template <typename DynamicEntryTable>
-void QpackHeaderTableBase<DynamicEntryTable>::EvictDownToCapacity(
- uint64_t capacity) {
- while (dynamic_table_size_ > capacity) {
- QUICHE_DCHECK(!dynamic_entries_.empty());
- RemoveEntryFromEnd();
- }
-}
-
QpackEncoderHeaderTable::QpackEncoderHeaderTable()
: static_index_(ObtainQpackStaticTable().GetStaticIndex()),
static_name_index_(ObtainQpackStaticTable().GetStaticNameIndex()) {}
diff --git a/quic/core/qpack/qpack_header_table.h b/quic/core/qpack/qpack_header_table.h
index 5ca3b11..7193d10 100644
--- a/quic/core/qpack/qpack_header_table.h
+++ b/quic/core/qpack/qpack_header_table.h
@@ -138,6 +138,90 @@
bool dynamic_table_entry_referenced_;
};
+template <typename DynamicEntryTable>
+QpackHeaderTableBase<DynamicEntryTable>::QpackHeaderTableBase()
+ : dynamic_table_size_(0),
+ dynamic_table_capacity_(0),
+ maximum_dynamic_table_capacity_(0),
+ max_entries_(0),
+ dropped_entry_count_(0),
+ dynamic_table_entry_referenced_(false) {}
+
+template <typename DynamicEntryTable>
+bool QpackHeaderTableBase<DynamicEntryTable>::EntryFitsDynamicTableCapacity(
+ absl::string_view name,
+ absl::string_view value) const {
+ return QpackEntry::Size(name, value) <= dynamic_table_capacity_;
+}
+
+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();
+
+ // Copy name and value before modifying the container, because evicting
+ // entries or even inserting a new one might invalidate |name| or |value| if
+ // they point to an entry.
+ QpackEntry new_entry((std::string(name)), (std::string(value)));
+ const size_t entry_size = new_entry.Size();
+
+ EvictDownToCapacity(dynamic_table_capacity_ - entry_size);
+
+ dynamic_table_size_ += entry_size;
+ dynamic_entries_.push_back(std::move(new_entry));
+
+ return index;
+}
+
+template <typename DynamicEntryTable>
+bool QpackHeaderTableBase<DynamicEntryTable>::SetDynamicTableCapacity(
+ uint64_t capacity) {
+ if (capacity > maximum_dynamic_table_capacity_) {
+ return false;
+ }
+
+ dynamic_table_capacity_ = capacity;
+ EvictDownToCapacity(capacity);
+
+ QUICHE_DCHECK_LE(dynamic_table_size_, dynamic_table_capacity_);
+
+ return true;
+}
+
+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;
+ max_entries_ = maximum_dynamic_table_capacity / 32;
+ return true;
+ }
+ // If the value is already set, it should not be changed.
+ return maximum_dynamic_table_capacity == maximum_dynamic_table_capacity_;
+}
+
+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;
+
+ dynamic_entries_.pop_front();
+ ++dropped_entry_count_;
+}
+
+template <typename DynamicEntryTable>
+void QpackHeaderTableBase<DynamicEntryTable>::EvictDownToCapacity(
+ uint64_t capacity) {
+ while (dynamic_table_size_ > capacity) {
+ QUICHE_DCHECK(!dynamic_entries_.empty());
+ RemoveEntryFromEnd();
+ }
+}
+
class QUIC_EXPORT_PRIVATE QpackEncoderHeaderTable
: public QpackHeaderTableBase<QpackEncoderDynamicTable> {
public: