@@ -423,15 +423,14 @@ absl::Status ParsedMapFieldValue::ListKeys(
423423 field_->message_type ()->map_key ()));
424424 auto builder = NewListValueBuilder (arena);
425425 builder->Reserve (Size ());
426- auto begin = extensions::protobuf_internal::ConstMapBegin (*reflection,
427- *message_, *field_);
428- const auto end = extensions::protobuf_internal::ConstMapEnd (
429- *reflection, *message_, *field_);
430- for (; begin != end; ++begin) {
431- Value scratch;
432- (*key_accessor)(begin.GetKey (), message_, arena, &scratch);
433- CEL_RETURN_IF_ERROR (builder->Add (std::move (scratch)));
434- }
426+ CEL_RETURN_IF_ERROR (extensions::protobuf_internal::ForEachMapEntry (
427+ *reflection, *message_, *field_,
428+ [&](auto key_ref, auto value_ref) -> absl::Status {
429+ Value scratch;
430+ (*key_accessor)(key_ref, message_, arena, &scratch);
431+ CEL_RETURN_IF_ERROR (builder->Add (std::move (scratch)));
432+ return absl::OkStatus ();
433+ }));
435434 *result = std::move (*builder).Build ();
436435 return absl::OkStatus ();
437436}
@@ -454,12 +453,23 @@ absl::Status ParsedMapFieldValue::ForEach(
454453 CEL_ASSIGN_OR_RETURN (
455454 auto value_accessor,
456455 common_internal::MapFieldValueAccessorFor (value_field));
456+ Value key_scratch;
457+ Value value_scratch;
458+ #if defined(PROTOBUF_HAS_MAP_REFLECTION_APIS)
459+ for (auto entry : reflection->GetMap (*message_, field_)) {
460+ (*key_accessor)(entry.key (), message_, arena, &key_scratch);
461+ (*value_accessor)(entry.value (), message_, value_field, descriptor_pool,
462+ message_factory, arena, &value_scratch);
463+ CEL_ASSIGN_OR_RETURN (auto ok, callback (key_scratch, value_scratch));
464+ if (!ok) {
465+ break ;
466+ }
467+ }
468+ #else // PROTOBUF_HAS_MAP_REFLECTION_APIS
457469 auto begin = extensions::protobuf_internal::ConstMapBegin (
458470 *reflection, *message_, *field_);
459471 const auto end = extensions::protobuf_internal::ConstMapEnd (
460472 *reflection, *message_, *field_);
461- Value key_scratch;
462- Value value_scratch;
463473 for (; begin != end; ++begin) {
464474 (*key_accessor)(begin.GetKey (), message_, arena, &key_scratch);
465475 (*value_accessor)(begin.GetValueRef (), message_, value_field,
@@ -470,6 +480,7 @@ absl::Status ParsedMapFieldValue::ForEach(
470480 break ;
471481 }
472482 }
483+ #endif // PROTOBUF_HAS_MAP_REFLECTION_APIS
473484 }
474485 return absl::OkStatus ();
475486}
@@ -487,10 +498,17 @@ class ParsedMapFieldValueIterator final : public ValueIterator {
487498 value_field_ (field->message_type ()->map_value()),
488499 key_accessor_(key_accessor),
489500 value_accessor_(value_accessor),
501+ #if defined(PROTOBUF_HAS_MAP_REFLECTION_APIS)
502+ begin_ (message->GetReflection ()->GetMap(*message, field).begin()),
503+ end_(message->GetReflection ()->GetMap(*message, field).end())
504+ #else // PROTOBUF_HAS_MAP_REFLECTION_APIS
490505 begin_ (extensions::protobuf_internal::ConstMapBegin(
491506 *message_->GetReflection (), *message_, *field)),
492507 end_(extensions::protobuf_internal::ConstMapEnd(
493- *message_->GetReflection (), *message_, *field)) {}
508+ *message_->GetReflection (), *message_, *field))
509+ #endif // PROTOBUF_HAS_MAP_REFLECTION_APIS
510+ {
511+ }
494512
495513 bool HasNext () override { return begin_ != end_; }
496514
@@ -503,7 +521,11 @@ class ParsedMapFieldValueIterator final : public ValueIterator {
503521 " ValueIterator::Next called after ValueIterator::HasNext returned "
504522 " false" );
505523 }
524+ #if defined(PROTOBUF_HAS_MAP_REFLECTION_APIS)
525+ (*key_accessor_)(begin_->key (), message_, arena, result);
526+ #else // PROTOBUF_HAS_MAP_REFLECTION_APIS
506527 (*key_accessor_)(begin_.GetKey (), message_, arena, result);
528+ #endif // PROTOBUF_HAS_MAP_REFLECTION_APIS
507529 ++begin_;
508530 return absl::OkStatus ();
509531 }
@@ -521,7 +543,11 @@ class ParsedMapFieldValueIterator final : public ValueIterator {
521543 if (begin_ == end_) {
522544 return false ;
523545 }
546+ #if defined(PROTOBUF_HAS_MAP_REFLECTION_APIS)
547+ (*key_accessor_)(begin_->key (), message_, arena, key_or_value);
548+ #else // PROTOBUF_HAS_MAP_REFLECTION_APIS
524549 (*key_accessor_)(begin_.GetKey (), message_, arena, key_or_value);
550+ #endif // PROTOBUF_HAS_MAP_REFLECTION_APIS
525551 ++begin_;
526552 return true ;
527553 }
@@ -539,11 +565,19 @@ class ParsedMapFieldValueIterator final : public ValueIterator {
539565 if (begin_ == end_) {
540566 return false ;
541567 }
568+ #if defined(PROTOBUF_HAS_MAP_REFLECTION_APIS)
569+ (*key_accessor_)(begin_->key (), message_, arena, key);
570+ if (value != nullptr ) {
571+ (*value_accessor_)(begin_->value (), message_, value_field_,
572+ descriptor_pool, message_factory, arena, value);
573+ }
574+ #else // PROTOBUF_HAS_MAP_REFLECTION_APIS
542575 (*key_accessor_)(begin_.GetKey (), message_, arena, key);
543576 if (value != nullptr ) {
544577 (*value_accessor_)(begin_.GetValueRef (), message_, value_field_,
545578 descriptor_pool, message_factory, arena, value);
546579 }
580+ #endif // PROTOBUF_HAS_MAP_REFLECTION_APIS
547581 ++begin_;
548582 return true ;
549583 }
@@ -553,8 +587,13 @@ class ParsedMapFieldValueIterator final : public ValueIterator {
553587 const google::protobuf::FieldDescriptor* absl_nonnull const value_field_;
554588 const absl_nonnull common_internal::MapFieldKeyAccessor key_accessor_;
555589 const absl_nonnull common_internal::MapFieldValueAccessor value_accessor_;
590+ #if defined(PROTOBUF_HAS_MAP_REFLECTION_APIS)
591+ proto2::GenericConstMapRef::iterator begin_;
592+ const proto2::GenericConstMapRef::iterator end_;
593+ #else // PROTOBUF_HAS_MAP_REFLECTION_APIS
556594 google::protobuf::ConstMapIterator begin_;
557595 const google::protobuf::ConstMapIterator end_;
596+ #endif // PROTOBUF_HAS_MAP_REFLECTION_APIS
558597};
559598
560599} // namespace
0 commit comments