blob: 5c2c43f75f0823e89a6e7d8b3792de2e983b120a [file] [log] [blame]
#ifndef QUICHE_BALSA_BALSA_HEADERS_SEQUENCE_H_
#define QUICHE_BALSA_BALSA_HEADERS_SEQUENCE_H_
#include <cstddef>
#include <memory>
#include "absl/container/inlined_vector.h"
#include "quiche/balsa/balsa_headers.h"
#include "quiche/common/platform/api/quiche_export.h"
namespace quiche {
// Represents a sequence of BalsaHeaders. The sequence owns each BalsaHeaders,
// and the user asks for pointers to successive BalsaHeaders in the sequence.
class QUICHE_EXPORT BalsaHeadersSequence {
public:
// Appends `headers` to the end of the sequence.
void Append(std::unique_ptr<BalsaHeaders> headers);
// Returns true if there is a BalsaHeaders that has not yet been returned from
// `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();
// Similar to `Next()` but does not advance the sequence.
// TODO(b/68801833): Consider removing after full refactoring is in place.
BalsaHeaders* PeekNext();
// Clears the sequence. Any previously returned BalsaHeaders become invalid.
void Clear();
private:
// Typically at most two interim responses: an optional 100 Continue and an
// optional 103 Early Hints.
absl::InlinedVector<std::unique_ptr<BalsaHeaders>, 2> sequence_;
// The index of the next entry in the sequence.
size_t next_ = 0;
};
} // namespace quiche
#endif // QUICHE_BALSA_BALSA_HEADERS_SEQUENCE_H_