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_;