#pragma once #include template class ArrayViewIterator { public: ArrayViewIterator(T *item); ArrayViewIterator(const ArrayViewIterator &other); ArrayViewIterator operator++(int); ArrayViewIterator &operator++(); ArrayViewIterator operator--(int); ArrayViewIterator &operator--(); ArrayViewIterator &operator+=(ptrdiff_t delta); ArrayViewIterator &operator-=(ptrdiff_t delta); bool operator==(const ArrayViewIterator &other) const; bool operator!=(const ArrayViewIterator &other) const; operator T*() const; private: T *m_iter; }; template inline ArrayViewIterator::ArrayViewIterator(T *item) : m_iter(item) { } template inline ArrayViewIterator::ArrayViewIterator(const ArrayViewIterator &other) : m_iter(other.m_iter) { } template inline ArrayViewIterator ArrayViewIterator::operator++(int) { ArrayViewIterator copy = *this; m_iter++; return copy; } template inline ArrayViewIterator &ArrayViewIterator::operator++() { m_iter++; return *this; } template inline ArrayViewIterator ArrayViewIterator::operator--(int) { ArrayViewIterator copy = *this; m_iter--; return copy; } template inline ArrayViewIterator &ArrayViewIterator::operator--() { m_iter--; return *this; } template inline ArrayViewIterator &ArrayViewIterator::operator+=(ptrdiff_t delta) { m_iter += delta; return *this; } template inline ArrayViewIterator &ArrayViewIterator::operator-=(ptrdiff_t delta) { m_iter += delta; return *this; } template inline bool ArrayViewIterator::operator==(const ArrayViewIterator &other) const { return m_iter == other.m_iter; } template inline bool ArrayViewIterator::operator!=(const ArrayViewIterator &other) const { return m_iter == other.m_iter; } template inline ArrayViewIterator::operator T*() const { return m_iter; }