Add BalsaHeadersSequence::IsEmpty().

This method will eventually replace the BackendResponder calls to
HasContinueResponseHeaders() in [1], as these conditions should be generalized
to other interim headers.

[1] http://google3/gfe/gfe2/jetstream/backend_responder.cc;l=985,1002;rcl=538013523

PiperOrigin-RevId: 540667259
diff --git a/quiche/balsa/balsa_headers_sequence.h b/quiche/balsa/balsa_headers_sequence.h
index 3fe10fd..5c2c43f 100644
--- a/quiche/balsa/balsa_headers_sequence.h
+++ b/quiche/balsa/balsa_headers_sequence.h
@@ -21,6 +21,10 @@
   // `Next()`. IFF true, `Next()` will return non-nullptr.
   bool HasNext() const;
 
+  // Returns true if the sequence has no BalsaHeaders. It is possible to have
+  // both !HasNext() and !IsEmpty() if all BalsaHeaders have been consumed.
+  bool IsEmpty() const { return sequence_.empty(); }
+
   // Returns a non-owning pointer to the next BalsaHeaders in the sequence, or
   // nullptr if the next does not exist.
   BalsaHeaders* Next();
diff --git a/quiche/balsa/balsa_headers_sequence_test.cc b/quiche/balsa/balsa_headers_sequence_test.cc
index ac62f5e..da6f7ce 100644
--- a/quiche/balsa/balsa_headers_sequence_test.cc
+++ b/quiche/balsa/balsa_headers_sequence_test.cc
@@ -14,6 +14,7 @@
   BalsaHeadersSequence sequence;
   EXPECT_FALSE(sequence.HasNext());
   EXPECT_EQ(sequence.Next(), nullptr);
+  EXPECT_TRUE(sequence.IsEmpty());
 }
 
 TEST(BalsaHeadersSequenceTest, Basic) {
@@ -23,21 +24,25 @@
   headers_one->AppendHeader("one", "fish");
   sequence.Append(std::move(headers_one));
   EXPECT_TRUE(sequence.HasNext());
+  EXPECT_FALSE(sequence.IsEmpty());
 
   auto headers_two = std::make_unique<BalsaHeaders>();
   headers_two->AppendHeader("two", "fish");
   sequence.Append(std::move(headers_two));
   EXPECT_TRUE(sequence.HasNext());
+  EXPECT_FALSE(sequence.IsEmpty());
 
   const BalsaHeaders* headers = sequence.Next();
   ASSERT_NE(headers, nullptr);
   EXPECT_TRUE(headers->HasHeader("one"));
   EXPECT_TRUE(sequence.HasNext());
+  EXPECT_FALSE(sequence.IsEmpty());
 
   headers = sequence.Next();
   ASSERT_NE(headers, nullptr);
   EXPECT_TRUE(headers->HasHeader("two"));
   EXPECT_FALSE(sequence.HasNext());
+  EXPECT_FALSE(sequence.IsEmpty());
 
   EXPECT_EQ(sequence.Next(), nullptr);
 }
@@ -49,15 +54,18 @@
   headers_one->AppendHeader("one", "fish");
   sequence.Append(std::move(headers_one));
   EXPECT_TRUE(sequence.HasNext());
+  EXPECT_FALSE(sequence.IsEmpty());
 
   auto headers_two = std::make_unique<BalsaHeaders>();
   headers_two->AppendHeader("two", "fish");
   sequence.Append(std::move(headers_two));
   EXPECT_TRUE(sequence.HasNext());
+  EXPECT_FALSE(sequence.IsEmpty());
 
   sequence.Clear();
   EXPECT_FALSE(sequence.HasNext());
   EXPECT_EQ(sequence.Next(), nullptr);
+  EXPECT_TRUE(sequence.IsEmpty());
 }
 
 TEST(BalsaHeadersSequenceTest, PeekNext) {