diff --git a/common/BUILD b/common/BUILD index ab1d389a8..b2c1d1f84 100644 --- a/common/BUILD +++ b/common/BUILD @@ -830,6 +830,7 @@ cc_library( "@com_google_absl//absl/strings:string_view", "@com_google_absl//absl/time", "@com_google_absl//absl/types:optional", + "@com_google_absl//absl/types:optional_ref", "@com_google_absl//absl/types:source_location", "@com_google_absl//absl/types:span", "@com_google_absl//absl/types:variant", @@ -976,9 +977,7 @@ cc_library( hdrs = ["optional_ref.h"], deps = [ "@com_google_absl//absl/base:core_headers", - "@com_google_absl//absl/base:nullability", - "@com_google_absl//absl/types:optional", - "@com_google_absl//absl/utility", + "@com_google_absl//absl/types:optional_ref", ], ) diff --git a/common/optional_ref.h b/common/optional_ref.h index c7ba580fc..bc715b8f8 100644 --- a/common/optional_ref.h +++ b/common/optional_ref.h @@ -15,15 +15,11 @@ #ifndef THIRD_PARTY_CEL_CPP_OPTIONAL_REF_H_ #define THIRD_PARTY_CEL_CPP_OPTIONAL_REF_H_ -#include +#include #include -#include "absl/base/attributes.h" #include "absl/base/macros.h" -#include "absl/base/nullability.h" -#include "absl/base/optimization.h" -#include "absl/types/optional.h" -#include "absl/utility/utility.h" +#include "absl/types/optional_ref.h" namespace cel { @@ -31,128 +27,22 @@ namespace cel { // owning the underlying value, it retains a reference to the value it accepts // in its constructor. template -class optional_ref final { - public: - static_assert(!std::is_reference_v, "T must not be a reference."); - static_assert(!std::is_same_v>, - "optional_ref is not allowed."); - static_assert(!std::is_same_v>, - "optional_ref is not allowed."); - - using value_type = T; - - optional_ref() = default; - - // NOLINTNEXTLINE(google-explicit-constructor) - constexpr optional_ref(absl::nullopt_t) : optional_ref() {} - - // NOLINTNEXTLINE(google-explicit-constructor) - constexpr optional_ref(T& value ABSL_ATTRIBUTE_LIFETIME_BOUND) - : value_(std::addressof(value)) {} - - template < - typename U, - typename = std::enable_if_t, std::is_same, std::decay_t>>>> - // NOLINTNEXTLINE(google-explicit-constructor) - constexpr optional_ref( - const absl::optional& value ABSL_ATTRIBUTE_LIFETIME_BOUND) - : value_(value.has_value() ? std::addressof(*value) : nullptr) {} - - template , std::decay_t>>> - // NOLINTNEXTLINE(google-explicit-constructor) - constexpr optional_ref(absl::optional& value ABSL_ATTRIBUTE_LIFETIME_BOUND) - : value_(value.has_value() ? std::addressof(*value) : nullptr) {} - - template < - typename U, - typename = std::enable_if_t>, - std::is_convertible, std::add_pointer_t>>>> - // NOLINTNEXTLINE(google-explicit-constructor) - constexpr optional_ref(const optional_ref& other) : value_(other.value_) {} - - optional_ref(const optional_ref&) = default; - - optional_ref& operator=(const optional_ref&) = delete; - - constexpr bool has_value() const { return value_ != nullptr; } - - constexpr explicit operator bool() const { return has_value(); } - - constexpr T& value() const { - return ABSL_PREDICT_TRUE(has_value()) - ? *value_ - // Replicate the same error logic as in `absl::optional`'s - // `value()`. It either throws an exception or aborts the - // program. We intentionally ignore the return value of - // the constructed optional's value as we only need to run - // the code for error checking. - : ((void)absl::optional().value(), *value_); - } - - constexpr T& operator*() const { - ABSL_ASSERT(has_value()); - return *value_; - } - - constexpr T* absl_nonnull operator->() const { - ABSL_ASSERT(has_value()); - return value_; - } - - private: - template - friend class optional_ref; - - T* const value_ = nullptr; -}; - -template -optional_ref(const T&) -> optional_ref; - -template -optional_ref(T&) -> optional_ref; - -template -optional_ref(const absl::optional&) -> optional_ref; - -template -optional_ref(absl::optional&) -> optional_ref; - -template -constexpr bool operator==(const optional_ref& lhs, absl::nullopt_t) { - return !lhs.has_value(); -} - -template -constexpr bool operator==(absl::nullopt_t, const optional_ref& rhs) { - return !rhs.has_value(); -} - -template -constexpr bool operator!=(const optional_ref& lhs, absl::nullopt_t) { - return !operator==(lhs, absl::nullopt); -} - -template -constexpr bool operator!=(absl::nullopt_t, const optional_ref& rhs) { - return !operator==(absl::nullopt, rhs); -} +using optional_ref ABSL_DEPRECATE_AND_INLINE() = absl::optional_ref; namespace common_internal { template -absl::optional> AsOptional(optional_ref ref) { - if (ref) { +[[nodiscard]] +std::optional> AsOptional(absl::optional_ref ref) { + if (ref.has_value()) { return *ref; } - return absl::nullopt; + return std::nullopt; } template -absl::optional AsOptional(absl::optional opt) { +[[nodiscard]] +std::optional AsOptional(std::optional opt) { return opt; } diff --git a/common/value.cc b/common/value.cc index 1656d4857..98c589b2a 100644 --- a/common/value.cc +++ b/common/value.cc @@ -40,11 +40,11 @@ #include "absl/strings/string_view.h" #include "absl/time/time.h" #include "absl/types/optional.h" +#include "absl/types/optional_ref.h" #include "absl/types/source_location.h" #include "absl/types/variant.h" #include "common/allocator.h" #include "common/memory.h" -#include "common/optional_ref.h" #include "common/type.h" #include "common/value_kind.h" #include "common/values/list_value_builder.h" @@ -2008,7 +2008,7 @@ Value Value::WrapMapFieldValueUnsafe( message_factory, arena); } -optional_ref Value::AsBytes() const& { +absl::optional_ref Value::AsBytes() const& { if (const auto* alternative = variant_.As(); alternative != nullptr) { return *alternative; @@ -2039,7 +2039,7 @@ absl::optional Value::AsDuration() const { return std::nullopt; } -optional_ref Value::AsError() const& { +absl::optional_ref Value::AsError() const& { if (const auto* alternative = variant_.As(); alternative != nullptr) { return *alternative; @@ -2166,7 +2166,7 @@ absl::optional Value::AsNull() const { return std::nullopt; } -optional_ref Value::AsOpaque() const& { +absl::optional_ref Value::AsOpaque() const& { if (const auto* alternative = variant_.As(); alternative != nullptr) { return *alternative; @@ -2181,7 +2181,7 @@ absl::optional Value::AsOpaque() && { return std::nullopt; } -optional_ref Value::AsOptional() const& { +absl::optional_ref Value::AsOptional() const& { if (const auto* alternative = variant_.As(); alternative != nullptr && alternative->IsOptional()) { return static_cast(*alternative); @@ -2197,7 +2197,7 @@ absl::optional Value::AsOptional() && { return std::nullopt; } -optional_ref Value::AsParsedJsonList() const& { +absl::optional_ref Value::AsParsedJsonList() const& { if (const auto* alternative = variant_.As(); alternative != nullptr) { return *alternative; @@ -2213,7 +2213,7 @@ absl::optional Value::AsParsedJsonList() && { return std::nullopt; } -optional_ref Value::AsParsedJsonMap() const& { +absl::optional_ref Value::AsParsedJsonMap() const& { if (const auto* alternative = variant_.As(); alternative != nullptr) { return *alternative; @@ -2229,7 +2229,7 @@ absl::optional Value::AsParsedJsonMap() && { return std::nullopt; } -optional_ref Value::AsCustomList() const& { +absl::optional_ref Value::AsCustomList() const& { if (const auto* alternative = variant_.As(); alternative != nullptr) { return *alternative; @@ -2245,7 +2245,7 @@ absl::optional Value::AsCustomList() && { return std::nullopt; } -optional_ref Value::AsCustomMap() const& { +absl::optional_ref Value::AsCustomMap() const& { if (const auto* alternative = variant_.As(); alternative != nullptr) { return *alternative; @@ -2261,7 +2261,7 @@ absl::optional Value::AsCustomMap() && { return std::nullopt; } -optional_ref Value::AsParsedMapField() const& { +absl::optional_ref Value::AsParsedMapField() const& { if (const auto* alternative = variant_.As(); alternative != nullptr) { return *alternative; @@ -2277,7 +2277,7 @@ absl::optional Value::AsParsedMapField() && { return std::nullopt; } -optional_ref Value::AsParsedMessage() const& { +absl::optional_ref Value::AsParsedMessage() const& { if (const auto* alternative = variant_.As(); alternative != nullptr) { return *alternative; @@ -2293,8 +2293,8 @@ absl::optional Value::AsParsedMessage() && { return std::nullopt; } -optional_ref Value::AsParsedRepeatedField() - const& { +absl::optional_ref +Value::AsParsedRepeatedField() const& { if (const auto* alternative = variant_.As(); alternative != nullptr) { return *alternative; @@ -2310,7 +2310,7 @@ absl::optional Value::AsParsedRepeatedField() && { return std::nullopt; } -optional_ref Value::AsCustomStruct() const& { +absl::optional_ref Value::AsCustomStruct() const& { if (const auto* alternative = variant_.As(); alternative != nullptr) { return *alternative; @@ -2326,7 +2326,7 @@ absl::optional Value::AsCustomStruct() && { return std::nullopt; } -optional_ref Value::AsString() const& { +absl::optional_ref Value::AsString() const& { if (const auto* alternative = variant_.As(); alternative != nullptr) { return *alternative; @@ -2382,7 +2382,7 @@ absl::optional Value::AsTimestamp() const { return std::nullopt; } -optional_ref Value::AsType() const& { +absl::optional_ref Value::AsType() const& { if (const auto* alternative = variant_.As(); alternative != nullptr) { return *alternative; @@ -2405,7 +2405,7 @@ absl::optional Value::AsUint() const { return std::nullopt; } -optional_ref Value::AsUnknown() const& { +absl::optional_ref Value::AsUnknown() const& { if (const auto* alternative = variant_.As(); alternative != nullptr) { return *alternative; diff --git a/common/value.h b/common/value.h index 881f8c925..734d13c84 100644 --- a/common/value.h +++ b/common/value.h @@ -32,6 +32,7 @@ #include "absl/status/statusor.h" #include "absl/strings/string_view.h" #include "absl/types/optional.h" +#include "absl/types/optional_ref.h" #include "absl/types/span.h" #include "absl/utility/utility.h" #include "base/attribute.h" @@ -806,10 +807,12 @@ class Value final : private common_internal::ValueMixin { // Performs a checked cast from a value to a bytes value, // returning a non-empty optional with either a value or reference to the // bytes value. Otherwise an empty optional is returned. - optional_ref AsBytes() & ABSL_ATTRIBUTE_LIFETIME_BOUND { + absl::optional_ref AsBytes() & + ABSL_ATTRIBUTE_LIFETIME_BOUND { return std::as_const(*this).AsBytes(); } - optional_ref AsBytes() const& ABSL_ATTRIBUTE_LIFETIME_BOUND; + absl::optional_ref AsBytes() + const& ABSL_ATTRIBUTE_LIFETIME_BOUND; absl::optional AsBytes() &&; absl::optional AsBytes() const&& { return common_internal::AsOptional(AsBytes()); @@ -828,10 +831,12 @@ class Value final : private common_internal::ValueMixin { // Performs a checked cast from a value to an error value, // returning a non-empty optional with either a value or reference to the // error value. Otherwise an empty optional is returned. - optional_ref AsError() & ABSL_ATTRIBUTE_LIFETIME_BOUND { + absl::optional_ref AsError() & + ABSL_ATTRIBUTE_LIFETIME_BOUND { return std::as_const(*this).AsError(); } - optional_ref AsError() const& ABSL_ATTRIBUTE_LIFETIME_BOUND; + absl::optional_ref AsError() + const& ABSL_ATTRIBUTE_LIFETIME_BOUND; absl::optional AsError() &&; absl::optional AsError() const&& { return common_internal::AsOptional(AsError()); @@ -882,10 +887,11 @@ class Value final : private common_internal::ValueMixin { // Performs a checked cast from a value to an opaque value, // returning a non-empty optional with either a value or reference to the // opaque value. Otherwise an empty optional is returned. - optional_ref AsOpaque() & ABSL_ATTRIBUTE_LIFETIME_BOUND { + absl::optional_ref AsOpaque() & + ABSL_ATTRIBUTE_LIFETIME_BOUND { return std::as_const(*this).AsOpaque(); } - optional_ref AsOpaque() + absl::optional_ref AsOpaque() const& ABSL_ATTRIBUTE_LIFETIME_BOUND; absl::optional AsOpaque() &&; absl::optional AsOpaque() const&& { @@ -895,11 +901,11 @@ class Value final : private common_internal::ValueMixin { // Performs a checked cast from a value to an optional value, // returning a non-empty optional with either a value or reference to the // optional value. Otherwise an empty optional is returned. - optional_ref AsOptional() & + absl::optional_ref AsOptional() & ABSL_ATTRIBUTE_LIFETIME_BOUND { return std::as_const(*this).AsOptional(); } - optional_ref AsOptional() + absl::optional_ref AsOptional() const& ABSL_ATTRIBUTE_LIFETIME_BOUND; absl::optional AsOptional() &&; absl::optional AsOptional() const&& { @@ -909,11 +915,11 @@ class Value final : private common_internal::ValueMixin { // Performs a checked cast from a value to a parsed JSON list value, // returning a non-empty optional with either a value or reference to the // parsed message value. Otherwise an empty optional is returned. - optional_ref AsParsedJsonList() & + absl::optional_ref AsParsedJsonList() & ABSL_ATTRIBUTE_LIFETIME_BOUND { return std::as_const(*this).AsParsedJsonList(); } - optional_ref AsParsedJsonList() + absl::optional_ref AsParsedJsonList() const& ABSL_ATTRIBUTE_LIFETIME_BOUND; absl::optional AsParsedJsonList() &&; absl::optional AsParsedJsonList() const&& { @@ -923,11 +929,11 @@ class Value final : private common_internal::ValueMixin { // Performs a checked cast from a value to a parsed JSON map value, // returning a non-empty optional with either a value or reference to the // parsed message value. Otherwise an empty optional is returned. - optional_ref AsParsedJsonMap() & + absl::optional_ref AsParsedJsonMap() & ABSL_ATTRIBUTE_LIFETIME_BOUND { return std::as_const(*this).AsParsedJsonMap(); } - optional_ref AsParsedJsonMap() + absl::optional_ref AsParsedJsonMap() const& ABSL_ATTRIBUTE_LIFETIME_BOUND; absl::optional AsParsedJsonMap() &&; absl::optional AsParsedJsonMap() const&& { @@ -937,11 +943,11 @@ class Value final : private common_internal::ValueMixin { // Performs a checked cast from a value to a custom list value, // returning a non-empty optional with either a value or reference to the // custom list value. Otherwise an empty optional is returned. - optional_ref AsCustomList() & + absl::optional_ref AsCustomList() & ABSL_ATTRIBUTE_LIFETIME_BOUND { return std::as_const(*this).AsCustomList(); } - optional_ref AsCustomList() + absl::optional_ref AsCustomList() const& ABSL_ATTRIBUTE_LIFETIME_BOUND; absl::optional AsCustomList() &&; absl::optional AsCustomList() const&& { @@ -951,11 +957,11 @@ class Value final : private common_internal::ValueMixin { // Performs a checked cast from a value to a custom map value, // returning a non-empty optional with either a value or reference to the // custom map value. Otherwise an empty optional is returned. - optional_ref AsCustomMap() & + absl::optional_ref AsCustomMap() & ABSL_ATTRIBUTE_LIFETIME_BOUND { return std::as_const(*this).AsCustomMap(); } - optional_ref AsCustomMap() + absl::optional_ref AsCustomMap() const& ABSL_ATTRIBUTE_LIFETIME_BOUND; absl::optional AsCustomMap() &&; absl::optional AsCustomMap() const&& { @@ -965,11 +971,11 @@ class Value final : private common_internal::ValueMixin { // Performs a checked cast from a value to a parsed map field value, // returning a non-empty optional with either a value or reference to the // parsed map field value. Otherwise an empty optional is returned. - optional_ref AsParsedMapField() & + absl::optional_ref AsParsedMapField() & ABSL_ATTRIBUTE_LIFETIME_BOUND { return std::as_const(*this).AsParsedMapField(); } - optional_ref AsParsedMapField() + absl::optional_ref AsParsedMapField() const& ABSL_ATTRIBUTE_LIFETIME_BOUND; absl::optional AsParsedMapField() &&; absl::optional AsParsedMapField() const&& { @@ -979,11 +985,11 @@ class Value final : private common_internal::ValueMixin { // Performs a checked cast from a value to a parsed message value, // returning a non-empty optional with either a value or reference to the // parsed message value. Otherwise an empty optional is returned. - optional_ref AsParsedMessage() & + absl::optional_ref AsParsedMessage() & ABSL_ATTRIBUTE_LIFETIME_BOUND { return std::as_const(*this).AsParsedMessage(); } - optional_ref AsParsedMessage() + absl::optional_ref AsParsedMessage() const& ABSL_ATTRIBUTE_LIFETIME_BOUND; absl::optional AsParsedMessage() &&; absl::optional AsParsedMessage() const&& { @@ -993,11 +999,11 @@ class Value final : private common_internal::ValueMixin { // Performs a checked cast from a value to a parsed repeated field value, // returning a non-empty optional with either a value or reference to the // parsed repeated field value. Otherwise an empty optional is returned. - optional_ref AsParsedRepeatedField() & + absl::optional_ref AsParsedRepeatedField() & ABSL_ATTRIBUTE_LIFETIME_BOUND { return std::as_const(*this).AsParsedRepeatedField(); } - optional_ref AsParsedRepeatedField() + absl::optional_ref AsParsedRepeatedField() const& ABSL_ATTRIBUTE_LIFETIME_BOUND; absl::optional AsParsedRepeatedField() &&; absl::optional AsParsedRepeatedField() const&& { @@ -1007,11 +1013,11 @@ class Value final : private common_internal::ValueMixin { // Performs a checked cast from a value to a custom struct value, // returning a non-empty optional with either a value or reference to the // custom struct value. Otherwise an empty optional is returned. - optional_ref AsCustomStruct() & + absl::optional_ref AsCustomStruct() & ABSL_ATTRIBUTE_LIFETIME_BOUND { return std::as_const(*this).AsCustomStruct(); } - optional_ref AsCustomStruct() + absl::optional_ref AsCustomStruct() const& ABSL_ATTRIBUTE_LIFETIME_BOUND; absl::optional AsCustomStruct() &&; absl::optional AsCustomStruct() const&& { @@ -1021,10 +1027,11 @@ class Value final : private common_internal::ValueMixin { // Performs a checked cast from a value to a string value, // returning a non-empty optional with either a value or reference to the // string value. Otherwise an empty optional is returned. - optional_ref AsString() & ABSL_ATTRIBUTE_LIFETIME_BOUND { + absl::optional_ref AsString() & + ABSL_ATTRIBUTE_LIFETIME_BOUND { return std::as_const(*this).AsString(); } - optional_ref AsString() + absl::optional_ref AsString() const& ABSL_ATTRIBUTE_LIFETIME_BOUND; absl::optional AsString() &&; absl::optional AsString() const&& { @@ -1051,10 +1058,11 @@ class Value final : private common_internal::ValueMixin { // Performs a checked cast from a value to a type value, // returning a non-empty optional with either a value or reference to the // type value. Otherwise an empty optional is returned. - optional_ref AsType() & ABSL_ATTRIBUTE_LIFETIME_BOUND { + absl::optional_ref AsType() & ABSL_ATTRIBUTE_LIFETIME_BOUND { return std::as_const(*this).AsType(); } - optional_ref AsType() const& ABSL_ATTRIBUTE_LIFETIME_BOUND; + absl::optional_ref AsType() + const& ABSL_ATTRIBUTE_LIFETIME_BOUND; absl::optional AsType() &&; absl::optional AsType() const&& { return common_internal::AsOptional(AsType()); @@ -1068,10 +1076,11 @@ class Value final : private common_internal::ValueMixin { // Performs a checked cast from a value to an unknown value, // returning a non-empty optional with either a value or reference to the // unknown value. Otherwise an empty optional is returned. - optional_ref AsUnknown() & ABSL_ATTRIBUTE_LIFETIME_BOUND { + absl::optional_ref AsUnknown() & + ABSL_ATTRIBUTE_LIFETIME_BOUND { return std::as_const(*this).AsUnknown(); } - optional_ref AsUnknown() + absl::optional_ref AsUnknown() const& ABSL_ATTRIBUTE_LIFETIME_BOUND; absl::optional AsUnknown() &&; absl::optional AsUnknown() const&& { @@ -1105,13 +1114,13 @@ class Value final : private common_internal::ValueMixin { // `AsBytes()`. template std::enable_if_t, - optional_ref> + absl::optional_ref> As() & ABSL_ATTRIBUTE_LIFETIME_BOUND { return AsBytes(); } template std::enable_if_t, - optional_ref> + absl::optional_ref> As() const& ABSL_ATTRIBUTE_LIFETIME_BOUND { return AsBytes(); } @@ -1180,13 +1189,13 @@ class Value final : private common_internal::ValueMixin { // `AsError()`. template std::enable_if_t, - optional_ref> + absl::optional_ref> As() & ABSL_ATTRIBUTE_LIFETIME_BOUND { return AsError(); } template std::enable_if_t, - optional_ref> + absl::optional_ref> As() const& ABSL_ATTRIBUTE_LIFETIME_BOUND { return AsError(); } @@ -1324,13 +1333,13 @@ class Value final : private common_internal::ValueMixin { // `AsOpaque()`. template std::enable_if_t, - optional_ref> + absl::optional_ref> As() & ABSL_ATTRIBUTE_LIFETIME_BOUND { return AsOpaque(); } template std::enable_if_t, - optional_ref> + absl::optional_ref> As() const& ABSL_ATTRIBUTE_LIFETIME_BOUND { return AsOpaque(); } @@ -1349,13 +1358,13 @@ class Value final : private common_internal::ValueMixin { // `AsOptional()`. template std::enable_if_t, - optional_ref> + absl::optional_ref> As() & ABSL_ATTRIBUTE_LIFETIME_BOUND { return AsOptional(); } template std::enable_if_t, - optional_ref> + absl::optional_ref> As() const& ABSL_ATTRIBUTE_LIFETIME_BOUND { return AsOptional(); } @@ -1376,13 +1385,13 @@ class Value final : private common_internal::ValueMixin { // `AsParsedJsonList()`. template std::enable_if_t, - optional_ref> + absl::optional_ref> As() & ABSL_ATTRIBUTE_LIFETIME_BOUND { return AsParsedJsonList(); } template std::enable_if_t, - optional_ref> + absl::optional_ref> As() const& ABSL_ATTRIBUTE_LIFETIME_BOUND { return AsParsedJsonList(); } @@ -1403,13 +1412,13 @@ class Value final : private common_internal::ValueMixin { // `AsParsedJsonMap()`. template std::enable_if_t, - optional_ref> + absl::optional_ref> As() & ABSL_ATTRIBUTE_LIFETIME_BOUND { return AsParsedJsonMap(); } template std::enable_if_t, - optional_ref> + absl::optional_ref> As() const& ABSL_ATTRIBUTE_LIFETIME_BOUND { return AsParsedJsonMap(); } @@ -1430,13 +1439,13 @@ class Value final : private common_internal::ValueMixin { // `AsCustomList()`. template std::enable_if_t, - optional_ref> + absl::optional_ref> As() & ABSL_ATTRIBUTE_LIFETIME_BOUND { return AsCustomList(); } template std::enable_if_t, - optional_ref> + absl::optional_ref> As() const& ABSL_ATTRIBUTE_LIFETIME_BOUND { return AsCustomList(); } @@ -1457,13 +1466,13 @@ class Value final : private common_internal::ValueMixin { // `AsCustomMap()`. template std::enable_if_t, - optional_ref> + absl::optional_ref> As() & ABSL_ATTRIBUTE_LIFETIME_BOUND { return AsCustomMap(); } template std::enable_if_t, - optional_ref> + absl::optional_ref> As() const& ABSL_ATTRIBUTE_LIFETIME_BOUND { return AsCustomMap(); } @@ -1484,13 +1493,13 @@ class Value final : private common_internal::ValueMixin { // `AsParsedMapField()`. template std::enable_if_t, - optional_ref> + absl::optional_ref> As() & ABSL_ATTRIBUTE_LIFETIME_BOUND { return AsParsedMapField(); } template std::enable_if_t, - optional_ref> + absl::optional_ref> As() const& ABSL_ATTRIBUTE_LIFETIME_BOUND { return AsParsedMapField(); } @@ -1511,13 +1520,13 @@ class Value final : private common_internal::ValueMixin { // `AsParsedMessage()`. template std::enable_if_t, - optional_ref> + absl::optional_ref> As() & ABSL_ATTRIBUTE_LIFETIME_BOUND { return AsParsedMessage(); } template std::enable_if_t, - optional_ref> + absl::optional_ref> As() const& ABSL_ATTRIBUTE_LIFETIME_BOUND { return AsParsedMessage(); } @@ -1538,13 +1547,13 @@ class Value final : private common_internal::ValueMixin { // `AsParsedRepeatedField()`. template std::enable_if_t, - optional_ref> + absl::optional_ref> As() & ABSL_ATTRIBUTE_LIFETIME_BOUND { return AsParsedRepeatedField(); } template std::enable_if_t, - optional_ref> + absl::optional_ref> As() const& ABSL_ATTRIBUTE_LIFETIME_BOUND { return AsParsedRepeatedField(); } @@ -1565,13 +1574,13 @@ class Value final : private common_internal::ValueMixin { // `AsCustomStruct()`. template std::enable_if_t, - optional_ref> + absl::optional_ref> As() & ABSL_ATTRIBUTE_LIFETIME_BOUND { return AsCustomStruct(); } template std::enable_if_t, - optional_ref> + absl::optional_ref> As() const& ABSL_ATTRIBUTE_LIFETIME_BOUND { return AsCustomStruct(); } @@ -1592,13 +1601,13 @@ class Value final : private common_internal::ValueMixin { // `AsString()`. template std::enable_if_t, - optional_ref> + absl::optional_ref> As() & ABSL_ATTRIBUTE_LIFETIME_BOUND { return AsString(); } template std::enable_if_t, - optional_ref> + absl::optional_ref> As() const& ABSL_ATTRIBUTE_LIFETIME_BOUND { return AsString(); } @@ -1667,12 +1676,13 @@ class Value final : private common_internal::ValueMixin { // `AsType()`. template std::enable_if_t, - optional_ref> + absl::optional_ref> As() & ABSL_ATTRIBUTE_LIFETIME_BOUND { return AsType(); } template - std::enable_if_t, optional_ref> + std::enable_if_t, + absl::optional_ref> As() const& ABSL_ATTRIBUTE_LIFETIME_BOUND { return AsType(); } @@ -1714,13 +1724,13 @@ class Value final : private common_internal::ValueMixin { // `AsUnknown()`. template std::enable_if_t, - optional_ref> + absl::optional_ref> As() & ABSL_ATTRIBUTE_LIFETIME_BOUND { return AsUnknown(); } template std::enable_if_t, - optional_ref> + absl::optional_ref> As() const& ABSL_ATTRIBUTE_LIFETIME_BOUND { return AsUnknown(); }