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