[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