[Glacier] Add a vector iterator.
This commit is contained in:
parent
36a09f98c9
commit
c06d1741f3
|
@ -47,6 +47,44 @@ class Vector {
|
||||||
|
|
||||||
T&& PopBack();
|
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:
|
private:
|
||||||
T* data_;
|
T* data_;
|
||||||
uint64_t size_;
|
uint64_t size_;
|
||||||
|
|
|
@ -145,3 +145,28 @@ TEST_CASE("Vector Move", "[vector]") {
|
||||||
REQUIRE(ConstructRecorder::copy_cnt == copy);
|
REQUIRE(ConstructRecorder::copy_cnt == copy);
|
||||||
REQUIRE(ConstructRecorder::move_cnt == move);
|
REQUIRE(ConstructRecorder::move_cnt == move);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_CASE("Vector Iterator", "[vector]") {
|
||||||
|
Vector<uint64_t> 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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue