@@ -114,29 +114,63 @@ MessageWrapper AsMessageWrapper(uintptr_t message_ptr, uintptr_t type_info) {
114114
115115class CelListIterator final : public ValueIterator {
116116 public:
117- CelListIterator (google::protobuf::Arena* arena, const CelList* cel_list)
118- : arena_(arena), cel_list_(cel_list), size_(cel_list_->size ()) {}
117+ explicit CelListIterator (const CelList* cel_list)
118+ : cel_list_(cel_list), size_(cel_list_->size ()) {}
119119
120120 bool HasNext () override { return index_ < size_; }
121121
122- absl::Status Next (ValueManager&, Value& result) override {
122+ absl::Status Next (ValueManager& value_manager , Value& result) override {
123123 if (!HasNext ()) {
124124 return absl::FailedPreconditionError (
125125 " ValueIterator::Next() called when ValueIterator::HasNext() returns "
126126 " false" );
127127 }
128- auto cel_value = cel_list_->Get (arena_, index_++);
129- CEL_RETURN_IF_ERROR (ModernValue (arena_, cel_value, result));
128+ auto * arena = value_manager.GetMemoryManager ().arena ();
129+ auto cel_value = cel_list_->Get (arena, index_++);
130+ CEL_RETURN_IF_ERROR (ModernValue (arena, cel_value, result));
130131 return absl::OkStatus ();
131132 }
132133
133134 private:
134- google::protobuf::Arena* const arena_;
135135 const CelList* const cel_list_;
136136 const int size_;
137137 int index_ = 0 ;
138138};
139139
140+ class CelMapIterator final : public ValueIterator {
141+ public:
142+ explicit CelMapIterator (const CelMap* cel_map)
143+ : cel_map_(cel_map), size_(cel_map->size ()) {}
144+
145+ bool HasNext () override { return index_ < size_; }
146+
147+ absl::Status Next (ValueManager& value_manager, Value& result) override {
148+ if (!HasNext ()) {
149+ return absl::FailedPreconditionError (
150+ " ValueIterator::Next() called when ValueIterator::HasNext() returns "
151+ " false" );
152+ }
153+ ProjectKeys (value_manager.GetMemoryManager ().arena ());
154+ CEL_RETURN_IF_ERROR (cel_list_.status ());
155+ auto * arena = value_manager.GetMemoryManager ().arena ();
156+ auto cel_value = (*cel_list_)->Get (arena, index_++);
157+ CEL_RETURN_IF_ERROR (ModernValue (arena, cel_value, result));
158+ return absl::OkStatus ();
159+ }
160+
161+ private:
162+ void ProjectKeys (google::protobuf::Arena* arena) {
163+ if (cel_list_.ok () && *cel_list_ == nullptr ) {
164+ cel_list_ = cel_map_->ListKeys (arena);
165+ }
166+ }
167+
168+ const CelMap* const cel_map_;
169+ const int size_ = 0 ;
170+ absl::StatusOr<const CelList*> cel_list_ = nullptr ;
171+ int index_ = 0 ;
172+ };
173+
140174std::string cel_common_internal_LegacyListValue_DebugString (uintptr_t impl) {
141175 return CelValue::CreateList (AsCelList (impl)).DebugString ();
142176}
@@ -182,11 +216,8 @@ absl::Status cel_common_internal_LegacyListValue_ForEach(
182216}
183217
184218absl::StatusOr<absl::Nonnull<ValueIteratorPtr>>
185- cel_common_internal_LegacyListValue_NewIterator (uintptr_t impl,
186- ValueManager& value_manager) {
187- return std::make_unique<CelListIterator>(
188- extensions::ProtoMemoryManagerArena (value_manager.GetMemoryManager ()),
189- AsCelList (impl));
219+ cel_common_internal_LegacyListValue_NewIterator (uintptr_t impl) {
220+ return std::make_unique<CelListIterator>(AsCelList (impl));
190221}
191222
192223absl::Status cel_common_internal_LegacyListValue_Contains (
@@ -489,9 +520,9 @@ absl::Status LegacyListValue::ForEach(ValueManager& value_manager,
489520 callback);
490521}
491522
492- absl::StatusOr<absl::Nonnull<ValueIteratorPtr>> LegacyListValue::NewIterator (
493- ValueManager& value_manager) const {
494- return cel_common_internal_LegacyListValue_NewIterator (impl_, value_manager );
523+ absl::StatusOr<absl::Nonnull<ValueIteratorPtr>> LegacyListValue::NewIterator ()
524+ const {
525+ return cel_common_internal_LegacyListValue_NewIterator (impl_);
495526}
496527
497528absl::Status LegacyListValue::Contains (ValueManager& value_manager,
@@ -644,13 +675,8 @@ absl::Status cel_common_internal_LegacyMapValue_ForEach(
644675}
645676
646677absl::StatusOr<absl::Nonnull<ValueIteratorPtr>>
647- cel_common_internal_LegacyMapValue_NewIterator (uintptr_t impl,
648- ValueManager& value_manager) {
649- auto * arena =
650- extensions::ProtoMemoryManagerArena (value_manager.GetMemoryManager ());
651- CEL_ASSIGN_OR_RETURN (auto keys, AsCelMap (impl)->ListKeys (arena));
652- return cel_common_internal_LegacyListValue_NewIterator (
653- reinterpret_cast <uintptr_t >(keys), value_manager);
678+ cel_common_internal_LegacyMapValue_NewIterator (uintptr_t impl) {
679+ return std::make_unique<CelMapIterator>(AsCelMap (impl));
654680}
655681
656682} // namespace
@@ -800,9 +826,9 @@ absl::Status LegacyMapValue::ForEach(ValueManager& value_manager,
800826 callback);
801827}
802828
803- absl::StatusOr<absl::Nonnull<ValueIteratorPtr>> LegacyMapValue::NewIterator (
804- ValueManager& value_manager) const {
805- return cel_common_internal_LegacyMapValue_NewIterator (impl_, value_manager );
829+ absl::StatusOr<absl::Nonnull<ValueIteratorPtr>> LegacyMapValue::NewIterator ()
830+ const {
831+ return cel_common_internal_LegacyMapValue_NewIterator (impl_);
806832}
807833
808834} // namespace common_internal
0 commit comments