diff --git a/common/legacy_value.cc b/common/legacy_value.cc index 8f273c3b1..28f2e72e3 100644 --- a/common/legacy_value.cc +++ b/common/legacy_value.cc @@ -449,7 +449,7 @@ class CelListValueBuilder final : public ListValueBuilder { absl::Status Add(Value value) override { if (value.Is()) { - return static_cast(std::move(value)).NativeValue(); + return std::move(value).Get().NativeValue(); } CEL_ASSIGN_OR_RETURN(auto legacy_value, LegacyValue(arena_, value)); elements_.push_back(legacy_value); @@ -501,10 +501,10 @@ class CelMapValueBuilder final : public MapValueBuilder { absl::Status Put(Value key, Value value) override { if (key.Is()) { - return static_cast(std::move(key)).NativeValue(); + return std::move(key).Get().NativeValue(); } if (value.Is()) { - return static_cast(std::move(value)).NativeValue(); + return std::move(value).Get().NativeValue(); } CEL_ASSIGN_OR_RETURN(auto legacy_key, LegacyValue(arena_, key)); CEL_ASSIGN_OR_RETURN(auto legacy_value, LegacyValue(arena_, value)); diff --git a/common/list_type_reflector.cc b/common/list_type_reflector.cc index 98b255938..70e88a3a5 100644 --- a/common/list_type_reflector.cc +++ b/common/list_type_reflector.cc @@ -126,7 +126,7 @@ class ListValueBuilderImpl final : public ListValueBuilder { absl::Status Add(Value value) override { if (value.Is()) { - return static_cast(std::move(value)).NativeValue(); + return std::move(value).Get().NativeValue(); } elements_.push_back(std::move(value)); return absl::OkStatus(); diff --git a/common/map_type_reflector.cc b/common/map_type_reflector.cc index 0b1a18b1d..8148cc205 100644 --- a/common/map_type_reflector.cc +++ b/common/map_type_reflector.cc @@ -422,10 +422,10 @@ class MapValueBuilderImpl final : public MapValueBuilder { absl::Status Put(Value key, Value value) override { if (key.Is()) { - return static_cast(std::move(key)).NativeValue(); + return std::move(key).Get().NativeValue(); } if (value.Is()) { - return static_cast(std::move(value)).NativeValue(); + return std::move(value).Get().NativeValue(); } auto inserted = entries_.insert({std::move(key), std::move(value)}).second; if (!inserted) { diff --git a/common/value.cc b/common/value.cc index 3bf3ffb05..d1873e41c 100644 --- a/common/value.cc +++ b/common/value.cc @@ -83,7 +83,7 @@ Type Value::GetRuntimeType() const { case ValueKind::kBytes: return BytesType(); case ValueKind::kStruct: - return static_cast(*this).GetRuntimeType(); + return this->GetStruct().GetRuntimeType(); case ValueKind::kDuration: return DurationType(); case ValueKind::kTimestamp: @@ -99,9 +99,9 @@ Type Value::GetRuntimeType() const { case ValueKind::kError: return ErrorType(); case ValueKind::kOpaque: - return Cast(*this).GetRuntimeType(); + return this->GetOpaque().GetRuntimeType(); default: - return Type(); + return cel::Type(); } } @@ -1190,62 +1190,62 @@ absl::optional Value::AsUnknown() const&& { return absl::nullopt; } -Value::operator BoolValue() const { +BoolValue Value::GetBool() const { ABSL_DCHECK(IsBool()) << *this; return absl::get(variant_); } -Value::operator const BytesValue&() & { +const BytesValue& Value::GetBytes() & { ABSL_DCHECK(IsBytes()) << *this; return absl::get(variant_); } -Value::operator const BytesValue&() const& { +const BytesValue& Value::GetBytes() const& { ABSL_DCHECK(IsBytes()) << *this; return absl::get(variant_); } -Value::operator BytesValue() && { +BytesValue Value::GetBytes() && { ABSL_DCHECK(IsBytes()) << *this; return absl::get(std::move(variant_)); } -Value::operator BytesValue() const&& { +BytesValue Value::GetBytes() const&& { ABSL_DCHECK(IsBytes()) << *this; return absl::get(std::move(variant_)); } -Value::operator DoubleValue() const { +DoubleValue Value::GetDouble() const { ABSL_DCHECK(IsDouble()) << *this; return absl::get(variant_); } -Value::operator DurationValue() const { +DurationValue Value::GetDuration() const { ABSL_DCHECK(IsDuration()) << *this; return absl::get(variant_); } -Value::operator const ErrorValue&() & { +const ErrorValue& Value::GetError() & { ABSL_DCHECK(IsError()) << *this; return absl::get(variant_); } -Value::operator const ErrorValue&() const& { +const ErrorValue& Value::GetError() const& { ABSL_DCHECK(IsError()) << *this; return absl::get(variant_); } -Value::operator ErrorValue() && { +ErrorValue Value::GetError() && { ABSL_DCHECK(IsError()) << *this; return absl::get(std::move(variant_)); } -Value::operator ErrorValue() const&& { +ErrorValue Value::GetError() const&& { ABSL_DCHECK(IsError()) << *this; return absl::get(std::move(variant_)); } -Value::operator IntValue() const { +IntValue Value::GetInt() const { ABSL_DCHECK(IsInt()) << *this; return absl::get(variant_); } @@ -1257,7 +1257,7 @@ Value::operator IntValue() const { ABSL_LOG(FATAL) << absl::bad_variant_access().what() /* Crash OK */ #endif -Value::operator ListValue() & { +ListValue Value::GetList() & { ABSL_DCHECK(IsList()) << *this; if (const auto* alternative = absl::get_if(&variant_); @@ -1280,7 +1280,7 @@ Value::operator ListValue() & { CEL_VALUE_THROW_BAD_VARIANT_ACCESS(); } -Value::operator ListValue() const& { +ListValue Value::GetList() const& { ABSL_DCHECK(IsList()) << *this; if (const auto* alternative = absl::get_if(&variant_); @@ -1303,7 +1303,7 @@ Value::operator ListValue() const& { CEL_VALUE_THROW_BAD_VARIANT_ACCESS(); } -Value::operator ListValue() && { +ListValue Value::GetList() && { ABSL_DCHECK(IsList()) << *this; if (auto* alternative = absl::get_if(&variant_); @@ -1325,7 +1325,7 @@ Value::operator ListValue() && { CEL_VALUE_THROW_BAD_VARIANT_ACCESS(); } -Value::operator ListValue() const&& { +ListValue Value::GetList() const&& { ABSL_DCHECK(IsList()) << *this; if (auto* alternative = absl::get_if(&variant_); @@ -1347,7 +1347,7 @@ Value::operator ListValue() const&& { CEL_VALUE_THROW_BAD_VARIANT_ACCESS(); } -Value::operator MapValue() & { +MapValue Value::GetMap() & { ABSL_DCHECK(IsMap()) << *this; if (const auto* alternative = absl::get_if(&variant_); @@ -1369,7 +1369,7 @@ Value::operator MapValue() & { CEL_VALUE_THROW_BAD_VARIANT_ACCESS(); } -Value::operator MapValue() const& { +MapValue Value::GetMap() const& { ABSL_DCHECK(IsMap()) << *this; if (const auto* alternative = absl::get_if(&variant_); @@ -1391,7 +1391,7 @@ Value::operator MapValue() const& { CEL_VALUE_THROW_BAD_VARIANT_ACCESS(); } -Value::operator MapValue() && { +MapValue Value::GetMap() && { ABSL_DCHECK(IsMap()) << *this; if (auto* alternative = absl::get_if(&variant_); @@ -1413,7 +1413,7 @@ Value::operator MapValue() && { CEL_VALUE_THROW_BAD_VARIANT_ACCESS(); } -Value::operator MapValue() const&& { +MapValue Value::GetMap() const&& { ABSL_DCHECK(IsMap()) << *this; if (auto* alternative = absl::get_if(&variant_); @@ -1435,114 +1435,154 @@ Value::operator MapValue() const&& { CEL_VALUE_THROW_BAD_VARIANT_ACCESS(); } -Value::operator MessageValue() & { +MessageValue Value::GetMessage() & { ABSL_DCHECK(IsMessage()) << *this; return absl::get(variant_); } -Value::operator MessageValue() const& { +MessageValue Value::GetMessage() const& { ABSL_DCHECK(IsMessage()) << *this; return absl::get(variant_); } -Value::operator MessageValue() && { +MessageValue Value::GetMessage() && { ABSL_DCHECK(IsMessage()) << *this; return absl::get(std::move(variant_)); } -Value::operator MessageValue() const&& { +MessageValue Value::GetMessage() const&& { ABSL_DCHECK(IsMessage()) << *this; return absl::get(std::move(variant_)); } -Value::operator NullValue() const { +NullValue Value::GetNull() const { ABSL_DCHECK(IsNull()) << *this; return absl::get(variant_); } -Value::operator const OpaqueValue&() & { +const OpaqueValue& Value::GetOpaque() & { ABSL_DCHECK(IsOpaque()) << *this; return absl::get(variant_); } -Value::operator const OpaqueValue&() const& { +const OpaqueValue& Value::GetOpaque() const& { ABSL_DCHECK(IsOpaque()) << *this; return absl::get(variant_); } -Value::operator OpaqueValue() && { +OpaqueValue Value::GetOpaque() && { ABSL_DCHECK(IsOpaque()) << *this; return absl::get(std::move(variant_)); } -Value::operator OpaqueValue() const&& { +OpaqueValue Value::GetOpaque() const&& { ABSL_DCHECK(IsOpaque()) << *this; return absl::get(std::move(variant_)); } -Value::operator const OptionalValue&() & { +const OptionalValue& Value::GetOptional() & { ABSL_DCHECK(IsOptional()) << *this; return static_cast(absl::get(variant_)); } -Value::operator const OptionalValue&() const& { +const OptionalValue& Value::GetOptional() const& { ABSL_DCHECK(IsOptional()) << *this; return static_cast(absl::get(variant_)); } -Value::operator OptionalValue() && { +OptionalValue Value::GetOptional() && { ABSL_DCHECK(IsOptional()) << *this; return static_cast( absl::get(std::move(variant_))); } -Value::operator OptionalValue() const&& { +OptionalValue Value::GetOptional() const&& { ABSL_DCHECK(IsOptional()) << *this; return static_cast( absl::get(std::move(variant_))); } -Value::operator const ParsedMessageValue&() & { - ABSL_DCHECK(IsMessage()) << *this; +const ParsedJsonListValue& Value::GetParsedJsonList() & { + ABSL_DCHECK(IsParsedJsonList()) << *this; + return absl::get(variant_); +} + +const ParsedJsonListValue& Value::GetParsedJsonList() const& { + ABSL_DCHECK(IsParsedJsonList()) << *this; + return absl::get(variant_); +} + +ParsedJsonListValue Value::GetParsedJsonList() && { + ABSL_DCHECK(IsParsedJsonList()) << *this; + return absl::get(std::move(variant_)); +} + +ParsedJsonListValue Value::GetParsedJsonList() const&& { + ABSL_DCHECK(IsParsedJsonList()) << *this; + return absl::get(std::move(variant_)); +} + +const ParsedJsonMapValue& Value::GetParsedJsonMap() & { + ABSL_DCHECK(IsParsedJsonMap()) << *this; + return absl::get(variant_); +} + +const ParsedJsonMapValue& Value::GetParsedJsonMap() const& { + ABSL_DCHECK(IsParsedJsonMap()) << *this; + return absl::get(variant_); +} + +ParsedJsonMapValue Value::GetParsedJsonMap() && { + ABSL_DCHECK(IsParsedJsonMap()) << *this; + return absl::get(std::move(variant_)); +} + +ParsedJsonMapValue Value::GetParsedJsonMap() const&& { + ABSL_DCHECK(IsParsedJsonMap()) << *this; + return absl::get(std::move(variant_)); +} + +const ParsedMessageValue& Value::GetParsedMessage() & { + ABSL_DCHECK(IsParsedMessage()) << *this; return absl::get(variant_); } -Value::operator const ParsedMessageValue&() const& { - ABSL_DCHECK(IsMessage()) << *this; +const ParsedMessageValue& Value::GetParsedMessage() const& { + ABSL_DCHECK(IsParsedMessage()) << *this; return absl::get(variant_); } -Value::operator ParsedMessageValue() && { - ABSL_DCHECK(IsMessage()) << *this; +ParsedMessageValue Value::GetParsedMessage() && { + ABSL_DCHECK(IsParsedMessage()) << *this; return absl::get(std::move(variant_)); } -Value::operator ParsedMessageValue() const&& { - ABSL_DCHECK(IsMessage()) << *this; +ParsedMessageValue Value::GetParsedMessage() const&& { + ABSL_DCHECK(IsParsedMessage()) << *this; return absl::get(std::move(variant_)); } -Value::operator const StringValue&() & { +const StringValue& Value::GetString() & { ABSL_DCHECK(IsString()) << *this; return absl::get(variant_); } -Value::operator const StringValue&() const& { +const StringValue& Value::GetString() const& { ABSL_DCHECK(IsString()) << *this; return absl::get(variant_); } -Value::operator StringValue() && { +StringValue Value::GetString() && { ABSL_DCHECK(IsString()) << *this; return absl::get(std::move(variant_)); } -Value::operator StringValue() const&& { +StringValue Value::GetString() const&& { ABSL_DCHECK(IsString()) << *this; return absl::get(std::move(variant_)); } -Value::operator StructValue() & { +StructValue Value::GetStruct() & { ABSL_DCHECK(IsStruct()) << *this; if (const auto* alternative = absl::get_if(&variant_); @@ -1560,7 +1600,7 @@ Value::operator StructValue() & { CEL_VALUE_THROW_BAD_VARIANT_ACCESS(); } -Value::operator StructValue() const& { +StructValue Value::GetStruct() const& { ABSL_DCHECK(IsStruct()) << *this; if (const auto* alternative = absl::get_if(&variant_); @@ -1578,7 +1618,7 @@ Value::operator StructValue() const& { CEL_VALUE_THROW_BAD_VARIANT_ACCESS(); } -Value::operator StructValue() && { +StructValue Value::GetStruct() && { ABSL_DCHECK(IsStruct()) << *this; if (auto* alternative = absl::get_if(&variant_); @@ -1596,7 +1636,7 @@ Value::operator StructValue() && { CEL_VALUE_THROW_BAD_VARIANT_ACCESS(); } -Value::operator StructValue() const&& { +StructValue Value::GetStruct() const&& { ABSL_DCHECK(IsStruct()) << *this; if (auto* alternative = absl::get_if(&variant_); @@ -1614,52 +1654,52 @@ Value::operator StructValue() const&& { CEL_VALUE_THROW_BAD_VARIANT_ACCESS(); } -Value::operator TimestampValue() const { +TimestampValue Value::GetTimestamp() const { ABSL_DCHECK(IsTimestamp()) << *this; return absl::get(variant_); } -Value::operator const TypeValue&() & { +const TypeValue& Value::GetType() & { ABSL_DCHECK(IsType()) << *this; return absl::get(variant_); } -Value::operator const TypeValue&() const& { +const TypeValue& Value::GetType() const& { ABSL_DCHECK(IsType()) << *this; return absl::get(variant_); } -Value::operator TypeValue() && { +TypeValue Value::GetType() && { ABSL_DCHECK(IsType()) << *this; return absl::get(std::move(variant_)); } -Value::operator TypeValue() const&& { +TypeValue Value::GetType() const&& { ABSL_DCHECK(IsType()) << *this; return absl::get(std::move(variant_)); } -Value::operator UintValue() const { +UintValue Value::GetUint() const { ABSL_DCHECK(IsUint()) << *this; return absl::get(variant_); } -Value::operator const UnknownValue&() & { +const UnknownValue& Value::GetUnknown() & { ABSL_DCHECK(IsUnknown()) << *this; return absl::get(variant_); } -Value::operator const UnknownValue&() const& { +const UnknownValue& Value::GetUnknown() const& { ABSL_DCHECK(IsUnknown()) << *this; return absl::get(variant_); } -Value::operator UnknownValue() && { +UnknownValue Value::GetUnknown() && { ABSL_DCHECK(IsUnknown()) << *this; return absl::get(std::move(variant_)); } -Value::operator UnknownValue() const&& { +UnknownValue Value::GetUnknown() const&& { ABSL_DCHECK(IsUnknown()) << *this; return absl::get(std::move(variant_)); } diff --git a/common/value.h b/common/value.h index c4a4745c1..1be9a00e0 100644 --- a/common/value.h +++ b/common/value.h @@ -421,6 +421,20 @@ class Value final { return false; } + // Returns `true` if this value is an instance of a parsed JSON list value. If + // `true` is returned, it is implied that `IsList()` would also return + // true. + bool IsParsedJsonList() const { + return absl::holds_alternative(variant_); + } + + // Returns `true` if this value is an instance of a parsed JSON map value. If + // `true` is returned, it is implied that `IsMap()` would also return + // true. + bool IsParsedJsonMap() const { + return absl::holds_alternative(variant_); + } + // Returns `true` if this value is an instance of a parsed message value. If // `true` is returned, it is implied that `IsMessage()` would also return // true. @@ -1201,134 +1215,591 @@ class Value final { // Performs an unchecked cast from a value to a bool value. In // debug builds a best effort is made to crash. If `IsBool()` would return // false, calling this method is undefined behavior. - explicit operator BoolValue() const; + BoolValue GetBool() const; // Performs an unchecked cast from a value to a bytes value. In // debug builds a best effort is made to crash. If `IsBytes()` would return // false, calling this method is undefined behavior. - explicit operator const BytesValue&() & ABSL_ATTRIBUTE_LIFETIME_BOUND; - explicit operator const BytesValue&() const& ABSL_ATTRIBUTE_LIFETIME_BOUND; - explicit operator BytesValue() &&; - explicit operator BytesValue() const&&; + const BytesValue& GetBytes() & ABSL_ATTRIBUTE_LIFETIME_BOUND; + const BytesValue& GetBytes() const& ABSL_ATTRIBUTE_LIFETIME_BOUND; + BytesValue GetBytes() &&; + BytesValue GetBytes() const&&; // Performs an unchecked cast from a value to a double value. In // debug builds a best effort is made to crash. If `IsDouble()` would return // false, calling this method is undefined behavior. - explicit operator DoubleValue() const; + DoubleValue GetDouble() const; // Performs an unchecked cast from a value to a duration value. In // debug builds a best effort is made to crash. If `IsDuration()` would return // false, calling this method is undefined behavior. - explicit operator DurationValue() const; + DurationValue GetDuration() const; // Performs an unchecked cast from a value to an error value. In // debug builds a best effort is made to crash. If `IsError()` would return // false, calling this method is undefined behavior. - explicit operator const ErrorValue&() & ABSL_ATTRIBUTE_LIFETIME_BOUND; - explicit operator const ErrorValue&() const& ABSL_ATTRIBUTE_LIFETIME_BOUND; - explicit operator ErrorValue() &&; - explicit operator ErrorValue() const&&; + const ErrorValue& GetError() & ABSL_ATTRIBUTE_LIFETIME_BOUND; + const ErrorValue& GetError() const& ABSL_ATTRIBUTE_LIFETIME_BOUND; + ErrorValue GetError() &&; + ErrorValue GetError() const&&; // Performs an unchecked cast from a value to an int value. In // debug builds a best effort is made to crash. If `IsInt()` would return // false, calling this method is undefined behavior. - explicit operator IntValue() const; + IntValue GetInt() const; // Performs an unchecked cast from a value to a list value. In // debug builds a best effort is made to crash. If `IsList()` would return // false, calling this method is undefined behavior. - explicit operator ListValue() &; - explicit operator ListValue() const&; - explicit operator ListValue() &&; - explicit operator ListValue() const&&; + ListValue GetList() &; + ListValue GetList() const&; + ListValue GetList() &&; + ListValue GetList() const&&; // Performs an unchecked cast from a value to a map value. In // debug builds a best effort is made to crash. If `IsMap()` would return // false, calling this method is undefined behavior. - explicit operator MapValue() &; - explicit operator MapValue() const&; - explicit operator MapValue() &&; - explicit operator MapValue() const&&; + MapValue GetMap() &; + MapValue GetMap() const&; + MapValue GetMap() &&; + MapValue GetMap() const&&; // Performs an unchecked cast from a value to a message value. In // debug builds a best effort is made to crash. If `IsMessage()` would return // false, calling this method is undefined behavior. - explicit operator MessageValue() &; - explicit operator MessageValue() const&; - explicit operator MessageValue() &&; - explicit operator MessageValue() const&&; + MessageValue GetMessage() &; + MessageValue GetMessage() const&; + MessageValue GetMessage() &&; + MessageValue GetMessage() const&&; // Performs an unchecked cast from a value to a null value. In // debug builds a best effort is made to crash. If `IsNull()` would return // false, calling this method is undefined behavior. - explicit operator NullValue() const; + NullValue GetNull() const; // Performs an unchecked cast from a value to an opaque value. In // debug builds a best effort is made to crash. If `IsOpaque()` would return // false, calling this method is undefined behavior. - explicit operator const OpaqueValue&() & ABSL_ATTRIBUTE_LIFETIME_BOUND; - explicit operator const OpaqueValue&() const& ABSL_ATTRIBUTE_LIFETIME_BOUND; - explicit operator OpaqueValue() &&; - explicit operator OpaqueValue() const&&; + const OpaqueValue& GetOpaque() & ABSL_ATTRIBUTE_LIFETIME_BOUND; + const OpaqueValue& GetOpaque() const& ABSL_ATTRIBUTE_LIFETIME_BOUND; + OpaqueValue GetOpaque() &&; + OpaqueValue GetOpaque() const&&; // Performs an unchecked cast from a value to an optional value. In // debug builds a best effort is made to crash. If `IsOptional()` would return // false, calling this method is undefined behavior. - explicit operator const OptionalValue&() & ABSL_ATTRIBUTE_LIFETIME_BOUND; - explicit operator const OptionalValue&() const& ABSL_ATTRIBUTE_LIFETIME_BOUND; - explicit operator OptionalValue() &&; - explicit operator OptionalValue() const&&; + const OptionalValue& GetOptional() & ABSL_ATTRIBUTE_LIFETIME_BOUND; + const OptionalValue& GetOptional() const& ABSL_ATTRIBUTE_LIFETIME_BOUND; + OptionalValue GetOptional() &&; + OptionalValue GetOptional() const&&; + + // Performs an unchecked cast from a value to a parsed message value. In + // debug builds a best effort is made to crash. If `IsParsedJsonList()` would + // return false, calling this method is undefined behavior. + const ParsedJsonListValue& GetParsedJsonList() & + ABSL_ATTRIBUTE_LIFETIME_BOUND; + const ParsedJsonListValue& GetParsedJsonList() + const& ABSL_ATTRIBUTE_LIFETIME_BOUND; + ParsedJsonListValue GetParsedJsonList() &&; + ParsedJsonListValue GetParsedJsonList() const&&; + + // Performs an unchecked cast from a value to a parsed message value. In + // debug builds a best effort is made to crash. If `IsParsedJsonMap()` would + // return false, calling this method is undefined behavior. + const ParsedJsonMapValue& GetParsedJsonMap() & ABSL_ATTRIBUTE_LIFETIME_BOUND; + const ParsedJsonMapValue& GetParsedJsonMap() + const& ABSL_ATTRIBUTE_LIFETIME_BOUND; + ParsedJsonMapValue GetParsedJsonMap() &&; + ParsedJsonMapValue GetParsedJsonMap() const&&; // Performs an unchecked cast from a value to a parsed message value. In // debug builds a best effort is made to crash. If `IsParsedMessage()` would // return false, calling this method is undefined behavior. - explicit operator const ParsedMessageValue&() & ABSL_ATTRIBUTE_LIFETIME_BOUND; - explicit operator const ParsedMessageValue&() + const ParsedMessageValue& GetParsedMessage() & ABSL_ATTRIBUTE_LIFETIME_BOUND; + const ParsedMessageValue& GetParsedMessage() const& ABSL_ATTRIBUTE_LIFETIME_BOUND; - explicit operator ParsedMessageValue() &&; - explicit operator ParsedMessageValue() const&&; + ParsedMessageValue GetParsedMessage() &&; + ParsedMessageValue GetParsedMessage() const&&; // Performs an unchecked cast from a value to a string value. In // debug builds a best effort is made to crash. If `IsString()` would return // false, calling this method is undefined behavior. - explicit operator const StringValue&() & ABSL_ATTRIBUTE_LIFETIME_BOUND; - explicit operator const StringValue&() const& ABSL_ATTRIBUTE_LIFETIME_BOUND; - explicit operator StringValue() &&; - explicit operator StringValue() const&&; + const StringValue& GetString() & ABSL_ATTRIBUTE_LIFETIME_BOUND; + const StringValue& GetString() const& ABSL_ATTRIBUTE_LIFETIME_BOUND; + StringValue GetString() &&; + StringValue GetString() const&&; // Performs an unchecked cast from a value to a struct value. In // debug builds a best effort is made to crash. If `IsStruct()` would return // false, calling this method is undefined behavior. - explicit operator StructValue() &; - explicit operator StructValue() const&; - explicit operator StructValue() &&; - explicit operator StructValue() const&&; + StructValue GetStruct() &; + StructValue GetStruct() const&; + StructValue GetStruct() &&; + StructValue GetStruct() const&&; // Performs an unchecked cast from a value to a timestamp value. In // debug builds a best effort is made to crash. If `IsTimestamp()` would // return false, calling this method is undefined behavior. - explicit operator TimestampValue() const; + TimestampValue GetTimestamp() const; // Performs an unchecked cast from a value to a type value. In // debug builds a best effort is made to crash. If `IsType()` would return // false, calling this method is undefined behavior. - explicit operator const TypeValue&() & ABSL_ATTRIBUTE_LIFETIME_BOUND; - explicit operator const TypeValue&() const& ABSL_ATTRIBUTE_LIFETIME_BOUND; - explicit operator TypeValue() &&; - explicit operator TypeValue() const&&; + const TypeValue& GetType() & ABSL_ATTRIBUTE_LIFETIME_BOUND; + const TypeValue& GetType() const& ABSL_ATTRIBUTE_LIFETIME_BOUND; + TypeValue GetType() &&; + TypeValue GetType() const&&; // Performs an unchecked cast from a value to an uint value. In // debug builds a best effort is made to crash. If `IsUint()` would return // false, calling this method is undefined behavior. - explicit operator UintValue() const; + UintValue GetUint() const; // Performs an unchecked cast from a value to an unknown value. In // debug builds a best effort is made to crash. If `IsUnknown()` would return // false, calling this method is undefined behavior. - explicit operator const UnknownValue&() & ABSL_ATTRIBUTE_LIFETIME_BOUND; - explicit operator const UnknownValue&() const& ABSL_ATTRIBUTE_LIFETIME_BOUND; - explicit operator UnknownValue() &&; - explicit operator UnknownValue() const&&; + const UnknownValue& GetUnknown() & ABSL_ATTRIBUTE_LIFETIME_BOUND; + const UnknownValue& GetUnknown() const& ABSL_ATTRIBUTE_LIFETIME_BOUND; + UnknownValue GetUnknown() &&; + UnknownValue GetUnknown() const&&; + + // Convenience method for use with template metaprogramming. See + // `GetBool()`. + template + std::enable_if_t, BoolValue> Get() & { + return GetBool(); + } + template + std::enable_if_t, BoolValue> Get() const& { + return GetBool(); + } + template + std::enable_if_t, BoolValue> Get() && { + return GetBool(); + } + template + std::enable_if_t, BoolValue> Get() const&& { + return GetBool(); + } + + // Convenience method for use with template metaprogramming. See + // `GetBytes()`. + template + std::enable_if_t, const BytesValue&> Get() & + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return GetBytes(); + } + template + std::enable_if_t, const BytesValue&> Get() + const& ABSL_ATTRIBUTE_LIFETIME_BOUND { + return GetBytes(); + } + template + std::enable_if_t, BytesValue> Get() && { + return std::move(*this).GetBytes(); + } + template + std::enable_if_t, BytesValue> Get() const&& { + return std::move(*this).GetBytes(); + } + + // Convenience method for use with template metaprogramming. See + // `GetDouble()`. + template + std::enable_if_t, DoubleValue> Get() & { + return GetDouble(); + } + template + std::enable_if_t, DoubleValue> Get() const& { + return GetDouble(); + } + template + std::enable_if_t, DoubleValue> Get() && { + return GetDouble(); + } + template + std::enable_if_t, DoubleValue> Get() const&& { + return GetDouble(); + } + + // Convenience method for use with template metaprogramming. See + // `GetDuration()`. + template + std::enable_if_t, DurationValue> Get() & { + return GetDuration(); + } + template + std::enable_if_t, DurationValue> Get() + const& { + return GetDuration(); + } + template + std::enable_if_t, DurationValue> Get() && { + return GetDuration(); + } + template + std::enable_if_t, DurationValue> Get() + const&& { + return GetDuration(); + } + + // Convenience method for use with template metaprogramming. See + // `GetError()`. + template + std::enable_if_t, const ErrorValue&> Get() & + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return GetError(); + } + template + std::enable_if_t, const ErrorValue&> Get() + const& ABSL_ATTRIBUTE_LIFETIME_BOUND { + return GetError(); + } + template + std::enable_if_t, ErrorValue> Get() && { + return std::move(*this).GetError(); + } + template + std::enable_if_t, ErrorValue> Get() const&& { + return std::move(*this).GetError(); + } + + // Convenience method for use with template metaprogramming. See + // `GetInt()`. + template + std::enable_if_t, IntValue> Get() & { + return GetInt(); + } + template + std::enable_if_t, IntValue> Get() const& { + return GetInt(); + } + template + std::enable_if_t, IntValue> Get() && { + return GetInt(); + } + template + std::enable_if_t, IntValue> Get() const&& { + return GetInt(); + } + + // Convenience method for use with template metaprogramming. See + // `GetList()`. + template + std::enable_if_t, ListValue> Get() & { + return GetList(); + } + template + std::enable_if_t, ListValue> Get() const& { + return GetList(); + } + template + std::enable_if_t, ListValue> Get() && { + return std::move(*this).GetList(); + } + template + std::enable_if_t, ListValue> Get() const&& { + return std::move(*this).GetList(); + } + + // Convenience method for use with template metaprogramming. See + // `GetMap()`. + template + std::enable_if_t, MapValue> Get() & { + return GetMap(); + } + template + std::enable_if_t, MapValue> Get() const& { + return GetMap(); + } + template + std::enable_if_t, MapValue> Get() && { + return std::move(*this).GetMap(); + } + template + std::enable_if_t, MapValue> Get() const&& { + return std::move(*this).GetMap(); + } + + // Convenience method for use with template metaprogramming. See + // `GetMessage()`. + template + std::enable_if_t, MessageValue> Get() & { + return GetMessage(); + } + template + std::enable_if_t, MessageValue> Get() const& { + return GetMessage(); + } + template + std::enable_if_t, MessageValue> Get() && { + return std::move(*this).GetMessage(); + } + template + std::enable_if_t, MessageValue> Get() + const&& { + return std::move(*this).GetMessage(); + } + + // Convenience method for use with template metaprogramming. See + // `GetNull()`. + template + std::enable_if_t, NullValue> Get() & { + return GetNull(); + } + template + std::enable_if_t, NullValue> Get() const& { + return GetNull(); + } + template + std::enable_if_t, NullValue> Get() && { + return GetNull(); + } + template + std::enable_if_t, NullValue> Get() const&& { + return GetNull(); + } + + // Convenience method for use with template metaprogramming. See + // `GetOpaque()`. + template + std::enable_if_t, const OpaqueValue&> + Get() & ABSL_ATTRIBUTE_LIFETIME_BOUND { + return GetOpaque(); + } + template + std::enable_if_t, const OpaqueValue&> Get() + const& ABSL_ATTRIBUTE_LIFETIME_BOUND { + return GetOpaque(); + } + template + std::enable_if_t, OpaqueValue> Get() && { + return std::move(*this).GetOpaque(); + } + template + std::enable_if_t, OpaqueValue> Get() const&& { + return std::move(*this).GetOpaque(); + } + + // Convenience method for use with template metaprogramming. See + // `GetOptional()`. + template + std::enable_if_t, const OptionalValue&> + Get() & ABSL_ATTRIBUTE_LIFETIME_BOUND { + return GetOptional(); + } + template + std::enable_if_t, const OptionalValue&> Get() + const& ABSL_ATTRIBUTE_LIFETIME_BOUND { + return GetOptional(); + } + template + std::enable_if_t, OptionalValue> Get() && { + return std::move(*this).GetOptional(); + } + template + std::enable_if_t, OptionalValue> Get() + const&& { + return std::move(*this).GetOptional(); + } + + // Convenience method for use with template metaprogramming. See + // `GetParsedJsonList()`. + template + std::enable_if_t, + const ParsedJsonListValue&> + Get() & ABSL_ATTRIBUTE_LIFETIME_BOUND { + return GetParsedJsonList(); + } + template + std::enable_if_t, + const ParsedJsonListValue&> + Get() const& ABSL_ATTRIBUTE_LIFETIME_BOUND { + return GetParsedJsonList(); + } + template + std::enable_if_t, ParsedJsonListValue> + Get() && { + return std::move(*this).GetParsedJsonList(); + } + template + std::enable_if_t, ParsedJsonListValue> + Get() const&& { + return std::move(*this).GetParsedJsonList(); + } + + // Convenience method for use with template metaprogramming. See + // `GetParsedJsonMap()`. + template + std::enable_if_t, + const ParsedJsonMapValue&> + Get() & ABSL_ATTRIBUTE_LIFETIME_BOUND { + return GetParsedJsonMap(); + } + template + std::enable_if_t, + const ParsedJsonMapValue&> + Get() const& ABSL_ATTRIBUTE_LIFETIME_BOUND { + return GetParsedJsonMap(); + } + template + std::enable_if_t, ParsedJsonMapValue> + Get() && { + return std::move(*this).GetParsedJsonMap(); + } + template + std::enable_if_t, ParsedJsonMapValue> + Get() const&& { + return std::move(*this).GetParsedJsonMap(); + } + + // Convenience method for use with template metaprogramming. See + // `GetParsedMessage()`. + template + std::enable_if_t, + const ParsedMessageValue&> + Get() & ABSL_ATTRIBUTE_LIFETIME_BOUND { + return GetParsedMessage(); + } + template + std::enable_if_t, + const ParsedMessageValue&> + Get() const& ABSL_ATTRIBUTE_LIFETIME_BOUND { + return GetParsedMessage(); + } + template + std::enable_if_t, ParsedMessageValue> + Get() && { + return std::move(*this).GetParsedMessage(); + } + template + std::enable_if_t, ParsedMessageValue> + Get() const&& { + return std::move(*this).GetParsedMessage(); + } + + // Convenience method for use with template metaprogramming. See + // `GetString()`. + template + std::enable_if_t, const StringValue&> + Get() & ABSL_ATTRIBUTE_LIFETIME_BOUND { + return GetString(); + } + template + std::enable_if_t, const StringValue&> Get() + const& ABSL_ATTRIBUTE_LIFETIME_BOUND { + return GetString(); + } + template + std::enable_if_t, StringValue> Get() && { + return std::move(*this).GetString(); + } + template + std::enable_if_t, StringValue> Get() const&& { + return std::move(*this).GetString(); + } + + // Convenience method for use with template metaprogramming. See + // `GetStruct()`. + template + std::enable_if_t, StructValue> Get() & { + return GetStruct(); + } + template + std::enable_if_t, StructValue> Get() const& { + return GetStruct(); + } + template + std::enable_if_t, StructValue> Get() && { + return std::move(*this).GetStruct(); + } + template + std::enable_if_t, StructValue> Get() const&& { + return std::move(*this).GetStruct(); + } + + // Convenience method for use with template metaprogramming. See + // `GetTimestamp()`. + template + std::enable_if_t, TimestampValue> Get() & { + return GetTimestamp(); + } + template + std::enable_if_t, TimestampValue> Get() + const& { + return GetTimestamp(); + } + template + std::enable_if_t, TimestampValue> Get() && { + return GetTimestamp(); + } + template + std::enable_if_t, TimestampValue> Get() + const&& { + return GetTimestamp(); + } + + // Convenience method for use with template metaprogramming. See + // `GetType()`. + template + std::enable_if_t, const TypeValue&> Get() & + ABSL_ATTRIBUTE_LIFETIME_BOUND { + return GetType(); + } + template + std::enable_if_t, const TypeValue&> Get() + const& ABSL_ATTRIBUTE_LIFETIME_BOUND { + return GetType(); + } + template + std::enable_if_t, TypeValue> Get() && { + return std::move(*this).GetType(); + } + template + std::enable_if_t, TypeValue> Get() const&& { + return std::move(*this).GetType(); + } + + // Convenience method for use with template metaprogramming. See + // `GetUint()`. + template + std::enable_if_t, UintValue> Get() & { + return GetUint(); + } + template + std::enable_if_t, UintValue> Get() const& { + return GetUint(); + } + template + std::enable_if_t, UintValue> Get() && { + return GetUint(); + } + template + std::enable_if_t, UintValue> Get() const&& { + return GetUint(); + } + + // Convenience method for use with template metaprogramming. See + // `GetUnknown()`. + template + std::enable_if_t, const UnknownValue&> + Get() & ABSL_ATTRIBUTE_LIFETIME_BOUND { + return GetUnknown(); + } + template + std::enable_if_t, const UnknownValue&> Get() + const& ABSL_ATTRIBUTE_LIFETIME_BOUND { + return GetUnknown(); + } + template + std::enable_if_t, UnknownValue> Get() && { + return std::move(*this).GetUnknown(); + } + template + std::enable_if_t, UnknownValue> Get() + const&& { + return std::move(*this).GetUnknown(); + } // When `Value` is default constructed, it is in a valid but undefined state. // Any attempt to use it invokes undefined behavior. This mention can be used diff --git a/common/value_test.cc b/common/value_test.cc index 82e53d4d7..3fafc21f9 100644 --- a/common/value_test.cc +++ b/common/value_test.cc @@ -428,94 +428,86 @@ TEST(Value, As) { } } -TEST(Value, Cast) { +template +decltype(auto) DoGet(From&& from) { + return std::forward(from).template Get(); +} + +TEST(Value, Get) { google::protobuf::Arena arena; - EXPECT_THAT(static_cast(Value(BoolValue())), An()); + EXPECT_THAT(DoGet(Value(BoolValue())), An()); { Value value(BytesValue{}); Value other_value = value; - EXPECT_THAT(static_cast(AsLValueRef(value)), - An()); - EXPECT_THAT(static_cast(AsConstLValueRef(value)), + EXPECT_THAT(DoGet(AsLValueRef(value)), An()); + EXPECT_THAT(DoGet(AsConstLValueRef(value)), An()); - EXPECT_THAT(static_cast(AsRValueRef(value)), - An()); - EXPECT_THAT(static_cast(AsConstRValueRef(other_value)), + EXPECT_THAT(DoGet(AsRValueRef(value)), An()); + EXPECT_THAT(DoGet(AsConstRValueRef(other_value)), An()); } - EXPECT_THAT(static_cast(Value(DoubleValue())), - An()); + EXPECT_THAT(DoGet(Value(DoubleValue())), An()); - EXPECT_THAT(static_cast(Value(DurationValue())), + EXPECT_THAT(DoGet(Value(DurationValue())), An()); { Value value(ErrorValue{}); Value other_value = value; - EXPECT_THAT(static_cast(AsLValueRef(value)), - An()); - EXPECT_THAT(static_cast(AsConstLValueRef(value)), - An()); - EXPECT_THAT(static_cast(AsRValueRef(value)), + EXPECT_THAT(DoGet(AsLValueRef(value)), An()); + EXPECT_THAT(DoGet(AsConstLValueRef(value)), An()); - EXPECT_THAT(static_cast(AsConstRValueRef(other_value)), + EXPECT_THAT(DoGet(AsRValueRef(value)), An()); + EXPECT_THAT(DoGet(AsConstRValueRef(other_value)), An()); } - EXPECT_THAT(static_cast(Value(IntValue())), An()); + EXPECT_THAT(DoGet(Value(IntValue())), An()); { Value value(ListValue{}); Value other_value = value; - EXPECT_THAT(static_cast(AsLValueRef(value)), + EXPECT_THAT(DoGet(AsLValueRef(value)), An()); + EXPECT_THAT(DoGet(AsConstLValueRef(value)), An()); - EXPECT_THAT(static_cast(AsConstLValueRef(value)), - An()); - EXPECT_THAT(static_cast(AsRValueRef(value)), - An()); - EXPECT_THAT(static_cast(AsConstRValueRef(other_value)), + EXPECT_THAT(DoGet(AsRValueRef(value)), An()); + EXPECT_THAT(DoGet(AsConstRValueRef(other_value)), An()); } { Value value(ParsedJsonListValue{}); Value other_value = value; - EXPECT_THAT(static_cast(AsLValueRef(value)), - An()); - EXPECT_THAT(static_cast(AsConstLValueRef(value)), + EXPECT_THAT(DoGet(AsLValueRef(value)), An()); + EXPECT_THAT(DoGet(AsConstLValueRef(value)), An()); - EXPECT_THAT(static_cast(AsRValueRef(value)), - An()); - EXPECT_THAT(static_cast(AsConstRValueRef(other_value)), + EXPECT_THAT(DoGet(AsRValueRef(value)), An()); + EXPECT_THAT(DoGet(AsConstRValueRef(other_value)), An()); } { Value value(MapValue{}); Value other_value = value; - EXPECT_THAT(static_cast(AsLValueRef(value)), - An()); - EXPECT_THAT(static_cast(AsConstLValueRef(value)), - An()); - EXPECT_THAT(static_cast(AsRValueRef(value)), + EXPECT_THAT(DoGet(AsLValueRef(value)), An()); + EXPECT_THAT(DoGet(AsConstLValueRef(value)), An()); - EXPECT_THAT(static_cast(AsConstRValueRef(other_value)), + EXPECT_THAT(DoGet(AsRValueRef(value)), An()); + EXPECT_THAT(DoGet(AsConstRValueRef(other_value)), An()); } { Value value(ParsedJsonMapValue{}); Value other_value = value; - EXPECT_THAT(static_cast(AsLValueRef(value)), + EXPECT_THAT(DoGet(AsLValueRef(value)), An()); + EXPECT_THAT(DoGet(AsConstLValueRef(value)), An()); - EXPECT_THAT(static_cast(AsConstLValueRef(value)), - An()); - EXPECT_THAT(static_cast(AsRValueRef(value)), - An()); - EXPECT_THAT(static_cast(AsConstRValueRef(other_value)), + EXPECT_THAT(DoGet(AsRValueRef(value)), An()); + EXPECT_THAT(DoGet(AsConstRValueRef(other_value)), An()); } @@ -524,57 +516,55 @@ TEST(Value, Cast) { &arena, R"pb()pb", GetTestingDescriptorPool(), GetTestingMessageFactory())}); Value other_value = value; - EXPECT_THAT(static_cast(AsLValueRef(value)), + EXPECT_THAT(DoGet(AsLValueRef(value)), An()); - EXPECT_THAT(static_cast(AsConstLValueRef(value)), + EXPECT_THAT(DoGet(AsConstLValueRef(value)), An()); - EXPECT_THAT(static_cast(AsRValueRef(value)), + EXPECT_THAT(DoGet(AsRValueRef(value)), An()); - EXPECT_THAT(static_cast(AsConstRValueRef(other_value)), + EXPECT_THAT(DoGet(AsConstRValueRef(other_value)), An()); } - EXPECT_THAT(static_cast(Value(NullValue())), An()); + EXPECT_THAT(DoGet(Value(NullValue())), An()); { Value value(OptionalValue{}); Value other_value = value; - EXPECT_THAT(static_cast(AsLValueRef(value)), + EXPECT_THAT(DoGet(AsLValueRef(value)), An()); - EXPECT_THAT(static_cast(AsConstLValueRef(value)), + EXPECT_THAT(DoGet(AsConstLValueRef(value)), An()); - EXPECT_THAT(static_cast(AsRValueRef(value)), + EXPECT_THAT(DoGet(AsRValueRef(value)), An()); - EXPECT_THAT(static_cast(AsConstRValueRef(other_value)), + EXPECT_THAT(DoGet(AsConstRValueRef(other_value)), An()); } { Value value(OptionalValue{}); Value other_value = value; - EXPECT_THAT(static_cast(AsLValueRef(value)), + EXPECT_THAT(DoGet(AsLValueRef(value)), An()); - EXPECT_THAT(static_cast(AsConstLValueRef(value)), + EXPECT_THAT(DoGet(AsConstLValueRef(value)), An()); - EXPECT_THAT(static_cast(AsRValueRef(value)), + EXPECT_THAT(DoGet(AsRValueRef(value)), + An()); + EXPECT_THAT(DoGet(AsConstRValueRef(other_value)), An()); - EXPECT_THAT( - static_cast(AsConstRValueRef(other_value)), - An()); } { OpaqueValue value(OptionalValue{}); OpaqueValue other_value = value; - EXPECT_THAT(static_cast(AsLValueRef(value)), + EXPECT_THAT(DoGet(AsLValueRef(value)), An()); - EXPECT_THAT( - static_cast(AsConstLValueRef(value)), - An()); - EXPECT_THAT(static_cast(AsRValueRef(value)), + EXPECT_THAT(DoGet(AsConstLValueRef(value)), + An()); + EXPECT_THAT(DoGet(AsRValueRef(value)), An()); EXPECT_THAT( - static_cast(AsConstRValueRef(other_value)), + DoGet(AsConstRValueRef(other_value)), An()); } @@ -583,27 +573,26 @@ TEST(Value, Cast) { &arena, R"pb()pb", GetTestingDescriptorPool(), GetTestingMessageFactory())}); Value other_value = value; - EXPECT_THAT(static_cast(AsLValueRef(value)), + EXPECT_THAT(DoGet(AsLValueRef(value)), An()); - EXPECT_THAT(static_cast(AsConstLValueRef(value)), + EXPECT_THAT(DoGet(AsConstLValueRef(value)), An()); - EXPECT_THAT(static_cast(AsRValueRef(value)), + EXPECT_THAT(DoGet(AsRValueRef(value)), + An()); + EXPECT_THAT(DoGet(AsConstRValueRef(other_value)), An()); - EXPECT_THAT( - static_cast(AsConstRValueRef(other_value)), - An()); } { Value value(StringValue{}); Value other_value = value; - EXPECT_THAT(static_cast(AsLValueRef(value)), + EXPECT_THAT(DoGet(AsLValueRef(value)), An()); - EXPECT_THAT(static_cast(AsConstLValueRef(value)), + EXPECT_THAT(DoGet(AsConstLValueRef(value)), An()); - EXPECT_THAT(static_cast(AsRValueRef(value)), + EXPECT_THAT(DoGet(AsRValueRef(value)), An()); - EXPECT_THAT(static_cast(AsConstRValueRef(other_value)), + EXPECT_THAT(DoGet(AsConstRValueRef(other_value)), An()); } @@ -612,44 +601,42 @@ TEST(Value, Cast) { &arena, R"pb()pb", GetTestingDescriptorPool(), GetTestingMessageFactory())}); Value other_value = value; - EXPECT_THAT(static_cast(AsLValueRef(value)), + EXPECT_THAT(DoGet(AsLValueRef(value)), An()); - EXPECT_THAT(static_cast(AsConstLValueRef(value)), + EXPECT_THAT(DoGet(AsConstLValueRef(value)), An()); - EXPECT_THAT(static_cast(AsRValueRef(value)), + EXPECT_THAT(DoGet(AsRValueRef(value)), An()); - EXPECT_THAT(static_cast(AsConstRValueRef(other_value)), + EXPECT_THAT(DoGet(AsConstRValueRef(other_value)), An()); } - EXPECT_THAT(static_cast(Value(TimestampValue())), + EXPECT_THAT(DoGet(Value(TimestampValue())), An()); { Value value(TypeValue(StringType{})); Value other_value = value; - EXPECT_THAT(static_cast(AsLValueRef(value)), - An()); - EXPECT_THAT(static_cast(AsConstLValueRef(value)), - An()); - EXPECT_THAT(static_cast(AsRValueRef(value)), + EXPECT_THAT(DoGet(AsLValueRef(value)), An()); + EXPECT_THAT(DoGet(AsConstLValueRef(value)), An()); - EXPECT_THAT(static_cast(AsConstRValueRef(other_value)), + EXPECT_THAT(DoGet(AsRValueRef(value)), An()); + EXPECT_THAT(DoGet(AsConstRValueRef(other_value)), An()); } - EXPECT_THAT(static_cast(Value(UintValue())), An()); + EXPECT_THAT(DoGet(Value(UintValue())), An()); { Value value(UnknownValue{}); Value other_value = value; - EXPECT_THAT(static_cast(AsLValueRef(value)), + EXPECT_THAT(DoGet(AsLValueRef(value)), An()); - EXPECT_THAT(static_cast(AsConstLValueRef(value)), + EXPECT_THAT(DoGet(AsConstLValueRef(value)), An()); - EXPECT_THAT(static_cast(AsRValueRef(value)), + EXPECT_THAT(DoGet(AsRValueRef(value)), An()); - EXPECT_THAT(static_cast(AsConstRValueRef(other_value)), + EXPECT_THAT(DoGet(AsConstRValueRef(other_value)), An()); } } diff --git a/common/values/opaque_value.cc b/common/values/opaque_value.cc index d8367d2a4..e93d79255 100644 --- a/common/values/opaque_value.cc +++ b/common/values/opaque_value.cc @@ -61,22 +61,22 @@ absl::optional OpaqueValue::AsOptional() const&& { return absl::nullopt; } -OpaqueValue::operator const OptionalValue&() & { +const OptionalValue& OpaqueValue::GetOptional() & { ABSL_DCHECK(IsOptional()) << *this; return *reinterpret_cast(this); } -OpaqueValue::operator const OptionalValue&() const& { +const OptionalValue& OpaqueValue::GetOptional() const& { ABSL_DCHECK(IsOptional()) << *this; return *reinterpret_cast(this); } -OpaqueValue::operator OptionalValue() && { +OptionalValue OpaqueValue::GetOptional() && { ABSL_DCHECK(IsOptional()) << *this; return std::move(*reinterpret_cast(this)); } -OpaqueValue::operator OptionalValue() const&& { +OptionalValue OpaqueValue::GetOptional() const&& { ABSL_DCHECK(IsOptional()) << *this; return std::move(*reinterpret_cast(this)); } diff --git a/common/values/opaque_value.h b/common/values/opaque_value.h index e8417cfbf..91eab67ca 100644 --- a/common/values/opaque_value.h +++ b/common/values/opaque_value.h @@ -164,10 +164,24 @@ class OpaqueValue { // Performs an unchecked cast from an opaque value to an optional value. In // debug builds a best effort is made to crash. If `IsOptional()` would return // false, calling this method is undefined behavior. - explicit operator const OptionalValue&() & ABSL_ATTRIBUTE_LIFETIME_BOUND; - explicit operator const OptionalValue&() const& ABSL_ATTRIBUTE_LIFETIME_BOUND; - explicit operator OptionalValue() &&; - explicit operator OptionalValue() const&&; + const OptionalValue& GetOptional() & ABSL_ATTRIBUTE_LIFETIME_BOUND; + const OptionalValue& GetOptional() const& ABSL_ATTRIBUTE_LIFETIME_BOUND; + OptionalValue GetOptional() &&; + OptionalValue GetOptional() const&&; + + // Convenience method for use with template metaprogramming. See + // `Optional()`. + template + std::enable_if_t, const OptionalValue&> + Get() & ABSL_ATTRIBUTE_LIFETIME_BOUND; + template + std::enable_if_t, const OptionalValue&> Get() + const& ABSL_ATTRIBUTE_LIFETIME_BOUND; + template + std::enable_if_t, OptionalValue> Get() &&; + template + std::enable_if_t, OptionalValue> Get() + const&&; void swap(OpaqueValue& other) noexcept { using std::swap; diff --git a/common/values/optional_value.h b/common/values/optional_value.h index 730c25978..1a3d563ca 100644 --- a/common/values/optional_value.h +++ b/common/values/optional_value.h @@ -116,11 +116,11 @@ class OptionalValue final : public OpaqueValue { cel::Value Value() const; const interface_type& operator*() const { - return Cast(OpaqueValue::operator*()); + return cel::Cast(OpaqueValue::operator*()); } absl::Nonnull operator->() const { - return Cast(OpaqueValue::operator->()); + return cel::Cast(OpaqueValue::operator->()); } bool IsOptional() const = delete; @@ -130,6 +130,10 @@ class OptionalValue final : public OpaqueValue { optional_ref AsOptional() const& = delete; absl::optional AsOptional() && = delete; absl::optional AsOptional() const&& = delete; + const OptionalValue& GetOptional() & = delete; + const OptionalValue& GetOptional() const& = delete; + OptionalValue GetOptional() && = delete; + OptionalValue GetOptional() const&& = delete; template std::enable_if_t, optional_ref> @@ -146,6 +150,22 @@ class OptionalValue final : public OpaqueValue { std::enable_if_t, absl::optional> As() const&& = delete; + template + std::enable_if_t, + optional_ref> + Get() & = delete; + template + std::enable_if_t, + optional_ref> + Get() const& = delete; + template + std::enable_if_t, + absl::optional> + Get() && = delete; + template + std::enable_if_t, + absl::optional> + Get() const&& = delete; private: friend struct SubsumptionTraits; @@ -202,6 +222,30 @@ OpaqueValue::As() const&& { return std::move(*this).AsOptional(); } +template + std::enable_if_t, const OptionalValue&> + OpaqueValue::Get() & ABSL_ATTRIBUTE_LIFETIME_BOUND { + return GetOptional(); +} + +template +std::enable_if_t, const OptionalValue&> +OpaqueValue::Get() const& ABSL_ATTRIBUTE_LIFETIME_BOUND { + return GetOptional(); +} + +template +std::enable_if_t, OptionalValue> +OpaqueValue::Get() && { + return std::move(*this).GetOptional(); +} + +template +std::enable_if_t, OptionalValue> +OpaqueValue::Get() const&& { + return std::move(*this).GetOptional(); +} + } // namespace cel #endif // THIRD_PARTY_CEL_CPP_COMMON_VALUES_OPTIONAL_VALUE_H_ diff --git a/conformance/service.cc b/conformance/service.cc index a87aead60..b5fe9131c 100644 --- a/conformance/service.cc +++ b/conformance/service.cc @@ -570,8 +570,7 @@ class ModernConformanceServiceImpl : public ConformanceServiceInterface { cel::Value result = eval_status.value(); if (result->Is()) { - const absl::Status& error = - static_cast(result).NativeValue(); + const absl::Status& error = result.GetError().NativeValue(); *response.mutable_result() ->mutable_error() ->add_errors() diff --git a/conformance/value_conversion.cc b/conformance/value_conversion.cc index 05abdfd7b..c1334d4c5 100644 --- a/conformance/value_conversion.cc +++ b/conformance/value_conversion.cc @@ -207,25 +207,25 @@ absl::StatusOr ToConformanceValue( google::api::expr::v1alpha1::Value result; switch (value->kind()) { case ValueKind::kBool: - result.set_bool_value(static_cast(value).NativeValue()); + result.set_bool_value(value.GetBool().NativeValue()); break; case ValueKind::kInt: - result.set_int64_value(static_cast(value).NativeValue()); + result.set_int64_value(value.GetInt().NativeValue()); break; case ValueKind::kUint: - result.set_uint64_value(static_cast(value).NativeValue()); + result.set_uint64_value(value.GetUint().NativeValue()); break; case ValueKind::kDouble: - result.set_double_value(static_cast(value).NativeValue()); + result.set_double_value(value.GetDouble().NativeValue()); break; case ValueKind::kString: - result.set_string_value(static_cast(value).ToString()); + result.set_string_value(value.GetString().ToString()); break; case ValueKind::kBytes: - result.set_bytes_value(static_cast(value).ToString()); + result.set_bytes_value(value.GetBytes().ToString()); break; case ValueKind::kType: - result.set_type_value(static_cast(value).name()); + result.set_type_value(value.GetType().name()); break; case ValueKind::kNull: result.set_null_value(google::protobuf::NullValue::NULL_VALUE); @@ -233,33 +233,32 @@ absl::StatusOr ToConformanceValue( case ValueKind::kDuration: { google::protobuf::Duration duration; CEL_RETURN_IF_ERROR(internal::EncodeDuration( - static_cast(value).NativeValue(), &duration)); + value.GetDuration().NativeValue(), &duration)); result.mutable_object_value()->PackFrom(duration); break; } case ValueKind::kTimestamp: { google::protobuf::Timestamp timestamp; - CEL_RETURN_IF_ERROR(internal::EncodeTime( - static_cast(value).NativeValue(), ×tamp)); + CEL_RETURN_IF_ERROR( + internal::EncodeTime(value.GetTimestamp().NativeValue(), ×tamp)); result.mutable_object_value()->PackFrom(timestamp); break; } case ValueKind::kMap: { CEL_ASSIGN_OR_RETURN( *result.mutable_map_value(), - MapValueToConformance(value_manager, static_cast(value))); + MapValueToConformance(value_manager, value.GetMap())); break; } case ValueKind::kList: { CEL_ASSIGN_OR_RETURN( *result.mutable_list_value(), - ListValueToConformance(value_manager, static_cast(value))); + ListValueToConformance(value_manager, value.GetList())); break; } case ValueKind::kStruct: { - CEL_ASSIGN_OR_RETURN( - *result.mutable_object_value(), - ToProtobufAny(value_manager, static_cast(value))); + CEL_ASSIGN_OR_RETURN(*result.mutable_object_value(), + ToProtobufAny(value_manager, value.GetStruct())); break; } default: diff --git a/eval/compiler/instrumentation_test.cc b/eval/compiler/instrumentation_test.cc index 4ca80e331..b429127f2 100644 --- a/eval/compiler/instrumentation_test.cc +++ b/eval/compiler/instrumentation_test.cc @@ -72,8 +72,7 @@ class InstrumentationTest : public ::testing::Test { MATCHER_P(IsIntValue, expected, "") { const Value& got = arg; - return got.Is() && - static_cast(got).NativeValue() == expected; + return got.Is() && got.GetInt().NativeValue() == expected; } TEST_F(InstrumentationTest, Basic) { @@ -337,8 +336,7 @@ TEST_F(InstrumentationTest, OptimizedStepsNotEvaluated) { plan.EvaluateWithCallback(activation, EvaluationListener(), state)); EXPECT_THAT(expr_ids, ElementsAre(1, 2)); - EXPECT_TRUE(value.Is() && - static_cast(value).NativeValue()); + EXPECT_TRUE(value.Is() && value.GetBool().NativeValue()); } TEST_F(InstrumentationTest, NoopSkipped) { diff --git a/eval/compiler/resolver_test.cc b/eval/compiler/resolver_test.cc index 920a03c93..978596973 100644 --- a/eval/compiler/resolver_test.cc +++ b/eval/compiler/resolver_test.cc @@ -117,13 +117,13 @@ TEST_F(ResolverTest, TestFindConstantEnum) { auto enum_value = resolver.FindConstant("TestEnum.TEST_ENUM_1", -1); ASSERT_TRUE(enum_value); ASSERT_TRUE(enum_value->Is()); - EXPECT_THAT(static_cast(*enum_value).NativeValue(), Eq(1L)); + EXPECT_THAT(enum_value->GetInt().NativeValue(), Eq(1L)); enum_value = resolver.FindConstant( ".google.api.expr.runtime.TestMessage.TestEnum.TEST_ENUM_2", -1); ASSERT_TRUE(enum_value); ASSERT_TRUE(enum_value->Is()); - EXPECT_THAT(static_cast(*enum_value).NativeValue(), Eq(2L)); + EXPECT_THAT(enum_value->GetInt().NativeValue(), Eq(2L)); } TEST_F(ResolverTest, TestFindConstantUnqualifiedType) { @@ -135,7 +135,7 @@ TEST_F(ResolverTest, TestFindConstantUnqualifiedType) { auto type_value = resolver.FindConstant("int", -1); EXPECT_TRUE(type_value); EXPECT_TRUE(type_value->Is()); - EXPECT_THAT(static_cast(*type_value).name(), Eq("int")); + EXPECT_THAT(type_value->GetType().name(), Eq("int")); } TEST_F(ResolverTest, TestFindConstantFullyQualifiedType) { @@ -153,7 +153,7 @@ TEST_F(ResolverTest, TestFindConstantFullyQualifiedType) { resolver.FindConstant(".google.api.expr.runtime.TestMessage", -1); ASSERT_TRUE(type_value); ASSERT_TRUE(type_value->Is()); - EXPECT_THAT(static_cast(*type_value).name(), + EXPECT_THAT(type_value->GetType().name(), Eq("google.api.expr.runtime.TestMessage")); } diff --git a/eval/eval/attribute_utility.cc b/eval/eval/attribute_utility.cc index 097c7a3ae..d15dadb14 100644 --- a/eval/eval/attribute_utility.cc +++ b/eval/eval/attribute_utility.cc @@ -82,7 +82,7 @@ absl::optional AttributeUtility::MergeUnknowns( if (!result_set.has_value()) { result_set.emplace(); } - const auto& current_set = static_cast(value); + const auto& current_set = value.GetUnknown(); cel::base_internal::UnknownSetAccess::Add( *result_set, UnknownSet(current_set.attribute_set(), diff --git a/eval/eval/compiler_constant_step_test.cc b/eval/eval/compiler_constant_step_test.cc index dc2c51665..9845cdc3e 100644 --- a/eval/eval/compiler_constant_step_test.cc +++ b/eval/eval/compiler_constant_step_test.cc @@ -61,7 +61,7 @@ TEST_F(CompilerConstantStepTest, Evaluate) { ASSERT_OK_AND_ASSIGN(cel::Value result, frame.Evaluate()); - EXPECT_EQ(static_cast(result).NativeValue(), 42); + EXPECT_EQ(result.GetInt().NativeValue(), 42); } TEST_F(CompilerConstantStepTest, TypeId) { @@ -75,7 +75,7 @@ TEST_F(CompilerConstantStepTest, TypeId) { TEST_F(CompilerConstantStepTest, Value) { CompilerConstantStep step(value_factory_.CreateIntValue(42), -1, false); - EXPECT_EQ(static_cast(step.value()).NativeValue(), 42); + EXPECT_EQ(step.value().GetInt().NativeValue(), 42); } } // namespace diff --git a/eval/eval/comprehension_slots_test.cc b/eval/eval/comprehension_slots_test.cc index 0b6640f75..0257150f4 100644 --- a/eval/eval/comprehension_slots_test.cc +++ b/eval/eval/comprehension_slots_test.cc @@ -57,7 +57,7 @@ TEST(ComprehensionSlots, Basic) { EXPECT_THAT(slot0->value, Truly([](const Value& v) { return v.Is() && - static_cast(v).ToString() == "abcd"; + v.GetString().ToString() == "abcd"; })) << "value is 'abcd'"; @@ -75,7 +75,7 @@ TEST(ComprehensionSlots, Basic) { ASSERT_TRUE(slot3 != nullptr); EXPECT_THAT(slot3->value, Truly([](const Value& v) { return v.Is() && - static_cast(v).ToString() == "abcd"; + v.GetString().ToString() == "abcd"; })) << "value is 'abcd'"; diff --git a/eval/eval/comprehension_step.cc b/eval/eval/comprehension_step.cc index 6707b9c96..01d26188d 100644 --- a/eval/eval/comprehension_step.cc +++ b/eval/eval/comprehension_step.cc @@ -451,8 +451,7 @@ absl::Status ComprehensionCondStep::Evaluate(ExecutionFrame* frame) const { frame->comprehension_slots().ClearSlot(accu_slot_); return frame->JumpTo(error_jump_offset_); } - bool loop_condition = - static_cast(loop_condition_value).NativeValue(); + bool loop_condition = loop_condition_value.GetBool().NativeValue(); frame->value_stack().Pop(1); // loop_condition if (!loop_condition && shortcircuiting_) { return frame->JumpTo(jump_offset_); diff --git a/eval/eval/container_access_step.cc b/eval/eval/container_access_step.cc index adc75247d..67a783ade 100644 --- a/eval/eval/container_access_step.cc +++ b/eval/eval/container_access_step.cc @@ -53,11 +53,11 @@ inline constexpr int kNumContainerAccessArguments = 2; absl::optional CelNumberFromValue(const Value& value) { switch (value->kind()) { case ValueKind::kInt64: - return Number::FromInt64(static_cast(value).NativeValue()); + return Number::FromInt64(value.GetInt().NativeValue()); case ValueKind::kUint64: - return Number::FromUint64(static_cast(value).NativeValue()); + return Number::FromUint64(value.GetUint().NativeValue()); case ValueKind::kDouble: - return Number::FromDouble(static_cast(value).NativeValue()); + return Number::FromDouble(value.GetDouble().NativeValue()); default: return absl::nullopt; } @@ -80,16 +80,13 @@ absl::Status CheckMapKeyType(const Value& key) { AttributeQualifier AttributeQualifierFromValue(const Value& v) { switch (v->kind()) { case ValueKind::kString: - return AttributeQualifier::OfString( - static_cast(v).ToString()); + return AttributeQualifier::OfString(v.GetString().ToString()); case ValueKind::kInt64: - return AttributeQualifier::OfInt(static_cast(v).NativeValue()); + return AttributeQualifier::OfInt(v.GetInt().NativeValue()); case ValueKind::kUint64: - return AttributeQualifier::OfUint( - static_cast(v).NativeValue()); + return AttributeQualifier::OfUint(v.GetUint().NativeValue()); case ValueKind::kBool: - return AttributeQualifier::OfBool( - static_cast(v).NativeValue()); + return AttributeQualifier::OfBool(v.GetBool().NativeValue()); default: // Non-matching qualifier. return AttributeQualifier(); @@ -170,7 +167,7 @@ void LookupInList(const ListValue& cel_list, const Value& key, maybe_idx = number->AsInt(); } } else if (InstanceOf(key)) { - maybe_idx = static_cast(key).NativeValue(); + maybe_idx = key.GetInt().NativeValue(); } if (!maybe_idx.has_value()) { diff --git a/eval/eval/evaluator_core_test.cc b/eval/eval/evaluator_core_test.cc index a205058b4..1a5a7fd38 100644 --- a/eval/eval/evaluator_core_test.cc +++ b/eval/eval/evaluator_core_test.cc @@ -50,7 +50,7 @@ class FakeIncrementExpressionStep : public ExpressionStep { auto value = frame->value_stack().Peek(); frame->value_stack().Pop(1); EXPECT_TRUE(value->Is()); - int64_t val = static_cast(value).NativeValue(); + int64_t val = value.GetInt().NativeValue(); frame->value_stack().Push(CreateIntValue(val + 1)); return absl::OkStatus(); } diff --git a/eval/eval/evaluator_stack_test.cc b/eval/eval/evaluator_stack_test.cc index 0a6eebab3..2b8b1f876 100644 --- a/eval/eval/evaluator_stack_test.cc +++ b/eval/eval/evaluator_stack_test.cc @@ -33,18 +33,18 @@ TEST(EvaluatorStackTest, StackPushPop) { stack.Push(value_factory.CreateIntValue(2), AttributeTrail()); stack.Push(value_factory.CreateIntValue(3), AttributeTrail("name")); - ASSERT_EQ(static_cast(stack.Peek()).NativeValue(), 3); + ASSERT_EQ(stack.Peek().GetInt().NativeValue(), 3); ASSERT_FALSE(stack.PeekAttribute().empty()); ASSERT_EQ(stack.PeekAttribute().attribute(), attribute); stack.Pop(1); - ASSERT_EQ(static_cast(stack.Peek()).NativeValue(), 2); + ASSERT_EQ(stack.Peek().GetInt().NativeValue(), 2); ASSERT_TRUE(stack.PeekAttribute().empty()); stack.Pop(1); - ASSERT_EQ(static_cast(stack.Peek()).NativeValue(), 1); + ASSERT_EQ(stack.Peek().GetInt().NativeValue(), 1); ASSERT_TRUE(stack.PeekAttribute().empty()); } diff --git a/eval/eval/function_step.cc b/eval/eval/function_step.cc index 727d0d8ee..0d52a33a1 100644 --- a/eval/eval/function_step.cc +++ b/eval/eval/function_step.cc @@ -130,7 +130,7 @@ bool IsUnknownFunctionResultError(const Value& result) { return false; } - const auto& status = static_cast(result).NativeValue(); + const auto& status = result.GetError().NativeValue(); if (status.code() != absl::StatusCode::kUnavailable) { return false; diff --git a/eval/eval/jump_step.cc b/eval/eval/jump_step.cc index cb29ce426..340210074 100644 --- a/eval/eval/jump_step.cc +++ b/eval/eval/jump_step.cc @@ -61,9 +61,8 @@ class CondJumpStep : public JumpStepBase { } const auto& value = frame->value_stack().Peek(); - const auto should_jump = - value.Is() && - jump_condition_ == static_cast(value).NativeValue(); + const auto should_jump = value.Is() && + jump_condition_ == value.GetBool().NativeValue(); if (!leave_on_stack_) { frame->value_stack().Pop(1); diff --git a/eval/eval/lazy_init_step_test.cc b/eval/eval/lazy_init_step_test.cc index 143e8e7e5..342f8b660 100644 --- a/eval/eval/lazy_init_step_test.cc +++ b/eval/eval/lazy_init_step_test.cc @@ -80,8 +80,7 @@ TEST_F(LazyInitStepTest, CreateCheckInitStepDoesInit) { evaluator_state_); ASSERT_OK_AND_ASSIGN(auto value, frame.Evaluate()); - EXPECT_TRUE(value->Is() && - static_cast(value).NativeValue() == 42); + EXPECT_TRUE(value->Is() && value.GetInt().NativeValue() == 42); } TEST_F(LazyInitStepTest, CreateCheckInitStepSkipInit) { @@ -104,8 +103,7 @@ TEST_F(LazyInitStepTest, CreateCheckInitStepSkipInit) { frame.comprehension_slots().Set(0, value_factory().CreateIntValue(42)); ASSERT_OK_AND_ASSIGN(auto value, frame.Evaluate()); - EXPECT_TRUE(value->Is() && - static_cast(value).NativeValue() == 42); + EXPECT_TRUE(value->Is() && value.GetInt().NativeValue() == 42); } TEST_F(LazyInitStepTest, CreateAssignSlotAndPopStepBasic) { @@ -124,7 +122,7 @@ TEST_F(LazyInitStepTest, CreateAssignSlotAndPopStepBasic) { auto* slot = frame.comprehension_slots().Get(0); ASSERT_TRUE(slot != nullptr); EXPECT_TRUE(slot->value->Is() && - static_cast(slot->value).NativeValue() == 42); + slot->value.GetInt().NativeValue() == 42); EXPECT_TRUE(frame.value_stack().empty()); } diff --git a/eval/eval/logic_step.cc b/eval/eval/logic_step.cc index 08e5136a8..ffa3a6b8b 100644 --- a/eval/eval/logic_step.cc +++ b/eval/eval/logic_step.cc @@ -205,7 +205,7 @@ class LogicalOpStep : public ExpressionStepBase { for (size_t i = 0; i < args.size(); i++) { has_bool_args[i] = args[i]->Is(); if (has_bool_args[i]) { - bool_args[i] = static_cast(args[i]).NativeValue(); + bool_args[i] = args[i].GetBool().NativeValue(); if (bool_args[i] == shortcircuit_) { result = BoolValue{bool_args[i]}; return; diff --git a/eval/eval/regex_match_step.cc b/eval/eval/regex_match_step.cc index 1c8352ef4..57b23fca5 100644 --- a/eval/eval/regex_match_step.cc +++ b/eval/eval/regex_match_step.cc @@ -81,8 +81,7 @@ class RegexMatchStep final : public ExpressionStepBase { "First argument for regular " "expression match must be a string"); } - bool match = static_cast(subject).NativeValue( - MatchesVisitor{*re2_}); + bool match = subject.GetString().NativeValue(MatchesVisitor{*re2_}); frame->value_stack().Pop(kNumRegexMatchArguments); frame->value_stack().Push(frame->value_factory().CreateBoolValue(match)); return absl::OkStatus(); diff --git a/eval/eval/select_step.cc b/eval/eval/select_step.cc index 84a887dd3..485db02ea 100644 --- a/eval/eval/select_step.cc +++ b/eval/eval/select_step.cc @@ -223,7 +223,7 @@ absl::Status SelectStep::Evaluate(ExecutionFrame* frame) const { switch (arg->kind()) { case ValueKind::kStruct: { Value result; - CEL_RETURN_IF_ERROR(static_cast(arg).GetFieldByName( + CEL_RETURN_IF_ERROR(arg.GetStruct().GetFieldByName( frame->value_factory(), field_, result, unboxing_option_)); frame->value_stack().PopAndPush(std::move(result), std::move(result_trail)); @@ -231,8 +231,8 @@ absl::Status SelectStep::Evaluate(ExecutionFrame* frame) const { } case ValueKind::kMap: { Value result; - CEL_RETURN_IF_ERROR(static_cast(arg).Get(frame->value_factory(), - field_value_, result)); + CEL_RETURN_IF_ERROR( + arg.GetMap().Get(frame->value_factory(), field_value_, result)); frame->value_stack().PopAndPush(std::move(result), std::move(result_trail)); return absl::OkStatus(); @@ -248,15 +248,14 @@ absl::Status SelectStep::PerformTestOnlySelect(ExecutionFrame* frame, switch (arg->kind()) { case ValueKind::kMap: { Value result; - TestOnlySelect(static_cast(arg), field_value_, - frame->value_factory(), result); + TestOnlySelect(arg.GetMap(), field_value_, frame->value_factory(), + result); frame->value_stack().PopAndPush(std::move(result)); return absl::OkStatus(); } case ValueKind::kMessage: { Value result; - TestOnlySelect(static_cast(arg), field_, - frame->value_factory(), result); + TestOnlySelect(arg.GetStruct(), field_, frame->value_factory(), result); frame->value_stack().PopAndPush(std::move(result)); return absl::OkStatus(); } @@ -271,7 +270,7 @@ absl::StatusOr SelectStep::PerformSelect(ExecutionFrame* frame, Value& result) const { switch (arg->kind()) { case ValueKind::kStruct: { - const auto& struct_value = static_cast(arg); + const auto& struct_value = arg.GetStruct(); CEL_ASSIGN_OR_RETURN(auto ok, struct_value.HasFieldByName(field_)); if (!ok) { result = NullValue{}; @@ -282,8 +281,7 @@ absl::StatusOr SelectStep::PerformSelect(ExecutionFrame* frame, return true; } case ValueKind::kMap: { - return static_cast(arg).Find(frame->value_factory(), - field_value_, result); + return arg.GetMap().Find(frame->value_factory(), field_value_, result); } default: // Control flow should have returned earlier. diff --git a/eval/eval/ternary_step.cc b/eval/eval/ternary_step.cc index 2ea92f78a..c57576a7c 100644 --- a/eval/eval/ternary_step.cc +++ b/eval/eval/ternary_step.cc @@ -169,7 +169,7 @@ absl::Status TernaryStep::Evaluate(ExecutionFrame* frame) const { if (!condition->Is()) { result = frame->value_factory().CreateErrorValue( CreateNoMatchingOverloadError(kTernary)); - } else if (static_cast(condition).NativeValue()) { + } else if (condition.GetBool().NativeValue()) { result = args[kTernaryStepTrue]; } else { result = args[kTernaryStepFalse]; diff --git a/extensions/select_optimization.cc b/extensions/select_optimization.cc index a9fcb927f..b3cdbeaa2 100644 --- a/extensions/select_optimization.cc +++ b/extensions/select_optimization.cc @@ -264,8 +264,8 @@ absl::StatusOr ApplyQualifier(const Value& operand, cel::runtime_internal::CreateNoMatchingOverloadError( "")); } CEL_ASSIGN_OR_RETURN( - bool present, static_cast(*elem).HasFieldByName( - field_specifier.name)); + bool present, + elem->GetStruct().HasFieldByName(field_specifier.name)); return value_factory.CreateBoolValue(present); }, [&](const AttributeQualifier& qualifier) -> absl::StatusOr { @@ -328,7 +327,7 @@ absl::StatusOr FallbackSelect( "has")); } - return static_cast(*elem).Has( + return elem->GetMap().Has( value_factory, value_factory.CreateUncheckedStringValue( std::string(*qualifier.GetStringKey()))); }), @@ -703,9 +702,8 @@ absl::Status StackMachineImpl::Evaluate(ExecutionFrame* frame) const { "Expected struct type for select optimization."); } - CEL_ASSIGN_OR_RETURN( - Value result, - impl_.ApplySelect(*frame, static_cast(operand))); + CEL_ASSIGN_OR_RETURN(Value result, + impl_.ApplySelect(*frame, operand.GetStruct())); frame->value_stack().Pop(kStackInputs); frame->value_stack().Push(std::move(result), std::move(attribute_trail)); diff --git a/extensions/sets_functions.cc b/extensions/sets_functions.cc index 99d8a656b..9c1de9189 100644 --- a/extensions/sets_functions.cc +++ b/extensions/sets_functions.cc @@ -39,8 +39,8 @@ absl::StatusOr SetsContains(ValueManager& value_factory, list.Contains(value_factory, sublist_element)); // Treat CEL error as missing - any_missing = !contains->Is() || - !static_cast(contains).NativeValue(); + any_missing = + !contains->Is() || !contains.GetBool().NativeValue(); // The first false result will terminate the loop. return !any_missing; })); @@ -59,8 +59,7 @@ absl::StatusOr SetsIntersects(ValueManager& value_factory, sublist.Contains(value_factory, list_element)); // Treat contains return CEL error as false for the sake of // intersecting. - exists = contains->Is() && - static_cast(contains).NativeValue(); + exists = contains->Is() && contains.GetBool().NativeValue(); return !exists; })); @@ -73,7 +72,7 @@ absl::StatusOr SetsEquivalent(ValueManager& value_factory, CEL_ASSIGN_OR_RETURN(auto contains_sublist, SetsContains(value_factory, list, sublist)); if (contains_sublist.Is() && - !static_cast(contains_sublist).NativeValue()) { + !contains_sublist.GetBool().NativeValue()) { return contains_sublist; } return SetsContains(value_factory, sublist, list); diff --git a/extensions/strings_test.cc b/extensions/strings_test.cc index 9585fc081..85a0a7fe5 100644 --- a/extensions/strings_test.cc +++ b/extensions/strings_test.cc @@ -65,7 +65,7 @@ TEST(Strings, SplitWithEmptyDelimiterCord) { ASSERT_OK_AND_ASSIGN(Value result, program->Evaluate(activation, value_factory)); ASSERT_TRUE(result.Is()); - EXPECT_TRUE(static_cast(result).NativeValue()); + EXPECT_TRUE(result.GetBool().NativeValue()); } } // namespace diff --git a/runtime/activation_test.cc b/runtime/activation_test.cc index 031f06733..4e6e45e02 100644 --- a/runtime/activation_test.cc +++ b/runtime/activation_test.cc @@ -46,8 +46,7 @@ using testing::UnorderedElementsAre; MATCHER_P(IsIntValue, x, absl::StrCat("is IntValue Handle with value ", x)) { const Value& handle = arg; - return handle->Is() && - static_cast(handle).NativeValue() == x; + return handle->Is() && handle.GetInt().NativeValue() == x; } MATCHER_P(AttributePatternMatches, val, "matches AttributePattern") { diff --git a/runtime/constant_folding_test.cc b/runtime/constant_folding_test.cc index 957a8d6a8..17472fb61 100644 --- a/runtime/constant_folding_test.cc +++ b/runtime/constant_folding_test.cc @@ -53,22 +53,19 @@ struct TestCase { MATCHER_P(IsIntValue, expected, "") { const Value& value = arg; - return value->Is() && - static_cast(value).NativeValue() == expected; + return value->Is() && value.GetInt().NativeValue() == expected; } MATCHER_P(IsBoolValue, expected, "") { const Value& value = arg; - return value->Is() && - static_cast(value).NativeValue() == expected; + return value->Is() && value.GetBool().NativeValue() == expected; } MATCHER_P(IsErrorValue, expected_substr, "") { const Value& value = arg; return value->Is() && - absl::StrContains( - static_cast(value).NativeValue().message(), - expected_substr); + absl::StrContains(value.GetError().NativeValue().message(), + expected_substr); } class ConstantFoldingExtTest : public testing::TestWithParam {}; diff --git a/runtime/function_adapter_test.cc b/runtime/function_adapter_test.cc index 002b1eb09..62bfaf02f 100644 --- a/runtime/function_adapter_test.cc +++ b/runtime/function_adapter_test.cc @@ -67,7 +67,7 @@ TEST_F(FunctionAdapterTest, UnaryFunctionAdapterWrapFunctionInt) { ASSERT_OK_AND_ASSIGN(auto result, wrapped->Invoke(test_context(), args)); ASSERT_TRUE(result->Is()); - EXPECT_EQ(static_cast(result).NativeValue(), 42); + EXPECT_EQ(result.GetInt().NativeValue(), 42); } TEST_F(FunctionAdapterTest, UnaryFunctionAdapterWrapFunctionDouble) { @@ -79,7 +79,7 @@ TEST_F(FunctionAdapterTest, UnaryFunctionAdapterWrapFunctionDouble) { ASSERT_OK_AND_ASSIGN(auto result, wrapped->Invoke(test_context(), args)); ASSERT_TRUE(result->Is()); - EXPECT_EQ(static_cast(result).NativeValue(), 80.0); + EXPECT_EQ(result.GetDouble().NativeValue(), 80.0); } TEST_F(FunctionAdapterTest, UnaryFunctionAdapterWrapFunctionUint) { @@ -91,7 +91,7 @@ TEST_F(FunctionAdapterTest, UnaryFunctionAdapterWrapFunctionUint) { ASSERT_OK_AND_ASSIGN(auto result, wrapped->Invoke(test_context(), args)); ASSERT_TRUE(result->Is()); - EXPECT_EQ(static_cast(result).NativeValue(), 42); + EXPECT_EQ(result.GetUint().NativeValue(), 42); } TEST_F(FunctionAdapterTest, UnaryFunctionAdapterWrapFunctionBool) { @@ -103,7 +103,7 @@ TEST_F(FunctionAdapterTest, UnaryFunctionAdapterWrapFunctionBool) { ASSERT_OK_AND_ASSIGN(auto result, wrapped->Invoke(test_context(), args)); ASSERT_TRUE(result->Is()); - EXPECT_EQ(static_cast(result).NativeValue(), false); + EXPECT_EQ(result.GetBool().NativeValue(), false); } TEST_F(FunctionAdapterTest, UnaryFunctionAdapterWrapFunctionTimestamp) { @@ -119,7 +119,7 @@ TEST_F(FunctionAdapterTest, UnaryFunctionAdapterWrapFunctionTimestamp) { ASSERT_OK_AND_ASSIGN(auto result, wrapped->Invoke(test_context(), args)); ASSERT_TRUE(result->Is()); - EXPECT_EQ(static_cast(result).NativeValue(), + EXPECT_EQ(result.GetTimestamp().NativeValue(), absl::UnixEpoch() + absl::Minutes(1)); } @@ -136,7 +136,7 @@ TEST_F(FunctionAdapterTest, UnaryFunctionAdapterWrapFunctionDuration) { ASSERT_OK_AND_ASSIGN(auto result, wrapped->Invoke(test_context(), args)); ASSERT_TRUE(result->Is()); - EXPECT_EQ(static_cast(result).NativeValue(), absl::Seconds(8)); + EXPECT_EQ(result.GetDuration().NativeValue(), absl::Seconds(8)); } TEST_F(FunctionAdapterTest, UnaryFunctionAdapterWrapFunctionString) { @@ -152,7 +152,7 @@ TEST_F(FunctionAdapterTest, UnaryFunctionAdapterWrapFunctionString) { ASSERT_OK_AND_ASSIGN(auto result, wrapped->Invoke(test_context(), args)); ASSERT_TRUE(result->Is()); - EXPECT_EQ(static_cast(result).ToString(), "pre_string"); + EXPECT_EQ(result.GetString().ToString(), "pre_string"); } TEST_F(FunctionAdapterTest, UnaryFunctionAdapterWrapFunctionBytes) { @@ -168,21 +168,21 @@ TEST_F(FunctionAdapterTest, UnaryFunctionAdapterWrapFunctionBytes) { ASSERT_OK_AND_ASSIGN(auto result, wrapped->Invoke(test_context(), args)); ASSERT_TRUE(result->Is()); - EXPECT_EQ(static_cast(result).ToString(), "pre_bytes"); + EXPECT_EQ(result.GetBytes().ToString(), "pre_bytes"); } TEST_F(FunctionAdapterTest, UnaryFunctionAdapterWrapFunctionAny) { using FunctionAdapter = UnaryFunctionAdapter; std::unique_ptr wrapped = FunctionAdapter::WrapFunction( [](ValueManager&, const Value& x) -> uint64_t { - return static_cast(x).NativeValue() - 2; + return x.GetUint().NativeValue() - 2; }); std::vector args{value_factory().CreateUintValue(44)}; ASSERT_OK_AND_ASSIGN(auto result, wrapped->Invoke(test_context(), args)); ASSERT_TRUE(result->Is()); - EXPECT_EQ(static_cast(result).NativeValue(), 42); + EXPECT_EQ(result.GetUint().NativeValue(), 42); } TEST_F(FunctionAdapterTest, UnaryFunctionAdapterWrapFunctionReturnError) { @@ -197,7 +197,7 @@ TEST_F(FunctionAdapterTest, UnaryFunctionAdapterWrapFunctionReturnError) { ASSERT_OK_AND_ASSIGN(auto result, wrapped->Invoke(test_context(), args)); ASSERT_TRUE(result->Is()); - EXPECT_THAT(static_cast(result).NativeValue(), + EXPECT_THAT(result.GetError().NativeValue(), StatusIs(absl::StatusCode::kInvalidArgument, "test_error")); } @@ -227,7 +227,7 @@ TEST_F(FunctionAdapterTest, std::vector args{value_factory().CreateUintValue(44)}; ASSERT_OK_AND_ASSIGN(Value result, wrapped->Invoke(test_context(), args)); - EXPECT_EQ(static_cast(result).NativeValue(), 44); + EXPECT_EQ(result.GetUint().NativeValue(), 44); } TEST_F(FunctionAdapterTest, @@ -382,7 +382,7 @@ TEST_F(FunctionAdapterTest, BinaryFunctionAdapterWrapFunctionInt) { ASSERT_OK_AND_ASSIGN(auto result, wrapped->Invoke(test_context(), args)); ASSERT_TRUE(result->Is()); - EXPECT_EQ(static_cast(result).NativeValue(), 42); + EXPECT_EQ(result.GetInt().NativeValue(), 42); } TEST_F(FunctionAdapterTest, BinaryFunctionAdapterWrapFunctionDouble) { @@ -395,7 +395,7 @@ TEST_F(FunctionAdapterTest, BinaryFunctionAdapterWrapFunctionDouble) { ASSERT_OK_AND_ASSIGN(auto result, wrapped->Invoke(test_context(), args)); ASSERT_TRUE(result->Is()); - EXPECT_EQ(static_cast(result).NativeValue(), 80.0); + EXPECT_EQ(result.GetDouble().NativeValue(), 80.0); } TEST_F(FunctionAdapterTest, BinaryFunctionAdapterWrapFunctionUint) { @@ -408,7 +408,7 @@ TEST_F(FunctionAdapterTest, BinaryFunctionAdapterWrapFunctionUint) { ASSERT_OK_AND_ASSIGN(auto result, wrapped->Invoke(test_context(), args)); ASSERT_TRUE(result->Is()); - EXPECT_EQ(static_cast(result).NativeValue(), 42); + EXPECT_EQ(result.GetUint().NativeValue(), 42); } TEST_F(FunctionAdapterTest, BinaryFunctionAdapterWrapFunctionBool) { @@ -421,7 +421,7 @@ TEST_F(FunctionAdapterTest, BinaryFunctionAdapterWrapFunctionBool) { ASSERT_OK_AND_ASSIGN(auto result, wrapped->Invoke(test_context(), args)); ASSERT_TRUE(result->Is()); - EXPECT_EQ(static_cast(result).NativeValue(), true); + EXPECT_EQ(result.GetBool().NativeValue(), true); } TEST_F(FunctionAdapterTest, BinaryFunctionAdapterWrapFunctionTimestamp) { @@ -443,7 +443,7 @@ TEST_F(FunctionAdapterTest, BinaryFunctionAdapterWrapFunctionTimestamp) { ASSERT_OK_AND_ASSIGN(auto result, wrapped->Invoke(test_context(), args)); ASSERT_TRUE(result->Is()); - EXPECT_EQ(static_cast(result).NativeValue(), + EXPECT_EQ(result.GetTimestamp().NativeValue(), absl::UnixEpoch() + absl::Seconds(2)); } @@ -464,7 +464,7 @@ TEST_F(FunctionAdapterTest, BinaryFunctionAdapterWrapFunctionDuration) { ASSERT_OK_AND_ASSIGN(auto result, wrapped->Invoke(test_context(), args)); ASSERT_TRUE(result->Is()); - EXPECT_EQ(static_cast(result).NativeValue(), absl::Seconds(5)); + EXPECT_EQ(result.GetDuration().NativeValue(), absl::Seconds(5)); } TEST_F(FunctionAdapterTest, BinaryFunctionAdapterWrapFunctionString) { @@ -486,7 +486,7 @@ TEST_F(FunctionAdapterTest, BinaryFunctionAdapterWrapFunctionString) { ASSERT_OK_AND_ASSIGN(auto result, wrapped->Invoke(test_context(), args)); ASSERT_TRUE(result->Is()); - EXPECT_EQ(static_cast(result).ToString(), "abcdef"); + EXPECT_EQ(result.GetString().ToString(), "abcdef"); } TEST_F(FunctionAdapterTest, BinaryFunctionAdapterWrapFunctionBytes) { @@ -508,15 +508,15 @@ TEST_F(FunctionAdapterTest, BinaryFunctionAdapterWrapFunctionBytes) { ASSERT_OK_AND_ASSIGN(auto result, wrapped->Invoke(test_context(), args)); ASSERT_TRUE(result->Is()); - EXPECT_EQ(static_cast(result).ToString(), "abcdef"); + EXPECT_EQ(result.GetBytes().ToString(), "abcdef"); } TEST_F(FunctionAdapterTest, BinaryFunctionAdapterWrapFunctionAny) { using FunctionAdapter = BinaryFunctionAdapter; std::unique_ptr wrapped = FunctionAdapter::WrapFunction( [](ValueManager&, const Value& x, const Value& y) -> uint64_t { - return static_cast(x).NativeValue() - - static_cast(static_cast(y).NativeValue()); + return x.GetUint().NativeValue() - + static_cast(y.GetDouble().NativeValue()); }); std::vector args{value_factory().CreateUintValue(44), @@ -524,7 +524,7 @@ TEST_F(FunctionAdapterTest, BinaryFunctionAdapterWrapFunctionAny) { ASSERT_OK_AND_ASSIGN(auto result, wrapped->Invoke(test_context(), args)); ASSERT_TRUE(result->Is()); - EXPECT_EQ(static_cast(result).NativeValue(), 42); + EXPECT_EQ(result.GetUint().NativeValue(), 42); } TEST_F(FunctionAdapterTest, BinaryFunctionAdapterWrapFunctionReturnError) { @@ -540,7 +540,7 @@ TEST_F(FunctionAdapterTest, BinaryFunctionAdapterWrapFunctionReturnError) { ASSERT_OK_AND_ASSIGN(auto result, wrapped->Invoke(test_context(), args)); ASSERT_TRUE(result->Is()); - EXPECT_THAT(static_cast(result).NativeValue(), + EXPECT_THAT(result.GetError().NativeValue(), StatusIs(absl::StatusCode::kInvalidArgument, "test_error")); } @@ -718,7 +718,7 @@ TEST_F(FunctionAdapterTest, VariadicFunctionAdapterWrapFunction0Args) { ASSERT_OK_AND_ASSIGN(auto result, fn->Invoke(test_context(), {})); ASSERT_TRUE(result->Is()); - EXPECT_EQ(static_cast(result).ToString(), "abc"); + EXPECT_EQ(result.GetString().ToString(), "abc"); } TEST_F(FunctionAdapterTest, VariadicFunctionAdapterCreateDescriptor3Args) { @@ -751,7 +751,7 @@ TEST_F(FunctionAdapterTest, VariadicFunctionAdapterWrapFunction3Args) { value_factory().CreateStringValue("abcd")); ASSERT_OK_AND_ASSIGN(auto result, fn->Invoke(test_context(), args)); ASSERT_TRUE(result->Is()); - EXPECT_EQ(static_cast(result).ToString(), "42_false_abcd"); + EXPECT_EQ(result.GetString().ToString(), "42_false_abcd"); } TEST_F(FunctionAdapterTest, diff --git a/runtime/optional_types_test.cc b/runtime/optional_types_test.cc index e85746d70..467b9febe 100644 --- a/runtime/optional_types_test.cc +++ b/runtime/optional_types_test.cc @@ -325,7 +325,7 @@ TEST(OptionalTypesTest, ErrorShortCircuiting) { EXPECT_EQ(unreachable_count, 0); ASSERT_TRUE(result->Is()) << result->DebugString(); - EXPECT_THAT(static_cast(result).NativeValue(), + EXPECT_THAT(result.GetError().NativeValue(), StatusIs(absl::StatusCode::kInvalidArgument, HasSubstr("divide by zero"))); } diff --git a/runtime/reference_resolver_test.cc b/runtime/reference_resolver_test.cc index 93dd5b8fc..730bee532 100644 --- a/runtime/reference_resolver_test.cc +++ b/runtime/reference_resolver_test.cc @@ -84,7 +84,7 @@ TEST(ReferenceResolver, ResolveQualifiedFunctions) { ASSERT_OK_AND_ASSIGN(Value value, program->Evaluate(activation, value_factory.get())); ASSERT_TRUE(value->Is()); - EXPECT_TRUE(static_cast(value).NativeValue()); + EXPECT_TRUE(value.GetBool().NativeValue()); } TEST(ReferenceResolver, ResolveQualifiedFunctionsCheckedOnly) { @@ -216,7 +216,7 @@ TEST(ReferenceResolver, ResolveQualifiedIdentifiers) { program->Evaluate(activation, value_factory.get())); ASSERT_TRUE(value->Is()); - EXPECT_EQ(static_cast(value).NativeValue(), 7); + EXPECT_EQ(value.GetInt().NativeValue(), 7); } TEST(ReferenceResolver, ResolveQualifiedIdentifiersSkipParseOnly) { @@ -251,7 +251,7 @@ TEST(ReferenceResolver, ResolveQualifiedIdentifiersSkipParseOnly) { program->Evaluate(activation, value_factory.get())); ASSERT_TRUE(value->Is()); - EXPECT_THAT(static_cast(value).NativeValue(), + EXPECT_THAT(value.GetError().NativeValue(), StatusIs(absl::StatusCode::kUnknown, HasSubstr("\"com\""))); } @@ -335,7 +335,7 @@ TEST(ReferenceResolver, ResolveEnumConstants) { program->Evaluate(activation, value_factory.get())); ASSERT_TRUE(value->Is()); - EXPECT_TRUE(static_cast(value).NativeValue()); + EXPECT_TRUE(value.GetBool().NativeValue()); } TEST(ReferenceResolver, ResolveEnumConstantsSkipParseOnly) { @@ -364,7 +364,7 @@ TEST(ReferenceResolver, ResolveEnumConstantsSkipParseOnly) { ASSERT_TRUE(value->Is()); EXPECT_THAT( - static_cast(value).NativeValue(), + value.GetError().NativeValue(), StatusIs(absl::StatusCode::kUnknown, HasSubstr("\"google.api.expr.test.v1.proto2.GlobalEnum.GAZ\""))); } diff --git a/runtime/regex_precompilation_test.cc b/runtime/regex_precompilation_test.cc index 0b9b2df54..8c5171349 100644 --- a/runtime/regex_precompilation_test.cc +++ b/runtime/regex_precompilation_test.cc @@ -55,22 +55,19 @@ struct TestCase { MATCHER_P(IsIntValue, expected, "") { const Value& value = arg; - return value->Is() && - static_cast(value).NativeValue() == expected; + return value->Is() && value.GetInt().NativeValue() == expected; } MATCHER_P(IsBoolValue, expected, "") { const Value& value = arg; - return value->Is() && - static_cast(value).NativeValue() == expected; + return value->Is() && value.GetBool().NativeValue() == expected; } MATCHER_P(IsErrorValue, expected_substr, "") { const Value& value = arg; return value->Is() && - absl::StrContains( - static_cast(value).NativeValue().message(), - expected_substr); + absl::StrContains(value.GetError().NativeValue().message(), + expected_substr); } class RegexPrecompilationTest : public testing::TestWithParam {}; diff --git a/runtime/standard/container_membership_functions.cc b/runtime/standard/container_membership_functions.cc index d289f0f30..9f2a46dce 100644 --- a/runtime/standard/container_membership_functions.cc +++ b/runtime/standard/container_membership_functions.cc @@ -178,7 +178,7 @@ absl::Status RegisterMapMembershipFunctions(FunctionRegistry& registry, auto result = map_value.Has(factory, int_key); if (enable_heterogeneous_equality) { if (result.ok() && (*result).Is() && - static_cast(*result).NativeValue()) { + result->GetBool().NativeValue()) { return std::move(*result); } Number number = Number::FromInt64(key); @@ -186,7 +186,7 @@ absl::Status RegisterMapMembershipFunctions(FunctionRegistry& registry, const auto& result = map_value.Has(factory, factory.CreateUintValue(number.AsUint())); if (result.ok() && (*result).Is() && - static_cast(*result).NativeValue()) { + result->GetBool().NativeValue()) { return std::move(*result); } } @@ -219,7 +219,7 @@ absl::Status RegisterMapMembershipFunctions(FunctionRegistry& registry, const auto& result = map_value.Has(factory, uint_key); if (enable_heterogeneous_equality) { if (result.ok() && (*result).Is() && - static_cast(*result).NativeValue()) { + result->GetBool().NativeValue()) { return std::move(*result); } Number number = Number::FromUint64(key); @@ -227,7 +227,7 @@ absl::Status RegisterMapMembershipFunctions(FunctionRegistry& registry, const auto& result = map_value.Has(factory, factory.CreateIntValue(number.AsInt())); if (result.ok() && (*result).Is() && - static_cast(*result).NativeValue()) { + result->GetBool().NativeValue()) { return std::move(*result); } } @@ -246,7 +246,7 @@ absl::Status RegisterMapMembershipFunctions(FunctionRegistry& registry, const auto& result = map_value.Has(factory, factory.CreateIntValue(number.AsInt())); if (result.ok() && (*result).Is() && - static_cast(*result).NativeValue()) { + result->GetBool().NativeValue()) { return std::move(*result); } } @@ -254,7 +254,7 @@ absl::Status RegisterMapMembershipFunctions(FunctionRegistry& registry, const auto& result = map_value.Has(factory, factory.CreateUintValue(number.AsUint())); if (result.ok() && (*result).Is() && - static_cast(*result).NativeValue()) { + result->GetBool().NativeValue()) { return std::move(*result); } } diff --git a/runtime/standard/equality_functions.cc b/runtime/standard/equality_functions.cc index f1d7470d8..eeedbd36c 100644 --- a/runtime/standard/equality_functions.cc +++ b/runtime/standard/equality_functions.cc @@ -162,11 +162,11 @@ absl::StatusOr> OpaqueEqual(ValueManager& manager, absl::optional NumberFromValue(const Value& value) { if (value.Is()) { - return Number::FromInt64(static_cast(value).NativeValue()); + return Number::FromInt64(value.GetInt().NativeValue()); } else if (value.Is()) { - return Number::FromUint64(static_cast(value).NativeValue()); + return Number::FromUint64(value.GetUint().NativeValue()); } else if (value.Is()) { - return Number::FromDouble(static_cast(value).NativeValue()); + return Number::FromDouble(value.GetDouble().NativeValue()); } return absl::nullopt; @@ -453,8 +453,7 @@ absl::StatusOr> HomogenousValueEqual(ValueManager& factory, return Equal(Cast(v1), Cast(v2)); case ValueKind::kBytes: - return Equal(static_cast(v1), - static_cast(v2)); + return Equal(v1.GetBytes(), v2.GetBytes()); case ValueKind::kList: return ListEqual(factory, Cast(v1), Cast(v2)); diff --git a/runtime/standard/logical_functions_test.cc b/runtime/standard/logical_functions_test.cc index 400ccadf3..782d2cdb0 100644 --- a/runtime/standard/logical_functions_test.cc +++ b/runtime/standard/logical_functions_test.cc @@ -55,8 +55,7 @@ MATCHER_P3(DescriptorIs, name, arg_kinds, is_receiver, "") { MATCHER_P(IsBool, expected, "") { const Value& value = arg; - return value->Is() && - static_cast(value).NativeValue() == expected; + return value->Is() && value.GetBool().NativeValue() == expected; } // TODO: replace this with a parsed expr when the non-protobuf @@ -188,17 +187,16 @@ INSTANTIATE_TEST_SUITE_P( return {value_factory.CreateUnknownValue()}; }, IsBool(true)}, - TestCase{ - builtin::kNotStrictlyFalse, - [](ValueManager& value_factory) -> std::vector { - return {value_factory.CreateIntValue(42)}; - }, - Truly([](const Value& v) { - return v->Is() && - absl::StrContains( - static_cast(v).NativeValue().message(), - "No matching overloads"); - })}, + TestCase{builtin::kNotStrictlyFalse, + [](ValueManager& value_factory) -> std::vector { + return {value_factory.CreateIntValue(42)}; + }, + Truly([](const Value& v) { + return v->Is() && + absl::StrContains( + v.GetError().NativeValue().message(), + "No matching overloads"); + })}, })); } // namespace diff --git a/runtime/standard_runtime_builder_factory_test.cc b/runtime/standard_runtime_builder_factory_test.cc index 6ee11bb50..9ec2cc8b0 100644 --- a/runtime/standard_runtime_builder_factory_test.cc +++ b/runtime/standard_runtime_builder_factory_test.cc @@ -590,8 +590,7 @@ TEST(StandardRuntimeTest, RuntimeIssueSupport) { ASSERT_OK_AND_ASSIGN(auto result, program->Evaluate(activation, value_factory.get())); - EXPECT_TRUE(result->Is() && - static_cast(result).NativeValue()); + EXPECT_TRUE(result->Is() && result.GetBool().NativeValue()); } }