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