Skip to content

Commit

Permalink
Integrate ParsedMapFieldValue, ParsedJsonMapValue, `ParsedRepeate…
Browse files Browse the repository at this point in the history
…dFieldValue`, and `ParsedJsonListValue` into the `Value` hierarchy

PiperOrigin-RevId: 671771702
  • Loading branch information
jcking authored and copybara-github committed Sep 8, 2024
1 parent 795c732 commit b8b4442
Show file tree
Hide file tree
Showing 10 changed files with 342 additions and 45 deletions.
150 changes: 142 additions & 8 deletions common/value.cc
Original file line number Diff line number Diff line change
Expand Up @@ -48,14 +48,16 @@
namespace cel {
namespace {

static constexpr std::array<ValueKind, 21> kValueToKindArray = {
ValueKind::kError, ValueKind::kBool, ValueKind::kBytes,
ValueKind::kDouble, ValueKind::kDuration, ValueKind::kError,
ValueKind::kInt, ValueKind::kList, ValueKind::kList,
ValueKind::kMap, ValueKind::kMap, ValueKind::kNull,
ValueKind::kOpaque, ValueKind::kString, ValueKind::kStruct,
ValueKind::kStruct, ValueKind::kStruct, ValueKind::kTimestamp,
ValueKind::kType, ValueKind::kUint, ValueKind::kUnknown};
static constexpr std::array<ValueKind, 25> kValueToKindArray = {
ValueKind::kError, ValueKind::kBool, ValueKind::kBytes,
ValueKind::kDouble, ValueKind::kDuration, ValueKind::kError,
ValueKind::kInt, ValueKind::kList, ValueKind::kList,
ValueKind::kList, ValueKind::kList, ValueKind::kMap,
ValueKind::kMap, ValueKind::kMap, ValueKind::kMap,
ValueKind::kNull, ValueKind::kOpaque, ValueKind::kString,
ValueKind::kStruct, ValueKind::kStruct, ValueKind::kStruct,
ValueKind::kTimestamp, ValueKind::kType, ValueKind::kUint,
ValueKind::kUnknown};

static_assert(kValueToKindArray.size() ==
absl::variant_size<common_internal::ValueVariant>(),
Expand Down Expand Up @@ -713,6 +715,15 @@ absl::optional<ListValue> Value::AsList() & {
alternative != nullptr) {
return *alternative;
}
if (const auto* alternative =
absl::get_if<ParsedRepeatedFieldValue>(&variant_);
alternative != nullptr) {
return *alternative;
}
if (const auto* alternative = absl::get_if<ParsedJsonListValue>(&variant_);
alternative != nullptr) {
return *alternative;
}
return absl::nullopt;
}

Expand All @@ -726,6 +737,15 @@ absl::optional<ListValue> Value::AsList() const& {
alternative != nullptr) {
return *alternative;
}
if (const auto* alternative =
absl::get_if<ParsedRepeatedFieldValue>(&variant_);
alternative != nullptr) {
return *alternative;
}
if (const auto* alternative = absl::get_if<ParsedJsonListValue>(&variant_);
alternative != nullptr) {
return *alternative;
}
return absl::nullopt;
}

Expand All @@ -739,6 +759,14 @@ absl::optional<ListValue> Value::AsList() && {
alternative != nullptr) {
return std::move(*alternative);
}
if (auto* alternative = absl::get_if<ParsedRepeatedFieldValue>(&variant_);
alternative != nullptr) {
return std::move(*alternative);
}
if (auto* alternative = absl::get_if<ParsedJsonListValue>(&variant_);
alternative != nullptr) {
return std::move(*alternative);
}
return absl::nullopt;
}

Expand All @@ -752,6 +780,14 @@ absl::optional<ListValue> Value::AsList() const&& {
alternative != nullptr) {
return std::move(*alternative);
}
if (auto* alternative = absl::get_if<ParsedRepeatedFieldValue>(&variant_);
alternative != nullptr) {
return std::move(*alternative);
}
if (auto* alternative = absl::get_if<ParsedJsonListValue>(&variant_);
alternative != nullptr) {
return std::move(*alternative);
}
return absl::nullopt;
}

Expand All @@ -765,6 +801,14 @@ absl::optional<MapValue> Value::AsMap() & {
alternative != nullptr) {
return *alternative;
}
if (const auto* alternative = absl::get_if<ParsedMapFieldValue>(&variant_);
alternative != nullptr) {
return *alternative;
}
if (const auto* alternative = absl::get_if<ParsedJsonMapValue>(&variant_);
alternative != nullptr) {
return *alternative;
}
return absl::nullopt;
}

Expand All @@ -778,6 +822,14 @@ absl::optional<MapValue> Value::AsMap() const& {
alternative != nullptr) {
return *alternative;
}
if (const auto* alternative = absl::get_if<ParsedMapFieldValue>(&variant_);
alternative != nullptr) {
return *alternative;
}
if (const auto* alternative = absl::get_if<ParsedJsonMapValue>(&variant_);
alternative != nullptr) {
return *alternative;
}
return absl::nullopt;
}

