mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2024-11-11 09:18:05 +03:00
2cf4781d14
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.
36 lines
791 B
C++
36 lines
791 B
C++
/*
|
|
* Copyright (c) 2020, the SerenityOS developers.
|
|
*
|
|
* SPDX-License-Identifier: BSD-2-Clause
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include <AK/Concepts.h>
|
|
#include <AK/Find.h>
|
|
#include <AK/Iterator.h>
|
|
|
|
namespace AK {
|
|
|
|
template<typename TEndIterator, IteratorPairWith<TEndIterator> TIterator>
|
|
constexpr bool all_of(
|
|
TIterator const& begin,
|
|
TEndIterator const& end,
|
|
auto const& predicate)
|
|
{
|
|
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)
|
|
{
|
|
return all_of(container.begin(), container.end(), predicate);
|
|
}
|
|
|
|
}
|
|
|
|
using AK::all_of;
|