diff --git a/llvm/include/llvm/ADT/STLExtras.h b/llvm/include/llvm/ADT/STLExtras.h --- a/llvm/include/llvm/ADT/STLExtras.h +++ b/llvm/include/llvm/ADT/STLExtras.h @@ -1796,6 +1796,11 @@ std::equal(adl_begin(Range) + 1, adl_end(Range), adl_begin(Range))); } +/// Returns true iff all Values in the initializer lists are same. +template bool is_splat(std::initializer_list Values) { + return is_splat>(std::move(Values)); +} + /// Provide a container algorithm similar to C++ Library Fundamentals v2's /// `erase_if` which is equivalent to: /// diff --git a/llvm/unittests/ADT/STLExtrasTest.cpp b/llvm/unittests/ADT/STLExtrasTest.cpp --- a/llvm/unittests/ADT/STLExtrasTest.cpp +++ b/llvm/unittests/ADT/STLExtrasTest.cpp @@ -606,7 +606,7 @@ EXPECT_EQ(EIR.end(), I); } -TEST(STLExtrasTest, splat) { +TEST(STLExtrasTest, IsSplat) { std::vector V; EXPECT_FALSE(is_splat(V)); @@ -621,6 +621,13 @@ EXPECT_FALSE(is_splat(V)); } +TEST(STLExtrasTest, IsSplatInitializerList) { + EXPECT_TRUE(is_splat({1})); + EXPECT_TRUE(is_splat({1, 1})); + EXPECT_FALSE(is_splat({1, 2})); + EXPECT_TRUE(is_splat({1, 1, 1})); +} + TEST(STLExtrasTest, to_address) { int *V1 = new int; EXPECT_EQ(V1, to_address(V1));