diff options
author | Lenny Maiorani <lenny@colorado.edu> | 2021-06-24 10:24:13 -0600 |
---|---|---|
committer | Ali Mohammad Pur <Ali.mpfard@gmail.com> | 2021-07-24 13:11:13 +0430 |
commit | 2cf4781d147acd51c4b9d35de494cdac79780e5b (patch) | |
tree | d2253c6ba9b0370af381feae5bd8f939916a46be /AK/AllOf.h | |
parent | 497a9afaafee443c85d95bab864f1185f72e176a (diff) | |
download | serenity-2cf4781d147acd51c4b9d35de494cdac79780e5b.zip |
AK: Reimplement all_of in terms of find_if
Problem:
- Now that a generic free-function form of `find_if` is implemented
the code in `all_of` is redundant.
Solution:
- Follow the "don't repeat yourself" mantra and make the code DRY by
implementing `all_of` in terms of `find_if`.
- One tricky part is that since captures are not permitted in
`constexpr` lambdas, the lambda created to negate the predicate
needs to be created by a function which does not capture and takes
the predicate at run-time instead. This allows `all_of` to continue
to work in a `constexpr` context.
Diffstat (limited to 'AK/AllOf.h')
-rw-r--r-- | AK/AllOf.h | 17 |
1 files changed, 6 insertions, 11 deletions
diff --git a/AK/AllOf.h b/AK/AllOf.h index a551046b97..603f293425 100644 --- a/AK/AllOf.h +++ b/AK/AllOf.h @@ -7,6 +7,7 @@ #pragma once #include <AK/Concepts.h> +#include <AK/Find.h> #include <AK/Iterator.h> namespace AK { @@ -17,22 +18,16 @@ constexpr bool all_of( TEndIterator const& end, auto const& predicate) { - for (auto iter = begin; iter != end; ++iter) { - if (!predicate(*iter)) { - return false; - } - } - return true; + constexpr auto negated_predicate = [](auto const& pred) { + return [&](auto const& elem) { return !pred(elem); }; + }; + return !(find_if(begin, end, negated_predicate(predicate)) != end); } template<IterableContainer Container> constexpr bool all_of(Container&& container, auto const& predicate) { - for (auto&& entry : container) { - if (!predicate(entry)) - return false; - } - return true; + return all_of(container.begin(), container.end(), predicate); } } |