Reapply "Add reverse(ContainerTy) range adapter."
authorPete Cooper <peter_cooper@apple.com>
Wed, 29 Jul 2015 22:19:09 +0000 (22:19 +0000)
committerPete Cooper <peter_cooper@apple.com>
Wed, 29 Jul 2015 22:19:09 +0000 (22:19 +0000)
commitf3159f3c120ce4dbe02077f7a9e9b6bf1daa35c0
treea34b9732f34aed4eafa8b137a25db486c941ee33
parentabb5a35d05fc0d513e3ac7be1571ceaddb5b191d
Reapply "Add reverse(ContainerTy) range adapter."

This reverts commit r243567, which ultimately reapplies r243563.

The fix here was to use std::enable_if for overload resolution.  Thanks to David
Blaikie for lots of help on this, and for the extra tests!

Original commit message follows:

For cases where we needed a foreach loop in reverse over a container,
we had to do something like

 for (const GlobalValue *GV : make_range(TypeInfos.rbegin(),
                                         TypeInfos.rend())) {

This provides a convenience method which shortens this to

 for (const GlobalValue *GV : reverse(TypeInfos)) {

There are 2 versions of this, with a preference to the rbegin() version.

The first uses rbegin() and rend() to construct an iterator_range.

The second constructs an iterator_range from the begin() and end() methods
wrapped in std::reverse_iterator's.

Reviewed by David Blaikie.

llvm-svn: 243581
llvm/include/llvm/ADT/STLExtras.h
llvm/lib/CodeGen/AsmPrinter/ARMException.cpp
llvm/unittests/ADT/CMakeLists.txt
llvm/unittests/ADT/RangeAdapterTest.cpp [new file with mode: 0644]