Vector: Implement find, find_if, find_first_matching in terms of AK::find*

Problem:
- The implementation of `find` is coupled to the implementation of `Vector`.
- `Vector::find` takes the predicate by value which might be expensive.

Solution:
- Decouple the implementation of `find` from `Vector` by using a
  generic `find` algorithm.
- Change the name of `find` with a predicate to `find_if` so that a
  binding reference can be used and the predicate can be forwarded to
  avoid copies.
- Change all the `find(pred)` call sites to use `find_if`.
This commit is contained in:
Lenny Maiorani 2020-12-23 11:35:20 -07:00 committed by Andreas Kling
parent 4333a9a8d6
commit f99d1d3bd7
Notes: sideshowbarker 2024-07-18 23:56:20 +09:00
10 changed files with 48 additions and 29 deletions

View file

@ -80,7 +80,7 @@ static String variable_value_as_string(const Debug::DebugInfo::VariableInfo& var
if (variable.is_enum_type()) {
auto value = Debugger::the().session()->peek((u32*)variable_address);
ASSERT(value.has_value());
auto it = variable.type->members.find([enumerator_value = value.value()](auto& enumerator) {
auto it = variable.type->members.find_if([&enumerator_value = value.value()](const auto& enumerator) {
return enumerator->constant_data.as_u32 == enumerator_value;
});
ASSERT(!it.is_end());
@ -116,7 +116,7 @@ static Optional<u32> string_to_variable_value(const StringView& string_value, co
if (string_value.starts_with(prefix_string))
string_to_use = string_value.substring_view(prefix_string.length(), string_value.length() - prefix_string.length());
auto it = variable.type->members.find([string_to_use](auto& enumerator) {
auto it = variable.type->members.find_if([string_to_use](const auto& enumerator) {
return enumerator->name == string_to_use;
});