1
0
mirror of https://github.com/SerenityOS/serenity synced 2024-07-05 20:34:56 +00:00

AK: Implement wrapper for reverse range for loop

Now it is possible to use range for loop in reverse mode for a
container.
```
	for (auto item : in_reverse(vector))
```
This commit is contained in:
Federico Guerinoni 2022-02-25 11:41:13 +01:00 committed by Andreas Kling
parent a54e20d958
commit f34fff852b
2 changed files with 28 additions and 1 deletions

View File

@ -87,4 +87,22 @@ private:
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 }; }
}
}

View File

@ -4,6 +4,7 @@
* SPDX-License-Identifier: BSD-2-Clause
*/
#include "AK/ReverseIterator.h"
#include <LibTest/TestCase.h>
#include <AK/NonnullOwnPtrVector.h>
@ -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--);
}