#ifndef FRAMEWORK_CONTAINER_HYBRIDITERATOR_H_ #define FRAMEWORK_CONTAINER_HYBRIDITERATOR_H_ #include "ArrayList.h" #include "SinglyLinkedList.h" template class HybridIterator: public LinkedElement::Iterator, public ArrayList::Iterator { public: HybridIterator() {} HybridIterator(typename LinkedElement::Iterator *iter) : LinkedElement::Iterator(*iter), value(iter->value), linked(true) { } HybridIterator(LinkedElement *start) : LinkedElement::Iterator(start), value(start->value), linked(true) { } HybridIterator(typename ArrayList::Iterator start, typename ArrayList::Iterator end) : ArrayList::Iterator(start), value(start.value), linked(false), end(end.value) { if (value == this->end) { value = NULL; } } HybridIterator(T *firstElement, T *lastElement) : ArrayList::Iterator(firstElement), value(firstElement), linked(false), end(++lastElement) { if (value == end) { value = NULL; } } HybridIterator& operator++() { if (linked) { LinkedElement::Iterator::operator++(); if (LinkedElement::Iterator::value != nullptr) { value = LinkedElement::Iterator::value->value; } else { value = nullptr; } } else { ArrayList::Iterator::operator++(); value = ArrayList::Iterator::value; if (value == end) { value = nullptr; } } return *this; } HybridIterator operator++(int) { HybridIterator tmp(*this); operator++(); return tmp; } bool operator==(const HybridIterator& other) const { return value == other.value; } bool operator!=(const HybridIterator& other) const { return !(*this == other); } T operator*() { return *value; } T *operator->() { return value; } T* value = nullptr; private: bool linked = false; T *end = nullptr; }; #endif /* FRAMEWORK_CONTAINER_HYBRIDITERATOR_H_ */