[libc-commits] [libc] [libc][CPP] Add all_of and find_if_not to algorithm.h (PR #94058)
via libc-commits
libc-commits at lists.llvm.org
Fri May 31 15:12:20 PDT 2024
https://github.com/PiJoules created https://github.com/llvm/llvm-project/pull/94058
This is needed for the allocator implementation for malloc.
>From 8b57bb5cd154d8baad9a314028fefde92e700dfa Mon Sep 17 00:00:00 2001
From: Leonard Chan <leonardchan at google.com>
Date: Fri, 31 May 2024 15:10:38 -0700
Subject: [PATCH] [libc][CPP] Add all_of and find_if_not to algorithm.h
This is needed for the allocator implementation for malloc.
---
libc/src/__support/CPP/algorithm.h | 15 +++++++
libc/test/src/__support/CPP/CMakeLists.txt | 10 +++++
.../test/src/__support/CPP/algorithm_test.cpp | 45 +++++++++++++++++++
3 files changed, 70 insertions(+)
create mode 100644 libc/test/src/__support/CPP/algorithm_test.cpp
diff --git a/libc/src/__support/CPP/algorithm.h b/libc/src/__support/CPP/algorithm.h
index fef3c18dc50bc..5120fa0daae17 100644
--- a/libc/src/__support/CPP/algorithm.h
+++ b/libc/src/__support/CPP/algorithm.h
@@ -25,6 +25,21 @@ template <class T> LIBC_INLINE constexpr const T &min(const T &a, const T &b) {
return (a < b) ? a : b;
}
+template <class InputIt, class UnaryPred>
+LIBC_INLINE constexpr InputIt find_if_not(InputIt first, InputIt last,
+ UnaryPred q) {
+ for (; first != last; ++first)
+ if (!q(*first))
+ return first;
+
+ return last;
+}
+
+template <class InputIt, class UnaryPred>
+LIBC_INLINE constexpr bool all_of(InputIt first, InputIt last, UnaryPred p) {
+ return find_if_not(first, last, p) == last;
+}
+
} // namespace cpp
} // namespace LIBC_NAMESPACE
diff --git a/libc/test/src/__support/CPP/CMakeLists.txt b/libc/test/src/__support/CPP/CMakeLists.txt
index cec13afc8dd12..2b4d6107b767d 100644
--- a/libc/test/src/__support/CPP/CMakeLists.txt
+++ b/libc/test/src/__support/CPP/CMakeLists.txt
@@ -1,5 +1,15 @@
add_custom_target(libc-cpp-utils-tests)
+add_libc_test(
+ algorithm_test
+ SUITE
+ libc-cpp-utils-tests
+ SRCS
+ algorithm_test.cpp
+ DEPENDS
+ libc.src.__support.CPP.algorithm
+ )
+
add_libc_test(
array_test
SUITE
diff --git a/libc/test/src/__support/CPP/algorithm_test.cpp b/libc/test/src/__support/CPP/algorithm_test.cpp
new file mode 100644
index 0000000000000..5be3eb9d79d59
--- /dev/null
+++ b/libc/test/src/__support/CPP/algorithm_test.cpp
@@ -0,0 +1,45 @@
+//===-- Unittests for Algorithm -------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "src/__support/CPP/algorithm.h"
+#include "src/__support/CPP/array.h"
+#include "test/UnitTest/Test.h"
+
+namespace LIBC_NAMESPACE::cpp {
+
+TEST(LlvmLibcAlgorithmTest, FindIfNot) {
+ array<int, 4> nums{1, 2, 3, 4};
+ EXPECT_EQ(find_if_not(nums.begin(), nums.end(), [](int i) { return i == 0; }),
+ nums.begin());
+ EXPECT_EQ(find_if_not(nums.begin(), nums.end(), [](int i) { return i == 1; }),
+ nums.begin() + 1);
+ EXPECT_EQ(find_if_not(nums.begin(), nums.end(), [](int i) { return i < 4; }),
+ nums.begin() + 3);
+ EXPECT_EQ(find_if_not(nums.begin(), nums.end(), [](int i) { return i < 5; }),
+ nums.end());
+
+ EXPECT_EQ(
+ find_if_not(nums.begin() + 1, nums.end(), [](int i) { return i == 0; }),
+ nums.begin() + 1);
+ EXPECT_EQ(
+ find_if_not(nums.begin(), nums.begin(), [](int i) { return i == 0; }),
+ nums.begin());
+}
+
+TEST(LlvmLibcAlgorithmTest, AllOf) {
+ array<int, 4> nums{1, 2, 3, 4};
+ EXPECT_TRUE(all_of(nums.begin(), nums.end(), [](int i) { return i < 5; }));
+ EXPECT_FALSE(all_of(nums.begin(), nums.end(), [](int i) { return i < 4; }));
+ EXPECT_TRUE(
+ all_of(nums.begin(), nums.begin() + 3, [](int i) { return i < 4; }));
+ EXPECT_TRUE(
+ all_of(nums.begin() + 1, nums.end(), [](int i) { return i > 1; }));
+ EXPECT_TRUE(all_of(nums.begin(), nums.begin(), [](int i) { return i < 0; }));
+}
+
+} // namespace LIBC_NAMESPACE::cpp
More information about the libc-commits
mailing list