MCPcopy Create free account
hub / github.com/cel-expr/cel-cpp / MapEqual

Function MapEqual

eval/internal/cel_value_equal.cc:93–143  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

91// homogenous equality for comparing values.
92template <typename EqualsProvider>
93absl::optional<bool> MapEqual(const CelMap* t1, const CelMap* t2) {
94 if (t1 == t2) {
95 return true;
96 }
97 if (t1->size() != t2->size()) {
98 return false;
99 }
100
101 google::protobuf::Arena arena;
102 auto list_keys = t1->ListKeys(&arena);
103 if (!list_keys.ok()) {
104 return absl::nullopt;
105 }
106 const CelList* keys = *list_keys;
107 for (int i = 0; i < keys->size(); i++) {
108 CelValue key = (*keys).Get(&arena, i);
109 CelValue v1 = (*t1).Get(&arena, key).value();
110 absl::optional<CelValue> v2 = (*t2).Get(&arena, key);
111 if (!v2.has_value()) {
112 auto number = GetNumberFromCelValue(key);
113 if (!number.has_value()) {
114 return false;
115 }
116 if (!key.IsInt64() && number->LosslessConvertibleToInt()) {
117 CelValue int_key = CelValue::CreateInt64(number->AsInt());
118 absl::optional<bool> eq = EqualsProvider()(key, int_key);
119 if (eq.has_value() && *eq) {
120 v2 = (*t2).Get(&arena, int_key);
121 }
122 }
123 if (!key.IsUint64() && !v2.has_value() &&
124 number->LosslessConvertibleToUint()) {
125 CelValue uint_key = CelValue::CreateUint64(number->AsUint());
126 absl::optional<bool> eq = EqualsProvider()(key, uint_key);
127 if (eq.has_value() && *eq) {
128 v2 = (*t2).Get(&arena, uint_key);
129 }
130 }
131 }
132 if (!v2.has_value()) {
133 return false;
134 }
135 absl::optional<bool> eq = EqualsProvider()(v1, *v2);
136 if (!eq.has_value() || !*eq) {
137 // Shortcircuit on value comparison errors and 'false' results.
138 return eq;
139 }
140 }
141
142 return true;
143}
144
145bool MessageEqual(const CelValue::MessageWrapper& m1,
146 const CelValue::MessageWrapper& m2) {

Callers

nothing calls this directly

Calls 13

GetNumberFromCelValueFunction · 0.85
IsInt64Method · 0.80
IsUint64Method · 0.80
sizeMethod · 0.45
ListKeysMethod · 0.45
okMethod · 0.45
GetMethod · 0.45
valueMethod · 0.45
has_valueMethod · 0.45
AsIntMethod · 0.45

Tested by

no test coverage detected