Add Visit method to structured-headers Item type This allows callers to inspect the underlying values without switching on the type, and also allows the operator== definition to be defaulted due to the removal of the friend declaration. PiperOrigin-RevId: 988314982
diff --git a/quiche/common/structured_headers.cc b/quiche/common/structured_headers.cc index bc7f54c..b209e37 100644 --- a/quiche/common/structured_headers.cc +++ b/quiche/common/structured_headers.cc
@@ -879,11 +879,7 @@ bool* Item::GetIfBoolean() { return std::get_if<bool>(&value_); } -// Not defaulted to work around -// https://github.com/llvm/llvm-project/issues/132249 in older Clang versions. -bool operator==(const Item& lhs, const Item& rhs) { - return lhs.value_ == rhs.value_; -} +bool operator==(const Item&, const Item&) = default; ParameterizedItem::ParameterizedItem() = default; ParameterizedItem::ParameterizedItem(const ParameterizedItem&) = default; @@ -1112,8 +1108,7 @@ : value_(ByteSequence(value)) {} ItemView::ItemView(const Item& value) - : value_(std::visit([](const auto& value) { return Variant(value); }, - value.value_)) {} + : value_(value.Visit([](const auto& value) { return Variant(value); })) {} } // namespace structured_headers } // namespace quiche
diff --git a/quiche/common/structured_headers.h b/quiche/common/structured_headers.h index 8e88eb7..95cf71f 100644 --- a/quiche/common/structured_headers.h +++ b/quiche/common/structured_headers.h
@@ -86,6 +86,18 @@ }; static constexpr byte_sequence_t byte_sequence{}; + struct Token { + std::string value; + + friend bool operator==(const Token&, const Token&) = default; + }; + + struct ByteSequence { + std::string value; + + friend bool operator==(const ByteSequence&, const ByteSequence&) = default; + }; + Item(); explicit Item(int64_t value); explicit Item(double value); @@ -177,22 +189,17 @@ ItemType Type() const { return static_cast<ItemType>(value_.index()); } + template <typename Visitor> + auto Visit(Visitor&& visitor) const { + return std::visit(std::forward<Visitor>(visitor), value_); + } + + template <typename Visitor> + auto Visit(Visitor&& visitor) { + return std::visit(std::forward<Visitor>(visitor), value_); + } + private: - friend class ItemView; - - // Wrapper types to permit simplified use of `std::visit`. - struct Token { - std::string value; - - friend bool operator==(const Token&, const Token&) = default; - }; - - struct ByteSequence { - std::string value; - - friend bool operator==(const ByteSequence&, const ByteSequence&) = default; - }; - std::variant<std::monostate, int64_t, double, std::string, Token, ByteSequence, bool> value_;