Expand All @@ -791,6 +843,14 @@ absl::optional<MapValue> Value::AsMap() && {
alternative != nullptr) {
return std::move(*alternative);
}
if (auto* alternative = absl::get_if<ParsedMapFieldValue>(&variant_);
alternative != nullptr) {
return std::move(*alternative);
}
if (auto* alternative = absl::get_if<ParsedJsonMapValue>(&variant_);
alternative != nullptr) {
return std::move(*alternative);
}
return absl::nullopt;
}

Expand All @@ -804,6 +864,14 @@ absl::optional<MapValue> Value::AsMap() const&& {
alternative != nullptr) {
return std::move(*alternative);
}
if (auto* alternative = absl::get_if<ParsedMapFieldValue>(&variant_);
alternative != nullptr) {
return std::move(*alternative);
}
if (auto* alternative = absl::get_if<ParsedJsonMapValue>(&variant_);
alternative != nullptr) {
return std::move(*alternative);
}
return absl::nullopt;
}

Expand Down Expand Up @@ -1200,6 +1268,15 @@ Value::operator ListValue() & {
alternative != nullptr) {
return *alternative;
}
if (const auto* alternative =
absl::get_if<ParsedRepeatedFieldValue>(&variant_);
alternative != nullptr) {
return *alternative;
}
if (const auto* alternative = absl::get_if<ParsedJsonListValue>(&variant_);
alternative != nullptr) {
return *alternative;
}
CEL_VALUE_THROW_BAD_VARIANT_ACCESS();
}

Expand All @@ -1214,6 +1291,15 @@ Value::operator ListValue() const& {
alternative != nullptr) {
return *alternative;
}
if (const auto* alternative =
absl::get_if<ParsedRepeatedFieldValue>(&variant_);
alternative != nullptr) {
return *alternative;
}
if (const auto* alternative = absl::get_if<ParsedJsonListValue>(&variant_);
alternative != nullptr) {
return *alternative;
}
CEL_VALUE_THROW_BAD_VARIANT_ACCESS();
}

Expand All @@ -1228,6 +1314,14 @@ Value::operator ListValue() && {
alternative != nullptr) {
return std::move(*alternative);
}
if (auto* alternative = absl::get_if<ParsedRepeatedFieldValue>(&variant_);
alternative != nullptr) {
return std::move(*alternative);
}
if (auto* alternative = absl::get_if<ParsedJsonListValue>(&variant_);
alternative != nullptr) {
return std::move(*alternative);
}
CEL_VALUE_THROW_BAD_VARIANT_ACCESS();
}

Expand All @@ -1242,6 +1336,14 @@ Value::operator ListValue() const&& {
alternative != nullptr) {
return std::move(*alternative);
}
if (auto* alternative = absl::get_if<ParsedRepeatedFieldValue>(&variant_);
alternative != nullptr) {
return std::move(*alternative);
}
if (auto* alternative = absl::get_if<ParsedJsonListValue>(&variant_);
alternative != nullptr) {
return std::move(*alternative);
}
CEL_VALUE_THROW_BAD_VARIANT_ACCESS();
}

Expand All @@ -1256,6 +1358,14 @@ Value::operator MapValue() & {
alternative != nullptr) {
return *alternative;
}
if (const auto* alternative = absl::get_if<ParsedMapFieldValue>(&variant_);
alternative != nullptr) {
return *alternative;
}
if (const auto* alternative = absl::get_if<ParsedJsonMapValue>(&variant_);
alternative != nullptr) {
return *alternative;
}
CEL_VALUE_THROW_BAD_VARIANT_ACCESS();
}

Expand All @@ -1270,6 +1380,14 @@ Value::operator MapValue() const& {
alternative != nullptr) {
return *alternative;
}
if (const auto* alternative = absl::get_if<ParsedMapFieldValue>(&variant_);
alternative != nullptr) {
return *alternative;
}
if (const auto* alternative = absl::get_if<ParsedJsonMapValue>(&variant_);
alternative != nullptr) {
return *alternative;
}
CEL_VALUE_THROW_BAD_VARIANT_ACCESS();
}

Expand All @@ -1284,6 +1402,14 @@ Value::operator MapValue() && {
alternative != nullptr) {
return std::move(*alternative);
}
if (auto* alternative = absl::get_if<ParsedMapFieldValue>(&variant_);
alternative != nullptr) {
return std::move(*alternative);
}
if (auto* alternative = absl::get_if<ParsedJsonMapValue>(&variant_);
alternative != nullptr) {
return std::move(*alternative);
}
CEL_VALUE_THROW_BAD_VARIANT_ACCESS();
}

