From b0e74a3fd30953df972c805d46f8456e84c5024c Mon Sep 17 00:00:00 2001 From: Federico Guerinoni Date: Wed, 23 Feb 2022 15:59:00 +0100 Subject: [PATCH] AK: Implement reverse iterator for Vector class --- AK/Vector.h | 4 ++++ Tests/AK/TestVector.cpp | 26 ++++++++++++++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/AK/Vector.h b/AK/Vector.h index ee77357f0b..bc4eb553dd 100644 --- a/AK/Vector.h +++ b/AK/Vector.h @@ -13,6 +13,7 @@ #include #include #include +#include #include #include #include @@ -693,12 +694,15 @@ public: using ConstIterator = SimpleIterator; using Iterator = SimpleIterator; + using ReverseIterator = SimpleReverseIterator; ConstIterator begin() const { return ConstIterator::begin(*this); } Iterator begin() { return Iterator::begin(*this); } + ReverseIterator rbegin() { return ReverseIterator::rbegin(*this); } ConstIterator end() const { return ConstIterator::end(*this); } Iterator end() { return Iterator::end(*this); } + ReverseIterator rend() { return ReverseIterator::rend(*this); } template ConstIterator find_if(TUnaryPredicate&& finder) const diff --git a/Tests/AK/TestVector.cpp b/Tests/AK/TestVector.cpp index 2289c24639..4cfa6da98d 100644 --- a/Tests/AK/TestVector.cpp +++ b/Tests/AK/TestVector.cpp @@ -533,3 +533,29 @@ TEST_CASE(reference_deletion_should_not_affect_object) } EXPECT_EQ(times_deleted, 1u); } + +TEST_CASE(rbegin) +{ + Vector v { 1, 2, 3, 4, 5, 6, 7, 8, 0 }; + + auto const expected = v.begin() + 4; + auto const expected_in_reverse = v.rbegin() + 4; + EXPECT_EQ(*expected, *expected_in_reverse); +} + +TEST_CASE(rend) +{ + Vector v { 1, 2, 3, 4, 5, 6, 7, 8, 0 }; + + const auto expected = v.end() - 5; + const auto expected_in_reverse = v.rend() - 5; + EXPECT_EQ(*expected, *expected_in_reverse); +} + +TEST_CASE(reverse_loop) +{ + Vector 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--); +}