| 91 | // homogenous equality for comparing values. |
| 92 | template <typename EqualsProvider> |
| 93 | absl::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 | |
| 145 | bool MessageEqual(const CelValue::MessageWrapper& m1, |
| 146 | const CelValue::MessageWrapper& m2) { |
nothing calls this directly
no test coverage detected