Skip to content

Commit

Permalink
AK: Implement wrapper for reverse range for loop
Browse files Browse the repository at this point in the history
Now it is possible to use range for loop in reverse mode for a
container.
```
	for (auto item : in_reverse(vector))
```
  • Loading branch information
guerinoni authored and awesomekling committed Mar 9, 2022
1 parent a54e20d commit f34fff8
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 1 deletion.
18 changes: 18 additions & 0 deletions AK/ReverseIterator.h
Original file line number Diff line number Diff line change
Expand Up @@ -87,4 +87,22 @@ class SimpleReverseIterator {
int m_index { 0 };
};

namespace ReverseWrapper {

template<typename Container>
struct ReverseWrapper {
Container& container;
};

template<typename Container>
auto begin(ReverseWrapper<Container> wrapper) { return wrapper.container.rbegin(); }

template<typename Container>
auto end(ReverseWrapper<Container> wrapper) { return wrapper.container.rend(); }

template<typename Container>
ReverseWrapper<Container> in_reverse(Container&& container) { return { container }; }

}

}
11 changes: 10 additions & 1 deletion Tests/AK/TestVector.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
* SPDX-License-Identifier: BSD-2-Clause
*/

#include "AK/ReverseIterator.h"
#include <LibTest/TestCase.h>

#include <AK/NonnullOwnPtrVector.h>
Expand Down Expand Up @@ -552,10 +553,18 @@ TEST_CASE(rend)
EXPECT_EQ(*expected, *expected_in_reverse);
}

TEST_CASE(reverse_loop)
TEST_CASE(reverse_iterator_for_loop)
{
Vector<int> v { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
int index = 9;
for (auto rev = v.rbegin(); rev != v.rend(); ++rev)
EXPECT_EQ(*rev, index--);
}

TEST_CASE(reverse_range_for_loop)
{
Vector<int> v { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
int index = 9;
for (auto item : AK::ReverseWrapper::in_reverse(v))
EXPECT_EQ(item, index--);
}

0 comments on commit f34fff8

Please sign in to comment.