Skip to content

Commit

Permalink
Equal and IsZeroValue
Browse files Browse the repository at this point in the history
PiperOrigin-RevId: 595175889
  • Loading branch information
jcking authored and copybara-github committed Jan 9, 2024
1 parent dc7382c commit 4d5743f
Show file tree
Hide file tree
Showing 48 changed files with 1,357 additions and 1 deletion.
238 changes: 238 additions & 0 deletions common/value.h
Original file line number Diff line number Diff line change
Expand Up @@ -382,6 +382,27 @@ class Value final {
variant_);
}

absl::StatusOr<ValueView> Equal(ValueManager& value_manager, ValueView other,
Value& scratch
ABSL_ATTRIBUTE_LIFETIME_BOUND) const;

bool IsZeroValue() const {
AssertIsValid();
return absl::visit(
[](const auto& alternative) -> bool {
if constexpr (std::is_same_v<
absl::remove_cvref_t<decltype(alternative)>,
absl::monostate>) {
// In optimized builds, we just return false. In debug
// builds we cannot reach here.
return false;
} else {
return alternative.IsZeroValue();
}
},
variant_);
}

void swap(Value& other) noexcept {
AssertIsValid();
other.AssertIsValid();
Expand Down Expand Up @@ -1005,6 +1026,43 @@ class ValueView final {
variant_);
}

absl::StatusOr<ValueView> Equal(ValueManager& value_manager, ValueView other,
Value& scratch
ABSL_ATTRIBUTE_LIFETIME_BOUND) const {
AssertIsValid();
return absl::visit(
[&value_manager, other,
&scratch](auto alternative) -> absl::StatusOr<ValueView> {
if constexpr (std::is_same_v<
absl::remove_cvref_t<decltype(alternative)>,
absl::monostate>) {
// In optimized builds, we just return an error. In debug
// builds we cannot reach here.
return absl::InternalError("use of invalid ValueView");
} else {
return alternative.Equal(value_manager, other, scratch);
}
},
variant_);
}

bool IsZeroValue() const {
AssertIsValid();
return absl::visit(
[](auto alternative) -> bool {
if constexpr (std::is_same_v<
absl::remove_cvref_t<decltype(alternative)>,
absl::monostate>) {
// In optimized builds, we just return false. In debug
// builds we cannot reach here.
return false;
} else {
return alternative.IsZeroValue();
}
},
variant_);
}

