[PATCH] D132334: [ADT] Add all_equal predicate
Jakub Kuderski via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Sun Aug 21 13:04:53 PDT 2022
kuhar created this revision.
Herald added a reviewer: grosser.
Herald added a project: All.
kuhar requested review of this revision.
Herald added a project: LLVM.
Herald added a subscriber: llvm-commits.
`llvm::all_equal` checks if all values in the given range are equal, i.e., there are no two elements that are not equal.
Similar to `llvm::all_of`, it returns `true` when the range is empty.
`llvm::all_equal` is intended to supersede `llvm::is_splat`, which will be deprecated and removed in future patches.
See the discussion thread for more details:
https://discourse.llvm.org/t/adt-is-splat-and-empty-ranges/64692.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D132334
Files:
llvm/include/llvm/ADT/STLExtras.h
llvm/unittests/ADT/STLExtrasTest.cpp
Index: llvm/unittests/ADT/STLExtrasTest.cpp
===================================================================
--- llvm/unittests/ADT/STLExtrasTest.cpp
+++ llvm/unittests/ADT/STLExtrasTest.cpp
@@ -588,6 +588,29 @@
EXPECT_EQ(EIR.end(), I);
}
+TEST(STLExtrasTest, AllEqual) {
+ std::vector<int> V;
+ EXPECT_TRUE(all_equal(V));
+
+ V.push_back(1);
+ EXPECT_TRUE(all_equal(V));
+
+ V.push_back(1);
+ V.push_back(1);
+ EXPECT_TRUE(all_equal(V));
+
+ V.push_back(2);
+ EXPECT_FALSE(all_equal(V));
+}
+
+TEST(STLExtrasTest, AllEqualInitializerList) {
+ EXPECT_TRUE(all_equal({1}));
+ EXPECT_TRUE(all_equal({1, 1}));
+ EXPECT_FALSE(all_equal({1, 2}));
+ EXPECT_FALSE(all_equal({2, 1}));
+ EXPECT_TRUE(all_equal({1, 1, 1}));
+}
+
TEST(STLExtrasTest, IsSplat) {
std::vector<int> V;
EXPECT_FALSE(is_splat(V));
Index: llvm/include/llvm/ADT/STLExtras.h
===================================================================
--- llvm/include/llvm/ADT/STLExtras.h
+++ llvm/include/llvm/ADT/STLExtras.h
@@ -1773,16 +1773,25 @@
adl_end(RRange));
}
-/// Wrapper function around std::equal to detect if all elements
-/// in a container are same.
-template <typename R>
-bool is_splat(R &&Range) {
- size_t range_size = size(Range);
- return range_size != 0 && (range_size == 1 ||
- std::equal(adl_begin(Range) + 1, adl_end(Range), adl_begin(Range)));
+/// Returns true if all elements in Range are equal or when the Range is empty.
+template <typename R> bool all_equal(R &&Range) {
+ auto Begin = adl_begin(Range);
+ auto End = adl_end(Range);
+ return Begin == End || std::equal(Begin + 1, End, Begin);
+}
+
+/// Returns true if all Values in the initializer lists are equal or the list
+// is empty.
+template <typename T> bool all_equal(std::initializer_list<T> Values) {
+ return all_equal<std::initializer_list<T>>(std::move(Values));
+}
+
+/// Returns true if Range consists of the same value repeated multiple times.
+template <typename R> bool is_splat(R &&Range) {
+ return !llvm::empty(Range) && all_equal(Range);
}
-/// Returns true iff all Values in the initializer lists are same.
+/// Returns true if Values consists of the same value repeated multiple times.
template <typename T> bool is_splat(std::initializer_list<T> Values) {
return is_splat<std::initializer_list<T>>(std::move(Values));
}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D132334.454335.patch
Type: text/x-patch
Size: 2363 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20220821/db923c55/attachment.bin>
More information about the llvm-commits
mailing list