diff --git a/mfbt/Algorithm.h b/mfbt/Algorithm.h index c79a74a75a10..33d666de49c9 100644 --- a/mfbt/Algorithm.h +++ b/mfbt/Algorithm.h @@ -28,6 +28,18 @@ constexpr bool AllOf(Iter aFirst, Iter aLast, Pred aPred) { return true; } +// Like C++20's `std::any_of`. +template +constexpr bool AnyOf(Iter aFirst, Iter aLast, Pred aPred) { + for (; aFirst != aLast; ++aFirst) { + if (aPred(*aFirst)) { + return true; + } + } + + return false; +} + namespace detail { template using ArrayElementTransformType = typename std::invoke_result_t< diff --git a/mfbt/tests/TestAlgorithm.cpp b/mfbt/tests/TestAlgorithm.cpp index 01fdccad3d55..007be05b625d 100644 --- a/mfbt/tests/TestAlgorithm.cpp +++ b/mfbt/tests/TestAlgorithm.cpp @@ -7,13 +7,16 @@ #include "mozilla/Algorithm.h" #include "mozilla/ArrayUtils.h" #include "mozilla/Assertions.h" + +#include #include static constexpr bool even(int32_t n) { return !(n & 1); } static constexpr bool odd(int32_t n) { return (n & 1); } +using namespace mozilla; + void TestAllOf() { - using namespace mozilla; using std::begin; using std::end; @@ -36,7 +39,29 @@ void TestAllOf() { static_assert(!AllOf(arr3, arr3 + ArrayLength(arr3), odd), "3-2"); } +void TestAnyOf() { + using std::begin; + using std::end; + + constexpr std::array arr1{}; + static_assert(!AnyOf(begin(arr1), end(arr1), even)); + static_assert(!AnyOf(begin(arr1), end(arr1), odd)); + + constexpr int32_t arr2[] = {1}; + static_assert(!AnyOf(begin(arr2), end(arr2), even)); + static_assert(AnyOf(begin(arr2), end(arr2), odd)); + + constexpr int32_t arr3[] = {2}; + static_assert(AnyOf(begin(arr3), end(arr3), even)); + static_assert(!AnyOf(begin(arr3), end(arr3), odd)); + + constexpr int32_t arr4[] = {1, 2}; + static_assert(AnyOf(begin(arr4), end(arr4), even)); + static_assert(AnyOf(begin(arr4), end(arr4), odd)); +} + int main() { TestAllOf(); + TestAnyOf(); return 0; }