[llvm] d9f309c - Reland "[ADT] Relax type requirements for `is_contained`"
David Blaikie via llvm-commits
llvm-commits at lists.llvm.org
Tue Feb 21 13:52:04 PST 2023
Be handy to have more detail on the recommit (including the original
commit and revert commit hashes - as well as an explanation for what's
different in the recommit and how it addresses the issues that caused
the revert)
On Tue, Feb 21, 2023 at 11:38 AM Jakub Kuderski via llvm-commits
<llvm-commits at lists.llvm.org> wrote:
>
>
> Author: Jakub Kuderski
> Date: 2023-02-21T14:36:58-05:00
> New Revision: d9f309c5c5d4bcb7b32bb57628e0c556d8556041
>
> URL: https://github.com/llvm/llvm-project/commit/d9f309c5c5d4bcb7b32bb57628e0c556d8556041
> DIFF: https://github.com/llvm/llvm-project/commit/d9f309c5c5d4bcb7b32bb57628e0c556d8556041.diff
>
> LOG: Reland "[ADT] Relax type requirements for `is_contained`"
>
> Added:
>
>
> Modified:
> llvm/include/llvm/ADT/STLExtras.h
> llvm/unittests/ADT/STLExtrasTest.cpp
>
> Removed:
>
>
>
> ################################################################################
> diff --git a/llvm/include/llvm/ADT/STLExtras.h b/llvm/include/llvm/ADT/STLExtras.h
> index a8c54e0d9745..8702024d73d5 100644
> --- a/llvm/include/llvm/ADT/STLExtras.h
> +++ b/llvm/include/llvm/ADT/STLExtras.h
> @@ -1870,11 +1870,13 @@ bool is_contained(R &&Range, const E &Element) {
> return std::find(adl_begin(Range), adl_end(Range), Element) != adl_end(Range);
> }
>
> -template <typename T>
> -constexpr bool is_contained(std::initializer_list<T> Set, T Value) {
> +/// Returns true iff \p Element exists in \p Set. This overload takes \p Set as
> +/// an initializer list and is `constexpr`-friendly.
> +template <typename T, typename E>
> +constexpr bool is_contained(std::initializer_list<T> Set, const E &Element) {
> // TODO: Use std::find when we switch to C++20.
> - for (T V : Set)
> - if (V == Value)
> + for (const T &V : Set)
> + if (V == Element)
> return true;
> return false;
> }
>
> diff --git a/llvm/unittests/ADT/STLExtrasTest.cpp b/llvm/unittests/ADT/STLExtrasTest.cpp
> index 992c51790c44..948cbaed16c0 100644
> --- a/llvm/unittests/ADT/STLExtrasTest.cpp
> +++ b/llvm/unittests/ADT/STLExtrasTest.cpp
> @@ -960,11 +960,29 @@ enum Doggos {
> Longboi,
> };
>
> +struct WooferCmp {
> + // Not copyable.
> + WooferCmp() = default;
> + WooferCmp(const WooferCmp &) = delete;
> + WooferCmp &operator=(const WooferCmp &) = delete;
> +
> + friend bool operator==(const Doggos &Doggo, const WooferCmp &) {
> + return Doggo == Doggos::Woofer;
> + }
> +};
> +
> TEST(STLExtrasTest, IsContainedInitializerList) {
> EXPECT_TRUE(is_contained({Woofer, SubWoofer}, Woofer));
> EXPECT_TRUE(is_contained({Woofer, SubWoofer}, SubWoofer));
> EXPECT_FALSE(is_contained({Woofer, SubWoofer}, Pupper));
> - EXPECT_FALSE(is_contained({}, Longboi));
> +
> + // Check that the initializer list type and the element type do not have to
> + // match exactly.
> + EXPECT_TRUE(is_contained({Floofer, Woofer, SubWoofer}, WooferCmp{}));
> + EXPECT_FALSE(is_contained({Floofer, SubWoofer}, WooferCmp{}));
> +
> + EXPECT_TRUE(is_contained({"a", "bb", "ccc", "dddd"}, llvm::StringRef("ccc")));
> + EXPECT_FALSE(is_contained({"a", "bb", "ccc", "dddd"}, llvm::StringRef("x")));
>
> static_assert(is_contained({Woofer, SubWoofer}, SubWoofer), "SubWoofer!");
> static_assert(!is_contained({Woofer, SubWoofer}, Pupper), "Missing Pupper!");
>
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
More information about the llvm-commits
mailing list