@@ -422,15 +422,14 @@ absl::Status ParsedMapFieldValue::ListKeys(
422422 field_->message_type ()->map_key ()));
423423 auto builder = NewListValueBuilder (arena);
424424 builder->Reserve (Size ());
425- auto begin = extensions::protobuf_internal::ConstMapBegin (*reflection,
426- *message_, *field_);
427- const auto end = extensions::protobuf_internal::ConstMapEnd (
428- *reflection, *message_, *field_);
429- for (; begin != end; ++begin) {
430- Value scratch;
431- (*key_accessor)(begin.GetKey (), message_, arena, &scratch);
432- CEL_RETURN_IF_ERROR (builder->Add (std::move (scratch)));
433- }
425+ CEL_RETURN_IF_ERROR (extensions::protobuf_internal::ForEachMapEntry (
426+ *reflection, *message_, *field_,
427+ [&](auto key_ref, auto value_ref) -> absl::Status {
428+ Value scratch;
429+ (*key_accessor)(key_ref, message_, arena, &scratch);
430+ CEL_RETURN_IF_ERROR (builder->Add (std::move (scratch)));
431+ return absl::OkStatus ();
432+ }));
434433 *result = std::move (*builder).Build ();
435434 return absl::OkStatus ();
436435}
@@ -453,12 +452,23 @@ absl::Status ParsedMapFieldValue::ForEach(
453452 CEL_ASSIGN_OR_RETURN (
454453 auto value_accessor,
455454 common_internal::MapFieldValueAccessorFor (value_field));
455+ Value key_scratch;
456+ Value value_scratch;
457+ #if defined(PROTOBUF_HAS_MAP_REFLECTION_APIS)
458+ for (auto entry : reflection->GetMap (*message_, field_)) {
459+ (*key_accessor)(entry.key (), message_, arena, &key_scratch);
460+ (*value_accessor)(entry.value (), message_, value_field, descriptor_pool,
461+ message_factory, arena, &value_scratch);
462+ CEL_ASSIGN_OR_RETURN (auto ok, callback (key_scratch, value_scratch));
463+ if (!ok) {
464+ break ;
465+ }
466+ }
467+ #else // PROTOBUF_HAS_MAP_REFLECTION_APIS
456468 auto begin = extensions::protobuf_internal::ConstMapBegin (
457469 *reflection, *message_, *field_);
458470 const auto end = extensions::protobuf_internal::ConstMapEnd (
459471 *reflection, *message_, *field_);
460- Value key_scratch;
461- Value value_scratch;
462472 for (; begin != end; ++begin) {
463473 (*key_accessor)(begin.GetKey (), message_, arena, &key_scratch);
464474 (*value_accessor)(begin.GetValueRef (), message_, value_field,
@@ -469,6 +479,7 @@ absl::Status ParsedMapFieldValue::ForEach(
469479 break ;
470480 }
471481 }
482+ #endif // PROTOBUF_HAS_MAP_REFLECTION_APIS
472483 }
473484 return absl::OkStatus ();
474485}
@@ -486,10 +497,17 @@ class ParsedMapFieldValueIterator final : public ValueIterator {
486497 value_field_ (field->message_type ()->map_value()),
487498 key_accessor_(key_accessor),
488499 value_accessor_(value_accessor),
500+ #if defined(PROTOBUF_HAS_MAP_REFLECTION_APIS)
501+ begin_ (message->GetReflection ()->GetMap(*message, field).begin()),
502+ end_(message->GetReflection ()->GetMap(*message, field).end())
503+ #else // PROTOBUF_HAS_MAP_REFLECTION_APIS
489504 begin_ (extensions::protobuf_internal::ConstMapBegin(
490505 *message_->GetReflection (), *message_, *field)),
491506 end_(extensions::protobuf_internal::ConstMapEnd(
492- *message_->GetReflection (), *message_, *field)) {}
507+ *message_->GetReflection (), *message_, *field))
508+ #endif // PROTOBUF_HAS_MAP_REFLECTION_APIS
509+ {
510+ }
493511
494512 bool HasNext () override { return begin_ != end_; }
495513
@@ -502,7 +520,11 @@ class ParsedMapFieldValueIterator final : public ValueIterator {
502520 " ValueIterator::Next called after ValueIterator::HasNext returned "
503521 " false" );
504522 }
523+ #if defined(PROTOBUF_HAS_MAP_REFLECTION_APIS)
524+ (*key_accessor_)(begin_->key (), message_, arena, result);
525+ #else // PROTOBUF_HAS_MAP_REFLECTION_APIS
505526 (*key_accessor_)(begin_.GetKey (), message_, arena, result);
527+ #endif // PROTOBUF_HAS_MAP_REFLECTION_APIS
506528 ++begin_;
507529 return absl::OkStatus ();
508530 }
@@ -520,7 +542,11 @@ class ParsedMapFieldValueIterator final : public ValueIterator {
520542 if (begin_ == end_) {
521543 return false ;
522544 }
545+ #if defined(PROTOBUF_HAS_MAP_REFLECTION_APIS)
546+ (*key_accessor_)(begin_->key (), message_, arena, key_or_value);
547+ #else // PROTOBUF_HAS_MAP_REFLECTION_APIS
523548 (*key_accessor_)(begin_.GetKey (), message_, arena, key_or_value);
549+ #endif // PROTOBUF_HAS_MAP_REFLECTION_APIS
524550 ++begin_;
525551 return true ;
526552 }
@@ -538,11 +564,19 @@ class ParsedMapFieldValueIterator final : public ValueIterator {
538564 if (begin_ == end_) {
539565 return false ;
540566 }
567+ #if defined(PROTOBUF_HAS_MAP_REFLECTION_APIS)
568+ (*key_accessor_)(begin_->key (), message_, arena, key);
569+ if (value != nullptr ) {
570+ (*value_accessor_)(begin_->value (), message_, value_field_,
571+ descriptor_pool, message_factory, arena, value);
572+ }
573+ #else // PROTOBUF_HAS_MAP_REFLECTION_APIS
541574 (*key_accessor_)(begin_.GetKey (), message_, arena, key);
542575 if (value != nullptr ) {
543576 (*value_accessor_)(begin_.GetValueRef (), message_, value_field_,
544577 descriptor_pool, message_factory, arena, value);
545578 }
579+ #endif // PROTOBUF_HAS_MAP_REFLECTION_APIS
546580 ++begin_;
547581 return true ;
548582 }
@@ -552,8 +586,13 @@ class ParsedMapFieldValueIterator final : public ValueIterator {
552586 const google::protobuf::FieldDescriptor* absl_nonnull const value_field_;
553587 const absl_nonnull common_internal::MapFieldKeyAccessor key_accessor_;
554588 const absl_nonnull common_internal::MapFieldValueAccessor value_accessor_;
589+ #if defined(PROTOBUF_HAS_MAP_REFLECTION_APIS)
590+ proto2::GenericConstMapRef::iterator begin_;
591+ const proto2::GenericConstMapRef::iterator end_;
592+ #else // PROTOBUF_HAS_MAP_REFLECTION_APIS
555593 google::protobuf::ConstMapIterator begin_;
556594 const google::protobuf::ConstMapIterator end_;
595+ #endif // PROTOBUF_HAS_MAP_REFLECTION_APIS
557596};
558597
559598} // namespace
0 commit comments