diff --git a/include/rusty_iterators/interface.hpp b/include/rusty_iterators/interface.hpp index 634123e..81adc8d 100644 --- a/include/rusty_iterators/interface.hpp +++ b/include/rusty_iterators/interface.hpp @@ -64,7 +64,7 @@ class IterInterface IterInterface(IterInterface&&) = default; IterInterface& operator=(IterInterface&&) = default; - [[nodiscard]] auto advanceBy(size_t amount) -> Derived; + auto advanceBy(size_t amount) -> void; template requires AnyFunctor @@ -183,14 +183,13 @@ class IterInterface } // namespace rusty_iterators::interface template -auto rusty_iterators::interface::IterInterface::advanceBy(size_t amount) -> Derived +auto rusty_iterators::interface::IterInterface::advanceBy(size_t n) -> void { - for (size_t i = 0; i < amount; i++) + for (size_t i = 0; i < n; ++i) { [[unlikely]] if (!self().next().has_value()) break; } - return std::move(self()); } template @@ -222,8 +221,7 @@ auto rusty_iterators::interface::IterInterface::collect() -> std::ve auto size = sizeHintChecked(); collection.reserve(size); - - forEach([&collection](auto&& x) { collection.push_back(std::move(x)); }); + self().forEach([&collection](auto&& x) { collection.push_back(std::move(x)); }); return std::move(collection); } @@ -233,7 +231,7 @@ auto rusty_iterators::interface::IterInterface::count() -> size_t { size_t count = 0; - forEach([&count](auto&& _) { count += 1; }); + self().forEach([&count](auto&& _) { count += 1; }); return count; } @@ -404,9 +402,10 @@ auto rusty_iterators::interface::IterInterface::neBy(Other&& it, Fun } template -auto rusty_iterators::interface::IterInterface::nth(size_t element) -> std::optional +auto rusty_iterators::interface::IterInterface::nth(size_t n) -> std::optional { - return self().advanceBy(element).next(); + self().advanceBy(n); + return self().next(); } template diff --git a/include/rusty_iterators/skip.hpp b/include/rusty_iterators/skip.hpp index 6805015..663afc9 100644 --- a/include/rusty_iterators/skip.hpp +++ b/include/rusty_iterators/skip.hpp @@ -29,9 +29,9 @@ auto rusty_iterators::iterator::Skip::next() -> std::optional { [[unlikely]] if (n > 0) { - it = it.advanceBy(n); - n = 0; - return std::move(it.next()); + auto item = it.nth(n); + n = 0; + return std::move(item); } return std::move(it.next()); } diff --git a/include/rusty_iterators/zip.hpp b/include/rusty_iterators/zip.hpp index e093231..591af2e 100644 --- a/include/rusty_iterators/zip.hpp +++ b/include/rusty_iterators/zip.hpp @@ -18,7 +18,7 @@ class Zip : public IterInterface, Zip> : first(std::forward(f)), second(std::forward(s)) {} - [[nodiscard]] auto advanceBy(size_t amount) -> Zip; + auto advanceBy(size_t amount) -> void; auto next() -> std::optional>; [[nodiscard]] auto sizeHint() const -> std::optional; @@ -29,13 +29,10 @@ class Zip : public IterInterface, Zip> } // namespace rusty_iterators::iterator template -auto rusty_iterators::iterator::Zip::advanceBy(size_t amount) - -> Zip +auto rusty_iterators::iterator::Zip::advanceBy(size_t amount) -> void { - first = first.advanceBy(amount); - second = second.advanceBy(amount); - - return std::move(static_cast&>(*this)); + first.advanceBy(amount); + second.advanceBy(amount); } template diff --git a/tests/file_iterator.test.cpp b/tests/file_iterator.test.cpp index 9d37e86..0d88cfb 100644 --- a/tests/file_iterator.test.cpp +++ b/tests/file_iterator.test.cpp @@ -81,7 +81,9 @@ TEST(TestBufferedFileIterator, TestSizeHint) TEST(TestBufferedFileIterator, TestSizeHintAfterConsumption) { auto testFileName = std::string{"./tests/test_data.txt"}; - auto it = FileIterator{testFileName}.advanceBy(2); + auto it = FileIterator{testFileName}; + + it.advanceBy(2); ASSERT_EQ(it.sizeHint(), 2); } diff --git a/tests/integration.test.cpp b/tests/integration.test.cpp index a43dc60..f277ab8 100644 --- a/tests/integration.test.cpp +++ b/tests/integration.test.cpp @@ -87,7 +87,9 @@ TEST(TestIteratorIntegration, TestWindowsOverCycle) TEST(TestIteratorIntegration, TestCycleAdvanceBy) { auto vec = std::vector{1, 2}; - auto it = LazyIterator{vec}.cycle().advanceBy(3); + auto it = LazyIterator{vec}.cycle(); + + it.advanceBy(3); ASSERT_EQ(it.next().value(), 2); ASSERT_EQ(it.next().value(), 1); diff --git a/tests/iterator.test.cpp b/tests/iterator.test.cpp index 4cc3be9..7fe014c 100644 --- a/tests/iterator.test.cpp +++ b/tests/iterator.test.cpp @@ -211,7 +211,9 @@ TEST(TestIterator, AllReturnsFalseIfOneDoesntFit) TEST(TestIterator, AdvanceByMovesIteratorPtr) { auto vec = std::vector{1, 2, 3, 4}; - auto it = LazyIterator{vec}.advanceBy(3); + auto it = LazyIterator{vec}; + + it.advanceBy(3); ASSERT_EQ(it.next().value(), 4); } @@ -219,7 +221,9 @@ TEST(TestIterator, AdvanceByMovesIteratorPtr) TEST(TestIterator, AdvanceByBiggerThanSize) { auto vec = std::vector{1, 2, 3}; - auto it = LazyIterator{vec}.advanceBy(4); + auto it = LazyIterator{vec}; + + it.advanceBy(4); ASSERT_EQ(it.next(), std::nullopt); } diff --git a/tests/zip.test.cpp b/tests/zip.test.cpp index fa68fab..e327ab7 100644 --- a/tests/zip.test.cpp +++ b/tests/zip.test.cpp @@ -76,7 +76,9 @@ TEST(TestZipIterator, TestAdvanceBy) auto v1 = std::vector{1, 2, 3}; auto v2 = std::vector{4, 5, 6}; - auto it = LazyIterator{v1}.zip(LazyIterator{v2}).advanceBy(2); + auto it = LazyIterator{v1}.zip(LazyIterator{v2}); + + it.advanceBy(2); EXPECT_THAT(it.next().value(), FieldsAre(3, 6)); }