Expand All @@ -1298,6 +1424,14 @@ Value::operator MapValue() const&& {
alternative != nullptr) {
return std::move(*alternative);
}
if (auto* alternative = absl::get_if<ParsedMapFieldValue>(&variant_);
alternative != nullptr) {
return std::move(*alternative);
}
if (auto* alternative = absl::get_if<ParsedJsonMapValue>(&variant_);
alternative != nullptr) {
return std::move(*alternative);
}
CEL_VALUE_THROW_BAD_VARIANT_ACCESS();
}

Expand Down
44 changes: 24 additions & 20 deletions common/value.h
Original file line number Diff line number Diff line change
Expand Up @@ -115,57 +115,57 @@ class Value final {
Value& operator=(Value&&) = default;

// NOLINTNEXTLINE(google-explicit-constructor)
Value(const ListValue& value)
: Value(CompositionTraits<ListValue>::Get<Value>(value)) {}
Value(const ListValue& value) : variant_(value.ToValueVariant()) {}

// NOLINTNEXTLINE(google-explicit-constructor)
Value(ListValue&& value)
: Value(CompositionTraits<ListValue>::Get<Value>(std::move(value))) {}
Value(ListValue&& value) : variant_(std::move(value).ToValueVariant()) {}

// NOLINTNEXTLINE(google-explicit-constructor)
Value& operator=(const ListValue& value) {
return *this = CompositionTraits<ListValue>::Get<Value>(value);
variant_ = value.ToValueVariant();
return *this;
}

// NOLINTNEXTLINE(google-explicit-constructor)
Value& operator=(ListValue&& value) {
return *this = CompositionTraits<ListValue>::Get<Value>(std::move(value));
variant_ = std::move(value).ToValueVariant();
return *this;
}

// NOLINTNEXTLINE(google-explicit-constructor)
Value(const MapValue& value)
: Value(CompositionTraits<MapValue>::Get<Value>(value)) {}
Value(const MapValue& value) : variant_(value.ToValueVariant()) {}

// NOLINTNEXTLINE(google-explicit-constructor)
Value(MapValue&& value)
: Value(CompositionTraits<MapValue>::Get<Value>(std::move(value))) {}
Value(MapValue&& value) : variant_(std::move(value).ToValueVariant()) {}

// NOLINTNEXTLINE(google-explicit-constructor)
Value& operator=(const MapValue& value) {
return *this = CompositionTraits<MapValue>::Get<Value>(value);
variant_ = value.ToValueVariant();
return *this;
}

// NOLINTNEXTLINE(google-explicit-constructor)
Value& operator=(MapValue&& value) {
return *this = CompositionTraits<MapValue>::Get<Value>(std::move(value));
variant_ = std::move(value).ToValueVariant();
return *this;
}

// NOLINTNEXTLINE(google-explicit-constructor)
Value(const StructValue& value)
: Value(CompositionTraits<StructValue>::Get<Value>(value)) {}
Value(const StructValue& value) : variant_(value.ToValueVariant()) {}

// NOLINTNEXTLINE(google-explicit-constructor)
Value(StructValue&& value)
: Value(CompositionTraits<StructValue>::Get<Value>(std::move(value))) {}
Value(StructValue&& value) : variant_(std::move(value).ToValueVariant()) {}

// NOLINTNEXTLINE(google-explicit-constructor)
Value& operator=(const StructValue& value) {
return *this = CompositionTraits<StructValue>::Get<Value>(value);
variant_ = value.ToValueVariant();
return *this;
}

// NOLINTNEXTLINE(google-explicit-constructor)
Value& operator=(StructValue&& value) {
return *this = CompositionTraits<StructValue>::Get<Value>(std::move(value));
variant_ = std::move(value).ToValueVariant();
return *this;
}

// NOLINTNEXTLINE(google-explicit-constructor)
Expand Down Expand Up @@ -303,13 +303,17 @@ class Value final {
bool IsList() const {
return absl::holds_alternative<common_internal::LegacyListValue>(
variant_) ||
absl::holds_alternative<ParsedListValue>(variant_);
absl::holds_alternative<ParsedListValue>(variant_) ||
absl::holds_alternative<ParsedRepeatedFieldValue>(variant_) ||
absl::holds_alternative<ParsedJsonListValue>(variant_);
}

// Returns `true` if this value is an instance of a map value.
bool IsMap() const {
return absl::holds_alternative<common_internal::LegacyMapValue>(variant_) ||
absl::holds_alternative<ParsedMapValue>(variant_);
absl::holds_alternative<ParsedMapValue>(variant_) ||
absl::holds_alternative<ParsedMapFieldValue>(variant_) ||
absl::holds_alternative<ParsedJsonMapValue>(variant_);
}

// Returns `true` if this value is an instance of a message value. If `true`
Expand Down
Loading

0 comments on commit b8b4442

Please # to comment.