Clean up QpackInstructionEncoder internals.
This is a follow-up to cl/254497735, which simplified the API.
gfe-relnote: n/a, QUIC v99-only code.
PiperOrigin-RevId: 254790629
Change-Id: Ibc0dd0fde8e5be3958840186d65bc86aa01d9095
diff --git a/quic/core/qpack/qpack_instruction_encoder.cc b/quic/core/qpack/qpack_instruction_encoder.cc
index 1e00d96..400a828 100644
--- a/quic/core/qpack/qpack_instruction_encoder.cc
+++ b/quic/core/qpack/qpack_instruction_encoder.cc
@@ -22,15 +22,7 @@
void QpackInstructionEncoder::Encode(const QpackInstruction* instruction,
std::string* output) {
- StartEncode(instruction);
- DCHECK(HasNext());
-
- Next(std::numeric_limits<size_t>::max(), output);
- DCHECK(!HasNext());
-}
-
-void QpackInstructionEncoder::StartEncode(const QpackInstruction* instruction) {
- DCHECK(!HasNext());
+ DCHECK(instruction);
state_ = State::kOpcode;
instruction_ = instruction;
@@ -38,20 +30,8 @@
// Field list must not be empty.
DCHECK(field_ != instruction_->fields.end());
-}
-bool QpackInstructionEncoder::HasNext() const {
- return instruction_ && (field_ != instruction_->fields.end());
-}
-
-void QpackInstructionEncoder::Next(size_t max_encoded_bytes,
- std::string* output) {
- DCHECK(HasNext());
- DCHECK_NE(0u, max_encoded_bytes);
-
- while (max_encoded_bytes > 0 && HasNext()) {
- size_t encoded_bytes = 0;
-
+ do {
switch (state_) {
case State::kOpcode:
DoOpcode();
@@ -63,22 +43,19 @@
DoStaticBit();
break;
case State::kVarintStart:
- encoded_bytes = DoVarintStart(max_encoded_bytes, output);
+ DoVarintStart(output);
break;
case State::kVarintResume:
- encoded_bytes = DoVarintResume(max_encoded_bytes, output);
+ DoVarintResume(output);
break;
case State::kStartString:
DoStartString();
break;
case State::kWriteString:
- encoded_bytes = DoWriteString(max_encoded_bytes, output);
+ DoWriteString(output);
break;
}
-
- DCHECK_LE(encoded_bytes, max_encoded_bytes);
- max_encoded_bytes -= encoded_bytes;
- }
+ } while (field_ != instruction_->fields.end());
}
void QpackInstructionEncoder::DoOpcode() {
@@ -118,8 +95,7 @@
state_ = State::kStartField;
}
-size_t QpackInstructionEncoder::DoVarintStart(size_t /*max_encoded_bytes*/,
- std::string* output) {
+void QpackInstructionEncoder::DoVarintStart(std::string* output) {
DCHECK(field_->type == QpackInstructionFieldType::kVarint ||
field_->type == QpackInstructionFieldType::kVarint2 ||
field_->type == QpackInstructionFieldType::kName ||
@@ -145,46 +121,37 @@
if (varint_encoder_.IsEncodingInProgress()) {
state_ = State::kVarintResume;
- return 1;
+ return;
}
if (field_->type == QpackInstructionFieldType::kVarint ||
field_->type == QpackInstructionFieldType::kVarint2) {
++field_;
state_ = State::kStartField;
- return 1;
+ return;
}
state_ = State::kWriteString;
- return 1;
}
-size_t QpackInstructionEncoder::DoVarintResume(size_t max_encoded_bytes,
- std::string* output) {
+void QpackInstructionEncoder::DoVarintResume(std::string* output) {
DCHECK(field_->type == QpackInstructionFieldType::kVarint ||
field_->type == QpackInstructionFieldType::kVarint2 ||
field_->type == QpackInstructionFieldType::kName ||
field_->type == QpackInstructionFieldType::kValue);
DCHECK(varint_encoder_.IsEncodingInProgress());
- const size_t encoded_bytes =
- varint_encoder_.ResumeEncoding(max_encoded_bytes, output);
- if (varint_encoder_.IsEncodingInProgress()) {
- DCHECK_EQ(encoded_bytes, max_encoded_bytes);
- return encoded_bytes;
- }
-
- DCHECK_LE(encoded_bytes, max_encoded_bytes);
+ varint_encoder_.ResumeEncoding(std::numeric_limits<size_t>::max(), output);
+ DCHECK(!varint_encoder_.IsEncodingInProgress());
if (field_->type == QpackInstructionFieldType::kVarint ||
field_->type == QpackInstructionFieldType::kVarint2) {
++field_;
state_ = State::kStartField;
- return encoded_bytes;
+ return;
}
state_ = State::kWriteString;
- return encoded_bytes;
}
void QpackInstructionEncoder::DoStartString() {
@@ -205,24 +172,14 @@
state_ = State::kVarintStart;
}
-size_t QpackInstructionEncoder::DoWriteString(size_t max_encoded_bytes,
- std::string* output) {
+void QpackInstructionEncoder::DoWriteString(std::string* output) {
DCHECK(field_->type == QpackInstructionFieldType::kName ||
field_->type == QpackInstructionFieldType::kValue);
- if (max_encoded_bytes < string_to_write_.size()) {
- const size_t encoded_bytes = max_encoded_bytes;
- QuicStrAppend(output, string_to_write_.substr(0, encoded_bytes));
- string_to_write_ = string_to_write_.substr(encoded_bytes);
- return encoded_bytes;
- }
-
- const size_t encoded_bytes = string_to_write_.size();
QuicStrAppend(output, string_to_write_);
++field_;
state_ = State::kStartField;
- return encoded_bytes;
}
} // namespace quic
diff --git a/quic/core/qpack/qpack_instruction_encoder.h b/quic/core/qpack/qpack_instruction_encoder.h
index 1da850f..ae37b9e 100644
--- a/quic/core/qpack/qpack_instruction_encoder.h
+++ b/quic/core/qpack/qpack_instruction_encoder.h
@@ -5,7 +5,6 @@
#ifndef QUICHE_QUIC_CORE_QPACK_QPACK_INSTRUCTION_ENCODER_H_
#define QUICHE_QUIC_CORE_QPACK_QPACK_INSTRUCTION_ENCODER_H_
-#include <cstddef>
#include <cstdint>
#include <string>
@@ -37,20 +36,6 @@
void Encode(const QpackInstruction* instruction, std::string* output);
private:
- // Start encoding an instruction. Must only be called after the previous
- // instruction has been completely encoded.
- void StartEncode(const QpackInstruction* instruction);
-
- // Returns true iff more data remains to be encoded for the current
- // instruction. Returns false if there is no current instruction, that is, if
- // Encode() has never been called.
- bool HasNext() const;
-
- // Encodes the next up to |max_encoded_bytes| octets of the current
- // instruction, appending to |output|. Must only be called when HasNext()
- // returns true. |max_encoded_bytes| must be positive.
- void Next(size_t max_encoded_bytes, std::string* output);
-
enum class State {
// Write instruction opcode to |byte_|.
kOpcode,
@@ -71,15 +56,15 @@
kWriteString
};
- // One method for each state. Some encode up to |max_encoded_bytes| octets,
- // appending to |output|. Some only change internal state.
+ // One method for each state. Some append encoded bytes to |output|.
+ // Some only change internal state.
void DoOpcode();
void DoStartField();
void DoStaticBit();
- size_t DoVarintStart(size_t max_encoded_bytes, std::string* output);
- size_t DoVarintResume(size_t max_encoded_bytes, std::string* output);
+ void DoVarintStart(std::string* output);
+ void DoVarintResume(std::string* output);
void DoStartString();
- size_t DoWriteString(size_t max_encoded_bytes, std::string* output);
+ void DoWriteString(std::string* output);
// Storage for field values to be encoded.
bool s_bit_;