[PATCH] D37417: Add range based wrapper around std::for_each.

Zachary Turner via llvm-commits llvm-commits at lists.llvm.org
Mon Sep 4 15:32:19 PDT 2017


For most of the other algorithms, adding the llvm range adapters makes
sense.  But I tend to agree, for_each should not being seeing much (if any)
usage in modern code, as range-based for is almost always, if not always,
better

On Mon, Sep 4, 2017 at 1:22 PM David Blaikie <dblaikie at gmail.com> wrote:

> On Mon, Sep 4, 2017 at 1:16 PM Keith Wyss <wyssman at gmail.com> wrote:
>
>> It is an equivalent concept to range based for loop. Its not strictly
>> necessary, but neither is std::for_each.
>>
>
> Right - but std::for_each existed before the range based for loop (&
> admittedly, before lambdas too). I'm not sure of the motivation for this
> given C++11 features/today's code.
>
>
>>
>> On Sep 4, 2017 9:20 AM, "David Blaikie" <dblaikie at gmail.com> wrote:
>>
>>> What use case do you have for this over a range-based-for loop?
>>>
>>> On Sat, Sep 2, 2017 at 6:08 PM Keith via Phabricator via llvm-commits <
>>> llvm-commits at lists.llvm.org> wrote:
>>>
>>>> kpw created this revision.
>>>>
>>>> There are a few range based wrappers llvm provides already. They're
>>>> handy and I
>>>> couldn't find one for std::for_each, so I'm adding it.
>>>>
>>>>
>>>> https://reviews.llvm.org/D37417
>>>>
>>>> Files:
>>>>   include/llvm/ADT/STLExtras.h
>>>>   unittests/ADT/STLExtrasTest.cpp
>>>>
>>>>
>>>> Index: unittests/ADT/STLExtrasTest.cpp
>>>> ===================================================================
>>>> --- unittests/ADT/STLExtrasTest.cpp
>>>> +++ unittests/ADT/STLExtrasTest.cpp
>>>> @@ -318,4 +318,14 @@
>>>>    EXPECT_EQ(7, V[3]);
>>>>  }
>>>>
>>>> +TEST(STLExtrasTest, ForEach) {
>>>> +  std::vector<std::pair<int, int>> V = {{1, 2}, {3, 4}, {5, 6}};
>>>> +  std::vector<int> Evens{};
>>>> +  auto BackInserter = std::back_inserter(Evens);
>>>> +  for_each(V,
>>>> +           [&](std::pair<int, int> Element) { BackInserter =
>>>> Element.second; });
>>>> +  std::vector<int> ExpectedEvens = {2, 4, 6};
>>>> +  EXPECT_EQ(Evens, ExpectedEvens);
>>>> +}
>>>> +
>>>>  }
>>>> Index: include/llvm/ADT/STLExtras.h
>>>> ===================================================================
>>>> --- include/llvm/ADT/STLExtras.h
>>>> +++ include/llvm/ADT/STLExtras.h
>>>> @@ -852,6 +852,13 @@
>>>>    return std::find_if_not(std::begin(Range), std::end(Range), P);
>>>>  }
>>>>
>>>> +/// Provide wrapper to std::for_each which take ranges instead of
>>>> having to
>>>> +/// pass begin/end explicitly.
>>>> +template <typename R, typename UnaryFunction>
>>>> +UnaryFunction for_each(R &&Range, UnaryFunction F) {
>>>> +  return std::for_each(std::begin(Range), std::end(Range), F);
>>>> +}
>>>> +
>>>>  /// Provide wrappers to std::remove_if which take ranges instead of
>>>> having to
>>>>  /// pass begin/end explicitly.
>>>>  template <typename R, typename UnaryPredicate>
>>>>
>>>>
>>>> _______________________________________________
>>>> llvm-commits mailing list
>>>> llvm-commits at lists.llvm.org
>>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>>>>
>>>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20170904/78c2ab65/attachment-0001.html>


More information about the llvm-commits mailing list