| 179 | namespace common_internal { |
| 180 | |
| 181 | absl::Status ListValueEqual( |
| 182 | const ListValue& lhs, const ListValue& rhs, |
| 183 | const google::protobuf::DescriptorPool* absl_nonnull descriptor_pool, |
| 184 | google::protobuf::MessageFactory* absl_nonnull message_factory, |
| 185 | google::protobuf::Arena* absl_nonnull arena, Value* absl_nonnull result) { |
| 186 | ABSL_DCHECK(descriptor_pool != nullptr); |
| 187 | ABSL_DCHECK(message_factory != nullptr); |
| 188 | ABSL_DCHECK(arena != nullptr); |
| 189 | ABSL_DCHECK(result != nullptr); |
| 190 | |
| 191 | CEL_ASSIGN_OR_RETURN(auto lhs_size, lhs.Size()); |
| 192 | CEL_ASSIGN_OR_RETURN(auto rhs_size, rhs.Size()); |
| 193 | if (lhs_size != rhs_size) { |
| 194 | *result = FalseValue(); |
| 195 | return absl::OkStatus(); |
| 196 | } |
| 197 | CEL_ASSIGN_OR_RETURN(auto lhs_iterator, lhs.NewIterator()); |
| 198 | CEL_ASSIGN_OR_RETURN(auto rhs_iterator, rhs.NewIterator()); |
| 199 | Value lhs_element; |
| 200 | Value rhs_element; |
| 201 | for (size_t index = 0; index < lhs_size; ++index) { |
| 202 | ABSL_CHECK(lhs_iterator->HasNext()); // Crash OK |
| 203 | ABSL_CHECK(rhs_iterator->HasNext()); // Crash OK |
| 204 | CEL_RETURN_IF_ERROR(lhs_iterator->Next(descriptor_pool, message_factory, |
| 205 | arena, &lhs_element)); |
| 206 | CEL_RETURN_IF_ERROR(rhs_iterator->Next(descriptor_pool, message_factory, |
| 207 | arena, &rhs_element)); |
| 208 | CEL_RETURN_IF_ERROR(lhs_element.Equal(rhs_element, descriptor_pool, |
| 209 | message_factory, arena, result)); |
| 210 | if (result->IsFalse()) { |
| 211 | return absl::OkStatus(); |
| 212 | } |
| 213 | } |
| 214 | ABSL_DCHECK(!lhs_iterator->HasNext()); |
| 215 | ABSL_DCHECK(!rhs_iterator->HasNext()); |
| 216 | *result = TrueValue(); |
| 217 | return absl::OkStatus(); |
| 218 | } |
| 219 | |
| 220 | absl::Status ListValueEqual( |
| 221 | const CustomListValueInterface& lhs, const ListValue& rhs, |