From c06d1741f31230bdd24e79d3f93c22552178f816 Mon Sep 17 00:00:00 2001 From: Drew Galbraith Date: Thu, 11 Jan 2024 16:59:10 -0800 Subject: [PATCH] [Glacier] Add a vector iterator. --- lib/glacier/container/vector.h | 38 +++++++++++++++++++++++++++ lib/glacier/test/container/vector.cpp | 25 ++++++++++++++++++ 2 files changed, 63 insertions(+) diff --git a/lib/glacier/container/vector.h b/lib/glacier/container/vector.h index afe6229..64e11b8 100644 --- a/lib/glacier/container/vector.h +++ b/lib/glacier/container/vector.h @@ -47,6 +47,44 @@ class Vector { T&& PopBack(); + // Forward Iter + class Iterator { + public: + Iterator(T* item, uint64_t size) : item_(item), size_(size) {} + + Iterator next() { + if (size_ <= 1) { + return {nullptr, 0}; + } + return {item_ + 1, size_ - 1}; + } + + Iterator& operator++() { + if (size_ <= 1) { + item_ = nullptr; + size_ = 0; + } else { + item_++; + size_--; + } + return *this; + } + + T& operator*() { return *item_; } + T* operator->() { return item_; } + bool operator==(const Iterator& other) { return item_ == other.item_; } + bool operator!=(const Iterator& other) { return item_ != other.item_; } + + private: + T* item_; + uint64_t size_; + }; + + Iterator begin() { return {data_, size_}; } + const Iterator begin() const { return {data_, size_}; } + Iterator end() { return {nullptr, 0}; } + const Iterator end() const { return {nullptr, 0}; } + private: T* data_; uint64_t size_; diff --git a/lib/glacier/test/container/vector.cpp b/lib/glacier/test/container/vector.cpp index 188a03b..4ec0d65 100644 --- a/lib/glacier/test/container/vector.cpp +++ b/lib/glacier/test/container/vector.cpp @@ -145,3 +145,28 @@ TEST_CASE("Vector Move", "[vector]") { REQUIRE(ConstructRecorder::copy_cnt == copy); REQUIRE(ConstructRecorder::move_cnt == move); } + +TEST_CASE("Vector Iterator", "[vector]") { + Vector v; + for (uint64_t i = 0; i < 100; i++) { + v.PushBack(42); + } + + SECTION("For Range Loop") { + uint64_t iters = 0; + for (uint64_t i : v) { + REQUIRE(i == 42); + iters++; + } + REQUIRE(iters == 100); + } + + SECTION("Raw Iter Loop") { + uint64_t iters = 0; + for (auto it = v.begin(); it != v.end(); ++it) { + REQUIRE(*it == 42); + iters++; + } + REQUIRE(iters == 100); + } +}