Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Update ListValue::ForEach to additionally pass indices for convinience #529

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
1 commit merged into from
Jan 9, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 28 additions & 0 deletions common/value.h
Original file line number Diff line number Diff line change
Expand Up @@ -1242,6 +1242,11 @@ inline absl::Status ParsedListValue::ForEach(ValueManager& value_manager,
return interface_->ForEach(value_manager, callback);
}

inline absl::Status ParsedListValue::ForEach(
ValueManager& value_manager, ForEachWithIndexCallback callback) const {
return interface_->ForEach(value_manager, callback);
}

inline absl::StatusOr<absl::Nonnull<ValueIteratorPtr>>
ParsedListValue::NewIterator(ValueManager& value_manager) const {
return interface_->NewIterator(value_manager);
Expand All @@ -1257,6 +1262,11 @@ inline absl::Status ParsedListValueView::ForEach(
return interface_->ForEach(value_manager, callback);
}

inline absl::Status ParsedListValueView::ForEach(
ValueManager& value_manager, ForEachWithIndexCallback callback) const {
return interface_->ForEach(value_manager, callback);
}

inline absl::StatusOr<absl::Nonnull<ValueIteratorPtr>>
ParsedListValueView::NewIterator(ValueManager& value_manager) const {
return interface_->NewIterator(value_manager);
Expand All @@ -1282,6 +1292,15 @@ inline absl::Status ListValue::ForEach(ValueManager& value_manager,
variant_);
}

inline absl::Status ListValue::ForEach(
ValueManager& value_manager, ForEachWithIndexCallback callback) const {
return absl::visit(
[&value_manager, callback](const auto& alternative) -> absl::Status {
return alternative.ForEach(value_manager, callback);
},
variant_);
}

inline absl::StatusOr<absl::Nonnull<ValueIteratorPtr>> ListValue::NewIterator(
ValueManager& value_manager) const {
return absl::visit(
Expand Down Expand Up @@ -1312,6 +1331,15 @@ inline absl::Status ListValueView::ForEach(ValueManager& value_manager,
variant_);
}

inline absl::Status ListValueView::ForEach(
ValueManager& value_manager, ForEachWithIndexCallback callback) const {
return absl::visit(
[&value_manager, callback](auto alternative) -> absl::Status {
return alternative.ForEach(value_manager, callback);
},
variant_);
}

inline absl::StatusOr<absl::Nonnull<ValueIteratorPtr>>
ListValueView::NewIterator(ValueManager& value_manager) const {
return absl::visit(
Expand Down
18 changes: 17 additions & 1 deletion common/values/legacy_list_value.cc
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ using LegacyListValue_Get = absl::StatusOr<ValueView> (*)(uintptr_t,
ValueManager&, size_t,
Value&);
using LegacyListValue_ForEach = absl::Status (*)(
uintptr_t, ValueManager&, LegacyListValue::ForEachCallback);
uintptr_t, ValueManager&, LegacyListValue::ForEachWithIndexCallback);
using LegacyListValue_NewIterator =
absl::StatusOr<absl::Nonnull<ValueIteratorPtr>> (*)(uintptr_t,
ValueManager&);
Expand Down Expand Up @@ -162,6 +162,14 @@ absl::StatusOr<ValueView> LegacyListValue::Get(ValueManager& value_manager,

absl::Status LegacyListValue::ForEach(ValueManager& value_manager,
ForEachCallback callback) const {
return ForEach(value_manager,
[callback](size_t, ValueView value) -> absl::StatusOr<bool> {
return callback(value);
});
}

absl::Status LegacyListValue::ForEach(ValueManager& value_manager,
ForEachWithIndexCallback callback) const {
InitializeLegacyListValue();
return (*legacy_list_value_vtable.for_each)(impl_, value_manager, callback);
}
Expand Down Expand Up @@ -239,6 +247,14 @@ absl::StatusOr<ValueView> LegacyListValueView::Get(ValueManager& value_manager,

absl::Status LegacyListValueView::ForEach(ValueManager& value_manager,
ForEachCallback callback) const {
return ForEach(value_manager,
[callback](size_t, ValueView value) -> absl::StatusOr<bool> {
return callback(value);
});
}

absl::Status LegacyListValueView::ForEach(
ValueManager& value_manager, ForEachWithIndexCallback callback) const {
InitializeLegacyListValue();
return (*legacy_list_value_vtable.for_each)(impl_, value_manager, callback);
}
Expand Down
12 changes: 12 additions & 0 deletions common/values/legacy_list_value.h
Original file line number Diff line number Diff line change
Expand Up @@ -109,9 +109,15 @@ class LegacyListValue final {

using ForEachCallback = typename ListValueInterface::ForEachCallback;

using ForEachWithIndexCallback =
typename ListValueInterface::ForEachWithIndexCallback;

absl::Status ForEach(ValueManager& value_manager,
ForEachCallback callback) const;

absl::Status ForEach(ValueManager& value_manager,
ForEachWithIndexCallback callback) const;

absl::StatusOr<absl::Nonnull<ValueIteratorPtr>> NewIterator(
ValueManager& value_manager) const;

Expand Down Expand Up @@ -205,9 +211,15 @@ class LegacyListValueView final {

using ForEachCallback = typename ListValueInterface::ForEachCallback;

using ForEachWithIndexCallback =
typename ListValueInterface::ForEachWithIndexCallback;

absl::Status ForEach(ValueManager& value_manager,
ForEachCallback callback) const;

absl::Status ForEach(ValueManager& value_manager,
ForEachWithIndexCallback callback) const;

absl::StatusOr<absl::Nonnull<ValueIteratorPtr>> NewIterator(
ValueManager& value_manager) const;

Expand Down
12 changes: 12 additions & 0 deletions common/values/list_value.h
Original file line number Diff line number Diff line change
Expand Up @@ -235,9 +235,15 @@ class ListValue final {

using ForEachCallback = typename ListValueInterface::ForEachCallback;

using ForEachWithIndexCallback =
typename ListValueInterface::ForEachWithIndexCallback;

absl::Status ForEach(ValueManager& value_manager,
ForEachCallback callback) const;

absl::Status ForEach(ValueManager& value_manager,
ForEachWithIndexCallback callback) const;

absl::StatusOr<absl::Nonnull<ValueIteratorPtr>> NewIterator(
ValueManager& value_manager) const;

Expand Down Expand Up @@ -544,9 +550,15 @@ class ListValueView final {

using ForEachCallback = typename ListValueInterface::ForEachCallback;

using ForEachWithIndexCallback =
typename ListValueInterface::ForEachWithIndexCallback;

absl::Status ForEach(ValueManager& value_manager,
ForEachCallback callback) const;

absl::Status ForEach(ValueManager& value_manager,
ForEachWithIndexCallback callback) const;

absl::StatusOr<absl::Nonnull<ValueIteratorPtr>> NewIterator(
ValueManager& value_manager) const;

Expand Down
4 changes: 4 additions & 0 deletions common/values/list_value_interface.h
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
#ifndef THIRD_PARTY_CEL_CPP_COMMON_VALUES_LIST_VALUE_INTERFACE_H_
#define THIRD_PARTY_CEL_CPP_COMMON_VALUES_LIST_VALUE_INTERFACE_H_

#include <cstddef>
#include <string>

#include "absl/functional/function_ref.h"
Expand Down Expand Up @@ -61,6 +62,9 @@ class ListValueInterface : public ValueInterface {

using ForEachCallback = absl::FunctionRef<absl::StatusOr<bool>(ValueView)>;

using ForEachWithIndexCallback =
absl::FunctionRef<absl::StatusOr<bool>(size_t, ValueView)>;

protected:
Type GetTypeImpl(TypeManager& type_manager) const override {
return Type(type_manager.GetDynListType());
Expand Down
10 changes: 9 additions & 1 deletion common/values/parsed_list_value.cc
Original file line number Diff line number Diff line change
Expand Up @@ -73,11 +73,19 @@ absl::StatusOr<ValueView> ParsedListValueInterface::Get(

absl::Status ParsedListValueInterface::ForEach(ValueManager& value_manager,
ForEachCallback callback) const {
return ForEach(value_manager,
[callback](size_t, ValueView value) -> absl::StatusOr<bool> {
return callback(value);
});
}

absl::Status ParsedListValueInterface::ForEach(
ValueManager& value_manager, ForEachWithIndexCallback callback) const {
const size_t size = Size();
for (size_t index = 0; index < size; ++index) {
Value scratch;
CEL_ASSIGN_OR_RETURN(auto element, GetImpl(value_manager, index, scratch));
CEL_ASSIGN_OR_RETURN(auto ok, callback(element));
CEL_ASSIGN_OR_RETURN(auto ok, callback(index, element));
if (!ok) {
break;
}
Expand Down
15 changes: 15 additions & 0 deletions common/values/parsed_list_value.h
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,9 @@ class ParsedListValueInterface : public ListValueInterface {
virtual absl::Status ForEach(ValueManager& value_manager,
ForEachCallback callback) const;

virtual absl::Status ForEach(ValueManager& value_manager,
ForEachWithIndexCallback callback) const;

virtual absl::StatusOr<absl::Nonnull<ValueIteratorPtr>> NewIterator(
ValueManager& value_manager) const;

Expand Down Expand Up @@ -172,9 +175,15 @@ class ParsedListValue {

using ForEachCallback = typename ListValueInterface::ForEachCallback;

using ForEachWithIndexCallback =
typename ListValueInterface::ForEachWithIndexCallback;

absl::Status ForEach(ValueManager& value_manager,
ForEachCallback callback) const;

absl::Status ForEach(ValueManager& value_manager,
ForEachWithIndexCallback callback) const;

absl::StatusOr<absl::Nonnull<ValueIteratorPtr>> NewIterator(
ValueManager& value_manager) const;

Expand Down Expand Up @@ -342,9 +351,15 @@ class ParsedListValueView {

using ForEachCallback = typename ListValueInterface::ForEachCallback;

using ForEachWithIndexCallback =
typename ListValueInterface::ForEachWithIndexCallback;

absl::Status ForEach(ValueManager& value_manager,
ForEachCallback callback) const;

absl::Status ForEach(ValueManager& value_manager,
ForEachWithIndexCallback callback) const;

absl::StatusOr<absl::Nonnull<ValueIteratorPtr>> NewIterator(
ValueManager& value_manager) const;

Expand Down