void swap(ValueView& other) noexcept {
AssertIsValid();
other.AssertIsValid();
Expand Down Expand Up @@ -1197,6 +1255,26 @@ inline Value& Value::operator=(ValueView other) {
return *this;
}

inline absl::StatusOr<ValueView> Value::Equal(ValueManager& value_manager,
ValueView other,
Value& scratch) const {
AssertIsValid();
return absl::visit(
[&value_manager, other,
&scratch](const auto& alternative) -> absl::StatusOr<ValueView> {
if constexpr (std::is_same_v<
absl::remove_cvref_t<decltype(alternative)>,
absl::monostate>) {
// In optimized builds, we just return an error. In debug
// builds we cannot reach here.
return absl::InternalError("use of invalid Value");
} else {
return alternative.Equal(value_manager, other, scratch);
}
},
variant_);
}

using ValueIteratorPtr = std::unique_ptr<ValueIterator>;

class ValueIterator {
Expand Down Expand Up @@ -1252,6 +1330,11 @@ ParsedListValue::NewIterator(ValueManager& value_manager) const {
return interface_->NewIterator(value_manager);
}

inline absl::StatusOr<ValueView> ParsedListValue::Equal(
ValueManager& value_manager, ValueView other, Value& scratch) const {
return interface_->Equal(value_manager, other, scratch);
}

inline absl::StatusOr<ValueView> ParsedListValueView::Get(
ValueManager& value_manager, size_t index, Value& scratch) const {
return interface_->Get(value_manager, index, scratch);
Expand All @@ -1272,6 +1355,11 @@ ParsedListValueView::NewIterator(ValueManager& value_manager) const {
return interface_->NewIterator(value_manager);
}

inline absl::StatusOr<ValueView> ParsedListValueView::Equal(
ValueManager& value_manager, ValueView other, Value& scratch) const {
return interface_->Equal(value_manager, other, scratch);
}

inline absl::StatusOr<ValueView> ListValue::Get(ValueManager& value_manager,
size_t index,
Value& scratch) const {
Expand Down Expand Up @@ -1311,6 +1399,17 @@ inline absl::StatusOr<absl::Nonnull<ValueIteratorPtr>> ListValue::NewIterator(
variant_);
}

inline absl::StatusOr<ValueView> ListValue::Equal(ValueManager& value_manager,
ValueView other,
Value& scratch) const {
return absl::visit(
[&value_manager, other,
&scratch](const auto& alternative) -> absl::StatusOr<ValueView> {
return alternative.Equal(value_manager, other, scratch);
},
variant_);
}

inline absl::StatusOr<ValueView> ListValueView::Get(ValueManager& value_manager,
size_t index,
Value& scratch) const {
Expand Down Expand Up @@ -1350,6 +1449,27 @@ ListValueView::NewIterator(ValueManager& value_manager) const {
variant_);
}

inline absl::StatusOr<ValueView> ListValueView::Equal(
ValueManager& value_manager, ValueView other, Value& scratch) const {
return absl::visit(
[&value_manager, other,
&scratch](auto alternative) -> absl::StatusOr<ValueView> {
return alternative.Equal(value_manager, other, scratch);
},
variant_);
}

inline absl::StatusOr<ValueView> OpaqueValue::Equal(ValueManager& value_manager,
ValueView other,
Value& scratch) const {
return interface_->Equal(value_manager, other, scratch);
}

inline absl::StatusOr<ValueView> OpaqueValueView::Equal(
ValueManager& value_manager, ValueView other, Value& scratch) const {
return interface_->Equal(value_manager, other, scratch);
}

inline OptionalValue OptionalValue::None() {
return OptionalValue(common_internal::GetEmptyDynOptionalValue());
}
Expand Down Expand Up @@ -1396,6 +1516,11 @@ ParsedMapValue::NewIterator(ValueManager& value_manager) const {
return interface_->NewIterator(value_manager);
}

inline absl::StatusOr<ValueView> ParsedMapValue::Equal(
ValueManager& value_manager, ValueView other, Value& scratch) const {
return interface_->Equal(value_manager, other, scratch);
}

inline absl::StatusOr<ValueView> ParsedMapValueView::Get(
ValueManager& value_manager, ValueView key, Value& scratch) const {
return interface_->Get(value_manager, key, scratch);
Expand Down Expand Up @@ -1426,6 +1551,11 @@ ParsedMapValueView::NewIterator(ValueManager& value_manager) const {
return interface_->NewIterator(value_manager);
}

inline absl::StatusOr<ValueView> ParsedMapValueView::Equal(
ValueManager& value_manager, ValueView other, Value& scratch) const {
return interface_->Equal(value_manager, other, scratch);
}

inline absl::StatusOr<ValueView> MapValue::Get(ValueManager& value_manager,
ValueView key,
Value& scratch) const {
Expand Down Expand Up @@ -1487,6 +1617,17 @@ inline absl::StatusOr<absl::Nonnull<ValueIteratorPtr>> MapValue::NewIterator(
variant_);
}

inline absl::StatusOr<ValueView> MapValue::Equal(ValueManager& value_manager,
ValueView other,
Value& scratch) const {
return absl::visit(
[&value_manager, other,
&scratch](const auto& alternative) -> absl::StatusOr<ValueView> {
return alternative.Equal(value_manager, other, scratch);
},
variant_);
}

inline absl::StatusOr<ValueView> MapValueView::Get(ValueManager& value_manager,
ValueView key,
Value& scratch) const {
Expand Down Expand Up @@ -1548,6 +1689,16 @@ MapValueView::NewIterator(ValueManager& value_manager) const {
variant_);
}

inline absl::StatusOr<ValueView> MapValueView::Equal(
ValueManager& value_manager, ValueView other, Value& scratch) const {
return absl::visit(
[&value_manager, other,
&scratch](auto alternative) -> absl::StatusOr<ValueView> {
return alternative.Equal(value_manager, other, scratch);
},
variant_);
}

inline absl::StatusOr<ValueView> ParsedStructValue::GetFieldByName(
ValueManager& value_manager, absl::string_view name, Value& scratch) const {
return interface_->GetFieldByName(value_manager, name, scratch);
Expand All @@ -1558,6 +1709,16 @@ inline absl::StatusOr<ValueView> ParsedStructValue::GetFieldByNumber(
return interface_->GetFieldByNumber(value_manager, number, scratch);
}

inline absl::StatusOr<ValueView> ParsedStructValue::Equal(
ValueManager& value_manager, ValueView other, Value& scratch) const {
return interface_->Equal(value_manager, other, scratch);
}

inline absl::Status ParsedStructValue::ForEachField(
ValueManager& value_manager, ForEachFieldCallback callback) const {
return interface_->ForEachField(value_manager, callback);
}

inline absl::StatusOr<ValueView> ParsedStructValueView::GetFieldByName(
ValueManager& value_manager, absl::string_view name, Value& scratch) const {
return interface_->GetFieldByName(value_manager, name, scratch);
Expand All @@ -1568,6 +1729,16 @@ inline absl::StatusOr<ValueView> ParsedStructValueView::GetFieldByNumber(
return interface_->GetFieldByNumber(value_manager, number, scratch);
}

inline absl::StatusOr<ValueView> ParsedStructValueView::Equal(
ValueManager& value_manager, ValueView other, Value& scratch) const {
return interface_->Equal(value_manager, other, scratch);
}

inline absl::Status ParsedStructValueView::ForEachField(
ValueManager& value_manager, ForEachFieldCallback callback) const {
return interface_->ForEachField(value_manager, callback);
}

inline absl::StatusOr<ValueView> StructValue::GetFieldByName(
ValueManager& value_manager, absl::string_view name, Value& scratch) const {
AssertIsValid();
Expand Down Expand Up @@ -1602,6 +1773,40 @@ inline absl::StatusOr<ValueView> StructValue::GetFieldByNumber(
variant_);
}

inline absl::StatusOr<ValueView> StructValue::Equal(ValueManager& value_manager,
ValueView other,
Value& scratch) const {
AssertIsValid();
return absl::visit(
[&value_manager, other,
&scratch](const auto& alternative) -> absl::StatusOr<ValueView> {
if constexpr (std::is_same_v<
absl::remove_cvref_t<decltype(alternative)>,
absl::monostate>) {
return absl::InternalError("use of invalid StructValue");
} else {
return alternative.Equal(value_manager, other, scratch);
}
},
variant_);
}

inline absl::Status StructValue::ForEachField(
ValueManager& value_manager, ForEachFieldCallback callback) const {
AssertIsValid();
return absl::visit(
[&value_manager, callback](const auto& alternative) -> absl::Status {
if constexpr (std::is_same_v<
absl::remove_cvref_t<decltype(alternative)>,
absl::monostate>) {
return absl::InternalError("use of invalid StructValue");
} else {
return alternative.ForEachField(value_manager, callback);
}
},
variant_);
}

inline absl::StatusOr<ValueView> StructValueView::GetFieldByName(
ValueManager& value_manager, absl::string_view name, Value& scratch) const {
AssertIsValid();
Expand Down Expand Up @@ -1636,6 +1841,39 @@ inline absl::StatusOr<ValueView> StructValueView::GetFieldByNumber(
variant_);
}

inline absl::StatusOr<ValueView> StructValueView::Equal(
ValueManager& value_manager, ValueView other, Value& scratch) const {
AssertIsValid();
return absl::visit(
[&value_manager, other,
&scratch](auto alternative) -> absl::StatusOr<ValueView> {
if constexpr (std::is_same_v<
absl::remove_cvref_t<decltype(alternative)>,
absl::monostate>) {
return absl::InternalError("use of invalid StructValueView");
} else {
return alternative.Equal(value_manager, other, scratch);
}
},
variant_);
}

inline absl::Status StructValueView::ForEachField(
ValueManager& value_manager, ForEachFieldCallback callback) const {
AssertIsValid();
return absl::visit(
[&value_manager, callback](auto alternative) -> absl::Status {
if constexpr (std::is_same_v<
absl::remove_cvref_t<decltype(alternative)>,
absl::monostate>) {
return absl::InternalError("use of invalid StructValueView");
} else {
return alternative.ForEachField(value_manager, callback);
}
},
variant_);
}

} // namespace cel

#endif // THIRD_PARTY_CEL_CPP_COMMON_VALUE_H_
17 changes: 17 additions & 0 deletions common/values/bool_value.cc
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
#include "absl/strings/cord.h"
#include "absl/strings/string_view.h"
#include "common/any.h"
#include "common/casting.h"
#include "common/json.h"
#include "common/value.h"
#include "internal/serialize.h"
Expand Down Expand Up @@ -69,6 +70,14 @@ absl::StatusOr<Any> BoolValue::ConvertToAny(absl::string_view prefix) const {
return MakeAny(std::move(type_url), std::move(value));
}

absl::StatusOr<ValueView> BoolValue::Equal(ValueManager&, ValueView other,
Value&) const {
if (auto other_value = As<BoolValueView>(other); other_value.has_value()) {
return BoolValueView{NativeValue() == other_value->NativeValue()};
}
return BoolValueView{false};
}

absl::StatusOr<size_t> BoolValueView::GetSerializedSize() const {
return internal::SerializedBoolValueSize(NativeValue());
}
Expand Down Expand Up @@ -99,4 +108,12 @@ absl::StatusOr<Json> BoolValueView::ConvertToJson() const {
return NativeValue();
}

absl::StatusOr<ValueView> BoolValueView::Equal(ValueManager&, ValueView other,
Value&) const {
if (auto other_value = As<BoolValueView>(other); other_value.has_value()) {
return BoolValueView{NativeValue() == other_value->NativeValue()};
}
return BoolValueView{false};
}

} // namespace cel
Loading

0 comments on commit 4d5743f

Please # to comment.