Add Visit method to ParameterizedMember This is done despite the continued existence of std::monostate in the underlying std::variant because it is infeasible to remove the default constructor as long as Dictionary has its operator[](absl::string_view) method, and in any case, Visit will still work even if std::monostate is removed. PiperOrigin-RevId: 986809570
diff --git a/quiche/common/structured_headers.cc b/quiche/common/structured_headers.cc index 7567388..bc7f54c 100644 --- a/quiche/common/structured_headers.cc +++ b/quiche/common/structured_headers.cc
@@ -730,16 +730,14 @@ [[nodiscard]] bool WriteParameterizedMember( const ParameterizedMember& value) { // Serializes a parameterized member ([RFC8941] 4.1.1). - return std::visit( - absl::Overload{ - [&](const ParameterizedItem& value) { return WriteItem(value); }, - [&](const InnerList& value) { return WriteInnerList(value); }, - [](std::monostate) { - QUICHE_CHECK(false); - return false; - }, + return value.Visit(absl::Overload{ + [&](const ParameterizedItem& value) { return WriteItem(value); }, + [&](const InnerList& value) { return WriteInnerList(value); }, + [](std::monostate) { + QUICHE_CHECK(false); + return false; }, - value.value_); + }); } [[nodiscard]] bool WriteInnerList(const InnerList& value) { @@ -963,12 +961,8 @@ return std::get_if<InnerList>(&value_); } -// Not defaulted to work around -// https://github.com/llvm/llvm-project/issues/132249 in older Clang versions. -bool operator==(const ParameterizedMember& lhs, - const ParameterizedMember& rhs) { - return lhs.value_ == rhs.value_; -} +bool operator==(const ParameterizedMember&, + const ParameterizedMember&) = default; ParameterisedIdentifier::ParameterisedIdentifier() = default; ParameterisedIdentifier::ParameterisedIdentifier(
diff --git a/quiche/common/structured_headers.h b/quiche/common/structured_headers.h index f8503c4..8e88eb7 100644 --- a/quiche/common/structured_headers.h +++ b/quiche/common/structured_headers.h
@@ -308,6 +308,16 @@ const InnerList* GetIfInnerList() const ABSL_ATTRIBUTE_LIFETIME_BOUND; InnerList* GetIfInnerList() ABSL_ATTRIBUTE_LIFETIME_BOUND; + 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_); + } + QUICHE_EXPORT friend bool operator==(const ParameterizedMember&, const ParameterizedMember&); @@ -320,10 +330,6 @@ ParameterizedMember(); private: - friend class StructuredHeaderSerializer; - - // TODO(apaseltiner): Remove `std::monostate` once all uses of the default - // constructor are gone, and then add a public `Visit` method. std::variant<std::monostate, ParameterizedItem, InnerList> value_; };