#ifndef HYBRIDITERATOR_H_ #define HYBRIDITERATOR_H_ #include #include template class HybridIterator: public LinkedElement::Iterator, public ArrayList::Iterator { public: HybridIterator() : value(NULL), linked(NULL), end(NULL) { } HybridIterator(typename LinkedElement::Iterator *iter) : LinkedElement::Iterator(*iter), value( iter->value), linked(true), end(NULL) { } HybridIterator(LinkedElement *start) : LinkedElement::Iterator(start), value( start->value), linked(true), end(NULL) { } 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 != NULL) { value = LinkedElement::Iterator::value->value; } else { value = NULL; } } else { ArrayList::Iterator::operator++(); value = ArrayList::Iterator::value; if (value == end) { value = NULL; } } return *this; } HybridIterator operator++(int) { HybridIterator tmp(*this); operator++(); return tmp; } bool operator==(HybridIterator other) { return value == other->value; } bool operator!=(HybridIterator other) { return !(*this == other); } T operator*() { return *value; } T *operator->() { return value; } T* value; private: bool linked; T *end; }; #endif /* HYBRIDITERATOR_H_ */